STM32MP1(FS-MP1A)SD 卡启动排障与系统烧录实践总结
一、问题背景目标将自行编译/移植的 TF-A、U-Boot、rootfs 烧录到 SD 卡使 FS-MP1ASTM32MP157A开发板从 SD 卡启动。过程中依次遇到三类问题最终全部解决系统完整启动。二、现象一dd 报“设备上没有空间”烧录 TF-A 时报错dd:写入/dev/sdb1:设备上没有空间记录了4130的读入/记录了4120的写出含义输入文件比目标分区还大写到分区末尾被截断。排查发现 fdisk 建分区时误将大小算错/dev/sdb1 34 445 412 206K ←只有206K而TF-A镜像为211456字节413个扇区/dev/sdb2 446 857 412 206K/dev/sdb3 858 4953 4096 2M/dev/sdb4 4954 250713 245760 120M解决删除旧分区重建前三个分区各给 2M第四个占剩余空间。注意 fdisk 中“2M”表示大小为 2M“2M”无加号会被当成结束扇区号 2097152曾因此误建出 1023M 的分区。三、插曲rootfs.tar 解包到了宿主机rootfs.tar 是 tar 压缩包而非 ext4 镜像需先挂载 sdb4 再解包。因 /mnt 未挂载成功tar -C /mnt 将 rootfs 解到了虚拟机系统盘df -h /mnt 显示 /dev/sda3SD 卡并未写入。教训tar 解包到未挂载的目录不会报错。解包前必须先确认 df -h /mnt 显示的是 /dev/sdb4。清理后按“格式化→挂载→df 确认设备名→解包→ls 确认→umount”流程重做成功。四、现象二烧录后板子无法启动串口无任何输出关键定位手段——对照实验将官方 sdcard.img 整盘烧回上电有完整串口输出证明硬件、串口接线、拨码开关全部正常问题出在自建分区表或镜像。4.1 最终生效的烧录方案1.整盘恢复官方镜像拿回官方分区表sudo dd ifsdcard.img of/dev/sdb convfsyncsync2.只替换三个分区的内容不动分区表sudo dd iftf-a-stm32mp157a-fsmp1a.stm32 of/dev/sdb1 convfsyncsudo dd iftf-a-stm32mp157a-fsmp1a.stm32 of/dev/sdb2 convfsyncsudo dd ifu-boot.stm32 of/dev/sdb3 convfsyncsync3.校验cmp无differ输出即通过sudo cmp tf-a-stm32mp157a-fsmp1a.stm32 /dev/sdb1 echo sdb1 OK烧录后上电启动链完整跑通TF-A(BL2 v2.5) → SP_MIN → U-Boot 2021.10 → Linux 内核 5.4.56 → 挂载 mmcblk0p4 → 出现 Welcome to fsmp1a 登录提示符。4.2 根因GPT 分区类型 GUID 不被 BootROM 接受STM32MP1 BootROM 从 SD 卡启动时并非见到分区就读镜像而是扫描 GPT 分区表只加载特定类型 GUID 的分区中的 FSBL。官方布局中各分区类型为 0700Microsoft basic dataGUID EBD0A0A2-B9E5-4433-87C0-68B6B72699C7并带有 fsbl1 / fsbl2 / ssbl 分区名而 fdisk 手动建分区默认给的是 8300Linux filesystemGUID 不同ROM 直接跳过表现为“串口完全无输出”。用 sdcard.img 整盘烧录之所以有效是因为它把官方分区表类型 GUID、分区名、偏移原样写回卡上随后 dd 只覆盖各分区内部的数据扇区分区表原封不动于是 ROM 认出了自己人。可用以下命令查看验证sudo gdisk -l /dev/sdb#如需手动建分区后修正类型与名字sudo sgdisk -t 1:0700 -t 2:0700 -t 3:0700 -t 4:0700 /dev/sdbsudo sgdisk -c 1:fsbl1 -c 2:fsbl2 -c 3:ssbl -c 4:rootfs /dev/sdb五、分区表保存在哪里分区表不属于任何分区位于磁盘镜像的固定扇区LBA 0保护性MBRLBA 1 GPT头EFI PART签名LBA 2~33 GPT分区表条目LBA 34分区1 (fsbl1)数据起点…LBA 250718 GPT备份分区表LBA 250750 GPT备份头←官方镜像共250751个扇区约128MBsdcard.img 与 SD 卡布局一致因此 dd 整盘写入时分区表字节被原样搬到卡上相同位置。直接对文件执行 sudo gdisk -l sdcard.img 也能读出分区表无需写卡。附带说明因 128MB 镜像写入 32GB 卡启动日志中的警告 “GPT: Alternate GPT header not at the end of the disk (250751 ! 61067263)” 属于无害提示。六、经验总结STM32MP1 SD 卡启动对分区表有四个要求分区大小、起始偏移、类型 GUID0700、分区名fsbl1/fsbl2/ssbl任一不符现象不同排查时逐项核对。“串口完全无输出”优先怀疑 ROM 未找到 FSBL先做官方镜像对照实验快速区分硬件问题与分区/镜像问题。dd 报错“设备上没有空间” 目标分区小于输入文件用 fdisk -l 核对分区大小。fdisk 中指定分区大小必须带 号2M 表示大小2M 表示结束扇区号。tar 解包到挂载点之前先 df -h 确认该目录背后是目标设备否则文件会静默写入宿主机目录。推荐烧录流程官方 sdcard.img 整盘打底保证分区表正确→ 单独 dd 替换 sdb1/sdb2TF-A、sdb3U-Boot→ 挂载 sdb4 解包 rootfs.tar → cmp 校验 → sync 后拔卡。。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →