GHOST系统之家 - Windows系统光盘下载网站!
当前位置:GHOST系统之家>系统教程 > OpenHarmony小型系统输入子系统解析

OpenHarmony小型系统输入子系统解析

来源:Ghost系统之家浏览:时间:2023-06-30 08:57:35

想了解更多关于开源的内容,请访问:

51CTO开源基础软件社区

https://ost.51cto.com

前言

本文将以鼠标为例介绍小型系统上的输入系统架构以及输入信号传递的整个流程。

一、大致流程

输入设备产生信号,内核接收到并处理信号。内核将处理后的信号传递给HDF化后的设备节点。HDF对信号进行事件上报,也就是通过HDF的消息机制与用户空间空间进行交互。最后WMS给用户程序进行事件分发。

二、内核到HDF

1、框架生成部分由于硬件到内核这一步与linux没有太多的不同,在这里不做过多的介绍。

HDF设备的注册以及后续的输入信号传递都是通过给内核添加补丁来实现的。

kernel/linux/patches/linux-4.19/common_patch/hdf.patch。

+dev->devType = type;+dev->devName = hdev->name;+hdev->input_dev = HidRegisterHdfInputDev(dev);//Hid设备注册接口+if (hdev->input_dev == NULL) {+printk("%s: RegisterInputDevice failed\n", __func__);+}+kfree(dev);+dev = NULL;+}+#endif

HidRegisterHdfInputDev()的主要作用是调用管理器的注册接口。

drivers/hdf_core/framework/model/input/driver/hdf_hid_adapter.c

