@
目录
前言
TP是TouchPad触摸屏的意思,触控屏(Touchpanel)又称为触控面板,是个可接收触头等输入讯号的感应式液晶显示装置。
电阻式触摸屏,简称电阻屏,主要是利用压力感应进行控制,当用手指或其他物体触摸屏幕时,两个导电层发生接触,电阻产生变化,控制器根据电阻的具体变化来判断接触点的坐标并进行相应的操作。
本文主要针对电阻式触摸屏(Y89415)进行详细说明。
一 硬件构成
结构层次,如下图所示:
二 原理
在玻璃表面用ITO (一种透明的导电氧化锢锡)制作成横向与纵向电极阵列,这些横向与纵向的电极分别与地构成电容,在触屏检测时,自电容一次分别检测横向与纵向电极阵列,根据触摸前后电容的变化,分别确认横向坐标和纵向坐标,然后组成平面的触摸坐标。
三 通讯方式(IIC)
主机芯片(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);
}
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/288500.html