TP屏幕适配

2022/9/9 23:23:14

本文主要是介绍TP屏幕适配,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

@

目录
  • 前言
  • 一 硬件构成
  • 二 原理
  • 三 通讯方式(IIC)
  • 四 引脚配置
  • 五 操作处理

前言

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);
}



这篇关于TP屏幕适配的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程