1.3. 利用mtd工具升级Linux系统

利用mtd工具升级系统,其实说白了,就是:

  1. 用flasherase擦除数据

    先用flasherase擦除对应mtd分区中的内容

  2. 用nandwrite写入数据

    然后将对应的数据(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() */
	},
};
    

对应的用图表来说明,如下:

图 1.1. Linux系统中的Nand MTD分区

Linux系统中的Nand MTD分区


下面就来介绍,如何一步步升级uboot,kernel和rootfs。