网站与与云的关系,wordpress piklist,任何做网站,宜宾网站建设08kejiHDF input 子系统OpenHarmony-4.0-Release
1.Input 概述 输入设备是用户与计算机系统进行人机交互的主要装置之一#xff0c;是用户与计算机或者其他设备通信的桥梁。常见的输入设备有键盘、鼠标、游戏杆、触摸屏等。本文档将介绍基于 HDF_Input 模型的触摸屏器件 IC 为 GT91…HDF input 子系统OpenHarmony-4.0-Release
1.Input 概述 输入设备是用户与计算机系统进行人机交互的主要装置之一是用户与计算机或者其他设备通信的桥梁。常见的输入设备有键盘、鼠标、游戏杆、触摸屏等。本文档将介绍基于 HDF_Input 模型的触摸屏器件 IC 为 GT911 驱动开发。 在HDFHardware Driver Foundation驱动管理框架的基础上Input驱动模型通过调用OSAL接口层和Platform接口层提供的基础接口进行开发涉及的接口包括bus通信接口、操作系统原生接口memory、lock、thread、timer等。由于OSAL接口和Platform接口屏蔽了芯片平台的差异所以基于Input驱动模型实现的Touchscreen驱动可以进行跨平台、跨OS迁移从而实现驱动的一次开发、多端部署。 Touchscreen驱动用于驱动触摸屏使其正常工作该驱动主要完成如下工作对触摸屏驱动IC进行上电、配置硬件管脚并初始化其状态、注册中断、配置通信接口I2C或SPI、设定Input相关配置、下载及更新固件等操作。
1.1.运作机制 OpenHarmony 内核子系统多内核与驱动子系统统一的驱动框架是松耦合的关系仅通过一个OSALOperating System Abstraction Layer操作系统抽象层进行交互。OSAL只为驱动框架提供内核部分关键能力的抽象接口而隐藏了接口在不同内核中的实现细节。驱动框架通过OSAL来适配不同的内核而具体的设备则完全基于驱动框架提供的能力来实现驱动程序并通过HDIHardware Driver Interface硬件驱动接口对上层提供驱动服务设备驱动完全不需要知道也不会知道自己运行在什么样的内核之上。 Input驱动模型基于HDF驱动框架、Platform接口、OSAL接口进行开发向上对接规范化的驱动接口HDIHardware Device Interface层通过Input-HDI层对外提供硬件能力即上层Input Service可以通过HDI接口层获取相应的驱动能力进而操控Touchscreen等输入设备。基于HDF驱动框架的Input驱动模型如下图所示 Input驱动模型核心部分由设备管理层、公共驱动层、器件驱动层组成。器件产生的数据借助平台数据通道能力从内核传递到用户态驱动模型通过配置文件适配不同器件及硬件平台提高开发者对器件驱动的开发效率。如下为模型各部分的说明
Input设备管理为各类输入设备驱动提供Input设备的注册、注销接口同时对Input设备列表进行统一管理。Input平台驱动指各类Input设备的公共抽象驱动例如触摸屏的公共驱动该部分主要负责对板级硬件进行初始化、硬件中断处理、向manager注册Input设备等。Input器件驱动指各器件厂家的差异化驱动开发者可以通过适配平台驱动预留的差异化接口进行器件驱动开发实现器件驱动开发量最小化。Input数据通道提供一套通用的数据上报通道各类别的Input设备驱动均可用此通道上报Input事件。Input配置解析负责对Input设备的板级配置及器件私有配置进行解析及管理。
2.Touchscreen 设备
2.1.硬件接口 Touch 设备与主机通讯一般采用 I2C 总线完成数据的交互为了提高触屏数据的实时性触屏 IC 都会提供中断支持。当有触屏事件发生时会触发主机中断管脚完成一次中断响应。中断处理函数中主机通过 I2C 总线读取触屏 IC 寄存器完成一次数据采集。 Touchscreen器件的硬件接口相对简单根据PIN脚的属性可以简单分为如下三类 电源接口 IO控制接口 通信接口
2.2.软件接口 Input HDF驱动提供给系统服务Input Service调用的HDI驱动能力接口按照业务范围可以分为三大模块
Input设备管理模块Input数据上报模块Input业务控制模块
2.3.开发步骤 Input驱动模型的完整加载流程可以分为六步 设备描述配置由开发者参考已有模板进行设备描述配置配置的信息包括驱动加载顺序、板级硬件信息、器件私有数据信息等。 加载Input设备管理驱动由HDF驱动加载Input设备管理驱动完成设备manager的创建并对其初始化。 加载平台驱动平台驱动由HDF框架加载主要完成板级配置解析及硬件初始化并提供器件注册接口。 加载器件驱动器件驱动也由HDF框架加载完成器件设备的实例化包括器件私有配置解析和平台预留的差异化接口适配。 器件设备向平台驱动注册将实例化的器件设备注册到平台驱动实现设备和驱动的绑定并完成中断注册、上下电等器件初始化工作。 Input设备注册在器件初始化完成后实例化Input设备并将其注册到Input manager进行管理。 根据Input驱动模型的加载流程可知Touchscreen器件驱动的开发过程主要包含以下三个步骤 设备描述配置目前Input驱动基于HDF驱动框架编写驱动的加载启动由HDF驱动管理框架统一处理。首先需要在对应的配置文件中将驱动信息注册进去如是否加载、加载优先级此后HDF驱动框架会逐一启动注册过的驱动模块。 板级配置及Touchscreen器件私有配置配置对应的IO管脚功能例如对单板上为Touchscreen设计预留的I2C Pin脚需设置对应的寄存器使其选择I2C的通信功能。 实现器件差异化适配接口根据硬件单板设计的通信接口使用Platform接口层提供的管脚操作接口配置对应的复位管脚、中断管脚以及电源操作。
3.HDF Input 框架 以RK3568为例Touchscreen驱动主要相关代码
drivers/hdf_core/framework/model/input/driver/touchscreen/vendor/hihope/rk3568/hdf_config/khdf/device_info/device_info.hcsvendor/hihope/rk3568/hdf_config/khdf/input/input_config.hcs 主要代码框架 3.1.Input 内核配置
KConfig\Makefile
drivers_hdf_core\adapter\khdf\linux\model\input\Kconfig
config DRIVERS_HDF_INPUTbool Enable HDF input driverdefault ndepends on DRIVERS_HDFhelpAnswer Y to enable HDF input driver.config DRIVERS_HDF_TP_5P5_GT911bool Enable HDF tp 5P5 GT911 driverdefault ndepends on DRIVERS_HDF_INPUThelpAnswer Y to enable HDF TP 5P5 GT911 driver....drivers_hdf_core\adapter\khdf\linux\model\input\Makefile
INPUT_ROOT_DIR ../../../../../framework/model/input/driverobj-$(CONFIG_DRIVERS_HDF_INPUT) \$(INPUT_ROOT_DIR)/input_bus_ops/input_i2c_ops.o \$(INPUT_ROOT_DIR)/hdf_input_device_manager.o \$(INPUT_ROOT_DIR)/input_config_parser.o \$(INPUT_ROOT_DIR)/event_hub.o \$(INPUT_ROOT_DIR)/hdf_touch.o \$(INPUT_ROOT_DIR)/hdf_key.o \$(INPUT_ROOT_DIR)/hdf_hid_adapter.oobj-$(CONFIG_DRIVERS_HDF_TP_5P5_GT911) \$(INPUT_ROOT_DIR)/touchscreen/touch_gt911.o
obj-$(CONFIG_ARCH_NXP_TOUCH) \$(INPUT_ROOT_DIR)/touchscreen/touch_ft5x06.o
obj-$(CONFIG_DRIVERS_HDF_TP_2P35_FT6236) \$(INPUT_ROOT_DIR)/touchscreen/touch_ft6336.o
obj-$(CONFIG_DRIVERS_HDF_INPUT_INFRARED) \$(INPUT_ROOT_DIR)/hdf_infrared.o
obj-$(CONFIG_DRIVERS_HDF_TP_5P43_FT5406) \$(INPUT_ROOT_DIR)/touchscreen/touch_ft5406.o3.2.Input 设备配置
3.2.1.配置设备描述信息vendor/hihope/rk3568/hdf_config/khdf/device_info/device_info.hcs 驱动注册到 HDF 框架所需要的设备驱动描述信息如驱动是否加载以及加载次序等。device_info.hcs 中的信息主要提供给 HDF 框架使用包含了 Input 模型各层驱动注册到 HDF 框架所必需的信息开发者无特殊场景需求无需改动。各驱动层私有配置信息通过**“deviceMatchAttr”字段与 input_config.hcs 中的“match_attr”**相关内容进行匹配。
input :: host {hostName input_host;priority 100;device_input_manager :: device { // Input管理层设备描述信息device0 :: deviceNode {policy 2; // 向内核用户态均发布服务priority 100; // 加载优先级在input模块内manager模块优先级应为最高preload 0; // 加载该驱动0加载1不加载permission 0660;moduleName HDF_INPUT_MANAGER; // 与驱动入口moduleName匹配serviceName hdf_input_host; // HDF框架生成的节点名deviceMatchAttr ; // manager目前不需要私有配置因此为空}}device_hdf_touch :: device { // Input公共驱动层设备描述信息device0 :: deviceNode {policy 2; priority 120;preload 0;permission 0660;moduleName HDF_TOUCH;serviceName hdf_input_event1;deviceMatchAttr touch_device1; // 与 “match_attr”字段一致}}//适配gt911_5p5触摸屏驱动描述信息device_touch_chip :: device { // Input器件驱动层信息device0 :: deviceNode {policy 0; // 向内核用户态均不发布服务priority 130; //驱动启动优先级0-200值越大优先级越低preload 0; //驱动按需加载字段,0默认加载1当系统支持快速启动的时候则在系统完成之后再加载这一类驱动 2默认不加载支持后续动态加载permission 0660; //驱动创建设备节点权限moduleName HDF_TOUCH_GT911; //驱动名称该字段的值必须和驱动入口结构的moduleName值一致serviceName hdf_touch_gt911_service;//驱动对外发布服务的名称必须唯一deviceMatchAttr zsj_gt911_5p5; //驱动私有数据匹配的关键字必须和驱动私有数据配置表中的match_attr值相等。}}...}从上面可以看出与触摸相关的主要是3个节点刚好与实现TS驱动模型对应
HDF_INPUT_MANAGERInput设备管理HDF_TOUCH触摸屏的公共抽象驱动HDF_TOUCH_GT911具体的Input器件驱动 该配置文件中需要重点关注的字段有 “priority”决定驱动加载顺序 “preload”决定驱动是否加载 “moduleName ”需要与驱动注册入口处的“moduleName ”字段保持一致 “serviceName ”HDF 框架依据该字段创建节点名 “deviceMatchAttr ”需要与私有配置信息中的“match_attr”字段保持一致。 通过配置设备描述信息使得 HDF 框架通过 moduleName 与注册至驱动入口的代码相匹配保证了驱动的正常加载通过 priority 字段保证了各驱动的加载顺序。
3.2.2.板级配置及器件私有配置vendor/hihope/rk3568/hdf_config/khdf/input/input_config.hcs 如果驱动配置有deviceMatchAttr参数需添加一个私有配置文件。器件私有信息包括上下电时序等平台硬件信息包括器件连接主板的 GPIO 端口信息等。 input_config.hcs 中的信息由驱动代码进行读取解析主要由公共驱动层的私有配置信息及器件驱动层的私有配置信息组成。文件中的配置包含板级硬件信息及器件私有配置信息实际业务开发时可根据具体需求增删及修改对应内容。
root {input_config {touchConfig {touch0 {//公共驱动HDF_TOUCH 私有配置信息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;}// Hi3516DV300-Runhe gt911--5p5 4p0busConfig {// 0:i2c 1:spibusType 0;busNum 1;clkGpio 86;dataGpio 87;i2cClkIomux [0x114f0048, 0x403]; // i2c_clk对应pin的寄存器配置i2cDataIomux [0x114f004c, 0x403]; // i2c_data对应pin的寄存器配置}pinConfig {rstGpio 14; // 复位管脚连接主机芯片的14号管脚intGpio 13; // 中断管脚连接主机芯片的13号管脚rstRegCfg [0x112f0094, 0x400]; // reset对应pin的寄存器配置intRegCfg [0x112f0098, 0x400]; // interrupt对应pin的寄存器配置}powerConfig {/* 0:unused 1:ldo 2:gpio 3:pmic */vccType 2;vccNum 20; // gpio20vccValue 1800;vciType 1;vciNum 12; // ldo12vciValue 3300;}featureConfig {capacitanceTest 0; // 容值测试gestureMode 0; // 手势模式gloverMode 0; // 手套模式coverMode 0; // 皮套模式chargerMode 0; // 充电模式knuckleMode 0; // 指关节模式}}chipConfig { // 器件私有信息配置template touchChip { // 模板match_attr ;chipName gt911; // 触摸屏IC型号vendorName zsj; // 供应商chipInfo AAAA11222; /*1~4字符代表产品名5~6字符代表IC型号7~9字符代表模型型号*/busType 0; // 0代表I2C1代表SPIdeviceAddr 0x5D; // 器件IC通信地址irqFlag 2; /* 1代表上升沿触发2代表下降沿触发4代表高电平触发8代表低电平触发*/maxSpeed 400; // 最大通信速率为400HzchipVersion 0; // 触摸屏IC版本号powerSequence {/* [type, status, dir , delay]type 0:none 1:vcc-1.8v 2:vci-3.3v 3:reset 4:intstatus 0:off or low 1:on or high 2:no opsdir 0:input 1:output 2:no opsdelay 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]; // 复位管脚无操作且进行拉低延时10msresumeSeq [3, 1, 2, 10]; // 复位管脚无操作且进行拉高延时10mspowerOffSeq [3, 0, 2, 10, // 复位管脚无操作且进行拉低延时10ms1, 0, 2, 20]; // 电源正极管脚无操作且进行拉低延时20ms}}chip0 :: touchChip {/* 与设备描述配置信息中器件私有配置信息的“match_attr”字段保持一致 */match_attr zsj_gt911_5p5;chipInfo ZIDN45100; // 4-ProjectName, 2-TP IC, 3-TP ModulechipVersion 0; //parse point by TypeA}chip1 :: touchChip {match_attr zsj_gt911_4p0;chipInfo ZIDN45101;chipVersion 1; //parse point by TypeB}}}}}
}示例中“touchConfig”包含了“touch0”touch0包含了“boardConfig”与“chipConfig”“boardConfig”字段包含了 Hi3516DV300 板级硬件信息“chipConfig”包含了触摸屏器件的私有信息如果需要替换触摸屏器件重新配置“chipConfig”对应的字段信息即可。同时产品可以配置多款触摸屏示例中用“touch0”代表了套件中默认的触摸屏的硬件接口以及器件的配置信息如产品需要配置副屏可在与“touch0”并列的位置配置“touch1”的信息。
3.2.3.将配置文件添加到板级配置 将上面两个配置文件添加到板级配置入口文件hdf.hcs中。
./vendor/hihope/rk3568/hdf_config/khdf/hdf.hcs
#include input/input_config.hcs
#include device_info/device_info.hcs3.3.驱动实现 对于touch 类型的设备公共驱动框架已实现。 drivers_hdf_core\framework\model\input\driver\hdf_touch.c 适配gt911触摸屏需要完成器件层驱动初始化、释放资源、注册驱动至HDF框架及触摸屏器件差异化接口适配。 drivers_hdf_core\framework\model\input\driver\touchscreen\touch_gt911.c
3.3.1.GT911器件驱动
1).注册到HDF框架(注意g_touchGoodixChipEntry没有实现Bind接口)
drivers_hdf_core\framework\model\input\driver\touchscreen\touch_gt911.c:
//驱动注册到HDF框架函数
struct HdfDriverEntry g_touchGoodixChipEntry {.moduleVersion 1,.moduleName HDF_TOUCH_GT911, //驱动名称该字段的值必须和驱动信息配置文件中moduleName的值一致.Init HdfGoodixChipInit,.Release HdfGoodixChipRelease,
};HDF_INIT(g_touchGoodixChipEntry);2).器件层驱动初始化
//函数操作集主要包括初始化休眠唤醒数据处理固件更新能力设置等接口
static struct TouchChipOps g_gt911ChipOps {.Init ChipInit,.Detect ChipDetect,.Resume ChipResume,.Suspend ChipSuspend,.DataHandle ChipDataHandle,.UpdateFirmware UpdateFirmware,.SetAbility SetAbility,
};static int32_t HdfGoodixChipInit(struct HdfDeviceObject *device)
{TouchChipCfg *chipCfg NULL;ChipDevice *chipDev NULL;//器件配置结构体内存申请、配置信息解析及挂载 chipCfg ChipConfigInstance(device);//器件实例化 chipDev ChipDeviceInstance();chipDev-chipCfg chipCfg;chipDev-ops g_gt911ChipOps; //回调函数chipDev-chipName chipCfg-chipName;chipDev-vendorName chipCfg-vendorName;device-priv (void *)chipDev;//注册器件驱动至平台驱动if (RegisterTouchChipDevice(chipDev) ! HDF_SUCCESS) {goto EXIT1;}HDF_LOGI(%s: exit succ, chipName %s, __func__, chipCfg-chipName);return HDF_SUCCESS;
}RegisterTouchChipDevice()函数主要负责
DeviceBindDriver绑定设备与驱动从而通过InputDeviceInstance函数创建inputDev。ChipDriverInit 主要是上电操作Detect设备UpdateFirmware配置使能中断设置中断处理函数(坐标上报等就在里面)等操作。RegisterInputDevice将InputDev设备注册至input驱动管理层 hdf_input_device_manager.c。chipDev-ops-SetAbility调用chipdev的SetAbility接口。
3).器件层驱动数据上报 正常流程需要实现HdfGoodixChipBind 函数用于触摸屏和外部进行数据通信但是公共驱动层HDF_TOUCH已经用HdfTouchDriverBind函数实现器件不用重新实现可以直接使用。
3.3.2. HDF Input 公共驱动层HDF_TOUCH
初始化及注册驱动至HDF框架
drivers_hdf_core\framework\model\input\driver\hdf_touch.c
struct HdfDriverEntry g_hdfTouchEntry {.moduleVersion 1,.moduleName HDF_TOUCH,.Bind HdfTouchDriverBind, //驱动对外提供的服务能力将相关的务接口绑定到HDF框架.Init HdfTouchDriverProbe, .Release HdfTouchDriverRelease,
};HDF_INIT(g_hdfTouchEntry);.Bind HdfTouchDriverBind 通过Bind对外提供IoService接口(Dispatch)主要有以下接口
static int32_t HdfTouchDriverBind(struct HdfDeviceObject *device)
{static struct IDeviceIoService touchService {.Dispatch HdfTouchDispatch,};device-service touchService;return HDF_SUCCESS;
}static int32_t HdfTouchDispatch(struct HdfDeviceIoClient *client, int32_t cmd,struct HdfSBuf *data, struct HdfSBuf *reply)
{int32_t ret;TouchDriver *touchDriver NULL;...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;...default:ret HDF_SUCCESS;HDF_LOGE(%s: cmd unknown, cmd 0x%x, __func__, cmd);break;}return ret;
}Init HdfTouchDriverProbe
static int32_t HdfTouchDriverProbe(struct HdfDeviceObject *device)
{int32_t ret;TouchBoardCfg *boardCfg NULL;TouchDriver *touchDriver NULL;/* 板级信息结构体内存申请及hcs配置信息解析 */boardCfg BoardConfigInstance(device);/* 公共驱动结构体内存申请 */touchDriver TouchDriverInstance();// 初始化驱动数据Setup bus接口这里主要是i2cret TouchDriverInit(touchDriver, boardCfg);if (ret HDF_SUCCESS) {touchDriver-hdfTouchDev device;touchDriver-boardCfg boardCfg;/* 添加驱动至公共驱动层驱动管理链表当设备与驱动进行绑定时使用该链表进行查询 */AddTouchDriver(touchDriver);device-priv (void *)touchDriver;//对于RK平台这里会注册一个PM的监听器用来处理休眠和唤醒#if defined(CONFIG_ARCH_ROCKCHIP)HdfTouchDriverRegisterPowerListener(device); #endifreturn HDF_SUCCESS;}
}static TouchDriver *g_touchDriverList[MAX_TOUCH_DEVICE];
static void AddTouchDriver(TouchDriver *driver)
{int32_t i;for (i 0; i MAX_TOUCH_DEVICE; i) {if (g_touchDriverList[i] NULL) {g_touchDriverList[i] driver;return;}}
}3.3.3. HDF Input 管理驱动层HDF_INPUT_MANAGER
初始化及注册驱动至HDF框架
drivers_hdf_core\framework\model\input\driver\hdf_input_device_manager.c
struct HdfDriverEntry g_hdfInputEntry {.moduleVersion 1,.moduleName HDF_INPUT_MANAGER,.Bind HdfInputManagerBind,.Init HdfInputManagerInit,.Release HdfInputManagerRelease,
};HDF_INIT(g_hdfInputEntry);RegisterInputDevice
int32_t RegisterInputDevice(InputDevice *inputDev)
{int32_t ret;/* 申请ID该ID对于不同input设备唯一 */ret AllocDeviceID(inputDev);/* 该函数包含了对hid类设备的特殊处理对于触摸屏驱动该函数无实质操作 */ret CreateDeviceNode(inputDev);/* 内核态数据传送至用户态需使用IOService能力需要申请buffer */ret AllocPackageBuffer(inputDev);#ifndef __LITEOS_M__ret InitEventWorkQueue(inputDev);if (ret ! HDF_SUCCESS) {goto EXIT1;}
#endif // __LITEOS_M__/* 将input设备添加进设备全局管理链表 */AddInputDevice(inputDev);return ret;
}4.Input模块HDI接口层框架 OpenHarmony 内核子系统多内核与驱动子系统统一的驱动框架是松耦合的关系仅通过一个OSALOperating System Abstraction Layer操作系统抽象层进行交互。OSAL只为驱动框架提供内核部分关键能力的抽象接口而隐藏了接口在不同内核中的实现细节。驱动框架通过OSAL来适配不同的内核而具体的设备则完全基于驱动框架提供的能力来实现驱动程序并通过HDIHardware Driver Interface硬件驱动接口对上层提供驱动服务设备驱动完全不需要知道也不会知道自己运行在什么样的内核之上。 Input模块HDIHardware Driver Interface接口定义及其实现对上层输入服务提供操作input设备的驱动能力接口HDI接口主要包括如下三大类 InputManager管理输入设备包括输入设备的打开、关闭、设备列表信息获取等 InputReporter负责输入事件的上报包括注册、注销数据上报回调函数等 InputController提供input设备的业务控制接口包括获取器件信息及设备类型、设置电源状态等 4.1.代码框架
drivers/peripheral/目录下是部署在OpenHarmony用户空间的各种外围设备驱动相关的HDI、HAL、驱动模型及测试用例等的实现代码和编译配置。drivers/interface/目录下是用于管理各驱动模块的HDI接口定义这些接口定义使用IDL语言描述并以.idl文件形式保存。 基于HDF框架编写用户态程序和驱动交互。
drivers_peripheral 仓下源代码目录结构如下所示
/drivers/peripheral/input
├── hal # input模块的hal层代码
│ └── include # input模块hal层内部的头文件
│ └── src # input模块hal层代码的具体实现
├── interfaces # input模块对上层服务提供的驱动能力接口
│ └── include # input模块对外提供的接口定义
├── test # input模块的测试代码
│ └── unittest # input模块的单元测试代码drivers_peripheral仓核心功能是提供Input驱动能力接口供上层输入系统服务调用提供的驱动能力接口统一归属为HDI接口层。
4.2.接口说明 Input驱动提供给系统服务Input Service可直接调用的驱动能力接口按照属性分类三类input设备管理模块、input数据上报模块、input业务控制模块例如提供输入设备打开及关闭接口、注册设备监听的回调接口、设备信息查询接口、电源状态控制接口等。提供的部分接口所示
refer to
https://zhuanlan.zhihu.com/p/673299244https://ost.51cto.com/posts/8176https://laval.csdn.net/65b796d92c13685765def369.htmlhttps://www.elecfans.com/d/2044123.htmlhttps://gitee.com/openharmony/drivers_peripheral/blob/master/input/README_zh.mdhttps://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/driver-peripherals-touch-des.md