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. ……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/259466.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第四十一天|198.打家劫舍 ,213.打家劫舍II ,337.打家劫舍III

198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#…

建行驻江门市分行纪检组党支部开展“以廉养人,以案警人”清廉文化现场教学活动

近日&#xff0c;建行驻江门市分行纪检组党支部联合建设支行党支部到江门市党群服务中心开展“以廉养人&#xff0c;以案警人”清廉文化现场教学活动。 名言语句亮初心。一楼展馆入口处竖立着“拔烂树、治病树、正歪树”“以猛药去疴刮骨疗毒的勇气反腐”“理想信念是共产党人的…

配置https环境

为什么要配置https环境 在使用 HTML5 的 API 时&#xff0c;很多 API 只能在 https 保证安全的情况下才能开启。这就要求我们在本地开发环境也能够配置 https&#xff0c;否则你需要每次部署到配有 https 的测试环境中才能看到预览效果&#xff0c;这对开发的敏捷度造成了极大…

机器学习--线性回归

目录 监督学习算法 线性回归 损失函数 梯度下降 目标函数 更新参数 批量梯度下降 随机梯度下降 小批量梯度下降法 数据预处理 特征标准化 正弦函数特征 多项式特征的函数 数据预处理步骤 线性回归代码实现 初始化步骤 实现梯度下降优化模块 损失与预测模块 …

【C++】对象特性:无参有参构造函数,拷贝构造函数,析构函数

目录 对象的初始化和清理1.1 构造函数和析构函数1.2 构造函数的分类及调用1.3 拷贝构造函数调用时机1.4 构造函数调用规则1.5 深拷贝与浅拷贝 对象的初始化和清理 生活中我们买的电子产品都基本会有出厂设置&#xff0c;在某一天我们不用时候也会删除一些自己信息数据保证安全。…

智慧食堂餐卡充值文件生成器使用说明

智慧食堂餐卡充值文件生成器 下载地址&#xff1a; https://download.csdn.net/download/boysoft2002/88646277 或者百度网盘下载&#xff1a; https://pan.baidu.com/s/16cxOa5aq0CU0T0xOr2A7-A 操作使用说明 一、文件结构 下载.rar文件后&#xff0c;释放到非系统盘符的…

数据库故障Waiting for table metadata lock

场景&#xff1a;早上来发现一个程序&#xff0c;链接mysql数据库有点问题&#xff0c;随后排查&#xff0c;因为容器在k8s里面。所以尝试重启了pod没有效果 一、重启pod: 这里是几种在Kubernetes中重启Pod的方法: 删除Pod,利用Deployment重建 kubectl delete pod mypodDepl…

【小呆的力学笔记】弹塑性力学的初步认知二:应力分析(1)

文章目录 1.1 一点的应力状态1.2 一点主应力状态1.3 应力偏张量、球张量、应力不变量 1.1 一点的应力状态 物体在受到外力或者自身不均匀的温度场等作用时&#xff0c;在其内部会产生内力&#xff0c;物体的内力与方向和截面都有关系。假设有一个受到外力作用的变形体&#xf…

Java经典面试题:冒泡算法的使用

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍Java经典面试题&#xff1a;冒泡算法的使用以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问题…

nodejs连接mongodb报错SyntaxError: Unexpected token .

nodejs连接mongodb报错SyntaxError: Unexpected token 如下图 经过排查&#xff0c;原因是npm默认安装的mongodb插件是最新版6.3.0 &#xff0c;而mongodb数据库版本是4.0.0 &#xff0c;两者版本不同导致nodejs报错。 解决方法是npm卸载新版本的mongodb插件&#xff0c;再安…

comfyUI + animateDiff video2video AI视频生成工作流介绍及实例

原文&#xff1a;comfyUI animateDiff video2video AI视频生成工作流介绍及实例 - 知乎 目录 收起 前言 准备工作环境 comfyUI相关及介绍 comfyUI安装 生成第一个视频 进一步生成更多视频 注意事项 保存为不同的格式 视频宽高设置 种子值设置 提示词与负向提示词…

uml用例图是什么?有哪些要素?

UML用例图是什么&#xff1f; UML用例图&#xff08;Unified Modeling Language Use Case Diagram&#xff09;是一种用于描述系统功能和用户之间交互的图形化建模工具。它是UML的一部分&#xff0c;主要用于识别和表示系统中的各个用例&#xff08;用户需求或功能点&#…

EMNLP 2023 亮点回顾:大模型时代下的 NLP 研究

作为自然语言处理&#xff08;NLP&#xff09;领域的顶级盛会&#xff0c;EMNLP 每年都成为全球研究者的关注焦点。2023 年的会议在新加坡举行&#xff0c;聚集了数千名来自世界各地的专家学者&#xff0c;也是自疫情解禁以来&#xff0c;中国学者参会最多的一次。巧的是&#…

阿赵UE学习笔记——2、新建项目和项目设置

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。继续来学习虚幻引擎的使用。这次介绍一下新建项目和项目设置。 一、新建项目 通过桌面快捷方式&#xff0c;或者EPIC Games Loader&#xff0c;启动虚幻引擎。 启动完成后&#xff0c;会打开项目管理的界面&#xff0c;可以看…

运算放大电路的输入偏置电流和输入失调电流

一般运放的datasheet中会列出众多的运放参数&#xff0c;有些易于理解&#xff0c;我们常关注&#xff0c;有些可能会被忽略了。在接下来的一些主题里&#xff0c;将对每一个参数进行详细的说明和分析。力求在原理和对应用的影响上把运放参数阐述清楚。由于本人的水平有限&…

软件测试中如何测试算法?

广义的算法是指解决问题的方案&#xff0c;小到求解数学题&#xff0c;大到制定商业策略&#xff0c;都可以叫做算法。而我们今天讨论的软件测试中的算法&#xff0c;对应的英文单词为 Algorithm&#xff0c;专指计算机处理复杂问题的程序或指令。 随着最近几年人工智能等领域…

【C语言初阶】数组

目录 一、一维数组的创建和初始化 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 二、二维数组的创建和初始化 2.1 二维数组的创建 2.2 二维数组的初始化 2.3 二维数组的使用 2.4 二维数组在内存中的存储 三、数组越界 四、数组作…

每日一博 - Protobuf vs. Protostuff:性能、易用性和适用场景分析

文章目录 历史区别联系性能差异最佳实践场景分析小结 历史 对于Protostuff和Protobuf的关系&#xff0c;需要了解它们的起源和发展。 Protobuf&#xff08;Protocol Buffers&#xff09;是由Google开发的一种数据序列化格式&#xff0c;用于结构化数据的存储和交换。它最初是…

【✅Java中有了基本类型为什么还需要包装类?】

✅Java中有了基本类型为什么还需要包装类&#xff1f; ✅Java中有了基本类型为什么还需要包装类✅Java的8中基本数据类型 ✅知识拓展✅基本类型和包装类型的区别✅如何理解自动拆装箱&#xff1f;✅拆箱与装箱✅自动拆装箱✅自动拆装箱原理 ✅哪些地方会自动拆装箱&#xff1f;…

C++20形式的utf-8字符串转宽字符串,不依赖编译器编码形式

默认的char[]编码都是要看编译器编译选项的&#xff0c;你选了ANSI那它就是ANSI&#xff0c;你选了UTF8那它就是UTF8. 【注意&#xff1a;经典DevC只支持ANSI编码&#xff08;痛苦&#xff09;&#xff1b;上图是小熊猫DevC&#xff0c;则有这个选项】 这一点对我的代码造成了…