移植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 //需要注意的是使用mtdparts时nand 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
- 移植u-boot-2015.07-rc3之修改代码支持mtdparts命令(八)
- 移植u-boot-2015.07-rc3之修改代码支持SDRAM和SPL启动(二)
- 移植u-boot-2015.07-rc3之修改代码支持串口(三)
- 移植u-boot-2015.07-rc3之修改代码支持NorFlash(四)
- 移植u-boot-2015.07-rc3之修改代码支持NandFlash(六)
- 移植u-boot-2015.07-rc3之修改代码支持DM9000网卡(七)
- 移植u-boot-2015.07-rc3之修改代码支持yaffs文件系统烧写(十)
- 移植u-boot-2015.07-rc3之修改代码支持NorFlash启动并真正支持NorFlash读写(五)
- 移植u-boot-2015.07-rc3之增加smdk2440开发板框架支持(一)
- 移植u-boot-2015.07-rc3之uboot裁剪及启动参数修改(九)
- u-boot移植(八)支持yaffs
- u-boot移植(十二)---代码修改---支持DM9000网卡
- U-boot中mtdparts命令添加
- 移植u-boot之修改代码
- 移植u-boot学习笔记5----- 修改代码之支持NAND启动
- 移植u-boot学习笔记7-----修改代码之支持nand flash
- 移植u-boot学习笔记8-----修改代码之支持DM9000网卡
- l 移植u-boot之修改代码支持DM9000网卡-3.5
- Wormholes(题意抽象+SPFA判负权环)
- Java基础---选择排序和冒泡排序
- 隐藏标题栏
- 《JAVA与模式》之模板方法模式
- OTSU算法原理
- 移植u-boot-2015.07-rc3之修改代码支持mtdparts命令(八)
- C语言的标识符
- 关于Android Notification.Builder不显示通知的问题
- js中移除空白节点
- [leetcode-67]Add Binary(C)
- 在Ubuntu 14.04上安装MariaDB
- 2015年8月2日23:07:44 最近一周的工作思想汇报
- Java心得4
- hdoj 2199 Can you solve this equation? 【二分基础题 注意去掉不满足的情况】