ramips: add support for Sitecom WL-341v3 and other Sercomm IP1006RRv2 boards
authorGabor Juhos <juhosg@openwrt.org>
Thu, 26 Jan 2012 10:44:23 +0000 (10:44 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Thu, 26 Jan 2012 10:44:23 +0000 (10:44 +0000)
This patch adds support for the Sitecom WL-341 v3 and other Sercomm
IP1006RRv2 based boards for sysupgrade support and for the initial
flash through pushbutton initiated recovery mode with the special
partition table and fixes for the quirks and things required by the
modified bootloader.

There is a known bug, Wi-Fi is not working on my board probably
because of the lack of RAM (the board only has 16MiB ram -- half of
the normal amount for non rebadged versions, but there is an empty
slot for another ram chip,) but I don't know for sure. The driver
loads but hostapd fails to load so I think it's not related to the
specific device except for the lack of RAM.

Moreover, only 7 of the 11 onboard leds are confirmed working, it
seems that one of the others is always on and the remaining ones are
connected to the wireless card leds already recognized by OpenWrt

[juhosg: reordered some parts in order to keep things sorted
alphabetically]

Signed-off-by: Marco Antonio Mauro <marcus90@gmail.com>
SVN-Revision: 29910

target/linux/ramips/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom
target/linux/ramips/base-files/etc/uci-defaults/network
target/linux/ramips/base-files/lib/preinit/06_set_iface_mac
target/linux/ramips/base-files/lib/ramips.sh
target/linux/ramips/base-files/lib/upgrade/platform.sh
target/linux/ramips/files/arch/mips/include/asm/mach-ralink/machine.h
target/linux/ramips/files/arch/mips/ralink/rt305x/Kconfig
target/linux/ramips/files/arch/mips/ralink/rt305x/Makefile
target/linux/ramips/files/arch/mips/ralink/rt305x/mach-wl341v3.c [new file with mode: 0644]
target/linux/ramips/image/Makefile
target/linux/ramips/rt305x/config-2.6.39

index 9a714ddc697671ea9c1e3f0dc943fb462125572d..ac97d037c10562787fd117e580a39e74a4ac7a7b 100644 (file)
@@ -68,6 +68,10 @@ case "$FIRMWARE" in
                rt2x00_eeprom_extract "factory" 0 272
                ;;
 
+       wl341v3)
+               rt2x00_eeprom_extract "board-nvram" 64880 272
+               ;;
+
        *)
                rt2x00_eeprom_die "board $board is not supported yet"
                ;;
index cc5600bcfdb96a5941655495540370d7f2a29cc7..bce24e84327dac9999950a54b7d1daf46e24c580 100755 (executable)
@@ -111,6 +111,11 @@ ramips_setup_macs()
                 wan_mac=$(ramips_get_mac_binary factory 40)
                ;;
 
+       wl341v3)
+               lan_mac=$(ramips_get_mac_binary board-nvram 65440)
+               wan_mac=$(/usr/sbin/maccalc add "$lan_mac" 1)
+               ;;
+
        wli-tx4-ag300n)
                lan_mac=$(ramips_get_mac_binary factory 4)
                ;;
index 9a4d515b19bc9b1c8c946f54da5e0f2d83fdcf5f..f6884c847788b640115b329ad4c1fbac37f6ee56 100644 (file)
@@ -29,6 +29,10 @@ preinit_set_mac_address() {
                mac=$(ramips_get_mac_binary factory 40)
                ifconfig eth0 hw ether $mac 2>/dev/null
                ;;
+       wl341v3)
+               mac=$(ramips_get_mac_binary board-nvram 65440)
+               ifconfig eth0 hw ether $mac 2>/dev/null
+               ;;
        esac
 }
 
index ca9b3c9cfc5acbdf24c16220487764892d77a5fc..b3c54e82dbdf4d8af95735cff527dd40c03ea8f3 100755 (executable)
@@ -113,6 +113,9 @@ ramips_board_name() {
        *"WHR-G300N")
                name="whr-g300n"
                ;;
+       *"Sitecom WL-341 v3")
+               name="wl341v3"
+               ;;
        *"Sitecom WL-351 v1 002")
                name="wl-351"
                ;;
index 30754b5c2fee02d2148035c132dafd0b6ca4b32d..494e774ef960777214148aa985648e8f5fe684bb 100755 (executable)
@@ -30,6 +30,7 @@ platform_check_image() {
        rt-n15 | \
        w502u |\
        v22rw-2x2 | \
+       wl341v3 | \
        wli-tx4-ag300n | \
        whr-g300n |\
        wr512-3gn)
