【i.MX6ULL】驅(qū)動(dòng)開發(fā)8——中斷法檢測按鍵

上篇,學(xué)習(xí)GPIO輸入功能的使用,本篇,來學(xué)習(xí)使用中斷的方式來檢測按鍵的按下。
1 Linux中斷介紹
中斷處理函數(shù)的執(zhí)行,越快越好,但實(shí)際使用中,某些情況確實(shí)需要比較耗時(shí)是中斷過程,為此,Linux內(nèi)核將中斷分為上半部和下半部兩個(gè)處理部分:
上半部:中斷處理函數(shù),那些處理過程比較快,不會占用很長時(shí)間的處理就可以放在上半部完成
下半部:如果中斷處理過程比較耗時(shí),那么就將這些比較耗時(shí)的代碼提出來,交給下半部去執(zhí)行,這樣中斷處理函數(shù)就會快進(jìn)快出
對于一個(gè)中斷,如何劃分出上下兩部分呢?
對時(shí)間敏感,將其放在上半部
和硬件相關(guān),將其放在上半部
要求不被其他中斷打斷,將其放在上半部
其他所有任務(wù),考慮放在下半部
1.2 下半部的3種實(shí)現(xiàn)方式
1.2.1 軟中斷
Linux內(nèi)核使用softirq_action結(jié)構(gòu)體表示軟中斷:
一共有 10 個(gè)軟中斷
要使用軟中斷,必須先使用open_softirq函數(shù)注冊對應(yīng)的軟中斷處理函數(shù):
注冊好軟中斷以后需要通過raise_softirq函數(shù)觸發(fā):
1.2.2 tasklet
Linux內(nèi)核使用tasklet_struct結(jié)構(gòu)體來表示tasklet:
要使用 tasklet,必須先定義一個(gè)tasklet,然后初始化:
在上半部(中斷處理函數(shù))中調(diào)用tasklet_schedule函數(shù)就能使tasklet在合適的時(shí)間運(yùn)行:
1.2.3 工作隊(duì)列
工作隊(duì)列(work queue)是另外一種將中斷的部分工作推后的一種方式,它可以實(shí)現(xiàn)一些tasklet不能實(shí)現(xiàn)的工作,比如工作隊(duì)列機(jī)制可以睡眠。
Linux 內(nèi)核使用work_struct結(jié)構(gòu)體表示一個(gè)工作:
這些工作組織成工作隊(duì)列,工作隊(duì)列使用workqueue_struct結(jié)構(gòu)體表示。
在工作隊(duì)列機(jī)制中,將推后的工作交給一個(gè)稱之為工作者線程(worker thread)的內(nèi)核線程去完成。
1.3 中斷API函數(shù)
1.3.1 request_irq中斷請求函數(shù)
flags中斷標(biāo)志,有下面幾種類型

1.3.2 free_irq中斷釋放函數(shù)
1.3.3 irq_handler_t中斷處理函數(shù)
irqreturn_t枚舉類型定義:
1.3.4 中斷使能/禁用函數(shù)
1.3.5 獲取中斷號
使用中斷時(shí),中斷信息先寫到了設(shè)備樹里面,然后通過irq_of_parse_and_map函數(shù)從interupts屬性中提取到對應(yīng)的中斷號
2 軟件編寫
仍使用上篇按鍵實(shí)驗(yàn)中用到的兩個(gè)按鍵:

為了理解簡單,本次程序暫不實(shí)現(xiàn)中斷的下半部邏輯,直接將整個(gè)中斷處理過程都放到中斷的上半部中處理。
2.1 修改設(shè)備樹文件
在上篇key實(shí)驗(yàn)代碼的基礎(chǔ)上,修改imx6ull-myboard.dts,主要是修改key子節(jié)點(diǎn),添加中斷,修改后內(nèi)容如下:
2.2 按鍵中斷驅(qū)動(dòng)程序
2.2.1 硬件初始化與中斷配置
中斷檢測到按鍵按下后,為了消除按鍵抖動(dòng),這里使用定時(shí)器來進(jìn)行按鍵消抖,因?yàn)楸敬螌?shí)驗(yàn)用到兩個(gè)按鍵,所以就先也使用兩個(gè)定時(shí)器。
2.2.2 中斷服務(wù)函數(shù)
中斷函數(shù)檢測到按鍵按下后,會開啟一個(gè)10ms的定時(shí)器,用來按鍵消抖。
2.2.3 定時(shí)器服務(wù)函數(shù)
定時(shí)器的10ms到達(dá)之后,會觸發(fā)定時(shí)器服務(wù)函數(shù),此時(shí)再次讀取按鍵的值,若仍為按下,則是按鍵真的按下了,若10ms后又檢測不到按鍵了,則說明是按鍵抖動(dòng)導(dǎo)致的按鍵誤觸發(fā)。
2.2.4 按鍵讀取函數(shù)
2.3 按鍵中斷驅(qū)動(dòng)程序
按鍵中斷的應(yīng)用程序,使用上篇的按鍵檢測的應(yīng)用程序即可
3 實(shí)驗(yàn)
編譯設(shè)備樹與驅(qū)動(dòng)文件(irqkey-BSp.ko),使用上篇的按鍵應(yīng)用程序(key-App),按下按鍵,會打印get key,松開按鍵,會打印key release。

4 總結(jié)
本篇主要介紹了Linux中斷的使用方法,通過按鍵來進(jìn)行中斷實(shí)驗(yàn)測試,并使用Linux定時(shí)器進(jìn)行按鍵去抖。