嵌入式linux 运行期间升级u-boot,kernel和文件系统

2019-07-12 18:27发布

本文主要就是介绍,在嵌入式Linux 系统下,已经实现了nand 驱动后, 如何利用mtd 工具,进行在线升级u-boot,Linux和文件系统。 主要使用到的工具是mtd-utils-1.3.1,如果你需要源码,可以到官网下载http://www.linux-mtd.infradead.org/source.html。也可以等我有空上传到资源里面去下载。   在利用 mtd 工具升级系统前,需要有nand flash驱动.在目标板上使用cat /proc/mtd 命令。即可以看到你的mtd设备。 mtd-util  ,即 mtd   的 utilities  ,是 mtd  相关的很多工具的总称 ,包括常用的mtdinfo,flash_erase, flash_eraseall, nanddump, nandwrite 等,每一个工具,基本上都对应着一个同文件名的C 文件。 MTD 工具名称        功能简介 flash_erase     擦除flash (nand 戒nor )的某个部分 flash_eraseall  擦除整个mtd 的分区(某个nor 戒nand 分区) nanddump        用亍查看当前某个mtd分区的数据(nand的话,也支持显示oob数据) nandwrite       用亍将某个文件/数据,写入到某个mtd 分区(的某个位置)   升级Uboot 1.  擦除uboot 所在分区的所有数据 ./util/flash_eraseall /dev/mtd0 2.擦除旧的uboot 的环境变量: ./util/flash_erase /dev/mtd1 0x700000 2 注: A  .0x800000~0x900000  即/dev/mtd1    中的 0x700000~0x800000,  用亍存放 uboot 中的环境变量。 重新升级uboot 的同时,先把旧的环境变量擦除掉。 3.写入uboot 数据 ./util/nandwrite  -p  -s 0x80000 /dev/mtd0 u -boot_addHeader.bin 注: A. -p 参数表示,如果要写入的数据丌是页大小的整数倍,会自己加填充数据即,如需要, 自动padding。
B. 0x80000 是当前4K 的pagesize 的nand flash 的一个块的大小。   升级Kernel 1.擦除旧的kernel 数据 ./util/flash_erase /dev/mtd1 0 10 注: A.  其中的参数0 ,表示从/dev/mtd1 起始位置开始擦除。 B. 参数10 是表示要擦除的block 数目。 /dev/mtd1  的物理起始地址是 0x100000 ,而0x100000~0x600000 乊间,是用亍保存 uImage 的数据,所以 : 要擦除的block 的数目 =要擦除的大小/块大小 =0x500000/块大小 =5M/512KB =10 其中 ,当前用的是这个4K pagesize 的nand 的块大小是512KB。 2.写入kernel 数据 ./util/nandwrite  -p /dev/mtd1 uImage    升级rootfs
1.擦除rootfs 所在分区数据 ./util/flash_eraseall /dev/mtd2 2.写入新的rootfs ./util/nandwrite  -o /dev/mtd2 rootfs.4k.arm.yaffs2 注: A.  因为此处的rootfs 镜像文件是yaffs2 文件系统,包含了oob 数据。所以此处加上参数 -o ,意思是写入页数据同时也写入oob 数据,而且,加了-o  参数同时就丌能再像乊前的 uboot 和 uImage 一样,加-p 参数了,因为包含了oob 数据的 rootfs ,本身就是页大小 的整数倍,丌需要padding。 B. 丌论实际使用的是4K+128  还是对亍4K+218 (内部处理为4K+192 )的nand ,此处 都是使用4K+128 的rootfs 镜像。