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 | 读取的数据 |
使用建议
- 写入前先读取: 避免覆盖重要数据
- 锁定前先验证: 用读指令确认数据正确后再锁
- 并发安全: 不同地址的读写可并发, 但同地址的写/锁/擦不应并发
- 超时设置: 建议 timeout ≥ 1000ms (OTP 物理操作慢)