6. 系统flash写保护(flash_write_protect_v3)
- 本说明适用于AD23N开源SDK,主要介绍如何将系统flash的代码与资源区域设置为写保护状态,包括以下几点:
系统flash写保护功能说明;
开发者在使用AD23N SDK开启写保护时需要的修改;
对于内封flash的芯片,如何获取对应flash型号的写保护参数;
对于A0芯片,介绍用户如何根据flash手册添加写保护参数;
介绍程序中如何打开与关闭内置flash写保护,介绍写保护相关接口;
注:该章节讲解的系统flash写保护与AD14/15/16/17/18、AC104以及AW30N不通用,如果要了解上述芯片的系统flash写保护相关信息,请参考对应芯片的SDK文档。
- 支持flash_write_protect_v3的SDK版本
芯片
支持的SDK版本
AD24N
AD24N-release_v1.0.0 以及之后的SDK
AD23N
AD23N-release_v1.0.0 以及之后的SDK
- 本章节分为以下几个部分进行介绍说明:
1. “系统flash写保护的功能说明与须知”2. “使用系统flash写保护时需要开启的配置”3. “内封flash芯片如何获取写保护参数”4. “A0芯片如何添加写保护参数”5. “写保护参数下载到flash的步骤说明”6. “系统flash写保护相关函数说明”
6.1. 系统flash写保护的功能说明与须知
- SDK的系统flash写保护为硬件写保护:
硬件写保护,则是需要用户将写保护参数烧写到系统flash,然后通过SDK从系统flash读取写保护参数,然后将写保护参数配置给系统flash寄存器实现的硬件写保护。- 硬件写保护的保护范围:
硬件写保护的保护范围 与 用户配置的保护范围以及用户填入的写保护参数 有关,SDK流程上会选择 实际保护范围<=用户配置保护范围 的范围进行保护,如果用户输入了多组写保护参数,SDK会 选择最接近并且小于用户配置保护范围的写保护参数 进行使用。例如,用户配置的保护范围为0~1028KB,用户填入的写保护参数组中最接近固件大小的保护范围是0~1024KB,则硬件写保护的范围是0~1024KB。- 系统flash硬件写保护的一些特殊机制:
部分flash支持BP保护(保护范围不一定从0地址开始,且保护范围需要参考flash_datasheet)和WPS保护(保护的最小单位为块,保护范围比较灵活)两种机制如果写保护参数中同时存在BP保护和WPS保护两种机制的参数,则SDK优先选择WPS保护机制的参数进行使用
6.2. 使用系统flash写保护时需要开启的配置
系统flash的硬件写保护的功能需要开启部分配置,具体说明如下。
6.2.1. isd_config_ini.c配置
使用系统flash写保护功能时,需要在isd_config_ini.c添加以下语句。
![]()
isd_config_ini.c写保护相关配置
6.3. A0芯片如何添加写保护参数
6.3.1. flash写保护工具说明
- SDK的下载目录(路径:app\post_build\sh5x\工程路径(如mbox_flash)\)中存放有“flash_write_protect”文件夹,文件夹中包含以下文件:
0x—–_v3.xlsx:该文件以文本形式记录与文件名一致的flash的写保护参数。例如文件名为0xEF4017_v3.xlsx的文件,存储的则是flash_id为0xEF4017的flash写保护参数
flash_list_to_bin_v3.bat:该脚本实现将上述xlsx表格文件转成小机可识别的bin文件
![]()
图2.1 flash写保护工具
用户将写保护参数填入到xlsx文件之后,点击flash_list_to_bin_v3.bat可生成flash_param_v3.bin文件,用于烧写到flash中给SDK读取使用。
6.3.2. 如何添加flash写保护参数(本文以华邦W25Q64为例,flash_id为0xEF4017)
如下对于A0的芯片,用户可自行根据需要使用的flash的datasheet,在0x—–_v3.xlsx文件中添加写保护参数以及相关指令,下文以华邦W25Q64 FLASH(flash_id为0xEF4017_v3)为例,介绍根据手册添加参数。我司配置flash写保护范围从0地址开始,向后覆盖。
6.3.2.1. flash状态寄存器读写指令集(flash_sta_cmd)
查询flash datasheet的instruction_set_table1,将状态寄存器的读写指令填入表格的flash_sta_cmd结构体
![]()
flash状态寄存器读写指令集
6.3.2.2. flash_otp_cfg配置
查询flash datasheet的instruction_set_table1和erase security registers,将写使能指令和flash支持的页大小和offset信息写入flash_otp_cfg结构体
![]()
flash_otp_cfg配置
6.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配置
6.3.2.3.1. flash_wp_cfg配置
用户可查询flash datasheet的instruction_set_table1和Status Register Memory Protection得知BP保护中所使用到的flash状态寄存器有效位,然后将有效位写1映射的对应的状态寄存器的出所有状态寄存器的有效位,如下图
![]()
flash_wp_cfg配置
6.3.2.3.2. wp_table配置
用户可查询Status Register Memory Protection来选择自己需要的写保护范围写到表格中。例如加入256KB写保护范围的参数时,可按照以下步骤
![]()
wp_table配置
6.3.2.4. flash_wps_cfg(WPS保护使用的配置)
用户可查询Status Register中WPS位对应的寄存器,算出其有效位和寄存器值即可,可参考下图
![]()
flash_wps_cfg配置
6.4. 内封flash芯片如何获取写保护参数
用户在使用内封flash芯片时,可以从下载目录或者我司链接获取写保护参数
可以从下载目录获取到内封flash的写保护参数
![]()
下载目录中的芯片内封flash写保护参数
芯片内封flash写保护参数获取链接 https://doc.zh-jieli.com/Tools/zh-cn/dev_tools/toolchains/otp_cfg.html
从链接获取到的写保护参数一般为flash_param_xxxxxxxx_v3.bin文件
6.5. 写保护参数下载到flash的步骤说明
将获取到的写保护参数文件(flash_param_v3.bin)拷贝到下载目录,在download_bat.c输入以下命令,点击编译下载即可以下载写保护参数到flash。
![]()
图3 flash参数下载命令
6.6. 系统flash写保护相关函数说明
6.6.1. 函数int tzflash_set_write_protect(u8 lock, u32 saddr, u32 eaddr)
该函数为系统flash硬件写保护功能入口,该函数在调用后会读取烧到flash的写保护参数并且配置到flash的寄存器,其中参数::
1. lock:1、写保护 0、解保护; 2. saddr:保护起始地址,wps保护有效; 3. eaddr:保护末地址; 4. 返回值: 失败 <0; 成功 实际保护地址。
6.6.2. 函数int tzflash_get_write_protect_mode()
该函数用于去获取当前写保护模式::
返回值: 0:无保护 1:wps保护 2:bp保护
6.6.3. 函数int tzflash_cfg_wps_area(struct flash_wps_area_cfg *wps_area, u32 area_group_size)
该函数用于设置wps保护区域。其中参数::
1. wps_area:wps保护区域结构体指针。包含保护起始地址、末尾地址和保护标志位。 2. area_group_size:参数组数。如果一款flash写了4个保护区域的参数,就传4。
6.6.4. 函数enum tzflash_wps_status_mode tzflash_get_wps_status()
该函数用于去获取wps状态