移植u-boot-2015.07-rc3之修改代码支持mtdparts命令(八)

来源:互联网 发布:亿展网络 编辑:程序博客网 时间:2024/05/23 00:33

现在我们使用NandFlash命令写u-boot.bin或者uImage文件的时候都需要一大串数字,如:

tftp 30000000 u-boot.bin                                                                                                                                                                                                                                               

nand erase 0 100000

nand write 30000000 0 100000

nand erase 200000 400000

nand write 30000000 200000 400000

像这样大串大串的数字写起来实在是费劲,使用mtdparts命令后就可以这样写:

tftp 30000000 u-boot.bin                                                                                                                                                                                                                                               

nand erase u-boot

nand write 30000000 u-boot

nand erase kernel

nand write 30000000 kernel

 

使用mtdparts命令后方便输入命令也不需要刻意的去记忆分区。这一节就来实现mtdparts命令。

 

使用开发板启动我们移植的uboot,输入 ? 可以查看到uboot支持的命令,在列出来的命令中可以看到这么一句:

mtdparts- defineflash/nand partitions

看样子默认是支持mtdparts命令了,只是由于没有进行合理的配置所以不能使用mtdparts分区。因为默认已经正常mtdparts命令了,控制台输入mtdparts看看提示什么。

SMDK2410 # mtdparts                                                                                                                                                                                                                                               

mtdids not defined, no default present

想必你也形成惯性思维了吧,没错!grep查看提示信息出自哪里。

root@ubuntu:/home/uboot/u-boot-2015.07-rc3# grep "mtdids not defined" * -nR                                                                                                                                                        

common/cmd_mtdparts.c:1752:             printf("mtdids not defined, no default present\n");

打开common/cmd_mtdparts.c:1752:可以看到:

if (mtdids_default) {                                                                                                                                                                                                                                                                          

debug("mtdids variable not defined, using default\n");

ids = mtdids_default;

setenv("mtdids", (char *)ids);

} else {

printf("mtdids not defined, no default present\n");

return 1;

}

所以跟踪mtdids_default可以看到:

#if defined(MTDIDS_DEFAULT)                                                                                                                                                                                                                                                       

static const char *const mtdids_default = MTDIDS_DEFAULT;

#else

static const char *const mtdids_default = NULL;

#endif

看样子是要定义宏MTDIDS_DEFAULT了,看看其他开发板是怎么定义的。

root@ubuntu:/home/uboot/u-boot-2015.07-rc3# grep "MTDIDS_DEFAULT" * -nR                                                                                                                                                        

出现很多头文件都定义了这个宏,打开两个看看:

root@ubuntu:/home/uboot/u-boot-2015.07-rc3# vim include/configs/TQM855L.h +202

199 #define CONFIG_CMD_MTDPARTS

200 #define CONFIG_MTD_DEVICE               /* needed for mtdparts commands */

201 #define CONFIG_FLASH_CFI_MTD

202 #define MTDIDS_DEFAULT          "nor0=TQM8xxL-0"

203

204 #define MTDPARTS_DEFAULT        "mtdparts=TQM8xxL-0:256k(u-boot),"      \

205                                                 "128k(dtb),"            \

206                                                 "1664k(kernel),"        \

207                                                 "2m(rootfs),"           \

208                                                 "4m(data)"

209

 

再打开一个头文件看看:

root@ubuntu:/home/uboot/u-boot-2015.07-rc3# vim include/configs/T104xRDB.h +807

802 #ifndef CONFIG_SYS_NO_FLASH

803 #define CONFIG_MTD_DEVICE

804 #define CONFIG_MTD_PARTITIONS

805 #define CONFIG_CMD_MTDPARTS

806 #define CONFIG_FLASH_CFI_MTD

807 #define MTDIDS_DEFAULT "nor0=fe8000000.nor,nand0=fff800000.flash," \

808                         "spi0=spife110000.0"

809 #define MTDPARTS_DEFAULT        "mtdparts=fe8000000.nor:1m(uboot),5m(kernel),"     \

810                                 "128k(dtb),96m(fs),-(user);"\

