当前位置: 首页 > 工具软件 > magic-boot > 使用案例 >

u-boot 之u-boot.img uboot.bin uboot_crc.bin 及 uboot_crc.bin.crc

孟健
2023-12-01

编译uboot会生成很多image: u-boot.img uboot.bin uboot_crc.bin 及 uboot_crc.bin.crc 。 这些image文件有哪些区别和联系, 我们将做以下详细分析:
1. u-boot.bin
是u-boot 编译生成的原始的image 文件, 很多image 文件的生成都需要依赖于它。

2. u-boot.img
它是给u-boot.bin 加上0x40 Byte 长度的Header。 里面包含加载地址,运行地址,CRC 等重要信息, 用来让它的加载程序识别。

u-boot.img contains u-boot.bin along with an additional header to be used by the boot ROM to determine how and where to load and execute U-Boot.

u-boot.img 最终会使用mkimage 将u-boot.bin 生成u-boot.img。

$(obj)u-boot.img:       $(obj)u-boot.bin
        ./tools/mkimage -A $(ARCH) -T firmware -C none \
        -a $(TEXT_BASE) -e 0 \
        -n $(shell sed -n -e 's/.*U_BOOT_VERSION//p' $(VERSION_FILE) | \
        sed -e 's/"[     ]*$$/ for $(BOARD) board"/') \
        -d $< $@

我们再研究下mkimge 的使用:

mkimage是在制作镜像文件时候, 在原来的image文件前增加一个0x40字节长度的头,增加的头结构描述如下
/*
* Legacy format image header,
* all data in network byte order (aka natural aka bigendian).
*/
typedef struct image_header {
uint32_t ih_magic; /* Image Header Magic Number */
uint32_t ih_hcrc; /* Image Header CRC Checksum */
uint32_t ih_time; /* Image Creation Timestamp */
uint32_t ih_size; /* Image Data Size */
uint32_t ih_load; /* Data Load Address */
uint32_t ih_ep; /* Entry Point Address */
uint32_t ih_dcrc; /* Image Data CRC Checksum */
uint8_t ih_os; /* Operating System */
uint8_t ih_arch; /* CPU architecture */
uint8_t ih_type; /* Image Type */
uint8_t ih_comp; /* Compression Type */
uint8_t ih_name[IH_NMLEN]; /* Image Name */
} image_header_t;
Image Name占用了32字节,其他信息占用了32字节
mkimage用法:
Usage: ./mkimage -l image
-l ==> list image header information
./mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file…] image
-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)
-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)
./mkimage [-D dtc_options] -f fit-image.its fit-image
-A 设定架构类型,可取值参照uboot/common/image.c
-O 设定操作系统类型,可取值参照uboot/common/image.c
-T image类型,可取值参照uboot/common/image.c
-a 指定image在内存中的加载地址
-e 指定image运行的入口点地址
-C 指定压缩方式,压缩方式参考uboot/common/image.c
-d data_file[:data_file…] 制作image的源文件
示例
$MKIMAGE_TOOL -A arm -O linux -T kernel -C none -a 0x90008000 -e 0x90008000 -n “Android Linux Kernel” -d ./zImage ./uImage

3. u-boot_crc.bin
u-boot_crc.bin 是将u-boot.bin 变成一个固定长度的image.
让我们看下它的实现形式:

 u-boot_crc.bin:    u-boot.bin
        @cp tools/mk_uboot_crc .
        @./mk_uboot_crc
        @crc32 ./u-boot_crc.bin > ./u-boot_crc.bin.crc
        @rm -f ./mk_uboot_crc

mk_uboot_crc 的实现在/tools/mk_uboot_crc .c中:

#define IMG_SZ 614400

int  main(void)
{
    struct stat buf;
    unsigned char binary[IMG_SZ];
    int fd;
    memset(binary, 0, IMG_SZ);

    if(stat("./u-boot.bin", &buf) != 0)
        return -1;
    //printf("File size %d\n", buf.st_size);

    fd = open("./u-boot.bin", O_RDWR);
    if(fd < 0)
    {
        printf("Open u-boot.bin file fail %d\n", fd);
        return -1;
    }
    read(fd, binary, buf.st_size);
    close(fd);

    fd = open("./u-boot_crc.bin", O_RDWR | O_CREAT, S_IRWXU);
    if(fd < 0)
    {
        printf("Open file fail %d\n", fd);
        return -1;
    }
    write(fd, binary, IMG_SZ);

    //printf("padding done\n");
    return 0;
} 

4. uboot_crc.bin.crc
该文件存放的是uboot_crc.bin 的CRC32 结果。
有3 中的makefile 实现可以看出,

@crc32 ./u-boot_crc.bin > ./u-boot_crc.bin.crc

4. u-boot.imx
u-boot.imx 是包含了DCD(device configure data)的uboot 的image。 DCD数据就是board/freescale/xx/xx.cfg 文件中的配置,其包括DDR 参数的配置,一些基本PLL的配置等。所以u-boot.imx 的不需要SPL 就可以启动的。

 类似资料: