10

हैलो लिनक्स कर्नेल ड्राइवर गुरु!लिनक्स कर्नेल मॉड्यूल से एक धारावाहिक पोर्ट तक पहुंच

मैं एक कैमरे के लिए एक v4l2 ड्राइवर लिख रहा हूं जो कॉन्फ़िगरेशन के लिए एक सीरियल इंटरफ़ेस का उपयोग करता है। मैं ड्राइवर को कैमरे को कॉन्फ़िगर करना चाहता हूं, क्योंकि यह क्लाइंट कोड कैमरे के मॉडल में लगातार रहता है। सवाल यह है कि ड्राइवर मॉड्यूल से कैमरे के सीरियल इंटरफ़ेस तक पहुंचने का सबसे अच्छा तरीका क्या है?

जो मैंने सुना है, उससे कर्नेल ड्राइवर से फ़ाइलों तक पहुंच एक बड़ी संख्या नहीं है, लेकिन यह किया जा सकता है। इस प्रकार, मैं वर्तमान में निम्नलिखित कोड स्निपेट का उपयोग कर रहा हूं, लेकिन यह हैक की तरह लगता है।

oldfs = get_fs(); 
set_fs(KERNEL_DS); 

fd->f_pos=0; 
fd->f_op->write(fd, data, data_len, &fd->f_pos); 

set_fs(oldfs); 

मेरा प्रश्न वास्तव में है: ऐसा करने का सही तरीका क्या है?

उत्तर

4

मुझे लगता है कि के बाद से एक सीरियल पोर्ट शामिल है, इस एम्बेडेड किसी तरह का होना चाहिए:

चूंकि आप एक सीरियल पोर्ट का उपयोग करना चाहते हैं, आप उन कॉल को खुला के लिए उन्मुख TTY, उदाहरण के लिए होना चाहिए प्रणाली। आखिरकार, कई पीसी में सीरियल पोर्ट भी नहीं हैं। मैं यह भी मानता हूं कि कम से कम उपयोगकर्ता के परिप्रेक्ष्य से सीरियल पोर्ट को स्थायी कनेक्शन माना जा सकता है। यदि यह सब सच है, तो आप वास्तव में एक टीटीवी डिवाइस नहीं चाहते हैं। आप डिवाइस को एक निजी यूएआरटी के रूप में एक्सेस करना चाहते हैं।

यदि आपको वोल्फसन ऑडियो कोडेक्स (ध्वनि/सामाजिक/डब्ल्यूएम *। सी) पर एक नज़र डालें तो आपको उन डिवाइसों का एक उदाहरण दिखाई देगा जो मुख्य रूप से I2S पर संचार करते हैं लेकिन कॉन्फ़िगरेशन के लिए सहायक I2C इंटरफ़ेस रखते हैं। यह वही है जो आप चाहते हैं, मुझे विश्वास है। ड्राइवर सॉफ़्टवेयर के लिए एक एकीकृत इंटरफ़ेस प्रस्तुत करता है, और जो भी हार्डवेयर उचित है, उसे कमांड जारी करता है। स्पष्ट रूप से यह उपयोगकर्ताओं के लिए हार्डवेयर कार्यान्वयन विवरण का खुलासा करने से कहीं अधिक स्वच्छ है।

मुझे इस तरह से काम करने वाले कर्नेल में एक यूएआरटी ड्राइवर का अच्छा उदाहरण नहीं मिला, लेकिन उम्मीद है कि मैंने वर्णन किया है कि क्या देखना है। तकनीकी शुद्धता बिंदु के बजाय व्यावहारिक से, यह कर्नेल से फ़ाइल I/O करना बेहतर हो सकता है।

+0

इसके लिए धन्यवाद: वुल्फसन माइक्रो ड्राइवर अच्छे उदाहरण हैं। यह अभी भी स्पष्ट नहीं है कि यूएआरटी का उपयोग कैसे किया जाए (मैं वास्तव में यूएआरटी ड्राइवर को फिर से लिखना नहीं चाहता!), लेकिन यह एक महान शुरुआत है। धन्यवाद! – IndigoFire

1

सबसे पहले मैं आपको यदि संभव हो तो उपयोगकर्ता स्पेस से ऐसा करने का तरीका ढूंढने की सलाह दूंगा: आप यहां प्राप्त करने का प्रयास वास्तव में कर्नेल कोड में उपयोगकर्ता कोड कोड है।

लेकिन अगर आपको ऐसा करने का कोई तरीका नहीं मिलता है, तो यह article आपको दिखाता है कि उपयोगकर्तास्पेस कर्नेलस्पेस में कॉल कैसे करें।

serial_fd = sys_open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK)) 
+0

मैं समझता हूं कि यह वास्तव में उपयोगकर्ताओं के स्थान पर होना चाहिए, इसलिए मुझे लगता है कि सवाल यह है: मैं एक v4l2 ड्राइवर को ज़ूम को नियंत्रित करने के लिए ioctl प्राप्त कर सकता हूं जिसके लिए एक धारावाहिक पोर्ट पर भेजे गए आदेशों की आवश्यकता होती है? – IndigoFire

+0

महान लेख के लिए धन्यवाद! यह कर्नेल और उपयोगकर्ता रिक्त स्थानों के बारे में बहुत सी चीजों को समझ में नहीं आता है। – IndigoFire

संबंधित मुद्दे