概述
输入设备是用户与计算机系统进行人机交互的主要装置之一,是用户与计算机或者其他设备通信的桥梁。常见的输入设备有键盘、鼠标、游戏杆、触摸屏等。本文档将介绍如何使用 Hi3516DV300 开发板完成基于 HDF_Input 模型的触摸屏(Touch Screen)器件驱动开发,从而使开发者快速入门。
硬件资源简介
Touch 设备与主机通讯一般采用 I2C 总线完成数据的交互,为了提高触屏数据的实时性,触屏 IC 都会提供中断支持。当有触屏事件发生时,会触发主机中断管脚完成一次中断响应。中断处理函数中主机通过 I2C 总线读取触屏 IC 寄存器完成一次数据采集。
Hi3516DV300 开发板套件所提供的触摸屏器件 IC 为 GT911,该器件采用标准 I2C 与主机通信,通过 6pin 软排线与主板连接。6pin 分布以及实物连接图如下图所示:
Input模型概览
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 =