利用mtd工具升级系统,其实说白了,就是:
先用flasherase擦除对应mtd分区中的内容
然后将对应的数据(uboot或uImage或rootfs)用nandwrite写入到对应的mtd中对应的位置即可。
前面介绍过了,对于常见的是把uboot(和kernel)放到nor flash中,而把kernel和rootfs放在nand flash中的。
而我此处的举的例子,是另外一种,即全部内容都放在nand flash上的。
但是,不论是是nor flash,还是nand flash,都在Linux的MTD框架下,管理起来,都是一样的。都是可以用对应的mtd的工具去操作的。所以,如果你本身是要升级对应的uboot(和kernel)到nor flash,对于整个过程,也是一样的,自己照葫芦画瓢即可。
关于我此处举例所用的MTD的分区是如何的,此处先给出相关部分的代码:
#define UBOOT_SIZE (SZ_1M) #define KERNEL_SIZE (SZ_8M) #define ROOTFS_SIZE (SZ_1M*200) #define TEMP_SIZE (SZ_1M*64) #define BEFORE_DATA_PARTION_SIZE \ (ROOTFS_SIZE + KERNEL_SIZE + UBOOT_SIZE + TEMP_SIZE) 。。。 static struct mtd_partition XXX_default_nand_part[] = { [0] = { .name = "U-Boot", .offset = 0, .size = UBOOT_SIZE, }, [1] = { .name = "Kernel", .offset = UBOOT_SIZE, .size = KERNEL_SIZE }, [2] = { .name = "Root filesystem", .offset = UBOOT_SIZE + KERNEL_SIZE, .size = ROOTFS_SIZE, }, [3] = { .name = "Temp", .offset = UBOOT_SIZE + KERNEL_SIZE + ROOTFS_SIZE, .size = TEMP_SIZE, }, [4] = { .name = "Data", .offset = BEFORE_DATA_PARTION_SIZE, .size = 0, /* set in XXX_init_nand_partion() */ }, };
对应的用图表来说明,如下:
下面就来介绍,如何一步步升级uboot,kernel和rootfs。
./util/flash_eraseall /dev/mtd0
./util/flash_erase /dev/mtd1 0x700000 2
即/dev/mtd1中的0x700000~0x800000, 用于存放uboot中的环境变量。
重新升级uboot的同时,先把旧的环境变量擦除掉。
./util/nandwrite -p -s 0x80000 /dev/mtd0 u-boot_addHeader.bin
表示如果要写入的数据不是页大小的整数倍,会自己加填充数据即,如需要,自动padding。
是当前4K的pagesize的nand flash的一个块的大小。
./util/flash_erase /dev/mtd1 0 10
/dev/mtd1的物理起始地址是0x100000,而0x100000~0x600000之间,是用于保存uImage的数据,所以:
要擦除的block的数目
= 要擦除的大小/块大小
= 0x500000/块大小
= 5M/512KB
= 10
其中,当前用的是这个4K pagesize的nand的块大小是512KB。
./util/nandwrite -p /dev/mtd1 uImage
./util/flash_eraseall /dev/mtd2
./util/nandwrite -o /dev/mtd2 rootfs.4k.arm.yaffs2