S3C6410 KeyPad驅動(下)
1.1 按鍵中斷處理流程
1.1.1 按鍵掃描的處理流程
在初始狀態,所有的列線(輸出)處於低電平,當沒有按鍵按下的狀態時,所有的行線(輸入)都是高電平(使用上拉功能)。當任何按鍵按下時,相應的行和列線串連在一起,並且相應的行被驅動為低電平,此時產生一個鍵盤中斷。接著CPU(軟體)通過寫列資料輸出寄存器KEYIFCOL向一列寫入低電平,而向其他列寫入高電平。在每次寫入的時候,CPU讀取行資料輸入寄存器KEYIFRO來相應的列按鍵是按下,這樣,當掃描處理完成後,就可以找到按下的一個或多個按鍵。
圖24 鍵盤掃描初始化狀態
下面假設按下按鍵27,是如何確定此按鍵的流程:
1) 當按下27鍵的時候,它所在的第3行輸入低電平,也即GPK11輸入低電平,這可通過讀取KEYIFROW寄存器獲知。
2) CPU通過寫KEYIFCOL寄存器來寫第0位為低電平,第1到第第7位為高電平,然後來讀取KEYIFROW寄存器的值,這時讀取到的值為11111111,沒有其中一行輸入為低電平,說明,按鍵的按鍵不在第0列,見
圖25 鍵盤掃描處理流程II
3) 直到CPU向KEYIFCOL寄存器低八位寫入11110111,這時讀取到KEYIFROW寄存器低八位的值為11110111,可知第3行輸入為低電平,此時對應的是掃描條件時第3列輸入低電平,這樣就可以判斷按鍵在第3行和第3列交叉處的按鍵,從而判斷了具體的按鍵。
4) 對於多個按鍵,掃描原理一樣,見的說明。
圖26鍵盤掃描處理流程III
1.1.2 PDD的IST處理
下面來看IST線程KeyMatrix::IsrThreadProc()的主要處理部分:、
圖27 IST線程KeyMatrix::IsrThreadProc()
此IST對按鍵的處理流程有下面一些情況:
下面分別介紹調用到的一些函數:
1) KScan_ProcIO函數
圖28 KScan_ProcIO函數體
按下第3行第3列的按鍵時,ChangeState[3]=0x8,這裡的3是指第3列,而0x8的位元是00001000,表示第3行,由此根據ChangeState[3]=0x8,可以知道是按下第3行第3列的按鍵被按下,其他idx對應的ChangeState[idx]值是0;同理,對於按下第3行第2列的按鍵時有ChangeState[2]=0x8,但如果同步選取這兩個按鍵,這ChangeState[3:2]=0x8。也就是說ChangeState數組中的idx值用來指示是哪一列的按鍵,而ChangeState[idx]的值(非零)用來指示是哪一行的按鍵。
備忘:下面基於4*4的鍵盤來描述,其中採用了低4行(GPK8~GPK11)和高四列(GPL4~GPL7)。
2) KeybdEventCallback函數
PDD層通過調用KeybdEventCallback函數把當前device layout按下的按鍵的掃描碼和按鍵狀態發送給MDD層,此函數體如下:
圖29 KeybdEventThreadProc函數
3) KeybdEventThreadProc線程
接收來之KeybdEventThreadProc函數發送過來的鍵盤事件,把掃描碼轉換為虛擬鍵碼,然後發送重新對應的鍵盤事件給GWES,此線程主要部分如下:
圖30 KeybdEventThreadProc線程
鍵盤驅動就先介紹到這裡了,其實還有很多內容的,大家可以深入MDD層部分。