811                                 "fff800000.flash:2m(uboot),9m(kernel),"\

812                                 "128k(dtb),96m(fs),-(user);spife110000.0:" \

813                                 "2m(uboot),9m(kernel),128k(dtb),-(user)"

814 #endif

 

可以看到两个文件都对MTDPARTS_DEFAULT和MTDIDS_DEFAULT有定义,那么就把这两个宏也加到smdk2440.h中去试试,不行再修改嘛!

smdk2440.h文件:

201 #define CONFIG_MTD_DEVICE

202 #define CONFIG_MTD_PARTITIONS                                                                                                                                                                                                                           

203

204 #define MTDIDS_DEFAULT          "nand0=MINI2440_XT"

205

206 #define MTDPARTS_DEFAULT        "mtdparts=MINI2440_XT:1m(u-boot),"      \

207                                               "128k(params),"            \

208                                                 "4m(kernel),"        \

209                                                 "-(rootfs)"          

210

211 #define CONFIG_YAFFS2

212 #define CONFIG_RBTREE                                                                                                                                                                                                                                     

因为现在的u-boot都有512k大小了,所以干脆给u-boot1M的空间,在下一节对u-boot进行裁剪后再把u-boot的分区值修改小点。- 减号表示剩余的空间都给文件系统。

所以现在以nor启动的方式下,mtdparts分区是这样的:

#: name                size            offset                                                                                                                                                                                                                                    

 0: u-boot              0x00100000      0x00000000     

 1: params             0x00020000      0x00100000     

 2: kernel              0x00400000      0x00120000     

 3: rootfs              0x0fae0000       0x00520000   

 

在这里需要补充说明一下的是,以spl方式启动的u-boot会生成u-boot-spl.bin和u-boot.bin两个文件,在使用NandFlash命令烧写这两个文件的时候要烧写两次,如:

nand erase.part u-boot-spl                                                                                                                                                                                                                                                           

nand write 30000000 u-boot-spl

nand erase.part u-boot

nand write 30000000 u-boot

所以spl方式启动下和以nor启动下的mtdparts分区是不一样的,spl启动的u-boot多了一个u-boot-spl分区,spl启动下的分区如下:

#: name                size             offset           

 0: u-boot-spl           0x00020000       0x00000000       

 1: u-boot              0x00100000      0x00020000      

 2: params              0x00020000      0x00120000       

 3: kernel               0x00400000       0x00140000       

 4: rootfs               0x0fac0000        0x00540000                                                                                                                                                                                                                        

以spl启动的u-boot对mtdparts分区的支持需要这样修改smdk2440.h:

smdk2440.h中:

204 #define MTDIDS_DEFAULT          "nand0=MINI2440_XT"                                                                                                                                                                                              

205

206 #define MTDPARTS_DEFAULT        "mtdparts=MINI2440_XT:128k(u-boot-spl),"                      \

207                                                     "1m(u-boot),"      \

208                                               "128k(params),"            \

209                                                 "4m(kernel),"        \

210                                                 "-(rootfs)"          

 

 

针对不同的启动方式修改完smdk2440.h文件后(本文以nor启动),make编译,编译成功。下载进开发板试试。

SMDK2410 # mtdparts                                                                                                                                                                                                                                                       

mtdparts variable not set, see 'help mtdparts'

no partitions defined

 

defaults:

mtdids  : nand0=MINI2440_XT

mtdparts: mtdparts=MINI2440_XT:1m(u-boot),128k(params),4m(kernel),-(rootfs)

SMDK2410 #

提示说mtdparts变量没有设置,详见'helpmtdparts',行吧,输入'help mtdparts'看看:

SMDK2410 # help mtdparts                                                                                                                                                                                                                                                       

mtdparts - define flash/nand partitions

 

Usage:

mtdparts

    - list partition table

mtdparts delall

    - delete all partitions

mtdparts del part-id

    - delete partition (e.g. part-id = nand0,1)

mtdparts add <mtd-dev> <size>[@<offset>] [<name>] [ro]

    - add partition

mtdparts default

