歡迎轉載,轉載時需保留做者信息,謝謝。linux
郵箱:tangzhongp@163.comweb
博客園地址:http://www.cnblogs.com/embedded-tzp數據結構
Csdn博客地址:http://blog.csdn.net/xiayulewaapp
爲了簡化問題,上圖省略了app層與driver層中間的libc層。socket
linux驅動的開發步驟:設備號→設備(struct cdev,struct input_dev等)→驅動(struct file_operations)→應用層接口(建立/dev)ide
linux應用的open最終調用驅動struct file_operations的open,依次類推。函數
設備節點:atom
即/dev目錄下面的設備,當驅動層申請設備號後,經過cat /proc/devices 能夠查詢到申請設備的主次設備號。而後管理員能夠手動去建立該設備,命令形式爲:mknod -m 777 /dev/buttons c 249 0 spa
以linux下的/dev/fb0設備節點爲例:.net
tang@tang-vm ~ $ cat /proc/devices
Character devices:
...
29 fb
...
可見其主設備號爲29.
tang@tang-vm ~ $ ls /dev/fb0 -l
crw-rw---- 1 root video 29, 0 4月 14 00:01 /dev/fb0
設備節點/dev/fb0主設備號與cat /proc/devices獲得的一致。
|
。
|
||||
|
l 在sysfs下建立類
/sys
├── class
│ ├── input
│ │ ├── event0 -> ../../devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input0/event0
│ ├── leds → 由cls = class_create(THIS_MODULE, "leds"); //建立設備類
│ │ └── phy0-led -> ../../devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/phy0-led →由 device_create(cls, NULL, dev, NULL, "phy0-led"); //建立/sys/class/leds/phy0-led
l udev自動加載
加載模塊insmod *.ko的時候,用戶空間中的udev會自動響應 device_create(…)函數,內核產生uevent, 在kset下產生uevent文件,其文件內容爲action(add, remove等), 經過netlink socket被守護進程udevd捕獲後,掃描/sys下的uevent文件,在/dev下自動建立對應的設備號。 見下面例子
l e.g
cls = class_create(THIS_MODULE, "leds-atomic"); //
device_create(cls, NULL, dev, NULL, "myled");//dev/myled
當insmod 該驅動後,
cat /sys/class/leds-atomic/myled/uevent(文件在內核中數據結構爲struct attribute)
→ MAJOR=250
MINOR=0
DEVNAME=myled
所以,udevd根據上述uevent文件在建立設備節點 /dev/myled, major和minor分別爲250和0。