2012-11-24 12 views
14

के लिए नहीं बनाया गया है मैंने एमडीवी नियमों के साथ एम्बेडेड लिनक्स चल रहे व्यस्त बॉक्स में एक साधारण यूएआरटी सीरियल ड्राइवर लिखा है। मैंने अपने ड्राइवर कोड में .dev_name "ttyC2C" प्रदान किया है।डिवाइस नोड/dev/tty * यूआर्ट सीरियल ड्राइवर

static struct uart_driver serial_omap_reg = { 
    .owner  = THIS_MODULE, 
    .driver_name = "Omap-C2C-Serial", 
    .dev_name = "ttyC2C", 
    .nr  = OMAP_MAX_HSUART_PORTS, 
    .cons = NULL, 
}; 

नोड tty के लिए

./sys/devices/platform/omap_c2c_uart.0/tty/ttyC2C0 
./sys/class/tty/ttyC2C0 

/# ls -l ./sys/class/tty/ttyC2C0 
lrwxrwxrwx 1 root  0    0 Jan 1 00:14 ./sys/class/tty/ttyC2C0 -> ../../devices/platform/omap_c2c_uart.0/tty/ttyC2C0 

/# ls -l ./sys/devices/platform/omap_c2c_uart.0/tty/ttyC2C0 
-r--r--r-- 1 root  0    4096 Jan 1 00:14 dev 
lrwxrwxrwx 1 root  0    0 Jan 1 00:14 device -> ../../../omap_c2c_uart.0 
drwxr-xr-x 2 root  0    0 Jan 1 00:14 power 
lrwxrwxrwx 1 root  0    0 Jan 1 00:14 subsystem -> ../../../../../class/tty 
-rw-r--r-- 1 root  0    4096 Jan 1 00:14 uevent 
/# 

mdev नियमों में बनाया जा रहा है हालांकि इस प्रकार हैं:

tty 0:5 0666 
tty.* 0:0 0620 

कैसे /dev/ttyC2C के रूप में डिवाइस नोड पाने के लिए?

+0

"आवश्यक लिनक्स डिवाइस ड्राइवर" पुस्तक में, यह कहना है कि "struct platform_driver" और "struct uart_driver" में ड्राइवर नाम ही होना चाहिए। मैंने कोड के अनुसार संशोधित किया लेकिन अभी भी/dev/ttyC2C नोड जनसंख्या नहीं जा रहा है। –

+0

जब मैं uart_driver संरचना में .major और .minor जोड़ता हूं और मैन्युअल रूप से "mknod" का उपयोग कर डिवाइस नोड बना देता हूं तो ड्राइवर ठीक काम करता है। क्यों कर्नेल (3.4.0) स्वचालित रूप से इसे बनाने में सक्षम नहीं है? –

उत्तर

8

आप दो चीजों को भ्रमित कर रहे हैं। आपके द्वारा देखे जा रहे sysfs नोड्स को वास्तव में कोबजेक्ट पदानुक्रम के आधार पर कर्नेल द्वारा बनाए रखा जाता है। हालांकि डिवाइस नोड पूरी तरह से उपयोगकर्ता स्थान की समस्या है और कहीं भी मौजूद हो सकता है (हालांकि सम्मेलन के तहत/dev) हैं।

तो हाथ से आप पहली बड़ी मिलेगा: नाबालिग संख्या:

cat /sys/class/tty/ttyC2C0/dev 

और फिर:

mknod /dev/ttyC2C0 c ${MAJOR} ${MINOR} 

हालांकि के रूप में आप पहले से ही संकेत दिया है आप के लिए udev का कांटा mdev उपयोग कर रहे हैं, डिवाइस नोड्स के उपयोगकर्ता अंतरिक्ष निर्माण को संभाल लें। हालांकि मिलान नियम मेरे लिए अजीब लगते हैं। मुझे लगता है कि एमडीवीवी के पास udevadm के बराबर है जो आपको मिलान नियमों को लिखने में मदद कर सकता है। उदाहरण के लिए अपनी USB tty ड्राइवर इस तरह पूछे जा सकता है:

udevadm info -a -p /sys/class/tty/ttyUSB0 

और पेड़ का उत्पादन मैं जो मैं मैच के लिए इस्तेमाल कर सकते हैं udev विशेषताओं की सूची देख सकते हैं पर देख रहे हैं।

KERNEL=="ttyUSB0", DRIVERS=="ftdi_sio", NAME="ttyUSB0" 

मिलान करने के लिए पर्याप्त नहीं होगा (हालांकि मेरी distro एक बहुत अधिक जटिल मिलान नियम गतिशील व्यवस्था से निपटने के लिए है): तो मेरे मामले में।

मेरा अनुमान है कि लेकिन मैं मानचित्रण नियम आप और अधिक की तरह लग रहे हैं चाहते हैं पर शक: (? नाबालिग संख्या)

KERNEL=="ttyC2C", NAME="ttyC2C" 

यद्यपि आप आप प्रत्येक बंदरगाह के लिए बनाया डिवाइस नोड्स मिल सुनिश्चित करने के लिए थोड़ा और आवश्यकता हो सकती है ।

2

ttyC2C के लिए आपके /etc/mdev.conf पर एक विशिष्ट एमडीवी नियम जोड़ना आपकी समस्या का समाधान करता है? निम्नलिखित में से कोई एक जैसा है?

ttyC2C[0-9]+ root:tty 620

या

ttyC2C[0-9]+ root:tty 620 @/bin/ln -sf $MDEV ttyC2C

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