embedded-linux - 从正在运行的 linux 系统替换 sama5d3 上的引导加载程序
问题描述
我想在基于 sama5d36 的系统上运行4.1.0-linux4sam_5.1
和buildroot-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 中刷新它?
解决方案
在闪存开始的实际引导代码之前应该有一个 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
会将其视为普通数据,因此我应该提供它。
推荐阅读
- javascript - 要求字符串输入时刻为某种格式
- android - Android Studio 无法找到 ADB,但我可以部署到我的设备
- bigcommerce - 使用 BigCommerce API 获取价格列表和名称
- javascript - WebRTC:通道、轨道和流与 RTP SSRC 和 RTP 会话之间的关系
- html - Aframe Sphere-Collider 碰撞触发功能
- vba - vba - 访问数字类型的字节
- javascript - 使用 SVG JS(ES6+)拖放与绘图线(路径)宽度链接的元素
- r - 在 R studio 1..463 中安装 hts 包
- selenium - 如何在 Selenium WD 3.4 中启动 Internet Explorer?
- go - 当通道关闭时,以接收通道为参数的 goroutine 是否停止?