1 开发环境
宿主机:Ubuntu14.04.2(32bit)
开发板:Mini2440
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 将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即可,过程同上。
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 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!