编译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 就可以启动的。