tools/kwbimage: add BAUDRATE option
authorChris Packham <judge.packham@gmail.com>
Wed, 9 Nov 2016 09:07:45 +0000 (22:07 +1300)
committerStefan Roese <sr@denx.de>
Thu, 1 Dec 2016 08:10:43 +0000 (09:10 +0100)
Offset 0x18 in some Marvell datasheets this field is redacted as
"reserved". This offset is actually a set of options and bits 2:0 allow
the selection of the UART baudrate.

Allow a BAUDRATE option to set the UART baudrate for any messages coming
from the BootROM firmware.

Signed-off-by: Chris Packham <judge.packham@gmail.com>
Signed-off-by: Stefan Roese <sr@denx.de>
tools/kwbimage.c
tools/kwbimage.h

index 369aba7bcab9d00e6c965354ff05bb579d420809..ad182c5c5d9af5f57cfbf42d129162dd47fce18e 100644 (file)
@@ -68,6 +68,7 @@ struct image_cfg_element {
                IMAGE_CFG_BINARY,
                IMAGE_CFG_PAYLOAD,
                IMAGE_CFG_DATA,
+               IMAGE_CFG_BAUDRATE,
        } type;
        union {
                unsigned int version;
@@ -85,6 +86,7 @@ struct image_cfg_element {
                unsigned int nandeccmode;
                unsigned int nandpagesz;
                struct ext_hdr_v0_reg regdata;
+               unsigned int baudrate;
        };
 };
 
@@ -195,6 +197,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)
 {
@@ -398,6 +422,9 @@ 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);
 
        binarye = image_find_option(IMAGE_CFG_BINARY);
        if (binarye) {
@@ -548,6 +575,10 @@ 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 {
                fprintf(stderr, "Ignoring unknown line '%s'\n", line);
        }
index e6e3d1d4f9addbaa8932b83e58665df54a1b7162..9b06004a0b10bdd98b931eb6f959fbde9cfefd49 100644 (file)
@@ -82,7 +82,7 @@ struct main_hdr_v1 {
        uint32_t srcaddr;               /* C-F */
        uint32_t destaddr;              /* 10-13 */
        uint32_t execaddr;              /* 14-17 */
-       uint8_t  reserved3;             /* 18 */
+       uint8_t  options;               /* 18 */
        uint8_t  nandblocksize;         /* 19 */
        uint8_t  nandbadblklocation;    /* 1A */
        uint8_t  reserved4;             /* 1B */
@@ -91,6 +91,18 @@ struct main_hdr_v1 {
        uint8_t  checksum;              /* 1F */
 };
 
+/*
+ * Main header options
+ */
+#define MAIN_HDR_V1_OPT_BAUD_DEFAULT   0
+#define MAIN_HDR_V1_OPT_BAUD_2400      0x1
+#define MAIN_HDR_V1_OPT_BAUD_4800      0x2
+#define MAIN_HDR_V1_OPT_BAUD_9600      0x3
+#define MAIN_HDR_V1_OPT_BAUD_19200     0x4
+#define MAIN_HDR_V1_OPT_BAUD_38400     0x5
+#define MAIN_HDR_V1_OPT_BAUD_57600     0x6
+#define MAIN_HDR_V1_OPT_BAUD_115200    0x7
+
 /*
  * Header for the optional headers, version 1 (Armada 370, Armada XP)
  */