]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - tools/kwbimage.c
imx: mx6sll: add clock support
[people/ms/u-boot.git] / tools / kwbimage.c
index 5f6d91c486559e5982333b9e2b50d46183817f6b..69844d91696563cb5607184ff283b0cc01a18a05 100644 (file)
@@ -68,6 +68,8 @@ struct image_cfg_element {
                IMAGE_CFG_BINARY,
                IMAGE_CFG_PAYLOAD,
                IMAGE_CFG_DATA,
+               IMAGE_CFG_BAUDRATE,
+               IMAGE_CFG_DEBUG,
        } type;
        union {
                unsigned int version;
@@ -85,6 +87,8 @@ struct image_cfg_element {
                unsigned int nandeccmode;
                unsigned int nandpagesz;
                struct ext_hdr_v0_reg regdata;
+               unsigned int baudrate;
+               unsigned int debug;
        };
 };
 
@@ -195,6 +199,28 @@ static uint32_t image_checksum32(void *start, uint32_t len)
        return csum;
 }
 
+static uint8_t baudrate_to_option(unsigned int baudrate)
+{
+       switch (baudrate) {
+       case 2400:
+               return MAIN_HDR_V1_OPT_BAUD_2400;
+       case 4800:
+               return MAIN_HDR_V1_OPT_BAUD_4800;
+       case 9600:
+               return MAIN_HDR_V1_OPT_BAUD_9600;
+       case 19200:
+               return MAIN_HDR_V1_OPT_BAUD_19200;
+       case 38400:
+               return MAIN_HDR_V1_OPT_BAUD_38400;
+       case 57600:
+               return MAIN_HDR_V1_OPT_BAUD_57600;
+       case 115200:
+               return MAIN_HDR_V1_OPT_BAUD_115200;
+       default:
+               return MAIN_HDR_V1_OPT_BAUD_DEFAULT;
+       }
+}
+
 static void *image_create_v0(size_t *imagesz, struct image_tool_params *params,
                             int payloadsz)
 {
@@ -232,11 +258,12 @@ static void *image_create_v0(size_t *imagesz, struct image_tool_params *params,
        main_hdr = image;
 
        /* Fill in the main header */
-       main_hdr->blocksize = payloadsz + sizeof(uint32_t) - headersz;
-       main_hdr->srcaddr   = headersz;
+       main_hdr->blocksize =
+               cpu_to_le32(payloadsz + sizeof(uint32_t) - headersz);
+       main_hdr->srcaddr   = cpu_to_le32(headersz);
        main_hdr->ext       = has_ext;
-       main_hdr->destaddr  = params->addr;
-       main_hdr->execaddr  = params->ep;
+       main_hdr->destaddr  = cpu_to_le32(params->addr);
+       main_hdr->execaddr  = cpu_to_le32(params->ep);
 
        e = image_find_option(IMAGE_CFG_BOOT_FROM);
        if (e)
@@ -246,7 +273,7 @@ static void *image_create_v0(size_t *imagesz, struct image_tool_params *params,
                main_hdr->nandeccmode = e->nandeccmode;
        e = image_find_option(IMAGE_CFG_NAND_PAGESZ);
        if (e)
-               main_hdr->nandpagesize = e->nandpagesz;
+               main_hdr->nandpagesize = cpu_to_le16(e->nandpagesz);
        main_hdr->checksum = image_checksum8(image,
                                             sizeof(struct main_hdr_v0));
 
@@ -255,15 +282,17 @@ static void *image_create_v0(size_t *imagesz, struct image_tool_params *params,
                int cfgi, datai;
 
                ext_hdr = image + sizeof(struct main_hdr_v0);
-               ext_hdr->offset = 0x40;
+               ext_hdr->offset = cpu_to_le32(0x40);
 
                for (cfgi = 0, datai = 0; cfgi < cfgn; cfgi++) {
                        e = &image_cfg[cfgi];
                        if (e->type != IMAGE_CFG_DATA)
                                continue;
 
-                       ext_hdr->rcfg[datai].raddr = e->regdata.raddr;
-                       ext_hdr->rcfg[datai].rdata = e->regdata.rdata;
+                       ext_hdr->rcfg[datai].raddr =
+                               cpu_to_le32(e->regdata.raddr);
+                       ext_hdr->rcfg[datai].rdata =
+                               cpu_to_le32(e->regdata.rdata);
                        datai++;
                }
 
@@ -321,8 +350,9 @@ static size_t image_headersz_v1(struct image_tool_params *params,
                        return 0;
                }
 
-               headersz += s.st_size +
-                       binarye->binary.nargs * sizeof(unsigned int);
+               headersz += sizeof(struct opt_hdr_v1) +
+                       s.st_size +
+                       (binarye->binary.nargs + 2) * sizeof(uint32_t);
                if (hasext)
                        *hasext = 1;
        }
@@ -376,12 +406,13 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
        cur += sizeof(struct main_hdr_v1);
 
        /* Fill the main header */
-       main_hdr->blocksize    = payloadsz - headersz + sizeof(uint32_t);
-       main_hdr->headersz_lsb = headersz & 0xFFFF;
+       main_hdr->blocksize    =
+               cpu_to_le32(payloadsz - headersz + sizeof(uint32_t));
+       main_hdr->headersz_lsb = cpu_to_le16(headersz & 0xFFFF);
        main_hdr->headersz_msb = (headersz & 0xFFFF0000) >> 16;
-       main_hdr->destaddr     = params->addr;
-       main_hdr->execaddr     = params->ep;
-       main_hdr->srcaddr      = headersz;
+       main_hdr->destaddr     = cpu_to_le32(params->addr);
+       main_hdr->execaddr     = cpu_to_le32(params->ep);
+       main_hdr->srcaddr      = cpu_to_le32(headersz);
        main_hdr->ext          = hasext;
        main_hdr->version      = 1;
        e = image_find_option(IMAGE_CFG_BOOT_FROM);
@@ -393,11 +424,17 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
        e = image_find_option(IMAGE_CFG_NAND_BADBLK_LOCATION);
        if (e)
                main_hdr->nandbadblklocation = e->nandbadblklocation;
+       e = image_find_option(IMAGE_CFG_BAUDRATE);
+       if (e)
+               main_hdr->options = baudrate_to_option(e->baudrate);
+       e = image_find_option(IMAGE_CFG_DEBUG);
+       if (e)
+               main_hdr->flags = e->debug ? 0x1 : 0;
 
        binarye = image_find_option(IMAGE_CFG_BINARY);
        if (binarye) {
                struct opt_hdr_v1 *hdr = cur;
-               unsigned int *args;
+               uint32_t *args;
                size_t binhdrsz;
                struct stat s;
                int argi;
@@ -415,7 +452,7 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
                fstat(fileno(bin), &s);
 
                binhdrsz = sizeof(struct opt_hdr_v1) +
-                       (binarye->binary.nargs + 1) * sizeof(unsigned int) +
+                       (binarye->binary.nargs + 2) * sizeof(uint32_t) +
                        s.st_size;
 
                /*
@@ -424,18 +461,18 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
                 * next-header byte and 3-byte alignment at the end.
                 */
                binhdrsz = ALIGN_SUP(binhdrsz, 4) + 4;
-               hdr->headersz_lsb = binhdrsz & 0xFFFF;
+               hdr->headersz_lsb = cpu_to_le16(binhdrsz & 0xFFFF);
                hdr->headersz_msb = (binhdrsz & 0xFFFF0000) >> 16;
 
                cur += sizeof(struct opt_hdr_v1);
 
                args = cur;
-               *args = binarye->binary.nargs;
+               *args = cpu_to_le32(binarye->binary.nargs);
                args++;
                for (argi = 0; argi < binarye->binary.nargs; argi++)
-                       args[argi] = binarye->binary.args[argi];
+                       args[argi] = cpu_to_le32(binarye->binary.args[argi]);
 
-               cur += (binarye->binary.nargs + 1) * sizeof(unsigned int);
+               cur += (binarye->binary.nargs + 1) * sizeof(uint32_t);
 
                ret = fread(cur, s.st_size, 1, bin);
                if (ret != 1) {
@@ -543,6 +580,14 @@ static int image_create_config_parse_oneline(char *line,
                el->type = IMAGE_CFG_DATA;
                el->regdata.raddr = strtoul(value1, NULL, 16);
                el->regdata.rdata = strtoul(value2, NULL, 16);
+       } else if (!strcmp(keyword, "BAUDRATE")) {
+               char *value = strtok_r(NULL, deliminiters, &saveptr);
+               el->type = IMAGE_CFG_BAUDRATE;
+               el->baudrate = strtoul(value, NULL, 10);
+       } else if (!strcmp(keyword, "DEBUG")) {
+               char *value = strtok_r(NULL, deliminiters, &saveptr);
+               el->type = IMAGE_CFG_DEBUG;
+               el->debug = strtoul(value, NULL, 10);
        } else {
                fprintf(stderr, "Ignoring unknown line '%s'\n", line);
        }
@@ -720,7 +765,8 @@ static void kwbimage_set_header(void *ptr, struct stat *sbuf, int ifd,
        free(image_cfg);
 
        /* Build and add image checksum header */
-       checksum = image_checksum32((uint32_t *)ptr, sbuf->st_size);
+       checksum =
+               cpu_to_le32(image_checksum32((uint32_t *)ptr, sbuf->st_size));
        size = write(ifd, &checksum, sizeof(uint32_t));
        if (size != sizeof(uint32_t)) {
                fprintf(stderr, "Error:%s - Checksum write %d bytes %s\n",
@@ -810,7 +856,15 @@ static int kwbimage_generate(struct image_tool_params *params,
        tparams->header_size = alloc_len;
        tparams->hdr = hdr;
 
-       return 0;
+       /*
+        * The resulting image needs to be 4-byte aligned. At least
+        * the Marvell hdrparser tool complains if its unaligned.
+        * By returning 1 here in this function, called via
+        * tparams->vrec_header() in mkimage.c, mkimage will
+        * automatically pad the the resulting image to a 4-byte
+        * size if necessary.
+        */
+       return 1;
 }
 
 /*