按鍵中斷解決irq_of_parse_and_map返回0的問題--Apple的學習筆記我為了復習相關函數(shù)和io模型,所以自己寫按鍵中斷,其實linux中有input子系統(tǒng)就像pinctrl子系統(tǒng)一樣,已經(jīng)抽象的寫好了按鍵驅(qū)動。因為一般的驅(qū)動就是要實現(xiàn)open,read,write的io模型。所以linux內(nèi)核都幫我們寫好了。我們可以復用。到document的input文件夾中看相關幫助資料。網(wǎng)上資料也一大堆。
A.今天的學習目標:
- 看內(nèi)核代碼,熟悉input子系統(tǒng)框。
- 會參考已經(jīng)有的input子系統(tǒng)driver,自己使用input子系統(tǒng)框架來實現(xiàn)按鍵中斷driver。
- 直接使用gpio-key的driver來實現(xiàn)按鍵中。
B.input子系統(tǒng)框?qū)W習

image.png
linux內(nèi)核空間主要分三層
a,驅(qū)動層:輸入設備的具體驅(qū)動程序
b, 核心層:承上啟下,為驅(qū)動層提供輸入設備注冊的操作接口,通知事件層對輸入事件進行處理
c,事件層:和用戶空間交互。
C.input子系統(tǒng)關鍵數(shù)據(jù)結(jié)構
input_dev 輸入設備
input_handler 事件處理器
input_handle 連接結(jié)構體
我本來在想為什么要加一個input_handle,直接連接dev和handler不就可以了。后來網(wǎng)上查了,因為不是一對一而是可以1對多的關系。一個設備可以對應多個事件,一個事件也可以對應多個設備。
D.內(nèi)核代碼分析
input_register_handler開始到最后connect,可以參考
12.Linux之輸入子系統(tǒng)分析(詳解),此文描述的比較好。

image.png
E.實踐
實驗1,使用input子系統(tǒng),自己寫驅(qū)動。--已完成
實驗2,直接使用gpio-key,通過修改設備樹完成驅(qū)動。--已完成
F.小結(jié)
一,關于中斷中的鎖使用
- spin_lock--不會關中斷,某進程鎖住了,然后中斷處理程序中也使用了此時由于某進程被掛起,導致中斷程序獲取不了資源而產(chǎn)生死鎖。
- spin_lock_irq--進入中斷會關閉中斷,退出的時候是開啟的。
- spin_lock_irqsave--進入的時候會關閉中斷,退出的時候會恢復之前的中斷狀態(tài)。