积分305 / 贡献0

提问7答案被采纳4文章45

[开发者活动] OpenHarmony的HCB文件格式介绍 原创

润开鸿_闻飞 显示全部楼层 发表于 2024-6-3 13:46:08

itopen组织 1、提供OpenHarmony优雅实用的小工具 2、手把手适配riscv + qemu + linux的三方库移植 3、未来计划riscv + qemu + ohos的三方库移植 + 小程序开发 4、一切拥抱开源,拥抱国产化

一、HCS文件(部分)

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文件介绍(部分)

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结构体

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 大小检测

// 当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中

HbcHeader->totalSize  = 0xFFFF0490 < 0
blobLength = HBC_HEADER_LENGTH - header->totalSize = 0xFB84
g_byteAlign = true;

2.2 节点/属性介绍

从Header之后每个数据前都有4位校验位

当g_byteAlign = true时

校验位值为0x1时候表示的是节点,后面跟节点的名字,如

0x01, 0x00, 0x00, 0x00, 0x72, 0x6f, 0x6f, 0x74
前面的0x01, 0x00, 0x00, 0x00表示的是后面跟的是节点
节点名字是0x72, 0x6f, 0x6f, 0x74,对应的是root

校验位值为0x2时候表示的是属性,后面跟属性的名字,如

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

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部