如何把u-boot.bin、内核、以及根文件系统整合成一个文件烧写到flash中

Published: 20 May 2014 Category: linux

做嵌入式开发的人都知道flash分区,这些分区一般用来存放

  1. u-boot.bin
  2. linux内核(kernel)
  3. 根文件系统镜像(rootfs)

等等。

一般在开发的过程中都是按照这个顺序来烧写进flash的:

u-boot.bin->linux内核->根文件系统镜像

一般都是先烧写u-boot.bin,然后在u-boot的环境里进行后两者的烧写,至于烧写方式不赘述;这里主要是说怎么把u-boot.bin、内核、以及根文件系统整合成一个文件提供给生产,利用flash烧写工具进行量产的。

一般如果开发好的PCB板上的flash已经有了整个系统,那么只要把PCB上的flash卸下了提供给生产部门,生产人员就可以利用flash烧写工具进行量产了:先读下那颗PCB板上的flash的全部内容,然后直接烧写其他的flash即可。但是这里提供一种新方法:直接提供给生产部门一个烧写文件(这里命名为flash-burnfile.img),这样生产人员之间进行烧写,省去了读flash的过程。下面做简单介绍:

  • 首先,得有一个完整系统的PCB开发板,这里假设你手头上的确有。

  • 其次,得了解自己开发板的具体分区。进入u-boot环境下printenv看一下即可知道,或者直接cat /proc/cmdline

    /mnt/3520d/wifi $ cat /proc/cmdline
    mem=64M console=ttyAMA0,115200 root=/dev/nfs rw nfsroot=192.168.4.165:/home/NFSROOT/hi3520d-rootfs-NFS ip=192.168.4.99:192.168.4.1:255.255.255.0 mtdparts=hi_sfc:256K(boot),256K(env),1792K(kernel),-(rootfs)

或者:

/root $ cat /proc/mtd 
dev:    size   erasesize  name
mtd0: 00040000 00040000 "boot"
mtd1: 00040000 00040000 "env"
mtd2: 001c0000 00040000 "kernel"
mtd3: 00dc0000 00040000 "rootfs"  

主要看mtdparts=hi_sfc:256K(boot),256K(env),1792K(kernel),-(rootfs)就能知道几个分区以及各个分区的大小了。

  • 看一下目录/dev下的几个块设备:

    /root $ ls /dev/mtdblock?
    /dev/mtdblock3 /dev/mtdblock2 /dev/mtdblock1 /dev/mtdblock0

没错,刚好对应前面提到的四个分区。然后利用linuxdd命令把每个分区里的内容全部拷贝下来:

dd if=/dev/mtdblock0 of=u-boot.bin
dd if=/dev/mtdblock1 of=env.img   
dd if=/dev/mtdblock2 of=kernel.img      
dd if=/dev/mtdblock3 of=rootfs.img  

注意,输出文件的保存目录。其实,u-boot.bin、kernel.img、rootfs.img这三个都没有必要拷贝,因为我们自己有,是我们自己烧写进去的。

  • 最后,就是把这个文件整合成一个完整的烧写文件:

    dd if=u-boot.bin of=flash-burnfile.img
    dd if=env.img of=flash-burnfile.img bs=1k seek=256
    dd if=kernel.img of=flash-burnfile.img bs=1k seek=512
    dd if=rootfs.img of=flash-burnfile.img bs=1k seek=2304

注意,dd命令中的seek参数。这样子就得到了一个完整的烧写文件flash-burnfile.img了,把他给生产人员即可。