OTP/EFUSE 配置
OTP
概述
OTP模块共有三组接口,分别为系统端的AHB和APB,加密端的APB。其中系统端连接总线,而加密端通过shanhai安全引擎访问。AHB的基地址为0x4B010000,APB的基地址为0x4B100000。
OTP主要有三块区域,分别为OTP,OTP2,PUF区域。
OTP有256*32bit共8Kb存储空间,系统端权限为读写/只读/无法访问,加密端权限为读写。
OTP2有768*32共24Kb存储空间,系统端权限为读写/只读/无法访问,加密端没有连接OTP2的通路。
PUF有64*32共2Kb存储空间。前1K用于存放UID,后1K用于存放生成随机数的熵池。系统端对于UID的权限为只读或无法访问,对熵池的权限为只读/无法访问。加密端对UID的权限为只读/无法访问。PUF需要注册后才能生效。
OTP对区域的操作有四种:安全范围划分,权限管理、屏蔽和清零。
安全范围划分可以将区域划分为安全与非安全,系统端的非安全访问安全区域会得到被屏蔽后的全F数据。加密端不受影响。安全范围可以多次划分,但是不能划分OTP2区域。
权限管理可以配置每个otp8bit的权限,将访问权限从只读变为不可访问。权限管理的配置是一次性的。
屏蔽也可以将区域的只读权限变为不可访问,但是重新上电复位可以将屏蔽恢复。屏蔽操作也有一个锁来控制,如果置锁,则连同锁一起,将不能再更改屏蔽,但重新上电后会恢复。
清零操作可以将OTP和PUF区域进行清零,可以读取指示来得知某区域是否被清零,并且可以限制非安全清零操作。清零操作只可以操作OTP和PUF区域。
OTP 布局

AHB Side
0x000~0x2FF OTP2:存储区2 可读可编程的OTP2区域,被分为767个小分区。每个分区都可以通过改变LOCK OTP2 CELL来更改权限:读写->只读->不可访问。
APB Side
0x000~0x100 PIF:配置PUF和OTP权限的区域 0x200~0x240 PTR:Test Row 0x240~0x280 PTC:Test Column 0x2A0~0x2A4 RNG:随机数生成区域 0x2B0~0x2B4 INT 0x2B4~0x2C0 PMK:Mask区域 0x2C0~0x2F4 PTM:状态表征区域 0x300~0x400 PUF:随机数注册区域 0x400~0x7FC OTP:主存储区
三组接口可访问的区域如上图所示,其中系统端的权限可以被NA,但是shanhai加密端不能被NA。另外,shanhai需要使用OTP部分的信息作为自己的配置。但是shanhai不支持偏移地址,而OTP的存储区是有0x0400的偏移地址的。所以在设计上shanhai访问OTP的地址进行了相应的偏移,偏移量为0x500。
OTP 硬件区
1.0x400~0x45F: 存放memcheck结果 2.0x460~0x47F: 存放flash_key 3.0x480~0x47F: 预留给硬件使用
OTP 软件区

