OpenHarmony-3.HDF input子系统(5)

news2024/12/17 6:42:06
  • 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驱动模型如下图所示:

image
  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_INPUT
    bool "Enable HDF input driver"
    default n
    depends on DRIVERS_HDF
    help
      Answer Y to enable HDF input driver.

config DRIVERS_HDF_TP_5P5_GT911
    bool "Enable HDF tp 5P5 GT911 driver"
    default n
    depends on DRIVERS_HDF_INPUT
    help
      Answer Y to enable HDF TP 5P5 GT911 driver.
 ...

drivers_hdf_core\adapter\khdf\linux\model\input\Makefile:
INPUT_ROOT_DIR = ../../../../../framework/model/input/driver

obj-$(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.o

obj-$(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 & 4p0
                    busConfig {
                        // 0:i2c 1:spi
                        busType = 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;    // 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";    // 触摸屏IC型号
                        vendorName = "zsj";    // 供应商
                        chipInfo = "AAAA11222";  /*1~4字符代表产品名,5~6字符代表IC型号,7~9字符代表模型型号*/
                        busType = 0;          // 0代表I2C,1代表SPI
                        deviceAddr = 0x5D;     // 器件IC通信地址
                        irqFlag = 2;           /* 1代表上升沿触发,2代表下降沿触发,4代表高电平触发,8代表低电平触发*/
                        maxSpeed = 400;       // 最大通信速率为400Hz
                        chipVersion = 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]; // 复位管脚无操作,且进行拉低,延时10ms
							resumeSeq = [3, 1, 2, 10];    // 复位管脚无操作,且进行拉高,延时10ms
							powerOffSeq = [3, 0, 2, 10,   // 复位管脚无操作,且进行拉低,延时10ms
            							 1, 0, 2, 20];   // 电源正极管脚无操作,且进行拉低,延时20ms
                        }
                    }
                    chip0 :: touchChip {
                    	/* 与设备描述配置信息中器件私有配置信息的“match_attr”字段保持一致 */
                        match_attr = "zsj_gt911_5p5";
                        chipInfo = "ZIDN45100";  // 4-ProjectName, 2-TP IC, 3-TP Module
                        chipVersion = 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); 
     #endif
        return 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

旅游资源系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

Docker网络与数据管理

Docker网络与数据管理 1. Docker网络基础&#xff1a;桥接网络、主机网络和自定义网络 Docker提供了多种网络模式&#xff0c;以满足不同应用场景的需求。理解Docker的网络模式对于容器间通信、网络安全性及性能优化至关重要。在Docker中&#xff0c;每个容器都可以连接到不同…

X.game解析柚子币提升速效双向利好和年中历史新低原因

柚子币最新消息&#xff0c;币安宣布将于2024年9月25日21:00左右暂停柚子币网络上的代币存取业务&#xff0c;以全力支持即将到来的柚子币网络升级和硬分叉&#xff0c;这一消息为柚子币的未来发展增添了新的期待和变数。 除了速度的提升&#xff0c;Spring1.0还带来了诸多技术…

数据结构之线性表1

2.1 线性表的定义和基本操作 1.线性结构的特点是&#xff1a;在数据元素的非空有限集中&#xff0c; &#xff08;1&#xff09;存在惟一的一个被称做“第一个”的数据元素&#xff1b; &#xff08;2&#xff09; 存在惟一的一个被称做“最后一个”的数据元素&#xff1b; &a…

Tomcat原理(5)——tomcat最终实现

目录 一、什么是Servlet容器 二、ServletConfigMapping构建实现容器 ServletConfigMapping MyTomcat 三、优化server Server MyTomcat 四、匹配 代码如下&#xff1a; 测试如下&#xff1a; 上一篇博客已经为介绍了servelet的实现 &#xff0c;这篇对上一篇博客进行补…

echarts 常见组件合集

