轉載 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 發表在 痞客邦 PIXNET 留言(0) 人氣()