轉載 http://blog.csdn.net/xie376450483/article/details/5729936 分配設備編號,註冊設備與註銷設備 ​​的函數均在fs.h中申明,如下: extern int register_chrdev_region(dev_t, unsigned, const char *);//靜態的申請和註冊設備號 extern int alloc_chrdev_region(dev_t, unsigned, const char *);//動態的申請註冊一個設備號 extern int register_chrdev(unsigned int, const char *, struct file_operations *);//int為0時候動態註冊,非零時候靜態註冊。 extern int unregister_chrdev(unsigned int, const char *); extern void unregister_chrdev_region(dev_t, unsigned); 在Linux2.6版本里面,register_chrdev_region()是register_chrdev()的升級版本。 使用register_chrdev_region()首先需要定義一個dev_t變量來作為一個設備號, dev_t dev_num; 如果想靜態申請,那麼dev_num=MKDEV(major_no,0);major是一個表示設備號的變量 然後便可以用register_chrdev_region(dev_num,2,"my_dev");第二個參數表示註冊的此設備數目,第三個表示驅動名 如果要動態的註冊主設備號,使用下面 alloc_chrdev_region(&dev_num, 0, 2, "memdev"); //次設備號從0開始,註冊兩個設備,設備名是Memdev mem_major = MAJOR(devno); //取出主設備號保存在mem_major中 前面只是註冊了設備號,後面要向內核添加設備了。 ///////cdev included in struct cdev devno; cdev_init(&devno,&file_ops); //初始化改設備 devno.owner = THIS_MODULE; //.owner這表示誰擁有你這個驅動程序, devno.ops = &mem_fops; 對於已經知道了主設備號,就用cdev_add(&devno, dev_num,MEMDEV_NR_DEVS);來添加設備 如果是動態申請的設備號,就用 cdev_add(&devno, MKDEV(mem_major, 0), MEMDEV_NR_DEVS); //向內核添加設備,第一個參數是設備,第二個參數是設備號,第三個參數是要註冊的次設備數目,mem_major在動態申請時候保存起來了。 註銷設備時候,使用unregister_chrdev_region(dev_t, unsigned);第一個參數設備號,和註冊時候的要一致,因此如果是動態分配的就需要保存起來,第二個參數是次設備的個數。 而使用register_chrdev(unsigned int, const char *,struct file_operations *);來申請設備號時候,如果第一個參數是0,表示動態的分配給此驅動程序一個主設備號,,非零時候,表示備驅動程序向系統申請主設備號,第二個是設備名,第三個file_operations,如果是動態分配的,則函數返回分配的主設備號。 對應的使用unregister_chrdev(unsigned int, const char *);來註銷設備,第一個參數是主設備號,必須和註冊時候的主設備號一致,如果註冊時候是動態的分配的主設備號,就需要保存起來。第二個是設備名, 由此可見,使用register_chrdev_region()比register_chrdev()多了一步,就是想內核註冊添加cdev設備的步驟 另外在2.6內核中 使用module_init()和module_exit()來作為模塊的入口和出口,而老版本中使用 init_module()和cleanup_module()來作為入口和出口
文章標籤
全站熱搜
創作者介紹
創作者 BB 的頭像
BB

Welkin小窩

BB 發表在 痞客邦 留言(0) 人氣(533)