当前位置: 首页 > 科技观察

OpenHarmonyInput驱动框架

时间:2023-03-23 11:24:32 科技观察

一、HdfFrameworkHDF驱动框架OpenAtomOpenHarmony(以下简称“OpenHarmony”)系统HDF驱动框架采用C语言面向对象编程模型构建,通过平台解耦兼容不同内核和内核解耦。统一平台基础的目的是帮助开发者达到带动一个开发,部署多个系统的效果。(引用原文)代码目录/drivers/framework├──ability#提供驱动开发能力支持,如消息模型库等│├──config#配置解析代码│└──sbuf#数据序列化代码├──core#实现驱动框架核心代码│├──adapter#实现内核操作接口的适配,提供抽象接口供开发者使用│├──common#driveframework公共基础代码│├──host#驱动宿主环境模块│├──manager#驱动框架管理模块│└──shared#host和manager共享模块代码├──include#驱动框架对外提供能力的头文件│├──config#提供配置分析能力头文件│├──core#驱动框架提供的#头文件│├──net#网络数据操作相关的头文件│├──osal#系统适配接口相关的头文件│├──platform#platform设备相关接口的头文件aces│├──utils#驱动框架公共能力头文件│└──wifi#WLAN对外能力头文件├──model#提供驱动通用框架模型│├──display#显示框架模型│├──input#输入框架模型│├──network#WLAN框架模型│└──sensor#Sensor驱动模型├──support#提供系统的基本能力│└──platform#Platform设备驱动框架和访问接口,包括GPIO、I2C、SPI等├──tools#hdf框架工具相关源码│└──hc-gen#配置管理工具源码└──utils#提供基本数据结构和算法等2.输入驱动模型基于HDF驱动框架的输入驱动模型输入驱动模型介绍输入驱动模型的核心部分由设备管理层组成,公共驱动层和设备驱动层借助平台数据通道能力,将设备产生的数据从内核态到用户态,驱动模型通过配置文件适配不同的设备和硬件平台,提高开发者的设备驱动开发效率。下面是对模型各部分的描述:输入设备管理:为各种输入设备驱动提供输入设备的注册和注销接口,统一管理输入设备列表。输入平台驱动:指各种输入设备的公共抽象驱动(如触摸屏的公共驱动),负责初始化板级硬件,处理硬件中断,向管理器注册输入设备。输入设备驱动:指各个设备厂商的差异化驱动。通过适配平台驱动预留的差异化接口,最大限度地减少了设备驱动的开发量。Inputdatachannel:提供一组通用的数据上报通道,所有类型的Input设备驱动都可以使用这个通道上报Input事件。Input配置分析:负责分析管理Input设备的板级配置和设备私有配置。输入模型工作流分析私有配置信息分析./drivers/framework/model/input/driver/input_config_parser.c根据OSAL提供的配置分析功能,可以分析出hcs文件中各个字段的含义。详情请参考input_config_parser.c各函数的实现。如果提供的模板不能满足要求,在hcs文件中添加相应的信息后,需要根据添加的字段开发相应的分析功能。staticint32_tParseAttr(structDeviceResourceIface*parser,conststructDeviceResourceNode*attrNode,BoardAttrCfg*attr){int32_tret;ret=parser->GetUint8(attrNode,"inputType",&attr->devType,0);CHECK_PARSER_RET(ret,"GetUint8");ret=parser->GetString(attrNode,"devName",&attr->devName,NULL);CHECK_PARSER_RET(ret,"GetString");ret=parser->GetUint32(attrNode,"solutionX",&attr->resolutionX,0);CHECK_PARSER_RET(ret,"GetUint32");ret=parser->GetUint32(attrNode,"solutionY",&attr->resolutionY,0);CHECK_PARSER_RET(ret,"GetUint32");returnHDF_SUCCESS;}管理驱动层初始化及注册驱动驱动至HDF框架./drivers/framework/model/input/driver/hdf_input_device_manager.cstaticint32_tHdfInputManagerInit(structHdfDeviceObject*device){HDF_LOGI),("%fus__)",("%fus__);if(device==NULL){HDF_LOGE("%s:deviceisnull",__func__);返回HDF_ERR_INVALID_PARAM;}/*为管理器分配内存,它将存储所有输入设备*/g_inputManager=InputManagerInstance();如果(g_inputManager==NULL){返回HDF_ERR_MALLOC_FAIL;}if(OsalMutexInit(&g_inputManager->mutex)!=HDF_SUCCESS){"%F_LOGE(s:mutexinitfailed",__func__);OsalMemFree(g_inputManager);g_inputManager=NULL;返回HDF_FAILURE;}g_inputManager->initialized=true;g_inputManager->hdfDevObj=设备;返回HDF_SUCCESS;}structHdfDriverEntryg_hdfInputEntry={.moduleVersion=1,.moduleName="HDF_INPUT_MANAGER",.Bind=HdfInputManagerBind,.Init=HdfInputManagerInit,.Release=HdfInputManagerEnputRelease,};层初始化和注册驱动到HDF框架./drivers/framework/model/input/driver/hdf_touch.cstaticint32_tHdfTouchDriverProbe(structHdfDeviceObject*device){.../*板级信息结构内存申请和hcs配置信息分析*/boardCfg=BoardConfigInstance(设备);.../*公共驱动结构内存申请*/touchDriver=TouchDriverInstance();.../*根据解析出的板级信息初始化公共资源,如IIC初始化*/ret=TouchDriverInit(touchDriver,boardCfg);if(ret==HDF_SUCCESS){.../*将驱动添加到公共驱动层驱动管理链表中,并使用该链表查询设备何时与驱动绑定*/AddTouchDriver(touchDriver);...}...}structHdfDriverEntryg_hdfTouchEntry={.moduleVersion=1,.moduleName="HDF_TOUCH",.Bind=HdfTouchDriverBind,.Init=HdfTouchDriverProbe,.Release=HdfTouchDriverRelease,};HDF_INIT(g_hdfTouchEntry);//Driver注册入口设备驱动层初始化,将驱动注册到HDF框架中。详情请参考适配器私有驱动设备层驱动初始化并将驱动注册到HDF框架。具体调用逻辑系列函数输入模型管理层驱动init函数初始化设备管理链表**,公共驱动层的初始化函数完成相关结构体的内存申请。设备驱动相关信息通过RegisterChipDevice函数填充与公共驱动层结构相关的信息,并完成相关硬件信息的初始化(如中断注册等),将设备和驱动绑定,形成一个inputDev。通过RegisterInputDevice函数向驱动管理层注册。将inputDev添加到设备管理链表等功能主要在RegisterInputDevice函数中实现。下面是这两个函数的实现:输入设备*inputDev=NULL;if((chipDev==NULL)||(chipDev->chipCfg==NULL)){returnHDF_ERR_INVALID_PARAM;}/*通过InputDeviceInstance函数绑定设备和驱动创建inputDev*/ret=DeviceBindDriver(chipDev);if(ret!=HDF_SUCCESS){HDF_LOGE("%s:芯片设备匹配驱动失败",__func__);返回HDF_FAILURE;}/*主要包括设备中断注册和中断处理函数,在处理函数中有向用户态上报数据的数据通道*/ret=ChipDriverInit(chipDev);如果(ret!=HDF_SUCCESS){转到退出;}/*请求内存以实例化InputDev*/inputDev=InputDeviceInstance(chipDev);如果(inputDev==NULL){返回HDF_ERR_MALLOC_FAIL;}/*将InputDev设备注册到输入驱动管理*/ret=RegisterInputDevice(inputDev);如果(ret!=HDF_SUCCESS){转到EXIT1;}chipDev->driver->inputDev=inputDev;chipDev->ops->SetAbility(芯片开发);返回HDF_SUCCESS;EXIT1:OsalMemFree(inputDev);EXIT:chipDev->driver->device=NULL;返回HDF_FAILURE;}./drivers/framework/model/input/driver/hdf_input_device_manager.c(Devicester*inputDev){int32_tret;HDF_LOGI("%s:输入",__func__);if(inputDev==NULL){HDF_LOGE("%s:inputdevisnull",__func__);返回HDF_ERR_INVALID_PARAM;}if((g_inputManager==NULL)||(g_inputManager->initialized==false)){HDF_LOGE("%s:devmanagerisnullorinitializedfailed",__func__);返回HDF_FAILURE;}OsalMutexLock(&g_inputManager->mutex);/*ApplicationID,不同输入设备的ID是唯一的*/ret=AllocDeviceID(inputDev);如果(ret!=HDF_SUCCESS){转到退出;}/*该函数包含对hid设备的特殊处理,对于触摸屏驱动,该函数无实质操作;*/ret=CreateDeviceNode(inputDev);如果(ret!=HDF_SUCCESS){转到EXIT1;}/*需要IOService能力将数据从内核模式传输到用户模式。请缓冲*/ret=AllocPackageBuffer(inputDev);如果(ret!=HDF_SUCCESS){转到EXIT1;}/*将输入设备添加到设备全局管理列表中*/AddInputDevice(inputDev);OsalMutexUnlock(&g_inputManager->mutex);HDF_LOGI("%s:exitsucc,devCountis%d",__func__,g_inputManager->devCount);返回HDF_SUCCESS;EXIT1:DeleteDeviceNode(inputDev);EXIT:OsalMutexUnlock(&g_inputManager->mutex);returnret;}HDI接口层框架输入模块HDI(HardwareDriverInterface)接口定义和实现,为上层输入服务提供操作输入设备的驱动能力接口,HDI接口主要包括以下三个类:InputManager:管理输入设备,包括输入设备打开、关闭、设备列表信息获取等InputReporter:负责上报输入事件,包括注册和注销数据上报回调函数等InputController:提供输入设备的服务控制接口,包括获取设备信息和设备类型,设置电源状态等。目录Drivers_peripheral仓库下的源代码目录结构如下/drivers/peripheral/input├──hal#输入模块的hal层代码│└──include#输入模块hal层内部的头文件│└──src#输入模块hal层代码的具体实现├──interfaces#输入模块向上层服务提供的驱动能力接口│└──include#输入模块向上层服务提供的接口定义outsideworld├──test#输入模块的测试代码│└──unittest#输入模块单元测试代码说明**drivers_peripheral**仓库的核心功能是为上层输入系统提供Input驱动能力接口服务调用,提供的驱动能力接口统一为HDI接口层。使用以下简要示例代码来说明InputHDI接口的使用:#include"input_manager.h"#defineDEV_INDEX1IInputInterface*g_inputInterface;InputReportEventCbg_callback;/*定义数据上报的回调函数*/staticvoidReportEventPkgCallback(constEventPackage**pkgs,uint32_tcount){if(pkgs==NULL||count>MAX_PKG_NUM){返回;}for(uint32_ti=0;itype,pkgs[i]->code,pkgs[i]->value);}}intInputServiceSample(void){uint32_tdevType=INIT_DEFAULT_VALUE;/*获取Input驱动能力接口*/intret=GetInputInterface(&g_inputInterface);if(ret!=INPUT_SUCCESS){HDF_LOGE("%s:获取输入接口失败,ret=%d",__func__,ret);返还;}INPUT_CHECK_NULL_POINTER(g_inputInterface,INPUT_NULL_PTR);INPUT_CHECK_NULL_POINTER(g_inputInterface->iInputManager,INPUT_NULL_PTR);/*打开特定的输入设备*/ret=g_inputInterface->iInputManager->OpenInputDevice(DEV_INDEX);if(ret){HDF_LOGE("%s:打开输入设备失败,ret=%d",__func__,ret);返还;}INPUT_CHECK_NULL_POINTER(g_inputInterface->iInputController,INPUT_NULL_PTR);/*获取对应输入设备的类型*/ret=g_inputInterface->iInputController->GetDeviceType(DEV_INDEX,&devType);if(ret){HDF_LOGE("%s:获取设备类型失败,ret:%d",__FUNCTION__,ret);返还;}HDF_LOGI("%s:device1的类型是%u\n",__FUNCTION__,devType);/*向特定输入设备报告注册数据的回调函数*/g_callback.ReportEventPkgCallback=ReportEventPkgCallback;INPUT_CHECK_NULL_POINTER(g_inputInterface->iInputReport,INPUT_NULL_PTR);ret=g_inputInterface->iInputReporter->RegisterReportCallback(DEV_INDEX,&g_callback);if(ret){HDF_LOGE("%s:注册回调失败,ret:%d",__FUNCTION__,ret);返还;}HDF_LOGI("%s:等待10s测试,请触摸panelnow",__FUNCTION__);??OsalMSleep(KEEP_ALIVE_TIME_MS);/*注销特定输入设备上的回调函数*/ret=g_inputInterface->iInputReporter->UnregisterReportCallback(DEV_INDEX);if(ret){HDF_LOGE("%s:unregistercallbackfailed,ret:%d",__FUNCTION__,ret);returnret;}/*关闭特定输入设备*/ret=g_inputInterface->iInputManager->CloseInputDevice(DEV_INDEX);if(ret){HDF_LOGE("%s:closedevicefailed,ret:%d",__FUNCTION__,ret);returnret;}return0;}更多内容请访问:与华为官方共建的鸿蒙技术社区https://ost.51cto.com

最新推荐
猜你喜欢