diff --git a/scripts/kwbimage.c b/scripts/kwbimage.c index 0127e2b..4ebb07f 100644 --- a/scripts/kwbimage.c +++ b/scripts/kwbimage.c @@ -177,6 +177,8 @@ IMAGE_CFG_EXEC_ADDR, IMAGE_CFG_NAND_BLKSZ, IMAGE_CFG_NAND_BADBLK_LOCATION, + IMAGE_CFG_NAND_ECC_MODE, + IMAGE_CFG_NAND_PAGESZ, IMAGE_CFG_BINARY, IMAGE_CFG_PAYLOAD, IMAGE_CFG_DATA, @@ -194,6 +196,8 @@ unsigned int execaddr; unsigned int nandblksz; unsigned int nandbadblklocation; + unsigned int nandeccmode; + unsigned int nandpagesz; struct ext_hdr_v0_reg regdata; }; }; @@ -245,6 +249,15 @@ return NULL; } +int image_nand_ecc_mode_id(const char *nand_ecc_mode_name) +{ + int i; + for (i = 0; nand_ecc_modes[i].name; i++) + if (!strcmp(nand_ecc_modes[i].name, nand_ecc_mode_name)) + return nand_ecc_modes[i].id; + return -1; +} + static struct image_cfg_element * image_find_option(struct image_cfg_element *image_cfg, int cfgn, unsigned int optiontype) @@ -409,9 +422,9 @@ if (!strcmp(boot_mode_name, "nand")) { const char *nand_ecc_mode = image_nand_ecc_mode_name(main_hdr->nandeccmode); - fprintf(focfg, "NAND_ECC_MODE %s\n", + fprintf(focfg, "NAND_ECCMODE %s\n", nand_ecc_mode); - fprintf(focfg, "NAND_PAGE_SIZE %08x\n", + fprintf(focfg, "NAND_PAGESZ %08x\n", main_hdr->nandpagesize); } @@ -763,6 +776,12 @@ e = image_find_option(image_cfg, cfgn, IMAGE_CFG_EXEC_ADDR); if (e) main_hdr->execaddr = e->execaddr; + e = image_find_option(image_cfg, cfgn, IMAGE_CFG_NAND_ECC_MODE); + if (e) + main_hdr->nandeccmode = e->nandeccmode; + e = image_find_option(image_cfg, cfgn, IMAGE_CFG_NAND_PAGESZ); + if (e) + main_hdr->nandpagesize = e->nandpagesz; main_hdr->checksum = image_checksum8(image, sizeof(struct main_hdr_v0)); @@ -1009,6 +1028,19 @@ el->type = IMAGE_CFG_NAND_BADBLK_LOCATION; el->nandbadblklocation = strtol(value, NULL, 16); + } else if (!strcmp(keyword, "NAND_ECCMODE")) { + char *value = strtok_r(NULL, " ", &saveptr); + el->type = IMAGE_CFG_NAND_ECC_MODE; + el->nandeccmode = image_nand_ecc_mode_id(value); + if (el->nandeccmode < 0) { + fprintf(stderr, + "Invalid NAND ECC mode '%s'\n", value); + return -1; + } + } else if (!strcmp(keyword, "NAND_PAGESZ")) { + char *value = strtok_r(NULL, " ", &saveptr); + el->type = IMAGE_CFG_NAND_PAGESZ; + el->nandpagesz = strtol(value, NULL, 16); } else if (!strcmp(keyword, "BINARY")) { char *value = strtok_r(NULL, " ", &saveptr); int argi = 0; @@ -1241,6 +1273,12 @@ case IMAGE_CFG_NAND_BADBLK_LOCATION: printf("NANDBADBLK 0x%x\n", e->nandbadblklocation); break; + case IMAGE_CFG_NAND_ECC_MODE: + printf("NAND_ECCMODE 0x%x\n", e->nandeccmode); + break; + case IMAGE_CFG_NAND_PAGESZ: + printf("NAND_PAGESZ 0x%x\n", e->nandpagesz); + break; case IMAGE_CFG_BINARY: printf("BINARY %s (%d args)\n", e->binary.file, e->binary.nargs);