使用U-Boot的mkimage制作FIT镜像或给镜像加协议头

1.环境信息:

  Version Info:U-Boot 2016.092.0+g199df35 (Nov 20 2016 - 12:55:17 +0800)

  ARCH:arm

  CPU:Freescale LS1020 Serial

  Cross Compiler: arm-linux-gnueabihf-

2.制作镜像: 

FIT镜像制作示例,FIT是内核、设备树、文件系统合并成一个文件的一种镜像,并且一个FIT镜像里边可能包含了很多个内核、设备树、文件系统等;

<1>准备文件:

    a.可执行程序:mkimage;

        该文件在U-Boot编译完成后,源码目录下/tools/有编译好的二进制程序;

    b.分开的镜像文件:zImage、rootfs.gz、dev-tree.dtb;

        zImage由内核源码编译后在arch/arm/boot/zImage目录下;

        rootfs.gz由busybox编译后,添加相关文件、目录后制作而成,参见 “busybox根文件系统制作”;

        dev-tree.dtb是设备树编译好后的二进制文件,在linux源码目录执行make dtbs可生成,也可用linux源码目录的/scripts/dtc/dtc工具编译;

    c.描述合并后镜像信息的文件:image_info.its;

        *.its文件需要用户自己编写,编写时可以参考U-Boot源码目录下的./doc/uImage.FIT/kernel.its文件编写;

<2>生成FIT镜像

  命令:./mkimage -f image_info.its fit.img

  其中:-f 表明要依据its文件内描述的文件制作FIT镜像;image_info.its文件是针对当前单板构建的镜像信息描述文件;fit.img是最后生成的FIT镜像文件名,文件名和拓展名自定义(file命令可以看到不管文件拓展名是啥,文件本质是:data)

  注:执行该条命令时,需要把its文件内描述的镜像文件放在指定的路径下,mkimage工具会依据its文件内描述自动加载文件,生成的fit.img文件也可以依据需求指定文件的路径,最好是绝对路径。

<3>给单个镜像文件加协议头

<3.1>内核镜像加协议头:

  命令:./mkimage -A arm -O linux -T kernel -C none -a 0x21000000 -e 0x21000040 -n "ARM32 Linux Kernel" -d zImage uImage

  执行结果示例

[root@bogon mk_images]# ./mkimage -A arm -O linux -T kernel -C none -a 0x21000000 -e 0x21000040 -n "ARM32 Linux Kernel" -d zImage uImage
Image Name:   ARM32 Linux Kernel
Created:      Tue May 21 14:22:06 2019
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    9134592 Bytes = 8920.50 KiB = 8.71 MiB
Load Address: 21000000
Entry Point:  21000040
#注:0x21000000是uImage的开始地址,0x21000040是跳过开头的64bytes后zImage的地址。

<3.2>文件系统镜像加协议头:

  命令:./mkimage -A arm -O linux -T ramdisk -C gzip -n "ARM32 Linux Kernel" -d ramdisk.gz rootfs

  执行结果示例

[root@bogon mk_images]# ./mkimage -A arm -O linux -T ramdisk -C gzip -n "ARM32 Linux Rootfs" -d ramdisk.gz rootfs
Image Name:   ARM32 Linux Kernel
Created:      Tue May 21 14:30:27 2019
Image Type:   ARM32 Linux Rootfs
(gzip compressed) Data Size: 4718592 Bytes = 4608.00 KiB = 4.50 MiB Load Address: 00000000 Entry Point: 00000000

<3.3>设备树镜像加协议头:

  命令:暂未测试

 

<3.4>合并镜像文件

  将三个加头后镜像文件合并到一个文件中:参见第二步合并镜像,其他方式暂未测试 

 注:U-Boot所支持的镜像类型:即-T后跟的参数类型  