仪表盘组件 <template><div class"w100 h100" ref"chart"></div> </template><script> import resize from "./mixins/resize"; export default {mixins: [resize],props: ["list"],watch: {list: {// …

C/C++代码性能优化技巧的书籍及资料

使用C/C开发的场景&#xff0c;大多对代码的执行的速度&#xff0c;实时性有较高的要求&#xff0c;像嵌入式系统的开发&#xff0c;资源还受限。在算力存储空间有限的MCU上写出简洁又高效的代码实际是一种艺术。软件工程师在代码设计上的这种差距&#xff0c;会反映在产品的性…

FlightAD 解读

一 文章相关信息 出处&#xff1a;ICPADS CCF C 会议&#xff08;代码未开源&#xff09;&#xff0c;COUTA 研究团队的另一研究 二 Methodology 1. 整体架构&#xff1a; 2. Multi-Scale Sampling&#xff08;多尺度&#xff09; 实际上&#xff0c;就是对每个单通道作 “多…

20241216软考架构-------软考案例23答案

每日打卡题案例23 23.【2015年真题】 难度&#xff1a;一般 阅读以下关于系统设计建模的说明&#xff0c;回答下列问题。&#xff08;共25分&#xff09; 【说明】 某公司拟研制一款高空监视无人直升机&#xff0c;该无人机采用遥控一自主复合型控制实现垂直升降。该直升机飞行…

170页ppt解读如何进行大型集团信息安全管理体系优化咨询

文档为甲方集团信息安全管理体系优化咨询项目的信息安全建设规划报告&#xff0c;重点围绕信息安全建设的规划与设计展开。报告首先进行了信息安全建设需求分析&#xff0c;明确了当前信息安全现况存在的问题、信息安全发展趋势及具体需求汇整&#xff0c;为后续建设提供了坚实…

RK3576 Android14,内存大于4G时UVC应用无法申请内存

最近有个项目需要将Linux虚拟成UVC摄像头&#xff0c;开发过程中遇到一个奇怪的事情&#xff0c;通过V4l2框架接口申请内存时&#xff0c;相同的板子&#xff0c;只是内存一个4G一个8G。4G的内存可以申请成功&#xff0c;8G就不行。提示“内存不足” 内存更大反而内存不足&…

TimesFM(Time Series Foundation Model)时间序列预测股市价格的数据研究(4)

TimesFM&#xff08;Time Series Foundation Model&#xff09;时间序列预测的数据研究(3)-CSDN博客文章浏览阅读846次&#xff0c;点赞19次&#xff0c;收藏12次。1. **表示预测区间**&#xff1a;在很多预测任务中&#xff0c;模型给出的不只是一个单一的预测值&#xff08;比…

opencv所有常见函数

一、opencv图像操作 二、opencv图像的数值运算 三、opencv图像的放射变换 四、opencv空间域图像滤波 五、图像灰度化与直方图 六、形态学图像处理 七、阈值处理与边缘检测 八、轮廓和模式匹配

常见漏洞—SSRF_FastCGI

FastCGI协议 简介 Fast CGI源自旧版本的CGI 路由/结构图 # 访问url --> 浏览器生成HTTP请求报文 --> web server解析请求&#xff08;例如nginx&#xff09; web server 是内容的分发者 当访问静态页面时&#xff0c;web server 会直接返回资源&#xff0c;例如index.htm…

【游戏设计原理】10 - 科斯特的游戏理论

科斯特的游戏理论强调了游戏与学习之间的关系&#xff0c;认为“玩得开心”与“学习”是紧密相连的。换句话说&#xff0c;游戏的核心魅力在于通过适当的挑战和不断的学习进程激发玩家的内啡肽循环&#xff0c;这让玩家在不断的探索和进步中找到乐趣。 科斯特的理论通过游戏是…

ES-IndexTemplate和DynamicTemplate

IndexTemplate 什么是IndexTemplate 索引模板&#xff0c;帮助你设定Mappings和Settings&#xff0c;并按照一定的规则&#xff0c;自动匹配到新创建的索引之上 模板仅在一个索引被新建的时候&#xff0c;才会产生应用&#xff0c;索引被修改不会影响已创建的索引可以设定多…

【大语言模型】ACL2024论文-27 Mementos:一个全面的多模态大型语言模型在图像序列推理上的基准测试

【大语言模型】ACL2024论文-27 Mementos&#xff1a;一个全面的多模态大型语言模型在图像序列推理上的基准测试 目录 文章目录 【大语言模型】ACL2024论文-27 Mementos&#xff1a;一个全面的多模态大型语言模型在图像序列推理上的基准测试目录文章摘要研究背景问题与挑战如何…

CSS基础与应用详解

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Css篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Css篇专栏内容:CSS基础与应用详解 前言 CSS&#xff08;层叠样式表&#xff09;是网页设计中不可或缺的一部分&am…

C/S软件授权注册系统(Winform+WebApi+.NET8+EFCore版)

适用软件&#xff1a;C/S系统、Winform桌面应用软件。 运行平台&#xff1a;Windows .NETCore&#xff0c;.NET8 开发工具&#xff1a;Visual Studio 2022&#xff0c;C#语言 数据库&#xff1a;Microsoft SQLServer 2012&#xff0c;Oracle 21c&#xff0c;MySQL8&#xf…

国标GB28181网页直播平台EasyGBS国标EasyGBD对讲音频demo

近年来&#xff0c;随着信息技术的飞速发展&#xff0c;视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。在此过程中&#xff0c;GB28181标准凭借其强大的功能和灵活性&#xff0c;成为了推动视频监控系统互联互通和高效管理的重要一环。通过支持GB28181协议&…