index 272e2b818ee7ae52636b347702f0f8e3aabff3c0..bec6ff0bec9257f85cea0893bbf680e27f827288 100644 (file)
@@ -42,6 +42,7 @@ enum ramips_mach_type {
        RAMIPS_MACH_W502U,              /* ALFA Networks W502U */
        RAMIPS_MACH_WCR150GN,           /* Sparklan WCR-150GN */
        RAMIPS_MACH_WHR_G300N,          /* Buffalo WHR-G300N */
+       RAMIPS_MACH_WL341V3,            /* Sitecom WL-341 v3 */
        RAMIPS_MACH_WL351,              /* Sitecom WL-351 v1 002 */
        RAMIPS_MACH_WR512_3GN,          /* SH-WR512NU/WS-WR512N1-like 3GN*/
 };
index 45d6cd307a5783d61a23c30badb98f197d98da7a..826a484fe9963c9ad74545d99702f29db81ad6c8 100644 (file)
@@ -86,6 +86,11 @@ config RT305X_MACH_V22RW_2X2
        select RALINK_DEV_GPIO_BUTTONS
        select RALINK_DEV_GPIO_LEDS
 
+config RT305X_MACH_WL341V3
+       bool "Sitecom WL-341 v3 board support"
+       select RALINK_DEV_GPIO_BUTTONS
+       select RALINK_DEV_GPIO_LEDS
+
 config RT305X_MACH_WL351
        bool "Sitecom WL-351 support"
        select RALINK_DEV_GPIO_BUTTONS
index 5a45412e5c4817b2055b13ca824a22670b6e1415..743493e80b37b3d11db9c3b8640a4dde6adb4685 100644 (file)
@@ -30,4 +30,5 @@ obj-$(CONFIG_RT305X_MACH_W502U)               += mach-w502u.o
 obj-$(CONFIG_RT305X_MACH_WCR150GN)     += mach-wcr150gn.o
 obj-$(CONFIG_RT305X_MACH_WHR_G300N)    += mach-whr-g300n.o
 obj-$(CONFIG_RT305X_MACH_WR512_3GN)    += mach-wr512-3gn.o
+obj-$(CONFIG_RT305X_MACH_WL341V3)      += mach-wl341v3.o
 obj-$(CONFIG_RT305X_MACH_WL351)                += mach-wl351.o
diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-wl341v3.c b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-wl341v3.c
new file mode 100644 (file)
index 0000000..9341be3
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ *  Sitecom WL341v3 board support
+ *
+ *  Copyright (C) 2012 Marco Antonio Mauro <marcus90@gmail.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License version 2 as published
+ *  by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/partitions.h>
+#include <linux/mtd/physmap.h>
+
+#include <asm/mach-ralink/machine.h>
+#include <asm/mach-ralink/dev-gpio-buttons.h>
+#include <asm/mach-ralink/dev-gpio-leds.h>
+#include <asm/mach-ralink/rt305x.h>
+#include <asm/mach-ralink/rt305x_regs.h>
+
+#include "devices.h"
+
+#define WL341V3_GPIO_LED_FIRST_AMBER   9
+#define WL341V3_GPIO_LED_FIRST_BLUE    13
+#define WL341V3_GPIO_LED_THIRD_AMBER   11
+#define WL341V3_GPIO_LED_THIRD_BLUE    14
+#define WL341V3_GPIO_LED_FOURTH_BLUE   10
+#define WL341V3_GPIO_LED_FIFTH_AMBER   12
+#define WL341V3_GPIO_LED_FIFTH_BLUE    8
+
+#define WL341V3_GPIO_BUTTON_WPS                5       /* active low */
+#define WL341V3_GPIO_BUTTON_RESET      7       /* active low */
+
+#define WL341V3_BUTTONS_POLL_INTERVAL  20
+
+#ifdef CONFIG_MTD_PARTITIONS
+static struct mtd_partition wl341v3_partitions[] = {
+       {
+               .name   = "u-boot",
+               .offset = 0,
+               .size   = 0x020000,
+               .mask_flags = MTD_WRITEABLE,
+       }, {
+               .name   = "board-nvram",
+               .offset = 0x020000,
+               .size   = 0x010000,
+               .mask_flags = MTD_WRITEABLE,
+       }, {
+               .name   = "u-boot-env",
+               .offset = 0x030000,
+               .size   = 0x010000,
+               .mask_flags = MTD_WRITEABLE,
+       }, {
+               .name   = "kernel",
+               .offset = 0x040000,
+               .size   = 0x0d0000,
+       }, {
+               .name   = "rootfs",
+               .offset = 0x110000,
+               .size   = 0x2e0000,
+       }, {
+               .name   = "signature-eRcOmM",
+               .offset = 0x3f0000,
+               .size   = 0x010000,
+       }, {
+               .name   = "firmware",
+               .offset = 0x040000,
+               .size   = 0x3b0000,
+       }, {
+               .name   = "fullflash",
+               .offset = 0x000000,
+               .size   = 0x400000,
+       }
+};
+#endif /* CONFIG_MTD_PARTITIONS */
+
+static struct physmap_flash_data wl341v3_flash_data = {
+#ifdef CONFIG_MTD_PARTITIONS
+       .nr_parts       = ARRAY_SIZE(wl341v3_partitions),
+       .parts          = wl341v3_partitions,
+#endif
+};
+
+static struct gpio_led wl341v3_leds_gpio[] __initdata = {
+       {
+               .name           = "wl341v3:amber:first",
+               .gpio           = WL341V3_GPIO_LED_FIRST_AMBER,
+               .active_low     = 1,
+       }, {
+               .name           = "wl341v3:blue:first",
+               .gpio           = WL341V3_GPIO_LED_FIRST_BLUE,
+               .active_low     = 1,
+       }, {
+               .name           = "wl341v3:amber:third",
+               .gpio           = WL341V3_GPIO_LED_THIRD_AMBER,
+               .active_low     = 1,
+       }, {
+               .name           = "wl341v3:blue:third",
+               .gpio           = WL341V3_GPIO_LED_THIRD_BLUE,
+               .active_low     = 1,
+       }, {
+               .name           = "wl341v3:blue:fourth",
+               .gpio           = WL341V3_GPIO_LED_FOURTH_BLUE,
+               .active_low     = 1,
+       }, {
+               .name           = "wl341v3:amber:fifth",
+               .gpio           = WL341V3_GPIO_LED_FIFTH_AMBER,
+               .active_low     = 1,
+       }, {
+               .name           = "wl341v3:blue:fifth",
+               .gpio           = WL341V3_GPIO_LED_FIFTH_BLUE,
+               .active_low     = 1,
+       }
+};
+
+static struct gpio_button wl341v3_gpio_buttons[] __initdata = {
+       {
+               .desc           = "reset",
+               .type           = EV_KEY,
+               .code           = KEY_RESTART,
+               .threshold      = 3,
+               .gpio           = WL341V3_GPIO_BUTTON_RESET,
+               .active_low     = 1,
+       }, {
+               .desc           = "wps",
+               .type           = EV_KEY,
+               .code           = KEY_WPS_BUTTON,
+               .threshold      = 3,
+               .gpio           = WL341V3_GPIO_BUTTON_WPS,
+               .active_low     = 1,
+       }
+};
+
+static void __init wl341v3_init(void)
+{
+       rt305x_gpio_init(RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT);
+
+       rt305x_register_flash(0, &wl341v3_flash_data);
+       rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_WLLLL;
+       rt305x_register_ethernet();
+       ramips_register_gpio_leds(-1, ARRAY_SIZE(wl341v3_leds_gpio),
+                                 wl341v3_leds_gpio);
+       ramips_register_gpio_buttons(-1, WL341V3_BUTTONS_POLL_INTERVAL,
+                                    ARRAY_SIZE(wl341v3_gpio_buttons),
+                                    wl341v3_gpio_buttons);
+       rt305x_register_wifi();
+       rt305x_register_wdt();
+       rt305x_register_usb();
+}
+
+MIPS_MACHINE(RAMIPS_MACH_WL341V3, "WL341V3", "Sitecom WL-341 v3",
+            wl341v3_init);
index c6b214ff36b2b1b183c5ccf55ef6bec22ee1fb2e..745edefbaeb593c18d5b7636bd40ccff5da1cfd5 100644 (file)
@@ -67,6 +67,28 @@ define BuildFirmware/Generic
        fi; fi
 endef
 
