使用nor的supervivi烧写uboot到nand: 进入supervivi,选择a,absolute user application /**************uboot下用命令下载uboot,内核和文件系统********************/ /* 先将内核zImage用mkimage转换成uImage(叫zIMage.img) mkimage 工具是uboot提供,在uboot源码的tools/ 在内核源码的arch/arm/boot/下执行如下命令 */ mkimage -n 'tekkaman' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.img /* Usage: mkimage -l image -l ==> list image header information mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image -A ==> set architecture to 'arch' -O ==> set operating system to 'os' -T ==> set image type to 'type' -C ==> set compression type 'comp' -a ==> set load address to 'addr' (hex) -e ==> set entry point to 'ep' (hex) -n ==> set image name to 'name' -d ==> use image data from 'datafile' -x ==> set XIP (execute in place) */ //或者在制作内核时用 make uImage //这样生成的uImage和用mkimage工具将zImage转换成的uImage的格式一样,均可被uboot引导。 mv uImage zImage.img //为了和下面的命令统一,将uImage改名叫zImga.img //但在试验中发现这样制作的uImage有时uboot引导不起来 /***********************参数修改************************************/ mini2440 setenv ipaddr 192.168.1.230 setenv serverip 192.168.1.103 setenv gatewayip 192.168.1.1 /*bootargs uboot传递给内核de*/ setenv bootargs console=ttySAC0 noinitrd root=/dev/mtdblock3 init=/linuxrc /*bootcmd uboot自动启动时要执行的任务*/ setenv bootcmd tftp 0x30008000 zImage.img\;bootm 0x30008000 /*从tftp服务器下载内核到sdram,然后启动*/ setenv bootcmd nboot 30008000 0 0x60000\;bootm 0x30008000 /*从nand读取内核到sdram,然后启动*/ setenv bootcmd nand read 30008000 0x60000 0x500000\;bootm 0x30008000 /*从nand读取内核到sdram,然后启动*/ saveenv /**********************从服务器烧写文件到nand*************************************/ //download uboot tftp 0x30008000 u-boot.bin //从ftp服务器将u-boot.bin文件读到内存0x30008000处 nand erase 0 0x40000 //清除nandflash的0-0x40000的数据 nand write 0x30008000 0 0x40000 //从内存0x30008000写入nandflash的0开始处,大小0x40000 /*nand的0x40000--0x60000是参数区 从板子启动现象判断参数区和kernel去有没重叠的方法:上电按空格进入nand的uboot,如果没有提示using default param并且 执行命令nboot 30008000 0 0x60000\;bootm 0x30008000可以成功进入内核,说明ok 在saveenv时,会显示at 0x4000000如下,tekkman的源码中CONFIG_ENV_OFFSET=0x60000,需要改成0x40000否则参数区和kernel区会重合 [u-boot@Song]# saveenv Saving Environment to NAND... Erasing Nand... Erasing at 0x4000000000002 -- 0% complete. Writing to Nand... done */ //dowload kernel tftp 0x30008000 zImage.img //从ftp服务器将zImage.img文件读到内存0x30008000处 nand erase 0x60000 500000 //清除nandflash的0x60000-0x560000的数据 nand write 0x30008000 0x060000 0x500000 //从内存0x30008000写入nandflash的0x60000开始处,大小0x500000 //dowload rootfs,可以是友善提供的文件系统。比如root_qtopia-128M.img,不要超过63MB.因为mini2440的sdram才64MB.如果大于63MB,可以使用supvivi下载之。见下 tftp 0x30008000 root //从ftp服务器将ysffs文件读到内存0x30008000处 nand erase 0x560000 //清除nandflash的0x560000到结尾的数据 //nand write 0x30008000 0x560000 0x6000000 直接写在nand上不行,需专门的命令向nand写yaffs文件,因为读写的时候还要有其他动作 //nand read 0x30008000 0x560000 0x6000000 直接从nand读不行,需专门的命令从nand读yaffs文件 nand write.yaffs 0x30008000 0x560000 0x3b36dc0 //从内存0x30008000写入nandflash的0x560000开始处,大小0x3b36dc0 /*在只有64MB的sdram系统上,用tftp 0x30008000 root 加载的yaffs文件不得大于33f80000-30008000=3F7 8000=63.46875MB,否则会覆盖掉处于33f80000的uboot 在试验中发现只能指定size为0x3b36dc0,否则出错,现还不知原因 可参考http://bbs.huiwen.com/thread-426-1-1.html */ /***********************************************************/上面将
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, // } };
uboot在内存中的地址:板载目录的config.mk中。比如mx53smd的在board/freescale/mx53_smd/config.mk中定义了一个变量TEXT_BASE=0x77800000
param在内存中的地址:板载文件。比如mx53smd的在board/freescale/mx53_smd/mx53_smd.c中指定gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;//0x70000100
uImage在内存中的地址:主要是由zImage制作uImage时,指定地址。0x70000100