Changeset 36482


Ignore:
Timestamp:
2013-04-28T23:11:17+02:00 (5 years ago)
Author:
hauke
Message:

broadcom-diag: support for the WNDR3700v3

I recently picked up a WNDR3700 to put OpenWRT on, and only after tearing into the box did I find it
was one of the v3 boards, with poor OpenWRT support. This patch should add the board detection and
LED/button control to the broadcom-diag module, and should generate a netgear .chk image that the
bootloader and stock firmware will accept.

The changes to the broadcom-diag module are more than a few lines because the WNDR3700v3 is driving
its LEDs through an HC164 8-bit shift register.

Signed-off-by: Owen Kirby <osk@…>

Location:
trunk
Files:
4 edited

Legend:

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

    r35766 r36482  
    124124        WNR834BV2, 
    125125        WNDR3400V1, 
     126        WNDR3700V3, 
    126127 
    127128        /* Trendware */ 
     
    926927                        { .name = "diag",       .gpio = 1 << 7, .polarity = NORMAL }, 
    927928                        { .name = "usb",        .gpio = 1 << 2, .polarity = REVERSE }, 
     929                }, 
     930        }, 
     931        [WNDR3700V3] = { 
     932                .name           = "Netgear WNDR3700 V3", 
     933                .buttons        = { 
     934                        /* { .name = "usb",     .gpio = 1 << 1 }, */ /* this button doesn't seem to exist. */ 
     935                        { .name = "wlan",       .gpio = 1 << 2 }, 
     936                        { .name = "reset",      .gpio = 1 << 3 }, 
     937                        { .name = "wps",        .gpio = 1 << 4 }, 
     938                        /* { .name = "switch",  .gpio = 1 << 5 },*/     /* nvram get gpio5=robo_reset */ 
     939                }, 
     940                .leds           = { 
     941                        { .name = "power",      .gpio = (1 << 0) | GPIO_TYPE_SHIFT, .polarity = REVERSE }, 
     942                        { .name = "diag",       .gpio = (1 << 1) | GPIO_TYPE_SHIFT, .polarity = REVERSE }, 
     943                        /* WAN LED doesn't respond to GPIO control. The switch is probably driving it. 
     944                         * { .name = "wan",     .gpio = (1 << 2) | GPIO_TYPE_SHIFT, .polarity = REVERSE }, 
     945                         */ 
     946                        { .name = "wlan2g",     .gpio = (1 << 3) | GPIO_TYPE_SHIFT, .polarity = REVERSE }, 
     947                        { .name = "wlan5g",     .gpio = (1 << 4) | GPIO_TYPE_SHIFT, .polarity = REVERSE }, 
     948                        { .name = "usb",        .gpio = (1 << 5) | GPIO_TYPE_SHIFT, .polarity = REVERSE }, 
     949                        { .name = "wps",        .gpio = (1 << 6) | GPIO_TYPE_SHIFT, .polarity = REVERSE }, 
     950                        { .name = "wlan",       .gpio = (1 << 7) | GPIO_TYPE_SHIFT, .polarity = REVERSE }, 
    928951                }, 
    929952        }, 
     
    13091332        case BCM47XX_BOARD_NETGEAR_WNDR3400V1: 
    13101333                return &platforms[WNDR3400V1]; 
     1334        case BCM47XX_BOARD_NETGEAR_WNDR3700V3: 
     1335                return &platforms[WNDR3700V3]; 
    13111336        case BCM47XX_BOARD_UNKNOWN: 
    13121337        case BCM47XX_BOARD_NON: 
     
    14771502                        continue; 
    14781503 
    1479                 if (l->gpio & GPIO_TYPE_EXTIF) { 
     1504                switch (l->gpio & GPIO_TYPE_MASK) { 
     1505                case GPIO_TYPE_EXTIF: 
    14801506                        l->state = 0; 
    14811507                        set_led_extif(l); 
    1482                 } else { 
     1508                        break; 
     1509                case GPIO_TYPE_SHIFT: 
     1510                        mask |= (SHIFTREG_DATA | SHIFTREG_CLK); 
     1511                        oe_mask |= (SHIFTREG_DATA | SHIFTREG_CLK); 
     1512                        l->state = (l->polarity != NORMAL); 
     1513                        set_led_shift(l); 
     1514                        break; 
     1515                case GPIO_TYPE_NORMAL: 
     1516                default: 
    14831517                        if (l->polarity != INPUT) oe_mask |= l->gpio; 
    14841518                        mask |= l->gpio; 
    14851519                        val |= (l->polarity == NORMAL)?0:l->gpio; 
     1520                        break; 
    14861521                } 
    14871522 
     
    15191554} 
    15201555 
     1556/* 
     1557 * This should be extended to allow the platform to specify the pins and width 
     1558 * of the shift register. They're hardcoded for now because only the WNDR3700v3 
     1559 * uses it. 
     1560 */ 
     1561static void shiftreg_output(unsigned int val) 
     1562{ 
     1563        unsigned int mask; 
     1564 
     1565        bcm47xx_gpio_out(SHIFTREG_DATA, SHIFTREG_DATA); /* init off, pull high */ 
     1566        bcm47xx_gpio_out(SHIFTREG_CLK, 0); /* init reset */ 
     1567 
     1568        /* shift 8 times */ 
     1569        for(mask = 1 << (SHIFTREG_MAX_BITS-1); mask; mask >>= 1) 
     1570        { 
     1571                bcm47xx_gpio_out(SHIFTREG_DATA, (val & mask) ? SHIFTREG_DATA : 0); 
     1572                bcm47xx_gpio_out(SHIFTREG_CLK, SHIFTREG_CLK); /* pull high to trigger */ 
     1573                bcm47xx_gpio_out(SHIFTREG_CLK, 0); /* reset to low */ 
     1574        } 
     1575} 
     1576 
     1577static void set_led_shift(struct led_t *led) 
     1578{ 
     1579        static u32      shiftreg = 0; 
     1580        u32                     old = shiftreg; 
     1581        u32                     pin = (led->gpio & ~GPIO_TYPE_MASK); 
     1582 
     1583        if (led->state) { 
     1584                shiftreg |= pin; 
     1585        } else { 
     1586                shiftreg &= ~pin; 
     1587        } 
     1588 
     1589        /* Clock the bits out. */ 
     1590        if (shiftreg != old) { 
     1591                shiftreg_output(shiftreg); 
     1592        } 
     1593} 
     1594 
     1595 
    15211596static void led_flash(unsigned long dummy) { 
    15221597        struct led_t *l; 
     
    15251600 
    15261601        for (l = platform.leds; l->name; l++) { 
    1527                 if (l->flash) { 
    1528                         if (l->gpio & GPIO_TYPE_EXTIF) { 
    1529                                 extif_blink = 1; 
    1530                                 l->state = !l->state; 
    1531                                 set_led_extif(l); 
    1532                         } else { 
    1533                                 mask |= l->gpio; 
    1534                         } 
     1602                if (!l->flash) continue; 
     1603                switch (l->gpio & GPIO_TYPE_MASK) { 
     1604                case GPIO_TYPE_EXTIF: 
     1605                        extif_blink = 1; 
     1606                        l->state = !l->state; 
     1607                        set_led_extif(l); 
     1608                        break; 
     1609                case GPIO_TYPE_SHIFT: 
     1610                        extif_blink = 1; 
     1611                        l->state = !l->state; 
     1612                        set_led_shift(l); 
     1613                        break; 
     1614                case GPIO_TYPE_NORMAL: 
     1615                default: 
     1616                        mask |= l->gpio; 
     1617                        break; 
    15351618                } 
    15361619        } 
     
    15631646                        case PROC_LED: { 
    15641647                                struct led_t * led = (struct led_t *) handler->ptr; 
     1648                                u8 p = (led->polarity == NORMAL ? 0 : 1); 
    15651649                                if (led->flash) { 
    15661650                                        len = sprintf(page, "f\n"); 
     1651                                } else if ((led->gpio & GPIO_TYPE_MASK) != GPIO_TYPE_NORMAL) { 
     1652                                        len = sprintf(page, "%d\n", ((led->state ^ p) ? 1 : 0)); 
    15671653                                } else { 
    1568                                         if (led->gpio & GPIO_TYPE_EXTIF) { 
    1569                                                 len = sprintf(page, "%d\n", led->state); 
    1570                                         } else { 
    1571                                                 u32 in = (bcm47xx_gpio_in(~0) & led->gpio ? 1 : 0); 
    1572                                                 u8 p = (led->polarity == NORMAL ? 0 : 1); 
    1573                                                 len = sprintf(page, "%d\n", ((in ^ p) ? 1 : 0)); 
    1574                                         } 
     1654                                        u32 in = (bcm47xx_gpio_in(~0) & led->gpio ? 1 : 0); 
     1655                                        len = sprintf(page, "%d\n", ((in ^ p) ? 1 : 0)); 
    15751656                                } 
    15761657                                break; 
     
    16291710                                } else { 
    16301711                                        led->flash = 0; 
    1631                                         if (led->gpio & GPIO_TYPE_EXTIF) { 
     1712                                        if ((led->gpio & GPIO_TYPE_MASK) == GPIO_TYPE_EXTIF) { 
    16321713                                                led->state = p ^ ((page[0] == '1') ? 1 : 0); 
    16331714                                                set_led_extif(led); 
     1715                                        } else if ((led->gpio & GPIO_TYPE_MASK) == GPIO_TYPE_SHIFT) { 
     1716                                                led->state = p ^ ((page[0] == '1') ? 1 : 0); 
     1717                                                set_led_shift(led); 
    16341718                                        } else { 
    16351719                                                bcm47xx_gpio_outen(led->gpio, led->gpio); 
  • trunk/package/broadcom-diag/src/diag.h

    r23245 r36482  
    105105 
    106106static void set_led_extif(struct led_t *led); 
     107static void set_led_shift(struct led_t *led); 
    107108static void led_flash(unsigned long dummy); 
    108109 
  • trunk/package/broadcom-diag/src/gpio.h

    r32992 r36482  
    1010#define EXTIF_UART (EXTIF_ADDR + 0x00800000) 
    1111 
     12/* GPIO pins driving LEDs through a shift register */ 
     13#define SHIFTREG_DATA           (1 << 6) 
     14#define SHIFTREG_CLK            (1 << 7) 
     15#define SHIFTREG_MAX_BITS       8 
     16 
    1217#define GPIO_TYPE_NORMAL        (0x0 << 24) 
    1318#define GPIO_TYPE_EXTIF         (0x1 << 24) 
     19#define GPIO_TYPE_SHIFT         (0x2 << 24) 
    1420#define GPIO_TYPE_MASK          (0xf << 24) 
    1521 
  • trunk/target/linux/brcm47xx/image/Makefile

    r36139 r36482  
    141141        $(call Image/Build/Chk,$(1),wndr3400_v2,U12H187T00_NETGEAR,2,$(patsubst jffs2-%,jffs2,$(1))) 
    142142#       $(call Image/Build/Chk,$(1),wndr3400_vcna,U12H155T01_NETGEAR,2,$(patsubst jffs2-%,jffs2,$(1))) 
     143        $(call Image/Build/Chk,$(1),wndr3700_v3,U12H194T00_NETGEAR,2,$(patsubst jffs2-%,jffs2,$(1))) 
    143144        $(call Image/Build/Chk,$(1),wndr4000,U12H181T00_NETGEAR,2,$(patsubst jffs2-%,jffs2,$(1))) 
    144145        $(call Image/Build/Chk,$(1),wnr834b_v2,U12H081T00_NETGEAR,2,$(patsubst jffs2-%,jffs2,$(1))) 
Note: See TracChangeset for help on using the changeset viewer.