OpenHarmony-3.HDF input子系统(5)
- HDF input 子系统
- OpenHarmony-4.0-Release
1.Input 概述
输入设备是用户与计算机系统进行人机交互的主要装置之一,是用户与计算机或者其他设备通信的桥梁。常见的输入设备有键盘、鼠标、游戏杆、触摸屏等。本文档将介绍基于 HDF_Input 模型的触摸屏器件 IC 为 GT911 驱动开发。
在HDF(Hardware Driver Foundation)驱动管理框架的基础上,Input驱动模型通过调用OSAL接口层和Platform接口层提供的基础接口进行开发,涉及的接口包括bus通信接口、操作系统原生接口(memory、lock、thread、timer等)。由于OSAL接口和Platform接口屏蔽了芯片平台的差异,所以基于Input驱动模型实现的Touchscreen驱动可以进行跨平台、跨OS迁移,从而实现驱动的一次开发、多端部署。
Touchscreen驱动用于驱动触摸屏使其正常工作,该驱动主要完成如下工作:对触摸屏驱动IC进行上电、配置硬件管脚并初始化其状态、注册中断、配置通信接口(I2C或SPI)、设定Input相关配置、下载及更新固件等操作。
1.1.运作机制
OpenHarmony 内核子系统(多内核)与驱动子系统(统一的驱动框架)是松耦合的关系,仅通过一个OSAL(Operating System Abstraction Layer,操作系统抽象层)进行交互。OSAL只为驱动框架提供内核部分关键能力的抽象接口,而隐藏了接口在不同内核中的实现细节。驱动框架通过OSAL来适配不同的内核,而具体的设备则完全基于驱动框架提供的能力来实现驱动程序并通过HDI(Hardware Driver Interface,硬件驱动接口)对上层提供驱动服务,设备驱动完全不需要知道(也不会知道)自己运行在什么样的内核之上。
Input驱动模型基于HDF驱动框架、Platform接口、OSAL接口进行开发,向上对接规范化的驱动接口HDI(Hardware 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.hcs
- vendor/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 driver"default ndepends on DRIVERS_HDFhelpAnswer Y to enable HDF input driver.config DRIVERS_HDF_TP_5P5_GT911bool "Enable HDF tp 5P5 GT911 driver"default 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.o
3.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_MANAGER:Input设备管理
- 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代表I2C,1代表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: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]; // 复位管脚无操作,且进行拉低,延时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.hcs"
3.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接口(这里主要是i2c)ret = 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 内核子系统(多内核)与驱动子系统(统一的驱动框架)是松耦合的关系,仅通过一个OSAL(Operating System Abstraction Layer,操作系统抽象层)进行交互。OSAL只为驱动框架提供内核部分关键能力的抽象接口,而隐藏了接口在不同内核中的实现细节。驱动框架通过OSAL来适配不同的内核,而具体的设备则完全基于驱动框架提供的能力来实现驱动程序并通过HDI(Hardware Driver Interface,硬件驱动接口)对上层提供驱动服务,设备驱动完全不需要知道(也不会知道)自己运行在什么样的内核之上。
Input模块HDI(Hardware 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/673299244
- https://ost.51cto.com/posts/8176
- https://laval.csdn.net/65b796d92c13685765def369.html
- https://www.elecfans.com/d/2044123.html
- https://gitee.com/openharmony/drivers_peripheral/blob/master/input/README_zh.md
- https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/driver-peripherals-touch-des.md
相关文章:

OpenHarmony-3.HDF input子系统(5)
HDF input 子系统OpenHarmony-4.0-Release 1.Input 概述 输入设备是用户与计算机系统进行人机交互的主要装置之一,是用户与计算机或者其他设备通信的桥梁。常见的输入设备有键盘、鼠标、游戏杆、触摸屏等。本文档将介绍基于 HDF_Input 模型的触摸屏器件 IC 为 GT91…...

RabbitMQ 消息持久化/镜像队列/lazy对时延影响
测试背景: 不同条件下RabbitMQ不同队列类型的生产时延测试: 测试环境: 机型:rabbimtq.2u4g.cluster 背景流量:1000 TPS 测试条件: 消息大小 4k,消息条数为1000条,时延取值为平均…...

【深度学习】深刻理解Swin Transformer
Swin Transformer 是一种基于 Transformer 的视觉模型,由 Microsoft 研究团队提出,旨在解决传统 Transformer 模型在计算机视觉任务中的高计算复杂度问题。其全称是 Shifted Window Transformer,通过引入分层架构和滑动窗口机制,S…...

[2015~2024]SmartMediaKit音视频直播技术演进之路
技术背景 2015年,因应急指挥项目需求,我们实现了RTMP推送音视频采集推送(采集摄像头和麦克风数据)模块,在我们做好了RTMP推送模块后,苦于没有一个满足我们毫秒级延迟诉求的RTMP播放器,于是第一…...

redis 使用Lettuce 当redis挂掉重启之后 网络是怎么重新连接
Lettuce是一个高性能的Java Redis客户端,支持同步、异步和反应式编程模式 Lettuce的核心功能包括: 高性能:通过使用Netty作为底层网络通信框架,实现了非阻塞IO,提高了性能。丰富的API:提供了丰富…...

【IntelliJ IDEA 集成工具】TalkX - AI编程助手
前言 在数字化时代,技术的迅猛发展给软件开发者带来了更多的挑战和机遇。为了提高技术开发群体在繁多项目中的编码效率和质量,他们需要一个强大而专业的工具来辅助开发过程,而正是为了满足这一需求,TalkX 应运而生。 一、概述 1…...

二叉搜索树Ⅲ【东北大学oj数据结构8-3】C++
二叉搜索树 III B:在二叉搜索树II中加入delete指令,创建程序对二叉搜索树T执行如下指令。 插入 k:将key k 插入到 T 中。 find k:报告T中是否存在key k。 delete k:删除key为 k 的节点。 打印:使用中序树遍…...

【面试笔记】CPU 缓存机制
CPU 缓存机制 1. CPU Cache 与 MMU1.1 MMU 是什么?TLB 又是什么?他们是怎么工作的?2.2 简述 Cache 与 MMU 的协作关系?2.3 简述 Cache 与 MMU 的协作工作流程? 2. CPU 多层次缓存2.1 什么是 CPU 的多层次缓存结构&…...

MySQL基础函数使用
目录 简介 1. 单行函数 1.1 字符串函数 1.2 日期函数 1.3 数值函数 1.4 转换函数 1.5 其他函数 2. 多行函数 示例: 3. 数据分组 示例: 4. DQL单表关键字执行顺序 示例: 5. 多表查询 示例: 6. 表与表的外连接 示例…...

解决docker环境下aspose-words转换word成pdf后乱码问题
描述 环境:docker 部署工具:Jenkins 需求:本地上传的word文档需要转换成pdf 问题:转换之后的pdf文档出现小框框(乱码) 转换成PDF的操作 pom: <dependency><groupId>org.apach…...

C# 生成随机数的方法
C# 提供了一种强大而方便的工具类 Random ,用于生成随机数。这里将分类讨论如何通过 C# 实现随机数生成,以及应用于实际情况中的一些具体方案。 一、Random 类概述 Random 类表示一个伪随机数生成器,用于生成满足随机性统计要求的数字序列。…...

ip_done
文章目录 路由结论 IP分片 数据链路层重谈Mac地址MAC帧报头局域网的通信原理MSS,以及MAC帧对上层的影响ARP协议 1.公司是不是这样呢? 类似的要给运营商交钱,构建公司的子网,具有公司级别的入口路由器 2.为什么要这样呢?? IP地…...

3D可视化引擎HOOPS Visualize与HOOPS Luminate Bridge的功能与应用
HOOPS Visualize HPS / HOOPS Luminate Bridge为开发者提供了强大的工具,用于在CAD应用中集成逼真的渲染能力。本文旨在梳理该桥接产品的核心功能、使用方法及应用场景,为用户快速上手并充分利用产品特性提供指导。 桥接产品的核心功能概述 HOOPS Lumi…...

Docder 搭建Redis分片集群 散片插槽 数据分片 故障转移 Java连接
介绍 使多个 Redis 实例共同工作,实现数据的水平扩展。通过将数据分片到多个节点上,Redis 集群能够在不牺牲性能的前提下扩展存储容量和处理能力,从而支持更高并发的请求。Redis 集群不仅支持数据分片,还提供了自动故障转移和高可…...

校园交友app/校园资源共享小程序/校园圈子集合二手物品交易论坛、交友等综合型生活服务社交论坛
多客校园社交圈子系统搭建 校园交友多功能系统源码: 1、更改学校为独立的模块。整体UI改为绿色,青春色,更贴近校园风格。2、圈子归纳到学校去进行运营。每个学校可建立多个圈子。和其他学校圈子互不干扰。3、增加用户绑定学校,以后进入将默认…...

Chaos Mesh云原生的混沌测试平台搭建
Chaos Mesh云原生的混沌测试平台搭建 一.环境准备 确认已经安装helm,如要查看 Helm 是否已经安装,请执行如下命令: helm version二.使用helm安装 1.添加 Chaos Mesh 仓库 在 Helm 仓库中添加 Chaos Mesh 仓库: helm re…...

Vue3之组合式API详解
Vue 3引入了一种新的API风格——组合式API(Composition API),旨在提升组件的逻辑复用性和可维护性。本文将详细阐述Vue 3中的组合式API,包括其定义、特点、使用场景、优势等,并给出具体的示例代码。 一、定义 组合式…...

大模型的构建与部署(3)——数据标注
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 数据标注的重要性 1.1 增强数据可解释性 数据标注通过为原始数据添加标签或注释,显著增强了数据的可解释性。在机器学习和深度学习领域,模型的训练依赖于大量带标签的数据。这些标签不仅帮助…...

AI发展与LabVIEW程序员就业
人工智能(AI)技术的快速发展确实对许多行业带来了变革,包括自动化、数据分析、软件开发等领域。对于LabVIEW程序员来说,AI的崛起确实引发了一个值得关注的问题:AI会不会取代他们的工作,导致大量失业&#x…...

本地事务 + 消息队列事务方案设计
Spring Boot 和 RocketMQ 在Spring Boot项目中实现“本地事务 消息队列事务”的方案,可以按照以下步骤实现: 先执行MySQL本地事务操作(未提交)随后发送消息到消息队列(如RocketMQ事务消息)等待消息队列确…...

pinctrl子系统学习笔记
一、背景 cpu的gpio引脚可以复用成多个功能,如可以配置成I2C或者普通GPIO模式。配置方式一般是通过写引脚复用的配置寄存器,但是不同芯片厂商配置寄存器格式内容各不相同,设置引脚复用无法做到通用且自由的配置,只能在启动初始化…...

使用vue-element 的计数器inputNumber,传第三个参数
使用vue-element 的计数器inputNumber。 其中的change 事件中,默认自带两个参数,currentValue和oldValue,分别代表改变后的数和改变前的数, 如果想要传第三个参数, change"(currentValue, oldValue) > numCha…...

如何从0构建一个flask项目,直接上实操!!!
项目结构 首先,创建一个项目目录,结构如下: flask_app/ │ ├── app.py # Flask 应用代码 ├── static/ # 存放静态文件(如CSS、JS、图片等) │ └── style.css # 示例…...

Mongoose连接数据库操作实践
文章目录 介绍特点:Mongoose 使用:创建项目并安装:连接到 MongoDB:定义 Schema:创建模型并操作数据库:创建文档:查询文档:更新文档:删除文档:使用钩子&#x…...

centos 7.9 freeswitch1.10.9环境搭建
亲测版本centos 7.9系统–》 freeswitch1.10.9 一、下载插件 yum install -y git alsa-lib-devel autoconf automake bison broadvoice-devel bzip2 curl-devel libdb4-devel e2fsprogs-devel erlang flite-devel g722_1-devel gcc-c++ gdbm-devel gnutls-devel ilbc2...

Gitlab服务管理和仓库项目权限管理
Gitlab服务管理 gitlab-ctl start # 启动所有 gitlab 组件; gitlab-ctl stop # 停止所有 gitlab 组件; gitlab-ctl restart # 重启所有 gitlab 组件; gitlab-ctl status …...

LLMs之Llama-3:Llama-3.3的简介、安装和使用方法、案例应用之详细攻略
LLMs之Llama-3:Llama-3.3的简介、安装和使用方法、案例应用之详细攻略 目录 相关文章 LLMs之LLaMA:LLaMA的简介、安装和使用方法、案例应用之详细攻略 LLMs之LLaMA-2:LLaMA 2的简介(技术细节)、安装、使用方法(开源-免费用于研究和商业用途…...

OpenCV函数及其应用
1. 梯度处理的Sobel算子函数 功能 Sobel算子是一种用于边缘检测的离散微分算子,它结合了高斯平滑和微分求导,用于计算图像亮度的空间梯度。 参数 src:输入图像。 dst:输出图像。 ddepth:输出图像的深度。 dxÿ…...

vulnhub靶场【DriftingBlues】之3
前言 靶机:DriftingBlues-3,IP地址192.168.1.60 攻击:kali,IP地址192.168.1.16 都采用虚拟机,网卡为桥接模式 主机发现 使用arp-scan -l或netdiscover -r 192.168.1.1/24 信息收集 使用nmap扫描端口 网站探测 访…...

文件上传—阿里云OSS对象存储
目录 一、OSS简介 二、OSS基本使用 1. 注册账号 2. 基本配置 (1) 开通OSS (2) 创建存储空间 (3) 修改权限 (4) 配置完成,上传一张图片,检验是否成功。 (5) 创建AccessKey 三、Java项目集成OSS 1. 导入依赖 2. Result.java代码: …...