首页 > 解决方案 > 从正在运行的 linux 系统替换 sama5d3 上的引导加载程序

问题描述

我想在基于 sama5d36 的系统上运行4.1.0-linux4sam_5.1buildroot-2016.02.

flashcp我可以很好地替换内核映像,但是当我使用引导加载程序尝试它时,flashcp运行没有错误,但系统随后无法启动,停留在ROMBOOT提示符下。

buildroot:~# flashcp -v at91bootstrap.bin /dev/mtd0
Erasing block: 1/1 (100%) 
Writing kb: 14/14 (100%) 
Verifying kb: 14/14 (100%) 
buildroot:~# reboot
[...]
Sent SIGKILL to all processes
Requesting system reboot
�RomBOOTRestarting system

然后我可以用 编写相同的引导加载程序映像sam-ba,它会启动,所以映像很好。如何在没有用户干预的情况下在 Linux 中刷新它?

标签: embedded-linuxbootloaderatmelflash-memory

解决方案


在闪存开始的实际引导代码之前应该有一个 208 字节的标头。

来自 SAMA5D3 数据表(我应该在发布问题之前阅读)

在初始化和复位命令之后,引导程序读取第一页而不进行 ECC 检查,以确定是否存在 NAND 参数标头。标头由相同的 32 位字(出于冗余原因)的 52 倍组成,其中必须包含用于正确读取 NAND 中其余数据的 NAND 和 PMECC 参数。

当我转储引导扇区的内容时,标题当然在那里

buildroot:~# hd < /dev/mtd0 | head -4
00000000  05 24 90 c0 05 24 90 c0  05 24 90 c0 05 24 90 c0  |.$...$...$...$..|
*
000000d0  0e 00 00 ea 05 00 00 ea  05 00 00 ea 05 00 00 ea  |................|
000000e0  05 00 00 ea cc 3b 00 00  06 00 00 ea 06 00 00 ea  |.....;..........|

前四个字节反复重复,ARM 跳转表从偏移量 0xD0 (=208=52 * 4) 开始

sam-ba在写入引导扇区时会处理此标头,但 Linux mtd 驱动程序flashcp会将其视为普通数据,因此我应该提供它。


推荐阅读