BL1 OTP 项
需要使能efuse的第0bit和第3bit,从而进行安全启动(该操作不可回退!一旦启用安全启动就不能关闭,请谨慎。)
BL2 OTP 项
TODO
FLASH AES KEY
用于AES加密的密钥,地址范围为0x4B100460~0x4B100480,共32Bytes。当前使用的AES KEY为:(high) 73c7bf39|7f2ad6bf|4e7403a7|b965dc5c|e0645df0|39c2d69c|814ffb40|3183fb18 (low) 所以向OTP写入时,要注意低地址在前先写入,按照word来进行倒转,得到(low)3183fb18|814ffb40|39c2d69c|e0645df0|b965dc5c|4e7403a7|7f2ad6bf|73c7bf39(high)
其他 OTP 项
EFUSE
EFUSE 共有 4x8 共 32 Bits, 其中每个 Bit 的含义不同。可以通过总 BKFIL 配置。
index |
name |
|
---|---|---|
0 |
security boot enable |
0: 不使能安全启动。1: 使能安全启动。 |
1 |
security boot debug mode |
0: 使能安全启动调试信息。1: 关闭安全启动调试信息。 |
2 |
fast boot disable |
0: 使能快速启动;1: 关闭快速使能。 |
3 |
boot mode |
0:传统下载模式;1: 安全启动模式。 |
4 |
security boot clock select |
0: 安全启动使用 XTAL 时钟;1: 安全启动使能 PLL。 |
5 |
random delay enable |
0: 关闭了随机延时;1: 使能随机延迟。 |
6 |
direct jump enable |
0: 关闭安全启动直接跳转;1: 使能安全启动直接跳转。 |
7 |
security boot critical error |
0: 不关闭安全启动中严重错误打印;1: 关闭安全启动中严重错误打印。 |
8~19 |
reserved |
保留位 |
20 |
attack_nmi_enable |
0: 检测到注入攻击时不产生 NMI;1: 检测到注入攻击时产生 NMI。 |
21 |
spi_to_ahb_disable |
0:SPI 到 AHB 通路不关闭;1: SPI 到 AHB 通路关闭。 |
22 |
auto_reset_enable[0] |
温度电压异常复位 |
23 |
auto_reset_enable[1] |
温度电压异常复位 |
24~28 |
reserved |
保留位 |
29 |
flash aes enable |
0: FLASH AES 加密未使能;1: FLASH AES 加密使能。 |
30 |
spi_dld_disable |
0: SPI 下载使能;1: SPI 下载关闭。 |
31 |
reserved |
保留位 |
BIT(0) - security boot enable
EFUSE 中有两位与安全启动使能相关:
BIT(3) - boot mode 用于设置启动模式。0 表示传统下载模式,此时可通过 UART 下载版本;1 表示安全启动模式,设置成安全启动模式之后还需要通过 BIT(3) 使能安全启动。
BIT(0) - 使能安全启动。仅在 BIT(3) 设置成 1(安全启动模式)时有效,表示是否使能安全启动。
当 BIT(0) 置 0 时,表示安全启动未使能,此时 BL1 认为 IMAGE 中的公钥合法,即不会使用 IMAGE 中的公钥与 OTP 中的公钥 HASH 做比对,仅做 IMAGE 完整性验证。因此,这时 OTP 中即使不配置公钥 HASH 系统依然能启动。
当 BIT(0) 置 1 时,表示安全启动使能,要求 OTP 中必须配置公钥 HASH,否则启动失败。
BIT(1) - security boot debug mode
BL1 定义了两级调试信息来供用户定位问题,分别由 EFUSE BIT(1)/BIT(7) 来控制,其中 BIT(1) 控制普通调试信息,BIT(7) 控制严重错误。
普通调试信息除了错误之外,还包括一些流程性的日志打印。
严重错误通常是指会导致 BL1 启动失败的错误,当前 BL1 支持下述严重错误:
错误码 |
含义 |
---|---|
0x1 |
读 EFUSE 出错 1 |
0x2 |
读 EFUSE 出错 2 |
0x3 |
读 FLASH 出错 1 |
0x11 |
CPU 异常 NMI |
0x12 |
CPU 异常 MemMange |
0x13 |
CPU 异常 HardFault |
0x14 |
CPU 异常 BusFault |
0x15 |
CPU 异常 UserFault |
0x16 |
CPU 异常 SecurityFault |
0x21 |
OTP 为空 |
0x22 |
公钥为空 |
0x23 |
跳转 BIN 校验失败 |
0x1xxx |
OTP 读失败 |
0x8yyyyyyy |
验签失败 |
其中 xxx 指 OTP 的 OFFSET,yyyyyyy 指具体的验签失败点。
严重错误在打印时仅打出错误码,如 “E16” 表示CPU 异常 SecurityFault。
备注
当严重错误使能时,BL1 安全启动时并不会初始化 UART,仅当产生了不可回复的严重错误时才会初始化 UART,进行打印。 因此,严重错误并不会影响正常启动功能,也不会带来安全问题。
重要
一般在开发阶段,尤其是尚未在任何板子上成功配置过安全启动之前,建议开启普通日志,这样,可以看到更多调试信息; 在熟悉了安全启动配置之后,或者在量产阶段,应该关闭普通日志。严重错误则建议在量产版本中也不要关闭。
BIT(2) - fast boot disable
BIT(2) 用于关闭 Fast Boot 启动。0 表示 Fast Boot 使能,1 表示关闭。
Fast Boot 用于控制系统从 Deep Sleep 醒来的流程,当 Fast Boot 使能时,Deep Sleep 醒来后跳过安全启动,直接跳转到应用程序中; 当 Fast Boot 关闭时,则与上电重启类似,会做完整的安全启动。
重要
Fast Boot 使能时,启动速度更快,但不够安全;Fast Boot 关闭时,启动速度较慢,但安全可靠。 应用应该依据实际需求决定是否开关 Fast Boot。
BIT(3) - boot mode
请参考 BIT0。
BIT(4) - sb clock select
BIT(4) 用于使能安全启动高频模式。0 表示 CPU 与 FLASH 使用 XTAL 作为时钟,通常为 26Mhz,1 表示使能 PLL,CPU 与 FLASH 配置 在高频模式。在高频模式下,安全启动速度更快,对启动性能有要求的应用一般建议使能高频模式。
BIT(5) - random delay enable
BIT(5) 用于使能随机延时,0 表示随机延时关闭,1 表示开启。当随机延时开启时,BL1 在调用关键函数前,都会做一个随机 delay, 通过这种机制减缓故障注入攻击带来的影响。
备注
随机延时使能会增加安全启动时间,除非对注入攻击防范特别高的应用,通常不建议打开随机延迟功能。
BIT(6) - Direct Jump
BIT(6) 用于配置 BL1 验签完之后的跳转方法,0 表示间接跳转,1 表示直接跳转。
使用间接跳转时,BL1 在验签完之后不是直接跳转到被验的 IMAGE,而是先跳转到一个中间 BIN,然后由中间 BIN 再跳转到目标 IMAGE。 使用直接跳转时,BL1 在验签完成之后直接跳转到被验的 IMAGE。
备注
当使用间接跳转时,中间 BIN 也会包含在 IMAGE 中一起验签,因此是安全的。
BIT(7) - security boot critical error
请参考 BIT1。
BIT(20) - attack NMI
BIT(20) 用于配置在检测到故障注入攻击之后是否产生 NMI 异常。为 0 时 BL1 不会进行硬件层面的故障注入攻击检测, 为 1 时 BL1 会进行硬件层面的故障注入攻击检测,当检测到攻击时产生 NMI 异常。
备注
对故障注入攻击特别关注的应用,建议打开这个开关。
BIT(29) - flash aes enable
BIT(29) 用于使能 FLASH AES 加密,0 表示 FLASH AES 加密不使能,1 表示 FLASH AES 加密使能。
BIT(30) - spi download disable
关闭 SPI 下载功能。为 0 时支持 SPI 下载;为 1 时关闭 SPI 下载。
重要
为避免带来安全隐患,量产版本中应该禁用 SPI 下载。但在尚未成功部署安全启动之前,可先不要禁用 SPI 下载, 这样,当安全启动部署失败时,依然可通过 SPI 下载将版本下载到 FLASH。否则,一旦安全启动部署失败,就再 也无法下载版本,板子变砖。
OTP/EFUSE 配置
使用BKFIL
使用BKFIL工具将配置表文件内容配置OTP和EFUSE,在BKFIL命令行使用–safe-json选项可按照配置表.json文件配置OTP和EFUSE。 或者使用BKFIL界面来进行配置,如图所示

