4. 系统flash写保护(flash_write_protect_v3)

本说明适用于AD24开源SDK,主要介绍如何将系统flash的代码与资源区域设置为写保护状态,包括以下几点:
  • 系统flash写保护功能说明;

  • 开发者在使用AD24 SDK开启写保护时需要的修改;

  • 对于内封flash的芯片,如何获取对应flash型号的写保护参数;

  • 对于A0芯片,介绍用户如何根据flash手册添加写保护参数;

  • 介绍程序中如何打开与关闭内置flash写保护,介绍写保护相关接口;

注:该章节讲解的系统flash写保护与AD14/15/16/17/18、AC104以及AW30N不通用,如果要了解上述芯片的系统flash写保护相关信息,请参考对应芯片的SDK文档。

支持flash_write_protect_v3的SDK版本

芯片

支持的SDK版本

AD24N

ad24-release_v1.0.0 以及之后的SDK

本章节分为以下几个部分进行介绍说明:

4.1. 系统flash写保护的功能说明与须知

SDK的系统flash写保护主要分为软件和硬件两种:
软件写保护,是指在底层驱动通过检测擦写的地址在保护范围内则不进行擦写,通过软件方式保护代码和资源文件。
硬件写保护,则是需要用户将写保护参数烧写到系统flash,然后通过SDK从系统flash读取写保护参数,然后将写保护参数配置给系统flash寄存器实现的硬件写保护。
软件写保护与硬件写保护的保护范围:
软件写保护的保护范围 由函数flash_code_protect_callback决定,一般保护vm区之前的区域。
硬件写保护的保护范围 与代码+资源的大小以及用户填入的写保护参数有关,SDK流程上会选择 写保护参数保护范围<=代码+资源 的范围进行保护,如果用户输入了多组写保护参数,SDK会 选择最接近并且小于代码+资源大小的写保护参数 进行使用。例如,代码+资源占用的大小为1028KB,用户填入的写保护参数组中最接近固件大小的保护范围是1024KB,则硬件写保护的范围是1024KB。
系统flash硬件写保护的一些特殊机制:
部分flash支持BP保护(保护范围不一定从0地址开始,且保护范围需要参考flash_datasheet)和WPS保护(保护的最小单位为块,保护范围比较灵活)两种机制
如果写保护参数中同时存在BP保护和WPS保护两种机制的参数,则SDK优先选择WPS保护机制的参数进行使用

4.2. 使用系统flash写保护时需要开启的配置

SDK系统flash的软件写保护默认开启,详细见flash_code_protect_callback函数。

系统flash的硬件写保护的功能需要开启部分配置,具体说明如下。

4.2.1. app_modules.h的配置

用户在需要使用系统flash写保护功能时,需要开启CONFIG_FLASH_WPS_EN宏,并且全编译。

"图1 flash写保护功能开关“

图1 flash写保护功能开关

4.2.2. isd_config_ini.c配置

使用系统flash写保护功能时,需要在isd_config_ini.c添加以下语句。

"图2 isd_config_ini.c写保护相关配置“

图2 isd_config_ini.c写保护相关配置


4.3. A0芯片如何添加写保护参数

4.3.1. flash写保护工具说明

SDK的下载目录(路径:app\post_build\sh5x\voice_toy(工程)\)中存放有“flash_write_protect”文件夹,文件夹中包含以下文件:
  • 0x—–_v3.xlsx:该文件以文本形式记录与文件名一致的flash的写保护参数。例如文件名为0xEF4017_v3.xlsx的文件,存储的则是flash_id为0xEF4017的flash写保护参数

  • flash_list_to_bin_v3.bat:该脚本实现将上述xlsx表格文件转成小机可识别的dir_sys_info文件

"图2.1 flash写保护工具“

图2.1 flash写保护工具

用户将写保护参数填入到xlsx文件之后,点击flash_list_to_bin_v3.bat可生成flash_param_v3.bin文件,用于烧写到flash中给SDK读取使用。

4.3.2. 如何添加flash写保护参数(本文以华邦W25Q64为例,flash_id为0xEF4017)

