OpenHarmony南向之TP触摸屏

概述

Touchscreen驱动用于驱动触摸屏使其正常工作,该驱动主要完成如下工作:对触摸屏驱动IC进行上电、配置硬件管脚并初始化其状态、注册中断、配置通信接口(I2C或SPI)、设定Input相关配置、下载及更新固件等操作。

Touchscreen驱动基于HDF的Input驱动模型

Input驱动模型

Input驱动模型基于HDF驱动框架、Platform接口、OSAL接口进行开发,向上对接规范化的驱动接口HDI(Hardware Device Interface)层,通过Input-HDI层对外提供硬件能力,即上层Input Service可以通过HDI接口层获取相应的驱动能力,进而操控Touchscreen等输入设备。

Input驱动模型核心部分由设备管理层、公共驱动层、器件驱动层组成。

  • Input设备管理:为各类输入设备驱动提供Input设备的注册、注销接口,同时对Input设备列表进行统一管理。

  • Input平台驱动:指各类Input设备的公共抽象驱动(例如触摸屏的公共驱动),该部分主要负责对板级硬件进行初始化、硬件中断处理、向manager注册Input设备等。

  • Input器件驱动:指各器件厂家的差异化驱动,开发者可以通过适配平台驱动预留的差异化接口进行器件驱动开发,实现器件驱动开发量最小化。

  • Input数据通道(event hub):提供一套通用的数据上报通道,各类别的Input设备驱动均可用此通道上报Input事件。

  • Input配置解析(hcs):负责对Input设备的板级配置及器件私有配置进行解析及管理。

Touchscreen驱动架构

现在以RK3568为例,来看看Touchscreen整个驱动架构

主要相关代码路径:

  • drivers/hdf_core/framework/model/input/driver/touchscreen/

  • vendor/hihope/rk3568/hdf_config/khdf/device_info/device_info.hcs

  • vendor/hihope/rk3568/hdf_config/khdf/input/input_config.hcs

主要代码框架:

下面详细展开

hcs

先看看hcs文件

device_info.hcs

复制代码
input :: host {
    hostName = "input_host";
    priority = 100;
    device_input_manager :: device {
        device0 :: deviceNode {
            policy = 2;
            priority = 100;
            preload = 0;
            permission = 0660;
            moduleName = "HDF_INPUT_MANAGER";
            serviceName = "hdf_input_host";
            deviceMatchAttr = "";
        }
    }
    device_hdf_touch :: device {
        device0 :: deviceNode {
            policy = 2;
            priority = 120;
            preload = 0;
            permission = 0660;
            moduleName = "HDF_TOUCH";
            serviceName = "hdf_input_event1";
            deviceMatchAttr = "touch_device1";
        }
    }

    device_touch_chip :: device {
        device0 :: deviceNode {
            policy = 0;
            priority = 130;
            preload = 0;
            permission = 0660;
            moduleName = "HDF_TOUCH_GT911";
            serviceName = "hdf_touch_gt911_service";
            deviceMatchAttr = "zsj_gt911_5p5";
        }
    }

    ...
}

从上面可以看出,与触摸相关的主要是3个节点,刚好与实现TS驱动模型对应:

  • HDF_INPUT_MANAGER:Input设备管理

  • HDF_TOUCH:触摸屏的公共抽象驱动

  • HDF_TOUCH_GT911:具体的Input器件驱动

后面章节会基于源码详细展开这3块

input_config.hcs

