调试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
基于I2C的嵌入式多点触摸屏幕驱动设计:对driver流程的说明
linux多点触摸接口:对input设备各个参数有详细的说明
http://tanatseng.blog.163.com/blog/static/174991629201132561941518/
Android多点触摸:从driver到framework到应用有说明