鸿蒙hdf框架,疯壳-鸿蒙OS-HDF驱动框架

鸿蒙hdf框架,疯壳-鸿蒙OS-HDF驱动框架

2023年6月26日发(作者:)

鸿蒙hdf框架,疯壳-鸿蒙OS-HDF驱动框架⼀、简介HDF(HarmonyOS Driver Foundation)驱动框架,为驱动开发者提供驱动框架能⼒,包括驱动加载、驱动服务管理和驱动消息机制。旨在构建统⼀的驱动架构平台,为驱动开发者提供更精准、更⾼效的开发环境,⼒求做到⼀次开发,多系统部署。驱动加载:HDF驱动加载包括按需加载和按序加载:1.驱动按需加载HDF框架⽀持驱动在系统启动过程中默认加载,或者在系统启动之后动态加载。2.驱动按序加载HDF框架⽀持驱动在系统启动的过程中按照驱动的优先级进⾏加载。驱动服务管理:HDF框架可以集中管理驱动服务,开发者可直接通过HDF框架对外提供的能⼒接⼝获取驱动相关的服务。驱动消息机制:HDF框架提供统⼀的驱动消息机制,⽀持⽤户态应⽤向内核态驱动发送消息,也⽀持内核态驱动向⽤户态应⽤发送消息。⼆、驱动模型HDF框架以组件化的驱动模型作为核⼼设计思路,为开发者提供更精细化的驱动管理,让驱动开发和部署更加规范。HDF框架将⼀类设备驱动放在同⼀个host⾥⾯,开发者也可以将驱动功能分层独⽴开发和部署,⽀持⼀个驱动多个node,HDF框架管理驱动模型如下图所⽰:三、驱动开发实例接下来⼏个课程中,我们将⼿把⼿带⼤家进⾏鸿蒙OS驱动开发,具体内容涉及:驱动添加驱动服务管理驱动消息机制此外这个过程中还会设计到HCS(HDF驱动框架配置描述)等内容。本⽂档接下来的内容会先给⼤家讲解如何添加驱动。四、鸿蒙OS驱动添加A)在源码路径:/home/test/hmos2/vendor/huawei/hdf下创建⼀个test⽂件夹,⽤来保存我们新添的驱动⽂件,如下:B)在test⽂件夹下新建⼀个sample_driver.c的驱动⽂件,并编写我们的驱动代码,如下:Ps:源码具体内容在后⽂附上!D)此时驱动⽂件默认是不参与编译的,接下来我们需要做⼀下驱动⽂件编译必要的配置⼯作:添加驱动配置信息驱动配置分为两个部分——HDF框架定义的驱动设备描述和驱动的私有配置信息驱动设备描述:HDF框架加载驱动所需要的信息来源于HDF框架定义的驱动设备描述,因此该项是驱动添加的必选项,我们需要在HDF框架定义的配置⽂件中添加对应的设备描述,打开源码路径:vendor/hisi/hi35xx/hi3518ev300/config/device_info/下的device_info/device_⽂件,新添我们的设备驱动描述信息。此处设备描述信息添加有两种⽅式,第⼀种是新建⼀个sample_host节点:sample_host :: host{hostName = "host0"; // host名称,host节点是⽤来存放某⼀类驱动的容器priority = 100; // host启动优先级(0-200),值越⼤优先级越低,建议默认配100,优先级相同则不保证host的加载顺序device_sample :: device { // sample设备节点device0 :: deviceNode { // sample驱动的DeviceNode节点policy = 2; // policy字段是驱动服务发布的策略priority= 100; // 驱动启动优先级(0-200),值越⼤优先级越低,建议默认配100,优先级相同则不保证device的加载顺序preload = 0; // 驱动按需加载字段permission = 0664; // 驱动创建设备节点权限moduleName = "sample_driver"; // 驱动名称,该字段的值必须和驱动⼊⼝结构的moduleName值⼀致serviceName = "sample_service"; // 驱动对外发布服务的名称,必须唯⼀deviceMatchAttr = "sample_config"; // 驱动私有数据匹配的关键字,必须和驱动私有数据配置表中的match_attr值相等}}}添加的结果如下图所⽰:另⼀种⽅式在原有源码配置plaform节点中添加(此时添加认为新增的驱动跟platform中的设备是同类设备):device_sample :: device {device0 :: deviceNode {policy = 2;priority = 0;permission = 0644;moduleName = "sample_driver";serviceName = "sample_service";deviceMatchAttr = "sample_driver";}}添加的结果如下图所⽰:以上内容中驱动服务发布策略policy为2表⽰驱动对内核态和⽤户态都发布服务。priority(取值范围为整数0到200)是⽤来表⽰host和驱动的优先级,即驱动按序加载,不同的host内的驱动,host的priority值越⼩,驱动加载优先级越⾼;同⼀个host内驱动的priority值越⼩,加载优先级越⾼。preload 字段取值为如下的枚举量:typedef enum {DEVICE_PRELOAD_ENABLE = 0,DEVICE_PRELOAD_DISABLE,DEVICE_PRELOAD_INVALID} DevicePreload;配成0(DEVICE_PRELOAD_ENABLE ),则系统启动过程中默认加载;配成1(DEVICE_PRELOAD_DISABLE),则系统启动过程中默认不加载,⽀持后续动态加载,当⽤户态获取驱动服务时,如果驱动服务不存在时,HDF框架会尝试动态加载该驱动。驱动私有配置信息:如果驱动有私有配置,则可以添加⼀个驱动的配置⽂件,⽤来填写⼀些驱动的默认配置信息,HDF框架在加载驱动的时候,该配置⾮必须项。在源码路径vendor/hisi/hi35xx/hi3518ev300/config/下新建⼀个test⽂件夹,⽤于存放我们驱动的私有配置⽂件,新增⼀个sample_,⽤来配置驱动私有信息:root{sample_version = 1;author = "fengke team";module = "sample_driver";serviceName = "sample_service";match_attr = "sample_config"; //该字段的值必须和device_中的deviceMatchAttr值⼀致,见上⽂配置}将该私有配置⽂件添加到板级配置⼊⼝⽂件:驱动编译配置项驱动代码的编译必须要使⽤HDF框架提供的Makefile模板进⾏编译,具体可参考驱动⽂件夹test同级⽬录下的sample⽂件中的⽰例。在test⽬录下新增Kconfig⽂件,如下:config LOSCFG_DRIVERS_HDF_PLATFORM_SAMPLEbool "Enable HDF platform sample driver"default ndepends on LOSCFG_DRIVERS_HDF_PLATFORMhelpAnswer Y to enable HDF platform sample driver.在test⽬录下新增Makefile⽂件如下:include $(LITEOSTOPDIR)/ude $(LITEOSTOPDIR)/../../drivers/hdf/lite/LE_NAME := sample_driverLOCAL_CFLAGS += $(HDF_INCLUDE)LOCAL_SRCS += sample__HCS_SRCS += test/sample_AL_CFLAGS += -fstack-protector-strongInclude $(HDF_DRIVER)将上述Kconfig⽂件添加到test⽂件夹同级⽬录下的Kconfig⽂件中:修改test⽂件夹同级⽬录下的hdf_⽂件:Ps: LITEOS_BASELIB += -lsample_driverLIB_SUBDIRS += $(VENDOR_HDF_DRIVERS_ROOT)/test到此我们sample_driver 驱动就已经添加到源码的配置中了,接下来只需编译即可。下⼀节课我们将在此基础上,对驱动相关的内容做更深⼊的探究。谢谢!本课程驱动源码如下:#include "hdf_device_desc.h" // HDF框架对驱动开放相关能⼒接⼝的头⽂件#include "hdf_log.h" // HDF 框架提供的⽇志接⼝头⽂件#define HDF_LOG_TAG sample_driver // 打印⽇志所包含的标签,如果不定义则⽤默认定义的HDF_TAG标签//驱动服务结构的定义struct ISampleDriverService {struct IDeviceIoService ioService; // 服务结构的⾸个成员必须是IDeviceIoService类型的成员//以下可添加⾃定义的驱动的服务接⼝};//驱动对外提供的服务能⼒,将相关的服务接⼝绑定到HDF框架int32_t HdfSampleDriverBind(struct HdfDeviceObject *deviceObject) {// deviceObject为HDF框架给每⼀个驱动创建的设备对象,⽤来保存设备相关的私有数据和服务接⼝if (deviceObject== NULL) {HDF_LOGE("Sample device object is null!");return -1;}static struct ISampleDriverService mysampleDriver;deviceObject->service = &ice;return 0;}// 驱动⾃⾝业务初始的接⼝int32_t HdfSampleDriverInit(struct HdfDeviceObject *deviceObject) {return 0;}// 驱动资源释放的接⼝void HdfSampleDriverRelease(struct HdfDeviceObject *deviceObject) {return;}// 定义驱动⼊⼝的对象,必须为HdfDriverEntry(在hdf_device_desc.h中定义)类型的全局变量struct HdfDriverEntry g_sampleDriverEntry = {.moduleVersion = 1,.moduleName = "sample_driver",.Bind = HdfSampleDriverBind,.Init = HdfSampleDriverInit,.Release = HdfSampleDriverRelease,};// 调⽤HDF_INIT将驱动⼊⼝注册到HDF框架中,在加载驱动时HDF框架会先调⽤Bind函数,再调⽤Init函数加载该驱动,当Init调⽤异常时,HDF框架会调⽤Release释放驱动资源并退出。HDF_INIT(g_sampleDriverEntry);

发布者:admin,转转请注明出处:http://www.yc00.com/web/1687755624a39867.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信