??? int register_chrdev_region( dev_t first, unsigned int count, char *name );? //函數通過已知的設備號first來注冊字符設備區域。
??? int alloc_chrdev_region( dev_t *dev, unsigned int firstminor,? unsigned int count, char *name );? //若需要動態分配設備號,則使用該函數,此處dev作為指針,為僅用于輸出的參數,分配成功后保存已分配范圍的第一個編號。firstminor通常為0,表示第一個次設備號。
?2.釋放設備號
??? void unregister_chrdev_region( dev_t first, unsigned int count );
3.注冊完字符設備區域之后
??? 需要使用cdev_init函數初始化cdev結構和 file_operations結構
??? cdev->owner = THIS_MODULE;
??? void cdev_init( struct cdev *cdev, struct file_operations *fops);??//為cdev結構指針創建內存,并將cdev->ops=fops;(抵岸科技注:源代碼中并未見創建內存。cdev_init依次做了:cdev填充0,初始化表頭,kobject成員初始化,將cdev->ops=fops)
??? 接著講cdev加入到內核中??? int cdev_add( struct cdev *dev, dev_t num, unsigned int count);
??? 完成字符設備的注冊過程
??? 以上函數需要#include? <linux/cdev.h>
4. 自動創建字符設備節點
??? 下面的函數需要? #include <linux/device.h>.
??? struct class *myclass;? //聲明一個class結構用于創建字符設備節點
??? myclass = class_create(THIS_MODULE,"myclass");? //"myclass"為類名
??? device_create(myclass,NULL,devno,NULL,"leds%d",0);? //通過myclass結構創建字符設備,第二個參數是設備的parent,第三個參
??? 數是設備號,第四個參數是傳入內核的驅動數據void *類型指針,如果沒有可以設置成NULL,最后一個參數是const char* fmt, ...,就是
??? 格式化參數,即leds0
??? 完成上述過程后會在/dev中找到leds0設備
??? 貌似以前的老版本會用到devfs_mk_cdev來創建設備節點,但是最后發現linux-2.6.33并沒有這個函數,應該是被上述函數取代
??? 了吧
5. 當然,還包括驅動Makefile的編寫以及應用程序
??? 幾處比較有用的參考文章:
??? http://hi.baidu.com/hust_junejun/blog/item/d2dcfcedc09833d92e2e213f.html??? //比較全面
??? http://www.dzsc.com/data/html/2009-8-28/78412.html??????????????????????????????????????? //自動生成字符設備節點
????http://fanyihui1986.blog.163.com/blog/static/7844859200911325826783/??????? //小型總結??
6.TIPS
??? printk(KERN_WARNING"?this is the test?");
??? KERN_ALERT
??? KERN_WANING
??? KERN_INFO
??? KERN_ERR
??? 等等不同優先級 宏,具體可以查閱linux設備驅動程序三,字符設備驅動一章。
至于mknod console c 5 1 的意思也很相似:
console是設備的名字
c指字符設備
5是該設備在major.h中定義的標記
1是第一個子設備
mknod console c 5 1
console為設備文件名,自己隨便取
c是指字符型設備 (可選b,塊設備)
5是主設備號 /dev/devices里面記錄現有的設備
找個沒有用的就可以了
1是次設備號,當你要給兩個同樣的設備上一個驅動的時候就要分了,從0開始,1就是第二個了 ,對于字符設備,次設備號就表示同類型設備的不同設備。