如下对于A0的芯片,用户可自行根据需要使用的flash的datasheet,在0x—–_v3.xlsx文件中添加写保护参数以及相关指令,下文以华邦W25Q64 FLASH(flash_id为0xEF4017_v3)为例,介绍根据手册添加参数。我司配置flash写保护范围从0地址开始,向后覆盖。

4.3.2.1. flash状态寄存器读写指令集(flash_sta_cmd)

查询flash datasheet的instruction_set_table1,将状态寄存器的读写指令填入表格的flash_sta_cmd结构体

"flash状态寄存器读写指令集“

flash状态寄存器读写指令集

4.3.2.2. flash_otp_cfg配置

查询flash datasheet的instruction_set_table1和erase security registers,将写使能指令和flash支持的页大小和offset信息写入flash_otp_cfg结构体

"flash_otp_cfg配置“

flash_otp_cfg配置

4.3.2.3. flash_wp_cfg与wp_table配置(BP保护使用的配置)

该部分配置为SDK使用BP保护方式配置保护范围。用户可查询flash datasheet的instruction_set_table1和Status Register Memory Protection,将对应的写保护的寄存器配置填入表格的flash_wp_cfg结构体和wp_table,该部分分为两小节讲解。

"flash_wp_cfg&wp_table配置“

flash_wp_cfg&wp_table配置

4.3.2.3.1. flash_wp_cfg配置

用户可查询flash datasheet的instruction_set_table1和Status Register Memory Protection得知BP保护中所使用到的flash状态寄存器有效位,然后将有效位写1映射的对应的状态寄存器的出所有状态寄存器的有效位,如下图

"flash_wp_cfg配置“

flash_wp_cfg配置

4.3.2.3.2. wp_table配置

用户可查询Status Register Memory Protection来选择自己需要的写保护范围写到表格中。例如加入256KB写保护范围的参数时,可按照以下步骤

"wp_table配置“

wp_table配置


4.3.2.4. flash_wps_cfg(WPS保护使用的配置)

用户可查询Status Register中WPS位对应的寄存器,算出其有效位和寄存器值即可,可参考下图

"flash_wps_cfg配置“

flash_wps_cfg配置


4.4. 内封flash芯片如何获取写保护参数

用户在使用内封flash芯片时,可以从下载目录或者我司链接获取写保护参数

AD24N_V1.1.0版本开始可以从下载目录获取到内封flash的写保护参数

"下载目录中的芯片内封flash写保护参数“

下载目录中的芯片内封flash写保护参数

芯片内封flash写保护参数获取链接 https://doc.zh-jieli.com/Tools/zh-cn/dev_tools/toolchains/otp_cfg.html

从链接获取到的写保护参数一般为flash_param_xxxxxxxx_v3.bin文件


4.5. 写保护参数下载到flash的步骤说明

将获取到的写保护参数文件(flash_param_v3.bin)拷贝到下载目录,在download_bat.c输入以下命令,点击编译下载即可以下载写保护参数到flash。

"图3 flash参数下载命令“

图3 flash参数下载命令


4.6. 系统flash写保护相关函数说明

4.6.1. 函数u32 flash_code_protect_callback(u32 offset, u32 len)

该函数为SDK使用系统flash软件写保护时,注册到底层的回调函数,因此底层flash驱动会调用到该函数,该函数决定软件写保护的保护范围。其中参数::

1、返回值:
    超过正常擦写区域,不进行擦写操作 返回1;
    正常进行擦写 返回0;

4.6.2. 函数void tzflash_change_mode()

该函数为系统flash硬件写保护功能入口,该函数在功能开关开启后会读取烧到flash的写保护参数并且配置到flash的寄存器

4.6.3. 函数void tzflash_dump()

该函数在系统flash硬件写保护入口后调用,用户可通过打印信息得知写保护参数是否配置成功。

如果使用的是BP保护,则对照寄存器使用到的bit是否和参数表一样被置上,保护范围是否和参数表一致。如果两者均正确,则配置成功,如果寄存器值错误或者没有保护范围的打印,则配置失败。

如果使用的是WPS保护,则观察打印是否有显示保护范围。有则配置成功。