UID 加密 · 量产写入时机与锁定顺序
编制日期 2026-09-21 | 版本号 Rev 1.0
XTX 芯天下 · FAE 现场技术文档 | 量产 UID / 安全写入的时机、锁定顺序与回滚 | 2026-09 版
UID 寄存器地址、CID 各字段定义与位宽、RPMB 密钥 provisioning 命令、OTP / 安全寄存器锁定位与锁命令码,全部以具体料号 datasheet 与 SD/eMMC(JEDEC)规范为准;本文只讲机制、顺序与排查套路。
- SDK / 烧录器能读写 OTP / 安全寄存器,只证明寄存器可访问,不证明写入时机正确 / 锁定顺序正确——这两件事之间隔着本文全部雷区。
- 本文讨论的是量产写入时机与锁定顺序,与「烧录器找不到型号」「烧录成功但不开机」是不同问题,判别要点:器件能正常烧录,但 UID / 安全区写不进、锁不对、或写错后报废,归本文。
- 涉及OTP 锁定位、RPMB 密钥写入、eMMC 写保护多为不可逆操作,一旦锁死 / 写丢密钥通常不可恢复,动手前请逐条核对 datasheet 并保留可回退的工位设计。
- 不确定的命令码、寄存器地址、位域要么查证要么不写,宁可在文档里标注「以 datasheet 为准」。
一句话结论:UID / 安全相关写入必须遵循 功能烧录通过 → 写入 UID / 派生密钥(可逆阶段)→ 读回校验 → 再执行不可逆锁定。 可写窗口只有 T2 一段;锁早了写不进、锁晚了被固件擦、锁完再校验部分平台只读 0xFF。 样机调试阶段绝对不要启用量产锁定位。
这份文档解决什么
解决的是XTX 芯片在量产前 / 量产中,UID 加密方案「什么时候写、按什么顺序锁」 这一类问题:写早了被固件烧录擦掉、写晚了被锁定挡在门外、锁定顺序错了引发读 0xFF 或半锁、 派生密钥写错再锁整片报废、锁死后 RMA 复用困难。覆盖 SPI NOR / SD NAND / eMMC 三种介质的 UID 机制差异,全文按「机制 → 时序 → 时机错误 → 锁定雷区 → 派键 SOP → 验证 → RMA → 防复发」组织, 第 9 章是可直接翻查的速查表,第 10 章是可带进车间的参数卡与双人复核清单。
怎么用这份文档
- 先定介质:确认板上装的是 SPI NOR / SD NAND / eMMC 哪一种,三者的 UID 来源与锁定语义完全不同(第 1 章)。
- 对时序:把当前工程套到 T0–T5 时间轴上,确认 UID 写入落在 T2、锁定落在 T3(第 2 章)。
- 查时机错误:出现「写不进 / 被擦 / 半锁」时,按第 3 章五种模式对号入座。
- 查锁定雷区:出现「锁后读 0xFF / SR 位异常」时,看第 4 章的相互作用与地址差异。
- 闭环到装板实跑:任何写入 / 派生 / 锁定动作,最终判定以「主控真实走鉴权路径成功」为准(第 6 章)。
1. 问题本质:UID 是什么 / 三类介质差异
「UID 加密」在产线上被说得很轻巧,但落到三种不同介质上,它的含义、可写性、锁定语义完全不同。 如果把 SPI NOR 的「写 OTP UID 区」经验直接套到 SD/eMMC 的「CID 只读 + RPMB 密钥」上, 第一脚就会踩空。本章先把 UID 的本质讲清楚,再给出三类介质的对照,让后面所有时序与顺序讨论都站在同一套定义上。
1.1 什么是 UID / 设备唯一标识
UID(Unique ID,设备唯一标识符)是用来在一大批同型号、同批次的芯片里区分每一颗个体的标识。 量产加密(绑定授权、防伪、 license 锁、固件防抄)几乎都建立在「每颗片有一个别人没有、且出厂后不可篡改的标识」之上。 但这个标识的来源在三种介质上完全不同:
- SPI NOR:芯片内部有一个 OTP(One-Time Programmable)安全寄存器区,出厂时写入一个 128-bit UID(含设备唯一序列号),用户可在量产时往这个 OTP 区再写一次自定义数据并锁定。
- SD NAND:出厂时由厂商在 CID 寄存器里烧好 128 bit 标识,其中 PSN(Product Serial Number,32-bit)是真正的唯一序列号;CID 对产线是只读的,不可改写。
- eMMC:同样有只读的 CID 128 bit(PSN 作唯一序列号),另外还有一个独立的 RPMB(Replay Protected Memory Block)分区,其 256-bit 鉴权密钥是一次写入、不可读回的。
一个容易混淆的点是:UID 解决的是「认得这颗片」,而加密 / 鉴权解决的是「只有我和这颗片之间算得通」。 UID 本身往往不秘密(尤其 SD/eMMC 的 CID.PSN 是工厂公开烧录的),真正提供安全强度的是派生密钥与 RPMB 鉴权。 所以量产方案通常是「用 UID / CID.PSN 作设备唯一索引,再绑定一份密钥」——UID 负责定位,密钥负责保密,两者不可混为一谈。
对 SPI NOR,确实存在一个「写 OTP UID 区」的动作;对 SD/eMMC,CID 根本不可写,所谓「写入 UID」通常是指 读出出厂 CID.PSN 并绑定到客户系统,或把客户自己的 UID / 派生密钥写进受保护分区 / 用户 OTP。 混淆这两者,是「烧录器误擦」「写错位置」两类事故的思想根源。
1.2 三类介质 UID 机制对照
下面这张表把三种介质的 UID 来源、可写性、锁定语义并排放,后面所有时序图、顺序图、雷区都建立在这张表之上。
| 介质 | UID 来源 | 可写性 | 锁定语义 | 唯一 ID 怎么用 |
|---|---|---|---|---|
| SPI NOR | 128-bit UID(OTP 安全寄存器区)+ 设备唯一序列号 | OTP 区可写一次,锁定后只读 | 写锁定位(以 datasheet 为准),部分平台锁后读 0xFF | 直接读 OTP UID 作设备标识 |
| SD NAND | CID 128 bit(MID/OID/PNM/PSN/MDT/CRC,工厂烧录) | CID 只读不可写;客户 UID 写受保护分区 / 用户 OTP | 保护分区 / 用户 OTP 的写保护位 | 读 CID.PSN 绑定,或写客户 UID 到保护区 |
| eMMC | CID 128 bit + RPMB 密钥 256 bit(独立不可逆) | CID 只读;RPMB 密钥 one-time 写入不可读回 | RPMB 密钥一次性 provisioning,无回退 | CID.PSN 作标识 + RPMB 鉴权访问 |
1.3 为什么顺序比内容更致命
UID / 派生密钥写什么内容往往有算法保证(密钥派生函数、哈希),出错概率相对低; 真正在量产地狱里反复出现的,是写在错误的时机、按错误的顺序锁: 写早了被固件擦掉,写晚了被锁挡门外,锁完再校验却只读 0xFF 以为成功,掉电卡在半锁态。 这些都不是算法问题,是流程顺序问题,而流程顺序要靠参数卡与双人复核去固化(见第 10 章)。
| 状态 | 是否可逆 | 能做什么 | 不能做什么 | 对应时间点 |
|---|---|---|---|---|
| ① 可写 | —(尚未写) | 正常烧录、读回、调试 | — | T0–T1 |
| ② 已写未锁 | 是,可回滚 | 读回校验、重写、清密钥 | 视为已定型 | T2 |
| ③ 已锁 | 否,不可逆 | 只读、走鉴权路径 | 再写、改密钥、读密钥 | T3 之后 |
普通数据写错,重烧一遍就好;UID / 安全写入写错,往往没有重来的机会。 原因有三:① OTP / 安全寄存器是一次性的,写错即永久; ② RPMB 密钥是不可读回的,写丢即不可恢复; ③ 锁定命令一旦下发,整片进入不可逆状态,连「擦掉重来」都不行。 所以 UID 量产的本质不是「把数据写进去」,而是在唯一一次可逆窗口里,把对的东西写在对的时机、对的地址。
把整个 UID 量产拆成三个可证伪的状态:① 可写(T2 之前、锁之前)、 ② 已写未锁(可逆,可回滚)、③ 已锁(不可逆,写不进、部分平台读 0xFF)。 任何工位动作都要先回答「此刻处于哪个状态」,再决定能不能动。
2. 方案总览:量产时序与锁定顺序
量产 UID / 安全写入不是一次「写下去」的动作,而是一条有严格先后顺序的序列。 把整条产线时间拆成 T0–T5 六个关键点,UID 写入只落在 T2、锁定只落在 T3,中间还隔着一道校验门禁。 本章先把这条时序画清楚,再给「锁定顺序铁律」——后面所有事故(第 3、4 章)都是对这两条纪律的违反。
提醒一个工程现实:上面六个时间点不是六个独立工位,往往压缩在一台烧录器 / 一台 ICT 里连续完成。 越是「一台设备一气呵成」,越容易把「写 UID」「校验」「锁定」偷懒合并成一步,从而跳过校验门禁。 因此时序纪律不能只写在文档里,必须硬化进烧录工程的步骤与脚本(第 10 章参数卡)。
2.1 量产时间轴 T0–T5 与可写窗口
下面这条时间轴把一次量产从「上电」到「出货」拆成六个阶段,并高亮出 UID 可写窗口(T2→T3)。 注意:可写区间只有 T2 到 T3 这一小段,写早了被 T1 的固件整片擦掉,写晚了被 T3 的锁定挡在门外。
极端一:把 UID 写入放进「烧录固件」的工程里一并做。 很多烧录器工程在写固件前会先整片擦除,于是 UID 刚写进去就被下一句的整片擦清掉—— 表现就是「每次读 UID 都是空 / 全 0」。正确做法:固件烧录与 UID 写入必须是两个独立 pass, 且 UID 写入 pass 放在固件烧录 pass 之后。
极端二:先锁后写。锁定命令一旦下发,OTP / 安全寄存器 / 保护位就关上了,再写 UID 会直接失败或静默丢弃。 表现就是「写入返回成功(或没报错)但读出来就是没有」。必须把写动作严格放在锁之前。
2.2 锁定顺序铁律:写密钥 → 校验 → 再锁
「先写后锁」只是半句纪律,完整版是写密钥 → 读回校验 → 再锁。 中间那道「读回校验」是生死门:它决定了你锁的是「对的密钥」还是「错的密钥」。 下面这张图给出正确顺序,以及三个绝对禁止的动作。
部分平台在锁定之后,安全寄存器 / OTP 区的读操作会固定返回 0xFF(这是某些器件的锁定后行为,以 datasheet 为准)。 如果校验脚本在「锁之后」才去读,读到的 0xFF 容易被误判为「写入成功 / 已锁定」。 正确做法:所有读回校验必须在锁定之前完成;锁之后只做「只读确认不可写」的检查,不做「内容等价」判断。
2.3 把两条纪律落到参数卡
两条纪律(时序 T2→T3、顺序 写→校→锁)必须固化进烧录参数卡,而不是靠操作员记忆。 参数卡至少要记录:UID 写入 pass 的先后顺序、锁定命令的触发条件、校验门禁的失败处置。第 10 章给出可直接使用的参数卡模板。
| 纪律 | 要求 | 违反后的典型事故 | 对应章节 |
|---|---|---|---|
| 时序纪律 | UID 写入在 T2,锁定在 T3,二者之间完成校验 | 写早被擦 / 写晚锁死 / 半锁 | 第 3 章 |
| 顺序纪律 | 写密钥 → 读回校验 → 再锁定 | 锁后读 0xFF 误判 / 错钥报废 | 第 4 章 |
| 地址纪律 | 按料号查 OTP / CID 地址,保护位先行 | 写到错位置 / 被误擦 | 第 8 章 |
| 验收纪律 | 装板实跑走主控鉴权,非只读寄存器 | 寄存器读回≠功能 OK | 第 6 章 |
2.4 把时间点映射到状态机
把 T0–T5 翻译成第 1 章的三个状态(可写 / 已写未锁 / 已锁),可以更直观地判断「此刻能不能动 UID」: T2 是唯一允许写的时间点,T2→T3 之间是唯一允许校验与回滚的窗口,T3 之后任何写动作都是无效或静默丢弃。
| 时间点 | 如果 UID 动作发生在此时 | 后果 | 判定状态 |
|---|---|---|---|
| T0 上电 | 尚未开始,正常 | — | ① 可写 |
| T1 烧固件 | 固件烧录整片擦会清掉已写 UID | UID 被擦(模式①) | ① 可写 |
| T2 写 UID | 正确时机:写密钥 / UID | 可写可校验 | ② 已写未锁 |
| T2→T3 之间 | 校验、回滚的最佳窗口 | 可逆,可补救 | ② 已写未锁 |
| T3 锁定 | 正确时机:发锁定命令 | 进入不可逆 | ③ 已锁 |
| T4 首件 | 只读确认 + 装板实跑 | 验收 | ③ 已锁 |
| T5 出货 | UID 已固化 | — | ③ 已锁 |
整条量产可以压缩成一条链:T1 烧好固件 → T2 写 UID/密钥并立即读回校验 → 校验通过才进 T3 锁定 → T4 首件只读鉴权 → T5 出货。任何把顺序打乱的动作,都对应第 3、4 章里某一类事故。
3. 写入时机错误:五种失败模式
时序纪律一旦被打破,现场会呈现出几种高度相似的「写不进 / 被擦 / 半锁」症状。 本章把写入时机错误归成五类,给出每一类的现象、后果与处置,让现场拿到一块「UID 不对」的板能直接对号入座。 这五类里,①②⑤ 是时间轴错位,③④ 是定位错位,处置思路完全不同。
3.1 五种模式一览
拿到「UID 写不上 / 写错」的板,先问三个问题:① 它是在固件烧录之前还是之后写的? (之前 → 模式①;之后才对)② 写的时候区有没有被锁?(已锁 → 模式②) ③ 读出来是空 / 全 0,还是写到别的值?(全 0 / 空 → 模式③被擦或①;值错位 → 模式④地址错)。 掉电引起的半锁往往伴随「时好时坏、锁状态读不稳定」→ 模式⑤。
3.2 模式①⑤ 的时间轴处置
模式①(写早)与模式②(写晚)是纯顺序问题,用第 2 章的时序纪律即可根治:确保 UID 写入 pass 在固件烧录 pass 之后、 锁定命令之前。模式⑤(掉电半锁)则需要在工位层面加防护:UID 写入 pass 入口加断电检测, 中途掉电视为失败并隔离,不允许「半写半锁」的片流入下一工位。
| 模式 | 现象 | 后果 | 处置 |
|---|---|---|---|
| ① 写早 | 每次读 UID 为空 / 全 0 | 固件整片擦清掉 UID | 固件烧录与 UID 写拆成两个 pass,UID 在后 |
| ② 写晚 | 写入无报错但读不到 | UID 区已锁,写被丢弃 | 把写动作严格放在锁命令之前 |
| ⑤ 半锁 | 锁状态读不稳定、时好时坏 | 半锁态难修复 | UID pass 加掉电检测,中途掉电即隔离 |
3.3 模式③④ 的地址 / 保护位处置
模式③(烧录器误擦)与模式④(地址错)不是时间问题,而是写到哪里、有没有被保护的问题: OTP / 安全寄存器 / 用户保护分区在烧录器里常常和主数据区共用同一个「擦除」入口, 多芯片之间 OTP 区地址又不统一,于是出现「擦主区顺便把 UID 擦了」「同工程换料号写到错地址」。 这两类放到第 8 章专门讲地址表与保护位。
3.4 两类错误的处置分界
把五种模式先归成两类,再决定从哪下手,能避免「一上来就整片重烧」这种最浪费的动作。时序类错误改流程顺序即可, 定位类错误改地址表与保护位即可,二者手段不同、不能混用。
| 类别 | 包含模式 | 根因 | 处置抓手 |
|---|---|---|---|
| 时序类(时间轴错位) | ①②⑤ | 写早 / 写晚 / 掉电半锁 | 参数卡固定 T2/T3 + 掉电门禁 |
| 定位类(写到哪) | ③④ | 地址错 / 被误擦 | 地址表 + 保护位 + pass 隔离 |
时序类(①②⑤)→ 用参数卡固定 T2/T3 与掉电门禁;定位类(③④)→ 用地址表 + 保护位固定「写哪个地址、不被谁擦」。 先分诊是哪一类,再动手,不要一上来就整片重烧。
4. 锁定顺序雷区:锁后再校验的坑
时序与顺序纪律(第 2 章)定的是「写在哪里、按什么先后」,本章讲的是顺序里最致命的几个雷: 锁完再去读被当成校验、状态寄存器(SR)的写保护位牵动 OTP 锁、不同厂商 OTP 区基地址不统一。 这三类雷不发作时一切正常,一发作就是「锁死且读来读去都是错」的死局,必须在流程里提前排掉。
三类雷的共性,是它们都不会在写入那一刻报错:写的时候脚本返回「成功」,锁的时候也「成功」, 直到下游装板实跑或 RMA 才发现「UID 是空的 / 错的 / 读不到」。这正是它们比「写不进」更危险的地方—— 失败被延迟到离产线最远的地方才暴露。所以对抗它们不能靠事后发现,只能靠锁前预检(见 4.4 清单)。
4.1 三类雷区一览
某些 SPI NOR 在安全寄存器 / OTP 区锁定之后,读操作固定返回 0xFF(这是器件锁定后的定义行为之一,以 datasheet 为准)。 如果校验脚本在「锁之后」才去读内容,读到的 0xFF 会被误判为「已锁定 / 写入成功」,整批带着空 UID 出货。 排法:所有内容等价校验必须在锁定命令之前完成;锁之后只做「不可写」确认,不做内容判断。
4.2 雷区 B:SR 与 OTP 锁定位的相互作用
SPI NOR 的状态寄存器(SR)里有 BP(Block Protect)位、WPS(Write Protect Selection)位等, 它们与 OTP / 安全寄存器的锁定位在某些器件上会相互牵连:清掉 SR 的写保护、或切换 WPS 模式时, 可能顺带把 OTP 锁定位也清掉或置上。现场表现为「明明锁了,一改别的地方锁又开了 / 关了」。
| 操作 | 可能影响 | 处置 |
|---|---|---|
| 清 SR 写保护(WEL/写保护脚) | OTP 锁定位被意外清除 | 锁前先读 SR 全量值,比对预期 |
| 切换 WPS 模式 | OTP 锁定语义变化 | 锁定全程保持 WPS 一致,不中途切换 |
| 写 BP 位保护主区 | 误把 OTP 区也纳入/移出保护 | 按 datasheet 确认 BP 与 OTP 区是否相关 |
在发锁定命令之前,先完整读出 SR 当前值,确认 BP / WPS 与 OTP 锁定位处于预期组合; 锁定后再读一次 SR 做「锁后快照」,两帧不一致即报警隔离。SR 位定义、WPS 含义、OTP 锁定位位置以具体料号 datasheet 为准。
4.3 雷区 C:多芯片 OTP 地址不统一
不同厂商、甚至同厂商不同系列的 SPI NOR,OTP / 安全寄存器区的基地址、锁命令码、安全寄存器个数都不完全一样。 同一份烧录工程换料号使用,极容易「按 A 料的地址写,结果写到了 B 料的普通区 / 错寄存器」—— UID 看起来写上了,其实没进 OTP,锁也锁了个寂寞。这类问题在替代料、二供引入时最高发。
| 风险点 | 表现 | 处置 |
|---|---|---|
| OTP 基地址不同 | 写到错寄存器 / 普通区 | 按料号建 OTP 地址映射表,工程引用表 |
| 锁命令码不同 | 锁定命令被器件忽略 | 命令码按料号从 datasheet 取,不入硬编码 |
| 安全寄存器个数不同 | 只锁了部分寄存器 | 锁前枚举寄存器数,逐区确认锁定 |
4.4 三颗雷的预检清单
把三类雷的排法落成锁前必做的三道预检,写进参数卡;任何一道预检不过,流程不得进入锁定步骤。
| 雷区 | 预检动作(锁前必做) | 失败表现 | 处置 |
|---|---|---|---|
| A 锁后读 0xFF | 锁前完成全部内容校验 | 锁后读全 FF | 禁止锁后判内容 |
| B SR 牵连 OTP | 锁前 / 锁后各读一次 SR 快照 | 两帧 SR 不一致 | 隔离,重审锁位 |
| C 地址不统一 | 按料号查地址映射表 | 写到错寄存器 | 地址表替代硬编码 |
雷区 A 用「锁前校验门禁」排,雷区 B 用「SR 状态预读 + 锁后快照」排,雷区 C 用「按料号地址映射表」排。 三者在参数卡里都是必填项,见第 8、10 章。