按鍵中斷解決irq_of_parse_and_map返回0的問題--Apple的學(xué)習(xí)筆記我為了復(fù)習(xí)相關(guān)函數(shù)和io模型,所以自己寫按鍵中斷员魏,其實(shí)linux中有input子系統(tǒng)就像pinctrl子系統(tǒng)一樣,已經(jīng)抽象的寫好了按鍵驅(qū)動。因?yàn)橐话愕尿?qū)動就是要實(shí)現(xiàn)open,read芹敌,write的io模型痊远。所以linux內(nèi)核都幫我們寫好了。我們可以復(fù)用氏捞。到document的input文件夾中看相關(guān)幫助資料碧聪。網(wǎng)上資料也一大堆。
A.今天的學(xué)習(xí)目標(biāo):
- 看內(nèi)核代碼液茎,熟悉input子系統(tǒng)框逞姿。
- 會參考已經(jīng)有的input子系統(tǒng)driver,自己使用input子系統(tǒng)框架來實(shí)現(xiàn)按鍵中斷driver捆等。
- 直接使用gpio-key的driver來實(shí)現(xiàn)按鍵中滞造。
B.input子系統(tǒng)框?qū)W習(xí)
linux內(nèi)核空間主要分三層
a,驅(qū)動層:輸入設(shè)備的具體驅(qū)動程序
b, 核心層:承上啟下栋烤,為驅(qū)動層提供輸入設(shè)備注冊的操作接口谒养,通知事件層對輸入事件進(jìn)行處理
c,事件層:和用戶空間交互班缎。
C.input子系統(tǒng)關(guān)鍵數(shù)據(jù)結(jié)構(gòu)
input_dev 輸入設(shè)備
input_handler 事件處理器
input_handle 連接結(jié)構(gòu)體
我本來在想為什么要加一個(gè)input_handle蝴光,直接連接dev和handler不就可以了。后來網(wǎng)上查了达址,因?yàn)椴皇且粚σ欢强梢?對多的關(guān)系。一個(gè)設(shè)備可以對應(yīng)多個(gè)事件趁耗,一個(gè)事件也可以對應(yīng)多個(gè)設(shè)備沉唠。
D.內(nèi)核代碼分析
input_register_handler開始到最后connect,可以參考
12.Linux之輸入子系統(tǒng)分析(詳解)苛败,此文描述的比較好满葛。
E.實(shí)踐
實(shí)驗(yàn)1,使用input子系統(tǒng)罢屈,自己寫驅(qū)動嘀韧。--已完成
實(shí)驗(yàn)2,直接使用gpio-key缠捌,通過修改設(shè)備樹完成驅(qū)動锄贷。--已完成
F.小結(jié)
一,關(guān)于中斷中的鎖使用
- spin_lock--不會關(guān)中斷曼月,某進(jìn)程鎖住了谊却,然后中斷處理程序中也使用了此時(shí)由于某進(jìn)程被掛起,導(dǎo)致中斷程序獲取不了資源而產(chǎn)生死鎖哑芹。
- spin_lock_irq--進(jìn)入中斷會關(guān)閉中斷炎辨,退出的時(shí)候是開啟的。
- spin_lock_irqsave--進(jìn)入的時(shí)候會關(guān)閉中斷聪姿,退出的時(shí)候會恢復(fù)之前的中斷狀態(tài)碴萧。