复制代码
root {
    input_config {
        touchConfig {
            touch0 {
                boardConfig {
                    match_attr = "touch_device1";
                    inputAttr {
                        /* 0:touch 1:key 2:keyboard 3:mouse 4:button 5:crown 6:encoder */
                        inputType = 0;
                        solutionX = 720;
                        solutionY = 1280;
                        devName = "main_touch";
                    }
                    busConfig {
                        // 0:i2c 1:spi
                        busType = 0;
                        busNum = 1;
                        clkGpio = 86;
                        dataGpio = 87;
                        i2cClkIomux = [0x114f0048, 0x403];
                        i2cDataIomux = [0x114f004c, 0x403];
                    }
                    pinConfig {
                        rstGpio = 14;
                        intGpio = 13;
                        rstRegCfg = [0x112f0094, 0x400];
                        intRegCfg = [0x112f0098, 0x400];
                    }
                    powerConfig {
                        /* 0:unused 1:ldo 2:gpio 3:pmic */
                        vccType = 2;
                        vccNum = 20;    // gpio20
                        vccValue = 1800;
                        vciType = 1;
                        vciNum = 12;    // ldo12
                        vciValue = 3300;
                    }

                    featureConfig {
                        capacitanceTest = 0;
                        gestureMode = 0;
                        gloverMOde = 0;
                        coverMode = 0;
                        chargerMode = 0;
                        knuckleMode = 0;
                    }
                }
                chipConfig {
                    template touchChip {
                        match_attr = "";
                        chipName = "gt911";
                        vendorName = "zsj";
                        chipInfo = "AAAA11222";  // 4-ProjectName, 2-TP IC, 3-TP Module
                        /* 0:i2c 1:spi*/
                        busType = 0;
                        deviceAddr = 0x5D;
                        /* 0:None 1:Rising 2:Failing 4:High-level 8:Low-level */
                        irqFlag = 2;
                        maxSpeed = 400;
                        chipVersion = 0; //parse Coord TypeA
                        powerSequence {
                            /* [type, status, dir , delay]
                                <type> 0:none 1:vcc-1.8v 2:vci-3.3v 3:reset 4:int
                                <status> 0:off or low  1:on or high  2:no ops
                                <dir> 0:input  1:output  2:no ops
                                <delay> meanings delay xms, 20: delay 20ms
                                */
                            powerOnSeq = [4, 0, 1, 5,
                                            3, 0, 1, 10,
                                            3, 1, 1, 60,
                                            4, 2, 0, 50];
                            suspendSeq = [3, 0, 2, 10];
                            resumeSeq = [3, 1, 2, 10];
                            powerOffSeq = [3, 0, 2, 10,
                                            1, 0, 2, 20];
                        }
                    }

                    chip0 :: touchChip {
                        match_attr = "zsj_gt911_5p5";
                        chipInfo = "ZIDN45100";  // 4-ProjectName, 2-TP IC, 3-TP Module
                        chipVersion = 0; //parse point by TypeA
                    }
                    ...
                }         
                ...
            }
        }
    }
}

device_info中的节点通过 deviceMatchAttrmatch_attr字段匹配配置,

chipConfig配置中主要定义了一些与实际硬件相关的信息:

  • 硬件接口的总线类型,主要有2类:SPI和I2C

  • 设备地址,这里使用的是I2C接口,所以就是I2C从设备的地址

  • 总线最高速率

  • 中断触发方式:边缘触发(上升沿、下降沿),还是电平触发(高低电平)

  • 电源相关的时序:上下电时序,休眠和唤醒时序

  • 自定义的一些info,版本等

驱动源码分析

HDF_TOUCH_GT911驱动

HDF_TOUCH_GT911驱动(touch_gt911.c)初始化(HdfGoodixChipInit)的主要过程:

复制代码
//获取上面hcs中的chipConfig
chipCfg = ChipConfigInstance()  

//前面获取的配置
chipDev->chipCfg = chipCfg;  
//函数操作集,主要包括初始化,休眠唤醒,数据处理,固件更新,能力设置等接口,见后面定义  
chipDev->ops = &g_gt911ChipOps;  
chipDev->chipName = chipCfg->chipName;
chipDev->vendorName = chipCfg->vendorName;
device->priv = (void *)chipDev;
//注册 TouchChipDevice, 具体实现在后面的`HDF_TOUCH`驱动中
RegisterTouchChipDevice(chipDev) 

复制代码
static struct TouchChipOps g_gt911ChipOps = {
    .Init = ChipInit,
    .Detect = ChipDetect,
    .Resume = ChipResume,
    .Suspend = ChipSuspend,
    .DataHandle = ChipDataHandle,
    .UpdateFirmware = UpdateFirmware,
    .SetAbility = SetAbility,
};

RegisterTouchChipDevice()函数的具体实现在后面的 HDF_TOUCH驱动

HDF_TOUCH驱动

