对于linux系统,善用dd命令,可以做到直接生成bin文件,而不用生产拆flash。
1) 读flash,保存成bin文件:
~ $ cat /proc/mtd
dev: size erasesize name
mtd0: 00260000 00020000 "U-Boot"
mtd1: 00020000 00020000 "U-Boot Env"
mtd2: 00300000 00020000 "U-Boot Logo"
mtd3: 00440000 00020000 "Kernel"
mtd4: 0c820000 00020000 "File System"
mtd5: 02e20000 00020000 "Reserved"
~ $ dd if=/dev/mtd0 of=/tmp/uboot.bin
4864+0 records in
4864+0 records out
2490368 bytes (2.4MB) copied, 0.509397 seconds, 4.7MB/s
这样就把uboot存下来了。
2) 读多个分区,保存成一个bin文件
(dd if=/dev/mtd0; dd if=/dev/mtd1; dd if=/dev/mtd2; dd if=/dev/mtd3; dd if=/dev/mtd4; dd if=/dev/mtd5) >/test/4230_flash.bin
顺序保存mtd0-mtd5,这个会有点大,建议mount nfs,写到nfs上去。
当然如果mtd不连续,这个方法就不好用了,只能直接生成。
3)直接生成bin文件
dd if=uboot.bin of=$RELEASE_DIR/9550A_flash.bin seek=UBOOT_START bs=1k
dd if=uImage of=$RELEASE_DIR/9550A_flash.bin seek=KERNEL_START bs=1k
dd if=rootfs.ext2 of=$RELEASE_DIR/9550A_flash.bin seek=FS_START bs=1k
将uboot、kernel和文件系统打包成bin。UBOOT_START 等指的是相应的内容在生成的bin文件中的起始偏移(也即在flash中的偏移),注意seek的单位是block(bs)。
要注意的是,这种方法对不连续的区域,是置为全0的。