分区表损坏的识别:启动日志分析、串口打印信息解读、分区表校验失败特征
说实话,我见过太多工程师一上来就拿着烧录器怼,烧录失败就怀疑硬件坏了。其实很多时候,问题出在分区表上。分区表一坏,芯片就像丢了地图,根本不知道从哪里启动、该加载什么。
那怎么判断分区表是不是坏了?别急,咱们从三个角度来诊断:启动日志、串口打印信息、校验失败特征。这三板斧下去,基本八九不离十。
3.1 启动日志分析:芯片在说什么?
芯片上电后,第一件事就是跑 BootROM。BootROM 会尝试从预设的启动介质(比如 SPI Flash、eMMC、NAND)读取分区表。如果分区表坏了,BootROM 会通过串口输出一些关键信息。
我个人习惯,先把串口波特率设对。很多芯片默认是 115200 或 921600,但有些老片子可能是 57600。波特率不对,你看到的全是乱码,啥也分析不了。
典型的分区表损坏启动日志(以 ESP32 为例):
ets Jun 8 2016 00:22:57
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0x0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:10124
load:0x40080400,len:4856
entry 0x400806f8
I (30) boot: ESP-IDF v4.4.2 2nd stage bootloader
I (30) boot: compile time 11:30:00
I (30) boot: chip revision: 3
E (35) esp_image: image at 0x90000 has invalid magic byte
E (40) boot: Failed to verify partition table
E (45) boot: Error in partition table, falling back to factory
看到 invalid magic byte 和 Failed to verify partition table 这两行,基本可以断定分区表出问题了。Magic byte 是分区表头部的校验标识,如果它不对,说明分区表数据已经被破坏。
我曾经在一个量产项目上,遇到整批 200 片板子都报这个错。排查了半天,发现是 Flash 焊接温度曲线不对,导致分区表区域的数据位发生了翻转。嗯,从那以后,我每次做产测都会加一道分区表校验的工序。
3.2 串口打印信息解读:读懂芯片的“求救信号”
不同芯片的串口打印格式不一样,但核心逻辑是相通的。我总结了一套“三步读码法”,你可以试试:
- 看复位原因:
rst:0x1 (POWERON_RESET)表示正常上电复位。如果是rst:0x10 (RTCWDT_RTC_RESET)或rst:0x5 (DEEPSLEEP_RESET),说明芯片之前可能处于异常状态。 - 看启动模式:
boot:0x13 (SPI_FAST_FLASH_BOOT)表示从 SPI Flash 启动。如果显示boot:0x00或boot:0x01,说明芯片没有检测到有效的启动介质。 - 看分区表加载地址:比如
load:0x3fff0018,len:4,这表示 BootROM 正在尝试加载分区表头。如果这里报错,说明分区表所在的 Flash 地址已经不可读。
小技巧: 我建议你在串口工具里开启“时间戳”功能。这样能精确知道每个日志输出的时间间隔。如果某个阶段卡了很久(比如超过 5 秒),那大概率是分区表读取超时了。
还有一种情况,芯片反复重启,串口不断输出同样的日志。这叫“启动循环”。说白了,就是分区表校验失败后,芯片尝试回退到备份分区,但备份分区也坏了,于是陷入死循环。
3.3 分区表校验失败特征:常见的“病状”
分区表校验失败,通常有下面几种表现。我列了个表,方便你对照排查:
| 特征 | 日志关键词 | 可能原因 |
|---|---|---|
| Magic byte 错误 | invalid magic byte |
分区表头部被破坏,或 Flash 空片未烧录 |
| CRC 校验失败 | CRC mismatch / checksum error |
分区表内容被篡改,或 Flash 有坏块 |
| 分区长度异常 | partition length out of range |
分区大小超过 Flash 容量,或地址重叠 |
| 分区类型无效 | unknown partition type |
分区类型字段被改写,或使用了不兼容的分区表格式 |
| 找不到启动分区 | no bootable partition |
分区表中缺少类型为 app 或 boot 的分区 |
你想想看,如果芯片告诉你 CRC mismatch,那说明分区表数据虽然能读出来,但内容已经不对了。这种情况,我遇到过好几次,都是因为 Flash 在写入过程中突然掉电导致的。
注意: 有些芯片(比如 NXP i.MX 系列)的分区表校验是分两级的。第一级校验分区表头,第二级校验每个分区的 CRC。如果第一级就失败了,芯片会直接进入“串行下载模式”或“USB 烧录模式”。这时候你连日志都看不到,只能靠测量引脚电平来判断。
3.4 知识体系总览:一张图看懂分区表损坏识别
下面这张图,是我自己画的分区表损坏识别流程。你可以把它当作一个快速诊断地图:
这张图把整个识别流程串起来了。从芯片上电开始,到 BootROM 读取分区表,再到校验判断。如果失败,就进入具体的错误特征分支。你拿着这张图去对日志,会清晰很多。
3.5 实战案例:一次分区表损坏的完整诊断
我记得有一次,客户反馈说他们的设备在升级固件后变砖了。我拿到板子,接上串口,看到这样的日志:
U-Boot 2020.04 (Jan 15 2023 - 14:30:00 +0800)
DRAM: 512 MiB
NAND: 256 MiB
Bad block table not found
Reading MBR failed
No valid partition table found
MMC: no card present
** Unrecognized filesystem type **
Hit any key to stop autoboot: 0
=>
看到 Reading MBR failed 和 No valid partition table found,我基本确定是分区表被擦除了。进一步分析发现,客户用的升级脚本里有一条 flash_erase 命令,擦除范围设置错了,把分区表所在的块也擦掉了。
嗯,这里要注意:很多 NAND Flash 的坏块管理机制,会在分区表区域标记坏块信息。如果坏块表也丢了,芯片就彻底找不到分区表了。这种情况,只能通过串口烧录重新写入分区表。
所以,当你看到 Bad block table not found 时,别慌。先确认是不是坏块表丢失,再决定是修复坏块表还是直接重写分区表。