一、步驟:
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:
int myopen(struct inode *, struct file *)
{
}
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 *)