u-boot 使用 jffs2 文件系统加载内核 备忘
1. 修改kernel 中的 nand.c
#define MV_NUM_OF_NAND_PARTS 7
static struct mtd_partition parts_info[] = {
{ .name = "u-boot",
.offset = 0,
.size = 1 * 1024 * 1024 },
{ .name = "kernel-1-jffs2",
.offset = MTDPART_OFS_NXTBLK,
.size = 4 * 1024 * 1024 },
{ .name = "kernel-2-jffs2",
.offset = MTDPART_OFS_NXTBLK,
.size = 4 * 1024 * 1024 },
{ .name = "rootfs-1-yaffs2",
.offset = MTDPART_OFS_NXTBLK,
.size = 128 * 1024 * 1024 },
{ .name = "rootfs-2-yaffs2",
.offset = MTDPART_OFS_NXTBLK,
.size = 128 * 1024 * 1024 },
{ .name = "CFG-yaffs2",
.offset = MTDPART_OFS_NXTBLK,
.size = 8 * 1024 * 1024 },
{ .name = "Data-yaffs2",
.offset = MTDPART_OFS_NXTBLK,
.size = MTDPART_SIZ_FULL },
};
注意修改 num_of_parts = MV_NUM_OF_NAND_PARTS;
内核修改完毕:
分区信息如下:
dev: size erasesize name
mtd0: 00100000 00020000 "u-boot"
mtd1: 00400000 00020000 "kernel-1-jffs2"
mtd2: 00400000 00020000 "kernel-2-jffs2"
mtd3: 08000000 00020000 "rootfs-1-yaffs2"
mtd4: 08000000 00020000 "rootfs-2-yaffs2"
mtd5: 00800000 00020000 "CFG-yaffs2"
mtd6: 0ef00000 00020000 "Data-yaffs2"
设计说明:
两个kernel分区,两个文件系统分区,方便远程升级系统。
2. u-boot 修改部分
2.1 加入对 jffs 文件系统的支持
#define CONFIG_CMD_JFFS2
/*JFFS2 Support */
#define CONFIG_JFFS2_CMDLINE
#define CONFIG_JFFS2_NAND 1
#define CONFIG_JFFS2_DEV "nand0"
/*JFFS2 Support */
2.2 修改u-boot中的分区信息
找到 环境变量设置的地方加入
env = getenv("flagPolicy");
if(!env)
setenv("flagPolicy","yes" );
env = getenv("mtdparts");
if( !env )
setenv("mtdparts","mtdparts=NAND:1m@0(u-boot),4m(kernel-1),4m(kernel-2),128m(rootfs-1),128m(rootfs-2),8m(cfg),-(data)");
env = getenv("bootflag1");
if( !env )
setenv("bootflag1", "chpart nand0,1;fsload $(image_name);setenv bootargs $(bootargs) root=/dev/mtdblock3 rootfstype=$(rootfstype)
ip=$(ipaddr):$(serverip)$(bootargs_end); bootm;" );
env = getenv("bootflag2");
if( !env )
setenv("bootflag2", "chpart nand0,2;fsload $(image_name);setenv bootargs $(bootargs) root=/dev/mtdblock4
rootfstype=$(rootfstype) ip=$(ipaddr):$(serverip)$(bootargs_end); bootm;" );
mtdparts 所存储的是分区信息,最好与内核部分一致。
bootflag1和bootflag2分别为启动脚本。
使用chpart 切换分区
fsload 从对应的分区上加载kernel文件。
2.3 修改 main.c 中 main_loop 函数
使系统使用自己的脚本启动。
2.4 启动flag
可以拿 u-boot 所在分区,也就是第一个分区的最后2k或者4k 存放启动标志。
u-boot 中读取启动标志,选择不同的脚本启动。
3 引用程序修改启动标志
3.1 使用 open 函数打开 /dev/mtd0 设备 直接读写
写时应该注意长度必须是页面对齐的, 最好是 2k.
4 部分升级脚本 update.sh
4.1 使用 nfs 启动系统
#startup by run nfsboot
#install kernel -1
/mtd-utils/usr/sbin/flash_eraseall /dev/mtd1
/bin/dd if=/uImage.jffs2 of=/dev/mtdblock1
#install fs -1
/mtd-utils/usr/sbin/flash_eraseall /dev/mtd3
/bin/mount -t yaffs2 /dev/mtdblock3 /mountpoint
tar xvf /fs.tar -C /mountpoint
1. 修改kernel 中的 nand.c
#define MV_NUM_OF_NAND_PARTS 7
static struct mtd_partition parts_info[] = {
{ .name = "u-boot",
.offset = 0,
.size = 1 * 1024 * 1024 },
{ .name = "kernel-1-jffs2",
.offset = MTDPART_OFS_NXTBLK,
.size = 4 * 1024 * 1024 },
{ .name = "kernel-2-jffs2",
.offset = MTDPART_OFS_NXTBLK,
.size = 4 * 1024 * 1024 },
{ .name = "rootfs-1-yaffs2",
.offset = MTDPART_OFS_NXTBLK,
.size = 128 * 1024 * 1024 },
{ .name = "rootfs-2-yaffs2",
.offset = MTDPART_OFS_NXTBLK,
.size = 128 * 1024 * 1024 },
{ .name = "CFG-yaffs2",
.offset = MTDPART_OFS_NXTBLK,
.size = 8 * 1024 * 1024 },
{ .name = "Data-yaffs2",
.offset = MTDPART_OFS_NXTBLK,
.size = MTDPART_SIZ_FULL },
};
注意修改 num_of_parts = MV_NUM_OF_NAND_PARTS;
内核修改完毕:
分区信息如下:
dev: size erasesize name
mtd0: 00100000 00020000 "u-boot"
mtd1: 00400000 00020000 "kernel-1-jffs2"
mtd2: 00400000 00020000 "kernel-2-jffs2"
mtd3: 08000000 00020000 "rootfs-1-yaffs2"
mtd4: 08000000 00020000 "rootfs-2-yaffs2"
mtd5: 00800000 00020000 "CFG-yaffs2"
mtd6: 0ef00000 00020000 "Data-yaffs2"
设计说明:
两个kernel分区,两个文件系统分区,方便远程升级系统。
2. u-boot 修改部分
2.1 加入对 jffs 文件系统的支持
#define CONFIG_CMD_JFFS2
/*JFFS2 Support */
#define CONFIG_JFFS2_CMDLINE
#define CONFIG_JFFS2_NAND 1
#define CONFIG_JFFS2_DEV "nand0"
/*JFFS2 Support */
2.2 修改u-boot中的分区信息
找到 环境变量设置的地方加入
env = getenv("flagPolicy");
if(!env)
setenv("flagPolicy","yes" );
env = getenv("mtdparts");
if( !env )
setenv("mtdparts","mtdparts=NAND:1m@0(u-boot),4m(kernel-1),4m(kernel-2),128m(rootfs-1),128m(rootfs-2),8m(cfg),-(data)");
env = getenv("bootflag1");
if( !env )
setenv("bootflag1", "chpart nand0,1;fsload $(image_name);setenv bootargs $(bootargs) root=/dev/mtdblock3 rootfstype=$(rootfstype)
ip=$(ipaddr):$(serverip)$(bootargs_end); bootm;" );
env = getenv("bootflag2");
if( !env )
setenv("bootflag2", "chpart nand0,2;fsload $(image_name);setenv bootargs $(bootargs) root=/dev/mtdblock4
rootfstype=$(rootfstype) ip=$(ipaddr):$(serverip)$(bootargs_end); bootm;" );
mtdparts 所存储的是分区信息,最好与内核部分一致。
bootflag1和bootflag2分别为启动脚本。
使用chpart 切换分区
fsload 从对应的分区上加载kernel文件。
2.3 修改 main.c 中 main_loop 函数
使系统使用自己的脚本启动。
2.4 启动flag
可以拿 u-boot 所在分区,也就是第一个分区的最后2k或者4k 存放启动标志。
u-boot 中读取启动标志,选择不同的脚本启动。
3 引用程序修改启动标志
3.1 使用 open 函数打开 /dev/mtd0 设备 直接读写
写时应该注意长度必须是页面对齐的, 最好是 2k.
4 部分升级脚本 update.sh
4.1 使用 nfs 启动系统
#startup by run nfsboot
#install kernel -1
/mtd-utils/usr/sbin/flash_eraseall /dev/mtd1
/bin/dd if=/uImage.jffs2 of=/dev/mtdblock1
#install fs -1
/mtd-utils/usr/sbin/flash_eraseall /dev/mtd3
/bin/mount -t yaffs2 /dev/mtdblock3 /mountpoint
tar xvf /fs.tar -C /mountpoint
4.2 设置标志位。