]> git.sur5r.net Git - u-boot/blobdiff - tools/imximage.c
serial: Add Actions Semi OWL UART support
[u-boot] / tools / imximage.c
index 615a64e727f0b10e5152ab6685292f9922c0f164..5f63bf875945b9b8ddc850a6cb0736cbe1413165 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * (C) Copyright 2009
  * Stefano Babic, DENX Software Engineering, sbabic@denx.de.
@@ -5,8 +6,6 @@
  * (C) Copyright 2008
  * Marvell Semiconductor <www.marvell.com>
  * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include "imagetool.h"
@@ -23,6 +22,7 @@ static table_entry_t imximage_cmds[] = {
        {CMD_BOOT_OFFSET,       "BOOT_OFFSET",          "Boot offset",    },
        {CMD_WRITE_DATA,        "DATA",                 "Reg Write Data", },
        {CMD_WRITE_CLR_BIT,     "CLR_BIT",              "Reg clear bit",  },
+       {CMD_WRITE_SET_BIT,     "SET_BIT",              "Reg set bit",  },
        {CMD_CHECK_BITS_SET,    "CHECK_BITS_SET",   "Reg Check bits set", },
        {CMD_CHECK_BITS_CLR,    "CHECK_BITS_CLR",   "Reg Check bits clr", },
        {CMD_CSF,               "CSF",           "Command Sequence File", },
@@ -204,6 +204,15 @@ static void set_dcd_param_v2(struct imx_header *imxhdr, uint32_t dcd_len,
                d->write_dcd_command.length = cpu_to_be16(4);
                d->write_dcd_command.param = DCD_WRITE_CLR_BIT_PARAM;
                break;
+       case CMD_WRITE_SET_BIT:
+               if ((d->write_dcd_command.tag == DCD_WRITE_DATA_COMMAND_TAG) &&
+                   (d->write_dcd_command.param == DCD_WRITE_SET_BIT_PARAM))
+                       break;
+               d = d2;
+               d->write_dcd_command.tag = DCD_WRITE_DATA_COMMAND_TAG;
+               d->write_dcd_command.length = cpu_to_be16(4);
+               d->write_dcd_command.param = DCD_WRITE_SET_BIT_PARAM;
+               break;
        /*
         * Check data command only supports one entry,
         */
@@ -281,7 +290,6 @@ static void set_dcd_rst_v2(struct imx_header *imxhdr, uint32_t dcd_len,
                        d = (struct dcd_v2_cmd *)(((char *)d) + len);
 
                len = (char *)d - (char *)&dcd_v2->header;
-
                dcd_v2->header.tag = DCD_HEADER_TAG;
                dcd_v2->header.length = cpu_to_be16(len);
                dcd_v2->header.version = DCD_VERSION;
@@ -301,8 +309,7 @@ static void set_imx_hdr_v1(struct imx_header *imxhdr, uint32_t dcd_len,
        /* Set magic number */
        fhdr_v1->app_code_barker = APP_CODE_BARKER;
 
-       /* TODO: check i.MX image V1 handling, for now use 'old' style */
-       hdr_base = entry_point - 4096;
+       hdr_base = entry_point - imximage_init_loadsize + flash_offset;
        fhdr_v1->app_dest_ptr = hdr_base - flash_offset;
        fhdr_v1->app_code_jump_vector = entry_point;
 
@@ -501,10 +508,19 @@ static void print_hdr_v2(struct imx_header *imx_hdr)
                printf("Entry Point:  %08x\n", (uint32_t)fhdr_v2->entry);
                if (fhdr_v2->csf && (imximage_ivt_offset != UNDEFINED) &&
                    (imximage_csf_size != UNDEFINED)) {
-                       printf("HAB Blocks:   %08x %08x %08x\n",
+                       uint16_t dcdlen;
+                       int offs;
+
+                       dcdlen = hdr_v2->data.dcd_table.header.length;
+                       offs = (char *)&hdr_v2->data.dcd_table
+                               - (char *)hdr_v2;
+
+                       printf("HAB Blocks:   0x%08x 0x%08x 0x%08x\n",
                               (uint32_t)fhdr_v2->self, 0,
                               hdr_v2->boot_data.size - imximage_ivt_offset -
                               imximage_csf_size);
+                       printf("DCD Blocks:   0x00910000 0x%08x 0x%08x\n",
+                              offs, be16_to_cpu(dcdlen));
                }
        } else {
                imx_header_v2_t *next_hdr_v2;
@@ -533,12 +549,19 @@ static void print_hdr_v2(struct imx_header *imx_hdr)
 
 static void copy_plugin_code(struct imx_header *imxhdr, char *plugin_file)
 {
-       int ifd = -1;
+       int ifd;
        struct stat sbuf;
        char *plugin_buf = imxhdr->header.hdr_v2.data.plugin_code;
        char *ptr;
 
        ifd = open(plugin_file, O_RDONLY|O_BINARY);
+       if (ifd < 0) {
+               fprintf(stderr, "Can't open %s: %s\n",
+                       plugin_file,
+                       strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
        if (fstat(ifd, &sbuf) < 0) {
                fprintf(stderr, "Can't stat %s: %s\n",
                        plugin_file,
@@ -622,6 +645,7 @@ static void parse_cfg_cmd(struct imx_header *imxhdr, int32_t cmd, char *token,
                break;
        case CMD_WRITE_DATA:
        case CMD_WRITE_CLR_BIT:
+       case CMD_WRITE_SET_BIT:
        case CMD_CHECK_BITS_SET:
        case CMD_CHECK_BITS_CLR:
                value = get_cfg_value(token, name, lineno);
@@ -672,6 +696,7 @@ static void parse_cfg_fld(struct imx_header *imxhdr, int32_t *cmd,
                switch(*cmd) {
                case CMD_WRITE_DATA:
                case CMD_WRITE_CLR_BIT:
+               case CMD_WRITE_SET_BIT:
                case CMD_CHECK_BITS_SET:
                case CMD_CHECK_BITS_CLR:
 
@@ -818,18 +843,19 @@ static void imximage_set_header(void *ptr, struct stat *sbuf, int ifd,
        /* Parse dcd configuration file */
        dcd_len = parse_cfg_file(imxhdr, params->imagename);
 
-       if (imximage_version == IMXIMAGE_V2) {
+       if (imximage_version == IMXIMAGE_V1)
+               header_size = sizeof(flash_header_v1_t);
+       else {
                header_size = sizeof(flash_header_v2_t) + sizeof(boot_data_t);
                if (!plugin_image)
                        header_size += sizeof(dcd_v2_t);
                else
                        header_size += MAX_PLUGIN_CODE_SIZE;
-
-               if (imximage_init_loadsize < imximage_ivt_offset + header_size)
-                               imximage_init_loadsize = imximage_ivt_offset +
-                                       header_size;
        }
 
+       if (imximage_init_loadsize < imximage_ivt_offset + header_size)
+                       imximage_init_loadsize = imximage_ivt_offset + header_size;
+
        /* Set the imx header */
        (*set_imx_hdr)(imxhdr, dcd_len, params->ep, imximage_ivt_offset);
 
@@ -898,23 +924,21 @@ static int imximage_generate(struct image_tool_params *params,
        /* Parse dcd configuration file */
        parse_cfg_file(&imximage_header, params->imagename);
 
-       /* TODO: check i.MX image V1 handling, for now use 'old' style */
-       if (imximage_version == IMXIMAGE_V1) {
-               alloc_len = 4096;
-               header_size = 4096;
-       } else {
+       if (imximage_version == IMXIMAGE_V1)
+               header_size = sizeof(imx_header_v1_t);
+       else {
                header_size = sizeof(flash_header_v2_t) + sizeof(boot_data_t);
                if (!plugin_image)
                        header_size += sizeof(dcd_v2_t);
                else
                        header_size += MAX_PLUGIN_CODE_SIZE;
-
-               if (imximage_init_loadsize < imximage_ivt_offset + header_size)
-                               imximage_init_loadsize = imximage_ivt_offset +
-                                       header_size;
-               alloc_len = imximage_init_loadsize - imximage_ivt_offset;
        }
 
+       if (imximage_init_loadsize < imximage_ivt_offset + header_size)
+                       imximage_init_loadsize = imximage_ivt_offset + header_size;
+
+       alloc_len = imximage_init_loadsize - imximage_ivt_offset;
+
        if (alloc_len < header_size) {
                fprintf(stderr, "%s: header error\n",
                        params->cmdname);
@@ -944,11 +968,7 @@ static int imximage_generate(struct image_tool_params *params,
 
        pad_len = ROUND(sbuf.st_size, 4096) - sbuf.st_size;
 
-       /* TODO: check i.MX image V1 handling, for now use 'old' style */
-       if (imximage_version == IMXIMAGE_V1)
-               return 0;
-       else
-               return pad_len;
+       return pad_len;
 }