字符设备驱动高级篇1——新接口介绍
生活随笔
收集整理的這篇文章主要介紹了
字符设备驱动高级篇1——新接口介绍
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以下內容源于朱有鵬《物聯網大講堂》課程的學習整理,如有侵權,請告知刪除。
一、概覽
1、新接口與老接口
(1)老接口:register_chrdev()
- 通過第一個參數是否為0,判斷內核是否自動分配設備號,或者就是該參數表示的設備號;
- 此函數完成設備號分配,以及注冊設備驅動的功能;
(2)新接口:register_chrdev_region()?+cdev_add()
- 先注冊設備號,然后再注冊設備驅動。
- 卸載時先卸載設備驅動,然后注銷設備號。
- register_chrdev_region()(傳參表示要某個設備號),或者alloc_chrdev_region()(讓內核自動分配設備號)。
- cdev_add()(注冊設備驅動)。
2、新接口涉及的內容
(1)cdev結構體
(2)設備號
- 由主設備號和次設備號組成;
- 屬于dev_t類型(其實就是int類型);
- MKDEV(由主次設備號得出設備號);
- MAJOR(從設備號中提取主設備號);
- MINOR(從設備號中提取次設備號);
(3)相關函數
- cdev_alloc:分配空間
- cdev_init:初始化
- cdev_add:注冊驅動
- cdev_del:注銷驅動
(3)總結
- 使用register_chrdev_region (申請設備號)+ cdev_init(分配空間) + cdev_add(注冊設備驅動)進行字符設備驅動注冊;
- 使用cdev_del(注銷設備驅動)+unregister_chrdev_region(注銷設備號)來注銷字符設備驅動。
- 即新接口將老接口的一步分為兩步完成:申請設備號,然后注冊設備驅動。
二、接口函數
1、register_chrdev_region函數申請想要的設備號
- 此函數用來申請設備號(包括主次設備號);
- 假如是 200(主設備號), 0 1 2 3(次設備號) ,則from為MKDEV(200,0)(MKDEV用來合成設備號,0表示起始次設備號),count為4(表示有四個次設備號);
2、alloc_chrdev_region函數自動分配設備號
- register_chrdev_region,要事先知道所使用的主、次設備號,則要先用cat /proc/devices查看有沒有使用。
- 可以使用alloc_chrdev_region,讓內核自動分配一個主設備號。
- 如果申請成功,則把得到的設備號放入第一個參數dev中。
? ? ? ??
3、cdev_init函數? ? ? ? ? ? ??
- 主要將cdev和fops關聯起來。將傳入的文件操作結構體指針賦值給cdev的ops
- 可以不使用此函數,直接用下面的代碼。
4、cdev_add函數
- 此函數用來注冊設備驅動。
5、cdev_alloc函數
(1)函數
//static struct cdev test_cdev;//這個變量分配在數據段,整個程序運行期間都存在,不夠靈活static struct cdev *pcdev; //只占4個字節,之后cdev_alloc給它實例化,分配在堆上,可以按需分配。由cdev_del釋放pcdev = cdev_alloc(); // 給pcdev分配內存,指針實例化
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
6、代碼
(1)注冊
- 先注冊主次設備號,然后才使用cdev_add()注冊字符設備
(2)注銷
// 使用新的接口來注銷字符設備驅動,注銷分2步:// 第一步真正注銷字符設備驅動用cdev_delcdev_del(&test_cdev);// 第二步去注銷申請的主次設備號unregister_chrdev_region(mydev, MYCNT);
總結
以上是生活随笔為你收集整理的字符设备驱动高级篇1——新接口介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统中常见的进程调度算法
- 下一篇: 共轭梯度法