【linux驅動】linux驅動總覽

歡迎轉載,轉載時需保留做者信息,謝謝。linux

郵箱:tangzhongp@163.comweb

博客園地址:http://www.cnblogs.com/embedded-tzp數據結構

Csdn博客地址:http://blog.csdn.net/xiayulewaapp

 

1.1.  應用,設備,總線,驅動關係,應用到驅動

clip_image001

爲了簡化問題,上圖省略了app層與driver層中間的libc層。socket

linux驅動的開發步驟:設備號設備(struct cdevstruct input_dev)驅動(struct file_operations)→應用層接口(建立/dev)ide

 

linux應用的open最終調用驅動struct file_operationsopen,依次類推。函數

 

設備節點: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獲得的一致。

 

1.1.1.   方案1,手動建立設備節點

 
 

       alloc_chrdev_region(&dev, 0, 1, "buttons"):動態設備號

       register_chrdev_region:靜態設備號

       register_chrdev

 
 

 

 

 


 

 
  clip_image002
 

 

 

 

 

 

 

 

 

 

 

 

 

 


1.1.2.   方案2,自動建立設備節點

 

       
   

alloc_chrdev_region(&dev, 0, 1, "buttons"):動態設備號

register_chrdev_region:靜態設備號

cls = class_create(THIS_MODULE, "leds-atomic"); //

device_create(cls, NULL, dev, NULL, "myled");//dev/myled

 
 
 

在應用中使用 fd = open("/dev/myled", O_RDWR);

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


1.1.2.1.    /dev設備節點自動建立原理

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, majorminor分別爲2500

相關文章
相關標籤/搜索