+define BuildFirmware/WL341V3
+       $(call PatchKernelLzma,$(2),$(3) $($(4)))
+       $(call MkImage,lzma,"$(KDIR)/vmlinux-$(2).bin.lzma","$(KDIR)/vmlinux-$(2).uImage")
+       if [ `stat -c%s "$(KDIR)/vmlinux-$(2).uImage"` -gt $(5) ]; then \
+               echo "Warning: $(KDIR)/vmlinux-$(2).uImage is too big"; \
+       else if [ `stat -c%s $(KDIR)/root.$(1)` -gt $(6) ]; then \
+               echo "Warning: $(KDIR)/root.$(1) is too big"; \
+       else \
+               ( \
+                       dd if=/dev/zero bs=195936 count=1; \
+                       echo "1.01"; \
+                       dd if=/dev/zero bs=581 count=1; \
+                       echo -n -e "\x73\x45\x72\x43\x6F\x4D\x6D\x00\x01\x00\x00\x59\x4E\x37\x95\x58\x10\x00\x20\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x03\x00\x00\x80\x00\x00\x00\x00\x03\x00\x00\x10\x12\x00\x00\x00\x10\x73\x45\x72\x43\x6F\x4D\x6D"; \
+                       dd if=/dev/zero bs=65552 count=1; \
+                       dd if=$(KDIR)/vmlinux-$(2).uImage bs=$(5) conv=sync; \
+                       dd if=$(KDIR)/root.$(1) bs=64k conv=sync; \
+                       dd if=/dev/zero bs=`expr 4194304 - 262144 - 16 - $(5) - \( \( \( \`stat -c%s $(KDIR)/root.$(1)\` / 65536 \) + 1 \) \* 65536 \)` count=1; \
+                       echo -n -e "\x11\x03\x80\x00\x10\x12\x90\xF7\x65\x52\x63\x4F\x6D\x4D\x00\x00"; \
+               ) > $(call imgname,$(1),$(2))-factory.bin; \
+       fi; fi
+endef
+
 define BuildFirmware/Buffalo
        $(call PatchKernelLzma,$(2),board=$(3) $($(4)))
        $(call MkImage,lzma,"$(KDIR)/vmlinux-$(2).bin.lzma","$(KDIR)/vmlinux-$(2).uImage")
@@ -151,6 +173,16 @@ define Image/Build/Template/OMNIEMB
        $(call BuildFirmware/Generic,$(1),$(2),board=$(3) console=$(console_OMNIEMB),mtdlayout_OMNIEMB,1048576,7012352)
 endef
 
+mtdlayout_sercomm_4M=mtdparts=physmap-flash.0:128k(u-boot)ro,64k(board-nvram)ro,64k(u-boot-env)ro,832k(kernel),2944k(rootfs),64k(signature-eRcOmM),3776k@0x40000(firmware),4096k@0x0(fullflash)
+define Image/Build/Template/WL341V3
+       $(call BuildFirmware/Generic,$(1),$(2),board=$(3),mtdlayout_sercomm_4M,851968,3014656)
+       $(call BuildFirmware/WL341V3,$(1),$(2),board=$(3),mtdlayout_sercomm_4M,851968,3014656)
+endef
+
+define Image/Build/Profile/WL341V3
+       $(call Image/Build/Template/WL341V3,$(1),wl341v3,WL341V3)
+endef
+
 define Image/Build/Profile/DIR300B1
        $(call Image/Build/Template/DIR300B1,$(1),dir-300-b1,DIR-300-B1,wrgn23_dlwbr_dir300b)
        $(call Image/Build/Template/DIR300B1,$(1),dir-600-b1,DIR-600-B1,wrgn23_dlwbr_dir600b)
@@ -294,6 +326,7 @@ define Image/Build/Profile/Default
        $(call Image/Build/Profile/MOFI35003GN,$(1))
        $(call Image/Build/Profile/W502U,$(1))
        $(call Image/Build/Profile/WR5123GN,$(1))
+       $(call Image/Build/Profile/WL341V3,$(1))
        $(call Image/Build/Profile/WL351,$(1))
 endef
 endif
index 891a421d2d1a7b546b57bf21312732e4968b0aed..e9ef379c07306b80661692fb2184c76c2c912e6f 100644 (file)
@@ -109,6 +109,7 @@ CONFIG_RT305X_MACH_V22RW_2X2=y
 CONFIG_RT305X_MACH_W502U=y
 CONFIG_RT305X_MACH_WCR150GN=y
 CONFIG_RT305X_MACH_WHR_G300N=y
+CONFIG_RT305X_MACH_WL341V3=y
 CONFIG_RT305X_MACH_WL351=y
 CONFIG_RT305X_MACH_WR512_3GN=y
 # CONFIG_SCSI_DMA is not set