配置文件的格式如下:
数据格式:
"name": "otp_ns_user_space", #名称,仅用于区分含义,无其他功能
"mode": "write", #读或写操作,write/read
"permission" "NA", #配置该OTP区域权限,仅在写模式生效
"start_addr": "0x4B100590", #操作的起始地址
"last_valid_addr": "0x4B100600", #当前区域可以最大合法操作的位置
"byte_len": "0x8", #操作的数据的长度
"data": "123456789ABCDEF", #操作的数据的内容,读时为空,写为空时不写入
"data_type": "hex", #操作的数据的类型,有hex/ascii两种
"status": "false" #该操作是否生效,true时执行,false为不执行
区域开关:控制四个区域的开关,分别为用户可操作区域,efuse区域,安全控制区域,安全数据区域。其中efuse区域和安全控制区域用于配置efuse相关bit,而用户操作区域和安全数据区域用于配置otp相关bit。开关设置为“true”生效,为”false”时失效。
用户可操作区域:当User_Operate_Status设置为true时该配置区域生效,可以根据用户自己的需求配置相关区域。用户可配置的区域为0x4B100600~0x4B100700,对应的OTP location为128~192。
efuse区域:对efuse进行读写操作,由于efuse按bit生效,整体操作容易出错,一般在安全控制区域用单个bit进行写,一般在efuse区域进行读操作。
安全控制区域:用于单个bit写入efuse,数据格式如下:
"enable_security_boot": "0,0,1",
"disable_fast_boot": "0,2,0",
"enable_flash_aes": "3,5,1"
前面的为名称,后面的三个数据分别代表第几个字节,第几bit,写1还是0。示例分别向第0字节的第0和2bit写入1和0,向第3字节的第5个Bit写1。
安全数据区域:对otp区域进行读写操作。如读取AES加密用密钥。
"name": "flash_aes_key",
"mode": "read",
"start_addr": "0x4B100460",
"last_valid_addr": "0x4B100480",
"byte_len": "0x20",
"data": "",
"data_type": "hex",
"status": "true"
通过CPU读写寄存器
通过CPU读写寄存器可以实现前述的四种操作,将OTP,Efuse作为一般外设来进行操作。 需要进入Armino的Cli窗口。在otp driver初始化之后,输入otp write/read location data命令,如 otp write 156 0x1234,即可在location 156的otp区域写入数据0x1234。 如需更改权限等操作,可以参考cli端的help。
配置 BL1 公钥 HASH
Public key hash地址为 0x4B100528~0x4B100548,内容为(low)2af1f2236872981bdf2f17975fb3029fad171de61741a383ef2c621fd5f5cf62(high) 如下图所示在config的security data区域中添加相应字段。

配置 BL2 公钥 HASH
配置 FLASH AES KEY
如下图所示在config的security data区域中添加相应字段。

配置示例
如图所示,在User_operate区域添加一个字段,写入6个字节BK7258,以ascii码的方式解析,
