OpenHarmony开发者论坛
标题:
OpenHarmony的HCB文件格式介绍
[打印本页]
作者:
润开鸿_闻飞
时间:
2024-6-3 13:46
标题:
OpenHarmony的HCB文件格式介绍
[md][itopen组织](
https://gitee.com/itopen
)
1、提供OpenHarmony优雅实用的小工具
2、手把手适配riscv + qemu + linux的三方库移植
3、未来计划riscv + qemu + ohos的三方库移植 + 小程序开发
4、一切拥抱开源,拥抱国产化
## 一、HCS文件(部分)
```mak
root {
device_info {
match_attr = "hdf_manager";
template host {
hostName = "";
priority = 100;
template device {
template deviceNode {
policy = 0;
priority = 100;
preload = 0;
permission = 0664;
moduleName = "";
serviceName = "";
deviceMatchAttr = "";
}
}
}
}
}
```
### 1.1 类别描述
- root、template host、template device等属于节点名称
- match_attr、hostName、priority等属于属性名称
- ""、100、0664等属于属性值
### 1.2 HCB的介绍
系统编译后,在out/hispark_taurus/ipcamera_hispark_taurus/gen/vendor/hisilicon/hispark_taurus/hdf_config目录下生成hdf_hex.c和hdf.hcb文件,其中hdf.hcb文件是hcs文件对应的二进制文件,而hdf_hex.c文件是将hcb文件内容以字符形式转换成了数组,同时将生成一个获取数组名和长度的函数。
## 二、HCB文件介绍(部分)
```c
static const unsigned char g_hdfConfigEntrySymbol[] = {
0x0a, 0xa0, 0x0a, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x90, 0x04, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x72, 0x6f, 0x6f, 0x74, 0x00, 0x00, 0x00, 0x00,
0x60, 0xfb, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
0x00, 0x00, 0x00, 0x00, 0x7c, 0x1c, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x69, 0x32, 0x63, 0x5f,
0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x00, 0x00, 0xcc, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
0x68, 0x69, 0x73, 0x69, 0x6c, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x68, 0x69, 0x33, 0x35, 0x78, 0x78,
0x5f, 0x69, 0x32, 0x63, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6e, 0x74,
0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x30, 0x78, 0x31, 0x32, 0x30, 0x62, 0x30, 0x30, 0x30,
0x30, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x62, 0x75, 0x73, 0x00,
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x72, 0x65, 0x67, 0x5f,
0x70, 0x62, 0x61, 0x73, 0x65, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x12,
0x02, 0x00, 0x00, 0x00, 0x72, 0x65, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x69, 0x72, 0x71, 0x00,
...
}
```
### 2.1 Header部分介绍
### 2.1.1 Header结构体
```c
struct HbcHeader {
uint32_t magicNumber;
uint32_t versionMajor;
uint32_t versionMinor;
uint32_t checkSum;
int32_t totalSize;
};
```
#### 2.1.1 一定是以0xA00AA00A值开头才是合法的HCB文件,注意大小端字节序
小端字节序中,0x12345678表示的是0x78, 0x56, 0x34, 0x12
#### 2.1.2 大小检测
```c
// 当HbcHeader->totalSize > 0时候
blobLength = HBC_HEADER_LENGTH + header->totalSize;
g_byteAlign = false;
// 当HbcHeader->totalSize <= 0时候
blobLength = HBC_HEADER_LENGTH - header->totalSize;
g_byteAlign = true;
// 最后
sizeof(g_hdfConfigEntrySymbol) == blobLength == 64388 == 0xFB84
```
在我们Hispark_Taurus中
```c
HbcHeader->totalSize = 0xFFFF0490 < 0
blobLength = HBC_HEADER_LENGTH - header->totalSize = 0xFB84
g_byteAlign = true;
```
### 2.2 节点/属性介绍
从Header之后每个数据前都有4位校验位
当g_byteAlign = true时
校验位值为0x1时候表示的是节点,后面跟节点的名字,如
```c
0x01, 0x00, 0x00, 0x00, 0x72, 0x6f, 0x6f, 0x74
前面的0x01, 0x00, 0x00, 0x00表示的是后面跟的是节点
节点名字是0x72, 0x6f, 0x6f, 0x74,对应的是root
```
校验位值为0x2时候表示的是属性,后面跟属性的名字,如
```c
0x02, 0x00, 0x00, 0x00, 0x72, 0x65, 0x67, 0x5f,
0x70, 0x62, 0x61, 0x73, 0x65, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x12,
前面的0x02, 0x00, 0x00, 0x00表示的是后面跟的是属性
属性名字是0x72, 0x65, 0x67, 0x5f, 0x70, 0x62, 0x61, 0x73, 0x65, 0x00, 0x00, 0x00,对应的是reg_pbase
属性后面的四位表示的是属性值的类型,这里是0x12, 0x00, 0x00, 0x00表示的是CONFIG_DWORD即后面是32位整形
0x00, 0x00, 0x0b, 0x12,对应的值为0x120b0000
```
[/md]
欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/)
Powered by Discuz! X3.5