X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=tools%2Fzynqimage.c;h=d3f418b0612b311b0537dddce8769c6e07b046a4;hb=f739fcd831240dda10a92f4212f1854f8481aeee;hp=c43bd5d48820a1ba9337cc93b85fff08f21d461a;hpb=4832e17787acb29734d895751bc7a594908aecc6;p=u-boot diff --git a/tools/zynqimage.c b/tools/zynqimage.c index c43bd5d488..d3f418b061 100644 --- a/tools/zynqimage.c +++ b/tools/zynqimage.c @@ -1,8 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * Copyright (C) 2015 Nathan Rossi * - * SPDX-License-Identifier: GPL-2.0+ - * * The following Boot Header format/structures and values are defined in the * following documents: * * Xilinx Zynq-7000 Technical Reference Manual (Section 6.3) @@ -147,6 +146,12 @@ static int zynqimage_verify_header(unsigned char *ptr, int image_size, if (image_size < sizeof(struct zynq_header)) return -1; + if (zynqhdr->__reserved1 != 0) + return -1; + + if (zynqhdr->__reserved2 != 0) + return -1; + if (zynqhdr->width_detection != HEADER_WIDTHDETECTION) return -1; if (zynqhdr->image_identifier != HEADER_IMAGEIDENTIFIER) @@ -222,6 +227,44 @@ static int zynqimage_check_image_types(uint8_t type) return EXIT_FAILURE; } +static void zynqimage_parse_initparams(struct zynq_header *zynqhdr, + const char *filename) +{ + FILE *fp; + struct zynq_reginit reginit; + unsigned int reg_count = 0; + int r, err; + struct stat path_stat; + + /* Expect a table of register-value pairs, e.g. "0x12345678 0x4321" */ + fp = fopen(filename, "r"); + if (!fp) { + fprintf(stderr, "Cannot open initparams file: %s\n", filename); + exit(1); + } + + err = fstat(fileno(fp), &path_stat); + if (err) { + fclose(fp); + return; + } + + if (!S_ISREG(path_stat.st_mode)) { + fclose(fp); + return; + } + + do { + r = fscanf(fp, "%x %x", ®init.address, ®init.data); + if (r == 2) { + zynqhdr->register_init[reg_count] = reginit; + ++reg_count; + } + r = fscanf(fp, "%*[^\n]\n"); /* Skip to next line */ + } while ((r != EOF) && (reg_count < HEADER_REGINITS)); + fclose(fp); +} + static void zynqimage_set_header(void *ptr, struct stat *sbuf, int ifd, struct image_tool_params *params) { @@ -237,6 +280,10 @@ static void zynqimage_set_header(void *ptr, struct stat *sbuf, int ifd, if (params->eflag) zynqhdr->image_load = cpu_to_le32((uint32_t)params->ep); + /* User can pass in text file with init list */ + if (strlen(params->imagename2)) + zynqimage_parse_initparams(zynqhdr, params->imagename2); + zynqhdr->checksum = zynqimage_checksum(zynqhdr); }