7、u-boot增加MTD(NAND)分区
MTD分区时u-boot中的一个重要概念,因为u-boot的主要作用是引导操作系统及烧写程序,我们的程序(u-boot.bin,zImage,rootfs等)就是存储在NandFlash之中的。对NandFlash分区其实就是把NandFlash划分为几个地址区域,每个分区都有分区名,分区的大小,分区的起始地址。这样我们就可以规定把我们的程序存储在指定分区内,烧写NandFlash的时候就可以直接指定分区名,而不用计算要烧写的地址了。
u-boot中已经集成了MTD分区的相关操作,我们只需要加入MTD分区的配置和分区表的定义。
修改sdmk2440.h,加入MTDPARTS和JFFS2命令,修改的代码如下:
- #define CONFIG_CMD_CACHE
- #define CONFIG_CMD_DATE
- #define CONFIG_CMD_ELF
- #define CONFIG_CMD_NAND
- #define CONFIG_CMD_MTDPARTS
- #define CONFIG_CMD_JFFS2
- #define CONFIG_JFFS2_NAND 1
- #define CONFIG_JFFS2_CMDLINE 1
- #define CONFIG_JFFS2_DEV "nand0"
- #define CONFIG_MTD_DEVICE
- #define CONFIG_MTD_PARTITIONS
- #define MTDIDS_DEFAULT "nand0=nandflash0"
- #define MTDPARTS_DEFAULT "mtdparts=nandflash0:1m@0(bios)," \
- "128k(params)," \
- "4m(kernel)," \
- "-(root)"
分区的说明如下图所示:
如果定义了CONFIG_MTD_PARTITIONS,就会编译common目录下的cmd_mtdparts.c文件,这需要用到drivers/mtd/mtdcore.c中的函数,所以需要定义CONFIG_MTD_DEVICE和CONFIG_MTD_PARTITIONS这两项,才能编译mtdcore.c和mtdpart.c。
重新编译u-boot,下载到NandFlash中运行,输入命令help,即可看到mtdparts命令,效果如下:
使用命令mtdparts查看一下,并没有打出刚才设置的分区信息,使用printenv命令也看不到分区信息,效果如下:
使用命令mtdparts help查看下,可以看到下面这一项:
所以先运行命令mtdparts default,再使用命令mtdparts就可以看到分区的信息了,效果如下:
因此,需要在程序中执行一次mtdparts default才能使分区生效,可以修改main.c中的main_loop函数,在该函数中运行mtdparts default命令,修改的代码如下:
- #ifdef CONFIG_AUTO_COMPLETE
- install_auto_complete();
- #endif
- #ifdef CONFIG_CMD_MTDPARTS
- if (!getenv("mtdparts"))
- {
- run_command("mtdparts default", 0);
- }
- #endif
重新编译u-boot,下载到NandFlash中运行,就可以看到分区的信息及使用分区了。使用printenv命令查看一下环境变量,可以看到分区信息,效果如下:
阅读(1061) | 评论(0) | 转发(0) |