AM3517使用SD启动盘 update x-loader booting from Nand flash
前段时间,使用AM3517的时候在操作x-loader的时候出了点小问题,导致nandflash中的x-loader数据被破坏了,导致x-loader和Uboot都启动不起来,之后,用花了一周多的时间做了一个4G的SD卡启动盘,(本人系学习嵌入式新手,惭愧,有的原理还不怎么清楚,汗。。。)。
做好了SD卡启动盘之后,我不想总是用SD卡启动盘,想恢复nandflash里面的数据,用nandflash启动linux系统,那么SD卡启动AM3517之后,如何恢复X-loader,U-boot,uImage。
还忘记了一点,硬件连接.
硬件连接:BOOT启动模式是BOOT0是0,BOOT5是1,这里是选择启动方式的,这种启动方式是选择优先从SD卡启动linux系统,办卡的串口和开发主机的COM1相连,板卡的网口和开发主机的相连,把SD卡插入板卡中,之后确认一下BOOT启动方式是01,就可以上电启动AM3517板卡了。
启动AM3517板卡之后,因为要恢复板载的nandflash中的x-loader和u-boot,uImage的数据,因此我们不进入到系统中,只要进入UBOOT中就可以了,板卡启动的时候,中断进入系统的进程,就停留在uboot中,这时就可以利用uboot命令操作来恢复x-loader和u-boot,uImage的数据了。
下面我把恢复的全步骤先列出来,再一一分解,
1:首先恢复x-loader 的数据(或者叫更新存贮在nandflash 里的nandflash 起动的x-loader)
AM3517_EVM # mmc init 『初始化sd 卡』
mmc1 is available
AM3517_EVM # mw.b 0x80000000 0xFF 0x100000 『初始化使用的内存,全部置1』
AM3517_EVM # nand erase 0 40000 『擦除nandflash 中存放x-loader 区域』
NAND erase: device 0 offset 0x0, size 0x40000『以下两行提示擦除进度, 和擦除是否成功』
Erasing at 0x20000 -- 100% complete 『如果没有这两行信息,请看后面的9 注意事项』
AM3517_EVM # fatload mmc1 0 0x80000000 x-load.bin.ift 『从sd 卡读x-loader 到内存』
reading x-load.bin.ift
16480 bytes read
AM3517_EVM # nandecc hw 『设定ecc 校验为硬件校验』
HW ECC selected
AM3517_EVM # nand write.i 0x80000000 0 40000 『存x-loader 到nandflash 指定位置』
NAND write: device 0 offset 0x0, size 0x40000
262144 bytes written: OK
AM3517_EVM #
简洁的来看就是
SD update x-loader booting from Nand flash
AM3517_EVM # mmc init 『初始化sd 卡』
AM3517_EVM # mw.b 0x80000000 0xFF 0x100000 『初始化使用的内存,全部置1』
AM3517_EVM # nand erase 0 40000 『擦除nandflash 中存放x-loader 区域』
AM3517_EVM # fatload mmc1 0 0x80000000 x-load.bin.ift 『从sd 卡读x-loader 到内存』
AM3517_EVM # nandecc hw 『设定ecc 校验为硬件校验』
AM3517_EVM # nand write.i 0x80000000 0 40000 『存x-loader 到nandflash 指定位置』
详细解释:mmc init,是初始化SD卡的命令,对于初始化SD卡这个命令我也是第一次用到,不懂就要查啊,怎么查啊,help啊,呵呵,在uboot中输入mmc help,
AM3517_EVM # mmc help
mmc - MMC sub-system (MMC的子系统)
Usage:(使用)
mmc init [dev] - init MMC sub system (初始化MMC子系统)
mmc device [dev] - show or set current device (显示或设置当前的设备)
下面的命令是:mw.b 0x80000000 0xFF 0x100000
AM3517_EVM # mw help
mw - memory write (fill) (写内存/填充内存)
Usage:使用
mw [.b, .w, .l] address value [count]
mw.b表示以字节的方式写, 0x80000000是要写入的内存的起始地址,0x100000是要写入的长度,0xFF是往内存中写入的数据,即往从0x80000000为起始地址的长度为0x100000的内存中全部写入0xFF,所以是初始化内存,全部置1。
下一步是# nand erase 0 40000
AM3517_EVM # nand erase 0 40000 『擦除nandflash 中存放x-loader 区域』
NAND erase: device 0 offset 0x0, size 0x40000『以下两行提示擦除进度, 和擦除是否成功』
Erasing at 0x20000 -- 100% complete 『如果没有这两行信息,请看后面的9 注意事项』
0是偏移地址,0x40000是擦除的长度,擦除0x40000个字节长度。这里没有特殊说明就是擦除从0开始的偏移0字节的长度为0x40000的nandflash。
nand erase [clean] [off size] - erase 'size' bytes from
offset 'off' (entire device if not specified)
如果没有特殊说明就是从起始地址处,偏移off个字节为起始地址长度为size个字节擦除nand
解释如是:
AM3517_EVM # nand help
nand - NAND sub-system NAND子系统
Usage:使用
nand info - show available NAND devices (显示可用的NAND设备的信息)
nand device [dev] - show or set current device
nand read - addr off|partition size
nand write - addr off|partition size
read/write 'size' bytes starting at offset 'off'
to/from memory address 'addr', skipping bad blocks.
nand erase [clean] [off size] - erase 'size' bytes from
offset 'off' (entire device if not specified) NAND擦除
nand bad - show bad blocks 显示坏块
nand dump[.oob] off - dump page
nand scrub - really clean NAND erasing bad blocks (UNSAFE) 真正的擦除NAND此命令慎重使用
nand markbad off [...] - mark bad block(s) at offset (UNSAFE)
nand biterr off - make a bit error at offset (UNSAFE)
下面看nand info
AM3517_EVM # nand info
Device 0: NAND 128MiB 3,3V 8-bit, sector size 128 KiB
有设备号0,NAND 容量128M,电压3.3V,8位,扇区大小128K。
AM3517_EVM # nand bad 显示坏块
Device 0 bad blocks:
00000000
00020000
AM3517_EVM #
再下一个命令是
AM3517_EVM # fatload mmc1 0 0x80000000 x-load.bin.ift 『从sd 卡读x-loader 到内存』
reading x-load.bin.ift
16480 bytes read
从mmc1接口处,设备号0,地址0x80000000,读取的文件名是x-load.bin.ift。
综合从SD卡的MMC1设备号0中,读取x-load.bin.ift文件到内存的0x80000000地址处。
数据移动方向为:
SD卡 --------à>>>>>> 内存
0(x-load.bin.ift) --à>>>>>>[0x80000000----?]
AM3517_EVM # fatload help
usage: fatload [bytes]
再下个命令是
AM3517_EVM # nandecc hw 『设定ecc 校验为硬件校验』
HW ECC selected
详解:ECC是“Error Correcting Code”的简写,中文名称是“错误检查和纠正”。ECC是一种能够实现“错误检查和纠正”的技术,ECC内存就是应用了这种技术的内存
再下个命令是
AM3517_EVM # nand write.i 0x80000000 0 40000 『存x-loader 到nandflash 指定位置』
NAND write: device 0 offset 0x0, size 0x40000
262144 bytes written: OK
Nand write详解
nand write - addr off|partition size
read/write 'size' bytes starting at offset 'off'
to/from memory address 'addr', skipping bad blocks.
将x-loader写到nandflash的指定位置。
将内存起始地址0x80000000的长度为0x40000的这些内存数据复制到nandflash的从地址0开始的区域中。
数据移动方向为:内存 ----à>>>>> NAND flash
[0x800000000---0x80040000]----à>>>>> [0-0x40000]