misc設備

一、步驟:

1.定義miscdevice結構體:

struct miscdevice misc;

2.初始化miscdevice結構體

misc.minor = MISC_DYNAMIC_MINOR;//動態分配
misc.name = "xxxx";   //設備名
misc.fops = &myfops;  //操作方法集(myfops要預先準備好)
struct file_operations myfops = {
    .owner = THIS_MODULE,
    .open = myopen,
    .release = myrelease,
    .read = myread,
    .write = mywrite,
} 

3.註冊

/*
* 功能: 註冊
* 輸入參數: struct miscdevice
* 輸出參數:
* 返回值: 成功:0    失敗:負數
* 注意:這個註冊函數會自動創建設備文件,不用我們管,misc設備的主設備號恆爲10,它靠次設備號區分不同的misc
*/
int misc_register(struct miscdevice * misc)

4.釋放

/*
* 功能: 註銷
* 輸入參數: struct miscdevice
* 輸出參數:
* 返回值: none
* 注意:
*/
void misc_deregister(struct miscdevice *misc)

二、向上提供接口:

1.open:

/*
* 功能: 給運用層的接口---打開
* 輸入參數: @struct inode  --inod節點
* 輸入參數: @struct file   --file指針
* 輸出參數:
* 返回值: 成功:0    失敗:負數
* 注意:
*/
int myopen(struct inode *, struct file *) 
{
    //1.使用計數
    //2.識別子設備(將私有的設備結構體賦值給pfile->pravite_data)
    //3.必要的設備初始化
}

2.close:

/*
* 功能: 給運用層的接口---關閉
* 輸入參數: @struct inode  --inod節點
* 輸入參數: @struct file   --file指針
* 輸出參數:
* 返回值: 成功:0    失敗:負數
* 注意:
*/
int myrelease(struct inode *, struct file *)

3.read:

/*
* 功能: 給運用層的接口---讀
* 輸入參數: @struct file   --file指針
* 輸入參數: @__user        --運用層傳進來的bufer
* 輸入參數: @size          --大小
* 輸入參數: @loff_t        --偏移
* 輸出參數:
* 返回值: 成功:實際能讀到的字節數    失敗:負數
* 注意:
*/
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *)

4.write:

/*
* 功能: 給運用層的接口---讀
* 輸入參數: @struct file   --file指針
* 輸入參數: @__user        --運用層傳進來的bufer
* 輸入參數: @size          --大小
* 輸入參數: @loff_t        --偏移
* 輸出參數:
* 返回值: 成功:實際寫入的字節數    失敗:負數
* 注意:
*/
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *)
發佈了76 篇原創文章 · 獲贊 15 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章