[root@bogon mk_images]# ./mkimage -T list
Invalid image type, supported are:
        Unknown image type  Unknown image type
        aisimage         Davinci AIS image
        atmelimage       ATMEL ROM-Boot Image
        filesystem       Filesystem Image
        firmware         Firmware
        firmware_ivt     Firmware with HABv4 IVT
        flat_dt          Flat Device Tree
        fpga             FPGA Image
        gpimage          TI Keystone SPL Image
        imximage         Freescale i.MX Boot Image
        invalid          Invalid Image
        kernel           Kernel Image
        kernel_noload    Kernel Image (no loading done)
        kwbimage         Kirkwood Boot Image
        lpc32xximage     LPC32XX Boot Image
        multi            Multi-File Image
        mxsimage         Freescale MXS Boot Image
        omapimage        TI OMAP SPL With GP CH
        pblimage         Freescale PBL Boot Image
        pmmc             TI Power Management Micro-Controller Firmware
        ramdisk          RAMDisk Image
        rkimage          Rockchip Boot Image
        rksd             Rockchip SD Boot Image
        rkspi            Rockchip SPI Boot Image
        script           Script
        socfpgaimage     Altera SOCFPGA preloader
        standalone       Standalone Program
        tee              Trusted Execution Environment Image
        ublimage         Davinci UBL image
        vybridimage      Vybrid Boot Image
        x86_setup        x86 setup.bin
        zynqimage        Xilinx Zynq Boot Image
        zynqmpimage      Xilinx ZynqMP Boot Image

 

3.U-Boot识别和引导FIT镜像

<1>将镜像下载到目标单板

  一般采用tftp网络下载镜像文件到目标单板,

  命令:tftp 0x41000000 fit.img

  其中:0x41000000 是加载的位置,可以是内存也可以是Nor Flash的地址;

            (注:Nor Flash可能需要sf(SPI Flash SubSystem)或者其他命令实现,具体依据U-Boot功能)

  :fit.img文件应位于和目标板连在同一网络的服务器上,且服务器上有tftp服务,fit.img位于tftp服务的目录下。

            (注:CentOS的tftp服务目录不能更改,可能是因为xinet服务没有安装,安装后重启PC即可,重启服务没有用)

<2>U-Boot查看下载到单板的FIT镜像

  命令:iminfo 0x41000000

  其中:0x41000000 是下载的FIT镜像地址

<3>U-Boot从FIT镜像启动

  命令:bootm 0x41000000

  其中:0x41000000 是下载的FIT镜像地址

4.mkimage的详细解析

制作镜像的命令帮助信息:  

[root@localhost u-boot]# ./tools/mkimage
使用示例:
  获取已制作好的镜像的信息
  .
/tools/mkimage -l fit.img  
  
  制作FIT(Flattened device tree)镜像
  ./tools/mkimage -f image_info.its fit.img
  
  为单一镜像加镜像协议头
.
/tools/mkimage [-x] -A 处理器架构 -O 操作系统类型 -T 镜像类型 -C 压缩类型 -a 镜像地址 -e 内核镜像地址 -n 镜像名称 -d data_file[:data_file...] image
  mkimage工具的各参数含义
  -A ==> set architecture to 'arch'   //设置处理器架构
  -O ==> set operating system to 'os'   //设置操作系统类型
  -T ==> set image type to 'type'   //设置镜像类型
  -C ==> set compression type 'comp'   //设置压缩类型
  -a ==> set load address to 'addr' (hex) //设置镜像的地址(该镜像表示加已64byte文件头的镜像地址,该文件头属于U-Boot识别内核用)
  -e ==> set entry point to 'ep' (hex) //设置内核镜像的地址,用于读取真正内核的镜像
  -n ==> set image name to 'name' //设置镜像的名称
  -d ==> use image data from 'datafile' //设置镜像为数据文件   -x ==> set XIP (execute in place)     //设置是否在Flash内执行代码,当镜像存储在Nor Flash中时,可以在Nor中开辟空间运行程序。
  将文件系统大包到FIT镜像中:
.
/tools/mkimage [-D dtc_options] [-f fit-image.its|-f auto|-F] [-b <dtb> [-b <dtb>]] [-i <ramdisk.cpio.gz>] fit.img
<dtb> file is used with -f auto, it may occur multiple times.   -D => set all options for device tree compiler //设置编译设备树的命令字   -f => input filename for FIT source      //制作FIT镜像所需要的格式信息,一般是*.its文件,或者后面跟auto自动生成   -i => input filename for ramdisk file      //文件系统镜像,用于制作FIT镜像大包
  
-l ==> list image header information //打印已制作好的镜像信息
Signing / verified boot not supported (CONFIG_FIT_SIGNATURE undefined) //当前boot不支持动态签名认证(校验)<需要定义宏CONFIG_FIT_SIGNATURE>
  -V ==> print version information and exit //打印当前制作镜像的软件工具版本
Use '-T list' to see a list of available image types //运行mkimage时加参数'-T list'显示当前mkimage所支持的镜像类型

 

posted @ 2019-05-21 14:44  firdin  阅读(3065)  评论(0编辑  收藏  举报