S3C6410 KeyPad驱动(下)
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層部分。
總結
以上是生活随笔為你收集整理的S3C6410 KeyPad驱动(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: S3C6410 KeyPad驱动(上)
- 下一篇: FPGA组成、工作原理和开发流程