Android 多点触摸

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;   

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值