CDT介绍及构建方法

  • CDT简介
  • CDT Header
  • CDT metadata分区
  • CDB data分区
  • 创建新的oemcfg(CDT)分区


CDT简介

CDT分区(也称为OEMcfg分区)基础的单元(unit)是CDB(configuration data block),每个CDB都是用户定义的一块数据, OEMcfg分区本质上是由多个或单个CDB及有关CDB的元数据组成的一个表。通常由三个部分组成:CDT Header、metadata分区及CDB 数据分区。
该分区通常在启动时加载到asinfo info,根据该分区内的board id来匹配程序
通常大小不超过2Mb。

CDT Header

由16个字节数据组成,分别为:
magic number:一个 4 字节的值,用于验证 oemcfg 数据是否存在,通常其值为0x4f454d00
version number:2个字节,表示分区的版本信息
reserved:2个4字节的区域,保留。

CDT metadata分区

metadata分区通常就紧挨着header分区保存,每个CDB都有对应的metadata保存在该分区,每个metadata分区包含CDB分区的偏移地址及大小信息。
其中offset及size分别占用两个字节。

CDB的数量最少1个最多3个,有些情况只需要CDB0分区。

CDB data分区

在实际使用中通常包含至少1个至多3个CDB分区。

第1个CDB(CDB0)是必须要有的,保存的platform_id(可称为 board id),包含oemcfg version、platform type、platform version、platform subtype等信息。大小必须为6个字节。系统据此来选择main device tree,此包含系统启动必要的设备树。

第2个CDB(CDB1)不是必须的,定义了flavor_id, 用来匹配DTBO(device tree overlay blob),在系统启动过程中,系统根据此值来选择不同的dtbo文件并覆盖到主dtb。其size必须为1,值为0-10. 0代表没有dtbo覆盖,1-10代表在build中定义的不同dtbo文件。

第3个CDB(CDB2)也不是必须的,定义了 raw oem_data,这个数据快可以有1.5Mb大小。如果用到第3个(CDB2)分区,则第2个CDB(CDB1)是必须要设置的,如果用户没有dtbo文件需要覆盖,可以将其设置为0。

CDB0 保存的是硬件的platform id,也称为board id,通常由6个字节组成。源代码根据board id来匹配硬件。包含oemcfg version
CDB1 为flavor id 用于区分同一平台上部分硬件的差异,比如用到不同的audio,通过判断flavor id的值来选择不同的dtbo,然后加载到主设备树上,实现区分不同硬件的目的
CDB2 为raw data分区,用以保存客户自定义的数据,可以在启动时读写。

创建新的oemcfg(CDT)分区

通常源码中包含生成oemcfg 二进制的py脚本

qnx/qcom_qnx/apps/qnx_ap/AMSS/platform/utilities/oemcfg_partition/dt_config/dt_config_generator.py

需要预先创建关于CDT分区配置的xml文件如下 oemcfg_test.xml

<?xml version="1.0" ?>
<dal>
  <module name="config_data_table">
    <driver name="NULL">
      <device id="oemcfg_header">
        <props name="magic-number" type="DALPROP_ATTR_TYPE_BYTE_SEQ">
          0x4F, 0x45, 0x4D, 0x00, end
        </props>
        <props name="version" type="DALPROP_ATTR_TYPE_BYTE_SEQ">
          0x01, 0x00, end
        </props>
        <props name="reserved1" type="DALPROP_ATTR_TYPE_BYTE_SEQ">
          0x00, 0x00, 0x00, 0x00, end
        </props>
        <props name="reserved2" type="DALPROP_ATTR_TYPE_BYTE_SEQ">
          0x00, 0x00, 0x00, 0x00, end
        </props>
      </device>
      <device id="cdb0">
        <props name="platform_id" type="DALPROP_ATTR_TYPE_BYTE_SEQ">
          0x03, 0x19, 0x00, 0x00, 0x00, 0x00, end
        </props>
      </device>
      <device id="cdb1">
        <props name="flavor_id" type="DALPROP_ATTR_TYPE_BYTE_SEQ">
          0x01, end
        </props>
      </device>
      <device id="cdb2">
        <props name="oem_data" type="DALPROP_ATTR_TYPE_BYTE_SEQ">
          0x99, 0x99, end
        </props>
      </device>
    </driver>
  </module>
</dal>

然后执行以下命令即可:
python dt_config_generator.py <oemcfg XML file name> <binary oemcfg partition image file name>
例如:
python dt_config_generator.py oemcfg_test.xml oemcfg_test.bin