linux驅動開發學習筆記二十二 MISC驅動

2021-10-05 22:47:53 字數 4038 閱讀 8283

一、簡介

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驅動的分類問題...