Linxu MISC咋雜項驅動

2022-09-20 20:51:12 字數 3701 閱讀 5423

misc 的意思是混合、雜項的,因此 misc 驅動也叫做雜項驅動,也就是當我們板子上的某些外設無法進行分類的時候就可以使用 misc 驅動。misc 驅動其實就是最簡單的字元裝置驅動,通常巢狀在 platform 匯流排驅動中,實現複雜的驅動。

所有的 misc 裝置驅動的主裝置號都為 10,不同的裝置使用不同的從裝置號。隨著 linux字元裝置驅動的不斷增加,裝置號變得越來越緊張,尤其是主裝置號,misc 裝置驅動就用於解決此問題。misc 裝置會自動建立 cdev,不需要像我們以前那樣手動建立,因此採用 misc 裝置驅動可以簡化字元裝置驅動的編寫。我們需要向 linux 註冊乙個 miscdevice 裝置,miscdevice是乙個結構體

定義乙個 misc 裝置(miscdevice 型別)以後我們需要設定 minor、name 和 fops 這三個成員變數。minor 表示子裝置號,misc 裝置的主裝置號為 10,這個是固定的,需要使用者指定子裝置號,linux 系統已經預定義了一些 misc 裝置的子裝置號,這些預定義的子裝置號定義在include/linux/miscdevice.h 檔案中

現在我們可以直接使用 misc_register 乙個函式來完成示例** 57.1.3 中的這些步驟。當我們解除安裝裝置驅動模組的時候需要呼叫 misc_deregister 函式來登出掉 misc 裝置

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define miscbeep_name		"miscbeep"	/* 名字 	*/

#define miscbeep_minor 144 /* 子裝置號 */

#define beepoff 0 /* 關蜂鳴器 */

#define beepon 1 /* 開蜂鳴器 */

/* miscbeep裝置結構體 */

struct miscbeep_dev;

struct miscbeep_dev miscbeep; /* beep裝置 */

/* * @description : 開啟裝置

* @param - inode : 傳遞給驅動的inode

* @param - filp : 裝置檔案,file結構體有個叫做private_data的成員變數

* 一般在open的時候將private_data指向裝置結構體。

* @return : 0 成功;其他 失敗

*/static int miscbeep_open(struct inode *inode, struct file *filp)

/* * @description : 向裝置寫資料

* @param - filp : 裝置檔案,表示開啟的檔案描述符

* @param - buf : 要寫給裝置寫入的資料

* @param - cnt : 要寫入的資料長度

* @param - offt : 相對於檔案首位址的偏移

* @return : 寫入的位元組數,如果為負值,表示寫入失敗

*/static ssize_t miscbeep_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt)

beepstat = databuf[0]; /* 獲取狀態值 */

if(beepstat == beepon) else if(beepstat == beepoff)

return 0;

}/* 裝置操作函式 */

static struct file_operations miscbeep_fops = ;

/* misc裝置結構體 */

static struct miscdevice beep_miscdev = ;

/* * @description : flatform驅動的probe函式,當驅動與

* 裝置匹配以後此函式就會執行

* @param - dev : platform裝置

* @return : 0,成功;其他負值,失敗

*/static int miscbeep_probe(struct platform_device *dev)

/* 2、 獲取裝置樹中的gpio屬性,得到beep所使用的beep編號 */

miscbeep.beep_gpio = of_get_named_gpio(miscbeep.nd, "beep-gpios", 0);

if(miscbeep.beep_gpio < 0)

/* 3、設定gpio5_io01為輸出,並且輸出高電平,預設關閉beep */

ret = gpio_direction_output(miscbeep.beep_gpio, 1);

if(ret < 0)

/* 一般情況下會註冊對應的字元裝置,但是這裡我們使用misc裝置

* 所以我們不需要自己註冊字元裝置驅動,只需要註冊misc裝置驅動即可

*/ret = misc_register(&beep_miscdev);

if(ret < 0)

return 0;}/*

* @description : platform驅動的remove函式,移除platform驅動的時候此函式會執行

* @param - dev : platform裝置

* @return : 0,成功;其他負值,失敗

*/static int miscbeep_remove(struct platform_device *dev)

/* 匹配列表 */

static const struct of_device_id beep_of_match = ,

}; /* platform驅動結構體 */

static struct platform_driver beep_driver = ,

.probe = miscbeep_probe,

.remove = miscbeep_remove,

};/*

* @description : 驅動出口函式

* @param : 無

* @return : 無

*/static int __init miscbeep_init(void)

/* * @description : 驅動出口函式

* @param : 無

* @return : 無

*/static void __exit miscbeep_exit(void)

module_init(miscbeep_init);

module_exit(miscbeep_exit);

module_license("gpl");

module_author("shaozheming");

linux驅動雜項

下面我們看乙個例子,linux 2.6.x drivers usb storage usb.c中有這樣乙個結構體初始化專案 static struct usb driver usb storage driver 乍一看,這與我們之前學過的結構體初始化差距甚遠。其實這就是前面所說的指定初始化在linu...

misc雜項裝置驅動

linux裡面的misc雜項裝置是主裝置號為10的驅動裝置,它的註冊跟使用比較的簡單,所以比較適用於功能簡單的裝置。它有自己的裝置結構體 struct miscdevice 它在標頭檔案linux miscdevice.h裡面有定義,其中minor是misc裝置的副裝置號,misc裝置主要依賴min...

Linux雜項裝置驅動框架

首先是標頭檔案定義 include include include include 以下是一些file operations中提供的一些函式,這些函式用於給應用層提供介面,以此來調動裝置。static int filename open struct inode my indoe,struct fi...