CPU:RK3399
系統:Android 7.1
IC:FT5406
focaltech(敦泰)觸摸屏也是比較常用的,但是相對匯頂,就比較少用
RK的源碼中雖然有 focaltech 的代碼,但沒有調試過,一般都會用供應商提供的代碼
供應商會提供一個名為 focaltech_touch 的文件夾,里面包括觸屏所有代碼
我們要做的就是將代碼移植到 kernel 中,編譯燒錄
1、將文件加拷貝到 kernel/drivers/input/touchscreen/ 目錄下
2、修改 touchscreen 目錄下的 Kconfig 文件,在最后一行的 endif 前加一行
source "drivers/input/touchscreen/focaltech/Kconfig"
3、修改 touchscreen 目錄下的 Makefile 文件,在最后一行添加
obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_touch/
4、修改 rockchip_defconfig 文件,將代碼加入編譯,相當於修改 .config 文件
CONFIG_TOUCHSCREEN_FTS=y
5、在 dts 中添加設備,需要找到對應的 i2c
&i2c4 { status = "okay"; i2c-scl-rising-time-ns = <150>; i2c-scl-falling-time-ns = <30>; clock-frequency = <400000>; focaltech: focaltech@38 { compatible = "focaltech,fts"; reg = <0x38>; focaltech,reset-gpio = <&gpio1 4 GPIO_ACTIVE_LOW>; focaltech,irq-gpio = <&gpio1 6 IRQ_TYPE_LEVEL_LOW>; focaltech,max-touch-number = <5>; focaltech,display-coords = <0 0 800 1280>; tp-supply = <&vcc3v0_tp>; focaltech,have-key; focaltech,key-number = <3>; focaltech,keys = <139 102 158>; focaltech,key-y-coord = <1200>; focaltech,key-x-coords = <200 400 600>; }; };
FT5406設備地址:0x70,dts 中需要右移一位,等於除以2,實際為 0x38
focaltech,reset-gpio:復位引腳
focaltech,irq-gpio:中斷引腳
focaltech,max-touch-numbe:IC 支持的最大觸摸點數
文件 focaltech_core.h 中的宏 FTS_MAX_POINTS_SUPPORT 與此值保持一致,FTS_MAX_POINTS_SUPPORT 過大,雖然使用中不影響,但是測試多點觸控會顯示無效的觸控點
display-coords:設置觸摸屏的分辨率
focaltech,have-key:是否有觸摸按鍵,有的話需要定義此行,無觸摸按鍵屏蔽
focaltech,key-number:觸摸按鍵個數
focaltech,keys:每個按鍵對應的按鍵值
focaltech,key-y-coord:觸摸按鍵的 y 坐標
focaltech,key-x-coords:觸摸按鍵的 x 坐標
此時就移植完畢,下面是調試過程中遇到的問題
1、讀取的 chip id 匹配失敗
[FTP]TP not ready, read:0x55aa
需要在 focaltech_common.h 的 FTS_CHIP_TYPE_MAPPING 中添加,具體需要咨詢供應商
#define FTS_CHIP_TYPE_MAPPING { \ {0x01, 0x58, 0x22, 0x58, 0x22, 0x00, 0x00, 0x58, 0x2C}, \ {0x02, 0x55, 0xAA, 0x55, 0xAA, 0x00, 0x00, 0x79, 0x03}, \ }
添加后還是同樣的問題,id 的高位匹配成功,低位匹配失敗,
[FTP]TP not ready, read:0x55ff
原因是代碼太舊,要么更新代碼,要么刪除低位匹配
供應商建議取消低位匹配,並將 focaltech_config.h 中 FTS_AUTO_UPGRADE_EN 設置為 0
if (VALID == fw_valid) { if (id_h == ctype[i].chip_idh) break; } else { if ((id_h == ctype[i].rom_idh) || (id_h == ctype[i].pb_idh) || ((id_h == ctype[i].bl_idh) && (id_l == ctype[i].bl_idl))) break; }
2、開機后觸摸屏可以正常使用,但是休眠喚醒后,觸摸無效
檢查 reset 腳配置正確,並且 reset 腳沒有開路
將 focaltech_config.h 文件中 FTS_POWER_SOURCE_CUST_EN 設置為 0,測試還是不行
將 suspend 函數中設置 ic 休眠寄存器的部分屏蔽掉,喚醒后觸摸正常,此時確認喚醒時復位失敗
ret = fts_i2c_write_reg(ts_data->client, FTS_REG_POWER_MODE, FTS_REG_POWER_MODE_SLEEP_VALUE); if (ret < 0) FTS_ERROR("set TP to sleep mode fail, ret=%d", ret);
用示波器測試喚醒時 reset 引腳,發現休眠和喚醒一直是高電平
查看代碼,發現 resume 函數中復位函數被屏蔽了,取消屏蔽就正常了
fts_reset_proc(200);