via:http://blog.chinaunix.net/uid-20672257-id-3142809.html
1、寫出open、write函數
2、告訴內核
1)、定義一個struct file_operations結構并填充好
static struct file_operations first_drv_fops = {.owner = THIS_MODULE, /* 這是一個宏,推向編譯模塊時自動創建的__this_module變量 */.open = first_drv_open, .write = first_drv_write, };
?
2)、把struct file_operations結構體告訴內核
major = register_chrdev(0, "first_drv", &first_drv_fops); // 注冊, 告訴內核 //相關參數: //第一個,設備號,0自動分配主設備號,否則為主設備號0-255 //第二個:設備名 //第三個:struct file_operations結構體
?
4)、register_chrdev由誰調用(入口函數調用) static int first_drv_init(void)
5)、入口函數須使用內核宏來修飾 module_init(first_drv_init); module_init會定義一個結構體,這個結構體里面有一個函數指針指向first_drv_init這個函數,當我們加載或安裝一個驅動時,內核會自動找到這個結構體,然后調用里面的函數指針,這個函數指針指向first_drv_init這個函數,first_drv_init這個函數就是把struct file_operations結構體告訴內核
6)、有入口函數就有出口函數
module_exit(first_drv_exit);
最后加上協議
MODULE_LICENSE("GPL");
3、mdev根據系統信息自動創建設備節點:
3、mdev根據系統信息自動創建設備節點:
每次寫驅動都要手動創建設備文件過于麻煩,使用設備管理文件系統則方便很多。在2.6的內核以前一直使用的是devfs,但是它存在許多缺陷。它創建了大量的設備文件,其實這些設備更本不存在。而且設備與設備文件的映射具有不確定性,比如U盤即可能對應sda,又可能對應sdb。沒有足夠的主/輔設備號。2.6之后的內核引入了sysfs文件系統,它掛載在/sys上,配合udev使用,可以很好的完成devfs的功能,并彌補了那些缺點。(這里說一下,當今內核已經使用netlink了)。
udev是用戶空間的一個應用程序,在嵌入式中用的是mdev,mdev在busybox中。mdev是udev的精簡版。
首先在busybox中添加支持mdev的選項:
Linux System Utilities ---> ??
[*] mdev ??
[*] ? Support /etc/mdev.conf ??
[*] ? ? Support subdirs/symlinks ??
[*] ? ? ? Support regular expressions substitutions when renaming device ??
[*] ? ? Support command execution at device addition/removal ?
然后修改/etc/init.d/rcS:
echo /sbin/mdev > /proc/sys/kernel/hotplug ?
/sbin/mdev -s ?
執行mdev -s :以‘-s’為參數調用位于 /sbin目錄寫的mdev(其實是個鏈接,作用是傳遞參數給/bin目錄下的busybox程序并調用它),mdev掃描 /sys/class 和 /sys/block 中所有的類設備目錄,如果在目錄中含有名為“dev”的文件,且文件中包含的是設備號,則mdev就利用這些信息為這個設備在/dev 下創建設備節點文件。一般只在啟動時才執行一次 “mdev -s”。
熱插拔事件:由于啟動時運行了命 令:echo /sbin/mdev > /proc/sys/kernel/hotplug ,那么當有熱插拔事件產生時,內核就會調用位于 /sbin目錄的mdev。這時mdev通過環境變量中的 ACTION 和 DEVPATH,來確定此次熱插拔事件的動作以及影響了/sys中的那個目錄。接著會看看這個目錄中是否“dev”的屬性文件,如果有就利用這些信息為 這個設備在/dev 下創建設備節點文件
重新打包文件系統,這樣/sys目錄,/dev目錄就有東西了