跳转至

OTP (一次性可编程) 指令

对应源码: components/airlink/src/luat_airlink_cmds.c

启用宏: LUAT_USE_AIRLINK_EXEC_OTP (主指令), LUAT_USE_AIRLINK_EXEC_OTP_CB (读回调)

OTP 指令用于主机读写从机的 OTP (One-Time Programmable) 区域, 通常用于保存出厂校准数据、唯一标识、安全密钥等不可变数据.

通用 payload 头

所有 driver 指令的 data 字段前 8 字节是 seq_id (uint64_t, 小端, 单调递增), 用于匹配 cmd 0x08 result 回调. 详见 指令层描述.

指令列表

cmd 名称 方向 启用宏 说明
0x900 otp_write 主→从 LUAT_USE_AIRLINK_EXEC_OTP 写入 OTP 区域
0x901 otp_read 主→从 LUAT_USE_AIRLINK_EXEC_OTP 读取 OTP 区域 (同步)
0x902 otp_lock 主→从 LUAT_USE_AIRLINK_EXEC_OTP 锁定 OTP 区域 (锁定后不可写)
0x903 otp_erase 主→从 LUAT_USE_AIRLINK_EXEC_OTP 擦除 OTP 区域 (取决于芯片支持)
0x904 otp_read_cb 从→主 LUAT_USE_AIRLINK_EXEC_OTP_CB 异步读结果回调

各指令详细定义

otp_write (0x900)

写入 OTP 区域.

字段 长度 含义
seq_id 8B 序列号
addr 4B OTP 起始地址 (字节)
len 2B 写入长度 (字节)
data NB 待写入数据

注意: OTP 通常按位/字节编程, 写入速度可能较慢, 调用方应预留超时 (建议 ≥ 1 秒).

otp_read (0x901)

读取 OTP 区域 (同步返回).

字段 长度 含义
seq_id 8B 序列号
addr 4B OTP 起始地址 (字节)
len 2B 读取长度 (字节)

结果通过 cmd 0x08 回调:

字段 长度 含义
req_pkgid 8B 对应请求的 seq_id
result_code 2B 0 = 成功, 负值 = 错误
data NB 读取的数据

otp_lock (0x902)

锁定 OTP 区域.

字段 长度 含义
seq_id 8B 序列号
addr 4B OTP 起始地址 (字节)
len 2B 锁定长度 (字节)

警告: 锁定后该区域通常不可再写入或擦除, 调用前必须确认.

otp_erase (0x903)

擦除 OTP 区域. 仅在 OTP 芯片支持擦除时有效 (许多 OTP 物理上不可擦除).

字段 长度 含义
seq_id 8B 序列号
addr 4B OTP 起始地址 (字节)
len 2B 擦除长度 (字节)

otp_read_cb (0x904)

异步读结果回调. 从机主动发送.

字段 长度 含义
req_pkgid 8B 对应 otp_read 请求的 seq_id
result_code 2B 0 = 成功, 负值 = 错误
data NB 读取的数据

使用建议

  1. 写入前先读取: 避免覆盖重要数据
  2. 锁定前先验证: 用读指令确认数据正确后再锁
  3. 并发安全: 不同地址的读写可并发, 但同地址的写/锁/擦不应并发
  4. 超时设置: 建议 timeout ≥ 1000ms (OTP 物理操作慢)
问一下 AI