嵌入式linux字符设备驱动
??? int register_chrdev_region( dev_t first, unsigned int count, char *name );? //函數(shù)通過(guò)已知的設(shè)備號(hào)first來(lái)注冊(cè)字符設(shè)備區(qū)域。
??? int alloc_chrdev_region( dev_t *dev, unsigned int firstminor,? unsigned int count, char *name );? //若需要?jiǎng)討B(tài)分配設(shè)備號(hào),則使用該函數(shù),此處dev作為指針,為僅用于輸出的參數(shù),分配成功后保存已分配范圍的第一個(gè)編號(hào)。firstminor通常為0,表示第一個(gè)次設(shè)備號(hào)。
?2.釋放設(shè)備號(hào)
??? void unregister_chrdev_region( dev_t first, unsigned int count );
3.注冊(cè)完字符設(shè)備區(qū)域之后
??? 需要使用cdev_init函數(shù)初始化cdev結(jié)構(gòu)和 file_operations結(jié)構(gòu)
??? cdev->owner = THIS_MODULE;
??? void cdev_init( struct cdev *cdev, struct file_operations *fops);??//為cdev結(jié)構(gòu)指針創(chuàng)建內(nèi)存,并將cdev->ops=fops;(抵岸科技注:源代碼中并未見(jiàn)創(chuàng)建內(nèi)存。cdev_init依次做了:cdev填充0,初始化表頭,kobject成員初始化,將cdev->ops=fops)
??? 接著講cdev加入到內(nèi)核中??? int cdev_add( struct cdev *dev, dev_t num, unsigned int count);
??? 完成字符設(shè)備的注冊(cè)過(guò)程
??? 以上函數(shù)需要#include? <linux/cdev.h>
4. 自動(dòng)創(chuàng)建字符設(shè)備節(jié)點(diǎn)
??? 下面的函數(shù)需要? #include <linux/device.h>.
??? struct class *myclass;? //聲明一個(gè)class結(jié)構(gòu)用于創(chuàng)建字符設(shè)備節(jié)點(diǎn)
??? myclass = class_create(THIS_MODULE,"myclass");? //"myclass"為類(lèi)名
??? device_create(myclass,NULL,devno,NULL,"leds%d",0);? //通過(guò)myclass結(jié)構(gòu)創(chuàng)建字符設(shè)備,第二個(gè)參數(shù)是設(shè)備的parent,第三個(gè)參
??? 數(shù)是設(shè)備號(hào),第四個(gè)參數(shù)是傳入內(nèi)核的驅(qū)動(dòng)數(shù)據(jù)void *類(lèi)型指針,如果沒(méi)有可以設(shè)置成NULL,最后一個(gè)參數(shù)是const char* fmt, ...,就是
??? 格式化參數(shù),即leds0
??? 完成上述過(guò)程后會(huì)在/dev中找到leds0設(shè)備
??? 貌似以前的老版本會(huì)用到devfs_mk_cdev來(lái)創(chuàng)建設(shè)備節(jié)點(diǎn),但是最后發(fā)現(xiàn)linux-2.6.33并沒(méi)有這個(gè)函數(shù),應(yīng)該是被上述函數(shù)取代
??? 了吧
5. 當(dāng)然,還包括驅(qū)動(dòng)Makefile的編寫(xiě)以及應(yīng)用程序
??? 幾處比較有用的參考文章:
??? http://hi.baidu.com/hust_junejun/blog/item/d2dcfcedc09833d92e2e213f.html??? //比較全面
??? http://www.dzsc.com/data/html/2009-8-28/78412.html??????????????????????????????????????? //自動(dòng)生成字符設(shè)備節(jié)點(diǎn)
????http://fanyihui1986.blog.163.com/blog/static/7844859200911325826783/??????? //小型總結(jié)??
6.TIPS
??? printk(KERN_WARNING"?this is the test?");
??? KERN_ALERT
??? KERN_WANING
??? KERN_INFO
??? KERN_ERR
??? 等等不同優(yōu)先級(jí) 宏,具體可以查閱linux設(shè)備驅(qū)動(dòng)程序三,字符設(shè)備驅(qū)動(dòng)一章。
至于mknod console c 5 1 的意思也很相似:
console是設(shè)備的名字
c指字符設(shè)備
5是該設(shè)備在major.h中定義的標(biāo)記
1是第一個(gè)子設(shè)備
mknod console c 5 1
console為設(shè)備文件名,自己隨便取
c是指字符型設(shè)備 (可選b,塊設(shè)備)
5是主設(shè)備號(hào) /dev/devices里面記錄現(xiàn)有的設(shè)備
找個(gè)沒(méi)有用的就可以了
1是次設(shè)備號(hào),當(dāng)你要給兩個(gè)同樣的設(shè)備上一個(gè)驅(qū)動(dòng)的時(shí)候就要分了,從0開(kāi)始,1就是第二個(gè)了 ,對(duì)于字符設(shè)備,次設(shè)備號(hào)就表示同類(lèi)型設(shè)備的不同設(shè)備。
總結(jié)
以上是生活随笔為你收集整理的嵌入式linux字符设备驱动的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ISO 639-1語言列表
- 下一篇: 手把手教你写Linux I2C设备驱动