Changeset 9490


Ignore:
Timestamp:
2007-11-03T15:53:24+01:00 (9 years ago)
Author:
juhosg
Message:

[adm5120] image generation fixes (closes: #2643, #2644)

  • rewrite mkcsysimg to use an align parameter instead of a fixed size
  • Edimax images contains the jffs2 end-of-filesystem marker at the right position from now on
Location:
trunk
Files:
4 edited

Legend:

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

    r9089 r9490  
    1010LOADER_MAKE := $(NO_TRACE_MAKE) -C lzma-loader KDIR=$(KDIR) 
    1111IMGNAME := $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL) 
    12 JFFS2EOF := $(KDIR)/jffs2.eof 
     12JFFS2BLOCK := $(KDIR)/jffs2.block 
     13JFFS2MARK := $(KDIR)/jffs2.mark 
    1314 
    1415define imgname 
     
    2223define Image/Prepare 
    2324        cat $(KDIR)/vmlinux | $(STAGING_DIR_HOST)/bin/lzma e -si -so -eos -lc1 -lp2 -pb2 > $(KDIR)/vmlinux.lzma 
    24         rm -f $(JFFS2EOF) 
    25         touch $(JFFS2EOF) 
    26         $(call prepare_generic_squashfs,$(JFFS2EOF)) 
     25        rm -f $(JFFS2BLOCK) 
     26        touch $(JFFS2BLOCK) 
     27        $(call prepare_generic_squashfs,$(JFFS2BLOCK)) 
     28        rm -f $(JFFS2MARK) 
     29        touch $(JFFS2MARK) 
     30        $(call add_jffs2_mark,$(JFFS2MARK)) 
    2731endef 
    2832 
     
    6468 
    6569define trxalign/squashfs 
    66 -a 1024 -f $(KDIR)/root.squashfs -a 0x10000 -A $(JFFS2EOF) 
     70-a 1024 -f $(KDIR)/root.squashfs -a 0x10000 -A $(JFFS2BLOCK) 
    6771endef 
    6872 
  • trunk/target/linux/adm5120/image/router_le.mk

    r9485 r9490  
    55# See /LICENSE for more information. 
    66# 
     7 
     8define trxedimax/jffs2-128k 
     9-a 0x20000 -f $(KDIR)/root.jffs2-128k 
     10endef 
     11 
     12define trxedimax/jffs2-64k 
     13-a 0x10000 -f $(KDIR)/root.jffs2-64k 
     14endef 
     15 
     16define trxedimax/squashfs 
     17-a 1024 -f $(KDIR)/root.squashfs 
     18endef 
     19 
     20define Image/Build/TRXEdimax 
     21        $(STAGING_DIR_HOST)/bin/trx -o $(1) -f $(KDIR)/vmlinux.lzma \ 
     22                $(call trxedimax/$(2)) 
     23endef 
    724 
    825define Image/Build/Compex 
     
    1330define Image/Build/Edimax 
    1431        $(call Image/Build/Loader,$(2),gz,0x80500000,0x6D8,y,$(2)) 
    15         $(call Image/Build/TRXNoloader,$(call imgname,$(1),$(2)).trx,$(1)) 
    16         $(STAGING_DIR_HOST)/bin/mkcsysimg -B $(2) -d -w \ 
    17                 -r $(KDIR)/loader-$(2).gz::8192 \ 
    18                 -x $(call imgname,$(1),$(2)).trx \ 
     32        $(call Image/Build/TRXEdimax,$(call imgname,$(1),$(2)).trx,$(1)) 
     33        $(STAGING_DIR_HOST)/bin/mkcsysimg -B $(2) -v -v -d -w \ 
     34                -r $(KDIR)/loader-$(2).gz::0x1000 \ 
     35                -x $(call imgname,$(1),$(2)).trx:0x10000 \ 
     36                -x $(JFFS2MARK):0x10000 \ 
    1937                $(call imgname,$(1),$(2))-webui.bin 
    20         $(STAGING_DIR_HOST)/bin/mkcsysimg -B $(2) -d \ 
    21                 -r $(KDIR)/loader-$(2).gz::8192 \ 
    22                 -x $(call imgname,$(1),$(2)).trx \ 
     38        $(STAGING_DIR_HOST)/bin/mkcsysimg -B $(2) -v -v -d \ 
     39                -r $(KDIR)/loader-$(2).gz::0x1000 \ 
     40                -x $(call imgname,$(1),$(2)).trx:0x10000 \ 
     41                -x $(JFFS2MARK):0x10000 \ 
    2342                $(call imgname,$(1),$(2))-xmodem.bin 
    2443        rm -f $(call imgname,$(1),$(2)).trx 
     
    341360endef 
    342361 
     362define Image/Build/Profile/BR6104K 
     363        $(call Image/Build/Board/BR6104K/$(1)) 
     364endef 
     365 
    343366define Image/Build/Profile/BR6104KP 
    344367        $(call Image/Build/Board/BR6104KP/$(1)) 
  • trunk/target/linux/adm5120/router_le/profiles/Edimax.mk

    r9141 r9490  
    66# 
    77 
     8define Profile/BR6104K 
     9        NAME:=Edimax BR-6104K (Unofficial) 
     10endef 
     11 
     12define Profile/BR6104K/Description 
     13        Package set optimized for the Edimax BR-6104K 
     14endef 
     15 
    816define Profile/BR6104KP 
    9         NAME:=Edimax BR-6104KP 
     17        NAME:=Edimax BR-6104KP (Unofficial) 
    1018        PACKAGES:=kmod-usb-core kmod-usb-adm5120 
    1119endef 
     
    1523endef 
    1624 
     25$(eval $(call Profile,BR6104K)) 
    1726$(eval $(call Profile,BR6104KP)) 
  • trunk/tools/firmware-utils/src/mkcsysimg.c

    r9342 r9490  
    5353#endif 
    5454 
    55 #define ALIGN(x,y)      ((x)+((y)-1)) & ~((y)-1) 
    56  
    5755#define MAX_NUM_BLOCKS  8 
    5856#define MAX_ARG_COUNT   32 
     
    6664#define BLOCK_TYPE_CODE 3 
    6765#define BLOCK_TYPE_XTRA 4 
     66 
     67#define DEFAULT_BLOCK_ALIGN     0x10000U 
     68 
     69#define CSUM_SIZE_NONE  0 
     70#define CSUM_SIZE_8     1 
     71#define CSUM_SIZE_16    2 
    6872 
    6973 
     
    8387        uint32_t        file_size;      /* length of the file */ 
    8488 
     89        unsigned char   sig[SIG_LEN]; 
     90        uint32_t        addr; 
     91        int             addr_set; 
     92        uint32_t        align; 
     93        int             align_set; 
     94        uint8_t         padc; 
     95 
    8596        uint32_t        size; 
    86         int             size_set; 
    87         uint8_t         padc; 
    88  
    8997        uint32_t        size_hdr; 
    9098        uint32_t        size_csum; 
    9199        uint32_t        size_avail; 
    92100 
    93         unsigned char   sig[SIG_LEN]; 
    94         uint32_t        addr; 
    95         int             addr_set; 
    96101        struct csum_state *css; 
    97102}; 
     
    227232"  -d              don't throw error on invalid images\n" 
    228233"  -k              keep invalid images\n" 
    229 "  -b <file>[:<len>[:<padc>]]\n" 
     234"  -b <file>[:<align>[:<padc>]]\n" 
    230235"                  add boot code to the image\n" 
    231 "  -c <file>[:<len>[:<padc>]]\n" 
     236"  -c <file>[:<align>[:<padc>]]\n" 
    232237"                  add configuration settings to the image\n" 
    233 "  -r <file>:[<addr>][:<len>[:<padc>]]\n" 
     238"  -r <file>:[<addr>][:<align>[:<padc>]]\n" 
    234239"                  add runtime code to the image\n" 
    235 "  -w [<file>:[<addr>][:<len>[:<padc>]]]\n" 
     240"  -w [<file>:[<addr>][:<align>[:<padc>]]]\n" 
    236241"                  add webpages to the image\n" 
    237 "  -x <file>[:<len>[:<padc>]]\n" 
     242"  -x <file>[:<align>[:<padc>]]\n" 
    238243"                  add extra data at the end of the image\n" 
    239244"  -h              show this screen\n" 
     
    245250} 
    246251 
     252static inline uint32_t align(uint32_t base, uint32_t alignment) 
     253{ 
     254        uint32_t ret; 
     255 
     256        if (alignment) { 
     257                ret = (base + alignment - 1); 
     258                ret &= ~(alignment-1); 
     259        } else { 
     260                ret = base; 
     261        } 
     262 
     263        return ret; 
     264} 
    247265 
    248266/* 
     
    448466{ 
    449467        switch (css->size) { 
    450         case 1: 
     468        case CSUM_SIZE_8: 
    451469                csum8_update(p,len,css); 
    452470                break; 
    453         case 2: 
     471        case CSUM_SIZE_16: 
    454472                csum16_update(p,len,css); 
    455473                break; 
     
    464482 
    465483        switch (css->size) { 
    466         case 1: 
     484        case CSUM_SIZE_8: 
    467485                ret = csum8_get(css); 
    468486                break; 
    469         case 2: 
     487        case CSUM_SIZE_16: 
    470488                ret = csum16_get(css); 
    471489                break; 
     
    555573        memcpy(hdr.sig, block->sig, 4); 
    556574        hdr.addr = HOST_TO_LE32(block->addr); 
    557         hdr.size = HOST_TO_LE32(block->size-block->size_hdr); 
     575        hdr.size = HOST_TO_LE32(block->align-block->size_hdr); 
    558576 
    559577        DBG(1,"writing header for block"); 
     
    809827                block->type = BLOCK_TYPE_WEBP; 
    810828                block->size_hdr = sizeof(struct csys_header); 
    811                 block->size_csum = 1; 
     829                block->size_csum = CSUM_SIZE_8; 
    812830                block->need_file = 0; 
    813831                webp_block = block; 
     
    820838                block->type = BLOCK_TYPE_CODE; 
    821839                block->size_hdr = sizeof(struct csys_header); 
    822                 block->size_csum = 2; 
     840                block->size_csum = CSUM_SIZE_16; 
    823841                code_block = block; 
    824842                break; 
     
    859877        p = argv[i++]; 
    860878        if (!is_empty_arg(p)) { 
    861                 if (str2u32(p, &block->size) != 0) { 
    862                         ERR("invalid block size in %s", arg); 
     879                if (str2u32(p, &block->align) != 0) { 
     880                        ERR("invalid alignment value in %s", arg); 
    863881                        return ERR_FATAL; 
    864882                } 
    865                 block->size_set = 1; 
     883                block->align_set = 1; 
    866884        } 
    867885 
     
    882900{ 
    883901        struct csys_block *block; 
    884         uint32_t size_avail; 
     902        uint32_t offs = 0; 
    885903        int i; 
    886904        int res; 
     
    895913        } 
    896914 
    897         size_avail = board->flash_size; 
    898  
    899915        /* bootloader */ 
    900916        block = boot_block; 
    901917        if (block) { 
    902                 if (block->size_set) { 
    903                         board->boot_size= block->size; 
    904                 } else { 
    905                         block->size = board->boot_size; 
    906                 } 
    907                 if (block->size > size_avail) { 
     918                block->size = board->boot_size; 
     919                if (block->file_size > board->boot_size) { 
    908920                        WARN("boot block is too big"); 
    909921                        res = ERR_INVALID_IMAGE; 
    910922                } 
    911923        } 
    912         size_avail -= board->boot_size; 
     924        offs += board->boot_size; 
    913925 
    914926        /* configuration data */ 
    915927        block = conf_block; 
    916928        if (block) { 
    917                 if (block->size_set) { 
    918                         board->conf_size = block->size; 
    919                 } else { 
    920                         block->size = board->conf_size; 
    921                 } 
    922                 if (block->size > size_avail) { 
     929                block->size = board->conf_size; 
     930                if (block->file_size > board->conf_size) { 
    923931                        WARN("config block is too big"); 
    924932                        res = ERR_INVALID_IMAGE; 
    925933                } 
    926  
    927         } 
    928         size_avail -= board->conf_size; 
     934        } 
     935        offs += board->conf_size; 
    929936 
    930937        /* webpages */ 
    931938        block = webp_block; 
    932939        if (block) { 
    933                 if (block->size_set == 0) 
    934                         block->size = board->webp_size; 
    935                 board->webp_size = block->size; 
     940 
     941                memcpy(block->sig, board->sig_webp, 4); 
     942 
     943                if (block->addr_set == 0) 
     944                        block->addr = board->addr_webp; 
     945 
     946                if (block->align_set == 0) 
     947                        block->align = DEFAULT_BLOCK_ALIGN; 
     948 
     949                block->size = align(offs + block->file_size + block->size_hdr + 
     950                                block->size_csum, block->align) - offs; 
     951 
    936952                if (block->size > board->webp_size_max) { 
    937953                        WARN("webpages block is too big"); 
    938954                        res = ERR_INVALID_IMAGE; 
    939955                } 
    940                 memcpy(block->sig, board->sig_webp, 4); 
    941                 if (block->addr_set == 0) 
    942                         block->addr = board->addr_webp; 
    943         } 
    944         size_avail -= board->webp_size; 
     956 
     957                DBG(2,"webpages start at %08x, size=%08x", offs, 
     958                                block->size); 
     959 
     960                offs += block->size; 
     961                if (offs > board->flash_size) { 
     962                        WARN("webp block is too big"); 
     963                        res = ERR_INVALID_IMAGE; 
     964                } 
     965        } 
    945966 
    946967        /* runtime code */ 
    947968        block = code_block; 
    948969        if (block) { 
    949                 if (block->size_set == 0) { 
    950                         block->size =ALIGN(block->file_size+ block->size_hdr + 
    951                                 block->size_csum, 0x10000); 
    952                 } 
    953                 board->code_size = block->size; 
    954                 if (board->code_size > size_avail) { 
     970                memcpy(code_block->sig, SIG_CSYS, 4); 
     971 
     972                if (block->addr_set == 0) 
     973                        block->addr = board->addr_code; 
     974 
     975                if (block->align_set == 0) 
     976                        block->align = DEFAULT_BLOCK_ALIGN; 
     977 
     978                block->size = align(offs + block->file_size + 
     979                                block->size_hdr + block->size_csum, 
     980                                block->align) - offs; 
     981 
     982                DBG(2,"code block start at %08x, size=%08x", offs, 
     983                                block->size); 
     984 
     985                offs += block->size; 
     986                if (offs > board->flash_size) { 
    955987                        WARN("code block is too big"); 
    956988                        res = ERR_INVALID_IMAGE; 
    957989                } 
    958                 memcpy(code_block->sig, SIG_CSYS, 4); 
    959                 if (code_block->addr_set == 0) 
    960                         code_block->addr = board->addr_code; 
    961         } 
    962         size_avail -= board->code_size; 
     990        } 
    963991 
    964992        for (i = 0; i < num_blocks; i++) { 
     
    968996                        continue; 
    969997 
    970                 if (block->size_set == 0) 
    971                         block->size = ALIGN(block->file_size, 0x10000); 
    972  
    973                 if (block->size > size_avail) { 
     998                if (block->align_set == 0) 
     999                        block->align = DEFAULT_BLOCK_ALIGN; 
     1000 
     1001                block->size = align(offs + block->file_size, 
     1002                                block->align) - offs; 
     1003 
     1004                DBG(2,"file %s start at %08x, size=%08x, align=%08x", 
     1005                        block->file_name, offs, block->size, block->align); 
     1006 
     1007                offs += block->size; 
     1008                if (offs > board->flash_size) { 
    9741009                        WARN("file %s is too big, size=%d, avail=%d", 
    9751010                                block->file_name, block->file_size, 
    976                                 size_avail); 
     1011                                board->flash_size - offs); 
    9771012                        res = ERR_INVALID_IMAGE; 
    9781013                } 
    979  
    980                 size_avail -= block->size; 
    9811014        } 
    9821015 
Note: See TracChangeset for help on using the changeset viewer.