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
参考资料
[2]用uboot 烧写uboot linux内核 文件系统到nandflash的 过程以及bootm go命令启动与区别
[5]mini2440的nand flash分区问题。重新烧uboot,内核程序,重启是原来的uboot和内核
[6]通过u-boot把内核和文件系统烧录到Nand Flash
[7]u-boot_NAND_Flash操作命令及烧录Linux内核和文件系统
[8]通过u-boot把内核和文件系统烧录到Nand Flash
[11]uboot移植之命令烧写uboot,zImage.img,root .
[12]uboot 烧写内核和文件系统
[13]Wrong Image Format for bootm commandERROR: can't get kernel image!