- reset partition table to defaults

 

可以看到有一个mtdparts default的命令,输入这个命令试试:

SMDK2410 # mtdparts default                                                                                                                                                                                                                                    

SMDK2410 # mtdparts                                                                                                                                                                                                                                                        

 

device nand0 <MINI2440_XT>, # parts = 4

 #: name                size            offset          mask_flags

 0: u-boot              0x00100000      0x00000000      0

 1: params              0x00020000      0x00100000      0

 2: kernel              0x00400000      0x00120000      0

 3: rootfs              0x0fae0000      0x00520000      0

 

active partition: nand0,0 - (u-boot) 0x00100000 @ 0x00000000

 

defaults:

mtdids  : nand0=MINI2440_XT

mtdparts: mtdparts=MINI2440_XT:1m(u-boot),128k(params),4m(kernel),-(rootfs)

现在应该能使用mtdparts功能了,咱们试试:

SMDK2410 # nand erase.part params    //需要注意的是使用mtdpartsnand erase命令

//需要加.part,即:nand erase .part

 

NAND erase.part: device 0 offset 0x100000, size 0x20000

Erasing at 0x100000 -- 100% complete.

OK

SMDK2410 # nand write 30000000 params

 

NAND write: device 0 offset 0x100000, size 0x20000

 131072 bytes written: OK

SMDK2410 #

现在mtdparts已经支持了,但是每次启动u-boot都要先键入命令mtdpartsdefault岂不是太坑爹?那就在u-boot代码中使用run_command函数执行mtdparts default命令,我们就不需要手动执行了。

添加run_command函数的位置我选择在common/board_r.c中的run_main_loop函数中:

common/board_r.c中:                                                                                                                                                                                                                                                       

668 static int run_main_loop(void)

669 {

670 #ifdef CONFIG_SANDBOX

671         sandbox_main_loop_init();

672 #endif

673

674         run_command("mtdparts default", 0);

675

676         /* main_loop() can return to retry autoboot, if so just run it again */

677         for (;;)

678                 main_loop();

679         return 0;

680 }

make编译,下载u-boot.bin文件到NorFlash中,以nor启动。

在控制台中输入u-boot命令mtdparts:

SMDK2410 # mtdparts                                                                                                                                                                                                                                                       

 

device nand0 <MINI2440_XT>, # parts = 4

 #: name                size            offset          mask_flags

 0: u-boot              0x00100000      0x00000000      0

 1: params              0x00020000      0x00100000      0

 2: kernel              0x00400000      0x00120000      0

 3: rootfs              0x0fae0000      0x00520000      0

 

active partition: nand0,0 - (u-boot) 0x00100000 @ 0x00000000

 

defaults:

mtdids  : nand0=MINI2440_XT

mtdparts: mtdparts=MINI2440_XT:1m(u-boot),128k(params),4m(kernel),-(rootfs)

SMDK2410 #

能正常解析mtdparts命令,说明mtdparts命令已经成功支持了,下面就来简单测试一下mtdparts命令的妙用:

SMDK2410 # nand erase.part kernel                                                                                                                                                                                                                                    

 

NAND erase.part: device 0 offset 0x120000, size 0x400000

Erasing at 0x500000 -- 100% complete.

OK

SMDK2410 # nand erase.part rootfs

 

NAND erase.part: device 0 offset 0x520000, size 0xfae0000

Skipping bad block at  0x03de0000                                         

Skipping bad block at  0x042c0000                                         

Skipping bad block at  0x07080000                                         

Erasing at 0xffe0000 -- 100% complete.

OK

SMDK2410 # nand write 30000000 kernel

 

NAND write: device 0 offset 0x120000, size 0x400000

 4194304 bytes written: OK

SMDK2410 #

通过上述的测试,现在的u-boot已经完美支持mtdparts命令了。


使用到的u-boot:http://download.csdn.net/detail/doccode/8914859

使用到的uImage:http://download.csdn.net/detail/doccode/8954561

使用到的yaffs文件系统:http://download.csdn.net/detail/doccode/8954553


0 0
原创粉丝点击