tools/kwbimage: add BAUDRATE option

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>
master
Chris Packham 8 years ago committed by Stefan Roese
parent a53d97ae85
commit 4bdb547978
  1. 31
      tools/kwbimage.c
  2. 14
      tools/kwbimage.h

@ -68,6 +68,7 @@ struct image_cfg_element {
IMAGE_CFG_BINARY, IMAGE_CFG_BINARY,
IMAGE_CFG_PAYLOAD, IMAGE_CFG_PAYLOAD,
IMAGE_CFG_DATA, IMAGE_CFG_DATA,
IMAGE_CFG_BAUDRATE,
} type; } type;
union { union {
unsigned int version; unsigned int version;
@ -85,6 +86,7 @@ struct image_cfg_element {
unsigned int nandeccmode; unsigned int nandeccmode;
unsigned int nandpagesz; unsigned int nandpagesz;
struct ext_hdr_v0_reg regdata; 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; 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, static void *image_create_v0(size_t *imagesz, struct image_tool_params *params,
int payloadsz) 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); e = image_find_option(IMAGE_CFG_NAND_BADBLK_LOCATION);
if (e) if (e)
main_hdr->nandbadblklocation = e->nandbadblklocation; 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); binarye = image_find_option(IMAGE_CFG_BINARY);
if (binarye) { if (binarye) {
@ -548,6 +575,10 @@ static int image_create_config_parse_oneline(char *line,
el->type = IMAGE_CFG_DATA; el->type = IMAGE_CFG_DATA;
el->regdata.raddr = strtoul(value1, NULL, 16); el->regdata.raddr = strtoul(value1, NULL, 16);
el->regdata.rdata = strtoul(value2, 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 { } else {
fprintf(stderr, "Ignoring unknown line '%s'\n", line); fprintf(stderr, "Ignoring unknown line '%s'\n", line);
} }

@ -82,7 +82,7 @@ struct main_hdr_v1 {
uint32_t srcaddr; /* C-F */ uint32_t srcaddr; /* C-F */
uint32_t destaddr; /* 10-13 */ uint32_t destaddr; /* 10-13 */
uint32_t execaddr; /* 14-17 */ uint32_t execaddr; /* 14-17 */
uint8_t reserved3; /* 18 */ uint8_t options; /* 18 */
uint8_t nandblocksize; /* 19 */ uint8_t nandblocksize; /* 19 */
uint8_t nandbadblklocation; /* 1A */ uint8_t nandbadblklocation; /* 1A */
uint8_t reserved4; /* 1B */ uint8_t reserved4; /* 1B */
@ -92,6 +92,18 @@ struct main_hdr_v1 {
}; };
/* /*
* 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) * Header for the optional headers, version 1 (Armada 370, Armada XP)
*/ */
struct opt_hdr_v1 { struct opt_hdr_v1 {

Loading…
Cancel
Save