一、簡介
misc 的意思是混合、雜項的,因此 misc 驅動也叫做雜項驅動,也就是當我們板子上的某些外設無法進行分類的時候就可以使用 misc 驅動。misc 驅動其實就是最簡單的字元裝置驅動,通常巢狀在 platform 匯流排驅動中,實現複雜的驅動。
所有的 misc 裝置驅動的主裝置號都為 10,不同的裝置使用不同的從裝置號。隨著 linux字元裝置驅動的不斷增加,裝置號變得越來越緊張,尤其是主裝置號,misc 裝置驅動就用於解決此問題。misc 裝置會自動建立 cdev,不需要像我們以前那樣手動建立,因此採用misc 裝置驅動可以簡化字元裝置驅動的編寫。我們需要向 linux 註冊乙個 miscdevice 裝置,miscdevice是乙個結構體,定義在檔案 include/linux/miscdevice.h 中,內容如下:
57
struct miscdevice
;
定義乙個 misc 裝置(miscdevice 型別)以後我們需要設定 minor、name 和 fops 這三個成員變數。
13 #define psmouse_minor 1
14 #define ms_busmouse_minor 2
/* unused */
15 #define atixl_busmouse_minor 3
/* unused */
16/*#define amigamouse_minor 4 fixme obsolete */
17 #define atarimouse_minor 5
/* unused */
18 #define sun_mouse_minor 6
/* unused */..
....
52 #define misc_dynamic_minor 255
我們在使用的時候可以從這些預定義的子裝置號中挑選乙個,當然也可以自己定義,只要這個子裝置號沒有被其他裝置使用介面。
二、miscdevice的註冊和登出
int
misc_register
(struct miscdevice * misc)
函式引數和返回值含義如下:
misc:要註冊的 misc 裝置。
返回值:負數,失敗;0,成功。
以前我們需要自己呼叫一堆的函式去建立裝置,現在我們可以直接使用 misc_register 乙個函式來完成這些步驟。
int
misc_deregister
(struct miscdevice *misc)
函式引數和返回值含義如下:
misc:要登出的 misc 裝置。
返回值:負數,失敗;0,成功。
三、例項(偽**)
29 #define miscbeep_name "miscbeep"
/* 名字 */
30 #define miscbeep_minor 144
/* 子裝置號 */
31 #define beepoff 0
/* 關蜂鳴器 */
32 #define beepon 1
/* 開蜂鳴器 */
3334
/* miscbeep 裝置結構體 */
35struct miscbeep_dev;43
44struct miscbeep_dev miscbeep;
/* beep 裝置 */
53
static
intmiscbeep_open
(struct inode *inode,
struct file *filp)
54
static ssize_t miscbeep_write
(struct file *filp,
const
char __user *buf,
size_t cnt, loff_t *offt)
89
/* 裝置操作函式 */
90static
struct file_operations miscbeep_fops =;95
96/* misc 裝置結構體 */
97static
struct miscdevice beep_miscdev =
;
109
static
intmiscbeep_probe
(struct platform_device *dev)
110143
144return0;
145}
148* @description : remove 函式,移除 platform 驅動的時候此函式會執行
149* @param - dev : platform 裝置
150* @return
:0,成功;其他負值,失敗
151*
/152
static
intmiscbeep_remove
(struct platform_device *dev)
153
162
/* 匹配列表 */
163static
const
struct of_device_id beep_of_match=
,165
166}
;167
168/* platform 驅動結構體 */
169static
struct platform_driver beep_driver =
,174
.probe = miscbeep_probe,
175.remove = miscbeep_remove,
176}
;
178
/*179 * @description : 驅動入口函式
180 * @param : 無
181 * @return : 無
182 */
183static
int __init miscbeep_init
(void
)184
187188
/*189 * @description : 驅動出口函式
190 * @param : 無
191 * @return : 無
192 */
193static
void __exit miscbeep_exit
(void
)194
197198
module_init
(miscbeep_init)
;199
module_exit
(miscbeep_exit)
;200
module_license
("gpl");
201module_author
("alex"
);
第 29~94 行,標準的字元裝置驅動。
第 97~101 行,misc 裝置 beep_miscdev,第 98 行設定子裝置號為 144,第 99 行設定裝置名字為「miscbeep」,這樣當系統啟動以後就會在/dev/目錄下存在乙個為「miscbeep」的裝置檔案。
第 100 行,設定 misc 裝置的操作函式集合,為 file_operations 型別。
第 109~145 行,platform 框架的 probe 函式,當驅動與裝置匹配以後此函式就會執行,最後在 138 行通過 misc_register 函式向 linux 核心註冊misc 裝置,也就是前面定義的 beep_miscdev。
第 152~160 行,platform 框架的 remove 函式,在此函式中呼叫 misc_deregister 函式來登出misc 裝置。
第 163~196,標準的 platform 驅動。
Linux驅動開發學習筆記
一 linux裝置驅動基礎 基於linux2.6核心 參考 linux device drivers 3rd edition linux kernel有乙個很好的特性,可以支援在執行是進行擴充套件。這意味著系統啟動執行是,我們仍然可以向kernel新增功能。這種執行時可以被新增到kernel的 稱為...
linux驅動學習筆記
1.先從最簡單的例子開始 include include module license dual bsd gpl static int hello init void printk kern alert hello,world n return 0 static void hello exit vo...
wince驅動開發學習筆記
因為課題前期調研沒做好,用的cpu板卡和資料採集卡來自兩個部門。加上買的是裸板,自己定製的os,技術支援不愛搭理。所以給的ai板卡的驅動一直裝不上,自己在鬱悶中尋找答案,就紮進了wince驅動的知識庫裡了。不管驅動裝不上是不是這個原因,學點東西總沒有壞處。做點記錄備查 首先是wince驅動的分類問題...