.. _flash写保护说明: 系统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. ":ref:`系统flash写保护的功能说明与须知`" | 2. ":ref:`使用系统flash写保护时需要开启的配置`" | 3. ":ref:`内封flash芯片如何获取写保护参数`" | 4. ":ref:`A0芯片如何添加写保护参数`" | 5. ":ref:`写保护参数下载到flash的步骤说明`" | 6. ":ref:`系统flash写保护相关函数说明`" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. _系统flash写保护的功能说明与须知: 系统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保护机制的参数进行使用 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. _使用系统flash写保护时需要开启的配置: 使用系统flash写保护时需要开启的配置 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 系统flash的硬件写保护的功能需要开启部分配置,具体说明如下。 isd_config_ini.c配置 ---------------------------------- 使用系统flash写保护功能时,需要在isd_config_ini.c添加以下语句。 .. image:: 2_isd_config_ini.png :alt: "图2 isd_config_ini.c写保护相关配置“ :align: center .. centered:: isd_config_ini.c写保护相关配置 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. _A0芯片如何添加写保护参数: A0芯片如何添加写保护参数 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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文件 .. image:: 2_1_flash_wp_tool.png :alt: "图2.1 flash写保护工具“ :align: center .. centered:: 图2.1 flash写保护工具 用户将写保护参数填入到xlsx文件之后,点击flash_list_to_bin_v3.bat可生成flash_param_v3.bin文件,用于烧写到flash中给SDK读取使用。 如何添加flash写保护参数(本文以华邦W25Q64为例,flash_id为0xEF4017) -------------------------------------------------------------------------------- 如下对于A0的芯片,用户可自行根据需要使用的flash的datasheet,在0x-----_v3.xlsx文件中添加写保护参数以及相关指令,下文以华邦W25Q64 FLASH(flash_id为0xEF4017_v3)为例,介绍根据手册添加参数。我司配置flash写保护范围从0地址开始,向后覆盖。 flash状态寄存器读写指令集(flash_sta_cmd) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 查询flash datasheet的instruction_set_table1,将状态寄存器的读写指令填入表格的flash_sta_cmd结构体 .. image:: flash_sta_cmd.png :alt: "flash状态寄存器读写指令集“ :align: center .. centered:: flash状态寄存器读写指令集 flash_otp_cfg配置 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 查询flash datasheet的instruction_set_table1和erase security registers,将写使能指令和flash支持的页大小和offset信息写入flash_otp_cfg结构体 .. image:: flash_otp_cfg.png :alt: "flash_otp_cfg配置“ :align: center .. centered:: flash_otp_cfg配置 flash_wp_cfg与wp_table配置(BP保护使用的配置) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 该部分配置为SDK使用BP保护方式配置保护范围。用户可查询flash datasheet的instruction_set_table1和Status Register Memory Protection,将对应的写保护的寄存器配置填入表格的flash_wp_cfg结构体和wp_table,该部分分为两小节讲解。 .. image:: flash_wp_cfg&wp_table.png :alt: "flash_wp_cfg&wp_table配置“ :align: center .. centered:: flash_wp_cfg&wp_table配置 flash_wp_cfg配置 """""""""""""""""""""""""""""""""""""" 用户可查询flash datasheet的instruction_set_table1和Status Register Memory Protection得知BP保护中所使用到的flash状态寄存器有效位,然后将有效位写1映射的对应的状态寄存器的出所有状态寄存器的有效位,如下图 .. image:: flash_wp_cfg.png :alt: "flash_wp_cfg配置“ :align: center .. centered:: flash_wp_cfg配置 wp_table配置 """""""""""""""""""""""""""""""""""""" 用户可查询Status Register Memory Protection来选择自己需要的写保护范围写到表格中。例如加入256KB写保护范围的参数时,可按照以下步骤 .. image:: wp_table.png :alt: "wp_table配置“ :align: center .. centered:: wp_table配置 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ flash_wps_cfg(WPS保护使用的配置) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 用户可查询Status Register中WPS位对应的寄存器,算出其有效位和寄存器值即可,可参考下图 .. image:: flash_wps_cfg.png :alt: "flash_wps_cfg配置“ :align: center .. centered:: flash_wps_cfg配置 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. _内封flash芯片如何获取写保护参数: 内封flash芯片如何获取写保护参数 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 用户在使用内封flash芯片时,可以从下载目录或者我司链接获取写保护参数 可以从下载目录获取到内封flash的写保护参数 .. image:: flash_param_in_sdk.jpg :alt: "下载目录中的芯片内封flash写保护参数“ :align: center .. centered:: 下载目录中的芯片内封flash写保护参数 芯片内封flash写保护参数获取链接 ``_ 从链接获取到的写保护参数一般为flash_param_xxxxxxxx_v3.bin文件 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. _写保护参数下载到flash的步骤说明: 写保护参数下载到flash的步骤说明 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 将获取到的写保护参数文件(flash_param_v3.bin)拷贝到下载目录,在download_bat.c输入以下命令,点击编译下载即可以下载写保护参数到flash。 .. image:: 3_download_bat.png :alt: "图3 flash参数下载命令“ :align: center .. centered:: 图3 flash参数下载命令 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. _系统flash写保护相关函数说明: 系统flash写保护相关函数说明 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 函数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; 成功 实际保护地址。 函数int tzflash_get_write_protect_mode() -------------------------------------------------------------------------------- 该函数用于去获取当前写保护模式::: 返回值: 0:无保护 1:wps保护 2:bp保护 函数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。 函数enum tzflash_wps_status_mode tzflash_get_wps_status() --------------------------------------------------------------------------------------- 该函数用于去获取wps状态