前言¶
概述
本文档主要描述了BS2XV100的客户预留EFUSE位域的使用方法。
产品版本
与本文档对应的产品版本如下。
产品名称 |
产品版本 |
|---|---|
BS2X |
V100 |
读者对象
本文档主要适用于以下人员:
技术支持工程师
软件开发工程师
符号约定
在本文中可能出现下列标志,它们所代表的含义如下。
符号 |
说明 |
|---|---|
|
表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。 |
|
表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。 |
|
表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。 |
|
用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。 “须知”不涉及人身伤害。 |
|
对正文中重点信息的补充说明。 “说明”不是安全警示信息,不涉及人身、设备及环境伤害信息。 |
修改记录
文档版本 |
发布日期 |
修改说明 |
|---|---|---|
04 |
2025-08-07 |
更新“烧录流程”章节内容。 |
03 |
2025-05-30 |
|
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中的宏列表即可。
示例:
按照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) { // 异常处理 }
按照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) { // 异常处理 }
按照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) { // 异常处理 }
按照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¶
数据准备(路径: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。
烧写文件生成
调用脚本efuse_cfg_gen.py,生成efuse_cfg.bin,路径:build\config\target_config\bs21\efuse\efuse_cfg_gen.py。
编译对应的application.bin,编译成功后,会将efuse_cfg.bin单独打包成fwpkg,如图2。
图 2 EFUSE烧录版本

说明: BS2X中,用户可配置的efuse number为108~125,长度为18Byte,即从bit864开始,长度为144bit。
烧录流程¶
准备烧写工具“BurnTool”通过BurnTool工具烧写镜像。具体步骤如下:
在BurnTool界面中,单击“Option”按钮,选择“Change chip”,从“Chip List”下拉菜单中选择“BS21”,并单击“OK”即可,如图1所示。
图 1 BurnTool更换芯片示例

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

勾选“Auto burn”以及“Auto disconnect”选项;
选择“Setting”→“Settings”,配置串口参数,默认配置如图3所示,baud配置为921600。
说明:
Force Read Time:定时读取的时间,以毫秒为单位。勾选时为定时读取串口,不勾选时为事件触发读取串口。适用于不勾选该选项无法正常烧录的场景。图 3 串口设置示例

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

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





