一、概念
雜項設備是一種特殊的字符設備,在linux2.6之后出現,與platform虛擬總線相關,通常嵌套在 platform 總線驅動中,實作復雜的驅動,其主設備號固定為10,設備注冊是用主設備號10來呼叫register_chrdev()來實作,呼叫class_create()和device_create()為每個雜項設備創建設備類和設備節點,雜項設備是對字符設備驅動的再次封裝,降低了字符設備驅動的難度,同時節約了主設備號資源,
二、字符設備與雜項設備實作對比
1、字符設備驅動開發流程:
1)構造flie_operations結構體,其包含字符設備操作函式的集合;
2)實作flie_operations結構體中字符設備操作函式,如open/read/write/ioctl/release等;
3)構造設備號:MKDEV(int major,int minor);
4)將設備號注冊到系統:支持靜態申請register_chrdev_region或動態申請alloc_chrdev_region;
5)字符設備結構體cdev初始化,建立cdev和file_operations之間的連接:cdev_init;
6)內核注冊一個struct cdev結構體,cdev_add;
7)創建設備檔案:
手動創建:mknod filename type major minor
自動創建:先呼叫class_create創建設備類,再呼叫device_create創建設備節點;
8)告訴內核模塊入口函式與出口函式:
static int __init xxx_init(void);
static void __exit xxx_exit(void);
9)傳統的創建設備程序
alloc_chrdev_region(); /* 申請設備號 */
cdev_init(); /* 初始化 cdev */
cdev_add(); /* 添加 cdev */
class_create(); /* 創建類 */
device_create(); /* 創建設備 */
10)傳統的洗掉設備的程序
cdev_del(); /* 洗掉 cdev */
unregister_chrdev_region(); /* 注銷設備號 */
device_destroy(); /* 洗掉設備 */
class_destroy(); /* 洗掉類 */
2、雜項設備驅動開發流程:
1)構造flie_operations結構體,其包含字符設備操作函式的集合;
2)實作flie_operations結構體中字符設備操作函式,如open/read/write/ioctl/release等;
3)構造雜項設備驅動物體struct miscdevice;
4)在模塊入口函式呼叫misc_register()向系統注冊雜項設備;
5)在模塊出口函式呼叫misc_deregister()從系統注銷雜項設備;
6)告訴內核模塊入口函式與出口函式:
static int __init xxx_init(void);
static void __exit xxx_exit(void);
三、結構體及函式原型
1、描述雜項設備的結構體struct miscdevice
頭檔案:#include <linux/miscdevice.h>
struct miscdevice {
int minor; /* 次設備號 */
const char *name; /* 雜項設備的名字 */
const struct file_operations *fops; /* 設備的操作函式集 */
struct list_head list; /* 將miscdevice串成鏈表使用 */
struct device *parent; /* 父設備(設備模型有關) */
struct device *this_device; /* 指向當前設備的結構體(代表自己的設備,與設備模型有關) */
};
對于miscdevice結構體主要關注前三項:
minor:如果設定為MISC_DYNAMIC_MINOR,表示系統自動分配未使用的minor;
name:設備名稱;
fops:操作集合的宣告,將檔案操作集合結構體地址賦值給它即可;
2、雜項設備注冊函式
頭檔案:#include <linux/miscdevice.h>
函式原型:int misc_register(struct miscdevice *misc)
引數:描述砸向設備的struct miscdevice結構體型別指標;
函式功能:將雜項設備注冊到內核的設備模型中;
回傳值:回傳值為一個整數,如果注冊成功回傳0,注冊失敗則回傳失敗的錯誤代碼,
說明:該函式內部檢查次設備號是否合法,如果次設備號被占用,則回傳設備忙狀態;如果miscdevice的成員minor為255,則嘗試動態設備請一個次設備號,當次設備號可用時,函式會將雜項設備注冊到內核的設備模型中去;
3、雜項設備注銷函式
頭檔案:#include <linux/miscdevice.h>
函式原型:int misc_deregister(struct miscdevice *misc)
引數:描述雜項設備的struct miscdevice結構體型別指標;
函式功能:將雜項設備從內核的設備模型中注銷;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/302303.html
標籤:其他
下一篇:關于RS232通信電路設計講解
