【鸿蒙南向开发】OpenHarmony HDF Input驱动模型分析与使用

概述

输入设备是用户与计算机系统进行人机交互的主要装置之一,是用户与计算机或者其他设备通信的桥梁。常见的输入设备有键盘、鼠标、游戏杆、触摸屏等。本文档将介绍如何使用 Hi3516DV300 开发板完成基于 HDF_Input 模型的触摸屏(Touch Screen)器件驱动开发,从而使开发者快速入门。

硬件资源简介

Touch 设备与主机通讯一般采用 I2C 总线完成数据的交互,为了提高触屏数据的实时性,触屏 IC 都会提供中断支持。当有触屏事件发生时,会触发主机中断管脚完成一次中断响应。中断处理函数中主机通过 I2C 总线读取触屏 IC 寄存器完成一次数据采集。

Hi3516DV300 开发板套件所提供的触摸屏器件 IC 为 GT911,该器件采用标准 I2C 与主机通信,通过 6pin 软排线与主板连接。6pin 分布以及实物连接图如下图所示:

image.png

Input模型概览

image.png

Input 驱动模型核心部分由设备管理层、公共驱动层、器件驱动层组成。器件产生的数据借助平台数据通道能力从内核传递到用户态,驱动模型通过配置文件适配不同器件及硬件平台,提高开发者的器件驱动开发效率。如下部分为模型各部分的说明:

(1)input 设备管理:为各类输入设备驱动提供 input 设备的注册、注销接口,同时统一管理 input 设备列表;

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

(3)input 器件驱动:指各器件厂家的差异化驱动,通过适配平台驱动预留的差异化接口,实现器件驱动开发量最小化;

(4)input 数据通道:提供一套通用的数据上报通道,各类别的 input 设备驱动均可用此通道上报 input 事件;

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

Input模型工作流程解析

为了让开发者更清晰的了解 Input 模型工作流程,本节将对 input 模型加载的关键流程代码进行说明。

本章节为 Input 模型工作流程说明,开发者无需进行开发。

  • 私有配置信息解析

示例代码路径:

./drivers/framework/model/input/driver/input_config_parser.c

根据 OSAL 提供的配置解析函数,可以将 hcs 文件中各字段含义进行解析,具体请参考 input_config_parser.c 中各函数的实现。如果提供的模板不能满足需求,在 hcs 文件中添加相应信息后,需要根据添加的字段开发相应的解析函数。


static int32_t ParseAttr(struct DeviceResourceIface *parser, const struct DeviceResourceNode *attrNode, BoardAttrCfg *attr)
{
int32_t ret;
// 获取inputType字段信息,保存在BoardAttrCfg结构体中
    ret = parser->GetUint8(attrNode, "inputType", &attr->devType, 0);     
    CHECK_PARSER_RET(ret, "GetUint8");
    ...
    return HDF_SUCCESS;
}
  • 管理驱动层初始化及注册驱动至HDF框架

示例代码路径:


./drivers/framework/model/input/driver/hdf_input_device_manager.c
static int32_t HdfInputManagerInit(struct HdfDeviceObject *device)
{ 
/* 分配内存给manager,manager中将存放所有input设备 */
    g_inputManager = InputManagerInstance();
    ...
}
struct HdfDriverEntry g_hdfInputEntry = {
    .moduleVersion = 1,
    .moduleName = "HDF_INPUT_MANAGER",
    .Bind = HdfInputManagerBind,
    .Init = HdfInputManagerInit,
    .Release = HdfInputManagerRelease,
};
HDF_INIT(g_hdfInputEntry);        //驱动注册入口
  • 公共驱动层初始化及注册驱动至HDF框架

示例代码路径:


./drivers/framework/model/input/driver/hdf_touch.c
static int32_t HdfTouchDriverProbe(struct HdfDeviceObject *device)
{
   ...
    /* 板级信息结构体内存申请及hcs配置信息解析 */
    boardCfg = BoardConfigInstance(device);
    ...
    /* 公共驱动结构体内存申请 */
    touchDriver = TouchDriverInstance();
    ...
    /* 依据解析出的板级信息进行公共资源初始化,如IIC初始化 */
    ret = TouchDriverInit(touchDriver, boardCfg);
    if (ret == HDF_SUCCESS) {
        ...
       /* 添加驱动至公共驱动层驱动管理链表,当设备与驱动进行绑定时使用该链表进行查询 */
        AddTouchDriver(touchDriver);
        ...
    }
    ...
}
struct HdfDriverEntry g_hdfTouchEntry = {
    .moduleVersion = 1,
    .moduleName = "HDF_TOUCH",
    .Bind =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值