@
目录TP是TouchPad触摸屏的意思,触控屏(Touchpanel)又称为触控面板,是个可接收触头等输入讯号的感应式液晶显示装置。
电阻式触摸屏,简称电阻屏,主要是利用压力感应进行控制,当用手指或其他物体触摸屏幕时,两个导电层发生接触,电阻产生变化,控制器根据电阻的具体变化来判断接触点的坐标并进行相应的操作。
本文主要针对电阻式触摸屏(Y89415)进行详细说明。
结构层次,如下图所示:
在玻璃表面用ITO (一种透明的导电氧化锢锡)制作成横向与纵向电极阵列,这些横向与纵向的电极分别与地构成电容,在触屏检测时,自电容一次分别检测横向与纵向电极阵列,根据触摸前后电容的变化,分别确认横向坐标和纵向坐标,然后组成平面的触摸坐标。
主机芯片(UM9117芯片)作为主机。
TP屏(Y89415)作为从机。
根据具体的硬件接线,选择I2C1作为通讯接口进行参数配置如下
struct SPRD_I2C sprd_i2c[I2C_DEVICE_MAX] = { ... { /*i2c1*/ CTL_I2C1_BASE, 100000, 1, 12, 1, TB_I2C1_INT, REG_AP_CLK_CORE_CGM_I2C1_CFG, I2C_26M, REG_AP_APB_APB_EB, BIT_AP_APB_I2C1_EB, REG_AP_APB_APB_RST, BIT_AP_APB_I2C1_SOFT_RST, 1, DMA_I2C1_TX, DMA_I2C1_RX, }, ... };
如下图所示,进行硬件引脚的配置,当配置完成后,如果有触屏TP屏幕,就会产生中断
通知芯片,此时有对TP屏幕进行操作,需要去处理。
// 在pinmap_cfg.c 里面增加中断引脚和电源引脚模式配置 {15,1,PM_INPUT, PM_FALLING_EDGE}, // CTP INT {34,0,PM_OUTPUT, PM_INVALID_INT}, // CTP RST // 在gpio_cfg.c 里面增加中断引脚和电源引脚触发配置 {GPIO_PROD_TP_INT_ID, GPIO_PROD_TYPE_BB0, GPIO_PROD_LOW_LEVEL, 15 , PNULL}, {GPIO_PROD_TP_WAKE_ID, GPIO_PROD_TYPE_BB0, GPIO_PROD_LOW_LEVEL, 34 , PNULL}, // 在tp_multi_drv.c 里面增加中断引脚触发函数配置 LOCAL BOOLEAN _TPM_MountGPIOHandler (void) { if (GPIO_PROD_RegGpio( //GPIO_AddCallbackToIntTable GPIO_PROD_TP_INT_ID, SCI_FALSE, SCI_FALSE, SCI_FALSE, 5, (GPIO_PROD_CALLBACK)_TPM_IntHandler)) { GPIO_TPIRQCtrl(SCI_TRUE); return TRUE; } return FALSE; }
当收到中断通知的时候,芯片可以通过读取寄存器的值,来获取对应的X,Y坐标以及手势操作(按下,保持,抬起)
根据对应的操作和坐标来对应的进行LCD屏幕上面的效果显示。
Y89415TP这款设备,
读取坐标的方式是,先去往寄存器地址0x5C写入00,然后再去读取0X5D的地址,连续读取18个数据长度
其中XY的坐标获取算法如下
/* 按照TP键盘位置排列 */ const uint16 xy_keymap[] = { NULL, SCI_VK_MENU_SELECT, SCI_VK_UP, SCI_VK_MENU_CANCEL, SCI_VK_LEFT, SCI_VK_WEB, SCI_VK_RIGHT, SCI_VK_CALL, SCI_VK_DOWN, SCI_VK_POWER, SCI_VK_1, SCI_VK_2, SCI_VK_3, SCI_VK_4, SCI_VK_5, SCI_VK_6, SCI_VK_7, SCI_VK_8, SCI_VK_9, SCI_VK_STAR, SCI_VK_0, SCI_VK_POUND, }; for (i = 0; i < 2; i++) { if ((read_buf[6 * i + 3] & 0xc0) == 0xc0) { continue; } x = (int16)(read_buf[6 * i + 3] & 0x0F) << 8 | (int16)read_buf[6 * i + 4]; y = (int16)(read_buf[6 * i + 5] & 0x0F) << 8 | (int16)read_buf[6 * i + 6]; gpio_msg.wparam = xy_keymap[x]; switch (read_buf[6 * i + 3] & 0xF0) { case 0x00: case 0x80: gpio_msg.message = TB_KPD_PRESSED; break; case 0x40: gpio_msg.message = TB_KPD_RELEASED; break; default: gpio_msg.message = TB_KPD_INVALID_KEY; return TP_MULTI_ERROR; } DRV_Callback(TB_GPIO_INT, &gpio_msg); }