From b3fdd931d1b0a992f8977cb7c86c1f9eb10872a7 Mon Sep 17 00:00:00 2001 From: Gabor Juhos Date: Thu, 26 Jan 2012 10:44:23 +0000 Subject: [PATCH] ramips: add support for Sitecom WL-341v3 and other Sercomm IP1006RRv2 boards 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 SVN-Revision: 29910 --- .../etc/hotplug.d/firmware/10-rt2x00-eeprom | 4 + .../base-files/etc/uci-defaults/network | 5 + .../base-files/lib/preinit/06_set_iface_mac | 4 + target/linux/ramips/base-files/lib/ramips.sh | 3 + .../ramips/base-files/lib/upgrade/platform.sh | 1 + .../mips/include/asm/mach-ralink/machine.h | 1 + .../files/arch/mips/ralink/rt305x/Kconfig | 5 + .../files/arch/mips/ralink/rt305x/Makefile | 1 + .../arch/mips/ralink/rt305x/mach-wl341v3.c | 154 ++++++++++++++++++ target/linux/ramips/image/Makefile | 33 ++++ target/linux/ramips/rt305x/config-2.6.39 | 1 + 11 files changed, 212 insertions(+) create mode 100644 target/linux/ramips/files/arch/mips/ralink/rt305x/mach-wl341v3.c diff --git a/target/linux/ramips/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom b/target/linux/ramips/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom index 9a714ddc69..ac97d037c1 100644 --- a/target/linux/ramips/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom +++ b/target/linux/ramips/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom @@ -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" ;; diff --git a/target/linux/ramips/base-files/etc/uci-defaults/network b/target/linux/ramips/base-files/etc/uci-defaults/network index cc5600bcfd..bce24e8432 100755 --- a/target/linux/ramips/base-files/etc/uci-defaults/network +++ b/target/linux/ramips/base-files/etc/uci-defaults/network @@ -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) ;; diff --git a/target/linux/ramips/base-files/lib/preinit/06_set_iface_mac b/target/linux/ramips/base-files/lib/preinit/06_set_iface_mac index 9a4d515b19..f6884c8477 100644 --- a/target/linux/ramips/base-files/lib/preinit/06_set_iface_mac +++ b/target/linux/ramips/base-files/lib/preinit/06_set_iface_mac @@ -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 } diff --git a/target/linux/ramips/base-files/lib/ramips.sh b/target/linux/ramips/base-files/lib/ramips.sh index ca9b3c9cfc..b3c54e82db 100755 --- a/target/linux/ramips/base-files/lib/ramips.sh +++ b/target/linux/ramips/base-files/lib/ramips.sh @@ -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" ;; diff --git a/target/linux/ramips/base-files/lib/upgrade/platform.sh b/target/linux/ramips/base-files/lib/upgrade/platform.sh index 30754b5c2f..494e774ef9 100755 --- a/target/linux/ramips/base-files/lib/upgrade/platform.sh +++ b/target/linux/ramips/base-files/lib/upgrade/platform.sh @@ -30,6 +30,7 @@ platform_check_image() { rt-n15 | \ w502u |\ v22rw-2x2 | \ + wl341v3 | \ wli-tx4-ag300n | \ whr-g300n |\ wr512-3gn) diff --git a/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/machine.h b/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/machine.h index 272e2b818e..bec6ff0bec 100644 --- a/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/machine.h +++ b/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/machine.h @@ -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*/ }; diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/Kconfig b/target/linux/ramips/files/arch/mips/ralink/rt305x/Kconfig index 45d6cd307a..826a484fe9 100644 --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/Kconfig +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/Kconfig @@ -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 diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/Makefile b/target/linux/ramips/files/arch/mips/ralink/rt305x/Makefile index 5a45412e5c..743493e80b 100644 --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/Makefile +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/Makefile @@ -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 index 0000000000..9341be3bee --- /dev/null +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-wl341v3.c @@ -0,0 +1,154 @@ +/* + * Sitecom WL341v3 board support + * + * Copyright (C) 2012 Marco Antonio Mauro + * + * 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 +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#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); diff --git a/target/linux/ramips/image/Makefile b/target/linux/ramips/image/Makefile index c6b214ff36..745edefbae 100644 --- a/target/linux/ramips/image/Makefile +++ b/target/linux/ramips/image/Makefile @@ -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 diff --git a/target/linux/ramips/rt305x/config-2.6.39 b/target/linux/ramips/rt305x/config-2.6.39 index 891a421d2d..e9ef379c07 100644 --- a/target/linux/ramips/rt305x/config-2.6.39 +++ b/target/linux/ramips/rt305x/config-2.6.39 @@ -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 -- 2.25.1