2016-2017年Linux系统的在线升级
Linux系统的在线升级
目前嵌入式Linux系统的升级,即升级uboot,kernel,rootfs等的传统的方式,都是用烧写工具去烧写,相对来说,显得很繁琐和效率比较低,而利用mtd工具的方式去升级系统,相对比较方便。 1. 系统升级前的准备工作
1.1 linux中已实现了U盘挂载,以方便拷贝要升级的文件
linux系统中已经有了USB驱动,并且已经实现了USB的自动挂载。有了U盘挂载,每次升级系统文件,包括uboot、kernel、rootfs等文件就可以放在U盘。
1.2 linux中nor flash和nand flash己能正常工作
要用mtd工具升级系统之前,肯定是对应的nand flash以及nor flash都是已经正常工作了,即除了系统正常运行外,通过:cat /proc/mtd ,可以看到对应的nor flash和nand flash所对应的分区信息了。如下图所示。
图1-1 Nand flash 分区
1.3 准备好mtd工具
使用交叉工具链编译zlib-1.2.3和mtd,可以得到mtd工具
flash_erase、flash_eraseall、nandwrite、nanddump,这四个工具的作用如下表:
表1 MTD工具简介
MTD工具名称 功能
Flash_erase 擦除flash(nand或nor)的某个部分
Flash_eraseall 擦除flash的某个分区
nandwrite 用于将某个文件/数据,写入到某个分区
nanddump 用于查看当前某个mtd分区的数据 2. 利用MTD工具实现Linux系统的升级
利用MTD工具升级系统,方法是:先用nand_eraseall擦除对应的mtd分区中的内容,再将对应的数据用nandwrite写入对应的mtd中对应的位置中。
Nand flash的MTD分区情况可以查看文件arch/arm/plat-s3c24xx
/common-smdk.c,代码如下:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader u-boot-2010.03",
.size = SZ_1M,
.offset = 0,
},
[1] = {
.name = "kernel linux-2.6.35",
.offset = SZ_1M,
.size = SZ_4M,
},
[2] = {
.name = "rootfs busybox-1.17.3",
.offset = SZ_1M * 5,
.size = SZ_1M * 40,
},
[3] = {
.name = "usrfs",
.offset = SZ_1M * 45,
.size = SZ_1M * 19,
},
};
0
/dev/mtd0 u-boot
100000
/dev/mtd1 Kernel
500000
/dev/mtd2 根文件系统(cramfs)
2d00000
/dev/mtd3 用户文件系统(yaffs2)
4000000
图2-1 Linux系统中的Nand MTD分区 2.1 升级u-boot
1. 擦除u-boot所在分区的数据
/tmp/usb/util/flash_eraseall /dev/mtd0
2. 写入升级的u-boot数据
/tmp/usb/util/nandwrite -p -s 0x4000 /dev/mtd0 /tmp/usb/u-boot.bin
其中,-p参数表示,如果要写入的数据不是页大小的整数倍,会自
己加填充数据;0x4000是nand flash的一个块的大小。
2.2 升级kernel
1. 擦除旧的kernel数据
/tmp/usb/util/nand_erase /dev/mtd1 0 100 其中的参数0表示从/dev/mtd1起始位置开始擦除。参数100是表示
要擦除的block数目。
2. 写入kernel数据
/tmp/usb/util/nandwrite -p /dev/mtd1 /tmp/usb/zImage
2.3 升级rootfs
1. 擦除rootfs所在分区的数据
/tmp/usb/util/nand_eraseall /dev/mtd2 2. 写入新的rootfs数据
/tmp/usb/util/nandwrite -o /dev/mtd2 /tmp/usb/rootfs.cramfs
这样,就完成Linux系统的在线升级。在我们的这个项目中,实现了
通过三种方式来升级系统:
? 通过按键;
? 通过Internet上网页的按钮;
? 通过手机发短信。
华腾科技www.huatech.net 第 6 页 共 6 页