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