Flash 布局与配置
概述
本章介绍默认 Flash 存储布局及自定义修改方法。
SDK 默认采用如下图所示的 Flash 布局(以 8MB Flash 芯片为例),其中引导清单(boot manifest)的起始地址固定为 0x0800_0000,其他区域的起始地址支持灵活配置。
Item |
物理地址 |
大小 (KB) |
描述 |
|---|---|---|---|
KM4 Bootloader manifest |
0x0800_0000 |
4 |
KM4 启动加载程序 manifest |
KM4 Bootloader |
0x0800_1000 |
76 |
KM4 启动加载程序(代码/数据),包含 KM4 启动加载程序 IMG,映射到虚拟地址 0x0F80_0000。 |
Key Certificate |
0x0801_4000 |
4 |
其他固件的公钥哈希信息 |
IMG2 manifest |
0x0801_5000 |
4 |
KM0 & KM4 应用程序 & KM4 IMG3 manifest |
KM0 & KM4 Application |
0x0801_6000 |
1912 |
结合 KM0 固件、KM4 固件2 和 KM4 固件3(如果存在)
|
KM4 Bootloader manifest OTA2 |
0x0820_0000 |
4 |
KM4 启动加载程序清单 |
KM4 Bootloader OTA2 |
0x0820_1000 |
76 |
KM4 启动加载程序(代码/数据),包含 KM4 启动加载程序 IMG,映射到虚拟地址 0x0F80_0000。 |
Key Certificate OTA2 |
0x0821_4000 |
4 |
其他固件的公钥哈希信息 |
IMG2 manifest OTA2 |
0x0821_5000 |
4 |
KM0 & KM4 应用程序 & KM4 IMG3 清单 |
KM0 & KM4 Application OTA2 |
0x0821_6000 |
1820 |
结合 KM0 固件、KM4 固件2 和 KM4 固件3(如果存在)
|
FTL |
0x083D_D000 |
12 |
用于蓝牙 |
VFS |
0x083E_0000 |
128 |
用于文件系统 |
Item |
物理地址 |
大小 |
描述 |
|---|---|---|---|
KM4 Bootloader manifest |
0x0800_0000 |
4KB |
KM4 bootloader manifest |
KM4 Bootloader |
0x0800_1000 |
76KB |
KM4 启动加载程序(代码/数据),包含 KM4 启动加载程序 IMG,映射到虚拟地址 0x0F80_0000。 |
Key Certificate |
0x0801_4000 |
4KB |
其他固件的公钥哈希信息 |
IMG2 manifest |
0x0801_5000 |
4KB |
KR4 & KM4 应用程序清单 |
KR4 & KM4 Application |
0x0801_6000 |
1912KB |
结合 KR4 固件、KM4 image2 和 KM4 image3(如果存在)
|
KM4 Bootloader manifest OTA2 |
0x0820_0000 |
4KB |
KM4 bootloader manifest |
KM4 Bootloader OTA2 |
0x0820_1000 |
76KB |
KM4 启动加载程序(代码/数据),包含 KM4 启动加载程序固件,映射到虚拟地址 0x0F80_0000。 |
Key Certificate OTA2 |
0x0821_4000 |
4KB |
其他固件的公钥哈希信息 |
IMG2 manifest OTA2 |
0x0821_5000 |
4KB |
KR4 & KM4 应用程序清单 |
KR4 & KM4 Application OTA2 |
0x0821_6000 |
1820KB |
结合 KR4 固件、KM4 image2 和 KM4 image3(如果存在)
|
FTL |
0x083D_D000 |
12KB |
用于蓝牙 |
VFS |
0x083E_0000 |
128KB |
用于文件系统 |
Reserved |
0x0840_0000 |
3072KB |
Item |
物理地址 |
大小 |
描述 |
|---|---|---|---|
KM4 Bootloader manifest |
0x0800_0000 |
4KB |
KM4 bootloader manifest |
KM4 Bootloader |
0x0800_1000 |
76KB |
KM4 启动加载程序(代码/数据),包含 KM4 启动加载程序 IMG,映射到虚拟地址 0x0F80_0000。 |
Key Certificate |
0x0801_4000 |
4KB |
其他固件的公钥哈希信息 |
IMG2 manifest |
0x0801_5000 |
4KB |
KR4 & KM4 应用程序 manifest |
KR4 & KM4 Application |
0x0801_6000 |
1912KB |
结合 KR4 固件、KM4 image2 和 KM4 image3(如果存在)
|
KM4 Bootloader manifest OTA2 |
0x0820_0000 |
4KB |
KM4 bootloader manifest |
KM4 Bootloader OTA2 |
0x0820_1000 |
76KB |
KM4 启动加载程序(代码/数据),包含 KM4 启动加载程序固件,映射到虚拟地址 0x0F80_0000。 |
Key Certificate OTA2 |
0x0821_4000 |
4KB |
其他固件的公钥哈希信息 |
IMG2 manifest OTA2 |
0x0821_5000 |
4KB |
KR4 & KM4 应用程序 manifest |
KR4 & KM4 Application OTA2 |
0x0821_6000 |
1820KB |
结合 KR4 固件、KM4 image2 和 KM4 image3(如果存在)
|
FTL |
0x083D_D000 |
12KB |
用于蓝牙 |
VFS |
0x083E_0000 |
128KB |
用于文件系统 |
DSP_IMG [2]: |
0x0840_0000 |
3072KB |
DSP 固件(代码/数据),映射到虚拟地址 0x0D00_0000. |
Item |
物理地址 |
大小 |
描述 |
|---|---|---|---|
KM4 Bootloader manifest |
0x0800_0000 |
4KB |
KM4 bootloader manifest |
KM4 Bootloader |
0x0800_1000 |
76KB |
KM4 启动加载程序(代码/数据),包含 KM4 启动加载程序 IMG,映射到虚拟地址 0x0F80_0000。 |
Key Certificate |
0x0801_4000 |
4KB |
其他固件的公钥哈希信息 |
IMG2 manifest |
0x0801_5000 |
4KB |
KR4 & KM4 应用程序 manifest |
KR4 & KM4 Application |
0x0801_6000 |
1912KB |
结合 KR4 固件、KM4 image2 和 KM4 image3(如果存在)
|
KM4 Bootloader manifest OTA2 |
0x0820_0000 |
4KB |
KM4 bootloader manifest |
KM4 Bootloader OTA2 |
0x0820_1000 |
76KB |
KM4 启动加载程序(代码/数据),包含 KM4 启动加载程序固件,映射到虚拟地址 0x0F80_0000。 |
Key Certificate OTA2 |
0x0821_4000 |
4KB |
其他固件的公钥哈希信息 |
IMG2 manifest OTA2 |
0x0821_5000 |
4KB |
KR4 & KM4 应用程序 manifest |
KR4 & KM4 Application OTA2 |
0x0821_6000 |
1820KB |
结合 KR4 固件、KM4 image2 和 KM4 image3(如果存在)
|
FTL |
0x083D_D000 |
12KB |
用于蓝牙 |
VFS |
0x083E_0000 |
128KB |
用于文件系统 |
DSP_IMG [2]: |
0x0840_0000 |
3072KB |
DSP 固件(代码/数据),映射到虚拟地址 0x0D00_0000. |
Item |
物理地址 |
大小 |
描述 |
|---|---|---|---|
KM4 Bootloader manifest |
0x0800_0000 |
4KB |
KM4 启动加载程序 manifest |
KM4 Bootloader |
0x0800_1000 |
124KB |
KM4 启动加载程序(代码/数据),包含 KM4 启动加载程序 IMG |
Key Certificate |
0x0802_0000 |
4KB |
其他固件的公钥哈希信息 |
IMG2 manifest |
0x0802_1000 |
4KB |
KM0 & KM4 & CA32 应用程序 manifest |
KM0 & KM4 & CA32 Application |
0x0802_2000 |
2936KB |
结合 KM0, KM4, CA32 固件
|
KM4 Bootloader manifest OTA2 |
0x0830_0000 |
4KB |
KM4 启动加载程序 manifest |
KM4 Bootloader OTA2 |
0x0830_1000 |
252KB |
KM4 启动加载程序(代码/数据),包含 KM4 启动加载程序 IMG |
Key Certificate OTA2 |
0x0834_0000 |
4KB |
其他固件的公钥哈希信息 |
IMG2 manifest OTA2 |
0x0834_1000 |
4KB |
KM0 & KM4 & CA32 应用程序 manifest |
KM0 & KM4 & CA32 Application OTA2 |
0x0834_2000 |
2936KB |
结合 KM0, KM4, CA32 固件
|
FTL |
0x0862_0000 |
12KB |
用于蓝牙 |
VFS |
0x0862_3000 |
128KB |
用于文件系统 |
内存管理单元(MMU)
为实现固件灵活性和 RSIP 加密需求(固件加密需要固定 IV 地址,参考 RSIP ),SDK 默认启用 Flash MMU 机制。通过 MMU ,同一块逻辑地址可以映射到 OTA1 物理区域,也可以映射到 OTA2 物理区域,这样设备可以选择运行不同分区中的固件。在未启用 OTA 升级时,固件默认烧录到 OTA1 区域。关于 OTA 的更多信息,请参考 固件升级 章节。
默认 MMU 布局如下:
备注
一般不需要修改 Flash 的逻辑地址,如需修改请联系 Realtek。
Flash 布局修改
可以修改物理地址到逻辑地址的映射改变 Flash 的布局,除 IMG_BOOT 外,其他项都支持修改,在 {SDK}\component\soc\usrcfg\amebaxxx\ameba_flashcfg.c 中修改对应条目即可:
FlashLayoutInfo_TypeDef Flash_Layout[] = {
/*Region_Type, [StartAddr, EndAddr] */
{IMG_BOOT, 0x08000000, 0x08013FFF}, //Boot Manifest(4K) + KM4 Bootloader(76K)
//Users should modify below according to their own memory
{IMG_APP_OTA1, 0x08014000, 0x081F3FFF}, //Certificate(4K) + Manifest(4K) + KR4 & KM4 Application OTA1 + Manifest(4K) + RDP IMG OTA1
{IMG_BOOT_OTA2, 0x08200000, 0x08213FFF}, //Boot Manifest(4K) + KM4 Bootloader(76K) OTA
{IMG_APP_OTA2, 0x08214000, 0x083DCFFF}, //Certificate(4K) + Manifest(4K) + KR4 & KM4 Application OTA2 + Manifest(4K) + RDP IMG OTA2
{FTL, 0x083DD000, 0x083DFFFF}, //FTL for BT(>=12K), The start offset of flash pages allocated to FTL physical map
{VFS1, 0x083E0000, 0x083FFFFF}, //VFS region 1 (128K)
{IMG_DSP, 0x08400000, 0x086FFFFF}, //Manifest(4K) + DSP firmware, only one DSP region in layout
{VFS2, 0xFFFFFFFF, 0xFFFFFFFF}, //VFS region 2
{USER, 0xFFFFFFFF, 0xFFFFFFFF}, //reserve for user
/* End */
{0xFF, 0xFFFFFFFF, 0xFFFFFFFF},
};
备注
以上代码为示例,实际使用的 IC 可能不包含所有配置行,具体请参考对应 IC 的 Flash_Layout。
如果修改了 VFS 或 FTL 分区,建议通过 ImageTool 工具对相关区域进行擦除,避免新旧数据冲突或干扰。
修改地址要保证相邻条目之间没有交叠。
修改 Bootloader OTA2 分区
BOOT 和 APP 固件均有两个固件分区( OTA1 和 OTA2 )用于冗余存储和版本控制,但 BOOT 固件的 OTA 功能默认未开启,请参考 BOOT OTA 中的步骤启用此功能。
如需规划和修改 Bootloader OTA2 分区,请修改 {SDK}\component\soc\usrcfg\amebaxxx\ameba_flashcfg.c 文件中的 IMG_BOOT_OTA2 地址,注意保证 4K 对齐。
备注
Bootloader OTA1 的地址固定为 0x0800_0000,无法修改。
芯片 ROM 中的引导程序将根据 BOOT 固件头中的标签和版本号选择启动哪个分区,默认将选择版本号更大的分区,更新固件版本号的方法请参考 固件标签和版本号 。
修改应用程序分区
APP OTA1
在
{SDK}\component\soc\usrcfg\amebaxxx\ameba_flashcfg.c中修改IMG_APP_OTA1的地址。重新编译项目以生成 Bootloader 和 APP OTA1。
IMG_APP_OTA1的起始和结束地址对应 ImageTool 中km0_km4_app.bin的 Start Addr, End Addr,表示应用固件烧录的位置。如果IMG_APP_OTA1有调整,请同步修改 ImageTool 中的对应项并下载新的 Bootloader 和 APP OTA1。
Bootloader 将根据 APP 固件头中的标签和版本号选择启动哪个分区,如果 APP OTA1 的版本号更大,Bootloader 从 APP OTA1 的新位置加载固件。
APP OTA2
在
{SDK}\component\soc\usrcfg\amebaxxx\ameba_flashcfg.c中修改IMG_APP_OTA2的地址。按照 APP OTA1 中的步骤重新编译并下载 Bootloader 固件。
通过 OTA 的方式将 APP OTA2 下载到闪存后,如果 APP OTA2 的版本更大,Bootloader 将从 APP OTA2 的新位置加载固件。
APP OTA1
在
{SDK}\component\soc\usrcfg\amebaxxx\ameba_flashcfg.c中修改IMG_APP_OTA1的地址。重新编译项目以生成 Bootloader 和 APP OTA1。
IMG_APP_OTA1的起始和结束地址对应 ImageTool 中kr4_km4_app.bin的 Start Addr, End Addr,表示应用固件烧录的位置。如果IMG_APP_OTA1有调整,请同步修改 ImageTool 中的对应项并下载新的 Bootloader 和 APP OTA1。
Bootloader 将根据 APP 固件头中的标签和版本号选择启动哪个分区,如果 APP OTA1 的版本号更大,Bootloader 从 APP OTA1 的新位置加载固件。
APP OTA2
在
{SDK}\component\soc\usrcfg\amebaxxx\ameba_flashcfg.c中修改IMG_APP_OTA2的地址。按照 APP OTA1 中的步骤重新编译并下载 Bootloader 固件。
通过 OTA 的方式将 APP OTA2 下载到闪存后,如果 APP OTA2 的版本更大,Bootloader 将从 APP OTA2 的新位置加载固件。
APP OTA1
在
{SDK}\component\soc\usrcfg\amebaxxx\ameba_flashcfg.c中修改IMG_APP_OTA1的地址。重新编译项目以生成 Bootloader 和 APP OTA1。
IMG_APP_OTA1的起始和结束地址对应 ImageTool 中kr4_km4_app.bin的 Start Addr, End Addr,表示应用固件烧录的位置。如果IMG_APP_OTA1有调整,请同步修改 ImageTool 中的对应项并下载新的 Bootloader 和 APP OTA1。
Bootloader 将根据 APP 固件头中的标签和版本号选择启动哪个分区,如果 APP OTA1 的版本号更大,Bootloader 从 APP OTA1 的新位置加载固件。
APP OTA2
在
{SDK}\component\soc\usrcfg\amebaxxx\ameba_flashcfg.c中修改IMG_APP_OTA2的地址。按照 APP OTA1 中的步骤重新编译并下载 Bootloader 固件。
通过 OTA 的方式将 APP OTA2 下载到闪存后,如果 APP OTA2 的版本更大,Bootloader 将从 APP OTA2 的新位置加载固件。
修改 DSP 固件位置
参考 APP OTA1 来修改 DSP 固件的位置。
APP OTA1
在
{SDK}\component\soc\usrcfg\amebaxxx\ameba_flashcfg.c中修改IMG_APP_OTA1的地址。重新编译项目以生成 Bootloader 和 APP OTA1。
IMG_APP_OTA1的起始和结束地址对应 ImageTool 中kr4_km4_app.bin的 Start Addr, End Addr,表示应用固件烧录的位置。如果IMG_APP_OTA1有调整,请同步修改 ImageTool 中的对应项并下载新的 Bootloader 和 APP OTA1。
Bootloader 将根据 APP 固件头中的标签和版本号选择启动哪个分区,如果 APP OTA1 的版本号更大,Bootloader 从 APP OTA1 的新位置加载固件。
APP OTA2
在
{SDK}\component\soc\usrcfg\amebaxxx\ameba_flashcfg.c中修改IMG_APP_OTA2的地址。按照 APP OTA1 中的步骤重新编译并下载 Bootloader 固件。
通过 OTA 的方式将 APP OTA2 下载到闪存后,如果 APP OTA2 的版本更大,Bootloader 将从 APP OTA2 的新位置加载固件。
修改 DSP 固件位置
参考 APP OTA1 来修改 DSP 固件的位置。
APP OTA1
在
{SDK}\component\soc\usrcfg\amebaxxx\ameba_flashcfg.c中修改IMG_APP_OTA1的地址。重新编译项目以生成 Bootloader 和 APP OTA1。
IMG_APP_OTA1的起始和结束地址对应 ImageTool 中km0_km4_ca32_app.bin的 Start Addr, End Addr,表示应用固件烧录的位置。如果IMG_APP_OTA1有调整,请同步修改 ImageTool 中的对应项并下载新的 Bootloader 和 APP OTA1。
Bootloader 将根据 APP 固件头中的标签和版本号选择启动哪个分区,如果 APP OTA1 的版本号更大,Bootloader 从 APP OTA1 的新位置加载固件。
APP OTA2
在
{SDK}\component\soc\usrcfg\amebaxxx\ameba_flashcfg.c中修改IMG_APP_OTA2的地址。按照 APP OTA1 中的步骤重新编译并下载 Bootloader 固件。
通过 OTA 的方式将 APP OTA2 下载到闪存后,如果 APP OTA2 的版本更大,Bootloader 将从 APP OTA2 的新位置加载固件。
Flash 写保护机制
Bootloader 在加载 APP 固件前会读取 Flash 状态寄存器:
若寄存器值与 Flash_AVL (路径:
{SDK}\component\soc\usrcfg\amebaxxx\ameba_flashcfg.c)中的 status_mask 按位与操作后仅设置 QE 位,则保持原状态其他情况会将按位与结果写入状态寄存器
/**
* @brif Flash_AVL maintains the flash IC supported by SDK.
* If users want to adpot new flash, add item in the following AVL.
* Note that, if new flash can be classfied as one of the Realtek-defined categories according to Classification SPEC,
* filling in the defined class index is necessary. Otherwise, FlashClassUser can be used to indicate new class.
* If (Status Register of flash & status_mask in Flash_AVL) != (1 << QE Bit), set (1 << QE Bit) to Status Register of flash
*/
const FlashInfo_TypeDef Flash_AVL[] = {
/*flash_id, flash_id_mask, flash_class, status_mask, FlashInitHandler */
/* case1: Realtek defined class, any modification is not allowed */
{0xEF, 0x000000FF, FlashClass1, 0x000043FC, NULL}, /* Winbond: MANUFACTURER_ID_WINBOND */
{0xA1, 0x000000FF, FlashClass1, 0x0000FFFC, NULL}, /* Fudan Micro: MANUFACTURER_ID_FM */
{0x0B, 0x000000FF, FlashClass1, 0x000043FC, NULL}, /* XTX */
{0x0E, 0x000000FF, FlashClass1, 0x000043FC, NULL}, /* XTX(FT) */
{0xC8, 0x000000FF, FlashClass2, 0x000043FC, NULL}, /* GD normal: MANUFACTURER_ID_GD */
{0x28C2, 0x0000FFFF, FlashClass6, 0x000200FC, NULL}, /* MXIC wide-range VCC: MANUFACTURER_ID_MXIC */
{0xC2, 0x000000FF, FlashClass3, 0x000000FC, NULL}, /* MXIC normal: MANUFACTURER_ID_BOHONG */
{0x68, 0x000000FF, FlashClass3, 0x000000FC, NULL}, /* Hua Hong */
{0x51, 0x000000FF, FlashClass3, 0x000000FC, NULL}, /* GD MD serial */
{0x1C, 0x000000FF, FlashClass4, 0x000000FC, NULL}, /* ESMT: MANUFACTURER_ID_EON */
{0x20, 0x000000FF, FlashClass1, 0x000043FC, NULL}, /* XMC: MANUFACTURER_ID_WINBOND */
{0x85, 0x000000FF, FlashClass1, 0x000043FC, NULL}, /* Puya: 85-20-16 */
{0x5E, 0x000000FF, FlashClass1, 0x000043FC, NULL}, /* Zbit: 5E-50-16 */
//{0x20, 0x000000FF, FlashClass5, 0x000000FC, NULL}, /* Micron: MANUFACTURER_ID_MICRON */
/* case2: new flash, ID is not included in case1 list, but specification is compatible with FlashClass1~FlashClass6 */
//{0xXX, 0x0000XXXX, FlashClassX, 0x0000XXXX, NULL},
/* case3: new flash, ID is not included in case1 list, and specification is not compatible with FlashClass1~FlashClass6 */
{0x00, 0x000000FF, FlashClassUser, 0xFFFFFFFF, &flash_init_userdef},
/* End */
{0xFF, 0xFFFFFFFF, FlashClassNone, 0xFFFFFFFF, NULL},
};
备注
默认设置 QE 位会解除所有块保护。如需保留块保护,需将 Flash_AVL 中对应型号的 status_mask 块保护位设为 0(例如 Winbond 芯片需设为 0x000043C0)
建议用户对代码段,只读数据段等启用块保护。
使用 LittleFS 时建议将 FTL 分区移至 Flash 末端的 64KB 区域,并设置对应的块保护位
OTA 升级期间需解除 Flash 保护,完成后重新启用保护
部分 Flash 芯片无法单独保护末端区块,此时建议启用前半部分块保护