This patch moves retrieving the image header type into a function of its own. The idea is that aw_fel_write() can and will also make use of this function to detect boot scripts (by IH_TYPE_SCRIPT).
Signed-off-by: Bernhard Nortmann <[email protected]> --- fel.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 53 insertions(+), 18 deletions(-) diff --git a/fel.c b/fel.c index 78c1465..c27ebe3 100644 --- a/fel.c +++ b/fel.c @@ -106,6 +106,54 @@ void usb_bulk_recv(libusb_device_handle *usb, int ep, void *data, int length) } } +/* Constants taken from ${U-BOOT}/include/image.h */ +#define IH_MAGIC 0x27051956 /* Image Magic Number */ +#define IH_ARCH_ARM 2 /* ARM */ +#define IH_TYPE_INVALID 0 /* Invalid Image */ +#define IH_TYPE_FIRMWARE 5 /* Firmware Image */ +#define IH_TYPE_SCRIPT 6 /* Script file */ +#define IH_NMLEN 32 /* Image Name Length */ + +#define HEADER_NAME_OFFSET 32 /* offset of name field */ +#define HEADER_SIZE (HEADER_NAME_OFFSET + IH_NMLEN) + +/* + * Utility function to determine the image type from a mkimage-compatible + * header at given buffer (address). Use a non-zero "error" parameter if + * you want to propagate any mismatch (header magic, ARM architecture) + * with an actual error message and program termination. + * Otherwise the function will either return the "ih_type" field from + * a valid header, or IH_TYPE_INVALID in case of any mismatch. + */ +uint8_t get_image_type(const uint8_t *buf, int error) +{ + uint32_t *buf32 = (uint32_t *)buf; + + if (be32toh(buf32[0]) != IH_MAGIC) { + if (error) { + fprintf(stderr, "Image (%p) verification failure: " + "expected IH_MAGIC, got 0x%X\n", + buf, be32toh(buf32[0])); + exit(1); + } else { + return IH_TYPE_INVALID; + } + } + /* For sunxi, we always expect ARM architecture here */ + if (buf[29] != IH_ARCH_ARM) { + if (error) { + fprintf(stderr, "Image (%p) verification failure: " + "expected IH_ARCH_ARM, got %02X\n", + buf, buf[29]); + exit(1); + } else { + return IH_TYPE_INVALID; + } + } + /* assume a valid header, and return ih_type */ + return buf[30]; +} + void aw_send_usb_request(libusb_device_handle *usb, int type, int length) { struct aw_usb_request req; @@ -758,15 +806,6 @@ void aw_fel_write_and_execute_spl(libusb_device_handle *usb, aw_restore_and_enable_mmu(usb, tt); } -/* Constants taken from ${U-BOOT}/include/image.h */ -#define IH_MAGIC 0x27051956 /* Image Magic Number */ -#define IH_ARCH_ARM 2 /* ARM */ -#define IH_TYPE_FIRMWARE 5 /* Firmware Image */ -#define IH_NMLEN 32 /* Image Name Length */ - -#define HEADER_NAME_OFFSET 32 /* offset of name field */ -#define HEADER_SIZE (HEADER_NAME_OFFSET + IH_NMLEN) - /* * This function tests a given buffer address and length for a valid U-Boot * image. Upon success, the image data gets transferred to the default memory @@ -779,17 +818,13 @@ void aw_fel_write_uboot_image(libusb_device_handle *usb, if (len <= HEADER_SIZE) return; /* Insufficient size (no actual data), just bail out */ - /* Check for a valid mkimage header */ uint32_t *buf32 = (uint32_t *)buf; - if (be32toh(buf32[0]) != IH_MAGIC) { - fprintf(stderr, "U-Boot image verification failure: " - "expected IH_MAGIC, got 0x%X\n", be32toh(buf32[0])); - exit(1); - } - if (buf[29] != IH_ARCH_ARM|| buf[30] != IH_TYPE_FIRMWARE) { - fprintf(stderr, "U-Boot image verification failure: " - "expected ARM firmware, got %02X %02X\n", buf[29], buf[30]); + /* Check for a valid mkimage header */ + uint8_t image_type = get_image_type(buf, 1); + if (image_type != IH_TYPE_FIRMWARE) { + fprintf(stderr, "U-Boot image type mismatch: " + "expected IH_TYPE_FIRMWARE, got %02X\n", image_type); exit(1); } uint32_t data_size = be32toh(buf32[3]); /* Image Data Size */ -- 2.4.6 -- You received this message because you are subscribed to the Google Groups "linux-sunxi" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
