
OpenHarmony HDF Input 原创
Table of Contents
一、摘要
本文介绍如何使用OpenHarmony的Input框架模型,并编写app,在按键事件处理中翻转led灯。下面是演示:
https://player.bilibili.com/player.html?aid=894148373
本文目的在于通过学习input框架模型,对openharmony的驱动系统有一个大体的理解。通过本文的学习,应该能够理解如图的驱动框架:
二、开发环境
硬件:小熊派micro
KEY驱动程序
在openharmony中已经完成了key驱动程序的编写。源码在:/drivers/framework/model/input/driver/hdf_key.c,我们需要做的就是在配置文件中增加key节点的配置信息,key驱动程序就能成功加载。
首先看key驱动程序源码,key驱动使用到gpio的接口,了解该部分内容可查看:OpenHarmony HDF 按键中断开发基于小熊派hm micro
驱动程序入口对象:
主要起作用的是Init函数:其分为两部分,首先根据配置文件读取key的IO管脚、中断模式等信息,然后根据配置初始化gpio,注册中断函数,并注册一个代表key的input_device到input_device_manager。
1、KeyConfigInstance:
ParseKeyConfig:解析deviceNode的信息,我们需要根据这个函数来编写key的配置信息。见下文
2、RegisterKeyDevice
KeyInit就是调用:SetupKeyIrq 设置key中断处理函数
3、中断处理函数 KeyIrqHandle
由于调用GpioSetIrq传入的参数是GPIO_IRQ_USING_THREAD,所以KeyIrqHandle是在线程环境中执行的。
在中断线程中,读取IO口电平,通过hdf的事件接口将当前的按键事件上报给应用。
中断事件的上报流程如下:
input_report_key ->PushOnePackage -> HdfDeviceSendEvent
4、RegisterInputDevice:注册key设备到文件系统
类似于linux,把驱动程序加入到虚拟文件系统,提供接口给上层应用。
CreateDeviceNode就是调用HidRegisterHdfDevice:
5、小熊派使用key
根据小熊派的原理图,可知F1按键的管脚为PG2,对应的IO编号为: PG2 = (6 * 16 + 3)-1 = 98;
需要修改两个文件:
- bearpi-micro\device\st\bearpi_hm_micro\liteos_a\hdf_config\device_info\device_info.hcs
- D:\VMware\share\bearpi-micro\device\st\bearpi_hm_micro\liteos_a\hdf_config\input\input_config.hcs
在device_info.hcs中,在input节点下新增key节点,可仿照device_hdf_touch来创建,如下:
在input_config.hcs下同样新增key节点如下:
三、HDI驱动接口
HDI调用了驱动在虚拟文件系统中的节点,再进行一个封装,提供给上层服务或用户。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aI5XUfz1-1645264389241)(picture/hdi-architecture-of-the-input-module.png)]
根据上图可知,InputHDI就是由三部分组成的。这三部分分别负责不同的功能。
- InputManager:管理输入设备,包括输入设备的打开、关闭、设备列表信息获取等;
- InputReporter:负责输入事件的上报,包括注册、注销数据上报回调函数等;
- InputController:提供input设备的业务控制接口,包括获取器件信息及设备类型、设置电源状态等。
我们将精力放在manager以及reporter上,这两个是我们应用程序即将使用到的接口。我们用manager打开key设备,用reporter注册上报回调函数,再回调函数中翻转led。
1、manager
要使用这三个兄弟,首先要给他们一个妈,先调用**GetInputInterface()**获取input hdi接口对象:
这里创建了两个对象:
- InstanceInputHdi:三个部分
- InitDevManager:对外隐藏了的设备管理器,用于管理所有打开 的设备
InstanceInputHdi:创建了上述的三个对象,InstanceManagerHdi、InstanceControllerHdi、InstanceReporterHdi都是在实例化对象。
好的,三个兄弟已经被生出来了,现在我们能使用他们的方法了。
OpenInputDevice
我们要使用key,就需要先“打开”这个设备。其实就是绑定key 驱动提供的服务,绑定的方法是通过HdfIoServiceBind()。
2、reporter
现在我们可以使用key设备了,要读取key上报的事件,就需要调用**RegisterReportCallback()**注册上报回调函数。
当设备调用 HdfDeviceSendEvent()发送事件时,listener被回调。
四、编写应用程序
应用程序的代码很简单,就是调用HDI提供的函数。(如何编写应用程序可查看小熊派led程序教程)
注意BUILD.gn也需要添加一些头文件路径,依赖:
