首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >OpenHarmony 移植案例与原理 - HDF驱动框架-驱动配置(1)

OpenHarmony 移植案例与原理 - HDF驱动框架-驱动配置(1)

原创
作者头像
小帅聊鸿蒙
发布2025-06-17 21:15:21
发布2025-06-17 21:15:21
19200
代码可运行
举报
文章被收录于专栏:鸿蒙开发笔记鸿蒙开发笔记
运行总次数:0
代码可运行

HCS(HDF Configuration Source)是HDF驱动框架的配置描述源码,内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置管理。应该,类似Linux DTS(Device Tree Source)设备树。

HC-GEN(HDF Configuration Generator)是HCS配置转换工具,可以将HDF配置文件转换为软件可读取的文件格式。类似的,在Linux下,可以将DTS转换为DTB(Device Tree Blob,设备树数据二进制编码),使用的工具是DTC。

对于HC-GEN,对不同性能的环境,采用不同的策略,如下。现在还不清楚,高弱性能环境是如何定义的。

  • 在弱性能环境中,转换为配置树源码,驱动可直接调用C代码获取配置。
  • 在高性能环境中,转换为HCB(HDF Configuration Binary)二进制文件,驱动可使用HDF框架提供的配置解析接口获取配置。

使用HCB模式的配置使用流程如下图,HCS经过HC-GEN编译生成HCB文件,HDF驱动框架中的HCS Parser模块会从HCB文件中重建配置树,HDF驱动模块使用HCS Parser提供的配置读取接口获取配置内容。

1、HCS 配置语法

1.1 HCS使用的关键字

关键字

描述

备注

root

配置根节点

include

引用其他HCS配置文件

delete

删除节点和属性

只能删除include引入的节点或属性

template

定义模板节点

match_attr

用于标记节点的匹配查找属性

解析配置时可以使用该属性的值查找到对应节点

关键字include、delete、template可以在文件drivers\framework\tools\leagecy\hc-gen\src\hcs_compiler.l中找到:

代码语言:c
代码运行次数:0
运行
复制
"root"              { LEXER_DEBUG("root\n"); return ROOT; }
"true"              { HcsCompilerlval.i = 1; return NUMBER; }
"false"             { HcsCompilerlval.i = 0; return NUMBER; }
"#include"          { LEXER_DEBUG("INCLUDE\n"); return INCLUDE; }
"delete"            { return DELETE; }
"template"          { return TEMPLATE; }

关键字match_attr应该是定义在文件drivers\framework\utils\include\hcs_tree_if.h中。

代码语言:c
代码运行次数:0
运行
复制
#define HCS_MATCH_ATTR "match_attr"

1.2 基本组成结构

HCS配置文件主要由属性attribute和节点node两部分组成。

1.2.1 属性

属性即最小的配置单元,是一个独立的配置项。语法如下,类似键值对,attribute 必须以分号(;)结束且必须属于一个node。

代码语言:c
代码运行次数:0
运行
复制
  attribute_name = value;

其中:

  • 属性名称attribute_name: 字母、数字、下划线的组合且必须以字母或下划线开头,字母区分大小写。
  • 属性值value: 可用格式为:数字常量,支持二进制、八进制、十进制、十六进制数,具体参考数据类型部分;字符串,内容使用双引号(“”)引用;节点引用。

1.2.2 节点

节点是一组属性的集合,语法如下,大括号后无需添加结束符“;”。其中,node_name 是字母、数字、下划线的组合且必须以字母或下划线开头,字母区分大小写。

代码语言:c
代码运行次数:0
运行
复制
  node_name {
      module = "sample";
      ...
  }

每个配置表必须以root节点开始,用于声明配置表的根节点。root节点中必须包含module属性,其值应该为一个字符串,用于表征该配置所属模块。节点中还可以增加match_attr属性,其值为一个全局唯一的字符串。在解析配置时,通过该属性值,调用查找节点可以查找到包含该属性的节点。

1.2.3 数据类型

在属性定义中使用自动数据类型,不显式指定类型,属性支持的数据类型如下。

1.2.3.1 整型

整型长度自动推断,根据实际数据长度给与最小空间占用的类型。

  • 二进制,0b前缀,示例:0b1010。
  • 八进制,0前缀,示例:0664。
  • 十进制 ,无前缀,且支持有符号与无符号,示例:1024,+1024均合法。负值在读取时注意使用有符号数读取接口。
  • 十六进制,0x前缀,示例:0xff00、0xFF。
1.2.3.2 字符串

字符串使用双引号(“”)表示。

1.2.3.3 数组

数组元素支持整型、字符串,不支持混合类型。整型数组中uint32_t uint64_t混用会向上转型为uint64_t 数组。整型数组与字符串数组示例如下

代码语言:c
代码运行次数:0
运行
复制
attr_foo = [0x01, 0x02, 0x03, 0x04];
attr_bar = ["hello", "world"];
1.2.3.4 bool类型

bool类型中true表示真,false表示假。

1.2.4 include预处理

用于导入其他HCS文件。语法示例如下,文件名必须使用双引号(“”),不在同一目录使用相对路径引用。被include文件也必须是合法的HCS文件。

多个include,如果存在相同的节点,后者覆盖前者,其余的节点依次展开。

代码语言:c
代码运行次数:0
运行
复制
#include "foo.hcs"
#include "../bar.hcs"

可以参考示例文件device\board\fnlink\hcs\v200zr.hcs,等于板端hcs文件复用soc芯片部分的文件。

代码语言:c
代码运行次数:0
运行
复制
#include "../../../soc/bestechnic/bes2600/liteos_m/components/hdf_config/device_info.hcs"

1.2.5 注释

支持单行和多行两种注释风格。多行注释不支持嵌套,注释示例如下:

代码语言:c
代码运行次数:0
运行
复制
// comment 单行注释

/*
comment 多行注释
comment 多行注释
*/
DD一下:欢迎大家关注工粽号<程序猿百晓生>,可以了解到以下知识点。
代码语言:erlang
复制
`欢迎大家关注工粽号<程序猿百晓生>,可以了解到以下知识点。`
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......

1.2.6 引用修改

引用修改可以实现修改另外任意一个节点的内容,引用修改节点不产生新的节点,只修改另外一个节点。语法如下,表示node中的内容是对source_node节点内容的修改。注意 “:&”是整体,前后各有一个空格。

代码语言:c
代码运行次数:0
运行
复制
 node :& source_node

引用修改有如下注意事项:

  • 引用同级node,可以直接使用node名称,否则被引用的节点必须使用绝对路径,节点间使用“.”分隔,root表示根节点,格式为root开始的节点路径序列,例如root.foo.bar即为一个合法的绝对路径。
  • 如果出现修改冲突(即多处修改同一个属性),编译器将提示warning,因为这种情况下只会生效某一个修改而导致最终结果不确定。

示例如下:

代码语言:c
代码运行次数:0
运行
复制
root {
    module = "sample";
    foo {
        foo_ :& root.bar{
            attr = "foo";
        }
        foo1 :& foo2 {
            attr = 0x2;
        }
        foo2 {
            attr = 0x1;
        }
    }

    bar {
        attr = "bar";
    }
}

假如下述示例保存在文件ref_update.hcs中,可以先生成二进制hcb文件,然后再反编译生成hcs文件,查看效果。其他示例均可采用编译、反编译的方式来查看HCS配置文件的实现效果。

代码语言:c
代码运行次数:0
运行
复制
hc-gen -b ref_update.hcs
hc-gen -d ref_update.hcb

生成反编译的文件ref_update.d.hcs,内容为:

代码语言:c
代码运行次数:0
运行
复制
/*
 * HDF decompile hcs file
 */
root {
    module = "sample";
    foo {
        foo2 {
            attr = 0x2;
        }
    }
    bar {
        attr = "foo";
    }
}

在以上示例中,可以看到foo.foo节点通过引用将bar.attr属性的值修改为了"foo",foo.foo1节点通过引用将foo.foo2.attr属性的值修改为了0x2。foo.foo以及foo.foo1节点表示对目标节点内容的修改,其自身并不会存在最终生成的配置树中。

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力;
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识;
  • 想要获取更多完整鸿蒙最新学习知识点,可关注B站:码牛课堂;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、HCS 配置语法
    • 1.1 HCS使用的关键字
    • 1.2 基本组成结构
      • 1.2.1 属性
      • 1.2.2 节点
      • 1.2.3 数据类型
      • 1.2.4 include预处理
      • 1.2.5 注释
      • 1.2.6 引用修改
    • 写在最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档