編輯:關於Android編程
MSM8909+Android5.1.1鍵盤驅動------概述
采用SN7326帶智能指掃描的鍵盤擴展芯片,通過I2C接口來讀取其狀態寄存器的值就可知道是單按鍵還是多按鍵按下,可知道具體是哪個按鍵按下。然後鍵盤驅動調用input_event()上報linux的掃描碼,比如KEY_RIGHT,然後傳遞給android框架層,流程如下圖:
圖1
下面介紹要實現鍵盤驅動所涉及的主要方方面面
1.Input子系統
Linux輸入設備總類繁雜,常見的包括有按鍵、鍵盤、觸摸屏、鼠標、搖桿等等,他們本身就是字符設備,而linux內核將這些設備的共同性抽象出來,簡化驅動開發建立了一個input子系統。輸入子系統由核心層(Input Core)、驅動層和事件處理層(EventHandler)三部份組成。一個輸入事件,如鼠標移動,鍵盤按鍵按下,joystick的移動等等通過
input driver -> Input core -> Eventhandler -> userspace 到達用戶空間傳給應用程序。
圖2
除了input driver部分,其他的內核已經寫好,基本不需要修改,所以我們需要寫一個I2C input driver。
2.Linux內核I2C設備驅動
因為我們是通過基於I2C接口的sn7326芯片來掃描按鍵的,所以需要寫I2C設備驅動。
Linux內核I2C設備驅動包含3層[10],分別是:I2C總線驅動(I2C core)、I2C控制器驅動(I2C adapter)及I2C設備的驅動(I2C driver)。I2C總線驅動主要實現對I2C總線及控制器和設備驅動的管理。這部分代碼為通用部分,Linux內核已經完善,不需要改動。I2C控制器驅動跟硬件相關,主要是構造一個與I2C總線層接口的數據結構,並通過接口函數向I2C總線注冊一個控制器。同時,實現對I2C控制器中斷的處理函數,完成I2C設備具體功能的實現。I2C設備驅動主要是構造一個與I2C總線層接口的數據結構,通過接口函數向I2C總線層注冊一個I2C設備驅動。同時構造一個與用戶層接口的數據結構,通過接口函數向內核注冊一個字符型設備。
我們這裡是要開發一個I2C設備驅動。
3.按鍵硬件碼、Linux掃描碼和android的鍵盤碼
3.1按鍵硬件碼
硬件碼是我的命名,就是指按下按鍵時,最初的按鍵標識編碼值,這個和具體的按鍵設計、采用的鍵盤擴展IC芯片的設計相關,比如sn7326
圖3
這裡的映射表就是硬件碼值。
3.2Linux掃描碼
掃描碼是LinuxInput系統中規定的碼值,好比PC鍵盤上每個鍵的鍵值。都是數字。在設備上輸入一下命令後,按鍵可以探測到得到每個按鍵的掃描碼Code.
Linux的掃描碼在\kernel\include\uapi\linux\input.h定義,比如: /* *Keys and buttons * *Most of the keys/buttons are modeled after USB HUT 1.12 *(see http://www.usb.org/developers/hidpage). *Abbreviations in the comments: * AC- Application Control * AL- Application Launch Button * SC- System Control */ #define KEY_RESERVED 0 #define KEY_ESC 1 #define KEY_1 2 #define KEY_2 3 #define KEY_3 4 #define KEY_4 5 #define KEY_5 6 #define KEY_6 7 #define KEY_7 8 #define KEY_8 9 #define KEY_9 10 #define KEY_0 11
3.3Android的鍵盤碼
Android也定義了一套碼,叫作鍵盤碼,通過一個/system/usr/keylayout/來將兩套碼對應起來。這裡用的是sn7326.kl。(如果沒有其它*.kl,則是默認的qwerty.kl)
/frameworks/base/data/keyboards/Generic.kl定義,比如:
# # Generic key layout file for fullalphabetic US English PC style external keyboards. # # This file is intentionally very genericand is intended to support a broad rang of keyboards. # Do not edit the generic key layout tosupport a specific keyboard; instead, create # a new key layout file with the requiredkeyboard configuration. # key 1 ESCAPE key 2 1 key 3 2 key 4 3 key 5 4 key 6 5 key 7 6 key 8 7 key 9 8 key 10 9 key 11 0
那如同這個題目,這裡面涉及的東西其實還是比較多的,RecycleView SwipeRefreshLayout,下拉刷新(這個就是SwipeRefreshLayout的)
Tab標簽頁是UI設計時經常使用的UI控件,可以實現多個分頁之間的快速切換,每個分頁可以顯示不同的內容。 TabHost相當於浏覽器中標簽頁分布的集合,而Tabspec
本系列文章會根據項目的進度進行相關介紹,其會分為多個模塊,每個模塊互不依賴,各個模塊都是單獨的學習內容,如sqlite學習模塊,contacts聯系人模塊等。新建項目相信
GreenDao的GitHub地址:https://github.com/greenrobot/greenDAO新建gradle空白項目,項目結構如下:新建”