移植案例与原理 - HDF驱动框架-驱动配置(2) 原创 精华

发布于 2022-2-17 20:52
浏览
1收藏

移植案例与原理 - HDF驱动框架-驱动配置(2)
【本文正在参与优质创作者激励】

1.2.7 节点复制

节点复制可以实现在节点定义时从另一个节点先复制内容,用于定义内容相似的节点。语法如下,表示在定义"node"节点时将另一个节点"source_node"的属性复制过来。

 node : source_node

示例如下,编译后bar节点既包含attr_0属性也包含attr_1属性,在bar中对attr_0的修改不会影响到foo。在foo和bar在同级node中可不指定foo的路径,否则需要使用绝对路径引用。

root {
	module = "sample";
    foo {
        attr_0 = 0x0;
    }
    bar:foo {
        attr_1 = 0x1;
    }
}

上述代码的最终生成配置树为,可以通过编译为hcb,然后反编译确认效果。

root {
    module = "sample";
    foo {
        attr_0 = 0x0;
    }
    bar {
        attr_1 = 0x1;
        attr_0 = 0x0;
    }
}

1.2.8 属性引用

为了在解析配置时快速定位到关联的节点,可以把节点作为属性的右值,通过读取属性查找到对应节点。语法如下,表示attribute的值是一个节点node的引用,在解析时可以用这个attribute快速定位到node,便于关联和查询其他node。

 attribute = &node;

示例如下:

root {
    module = "sample";
    node1 {
        attribute1 = "value1";
    }
    node2 {
        attr_1 = &node1;
    }
}

注意:不知道为什么,该示例编译报错,已提交reference invalid node issue跟踪。

ref_update.hcs:7 reference invalid node 'node1'

1.2.9 删除

要对include导入的base配置树中不需要的节点或属性进行删除,可以使用delete关键字。下面的举例中sample1.hcs通过include导入了sample2.hcs中的配置内容,并使用delete删除了sample2.hcs中的attribute2属性和foo_2节点,示例如下:

// sample2.hcs
root {
    module = "sample2";
    attr_1 = 0x1;
    attr_2 = 0x2;
    foo_2 {
        t = 0x1;
    }
}

// sample1.hcs
#include "sample2.hcs"
root {
    module = "sample1";
    attr_2 = delete;
    foo_2 : delete {
    }
}

编译sample1.hcs文件,在生成过程中将会删除root.foo_2节点与attr_2,最终生成配置树效果为:

/*
 * HDF decompile hcs file
 */

root {
    attr_1 = 0x1;
    module = "sample1";
}

1.2.10 模板

模板的用途在于生成严格一致的node结构,以便对同类型node进行遍历和管理。使用template关键字定义模板node,子node通过双冒号“::”声明继承关系。子节点可以改写但不能新增和删除template中的属性,子节点中没有定义的属性将使用template中的定义作为默认值。示例如下:

root {
    module = "sample";
    template foo {
        attr_1 = 0x1;
        attr_2 = 0x2;
    }

    bar :: foo {
    }

    bar_1 :: foo {
        attr_1 = 0x2;
    }
}

生成配置树效果如下:

root {
    module = "sample";
    bar {
        attr_1 = 0x1;
        attr_2 = 0x2;
    }
    bar_1 {
        attr_1 = 0x2;
        attr_2 = 0x2;
    }
}

2、hc-gen配置生成

从上文可知,hc-gen是配置生成的工具,可以对HCS配置语法进行检查并把HCS源文件转化成HCB二进制文件。hc-gen的源代码目录在drivers\framework\tools\hc-gen,

以./out/v200zr/xts_demo/obj/drivers/framework/tools/hc-gen/hc-gen为例,执行下可以输出使用帮助信息:

zhushangyuan@OHOS:~/openharmony$ ./out/v200zr/xts_demo/obj/drivers/framework/tools/hc-gen/hc-gen
Usage: hc-gen [Options] [File]
options:
  -a            hcb align with four bytes
  -b            output binary output, default enable
  -t            output config in C language source file style
  -m            output config in macro file style
  -i            output binary hex dump in C language source file style
  -p <prefix>   prefix of generated symbol name
  -d            decompile hcb to hcs
  -V            show verbose info
  -v            show version
  -h            show this help message

注意,还有个-o选项,可以指定输出文件的名字。

2.1 生成.c/.h文件

生成.c/.h文件的命令如下,其中$SourceHcsFileName为HCS文件路径。

hc-gen -t $SourceHcsFileName

实际例子,可以使用openharmony/device/soc/bestechnic/bes2600/liteos_m/components/hdf_config/device_info.hcs文件,执行命令如下。执行后,可以在目录~/openharmony/device/soc/bestechnic/bes2600/liteos_m/components/hdf_config下看到生成的device_info.h和device_info.c文件。

cd ~/openharmony/device/soc/bestechnic/bes2600/liteos_m/components/hdf_config
~/openharmony/out/v200zr/xts_demo/obj/drivers/framework/tools/hc-gen/hc-gen -t device_info.hcs

2.2 生成HCB文件

生成HCB二进制文件的命令如下,其中$SourceHcsFileName为HCS文件路径。

hc-gen -b $SourceHcsFileName

2.3 生成宏定义文件

生成宏定义文件的命令如下,其中$SourceHcsFileName为HCS文件路径。使用这个命令只生成.h文件。

hc-gen -m $SourceHcsFileName

2.4 反编译HCB文件为HCS文件

反编译HCB文件为HCS的命令如下,其中$SourceHcbFileName为HCB文件路径。

hc-gen -d $SourceHcbFileName

参考站点

小结

本文介绍了HDF驱动框架配置管理的概念,介绍了HCS及其语法,并介绍了HCB及其用法,后续会介绍更多的HDF驱动框架知识。因为时间关系,仓促写作,或能力限制,若有失误之处,请各位读者多多指正。感谢阅读,有什么问题,请留言。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
2
收藏 1
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