移植u-boot-2015.10到JZ2440开发板——设置nand分区,环境变量保存地址和其它默认参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了移植u-boot-2015.10到JZ2440开发板——设置nand分区,环境变量保存地址和其它默认参数相关的知识,希望对你有一定的参考价值。

  在下载内核或文件系统时,我们可以直接在命令中写明烧到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分区,环境变量保存地址和其它默认参数的主要内容,如果未能解决你的问题,请参考以下文章

移植 JZ2440 开发板

移植u-boot-2012.04.01到JZ2440

jz2440上内核和文件系统移植

请问韦东山JZ2440开发板为啥新制作的文件系统启动,一直卡在Freeing init memory: 136K?

uboot研读笔记 | 03 - 初步移植uboot 2012.04到JZ2440(修改时钟,配置串口)

uboot研读笔记 | 04 - 移植uboot 2012.04到JZ2440(支持Nor Flash读写)