void* HidRegisterHdfInputDev(HidInfo *info){InputDevice* inputDev = HidConstructInputDev(info);if (inputDev == NULL) {HDF_LOGE("%s: hid construct input Dev failed", __func__);return NULL;}if (InputDriverLoaded()) {DoRegisterInputDev(inputDev); //将调用管理器的接口RegisterInputDevice()} else {CacheHid(inputDev);}return inputDev;}

管理器的RegisterInputDevice()完成分配id、缓存和生成HDF设备节点。

drivers/hdf_core/framework/model/input/driver/hdf_hid_device_managerr.c

int32_t RegisterInputDevice(InputDevice *inputDev){int32_t ret;HDF_LOGI("%s: enter", __func__);if (inputDev == NULL) {HDF_LOGE("%s: inputdev is null", __func__);return HDF_ERR_INVALID_PARAM;}if ((g_inputManager == NULL) || (g_inputManager->initialized == false)) {HDF_LOGE("%s: dev manager is null or initialized failed", __func__);return HDF_FAILURE;}OsalMutexLock(&g_inputManager->mutex);ret = AllocDeviceID(inputDev);//分配设备IDif (ret != HDF_SUCCESS) {goto EXIT;}ret = CreateDeviceNode(inputDev);//创建设备节点,也就是上面所述的hdf_input_eventXif (ret != HDF_SUCCESS) {goto EXIT1;}ret = AllocPackageBuffer(inputDev);//分配包的缓存if (ret != HDF_SUCCESS) {goto EXIT1;}AddInputDevice(inputDev);OsalMutexUnlock(&g_inputManager->mutex);HDF_LOGI("%s: exit succ, devCount is %d", __func__, g_inputManager->devCount);return HDF_SUCCESS;EXIT1:DeleteDeviceNode(inputDev);EXIT:OsalMutexUnlock(&g_inputManager->mutex);return ret;}

OpenHarmony小型系统输入子系统解析-开源基础软件社区OpenHarmony小型系统输入子系统解析-开源基础软件社区

2、信号传递部分。上面步骤准备就绪后,如上提及,鼠标的信息传递也是通过内核调用了HDF接口向用户空间传输鼠标的事件信号。

补丁调用适配器接口发送输入事件信息。

hdf.patch:

+#if defined(CONFIG_DRIVERS_HDF_INPUT)+if (hid->input_dev) {//内核获取到的输入设备产生的信号,将信号通过事件上报传递到HDF+HidReportEvent(hid->input_dev, usage->type, usage->code, value); +}+#endif

hdf_hid_adapter.c:

void HidReportEvent(const void *inputDev, uint32_t type, uint32_t code, int32_t value){#ifdef CONFIG_DFX_ZEROHUNGif (type == EV_KEY && code == KEY_POWER)hung_wp_screen_powerkey_ncb(value);#endifInputDevice *device = (InputDevice *)inputDev;PushOnePackage(device, type, code, value);//调用了event_hub.c中的接口,先打包,再发送if (type == EV_KEY && KEY_RESERVED < code && code < KEY_MAX && value == 0 && code == g_kbdcode) {OsalTimerDelete(&g_timer);g_kbdcode = 0;}if (type == EV_KEY && KEY_RESERVED < code && code < KEY_MAX && value == 1 &&device->devType == INDEV_TYPE_KEYBOARD) {g_kbdcode = code;RepateEvent(device);}}

经过event_hub处理进行下一步的传递。

// PushOnePackage()在这里的作用就是将事件流打成包的形式进行传递// 代码过长不展示,PushOnePackage()处理完成包后就开始进入HDF消息机制了static void SendFramePackages(InputDevice *inputDev) //该函数由PushOnePackage调用{struct HdfDeviceObject *hdfDev = inputDev->hdfDevObj;if (hdfDev == NULL || inputDev->pkgBuf == NULL) {HDF_LOGE("%s: hdf dev is null", __func__);return;}//HDF消息机制的事件上报接口int32_t ret = HdfDeviceSendEvent(hdfDev, 0, inputDev->pkgBuf);}

OpenHarmony小型系统输入子系统解析-开源基础软件社区OpenHarmony小型系统输入子系统解析-开源基础软件社区

三、HDF到WMS

1、WMS简单介绍。源码位置由foundation/graphic/wms变更至/foundation/window/window_manager_lite。WMS全称是Window Manager Service,顾名思义,该服务就是用来管理窗口和绘画光标等操作的。该组件里还包含了另一个必不可少的组件IMS(Input Manager Service),同理,它是用来处理输入事件的。由图可知,IMS也有一个eventhub,很容易想到这边的eventhub就是用来接收内核态的evenhub发来的输入信号的。

2、消息机制简单介绍。HDF消息机制是建立用户态应用和内核态驱动的交互。主要功能有两个,一个是用户态应用发送消息到驱动,另一个是用户态应用接收驱动主动上报事件。主要接口有如下:

接口

描述

struct HdfIoService *HdfIoServiceBind(const char *serviceName);

用户态获取驱动的服务,获取该服务之后通过服务中的Dispatch方法向驱动发送消息。

void HdfIoServiceRecycle(struct HdfIoService *service);

释放驱动服务。

int HdfDeviceRegisterEventListener(struct HdfIoService *target, struct HdfDevEventlistener *listener);

用户态程序注册接收驱动上报事件的操作方法。

int HdfDeviceSendEvent(struct HdfDeviceObject *deviceObject, uint32_t id, struct HdfSBuf *data);

驱动主动上报事件接口。

推荐系统

  • 电脑公司Ghost Win8.1 x32 精选纯净版2022年7月(免激活) ISO镜像高速下载

    电脑公司Ghost Win8.1 x32 精选纯净版2022年7月(免激活) ISO镜像高速下载

    语言:中文版系统大小:2.98GB系统类型:Win8

    电脑公司Ghost Win8.1x32位纯净版V2022年7月版本集成了自2022流行的各种硬件驱动,首次进入系统即全部硬件已安装完毕。电脑公司Ghost Win8.1x32位纯净版具有更安全、更稳定、更人性化等特点。集成最常用的装机软件,精心挑选的系统维护工具,加上绿茶独有

  • 微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载

    微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载

    语言:中文版系统大小:5.13GB系统类型:Win11

    微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Win11 64位 Office办公版(免费)优化  1、保留 Edge浏览器。  2、隐藏“操作中心”托盘图标。  3、保留常用组件(微软商店,计算器,图片查看器等)。  5、关闭天气资讯。 

  • Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载

    Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载

    语言:中文版系统大小:4.75GB系统类型:Win11

    Ghost Win11 21H2是微软在系统方面技术积累雄厚深耕多年,Ghost Win11 21H2系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Ghost Win11 21H2是微软最新发布的KB5019961补丁升级而来的最新版的21H2系统,以Windows 11 21H2 22000 1219 专业版为基础进行优化,保持原汁原味,系统流畅稳定,保留常用组件

  • windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载

    windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载

    语言:中文版系统大小:5.31GB系统类型:Win11

    windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载,微软win11发布快大半年了,其中做了很多次补丁和修复一些BUG,比之前的版本有一些功能上的调整,目前已经升级到最新版本的镜像系统,并且优化了自动激活,永久使用。windows11中文版镜像国内镜像下载地址微软windows11正式版镜像 介绍:1、对函数算法进行了一定程度的简化和优化

  • 微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载

    微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载

    语言:中文版系统大小:5.31GB系统类型:Win11

    微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载,微软2022年正式推出了win11系统,很多人迫不及待的要体验,本站提供了最新版的微软Windows11正式版系统下载,微软windows11正式版镜像 是一款功能超级强大的装机系统,是微软方面全新推出的装机系统,这款系统可以通过pe直接的完成安装,对此系统感兴趣,想要使用的用户们就快来下载

  • 微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件

    微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件

    语言:中文版系统大小:0MB系统类型:Win11

    微软Ghost win11 正式版镜像文件是一款由微软方面推出的优秀全新装机系统,这款系统的新功能非常多,用户们能够在这里体验到最富有人性化的设计等,且全新的柔软界面,看起来非常的舒服~微软Ghost win11 正式版镜像文件介绍:1、与各种硬件设备兼容。 更好地完成用户安装并有效地使用。2、稳定使用蓝屏,系统不再兼容,更能享受无缝的系统服务。3、为

  • 雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载

    雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载

    语言:中文版系统大小:4.75GB系统类型:

    雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载在系统方面技术积累雄厚深耕多年,打造了国内重装系统行业的雨林木风品牌,其系统口碑得到许多人认可,积累了广大的用户群体,雨林木风是一款稳定流畅的系统,一直以来都以用户为中心,是由雨林木风团队推出的Windows11国内镜像版,基于国内用户的习惯,做了系统性能的优化,采用了新的系统

  • 雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO

    雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO

    语言:中文版系统大小:5.91GB系统类型:Win7

    雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO在系统方面技术积累雄厚深耕多年,加固了系统安全策略,雨林木风win7旗舰版系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。win7 32位旗舰装机版 v2019 05能够帮助用户们进行系统的一键安装、快速装机等,系统中的内容全面,能够为广大用户