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...