新手笔记——HDF驱动框架

拓维云创joyniy
发布于 2021-10-15 16:25
浏览
1收藏

harmony驱动框架示意:
新手笔记——HDF驱动框架-鸿蒙开发者社区
设备配置:
HDF使用HCS作为配置描述源码,该步骤有点像Linux驱动开发中配置设备树文件。配置相应的设备后,HDF会在加载设备的过程中,将该配置文件展开到内核代码中。配置示例如下所示:

root {
    device_info {
        match_attr = "hdf_manager";
        template host {       // host模板,继承该模板的节点(如下sample_host)如果使用模板中的默认值,则节点字段可以缺省
            hostName = "";
            priority = 100;
            template device {
                template deviceNode {
                    policy = 0;
                    priority = 100;
                    preload = 0;
                    permission = 0664;
                    moduleName = "";
                    serviceName = "";
                    deviceMatchAttr = "";
                }
            }
        }
        sample_host :: host{
            hostName = "host0";    // host名称,host节点是用来存放某一类驱动的容器
            priority = 100;        // host启动优先级(0-200),值越大优先级越低,建议默认配100,优先级相同则不保证host的加载顺序
            device_sample :: device {        // sample设备节点
                device0 :: deviceNode {      // sample驱动的DeviceNode节点
                    policy = 1;              // policy字段是驱动服务发布的策略
                    priority = 100;          // 驱动启动优先级(0-200),值越大优先级越低,建议默认配100,优先级相同则不保证device的加载顺序
                    preload = 0;             // 驱动按需加载字段,在本章节最后的说明有详细介绍
                    permission = 0664;       // 驱动创建设备节点权限
                    moduleName = "sample_driver";   // 驱动名称,该字段的值必须和驱动入口结构的moduleName值一致
                    serviceName = "sample_service";    // 驱动对外发布服务的名称,必须唯一
                    deviceMatchAttr = "sample_config"; // 驱动私有数据匹配的关键字,必须和驱动私有数据配置表中的match_attr值相等
                }
            }
        }
    }
} 

有空研究下,系统是怎么将设备描述文件传递给驱动的。

驱动代码编写:
驱动代码

// 定义驱动入口的对象,必须为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);

上诉代码为HDF驱动框架注册驱动,其中HDF_INIT()类似于Linux驱动开发中也需要通过module_init()和module_exit(),只是HDF驱动框架只需要注册代码,注销的时候会自动释放。HdfDriverEntry结构体类似于Linux驱动中的file_operation结构体的作用。
编译驱动:
HDF框架提供了Makefile文件格式,如下所示:

include $(LITEOSTOPDIR)/../../drivers/adapter/lite/khdf/lite.mk #导入hdf预定义内容,必需
MODULE_NAME :=    #生成的结果文件
LOCAL_INCLUDE :=  #本驱动的头文件目录
LOCAL_SRCS :=     #本驱动的源代码文件
LOCAL_CFLAGS :=  #自定义的编译选项
include $(HDF_DRIVER) #导入模板makefile完成编译

在驱动代码路径下按照HDF框架提供的格式编写Makefile文件,然后编译。假如想将驱动编译结构文件直接链接到内核镜像,添加到vendor目录下的hdf_vendor.mk里面,示意如下:

LITEOS_BASELIB +=  -lxxx  #链接生成的静态库
LIB_SUBDIRS    +=         #驱动代码Makefile的目录

在harmony系统学习,我还是一个新人,以上内容,如有错误,请帮忙指正。

2
收藏 1
回复
举报
回复
    相关推荐