Changeset 24217


Ignore:
Timestamp:
2010-12-02T22:27:54+01:00 (7 years ago)
Author:
hauke
Message:

brcm47xx: Add edimax PS1208mfg support

Thank you clemvangelis for the patches. (closes #7672)

Location:
trunk
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/broadcom-diag/src/diag.c

    r23043 r24217  
    139139        /* Microsoft */ 
    140140        MN700, 
     141 
     142        /* Edimax */ 
     143        PS1208MFG, 
    141144}; 
    142145 
     
    894897                .leds     = { 
    895898                        { .name = "power",      .gpio = 1 << 6, .polarity = NORMAL }, 
     899                }, 
     900        }, 
     901        /* Edimax */ 
     902        [PS1208MFG] = { 
     903                .name   = "Edimax PS-1208MFG", 
     904                .buttons        = { 
     905                        { .name = "reset",      .gpio = 1 << 4 }, 
     906                }, 
     907                .leds     = { 
     908                        { .name = "status",     .gpio = 1 << 1, .polarity = NORMAL }, 
     909                        { .name = "wlan",       .gpio = 1 << 0, .polarity = NORMAL }, 
    896910                }, 
    897911        }, 
     
    11221136                return &platforms[STI_NAS]; 
    11231137 
    1124         if (!strcmp(getvar("boardnum"), "10") && !strcmp(getvar("boardrev"), "0x13")) /* D-Link DWL-3150 */ 
     1138        if (!strcmp(boardnum, "10") && !strcmp(getvar("boardrev"), "0x13")) /* D-Link DWL-3150 */ 
    11251139                return &platforms[DWL3150]; 
     1140 
     1141        if (!strcmp(boardnum, "01") && !strcmp(boardtype, "0x048e") && /* Edimax PS1208MFG */ 
     1142                !strcmp(getvar("status_gpio"), "1")) /* gpio based detection */ 
     1143                return &platforms[PS1208MFG]; 
    11261144 
    11271145        /* not found */ 
  • trunk/target/linux/brcm47xx/files-2.6.34/drivers/mtd/maps/bcm47xx-flash.c

    r22475 r24217  
    7272}; 
    7373 
     74/* for Edimax Print servers which use an additional header 
     75 * then the firmware on flash looks like : 
     76 * EDIMAX HEADER | TRX HEADER 
     77 * As this header is 12 bytes long we have to handle it 
     78 * and skip it to find the TRX header 
     79 */ 
     80#define EDIMAX_PS_HEADER_MAGIC  0x36315350 /*  "PS16"  */ 
     81#define EDIMAX_PS_HEADER_LEN    0xc /* 12 bytes long for edimax header */ 
     82 
    7483#define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y)) 
    7584#define NVRAM_SPACE 0x8000 
     
    145154                    len != sizeof(buf)) 
    146155                        continue; 
     156 
     157                if (le32_to_cpu(trx->magic) == EDIMAX_PS_HEADER_MAGIC) { 
     158                        if (mtd->read(mtd, off + EDIMAX_PS_HEADER_LEN, 
     159                            sizeof(buf), &len, buf) || len != sizeof(buf)) { 
     160                                continue; 
     161                        } else { 
     162                                printk(KERN_NOTICE"Found edimax header\n"); 
     163                        } 
     164                } 
    147165 
    148166                /* found a TRX header */ 
     
    218236 
    219237        /* 
    220          * Next, writhe data to flash. 
     238         * Next, write data to flash. 
    221239         */ 
    222240 
     
    268286        struct trx_header trx, *trx2; 
    269287        unsigned char buf[512], *block; 
    270         int off, blocksize; 
     288        int off, blocksize, trxoff = 0; 
    271289        u32 i, crc = ~0; 
    272290        size_t len; 
     291        bool edimax = false; 
    273292 
    274293        blocksize = mtd->erasesize; 
     
    286305                        continue; 
    287306 
     307                /* found an edimax header */ 
     308                if (le32_to_cpu(trx.magic) == EDIMAX_PS_HEADER_MAGIC) { 
     309                        /* read the correct trx header */ 
     310                        if (mtd->read(mtd, off + EDIMAX_PS_HEADER_LEN, 
     311                            sizeof(trx), &len, (char *) &trx) || 
     312                            len != sizeof(trx)) { 
     313                                continue; 
     314                        } else { 
     315                                printk(KERN_NOTICE"Found an edimax ps header\n"); 
     316                                edimax = true; 
     317                        } 
     318                } 
     319 
    288320                /* found a TRX header */ 
    289321                if (le32_to_cpu(trx.magic) == TRX_MAGIC) { 
     
    294326                        part->size -= part->offset; 
    295327                        part->offset += off; 
     328                        if (edimax) { 
     329                                off += EDIMAX_PS_HEADER_LEN; 
     330                                trxoff = EDIMAX_PS_HEADER_LEN; 
     331                        } 
    296332 
    297333                        goto found; 
     
    305341 
    306342 found: 
     343        printk(KERN_NOTICE"TRX offset : %lx\n", trxoff); 
    307344        if (part->size == 0) 
    308345                return 0; 
     
    329366                block = kmalloc(mtd->erasesize, GFP_KERNEL); 
    330367                trx2 = (struct trx_header *) block; 
    331                 if (mtd->read(mtd, off, mtd->erasesize, &len, block) || len != mtd->erasesize) { 
     368                if (mtd->read(mtd, off - trxoff, mtd->erasesize, &len, block) || len != mtd->erasesize) { 
    332369                        printk("Error accessing the first trx eraseblock\n"); 
    333370                        return 0; 
     
    339376 
    340377                /* Write updated trx header to the flash */ 
    341                 memcpy(block, &trx, sizeof(trx)); 
     378                memcpy(block + trxoff, &trx, sizeof(trx)); 
    342379                if (mtd->unlock) 
    343                         mtd->unlock(mtd, off, mtd->erasesize); 
    344                 erase_write(mtd, off, mtd->erasesize, block); 
     380                        mtd->unlock(mtd, off - trxoff, mtd->erasesize); 
     381                erase_write(mtd, off - trxoff, mtd->erasesize, block); 
    345382                if (mtd->sync) 
    346383                        mtd->sync(mtd); 
  • trunk/target/linux/brcm47xx/files-2.6.36/drivers/mtd/maps/bcm47xx-flash.c

    r22475 r24217  
    7272}; 
    7373 
     74/* for Edimax Print servers which use an additional header 
     75 * then the firmware on flash looks like : 
     76 * EDIMAX HEADER | TRX HEADER 
     77 * As this header is 12 bytes long we have to handle it 
     78 * and skip it to find the TRX header 
     79 */ 
     80#define EDIMAX_PS_HEADER_MAGIC  0x36315350 /*  "PS16"  */ 
     81#define EDIMAX_PS_HEADER_LEN    0xc /* 12 bytes long for edimax header */ 
     82 
    7483#define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y)) 
    7584#define NVRAM_SPACE 0x8000 
     
    145154                    len != sizeof(buf)) 
    146155                        continue; 
     156 
     157                if (le32_to_cpu(trx->magic) == EDIMAX_PS_HEADER_MAGIC) { 
     158                        if (mtd->read(mtd, off + EDIMAX_PS_HEADER_LEN, 
     159                            sizeof(buf), &len, buf) || len != sizeof(buf)) { 
     160                                continue; 
     161                        } else { 
     162                                printk(KERN_NOTICE"Found edimax header\n"); 
     163                        } 
     164                } 
    147165 
    148166                /* found a TRX header */ 
     
    218236 
    219237        /* 
    220          * Next, writhe data to flash. 
     238         * Next, write data to flash. 
    221239         */ 
    222240 
     
    268286        struct trx_header trx, *trx2; 
    269287        unsigned char buf[512], *block; 
    270         int off, blocksize; 
     288        int off, blocksize, trxoff = 0; 
    271289        u32 i, crc = ~0; 
    272290        size_t len; 
     291        bool edimax = false; 
    273292 
    274293        blocksize = mtd->erasesize; 
     
    286305                        continue; 
    287306 
     307                /* found an edimax header */ 
     308                if (le32_to_cpu(trx.magic) == EDIMAX_PS_HEADER_MAGIC) { 
     309                        /* read the correct trx header */ 
     310                        if (mtd->read(mtd, off + EDIMAX_PS_HEADER_LEN, 
     311                            sizeof(trx), &len, (char *) &trx) || 
     312                            len != sizeof(trx)) { 
     313                                continue; 
     314                        } else { 
     315                                printk(KERN_NOTICE"Found an edimax ps header\n"); 
     316                                edimax = true; 
     317                        } 
     318                } 
     319 
    288320                /* found a TRX header */ 
    289321                if (le32_to_cpu(trx.magic) == TRX_MAGIC) { 
     
    294326                        part->size -= part->offset; 
    295327                        part->offset += off; 
     328                        if (edimax) { 
     329                                off += EDIMAX_PS_HEADER_LEN; 
     330                                trxoff = EDIMAX_PS_HEADER_LEN; 
     331                        } 
    296332 
    297333                        goto found; 
     
    305341 
    306342 found: 
     343        printk(KERN_NOTICE"TRX offset : %lx\n", trxoff); 
    307344        if (part->size == 0) 
    308345                return 0; 
     
    329366                block = kmalloc(mtd->erasesize, GFP_KERNEL); 
    330367                trx2 = (struct trx_header *) block; 
    331                 if (mtd->read(mtd, off, mtd->erasesize, &len, block) || len != mtd->erasesize) { 
     368                if (mtd->read(mtd, off - trxoff, mtd->erasesize, &len, block) || len != mtd->erasesize) { 
    332369                        printk("Error accessing the first trx eraseblock\n"); 
    333370                        return 0; 
     
    339376 
    340377                /* Write updated trx header to the flash */ 
    341                 memcpy(block, &trx, sizeof(trx)); 
     378                memcpy(block + trxoff, &trx, sizeof(trx)); 
    342379                if (mtd->unlock) 
    343                         mtd->unlock(mtd, off, mtd->erasesize); 
    344                 erase_write(mtd, off, mtd->erasesize, block); 
     380                        mtd->unlock(mtd, off - trxoff, mtd->erasesize); 
     381                erase_write(mtd, off - trxoff, mtd->erasesize, block); 
    345382                if (mtd->sync) 
    346383                        mtd->sync(mtd); 
  • trunk/target/linux/brcm47xx/files-2.6.37/drivers/mtd/maps/bcm47xx-flash.c

    r22475 r24217  
    7272}; 
    7373 
     74/* for Edimax Print servers which use an additional header 
     75 * then the firmware on flash looks like : 
     76 * EDIMAX HEADER | TRX HEADER 
     77 * As this header is 12 bytes long we have to handle it 
     78 * and skip it to find the TRX header 
     79 */ 
     80#define EDIMAX_PS_HEADER_MAGIC  0x36315350 /*  "PS16"  */ 
     81#define EDIMAX_PS_HEADER_LEN    0xc /* 12 bytes long for edimax header */ 
     82 
    7483#define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y)) 
    7584#define NVRAM_SPACE 0x8000 
     
    145154                    len != sizeof(buf)) 
    146155                        continue; 
     156 
     157                if (le32_to_cpu(trx->magic) == EDIMAX_PS_HEADER_MAGIC) { 
     158                        if (mtd->read(mtd, off + EDIMAX_PS_HEADER_LEN, 
     159                            sizeof(buf), &len, buf) || len != sizeof(buf)) { 
     160                                continue; 
     161                        } else { 
     162                                printk(KERN_NOTICE"Found edimax header\n"); 
     163                        } 
     164                } 
    147165 
    148166                /* found a TRX header */ 
     
    218236 
    219237        /* 
    220          * Next, writhe data to flash. 
     238         * Next, write data to flash. 
    221239         */ 
    222240 
     
    268286        struct trx_header trx, *trx2; 
    269287        unsigned char buf[512], *block; 
    270         int off, blocksize; 
     288        int off, blocksize, trxoff = 0; 
    271289        u32 i, crc = ~0; 
    272290        size_t len; 
     291        bool edimax = false; 
    273292 
    274293        blocksize = mtd->erasesize; 
     
    286305                        continue; 
    287306 
     307                /* found an edimax header */ 
     308                if (le32_to_cpu(trx.magic) == EDIMAX_PS_HEADER_MAGIC) { 
     309                        /* read the correct trx header */ 
     310                        if (mtd->read(mtd, off + EDIMAX_PS_HEADER_LEN, 
     311                            sizeof(trx), &len, (char *) &trx) || 
     312                            len != sizeof(trx)) { 
     313                                continue; 
     314                        } else { 
     315                                printk(KERN_NOTICE"Found an edimax ps header\n"); 
     316                                edimax = true; 
     317                        } 
     318                } 
     319 
    288320                /* found a TRX header */ 
    289321                if (le32_to_cpu(trx.magic) == TRX_MAGIC) { 
     
    294326                        part->size -= part->offset; 
    295327                        part->offset += off; 
     328                        if (edimax) { 
     329                                off += EDIMAX_PS_HEADER_LEN; 
     330                                trxoff = EDIMAX_PS_HEADER_LEN; 
     331                        } 
    296332 
    297333                        goto found; 
     
    305341 
    306342 found: 
     343        printk(KERN_NOTICE"TRX offset : %lx\n", trxoff); 
    307344        if (part->size == 0) 
    308345                return 0; 
     
    329366                block = kmalloc(mtd->erasesize, GFP_KERNEL); 
    330367                trx2 = (struct trx_header *) block; 
    331                 if (mtd->read(mtd, off, mtd->erasesize, &len, block) || len != mtd->erasesize) { 
     368                if (mtd->read(mtd, off - trxoff, mtd->erasesize, &len, block) || len != mtd->erasesize) { 
    332369                        printk("Error accessing the first trx eraseblock\n"); 
    333370                        return 0; 
     
    339376 
    340377                /* Write updated trx header to the flash */ 
    341                 memcpy(block, &trx, sizeof(trx)); 
     378                memcpy(block + trxoff, &trx, sizeof(trx)); 
    342379                if (mtd->unlock) 
    343                         mtd->unlock(mtd, off, mtd->erasesize); 
    344                 erase_write(mtd, off, mtd->erasesize, block); 
     380                        mtd->unlock(mtd, off - trxoff, mtd->erasesize); 
     381                erase_write(mtd, off - trxoff, mtd->erasesize, block); 
    345382                if (mtd->sync) 
    346383                        mtd->sync(mtd); 
  • trunk/target/linux/brcm47xx/image/Makefile

    r22522 r24217  
    5050endef 
    5151 
     52define Image/Build/Edi 
     53        $(STAGING_DIR_HOST)/bin/trx2edips $(BIN_DIR)/$(IMG_PREFIX)-$(1).trx $(BIN_DIR)/openwrt-$(2)-$(3).bin 
     54endef 
     55 
    5256define trxalign/jffs2-128k 
    5357-a 0x20000 -f $(KDIR)/root.$(1) 
     
    8892        $(call Image/Build/Motorola,$(1),wa840g,2,$(patsubst jffs2-%,jffs2,$(1))) 
    8993        $(call Image/Build/Motorola,$(1),we800g,3,$(patsubst jffs2-%,jffs2,$(1))) 
     94        $(call Image/Build/Edi,$(1),ps1208mfg,$(patsubst jffs2-%,jffs2,$(1))) 
    9095endef 
    9196 
  • trunk/target/linux/brcm47xx/image/lzma-loader/src/decompress.c

    r21945 r24217  
    8888}; 
    8989 
     90#define EDIMAX_PS_HEADER_MAGIC  0x36315350 /*  "PS16"  */ 
     91#define EDIMAX_PS_HEADER_LEN    0xc /* 12 bytes long for edimax header */ 
     92 
    9093/* beyound the image end, size not known in advance */ 
    9194extern unsigned char workspace[]; 
     
    136139        /* look for trx header, 32-bit data access */ 
    137140        for (data = ((unsigned char *) KSEG1ADDR(BCM4710_FLASH)); 
    138                 ((struct trx_header *)data)->magic != TRX_MAGIC; data += 65536); 
     141                ((struct trx_header *)data)->magic != TRX_MAGIC && 
     142                ((struct trx_header *)data)->magic != EDIMAX_PS_HEADER_MAGIC; 
     143                 data += 65536); 
    139144 
     145        if (((struct trx_header *)data)->magic == EDIMAX_PS_HEADER_MAGIC) 
     146                data += EDIMAX_PS_HEADER_LEN; 
    140147        /* compressed kernel is in the partition 0 or 1 */ 
    141148        if (((struct trx_header *)data)->offsets[1] > 65536)  
  • trunk/tools/firmware-utils/Makefile

    r24011 r24217  
    4848        $(call cc,mkchkimg) 
    4949        $(call cc,mkzcfw cyg_crc32) 
     50        $(call cc,trx2edips) 
    5051endef 
    5152 
Note: See TracChangeset for help on using the changeset viewer.