我想在运行4.1.0-linux4sam_5.1
和buildroot-2016.02
的基于sama5d36的系统上替换nand flash中的第一阶段bootloader。
我可以用flashcp
替换内核映像就好了,但是当我尝试使用bootloader时,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
编写相同的bootloader映像,它将启动,因此图像很好。如果没有用户干预,它如何在Linux中闪存?
在闪存开始时,实际引导代码之前应该有一个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
将其视为普通数据,因此我应该提供它。