調試TouchPanel也有一段時間了,今天總結一下,平台是MSM7x27,android2.2,TP主要就是I2C了,這裡不介紹I2C,不清楚的自己search,主要介紹TP在這個平台上的移植內容。需要注意的是平台採用的是硬體I2C而非GPIO類比。
一.裝置和驅動的檔案節點
在目錄/sys/bus/i2c/devices下的裝置就是這個i2c_board_info結構體裡所描述的I2C裝置,
而/sys/bus/i2c/devices下的裝置名稱字就是根據i2c_board_info結構體中定義的I2CAddress來命名的。
# ls
i2c-0
0-0038 //I2C_BOARD_INFO("ft5xxx",0x70>>1),/*這個是I2C裝置的從機地址*/
0-005c //I2C_BOARD_INFO("ssd2531",0x53),/*這個是I2C裝置的從機地址*/
0-000a //I2C_BOARD_INFO("bma200",0x0A),/*這個是I2C裝置的從機地址*/
0-001e //I2C_BOARD_INFO("hmc5883",0x3c>>1),/*這個是I2C裝置的從機地址*/
0-003c //I2C_BOARD_INFO("ov2655",0x60>>1)
0-0030
0-0010 //I2C_BOARD_INFO("rda5802",0x20>>1),
0-001c //I2C_BOARD_INFO("ltr600",0x38>>1),/*這個是I2C裝置的從機地址*/
i2c-1
<6>[ 1.107875] input: ft5xxxas /devices/i2c-0/0-0038/input/input3
# cd sys/devices/i2c-0
# ls
uevent
name
new_device
delete_device
subsystem
power
0-0038
0-005c
0-000a
0-001e
0-003c
0-0030
0-0010
0-001c
i2c-dev
# cd 0-005c
# ls
uevent
name
modalias
subsystem
power
#
# cd 0-0038
# ls
uevent
name
modalias
subsystem
power
driver
input
# cat name
ft5xxx
#
二.調試方法
adb shell dmesg>dmesg.log;
或者可以即時查看cat /proc/kmsg,如觸摸時返回座標是否正確;
對input裝置即時查看還可以進入shell後:getevent,會列出所有的event裝置,進行相應的操作會輸出資訊。貼寫log,如下
<3>[ 1.095116] [FT5XXX]entermutitouch_init
<3>[ 1.095168] [FT5XXX]entermutitouch_probe
<3>[ 1.095183][FT5XXX]mutitouch_chip->pdata->gpio_rst =41
<3>[ 1.107221] [FT5XXX]entermutitouch_read_devid
<3>[ 1.107238] [FT5XXX]entermutitouch_write
<3>[ 1.107356] [FT5XXX]entermutitouch_read
<6>[ 1.107440] read Ft5302 ID= 0x79
<3>[ 1.107451] [FT5XXX]entermutitouch_write
<3>[ 1.107558] [FT5XXX]entermutitouch_write
<6>[ 1.107638] select ctpFt5302
<6>[ 1.108021]input: ft5xxx as /devices/i2c-0/0-0038/input/input3
<3>[ 1.108341] [FT5XXX]leavemutitouch_probe
三、修改的檔案:
1.kernel/arch/arm/mach-msm/board-msm7x27-qrd.c
msm7x2x_init開機初始化,配置INT、RSTPin 對應的GPIO,I2C裝置的地址等
#ifdef CONFIG_TOUCHSCREEN_FT5XXX
i2c_register_board_info(0,ft5xxx_i2c_board_info, ARRAY_SIZE(ft5xxx_i2c_board_info));
ts_ft5xxx_config_gpio( );
#endif
其中關鍵I2C地址是在ft5xxx_i2c_board_info
static struct i2c_board_infoft5xxx_i2c_board_info[] = {
{
I2C_BOARD_INFO("ft5xxx",0x70 >> 1),
.irq=MSM_GPIO_TO_INT(TS_FT5XXX_GPIO_INT),
.platform_data = &ft5xxx_ts_data,
},
};
這個地址是7bit形式,不包括讀寫位,通常從datasheet得到的地址要右移1位,讀寫時系統會自己再做處理,從檔案系統中讀到driver名字是移位後的,就是從這裡傳入的值,但波形圖裝置地址仍然是沒有移過位的。當host和slave無法通訊時,可以嘗試左移一位操作。
2.kernel/drivers/input/touchscreen/ft5xxx.c
這個就是驅動檔案了,兩個主要的函數是mutitouch_probe和mutitouch_ts_work,
mutitouch_probe完成讀取裝置ID,設定裝置屬性參數(可以接受的事件類型,xy座標範圍,裝置名稱字(必須和driverName一致),匯流排類型等),註冊input裝置建立裝置節點/dev/input/eventX,建立相應的work及註冊休眠函數
mutitouch_ts_work就是中斷觸發調用相應的work後的關聯函數了,主要就是讀取座標資訊並上報給上層,完成這個函數要對IC很熟悉,包括讀寫命令,資料包的格式等。
3.kernel/arch/arm/configs/msm7627-perf-qrd_defconfig
就是配置一下宏了CONFIG_TOUCHSCREEN_FT5XXX=y
4.kernel/drivers/input/touchscreen/Makefile
根據宏來編譯相關的driver檔案
obj-$(CONFIG_TOUCHSCREEN_FT5XXX) += ft5xxx.o
5.kernel/drivers/input/touchscreen/Kconfig
config TOUCHSCREEN_FT5XXX
tristate "FT5XXX Capacitive TouchPanel"
depends on I2C
四、補充
1.SDA SCL 在哪裡設定的?
board-msm7x27-qrd.c:msm_i2c_gpio_config()
gpio_scl = 60;
gpio_sda = 61;
2.複位期間為低電平期間
gpio_set_value(tc_chip->pdata->gpio_rst , IO_LOW);
mdelay( 200 );
gpio_set_value(tc_chip->pdata->gpio_rst,IO_HIGHT);
mdelay( 2 );
3.其他涉及的相關檔案
i2c-msm.c
4.針對一款TP除了熟悉datasheet外,就是要知道linux提供的系統介面了
比如如何申請中斷,如何建立work queue。
5.參考
linux子系統分析及觸控螢幕驅動淺析:有加input裝置的最簡單例子
http://blog.csdn.net/Ralph_sqd/article/details/5933388
Linux裝置驅動的分層設計思想:inputdev
http://www.linuxidc.com/Linux/2010-06/26812p2.htm
基於I2C的嵌入式多點觸控螢幕幕驅動設計:對driver流程的說明
http://www.dzsc.com/data/html/2011-3-11/89104.html
linux多點觸摸介面:對input裝置各個參數有詳細的說明
http://tanatseng.blog.163.com/blog/static/174991629201132561941518/
Android多點觸摸:從driver到framework到應用有說明
http://wenku.baidu.com/view/a6a0ee0b79563c1ec5da7119.html