android底層驅動學習之focaltech觸屏例項理解
android底層驅動學習之focaltech觸屏例項理解
這個星期接觸了具體的驅動例項-----focaltech公司的觸控IC。下面總結下我個人對於觸屏驅動的理解,分為兩個方面:硬體方面和軟體驅動方面
硬體方面:
1. 簡單介紹下觸控式螢幕的發展
隨著計算機技術的普及,在20世紀90年代初,出現了一種新的人機互動作用技術--觸控式螢幕技術。利用這種技術使用者只要用手指輕輕地碰計算機顯示屏上的圖符或文字就能實現對主機操作,這樣擺脫了鍵盤和滑鼠操作,使人機互動更為直截了當。因此,觸控式螢幕技術已成為當前最簡便的人機交流的輸入裝置。
2. 那觸控式螢幕都由什麼組成?
對於我們開發人員來說,觸控式螢幕其實是由顯示屏+觸控IC,平常的驅動開發指的是對針對觸控IC,下面以一個簡單的圖來模擬下我個人對觸控式螢幕的理解:
在我們的顯示中觸控IC是裝在顯示屏上的,然後觸控IC通過排線與CPU的外圍電路相連,然後驅動程式來建立CPU與觸控IC的軟體連線。
3. 那觸控式螢幕是怎麼工作的呢?
目前觸控式螢幕有好幾種,比如電阻、電容、紅外線、表面聲波等,目前用的比較多是電容觸控式螢幕。
電容觸控式螢幕由一塊四層複合玻璃屏組成,四個角上引出四個電極,由於人是個導體,當人手觸碰螢幕時,會造成電流從四個電極流程,那觸控IC就可以通過檢測四個電極流出的電流值得比例來確定觸碰的位置。
示意圖如下:觸控IC通過讀取1、2、3、4電極收到的電流比例,計算出觸碰點A的位置,同時中斷使能,將A點的位置資訊上傳給CPU.
4. 那觸控IC是如何把資料傳給CPU的呢?
目前電容觸控IC用到的基本通訊介面有三種:IIC、UART、SPI,目前一般只用IIC介面,主要的介面引腳有:VDD、GND、SCL、SDA、INT、RESET、VDDIO。
定義 |
描述 |
VDD |
觸控IC電源埠,為TP供電,一般為3.3V/2.8V |
GND |
觸控IC的地線 |
SCL |
I2C通訊介面時鐘線,控制I2C匯流排傳輸速率 |
SDA |
I2C通訊介面資料線,傳輸主機與TP之間的資料 |
INT |
觸控IC中斷訊號介面,由觸控IC端發出,用於通知主機讀取座標資料,一般為低電平觸發 |
RESET |
觸控IC的復位訊號,由有主機端發出,一般為低電平時觸控IC會復位 |
VDDIO |
觸控IC的IO口電壓,一般為2.8V/1.8V,須低於VDD |
還是比較用圖來表達意思,個人比較喜歡這種方式,哈哈,下面是CPU與觸控IC的電器連線圖,注意箭頭的方向。
5. 那想不想看下具體的內部硬體圖呀,哈哈,滿足你一下吧!
看不清楚是嗎,那我們分別來看下區域性圖:
放大圖一 放大圖二
在放大圖一中,我們可以先來看下中斷的產生過程,流程:觸碰顯示屏--à位置資訊傳遞給觸控IC--à中斷引腳TS_INT_N使能----執行軟體中的中斷服務程式
同理放大圖二則是其他引腳的硬體連線圖。其實對於觸屏驅動,只需關心TS_INT_N中斷介面,至於SDA、SCL這些是控制資料傳輸的,是顯示驅動做的事,這塊在後面可以慢慢了解,應該還是很有意思的。
以上就是這個星期對觸屏原理及硬體連線的理解了。
軟體驅動方面:
1. 瞭解了觸屏硬體的實現,那下面是不是要來看下軟體驅動方面的實現?
a) 註冊初始化觸控IC的I2C介面
b) 建立觸控IC軟體結構體並初始化內部引數(name、fw-name、irq-gpio、reset-gpio、上電,讓觸屏工作起來等)
c) 設定TP INT引腳,註冊中斷,裝載中斷向量表,建立中斷服務程式
d) 建立各種debug方式(DEBUGFS、SYSFS等)
e) 等待中斷資訊,讀取手指觸控座標資料(通過I2C獲取-介面是fts_I2C_read),並上報給系統
引數名稱 |
引數含義 |
fts_Upgrade_Info info |
更新所需要的資訊如CHIP_ID等 |
char *name |
觸屏的名稱如fts_ts |
char *fw_name |
軟體版本名稱 |
u32 irq_gpio |
對應中斷口,初始化時就設好 |
u32 reset_gpio |
對應Reset口,初始化時會去設定 |
u32 family_id |
|
u32 x_max, y_max, x_min, y_min |
顯示的座標範圍 |
u32 panel_minx, panel_miny, panel_maxx, panel_maxy |
顯示螢幕的座標範圍 |
u32 group_id |
|
u32 hard_rst_dly, soft_rst_dly |
Reset時硬體和軟體的所需的delay值 |
u32 num_max_touches |
觸屏支援的最大觸控點數 |
u32 button_map[4] |
|
u8 num_button |
按鍵的數量 |
bool fw_vkey_support |
|
bool no_force_update |
|
bool i2c_pull_up |
|
bool ignore_id_check |
|
bool psensor_support |
|
int (*power_init) (bool) |
電源初始化函式 |
int (*power_on) (bool) |
控制電源開關函式 |
具體詳細的請見下面:
(一). focaltech_core.c檔案,觸屏模組初始化及註冊I2C driver。
(二)從裝置樹中讀取各引數,賦值給觸屏結構體,完成觸屏內部引數的初始化
(三)註冊input裝置模擬IO口
(四)電源初始化及開啟電源給觸屏上電
(五)定義reset為輸出口、irq為輸入口,建立軟體變數與硬體的連結
(六)註冊中斷將中斷程式放入中斷向量表中
(七)建立中斷髮生時需要report的觸屏資訊
(八)建立debugfs的除錯方式