X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/f69503b99e9a1b377bf50bf94c800cbdaf021cf2..71f447678da56f68be21b2001dc1f9910283ddfd:/tools/firmware-utils/src/mkmylofw.c diff --git a/tools/firmware-utils/src/mkmylofw.c b/tools/firmware-utils/src/mkmylofw.c index 6e3c1b30d..585a9f9eb 100644 --- a/tools/firmware-utils/src/mkmylofw.c +++ b/tools/firmware-utils/src/mkmylofw.c @@ -1,7 +1,5 @@ /* - * $Id$ - * - * Copyright (C) 2006,2007 Gabor Juhos + * Copyright (C) 2006-2008 Gabor Juhos * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -50,6 +48,7 @@ #define MAX_ARG_COUNT 32 #define MAX_ARG_LEN 1024 #define FILE_BUF_LEN (16*1024) +#define PART_NAME_LEN 32 struct fw_block { uint32_t addr; @@ -61,6 +60,11 @@ struct fw_block { uint32_t crc; /* crc value of the file */ }; +struct fw_part { + struct mylo_partition mylo; + char name[PART_NAME_LEN]; +}; + #define BLOCK_FLAG_HAVEHDR 0x0001 struct cpx_board { @@ -72,15 +76,27 @@ struct cpx_board { uint16_t svid; /* sub vendor id */ uint16_t sdid; /* sub device id */ uint32_t flash_size; /* size of flash */ + uint32_t part_offset; /* offset of the partition_table */ + uint32_t part_size; /* size of the partition_table */ }; -#define BOARD(_vid, _did, _svid, _sdid, _flash, _mod, _name, _desc) { \ - .model = _mod, .name = _name, .desc = _desc, \ +#define BOARD(_vid, _did, _svid, _sdid, _flash, _mod, _name, _desc, _po, _ps) { \ + .model = _mod, .name = _name, .desc = _desc, \ .vid = _vid, .did = _did, .svid = _svid, .sdid = _sdid, \ - .flash_size = (_flash << 20) } + .flash_size = (_flash << 20), \ + .part_offset = _po, .part_size = _ps } + +#define CPX_BOARD(_did, _flash, _mod, _name, _desc, _po, _ps) \ + BOARD(VENID_COMPEX, _did, VENID_COMPEX, _did, _flash, _mod, _name, _desc, _po, _ps) -#define CPX_BOARD(_did, _flash, _mod, _name, _desc) \ - BOARD(VENID_COMPEX, _did, VENID_COMPEX, _did, _flash, _mod, _name, _desc) +#define CPX_BOARD_ADM(_did, _flash, _mod, _name, _desc) \ + CPX_BOARD(_did, _flash, _mod, _name, _desc, 0x10000, 0x10000) + +#define CPX_BOARD_AR71XX(_did, _flash, _mod, _name, _desc) \ + CPX_BOARD(_did, _flash, _mod, _name, _desc, 0x20000, 0x8000) + +#define CPX_BOARD_AR23XX(_did, _flash, _mod, _name, _desc) \ + CPX_BOARD(_did, _flash, _mod, _name, _desc, 0x10000, 0x10000) #define ALIGN(x,y) ((x)+((y)-1)) & ~((y)-1) @@ -93,46 +109,58 @@ int fw_num_blocks = 0; int verblevel = 0; struct mylo_fw_header fw_header; -struct mylo_partition fw_partitions[MYLO_MAX_PARTITIONS]; +struct fw_part fw_parts[MYLO_MAX_PARTITIONS]; struct fw_block fw_blocks[MAX_FW_BLOCKS]; +struct cpx_board *board; struct cpx_board boards[] = { - CPX_BOARD(DEVID_COMPEX_NP18A, 4, + CPX_BOARD_ADM(DEVID_COMPEX_NP18A, 4, "NP18A", "Compex NetPassage 18A", "Dualband Wireless A+G Internet Gateway"), - CPX_BOARD(DEVID_COMPEX_NP26G8M, 2, + CPX_BOARD_ADM(DEVID_COMPEX_NP26G8M, 2, "NP26G8M", "Compex NetPassage 26G (8M)", "Wireless-G Broadband Multimedia Gateway"), - CPX_BOARD(DEVID_COMPEX_NP26G16M, 4, + CPX_BOARD_ADM(DEVID_COMPEX_NP26G16M, 4, "NP26G16M", "Compex NetPassage 26G (16M)", "Wireless-G Broadband Multimedia Gateway"), - CPX_BOARD(DEVID_COMPEX_NP27G, 4, + CPX_BOARD_ADM(DEVID_COMPEX_NP27G, 4, "NP27G", "Compex NetPassage 27G", "Wireless-G 54Mbps eXtended Range Router"), - CPX_BOARD(DEVID_COMPEX_NP28G, 4, + CPX_BOARD_ADM(DEVID_COMPEX_NP28G, 4, "NP28G", "Compex NetPassage 28G", "Wireless 108Mbps Super-G XR Multimedia Router with 4 USB Ports"), - CPX_BOARD(DEVID_COMPEX_NP28GHS, 4, + CPX_BOARD_ADM(DEVID_COMPEX_NP28GHS, 4, "NP28GHS", "Compex NetPassage 28G (HotSpot)", "HotSpot Solution"), - CPX_BOARD(DEVID_COMPEX_WP18, 4, + CPX_BOARD_ADM(DEVID_COMPEX_WP18, 4, "WP18", "Compex NetPassage WP18", "Wireless-G 54Mbps A+G Dualband Access Point"), - CPX_BOARD(DEVID_COMPEX_WP54G, 4, + CPX_BOARD_ADM(DEVID_COMPEX_WP54G, 4, "WP54G", "Compex WP54G", "Wireless-G 54Mbps XR Access Point"), - CPX_BOARD(DEVID_COMPEX_WP54Gv1C, 2, + CPX_BOARD_ADM(DEVID_COMPEX_WP54Gv1C, 2, "WP54Gv1C", "Compex WP54G rev.1C", "Wireless-G 54Mbps XR Access Point"), - CPX_BOARD(DEVID_COMPEX_WP54AG, 4, + CPX_BOARD_ADM(DEVID_COMPEX_WP54AG, 4, "WP54AG", "Compex WP54AG", "Wireless-AG 54Mbps XR Access Point"), - CPX_BOARD(DEVID_COMPEX_WPP54G, 4, + CPX_BOARD_ADM(DEVID_COMPEX_WPP54G, 4, "WPP54G", "Compex WPP54G", "Outdoor Access Point"), - CPX_BOARD(DEVID_COMPEX_WPP54AG, 4, + CPX_BOARD_ADM(DEVID_COMPEX_WPP54AG, 4, "WPP54AG", "Compex WPP54AG", "Outdoor Access Point"), + + CPX_BOARD_AR71XX(DEVID_COMPEX_WP543, 2, + "WP543", "Compex WP543", + "BareBoard"), + + CPX_BOARD_AR23XX(DEVID_COMPEX_NP25G, 4, + "NP25G", "Compex NetPassage 25G", + "Wireless 54Mbps XR Router"), + CPX_BOARD_AR23XX(DEVID_COMPEX_WPE53G, 4, + "WPE53G", "Compex NetPassage 25G", + "Wireless 54Mbps XR Access Point"), {.model = NULL} }; @@ -204,15 +232,17 @@ usage(int status) " define block at with length of .\n" " valid values:\n" " h : add crc header before the file data.\n" -" -p :[:[:[:]]]\n" +" -p :[:[:[:[:]]]]\n" " add partition at , with size of to the\n" -" partition table, set partition flags to and\n" -" partition parameter to . If the is specified\n" -" content of the file is also added to the firmware image.\n" +" partition table, set partition name to , partition \n" +" flags to and partition parameter to .\n" +" If the is specified content of the file will be \n" +" added to the firmware image.\n" " valid values:\n" " a: this is the active partition. The bootloader loads\n" " the firmware from this partition.\n" " h: the partition data have a header.\n" +" l: the partition data uses LZMA compression.\n" " p: the bootloader loads data from this partition to\n" " the RAM before decompress it.\n" " -h show this screen\n" @@ -325,7 +355,7 @@ find_board(char *model){ board = NULL; for (tmp = boards; tmp->model != NULL; tmp++){ - if (strcmp(model, tmp->model) == 0) { + if (strcasecmp(model, tmp->model) == 0) { board = tmp; break; } @@ -424,7 +454,7 @@ process_partitions(void) int i; for (i = 0; i < fw_num_partitions; i++) { - part = &fw_partitions[i]; + part = &fw_parts[i].mylo; if (part->addr > flash_size) { errmsg(0, "invalid partition at 0x%08X", part->addr); @@ -588,26 +618,39 @@ int write_out_partitions(FILE *outfile, uint32_t *crc) { struct mylo_partition_table p; - struct mylo_partition *p1, *p2; + char part_names[MYLO_MAX_PARTITIONS][PART_NAME_LEN]; + int ret; int i; if (fw_num_partitions == 0) return 0; memset(&p, 0, sizeof(p)); + memset(part_names, 0, sizeof(part_names)); p.magic = HOST_TO_LE32(MYLO_MAGIC_PARTITIONS); for (i = 0; i < fw_num_partitions; i++) { - p1 = &p.partitions[i]; - p2 = &fw_partitions[i]; - p1->flags = HOST_TO_LE16(p2->flags); - p1->type = HOST_TO_LE16(PARTITION_TYPE_USED); - p1->addr = HOST_TO_LE32(p2->addr); - p1->size = HOST_TO_LE32(p2->size); - p1->param = HOST_TO_LE32(p2->param); + struct mylo_partition *mp; + struct fw_part *fp; + + mp = &p.partitions[i]; + fp = &fw_parts[i]; + mp->flags = HOST_TO_LE16(fp->mylo.flags); + mp->type = HOST_TO_LE16(PARTITION_TYPE_USED); + mp->addr = HOST_TO_LE32(fp->mylo.addr); + mp->size = HOST_TO_LE32(fp->mylo.size); + mp->param = HOST_TO_LE32(fp->mylo.param); + + memcpy(part_names[i], fp->name, PART_NAME_LEN); } - return write_out_data(outfile, (uint8_t *)&p, sizeof(p), crc); + ret = write_out_data(outfile, (uint8_t *)&p, sizeof(p), crc); + if (ret) + return ret; + + ret = write_out_data(outfile, (uint8_t *)part_names, sizeof(part_names), + crc); + return ret; } @@ -624,11 +667,11 @@ write_out_blocks(FILE *outfile, uint32_t *crc) * for the partition table */ if (fw_num_partitions > 0) { - desc.type = HOST_TO_LE32(FW_DESC_TYPE_USED); - desc.addr = HOST_TO_LE32(0x10000); - desc.dlen = HOST_TO_LE32(sizeof(struct mylo_partition_table)); - desc.blen = HOST_TO_LE32(0x10000); + desc.addr = HOST_TO_LE32(board->part_offset); + desc.dlen = HOST_TO_LE32(sizeof(struct mylo_partition_table) + + (MYLO_MAX_PARTITIONS * PART_NAME_LEN)); + desc.blen = HOST_TO_LE32(board->part_size); if (write_out_desc(outfile, &desc, crc) != 0) return -1; @@ -967,8 +1010,8 @@ parse_opt_partition(char ch, char *arg) char *argv[MAX_ARG_COUNT]; int argc; char *p; - struct mylo_partition *part; + struct fw_part *fp; if (required_arg(ch, arg)) { goto err_out; @@ -979,7 +1022,8 @@ parse_opt_partition(char ch, char *arg) goto err_out; } - part = &fw_partitions[fw_num_partitions++]; + fp = &fw_parts[fw_num_partitions++]; + part = &fp->mylo; argc = parse_arg(arg, buf, argv); @@ -1014,6 +1058,9 @@ parse_opt_partition(char ch, char *arg) case 'p': part->flags |= PARTITION_FLAG_PRELOAD; break; + case 'l': + part->flags |= PARTITION_FLAG_LZMA; + break; case 'h': part->flags |= PARTITION_FLAG_HAVEHDR; break; @@ -1034,13 +1081,21 @@ parse_opt_partition(char ch, char *arg) goto err_out; } + p = argv[4]; + if (is_empty_arg(p)) { + /* set default partition parameter */ + fp->name[0] = '\0'; + } else { + strncpy(fp->name, p, PART_NAME_LEN); + } + #if 1 if (part->size == 0) { part->size = flash_size - part->addr; } /* processing file parameter */ - p = argv[4]; + p = argv[5]; if (is_empty_arg(p) == 0) { struct fw_block *b; @@ -1068,8 +1123,6 @@ err_out: int parse_opt_board(char ch, char *arg) { - struct cpx_board *board; - if (required_arg(ch, arg)) { goto err_out; } @@ -1189,6 +1242,11 @@ main(int argc, char *argv[]) goto out; } + if (!board) { + errmsg(0, "no board specified"); + goto out; + } + if (flash_size == 0) { errmsg(0, "no flash size specified"); goto out;