在进行 NxH3670 BLE Audio System 移植的时候,Partition table 修改是极其重要的一项,在这一篇博文中就以 LPC5528 + NxH3670 BLE Audio System 移植为例,讲解在移植的过程中如何去修改 Partition table。

  1. 什么是 Partition table

想要知道如何去修改,就得先去了解。Partition table 是我们需要存放进 Flash 中的一组数据,数据的长度为 444 个字节,其中里面包含了当前运行的程序代码的版本,以及代码和 Firmware 在 MCU Flash 中存放的位置,在 Headset 系统启动的时候,会根据其中的信息去寻找对应的 Firmware ,发送给 NxH3670 从而进行 Boot Loader,因此 Partition table中保存的数据有误就会影响整个系统的启动;不仅如此,在使用 OTA 功能的时候,也都是以这一部分的数据为基准来进行。

 Partition Table

  1. Partition table 内容解析

Partition Table 的主要有两个部分,由 Partition Header 和 Partition Entry 组成,Partition Header 主要由 Partition Table 的前 12 个字节,其中前两个字节固定为 0xBEBA,是Partition Table 的 signature,在程序中定义的位置寻找到 Partition Table 时,会首先对比前两个字节是否为 0xBEBA,接下来的两个字节说明了当前 Partition Table 包含了几个部分,以及要运行哪一部分的代码,例如 0x0401,则代表当前 Partition Table 中含有四个部分,要运行的是第一部分的代码第五个字节则表示目前 Partition Table 版本,0x40 表示版本为 4.0,往后 3 个字节是 Padding date 数据,最后四个字节是预留字节。



Partition Entry 主要由 Partition Table Entry 的信息组成,包含了 Partition 的名称、大小、类型、以及 Partition 各部分地址,是我们在移植过程中,主要修改的部分。例如下图,前 16 个字节表示该 Partition 的名称,第十七个字节表示这一 Partition 的类型,0x00 表示类型为 Firmware,0x01 表示类型为 Date。第 18~20 个字节为Padding data 数据, 目前没有使用。



接下来则是该 Partition 各个部分的 Entry的地址信息,下面会一边修改一边为大家讲解。

  1. Partition table 修改

在工程移植完成后,如果 Partition table 中的数据没有对应的进行修改,系统 Boot Loader 时就会出错,因此为了确保系统的正常启动,需要根据实际对 Partition table 进行修改。需要到一个编辑工具对编译出来的 bin 文件进行编辑,可以使用  WinHex。

第一步,用软件打开编译出来的 bin 文件,在实际的应用中,我们通常将 Partition table 放在 MCU Flash 中靠后的位置上,把前面的位置预留给 SSB 以及 Application Code,本次移植中使用到的 MCU 是 NXP 的 LPC5528JBD100,这一款 MCU 的 Flash 有512 KB,因此我们首先可以在 bin 文件中填充 0 ,来扩大 bin 文件,再将 Partition table 插入到 bin 文件中靠后的地址上(在博文后会将 Partition_table.bin 分享给大家),演示中,将 Partition table 放在地址 0x6EC00 上。



在将数据插入到 bin 文件时,需要注意 LPC5528使用在 iap 函数进行 Flash 操作时,需要 512 bytes-aligned,所以为了防止在对某一部分数据进行操作时影响另一部分的数据,我们在 bin 文件中插入的数据也要进行 512 bytes-aligned。

完成这一步操作之后,需要到程序中对定义的 Partition table 的位置进行修改,打开partition_table.h,修改为我们实际放入 Flash 的地址。



这样在系统启动的时候,就会到 Flash 中的地址去寻找 Partition table。在 Headset 的例程中,我们希望 NxH3670 在完成 Boot Loader 时,运行 Headset 对应的 Firmware。首先要将 Headset 的 Firmware 也插入到 bin 文件中,演示中我们将其插入到地址 0x50000 上(博文后面会把完整的 BIN 文件给大家,可以去里面找对应的 Firmware)。



bin 文件中加入 Firmware 后,我们需要去修改 Partition table 中对应的信息。在 Partition table 中 0x0401表示要运行的是 Partition Table Entry 1 部分的代码,所以对应去修改Partition Table Entry 1 中的内容。



前面的 20 个字节,已经讲过,是 Partition Table Entry 的名字,类型和 Padding data 数据,这一部分,不需要去修改。



但是我们刚刚将对应的 Firmware 插入到了 0x50000 这个地址,所以需要修改其中的这八个字节,前四个表示了该部分 Entry 的开始地址,修改后为 0x50000,后四个字节表示这部分整体的大小,根据实际进行修改。修改时注意数据的顺序。



接下来的我们需要修改 Partition Table Entry 每一部分的地址(每一部分数据的前四个字节均为 0xCA、0xFE、0xBA、0xBE ),首先是第一部分,这四个字节表示我们第一部分的偏移量,第一部分的地址为 0x50000 ,偏移量为 0,因此这里填入的是 0x00。



根据插入的第二部分的数据的地址,0x64400 得出我们相对于开始地址的偏移量 0x14400。



所以修改第二部分数据的偏移量为 0x14400。



以此类推,插入的第三部分数据地址为 0x68200。



所以修改第三部分数据的偏移量为 0x18200。

 

每一个 Entry 都有最多可以存储 9 个部分的数据,这里使用到了前三个部分,所以在第四到第九个部分中,我们填入 0Xffffffff,来表示这些部分没有数据。



最后的八个字节则是预留的空间。



以上就完成了 Partition Table Entry,启动时,就可以通过 Log 看到,程序会根据我们填入的地址以及偏移量去完成 Boot Loader。



参考资料:   

1.     NXH3670 Datasheet              —  NXH3670UK; 2019, NXP Semiconductors
2.     AN12360 application note    —  NXH3670 Gaming; 2019, NXP Semiconductors
3.     AN11953 application note    —  Boot loader; 2019, NXP Semiconductors
4.     Partition_table讲解         

技术文档

类型标题档案
操作手册Partition Table 解析