backup u-boot.imx for emmc&nand

工作平台:iMX6ul    OS:arm-linux

EMMC:

1.      理论基础

参考IMX6ULRM.pdf的8.5.3.5 关于Redundant Boot Support forExpansion Device。Rom支持emmc冗余boot。

关键点:Forsecondary image support, the primary image must reserve space for secondaryimage table. See the figure below for typical structures layout on expansiondevice。

针对6ul的emmc的boot0分区 结构布局如下:

0x0~0x200         reserved for MBR

0x200~0x400       reserved for secondary image table

0x400~0xxxxxxxxx   boot image

为了实现从备份的u-boot镜像引导kernel,必需创建一个针对第二u-boot 的image table,这个image table包含如下内容:


需要创建imagetable:可以命名为header

可以通过选用某一hexeditor修改header中针对第二u-boot镜像的偏移地址。

另注:emmc的boot0分区大小为2M 可以在同一个分区不同位置放下两份u-boot.imx。

2.      emmc备份u-boot实现方法和测试步骤:

dd 两份不同编译时间的u-boot.imx到emmc的boot0分区

测试中用到的如下两u-boot镜像。

root@freescale ~$ echo 0 >/sys/block/mmcblk1boot0/force_ro

a 烧写第一份u-boot.imx(u-boot-0109.imx)到boot0 1K开始的位置

root@freescale ~$ ddif=/root/u-boot.imx of=/dev/mmcblk1boot0 bs=512 seek=2

/*预留1K的空间给MBR和 secondary image table*/

b 烧写第二份u-boot(u-boot-1213.imx)到boot0的401K开始位置

root@freescale ~$ ddif=/root/u-boot.imx of=/dev/mmcblk1boot0 bs=512 seek=802

/*1K+320K是第一u-boot.imx的占用空间,令第二u-boot.imx从401K开始*/

c 烧写secondary image table

root@freescale ~$ ddif=/root/header of=/dev/mmcblk1boot0 bs=1 seek=512 count=20

/*boot0前512bytes预留给MBR*/

root@freescale ~$ echo 1 >/sys/block/mmcblk1boot0/force_ro

root@freescale ~$ sync

按reset,串口终端打印有关u-boot信息如下:


测试擦除第一u-boot.imx的IVT,ROM会去读第二u-boot.imx

root@freescale ~$  echo 0 > /sys/block/mmcblk1boot0/force_ro

root@freescale ~$ ddif=/dev/zero of=/dev/mmcblk1boot0 bs=1 seek=1024 count=4

/*为什么擦除4B?因为一个IVT header是4个bytes*/

root@freescale ~$ echo 1 >/sys/block/mmcblk1boot0/force_ro

root@freescale ~$ sync

按reset串口终端打印有关u-boot信息如下:根据不同的编译时间说明第一u-boot.imx损坏,ROM读第二u-boot.imx,并可以正常引导kernel。


NAND:(1G)

1.      理论基础:a参考IMX6ULRM.pdf 的8.5.2.1的table8-10




默认为00 imx6的boot ROM code在不同的位置寻找两次u-boot镜像。

         b 参考8.5.2.2 nand flash boot flowand boot control blocks 中的详细描述

1.      nand备份u-boot的方法和测试步骤

备份nandu-boot要结合部署到rootfs中的kobs-ng工具(FSL官方提供)

通过kobs-ng烧写两份u-boot.imx到1G nand flash boot partition的不同位置:

root@freescale ~$ kobs-nginit -v -x --search_exponent=2 /root/u-boot.imx

/*参数--search_exponent值要依据BOOT_CFG2[4:3]的设置值,烧写过程中若不指定默认为2*/

串口终端打印的部分信息如下:



测试擦除位于0x400000的第一u-boot.imx, ROM 回去读第二u-boot.imx

root@freescale ~$ flash_erase/dev/mtd0 0x400000 1

Erasing 512 Kibyte @ 400000-- 100 % complete

root@freescale ~$ sync

按reset,系统可以正常启动。

如果再擦除第二u-boot.imx,系统无法启动,并且串口没有任何输出信息。


root@freescale ~$ flash_erase/dev/mtd0 0x600000 1

Erasing 512 Kibyte @ 600000-- 100 % complete

root@freescale ~$ sync

按reset后串口没有任何输出信息。

ROM会从nand flash的boot分区的起始位置寻找两次FCB,测试如下:

a 擦除FCB0

root@freescale ~$ flash_erase/dev/mtd0 0x0 1

Erasing 512 Kibyte @ 0 -- 100% complete

root@freescale ~$ sync

hardware reset 后系统可以正常启动。

b 擦除FCB1

root@freescale ~$ flash_erase/dev/mtd0 0x80000 1

Erasing 512 Kibyte @ 80000 --100 % complete

root@freescale ~$ sync

hardware reset后串口打印信息如下:




测试擦除FCB:

测试表明当擦除FCB0,rom code可以找到u-boot.imx,并引导kernel启动。

擦除FCB1,rom会读到u-boot.imx 的data的部分信息,不能引导kernel启动,但是并没有进入serial downloader mode。

擦除FB0-FB3,依然是进入u-boot的downloader模式,与手册中如下描述:

不同,可以再推敲下。

现象一:擦除FCB0-FCB3串口没有任何输出

现象二:擦除FCB0-FCB3串口还是有部分输出

一和二是矛盾的无法解释,貌似这其中有一个官方的errata解释这个现象。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值