linux設備驅動程序學習筆記——主次設備號

 

register_chrdev_region()和registe_chrdev()

 

分配設備編號,註冊設備與註銷設備的函數均在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 <linux/cdev.h>

 

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設備的步驟

register_chrdev() 爲主設備號註冊0~255作爲次設備號,併爲每個設備建立一個對應的默認cdev結構。使用這一接口的驅動程序必須能夠處理所有256個次設備號的open調用,而且也不能使用大於255的主設備號和次設備號。

這點纔是2.6版本升級註冊函數的根本原因。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章