Changeset 13682


Ignore:
Timestamp:
2008-12-18T14:31:59+01:00 (7 years ago)
Author:
juhosg
Message:

[tools] firmware-utils/mkfwimage: add RouterStation support (based on a patch by Jonas <jonas at ubnt.com>)

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/atheros/image/Makefile

    r13318 r13682  
    2424        dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/openwrt-$(BOARD)-root.$(1) bs=128k conv=sync 
    2525 
    26         -$(STAGING_DIR_HOST)/bin/mkfwimage -k $(BIN_DIR)/openwrt-$(BOARD)-vmlinux.lzma \ 
     26        -$(STAGING_DIR_HOST)/bin/mkfwimage \ 
     27                -B XS2 -v XS2.ar2316.OpenWrt \ 
     28                -k $(BIN_DIR)/openwrt-$(BOARD)-vmlinux.lzma 
    2729                -r $(BIN_DIR)/openwrt-$(BOARD)-root.$(1) \ 
    28                 -v XS2.ar2316.OpenWRT \ 
    2930                -o $(BIN_DIR)/openwrt-$(BOARD)-ubnt2-$(1).bin 
    30         -$(STAGING_DIR_HOST)/bin/mkfwimage -k $(BIN_DIR)/openwrt-$(BOARD)-vmlinux.lzma \ 
     31 
     32        -$(STAGING_DIR_HOST)/bin/mkfwimage \ 
     33                -B XS5 -v XS5.ar2313.OpenWrt \ 
     34                -k $(BIN_DIR)/openwrt-$(BOARD)-vmlinux.lzma \ 
    3135                -r $(BIN_DIR)/openwrt-$(BOARD)-root.$(1) \ 
    32                 -v XS5.ar2313.OpenWRT \ 
    33                 -o $(BIN_DIR)/openwrt-$(BOARD)-ubnt5-$(1).bin \ 
    34                 -s 0xBE030000 
     36                -o $(BIN_DIR)/openwrt-$(BOARD)-ubnt5-$(1).bin 
    3537 
    3638        -$(STAGING_DIR_HOST)/bin/mkmylofw -B np25g \ 
     
    3840                -p0x150000:0x2a0000:::rootfs:$(BIN_DIR)/openwrt-$(BOARD)-root.$(1) \ 
    3941                $(BIN_DIR)/openwrt-$(BOARD)-np25g-$(1).bin 
     42 
    4043        -$(STAGING_DIR_HOST)/bin/mkmylofw -B wpe53g \ 
    4144                -p0x020000:0x130000:ah:0x80041000:linux:$(KDIR)/vmlinux.bin.gz  \ 
  • trunk/tools/firmware-utils/src/mkfwimage.c

    r11978 r13682  
    3232#include "fw.h" 
    3333 
     34typedef struct fw_layout_data { 
     35        char            name[PATH_MAX]; 
     36        u_int32_t       kern_start; 
     37        u_int32_t       kern_len; 
     38        u_int32_t       root_start; 
     39        u_int32_t       root_len; 
     40        u_int32_t       kern_entry; 
     41        u_int32_t       firmware_max_length; 
     42} fw_layout_t; 
     43 
     44fw_layout_t fw_layout_data[] = { 
     45        { 
     46                .name           =       "XS2", 
     47                .kern_start     =       0xbfc30000, 
     48                .kern_len       =       0x00140000, 
     49                .root_start     =       0xbfc30000 + 0x00140000, 
     50                .root_len       =       0x002C0000, 
     51                .kern_entry     =       0x80041000, 
     52                .firmware_max_length=   0x00390000, 
     53        }, 
     54        { 
     55                .name           =       "XS5", 
     56                .kern_start     =       0xbe030000, 
     57                .kern_len       =       0x00140000, 
     58                .root_start     =       0xbe030000 + 0x00140000, 
     59                .root_len       =       0x002C0000, 
     60                .kern_entry     =       0x80041000, 
     61                .firmware_max_length=   0x00390000, 
     62        }, 
     63        { 
     64                .name           =       "RS", 
     65                .kern_start     =       0x00000000, 
     66                .kern_len       =       0x00140000, 
     67                .root_start     =       0x00000000, 
     68                .root_len       =       0x002C0000, 
     69                .kern_entry     =       0x80060000, 
     70                .firmware_max_length=   0x00140000 + 0x002C0000, 
     71        }, 
     72        {       .name           =       "", 
     73        }, 
     74}; 
     75 
    3476typedef struct part_data { 
    3577        char    partition_name[64]; 
     
    4991#define DEFAULT_VERSION         "UNKNOWN" 
    5092 
    51 #define OPTIONS "hv:o:r:k:s:" 
    52  
    53 #define FIRMWARE_MAX_LENGTH     (0x390000) 
    54 #define partition_startaddr     (0xBFC30000) 
     93#define OPTIONS "B:hv:o:r:k:" 
     94 
    5595static int debug = 0; 
    5696 
     
    134174             "\t-k <kernel file>\t\t - kernel file\n" 
    135175             "\t-r <rootfs file>\t\t - rootfs file\n" 
     176             "\t-B <board name>\t\t - choose firmware layout for specified board (XS2, XS5, RS)\n" 
    136177             "\t-h\t\t\t - this help\n", VERSION, 
    137178             progname, DEFAULT_VERSION, DEFAULT_OUTPUT_FILE); 
     
    174215} 
    175216 
    176 static int create_image_layout(const char* kernelfile, const char* rootfsfile, image_info_t* im) 
     217static int create_image_layout(const char* kernelfile, const char* rootfsfile, char* board_name, image_info_t* im) 
    177218{ 
    178219        part_data_t* kernel = &im->parts[0]; 
    179220        part_data_t* rootfs = &im->parts[1]; 
    180221 
     222        fw_layout_t* p; 
     223 
     224        p = &fw_layout_data[0]; 
     225        while ((strlen(p->name) != 0) && (strncmp(p->name, board_name, sizeof(board_name)) != 0)) 
     226                p++; 
     227        if (p->name == NULL) { 
     228                printf("BUG! Unable to find default fw layout!\n"); 
     229                exit(-1); 
     230        } 
     231 
     232        printf("board = %s\n", p->name); 
    181233        strcpy(kernel->partition_name, "kernel"); 
    182234        kernel->partition_index = 1; 
    183         kernel->partition_baseaddr = partition_startaddr; 
     235        kernel->partition_baseaddr = p->kern_start; 
    184236        if ( (kernel->partition_length = filelength(kernelfile)) < 0) return (-1); 
    185         kernel->partition_memaddr = 0x80041000; 
    186         kernel->partition_entryaddr = 0x80041000; 
     237        kernel->partition_memaddr = p->kern_entry; 
     238        kernel->partition_entryaddr = p->kern_entry; 
    187239        strncpy(kernel->filename, kernelfile, sizeof(kernel->filename)); 
    188240 
    189         if (filelength(rootfsfile) + kernel->partition_length > FIRMWARE_MAX_LENGTH) 
     241        if (filelength(rootfsfile) + kernel->partition_length > p->firmware_max_length) 
    190242                return (-2); 
    191243 
    192244        strcpy(rootfs->partition_name, "rootfs"); 
    193245        rootfs->partition_index = 2; 
    194         rootfs->partition_baseaddr = partition_startaddr + kernel->partition_length; 
    195         rootfs->partition_length = FIRMWARE_MAX_LENGTH - kernel->partition_length; 
     246        rootfs->partition_baseaddr = p->root_start; 
     247        rootfs->partition_length = p->firmware_max_length - kernel->partition_length; 
    196248        rootfs->partition_memaddr = 0x00000000; 
    197249        rootfs->partition_entryaddr = 0x00000000; 
    198250        strncpy(rootfs->filename, rootfsfile, sizeof(rootfs->filename)); 
    199251 
     252printf("kernel: %d %d\n", kernel->partition_length, kernel->partition_baseaddr); 
     253printf("root: %d %d\n", rootfs->partition_length, rootfs->partition_baseaddr); 
    200254        im->part_count = 2; 
    201255 
     
    314368        char kernelfile[PATH_MAX]; 
    315369        char rootfsfile[PATH_MAX]; 
     370        char board_name[PATH_MAX]; 
    316371        int o, rc; 
    317372        image_info_t im; 
     
    320375        memset(kernelfile, 0, sizeof(kernelfile)); 
    321376        memset(rootfsfile, 0, sizeof(rootfsfile)); 
     377        memset(board_name, 0, sizeof(board_name)); 
    322378 
    323379        strcpy(im.outputfile, DEFAULT_OUTPUT_FILE); 
     
    346402                                strncpy(rootfsfile, optarg, sizeof(rootfsfile)); 
    347403                        break; 
    348                 case 's': 
     404                case 'B': 
    349405                        if (optarg) 
    350                                 #undef partition_startaddr 
    351                                 #define partition_startaddr     (optarg) 
     406                                strncpy(board_name, optarg, sizeof(board_name)); 
    352407                        break; 
    353408                } 
    354409        } 
     410        if (strlen(board_name) == 0) 
     411                strcpy(board_name, "XS2"); /* default to XS2 */ 
    355412 
    356413        if (strlen(kernelfile) == 0) 
     
    368425        } 
    369426 
    370         if ((rc = create_image_layout(kernelfile, rootfsfile, &im)) != 0) 
     427        if ((rc = create_image_layout(kernelfile, rootfsfile, board_name, &im)) != 0) 
    371428        { 
    372429                ERROR("Failed creating firmware layout description - error code: %d\n", rc); 
Note: See TracChangeset for help on using the changeset viewer.