u-boot 使用 jffs2 文件系统加载内核

来源:互联网 发布:数据迁移工具有哪些 编辑:程序博客网 时间:2024/06/06 09:48
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 设置标志位。
0 0