HDF_TOUCH驱动(hdf_touch.c)主要有3大块

  • 驱动初始化
    部分伪代码:

    //获取上面hcs中的 boardConfig
    boardCfg = BoardConfigInstance(device);

    // 初始化驱动数据,Setup bus接口(这里主要是i2c)
    ret = TouchDriverInit(touchDriver, boardCfg);

    //增加到驱动列表
    AddTouchDriver(touchDriver);

    //对于RK平台,这里会注册一个PM的监听器,用来处理休眠和唤醒
    #if defined(CONFIG_ARCH_ROCKCHIP)
    HdfTouchDriverRegisterPowerListener(device);
    #endif

  • Bind接口
    通过Bind对外提供IoService接口(Dispatch),主要有以下接口:

    switch (cmd) {
    case GET_DEV_TYPE:
    ret = TouchGetDevType(touchDriver, reply);
    break;
    case SET_PWR_STATUS:
    ret = TouchSetPowerStatus(touchDriver, data);
    break;
    case GET_PWR_STATUS:
    ret = TouchGetPowerStatus(touchDriver, reply);
    break;
    case GET_CHIP_NAME:
    case GET_VENDOR_NAME:
    case GET_CHIP_INFO:
    ret = TouchGetDeviceStrInfo(touchDriver, cmd, reply);
    break;
    case GET_DEV_ATTR:
    ret = TouchGetDeviceAttr(touchDriver, reply);
    break;
    case GET_DEV_ABILITY:
    ret = TouchGetDeviceAbility(touchDriver, reply);
    break;
    case SET_GESTURE_MODE:
    ret = TouchSetGestureMode(touchDriver, data);
    break;
    case RUN_CAPAC_TEST:
    ret = TouchSelfCapacitance(touchDriver, data, reply);
    break;
    case RUN_EXTRA_CMD:
    ret = TouchRunExtraCmd(touchDriver, data);
    break;
    default:
    ret = HDF_SUCCESS;
    HDF_LOGE("%s: cmd unknown, cmd = 0x%x", func, cmd);
    break;
    }

  • RegisterTouchChipDevice()函数实现

部分伪代码:

复制代码
//绑定驱动和设备
ret = DeviceBindDriver(chipDev); 

//主要是上电操作,Detect设备,UpdateFirmware,
//配置使能中断,设置中断处理函数(坐标上报等就在里面)等操作,这里就不展开了
ret = ChipDriverInit(chipDev); 

//注册Input 设备, 具体实现在后面的 HDF_INPUT_MANAGER 驱动中
ret = RegisterInputDevice(inputDev); 

//调用chipdev的SetAbility接口
chipDev->ops->SetAbility(chipDev);   

HDF_INPUT_MANAGER驱动

HDF_INPUT_MANAGER驱动(hdf_input_device_manager.c),这里我们主要看下
RegisterInputDevice()函数的实现

部分伪代码:

复制代码
    //分配设备ID
    ret = AllocDeviceID(inputDev);

    //创建设备节点
    ret = CreateDeviceNode(inputDev);

    //分配相关的buf,主要是pkgBuf和eventBuf
    ret = AllocPackageBuffer(inputDev); 

#ifndef __LITEOS_M__
    //初始化Event的工作队列,
    ret = InitEventWorkQueue(inputDev);

#endif // __LITEOS_M__
    //加入Input设备列表
    AddInputDevice(inputDev); 

为了能让大家更好的学习鸿蒙 (Harmony OS) 开发技术,这边特意整理了《鸿蒙 (Harmony OS)开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙 (Harmony OS)开发学习手册》

入门必看:https://qr21.cn/FV7h05

  1. 应用开发导读(ArkTS)
  2. 应用开发导读(Java)

HarmonyOS 概念:https://qr21.cn/FV7h05

  1. 系统定义
  2. 技术架构
  3. 技术特性
  4. 系统安全

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. 构建第一个JS应用
  4. ......

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ......

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ......
相关推荐
大雷神16 分钟前
HarmonyOS智慧农业管理应用开发教程--高高种地--第26篇:考试系统 - 题库与考试
harmonyos
以太浮标25 分钟前
华为eNSP模拟器综合实验之- NAT策略配置类型全景汇总
服务器·网络·华为
kirk_wang1 小时前
Flutter艺术探索-Flutter三方库鸿蒙适配实战:从原理到实践
flutter·移动开发·flutter教程·移动开发教程
晚霞的不甘2 小时前
Flutter for OpenHarmony 实现高级视差侧滑菜单:融合动效、模糊与交互动画的现代 UI 设计
flutter·ui·前端框架·交互·鸿蒙
JMchen1232 小时前
Android计算摄影实战:多帧合成、HDR+与夜景算法深度剖析
android·经验分享·数码相机·算法·移动开发·android-studio
以太浮标2 小时前
华为eNSP综合实验之- MPLS静态LSP标签交换路径
华为·里氏替换原则
前端菜鸟日常2 小时前
2026 鸿蒙原生开发 (ArkTS) 面试通关指南:精选 50 题
华为·面试·harmonyos
木斯佳3 小时前
HarmonyOS 6实战(源码教学篇)— PinchGesture 图像处理【仿证件照工具实现手势交互的canvas裁剪框】)
图像处理·交互·harmonyos
听麟3 小时前
HarmonyOS 6.0+ PC端手绘板协同创作工具开发实战:压感交互与跨端流转落地
华为·交互·harmonyos
摘星编程3 小时前
React Native鸿蒙:Tree节点选择状态
react native·react.js·harmonyos