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的分区表:

[plain]  view plain  copy
  1. static struct mtd_partition friendly_arm_default_nand_part[] = {  
  2.     [0] = {  
  3.       .name   = "supervivi",  
  4.       .size   = 0x00040000,  
  5.       .offset = 0,  
  6.     },  
  7.     [1] = {  
  8.       .name   = "param",  
  9.       .offset = 0x00040000,  
  10.       .size   = 0x00020000,  
  11.     },  
  12.     [2] = {  
  13.       .name   = "Kernel",  
  14.       .offset = 0x00060000,  
  15.       .size   = 0x00500000,  
  16.     },  
  17.     [3] = {  
  18.       .name   = "root",  
  19.       .offset = 0x00560000,  
  20.       .size   = 1024 * 1024 * 1024, //  
  21.     },  
  22.     [4] = {  
  23.       .name   = "nand",  
  24.       .offset = 0x00000000,  
  25.       .size   = 1024 * 1024 * 1024, //  
  26.     }  
  27. };  

3 烧写Bootloader

3.1 读取Bootloader到SDRAM

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


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

3.2 擦除Nand Flash

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

(1)擦除整个Nand Flash

[plain]  view plain  copy
  1. nand erase  
(2)擦除0地址开始0x20000大小的块(至少擦除一块):
[plain]  view plain  copy
  1. 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的环境变量如如下:

[plain]  view plain  copy
  1. [u-boot@MINI2440]# printenv  
  2. 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  
  3. bootcmd=nfs 0x30008000 192.168.0.1:/home/tekkaman/working/nfs/zImage.img;bootm  
  4. bootdelay=1  
  5. baudrate=115200  
  6. ethaddr=08:08:11:18:12:27  
  7. ipaddr=192.168.0.2  
  8. serverip=192.168.0.1  
  9. gatewayip=192.168.0.1  
  10. netmask=255.255.255.0  
  11. tekkaman=bmp d 70000  
  12.  stdin=serial  
  13. stdout=serial  
  14. stderr=serial  
  15. ethact=dm9000  
  16.   
  17. Environment size: 470/131068 bytes  

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

[plain]  view plain  copy
  1. setenv bootargs noinitrd root=/dev/mtdblock3 rootfstype=yaffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M  

[plain]  view plain  copy
  1. setenv bootargs noinitrd root=/dev/mtdblock3 rw console=ttySAC0,115200 init=/linuxrc mem=64M  

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

[plain]  view plain  copy
  1. setenv bootcmd nboot 0x30008000 0 0x60000\;go 0x30008000  

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

[plain]  view plain  copy
  1. setenv bootcmd nboot 0x30008000 0 0x60000\;bootm 0x30008000  

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

[plain]  view plain  copy
  1. saveenv  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值