From d306965e5dc2d08238f996aabcc11ee660a6c43c Mon Sep 17 00:00:00 2001 From: Nicolas Le Bayon <nicolas.le.bayon@st.com> Date: Mon, 18 Nov 2019 17:13:11 +0100 Subject: [PATCH] tools: stm32image: improve the tool Add parameters to fill header version: Two new options are added (m and n) to fill header version major and minor. The default is v1.0 (major = 1, minor = 0) Fix image header on big endian hosts: Three header fields are not properly converted to little endian before assignment, resulting in incorrect header while executing stm32image on big endian hosts. Convert the value of the header fields version_number, image_checksum and edcsa_algorithm to little endian before the assignment. Don't force the base of strtol, since it's able to select the base automatically depending on the prefix of the value. This does not breaks the current build script that extracts the addresses, including the 0x prefix, from the map file. This change helps using stm32image in shell scripts where the addresses can be computed using the shell arithmetic expansion "$((...))", that produces a value in base decimal. The variable stm32image_header is declared with global visibility but is use in one function only, move it as local variable in the function. Fix error message on destination file: The error message on mmap() failure of destination file reports incorrectly information about the source file. Change the error message to match the file that causes the error. Change-Id: Iebc8c915297306845b3847b32f9516443a515c97 Signed-off-by: Yann Gautier <yann.gautier@st.com> Signed-off-by: Antonio Borneo <antonio.borneo@st.com> --- tools/stm32image/stm32image.c | 46 ++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/tools/stm32image/stm32image.c b/tools/stm32image/stm32image.c index 41024e286..209e0c9d8 100644 --- a/tools/stm32image/stm32image.c +++ b/tools/stm32image/stm32image.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018, STMicroelectronics - All Rights Reserved + * Copyright (c) 2017-2020, STMicroelectronics - All Rights Reserved * * SPDX-License-Identifier: BSD-3-Clause */ @@ -45,8 +45,6 @@ struct stm32_header { uint8_t binary_type; }; -static struct stm32_header stm32image_header; - static void stm32image_default_header(struct stm32_header *ptr) { if (!ptr) { @@ -54,10 +52,9 @@ static void stm32image_default_header(struct stm32_header *ptr) } ptr->magic_number = HEADER_MAGIC; - ptr->header_version[VER_MAJOR] = HEADER_VERSION_V1; ptr->option_flags = HEADER_DEFAULT_OPTION; - ptr->ecdsa_algorithm = 1; - ptr->version_number = 0; + ptr->ecdsa_algorithm = __cpu_to_le32(1); + ptr->version_number = __cpu_to_le32(0); ptr->binary_type = TF_BINARY_TYPE; } @@ -105,27 +102,33 @@ static void stm32image_print_header(const void *ptr) } static void stm32image_set_header(void *ptr, struct stat *sbuf, int ifd, - uint32_t loadaddr, uint32_t ep, uint32_t ver) + uint32_t loadaddr, uint32_t ep, uint32_t ver, + uint32_t major, uint32_t minor) { struct stm32_header *stm32hdr = (struct stm32_header *)ptr; stm32image_default_header(stm32hdr); + stm32hdr->header_version[VER_MAJOR] = major; + stm32hdr->header_version[VER_MINOR] = minor; stm32hdr->load_address = __cpu_to_le32(loadaddr); stm32hdr->image_entry_point = __cpu_to_le32(ep); stm32hdr->image_length = __cpu_to_le32((uint32_t)sbuf->st_size - sizeof(struct stm32_header)); - stm32hdr->image_checksum = stm32image_checksum(ptr, sbuf->st_size); + stm32hdr->image_checksum = + __cpu_to_le32(stm32image_checksum(ptr, sbuf->st_size)); stm32hdr->version_number = __cpu_to_le32(ver); } static int stm32image_create_header_file(char *srcname, char *destname, uint32_t loadaddr, uint32_t entry, - uint32_t version) + uint32_t version, uint32_t major, + uint32_t minor) { int src_fd, dest_fd; struct stat sbuf; unsigned char *ptr; + struct stm32_header stm32image_header; dest_fd = open(destname, O_RDWR | O_CREAT | O_TRUNC | O_APPEND, 0666); if (dest_fd == -1) { @@ -177,11 +180,12 @@ static int stm32image_create_header_file(char *srcname, char *destname, dest_fd, 0); if (ptr == MAP_FAILED) { - fprintf(stderr, "Can't read %s\n", srcname); + fprintf(stderr, "Can't write %s\n", destname); return -1; } - stm32image_set_header(ptr, &sbuf, dest_fd, loadaddr, entry, version); + stm32image_set_header(ptr, &sbuf, dest_fd, loadaddr, entry, version, + major, minor); stm32image_print_header(ptr); @@ -193,9 +197,11 @@ static int stm32image_create_header_file(char *srcname, char *destname, int main(int argc, char *argv[]) { int opt, loadaddr = -1, entry = -1, err = 0, version = 0; + int major = HEADER_VERSION_V1; + int minor = 0; char *dest = NULL, *src = NULL; - while ((opt = getopt(argc, argv, ":s:d:l:e:v:")) != -1) { + while ((opt = getopt(argc, argv, ":s:d:l:e:v:m:n:")) != -1) { switch (opt) { case 's': src = optarg; @@ -204,17 +210,23 @@ int main(int argc, char *argv[]) dest = optarg; break; case 'l': - loadaddr = strtol(optarg, NULL, 16); + loadaddr = strtol(optarg, NULL, 0); break; case 'e': - entry = strtol(optarg, NULL, 16); + entry = strtol(optarg, NULL, 0); break; case 'v': - version = strtol(optarg, NULL, 10); + version = strtol(optarg, NULL, 0); + break; + case 'm': + major = strtol(optarg, NULL, 0); + break; + case 'n': + minor = strtol(optarg, NULL, 0); break; default: fprintf(stderr, - "Usage : %s [-s srcfile] [-d destfile] [-l loadaddr] [-e entry_point]\n", + "Usage : %s [-s srcfile] [-d destfile] [-l loadaddr] [-e entry_point] [-m major] [-n minor]\n", argv[0]); return -1; } @@ -241,7 +253,7 @@ int main(int argc, char *argv[]) } err = stm32image_create_header_file(src, dest, loadaddr, - entry, version); + entry, version, major, minor); return err; } -- GitLab