前言

概述

本文档主要描述了BS2XV100的客户预留EFUSE位域的使用方法。

产品版本

与本文档对应的产品版本如下。

产品名称

产品版本

BS2X

V100

读者对象

本文档主要适用于以下人员:

  • 技术支持工程师

  • 软件开发工程师

符号约定

在本文中可能出现下列标志,它们所代表的含义如下。

符号

说明

表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。

表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。

表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。

用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。

“须知”不涉及人身伤害。

对正文中重点信息的补充说明。

“说明”不是安全警示信息,不涉及人身、设备及环境伤害信息。

修改记录

文档版本

发布日期

修改说明

04

2025-08-07

更新“烧录流程”章节内容。

03

2025-05-30

  • 更新“概述”章节内容。
  • 更新“使用软件接口读写EFUSE”章节内容。

02

2025-01-24

更新“使用软件接口读写EFUSE”章节内容。

01

2024-05-15

第一次正式版本发布。

概述

EFUSE是一种可编程的存储单元,由于其只可编程一次的特征,多用于芯片保存Chip ID、密钥或其他一次性存储数据。当前BS2x芯片上总共128Bytes,用户可使用的EFUSE总共18Byte。如果用户不需要使用安全启动功能,其中Boot Hash Value部分的32字节也可以由用户自定义使用。在地址0x5702_8894中Bit15~Bit8可以给客户使用。

须知: EFUSE地址遵循32位对齐,每个地址包含16Bit的有效EFUSE位域。

BS2X提供了两种使用方式:

  • 通过软件驱动接口直接读写为用户预留的EFUSE空间。

  • 通过烧写工具操作为用户预留的EFUSE空间。

  • 通过JLink读写为用户预留的EFUSE空间。

使用软件接口读写EFUSE

EFUSE模块提供的接口及功能如下:

头文件路径: include\driver\efuseh

  • uapi_efuse_read_bit:读取EFUSE中的指定Bit位。uapi_efuse_read_buffer:读取EFUSE中多个字节,进入提供的缓冲区。

  • uapi_efuse_write_bit:写EFUSE中的指定Bit位。

  • uapi_efuse_write_buffer:从提供的缓冲区向EFUSE写入多个字节。

须知:

  • 调用API写EFUSE之前需要先执行LDO上电,写完成之后关闭即可,具体执行过程则是如下示例调用pm_efuse_ldo_power接口执行上下电。读EFUSE则不需要单独执行上电。

  • 如果要进行位操作,首先需要打开EFUSE_BIT_OPERATION宏,将其添加到config.py中的宏列表即可。

示例:

  1. 按照buffer写EFUSE值。

    uint8_t efuse_data[8] = {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};
    uint32_t byte_number = 1;
    uint16_t length = 8;
    uint32_t ret;
    // 第1byte开始写入8个字节
    ret = uapi_efuse_write_buffer(byte_number, efuse_data, length);
    if (ret != 0) {
        // 异常处理
    }
    
  2. 按照buffer读取EFUSE值。

    uint8_t efuse_data[8] = {0};
    uint32_t byte_number = 1;
    uint16_t length = 8;
    uint32_t ret;
    // 第1byte开始读取8个字节
    ret = uapi_efuse_read_bit(byte_number, efuse_data, length);
    if (ret != 0) {
        // 异常处理
    }
    
  3. 按照bit读取EFUSE值。

    uint8_t bit_pos = 1;
    uint8_t value;
    uint32_t byte_number = 1;
    uint32_t ret;
    // 读取第一个byte的bit1的值,存入value中(0 or 1)
    ret = uapi_efuse_read_bit(byte_number, bit_pos, &value);
    if (ret != 0) {
        // 异常处理
    }
    
  4. 按照bit写入EFUSE值。

    uint8_t value;
    uint32_t byte_number = 1;
    uint32_t ret;
    // 向第一个byte的bit1写入1
    ret = uapi_efuse_write_bit(byte_number, bit_pos);
    if (ret != 0) {
        // 异常处理
    }
    

使用BurnTool烧写EFUSE

生成efuse_cfg.bin

  1. 数据准备(路径:build\config\target_config\bs21\efuse\efuse.csv)

    图 1 efuse.csv配置

    图1所示,字段说明:

    • burn:

      0:当前位域不烧写;

      1:当前位域烧写。

    • name:当前EFUSE位域名字。

    • start_bit:位域起始bit位。

    • bit_width:当前位域bit长度。

    • values:烧写值。

    • lock:锁定位。

    示例:

    0,DIE_ID,0,32,0x00000000,PG0:die_id 从bit0开始,长度是32bit,不烧写;

    1,USER_EFUSE,864,8,0x000000FF,PG1:USER_EFUSE从bit864开始,长度为8bit,烧写值为0xFF。

  2. 烧写文件生成

  3. 调用脚本efuse_cfg_gen.py,生成efuse_cfg.bin,路径:build\config\target_config\bs21\efuse\efuse_cfg_gen.py。

  4. 编译对应的application.bin,编译成功后,会将efuse_cfg.bin单独打包成fwpkg,如图2

图 2 EFUSE烧录版本

说明: BS2X中,用户可配置的efuse number为108~125,长度为18Byte,即从bit864开始,长度为144bit。

烧录流程

准备烧写工具“BurnTool”通过BurnTool工具烧写镜像。具体步骤如下:

  1. 在BurnTool界面中,单击“Option”按钮,选择“Change chip”,从“Chip List”下拉菜单中选择“BS21”,并单击“OK”即可,如图1所示。

    图 1 BurnTool更换芯片示例

  2. 在BurnTool界面中,单击“COM”按钮选择PC机串口(串口选择,请参考开发板使用指南);单击“Select file”按钮,选择各产品编译生成的固件包,并单击“OK”,如图2所示。efuse_cfg.bin为待烧录数据,烧录类型为3。

    图 2 烧录文件选择示例

  3. 勾选“Auto burn”以及“Auto disconnect”选项;

    选择“Setting”→“Settings”,配置串口参数,默认配置如图3所示,baud配置为921600。

    说明: Force Read Time:定时读取的时间,以毫秒为单位。勾选时为定时读取串口,不勾选时为事件触发读取串口。适用于不勾选该选项无法正常烧录的场景。

    图 3 串口设置示例

    选择目标串口号并单击“Connect”按钮(单击后“Connect”变为“Disconnect”),复位单板。自动烧录效果如图4所示。

    图 4 自动烧录示意图

    等待传输完成后结束烧写,烧写完成会出现“All images burn successfully”。烧写完成效果如图5所示。

    图 5 烧写完成示意图