1. 程式人生 > >安卓新增按鍵驅動

安卓新增按鍵驅動

一、     文件概述

本文件主要描述安卓系統中如何新增按鍵驅動及其對映,有任何不當之處,歡迎指正。

二、     安卓按鍵驅動原理

安卓系統中,實體按鍵的識別通常有如下幾個過程:


Linux驅動層中,通常把按鍵輸入驅動設計為輸入子系統框架中。輸入子系統通常由驅動層、輸入子系統核心、事件處理層三部分組成。當實體按鍵被按下時,Linux驅動層的接收到按鍵輸入中斷,進行識別,獲取對應的按鍵掃描碼scanKeycode(所有按鍵的掃描碼定義在input.h檔案中),輸入子系統將該掃描碼通過事件方式上報至使用者空間。在使用者空間中,裝置驅動都是以檔案形式體現出來,即在/dev/input中的具體裝置檔案,安卓系統中通過執行緒不斷讀取該裝置檔案判斷是否有鍵值上報。

然後將上報的鍵值進行處理,將驅動定義的按鍵掃描碼scanKeycode根據按鍵佈局檔案qwerty.kl對映成按鍵碼標籤KeyCodeLabel 這裡的qwerty.kl安卓系統中預設按鍵佈局檔案,該檔案為linux驅動層及安卓按鍵定義的連線,將驅動層中的掃描碼轉換為安卓系統中的按鍵定義

最後通過查詢KEYCODES[]陣列,得到KeyCodeLabel字串對應的KeyCode值,該KeyCode值為安卓系統中的按鍵碼。

因此,為了讓實體按鍵輸入能夠被安卓系統所識別,我們需要編寫按鍵輸入驅動及其對應的按鍵佈局檔案。

三、     具體步驟

這裡採用的是CubieBoard2(即樹莓派3)開發板,電路及原始碼均採用該開發板配套原理圖及程式碼。這裡我們需要新增的是T9的鍵盤,共12個按鍵。

新增實體按鍵的步驟如下:

1、 選定按鍵設計方案

一般情況下,嵌入式開發板新增按鍵有以下形式:

1) GPIO掃描的方式

這種方式通過掃描GPIO的狀態來判斷按鍵是否被按下,一般有GPIO對應一個按鍵或者矩陣鍵盤兩種方式。這種通過GPIO掃描的方式較為原始,需要自己在程式邏輯中實現掃描的操作,開發週期較長。

2) KEYPAD介面

由於晶片的整合度較高、功能較為齊全,一些晶片內部集成了矩陣鍵盤的掃描邏輯,可以按照介面規範連線鍵盤即可,驅動編寫的方式也比較簡單。

3) AD介面

這種方式是因為晶片內部集成了數模轉換模組,需要設計按鍵的電路,達到在總電壓一定的情況下,按下不同的按鍵,AD介面識別到不同的電壓,然後通過按鍵與電壓值的匹配,識別當前按下的是哪個按鍵,這種方式對於外部電路的要求較高。

根據以上的幾種方式,結合CubieBoard2的實際情況,該開發板上的A20晶片有對應的keypad介面,但是沒有引出具體介面;AD介面部分已設計了總的供應電壓,只需連線按鍵電路部分即可;鑑於GPIO掃描的方式較為複雜,這裡採用AD介面的方案。

1、 電路設計

1)  開發板的AD介面

開發板上的AD介面電路如下:


主控晶片A20的LRADC0介面通過100k電阻上拉,並引至U15上的PIN41介面。可以看出,開發板上已提供電壓進行上拉,只需要在外部鍵盤電路上進行電阻搭配,連線至U15-PIN41,達到每個按鍵按下時,LRADC0處採集到不同的電壓即可。

1)  外接鍵盤電路設計

根據A20的晶片手冊說明,A20內建的LRADC是6位的AD轉換器,支援的電壓輸入範圍為0至2V。因此將電路設計如下:


這裡將每個按鍵按下的電壓間隔設定為0.15V,電阻可根據實際除錯的效果進行微調。

1、 按鍵驅動原始碼

這裡把按鍵輸入設計為輸入子系統的裝置,輸入子系統的框架比較清晰,運用起來較為簡單,只需實現對應的介面即可。主要為:模組載入函式swkbd_init()、模組解除安裝函式swkbd_exit()、中斷函式sw_isr_key()。

其中,模組載入函式負責進行輸入裝置初始化及註冊,中斷申請等操作;

解除安裝函式負責進行釋放中斷、解註冊輸入裝置;

中斷函式用於在按鍵按下時,讀取當前電壓,進行鍵值對映,並將按鍵事件進行上報。

中斷函式中按鍵對映關係如下:


具體可參考原始碼:\lichee\linux-3.4\drivers\input\keyboard\sw-keyboard.c


4、 修改對映原始碼

按鍵對映檔案位置:\android42\device\softwinner\smfy-super3\sw-keyboard.kl

修改後的檔案內容如下:


5、 按鍵驅動編譯

編譯前需要修改Kconfig及Makefile檔案。

其原始碼位置在:lichee/linux-3.4/drivers/input/keyboard/


在終端中輸入make menuconfig,進入[Device Driver]à[Input device support]à[Keyboards],選中[sofrwinner KEYBOARD SUPPORT],將該模組直接編譯進系統中。

重新編譯整個系統,包括linux核心及安卓系統。下載後測試即可看到按鍵效果。

四、     參考文件