U-Boot烧写系统到Nand Flash

1 开发环境

    宿主机:Ubuntu14.04.2(32bit)

    开发板:Mini2440

    系统:Linux

2 Nand Flash分区表

    为了使得系统能正常启动,需要将内核与根文件系统烧写到指定的位置(由Nand Flash的分区表指定)根据参考资料[10]的提示,在Mini2440光盘的已移植的Linux内核的arch/arm/mach-s3c2440/mach-mini2440.c源文件中有如下结构,定义了Nand Flash的分区表:

static struct mtd_partition friendly_arm_default_nand_part[] = {
	[0] = {
	  .name   = "supervivi",
	  .size   = 0x00040000,
	  .offset = 0,
	},
	[1] = {
	  .name   = "param",
	  .offset = 0x00040000,
	  .size   = 0x00020000,
	},
	[2] = {
	  .name   = "Kernel",
	  .offset = 0x00060000,
	  .size   = 0x00500000,
	},
	[3] = {
	  .name   = "root",
	  .offset = 0x00560000,
	  .size   = 1024 * 1024 * 1024, //
	},
	[4] = {
	  .name   = "nand",
	  .offset = 0x00000000,
	  .size   = 1024 * 1024 * 1024, //
	}
};

3 烧写Bootloader

3.1 读取Bootloader到SDRAM

    通过《U-Boot串口下载》的方法将Bootloader下载到SDRAM


    上图命令意为通过串口将数据下载到SDRAM的0x33000000地址中。

3.2 擦除Nand Flash

    在进行写操作前,需要先擦除,否则容易导致写失败!

(1)擦除整个Nand Flash

nand erase
(2)擦除0地址开始0x20000大小的块(至少擦除一块):
nand erase 0 20000

3.3 将SDRAM内容烧写到NAND Flash  


    上图命令意为将SDRAM起始地址0x33000000数据块下载到Nand Flash 0偏移地址处,数据块大小为0x40000。

4 烧写Kernel

    与烧写Bootloader的方法相同,先将Kernel下载到SDRAM 地址0x33000000处,然后将其烧写到Nand Flash偏移地址0x60000处:


5 烧写根文件系统

    烧写根文件系统时,使用nand write.yaffs[9][12]代替上述nand write即可,过程同上,详见参考资料[14]。需要注意的时候,最后一个参数size的大小必须为2112的整数倍,否则会出错,详见《Attempt to write error length data》。

6 启动参数设置

    要想正常的启动所烧写的系统,还需要在U-Boot中设置环境变量(为Kernel设置启动参数),Tekkaman所移植U-Boot的环境变量如如下:

[u-boot@MINI2440]# printenv
bootargs=noinitrd root=/dev/nfs rw nfsroot=192.168.0.1:/home/tekkaman/working/nfs/rootfs ip=192.168.0.2:192.168.0.1::255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64M
bootcmd=nfs 0x30008000 192.168.0.1:/home/tekkaman/working/nfs/zImage.img;bootm
bootdelay=1
baudrate=115200
ethaddr=08:08:11:18:12:27
ipaddr=192.168.0.2
serverip=192.168.0.1
gatewayip=192.168.0.1
netmask=255.255.255.0
tekkaman=bmp d 70000
 stdin=serial
stdout=serial
stderr=serial
ethact=dm9000

Environment size: 470/131068 bytes

    由前2行可知,当前设置是从nfs从加载根文件系统,这里需要将其改为从Nand Flash加载根文件系统,可执行下面命令对其进行修改:

setenv bootargs noinitrd root=/dev/mtdblock3 rootfstype=yaffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M

setenv bootargs noinitrd root=/dev/mtdblock3 rw console=ttySAC0,115200 init=/linuxrc mem=64M

(1)烧写到Nand Flash的是zImage时,使用下面启动命令参数

setenv bootcmd nboot 0x30008000 0 0x60000\;go 0x30008000

(2)烧写到Nand Flash的是uImage时,使用下面启动命令参数:

setenv bootcmd nboot 0x30008000 0 0x60000\;bootm 0x30008000

    分号需要使用反斜杠"\"进行转义,其余各参数的具体意义见《U-Boot内核启动参数》,最后别忘了保存:

saveenv

参考资料

[1]uboot 下载内核和文件系统的步骤

[2]用uboot 烧写uboot linux内核 文件系统到nandflash的 过程以及bootm go命令启动与区别

[3]Nand flash uboot 命令详解

[4]U-boot烧内核到NandFlash步骤

[5]mini2440的nand flash分区问题。重新烧uboot,内核程序,重启是原来的uboot和内核

[6]通过u-boot把内核和文件系统烧录到Nand Flash

[7]u-boot_NAND_Flash操作命令及烧录Linux内核和文件系统

[8]通过u-boot把内核和文件系统烧录到Nand Flash

[9]“转”使用UBOOT烧写根文件系统和内核的方法 

[10]mini2440 NAND Flash 上的分区

[11]uboot移植之命令烧写uboot,zImage.img,root .

[12]uboot 烧写内核和文件系统 

[13]Wrong Image Format for bootm commandERROR: can't get kernel image!

[14]u-boot烧写yaffs2文件系统 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OneSea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值