标签:
在下载内核或文件系统时,我们可以直接在命令中写明烧到nandflash的具体地址,但较麻烦,我们可以给nandflash分区,这样就可直接写烧到那个分区就行了,较为方便。如何设置呢?首先我们在uboot中输入mtdparts命令,看看默认的分区,结果提示mtdids not defined, no default present。搜索"mtdids not defined",定位到common/cmd_mtdparts.c的mtdparts_init函数中,分析发现是mtdids_default为空,mtdids以及另一个重要的变量mtdparts定义如下:
1 #if defined(MTDIDS_DEFAULT) 2 static const char *const mtdids_default = MTDIDS_DEFAULT; 3 #else $ static const char *const mtdids_default = NULL; 5 #endif 6 7 #if defined(MTDPARTS_DEFAULT) 8 static const char *const mtdparts_default = MTDPARTS_DEFAULT; 9 #else 10 static const char *const mtdparts_default = NULL; 11 #endif
因此,我们需要在smdk2410.h中定义MTDIDS_DEFAULT,MTDPARTS_DEFAULT这两个宏。如何定义这两个宏呢,cmd_mtdparts.c中注释里有例子示范了:
/* Examples: * * 1 NOR Flash, with 1 single writable partition: * mtdids=nor0=edb7312-nor * mtdparts=mtdparts=edb7312-nor:- * * 1 NOR Flash with 2 partitions, 1 NAND with one * mtdids=nor0=edb7312-nor,nand0=edb7312-nand * mtdparts=mtdparts=edb7312-nor:256k(ARMboot)ro,-(root);edb7312-nand:-(home) * */
结合例子和其他开发板的配置文件,我们的定义如下:
1 #define MTDIDS_DEFAULT "nand0=s3c2440-nand.0" 2 #define MTDPARTS_DEFAULT "mtdparts=s3c2440-nand.0:256k(bootloader),"\ 3 "128k(params),2m(kernel),"\ 4 "-(rootfs)"
保存,编译,烧写。启动u-boot后执行mtdparts命令,提示
mtdparts variable not set, see ‘help mtdparts‘
no partitions defined
执行help mtdparts命令,发现
mtdparts default - reset partition table to defaults
可能要执行一下mtdparts default,执行后不再提示错误。于是,我们在代码里执行这么一个命令。在board_r.c的run_main_loop里修改如下:
static int run_main_loop(void) { #ifdef CONFIG_SANDBOX sandbox_main_loop_init(); #endif /* main_loop() can return to retry autoboot, if so just run it again */ run_command("mtdparts default",0);//添加这一行代码 for (;;) main_loop(); return 0;
编译烧写后,启动u-boot执行mtdparts命令,不再提示错误,直接列出了分区,我们试着往kernel分区里烧写uImage,同时要想启动内核,必须要设置默认参数bootargs和bootcmd,根据environment.h文件,我们要在smdk2410.h里设置CONFIG_BOOTARGS和CONFIG_BOOTCOMMAND两个宏,如下
#define CONFIG_BOOTARGS "noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0" #define CONFIG_BOOTCOMMAND "nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0"
编译烧写,启动u-boot,使用tftp下载uImage到30000000,使用命令nand erase.chip;nand write 30000000 kernel 1c08e8,下载内核到kernel分区成功,并且已经可以启动内核了。
直前我们设置环境变量,都未执行save命令,因为我们还未设置环境变量保存地址。搜索saveenv函数,发现env_flash.c和env_nand.c都有这个函数,通过查看common/Makefile发现要通过定义CONFIG_ENV_IS_IN_NAND才能包含env_nand.c,从而将环境变量保存在nandflash上。同时还要设置CMD_SAVEENV,CONFIG_ENV_RANGE,CONFIG_ENV_OFFSET等宏,修改配置文件如下:未完待续。。。
移植u-boot-2015.10到JZ2440开发板(五)——设置nand分区,环境变量保存地址和其它默认参数
标签:
原文地址:http://www.cnblogs.com/ljyljy/p/5211400.html