1. 目的
本文档描述 Android 平台 Touch 驱动开发过程(目前只实现单点触控)。
2. 适用范围
本文档适用于 Android 平台 Touch 驱动开发。
3. 参考文 档
TM0005 多点电阻规格书 A
TSD2015RM_spec_v1[1].2
4. Android 平台增加 Touch 宏定义
本次设计采用信利公司( Truly ) TM0005--AFFF-38-S-E-S 多点触控触摸屏,因此增加了一个供此触摸屏使用的宏定义。
<1> 、Kconfig 文件(/linux-2.6.28/drivers/input/touchscreen ):
增加宏定义
<2> 、Makefile 文件(/linux-2.6.28/drivers/input/touchscreen ):
在touchscreen 文件夹中增加truly_i2c_rmi.c 文件,makefile 增加编译处理
<3> 、anchiano_svn_defconfig 文件(/linux-2.6.28/arch/arm/configs )
注销之前使用的宏定义,启用新增加的宏定义
5. 加载 Truly_touch 驱动文件
该触摸屏通过 IIC 总线进行数据传输,复位信号 LCD_TP_RESET 连接至 PXA310 芯片 GPIO111 ;中断信号 LCD_TP_INT 连接至 PXA310 芯片 GPIO8_2 。
RESET 信号高电平有效。 INT 信号低电平有效。
触摸屏 IIC 地址为 0x50 ,中断脚为 GPIO8_2 ,在 Littleton.c 文件中 littleton_i2c_board_info 定义触摸屏 IIC 相关信息如下:
static struct i2c_board_info littleton_i2c_board_info[] = {
#if defined(CONFIG_TOUCHSCREEN_TRULY_I2C_RMI)
{
.type = "lcd_truly",
.addr = 0x50,
.platform_data = &truly_data,
.irq = IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO8_2)),
},
#endif
}
在 Littleton.c 文件中增加 truly_touch 的上电、复位和中断操作。
1 、电源:触摸屏电源采用 PMIC 模块电源
2 、复位:经测试,复位高电平信号会在上电高电平之前产生,导致复位失效,出现的错误经常是 IIC 接口不通,无法通信,或者 IIC 接口可以通信,但读取寄存器坐标值全为 0 。因此设置在上电后将复位信号拉低,再拉高持续 100ms (触摸屏规格书要求几十毫秒)后再拉低,形成高电平信号,以实现复位作用。
3 、中断:映射 GPIO8_2 产生中断信号。
4 、 truly_i2c_rmi.c 中模块初始化,增加对模块的上电、复位和中断使能操作。
与多数模块一样,调用宏 module_init () 与 module_exit () 去注册初始化与退出函数。
编写 truly_init 和 truly_exit 函数。(本设计中使用到工作队列,后续介绍)
编写调用的驱动相关信息 truly_driver
下面介绍 truly_probe 、 truly_remove 、 truly_suspend 和 truly_resume 函数功能的实现。
6. 单点触控功能的实现
1、 truly_probe
点击触摸屏触发中断产生,进入 truly_ts_irq_handler 函数处理中断。
流程图如下所示:
2、 truly_remove
3、 truly_suspend
当系统进入休眠状态时,触摸屏被挂起。流程图如下所示:
4、 truly_resume
当系统被唤醒时调用
7. 多点触控功能的实现
获取两个触摸点坐标值,计算该两个触摸点的 dx 和 dy ,根据 dx 和 dy 计算两点之间的 width ,通过 input_report_abs(ts->input_dev, ABS_TOOL_WIDTH, width) 上报。系统根据 width进行逆运算得出dx和dy,根据dx和dy 的变化实现放大缩小功能。
dx = (report_Ax2 - report_Ax1);
dy = (report_Ay2 - report_Ay1);
if (dx < 0)
dx = -dx;
if (dy < 0)
dy = -dy;
dx = ((1 << 12) - 1) * dx / 480;
dy = ((1 << 12) - 1) * dy / 800;
width = (dx << 12) + dy;