mkimage regression: legacy images with Image Type IH_TYPE_FLATDT
Marc Kleine-Budde
mkl at pengutronix.de
Fri Oct 28 17:52:05 CEST 2022
Hello!
ld;dr: I want to create legacy images with Image Type IH_TYPE_FLATDT.
Details:
During the migration of an older system to recent yocto, we noticed that
the u-boot's mkimage doesn't work anymore as expected.
The system runs an older version of u-boot and requires the kernel's dtb
wrapped in a legacy u-boot image.
With the old u-boot (v2009.08) the following command was used to create
the uimage containing the dtb:
| mkimage -A arm -O linux -T flat_dt -C none -d <infile> <outfile>
e.g.:
| $ mkimage-v2009.08-144-g449609f5b11c -A arm -O linux -T flat_dt -C none -d ./vivavis-skalar-pro.dtb out-v2009.08-144-g449609f5b11c
| Image Name:
| Created: Wed Feb 2 22:22:22 2022
| Image Type: ARM Linux Flat Device Tree (uncompressed)
| Data Size: 21726 Bytes = 21.22 kB = 0.02 MB
| Load Address: 00000000
| Entry Point: 00000000
|
| $ file out-v2009.08-144-g449609f5b11c
| out-v2009.08-144-g449609f5b11c: u-boot legacy uImage, , Linux/ARM,
| Binary Flat Device Tree BLOB (Not compressed), 21726 bytes, Wed Feb 2
| 21:22:22 2022, Load Address: 00000000, Entry Point: 00000000, Header
| CRC: 0X945F44C9, Data CRC: 0XDCA9BDD
With the new u-boot:
| $ mkimage -A arm -O linux -T flat_dt -C none -d ./vivavis-skalar-pro.dtb out-upstream
| mkimage: Can't set header for FIT Image support: Success
|
| echo $?
| 1
The command fails.
(...and prints the error message "Success". I'll send a patch to fix that).
An image is (partially) generated, but it's neither a valid legacy image
nor a FIT image:
| $ file out-upstream
| out-upstream: data
|
| $ hexdump -C out-upstream | head -10
| 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
| *
| 00000040 d0 0d fe ed 00 00 54 de 00 00 00 38 00 00 50 9c |......T....8..P.|
| 00000050 00 00 00 28 00 00 00 11 00 00 00 10 00 00 00 00 |...(............|
| 00000060 00 00 04 42 00 00 50 64 00 00 00 00 00 00 00 00 |...B..Pd........|
| 00000070 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 |................|
| 00000080 00 00 00 03 00 00 00 04 00 00 00 00 00 00 00 01 |................|
| 00000090 00 00 00 03 00 00 00 04 00 00 00 0f 00 00 00 01 |................|
| 000000a0 00 00 00 03 00 00 00 13 00 00 00 1b 56 49 56 41 |............VIVA|
| 000000b0 56 49 53 20 53 6b 61 6c 61 72 2e 70 72 6f 00 00 |VIS Skalar.pro..|
The main difference between the old u-boot and recent u-boot, is that
the old u-boot (obviously) always creates legacy images, with the struct
legacy_img_hdr::ih_type in the header set to the type given with the
'-T' command line argument.
With new mkimage, it's a bit different. The type of the -T command line
parameter is used to select the actual image type. This is done by
iterating over all image types and calling the check_image_type callback
to find a matching image provider.
The FIT image ("fit_common.c") matches on types IH_TYPE_FLATDT (which
corresponds to "-T flat_dt") while the legacy image
("tools/default_image.c") matches on the following image types:
IH_TYPE_STANDALONE, /* Standalone Program */
IH_TYPE_KERNEL, /* OS Kernel Image */
IH_TYPE_RAMDISK, /* RAMDisk Image */
IH_TYPE_MULTI, /* Multi-File Image */
IH_TYPE_FIRMWARE, /* Firmware Image */
IH_TYPE_SCRIPT, /* Script file */
IH_TYPE_FILESYSTEM, /* Filesystem Image (any type) */
For work around the problem, I disabled FIT image support entirely and
let the legacy image pick up IH_TYPE_FLATDT, too:
diff --git a/tools/default_image.c b/tools/default_image.c
index 4a067e65862e..ab145001e49d 100644
--- a/tools/default_image.c
+++ b/tools/default_image.c
@@ -26,7 +26,7 @@ static struct legacy_img_hdr header;
static int image_check_image_types(uint8_t type)
{
- if (((type > IH_TYPE_INVALID) && (type < IH_TYPE_FLATDT)) ||
+ if (((type > IH_TYPE_INVALID) && (type <= IH_TYPE_FLATDT)) ||
(type == IH_TYPE_KERNEL_NOLOAD) || (type == IH_TYPE_FIRMWARE_IVT))
return EXIT_SUCCESS;
else
diff --git a/tools/fit_common.c b/tools/fit_common.c
index 01649760ac00..a967449103f0 100644
--- a/tools/fit_common.c
+++ b/tools/fit_common.c
@@ -43,9 +43,11 @@ int fit_verify_header(unsigned char *ptr, int image_size,
int fit_check_image_types(uint8_t type)
{
+#if 0
if (type == IH_TYPE_FLATDT)
return EXIT_SUCCESS;
else
+#endif
return EXIT_FAILURE;
}
I though of adding a command line parameter to force legacy images,
regardless of the -T value (which means passing the parsed command line
parameters down into the check_image_type callback). Are the better
options or am I using mkimage wrong?
regards,
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung West/Dortmund | Phone: +49-231-2826-924 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20221028/de4d25be/attachment.sig>
More information about the U-Boot
mailing list