Patchwork [OpenWrt-Devel] ramips: rt305x: add add support for the Asus WL-330N3G board

login
register
Submitter Frédéric Leroy
Date 2012-04-22 09:31:02
Message ID <1335087062-14670-1-git-send-email-fredo@starox.org>
Download mbox | patch
Permalink /patch/2113/
State Accepted
Delegated to: Gabor Juhos
Headers show

Comments

Frédéric Leroy - 2012-04-22 09:31:02
This patch adds support for the ASUS WL-330N3G

Comparing to the WL-330N, It have 32MB ram, usb support and a bicolor led.

The bi-color led is driven by 2 gpio.
I don't know how to handle this, so I simply made 2 leds : one red, one blue. 
But the red light takes precedence over the blue one according to the chart below.

r = led is red
b = led is blue
0 = led is off

xy= x->r for red, b for blue led, y->value of brightness in /sys/class/leds/x/brughtness

initial state	action	 led	gpio state

r0	b0	r0->r1	 r  	r0	b0
r0	b0	b0->b1   b	r0	b1

r1	b0	r1->r0	 0	r0	b0
r1	b0	b0->b1	 r	r1	*b1*

r1	b1	r1->r0   b	r0	b1
r1	b1	b1->b0   r	r1	b0

r0	b1	r0->r1   r	r1	*b1*
r0	b1	b1->b0   0	r0	r0

Signed-off-by: Frédéric Leroy <fredo@starox.org>
---
 target/linux/ramips/base-files/etc/diag.sh         |    2 +-
 .../etc/hotplug.d/firmware/10-rt2x00-eeprom        |    1 +
 .../ramips/base-files/lib/preinit/06_set_iface_mac |    1 +
 target/linux/ramips/base-files/lib/ramips.sh       |    3 +
 .../arch/mips/include/asm/mach-ralink/machine.h    |    1 +
 .../ramips/files/arch/mips/ralink/rt305x/Kconfig   |    5 +
 .../ramips/files/arch/mips/ralink/rt305x/Makefile  |    1 +
 .../files/arch/mips/ralink/rt305x/mach-wl-330n3g.c |  100 ++++++++++++++++++++
 target/linux/ramips/image/Makefile                 |    5 +
 target/linux/ramips/rt305x/config-3.2              |    1 +
 10 files changed, 119 insertions(+), 1 deletions(-)
 create mode 100644 target/linux/ramips/files/arch/mips/ralink/rt305x/mach-wl-330n3g.c
Gabor Juhos - 2012-04-23 17:32:31
2012.04.22. 11:31 keltezéssel, Frédéric Leroy írta:
> This patch adds support for the ASUS WL-330N3G
> 
> Comparing to the WL-330N, It have 32MB ram, usb support and a bicolor led.
> 
> The bi-color led is driven by 2 gpio.
> I don't know how to handle this, so I simply made 2 leds : one red, one blue. 
> But the red light takes precedence over the blue one according to the chart below.
> 
> r = led is red
> b = led is blue
> 0 = led is off
> 
> xy= x->r for red, b for blue led, y->value of brightness in /sys/class/leds/x/brughtness
> 
> initial state	action	 led	gpio state
> 
> r0	b0	r0->r1	 r  	r0	b0
> r0	b0	b0->b1   b	r0	b1
> 
> r1	b0	r1->r0	 0	r0	b0
> r1	b0	b0->b1	 r	r1	*b1*
> 
> r1	b1	r1->r0   b	r0	b1
> r1	b1	b1->b0   r	r1	b0
> 
> r0	b1	r0->r1   r	r1	*b1*
> r0	b1	b1->b0   0	r0	r0
> 
> Signed-off-by: Frédéric Leroy <fredo@starox.org>

Applied.

Thanks,
Gabor
LEO Airwarosu Yoichi Shinoda - 2012-05-18 05:25:33
Hi.

It looks like the current ramips config only generates sysupgrade.bin version
of the image for WL-330N3G. Is there any pointer to an write-up describing
how to put this image into the real hw?

Any info would be appreciated.

Thanks in advance.

--- shinoda

On 2012/04/22, at 18:31, Frédéric Leroy wrote:

> This patch adds support for the ASUS WL-330N3G
> 
> Comparing to the WL-330N, It have 32MB ram, usb support and a bicolor led.
> 
> The bi-color led is driven by 2 gpio.
> I don't know how to handle this, so I simply made 2 leds : one red, one blue. 
> But the red light takes precedence over the blue one according to the chart below.
> 
> r = led is red
> b = led is blue
> 0 = led is off
> 
> xy= x->r for red, b for blue led, y->value of brightness in /sys/class/leds/x/brughtness
> 
> initial state	action	 led	gpio state
> 
> r0	b0	r0->r1	 r  	r0	b0
> r0	b0	b0->b1   b	r0	b1
> 
> r1	b0	r1->r0	 0	r0	b0
> r1	b0	b0->b1	 r	r1	*b1*
> 
> r1	b1	r1->r0   b	r0	b1
> r1	b1	b1->b0   r	r1	b0
> 
> r0	b1	r0->r1   r	r1	*b1*
> r0	b1	b1->b0   0	r0	r0
> 
> Signed-off-by: Frédéric Leroy <fredo@starox.org>
> ---
> target/linux/ramips/base-files/etc/diag.sh         |    2 +-
> .../etc/hotplug.d/firmware/10-rt2x00-eeprom        |    1 +
> .../ramips/base-files/lib/preinit/06_set_iface_mac |    1 +
> target/linux/ramips/base-files/lib/ramips.sh       |    3 +
> .../arch/mips/include/asm/mach-ralink/machine.h    |    1 +
> .../ramips/files/arch/mips/ralink/rt305x/Kconfig   |    5 +
> .../ramips/files/arch/mips/ralink/rt305x/Makefile  |    1 +
> .../files/arch/mips/ralink/rt305x/mach-wl-330n3g.c |  100 ++++++++++++++++++++
> target/linux/ramips/image/Makefile                 |    5 +
> target/linux/ramips/rt305x/config-3.2              |    1 +
> 10 files changed, 119 insertions(+), 1 deletions(-)
> create mode 100644 target/linux/ramips/files/arch/mips/ralink/rt305x/mach-wl-330n3g.c
> 
> diff --git a/target/linux/ramips/base-files/etc/diag.sh b/target/linux/ramips/base-files/etc/diag.sh
> index 95f608a..aa02721 100755
> --- a/target/linux/ramips/base-files/etc/diag.sh
> +++ b/target/linux/ramips/base-files/etc/diag.sh
> @@ -69,7 +69,7 @@ get_status_led() {
> 	rt-n10-plus)
> 		status_led="asus:green:wps"
> 		;;
> -	rt-n56u | wl-330n )
> +	rt-n56u | wl-330n | wl-330n3g)
> 		status_led="asus:blue:power"
> 		;;
> 	sl-r7205)
> 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 62788cd..3a602f7 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
> @@ -69,6 +69,7 @@ case "$FIRMWARE" in
> 	wcr-150gn | \
> 	whr-g300n | \
> 	wl-330n | \
> +	wl-330n3g | \
> 	wl-351 | \
> 	wli-tx4-ag300n | \
> 	wr512-3gn | \
> 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 f523d69..131c9ba 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
> @@ -30,6 +30,7 @@ preinit_set_mac_address() {
> 	omni-emb |\
> 	w502u    |\
> 	wl-330n |\
> +	wl-330n3g |\
> 	wr6202 |\
> 	xdxrn502j)
> 		mac=$(ramips_get_mac_binary factory 40)
> diff --git a/target/linux/ramips/base-files/lib/ramips.sh b/target/linux/ramips/base-files/lib/ramips.sh
> index 1298ebd..801a134 100755
> --- a/target/linux/ramips/base-files/lib/ramips.sh
> +++ b/target/linux/ramips/base-files/lib/ramips.sh
> @@ -59,6 +59,9 @@ ramips_board_name() {
> 	*"Asus WL-330N")
> 		name="wl-330n"
> 		;;
> +	*"Asus WL-330N3G")
> +		name="wl-330n3g"
> +		;;
> 	*"Aztech HW550-3G")
> 		name="hw550-3g"
> 		;;
> 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 c2ec146..46a091b 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
> @@ -30,6 +30,7 @@ enum ramips_mach_type {
> 	RAMIPS_MACH_RT_N10_PLUS,	/* Asus RT-N10+ */
> 	RAMIPS_MACH_NW718,		/* Netcore NW718 */
> 	RAMIPS_MACH_WL_330N,		/* Asus WL-330N */
> +	RAMIPS_MACH_WL_330N3G,		/* Asus WL-330N3G */
> 
> 	/* RT3052 based machines */
> 	RAMIPS_MACH_ARGUS_ATP52B,	/* Argus ATP-52B */
> diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/Kconfig b/target/linux/ramips/files/arch/mips/ralink/rt305x/Kconfig
> index ef4ddf4..5c86de3 100644
> --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/Kconfig
> +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/Kconfig
> @@ -36,6 +36,11 @@ config RT305X_MACH_WL_330N
> 	select RALINK_DEV_GPIO_BUTTONS
> 	select RALINK_DEV_GPIO_LEDS
> 
> +config RT305X_MACH_WL_330N3G
> +	bool "Asus WL-330N3G board support"
> +	select RALINK_DEV_GPIO_BUTTONS
> +	select RALINK_DEV_GPIO_LEDS
> +
> config RT305X_MACH_HW550_3G
> 	bool "Aztech HW550-3G 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 0336936..5230e95 100644
> --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/Makefile
> +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/Makefile
> @@ -34,6 +34,7 @@ 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_WL_330N)	+= mach-wl-330n.o
> +obj-$(CONFIG_RT305X_MACH_WL_330N3G)	+= mach-wl-330n3g.o
> obj-$(CONFIG_RT305X_MACH_WL341V3)	+= mach-wl341v3.o
> obj-$(CONFIG_RT305X_MACH_WL351)		+= mach-wl351.o
> obj-$(CONFIG_RT305X_MACH_WR6202)	+= mach-wr6202.o
> diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-wl-330n3g.c b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-wl-330n3g.c
> new file mode 100644
> index 0000000..07ca5a8
> --- /dev/null
> +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-wl-330n3g.c
> @@ -0,0 +1,100 @@
> +/*
> + *  Asus WL_330N3G board support
> + *
> + *  Copyright (C) 2012 Frederic Leroy <fredo@starox.org>
> + *
> + *  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/spi/spi.h>
> +#include <linux/spi/flash.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 WL_330N3G_GPIO_BUTTON_RESET 10
> +#define WL_330N3G_GPIO_BUTTON_WPS 0
> +#define WL_330N3G_GPIO_LED_3G_BLUE 9
> +#define WL_330N3G_GPIO_LED_3G_RED 13
> +#define WL_330N3G_GPIO_LED_POWER 11
> +#define WL_330N3G_KEYS_POLL_INTERVAL 20
> +#define WL_330N3G_KEYS_DEBOUNCE_INTERVAL	(3 * WL_330N3G_KEYS_POLL_INTERVAL)
> +
> +const struct flash_platform_data wl_330n3g_flash = {
> +	.type		= "mx25l3205d",
> +};
> +
> +struct spi_board_info wl_330n3g_spi_slave_info[] __initdata = {
> +	{
> +		.modalias	= "m25p80",
> +		.platform_data	= &wl_330n3g_flash,
> +		.irq		= -1,
> +		.max_speed_hz	= 10000000,
> +		.bus_num	= 0,
> +		.chip_select	= 0,
> +	},
> +};
> +
> +static struct gpio_keys_button wl_330n3g_gpio_buttons[] __initdata = {
> +	{
> +		.desc		= "reset",
> +		.type		= EV_KEY,
> +		.code		= KEY_RESTART,
> +		.debounce_interval = WL_330N3G_KEYS_DEBOUNCE_INTERVAL,
> +		.gpio		= WL_330N3G_GPIO_BUTTON_RESET,
> +		.active_low	= 1,
> +	},
> +	{
> +		.desc		= "wps",
> +		.type		= EV_KEY,
> +		.code		= KEY_RESTART,
> +		.debounce_interval = WL_330N3G_KEYS_DEBOUNCE_INTERVAL,
> +		.gpio		= WL_330N3G_GPIO_BUTTON_WPS,
> +		.active_low	= 1,
> +	}
> +};
> +
> +static struct gpio_led wl_330n3g_leds_gpio[] __initdata = {
> +	{
> +		.name		= "asus:blue:3g",
> +		.gpio		= WL_330N3G_GPIO_LED_3G_BLUE,
> +		.active_low	= 1,
> +	}, {
> +		.name		= "asus:red:3g",
> +		.gpio		= WL_330N3G_GPIO_LED_3G_RED,
> +		.active_low	= 1,
> +	}, {
> +		.name		= "asus:blue:power",
> +		.gpio		= WL_330N3G_GPIO_LED_POWER,
> +		.active_low	= 1,
> +	}
> +};
> +
> +static void __init wl_330n3g_init(void)
> +{
> +	rt305x_gpio_init(RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT);
> +	rt305x_register_spi(wl_330n3g_spi_slave_info,
> +			    ARRAY_SIZE(wl_330n3g_spi_slave_info));
> +	rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_WLLLL;
> +	rt305x_register_ethernet();
> +	ramips_register_gpio_leds(-1, ARRAY_SIZE(wl_330n3g_leds_gpio),
> +				  wl_330n3g_leds_gpio);
> +	ramips_register_gpio_buttons(-1, WL_330N3G_KEYS_POLL_INTERVAL,
> +				     ARRAY_SIZE(wl_330n3g_gpio_buttons),
> +				     wl_330n3g_gpio_buttons);
> +	rt305x_register_wifi();
> +	rt305x_register_usb();
> +	rt305x_register_wdt();
> +}
> +
> +MIPS_MACHINE(RAMIPS_MACH_WL_330N3G, "WL_330N3G", "Asus WL-330N3G",
> +	     wl_330n3g_init);
> diff --git a/target/linux/ramips/image/Makefile b/target/linux/ramips/image/Makefile
> index 0c37f7e..11c08de 100644
> --- a/target/linux/ramips/image/Makefile
> +++ b/target/linux/ramips/image/Makefile
> @@ -387,6 +387,10 @@ define Image/Build/Profile/WL_330N
> 	$(call Image/Build/Template/$(fs_squash)/$(1),GENERIC_4M,wl-330n,WL_330N,ttyS1,57600,spi)
> endef
> 
> +define Image/Build/Profile/WL_330N3G
> +	$(call Image/Build/Template/$(fs_squash)/$(1),GENERIC_4M,wl-330n3g,WL_330N3G,ttyS1,57600,spi)
> +endef
> +
> define Image/Build/Profile/WL341V3
> 	$(call Image/Build/Template/$(fs_squash)/$(1),WL341V3,wl341v3,WL341V3)
> endef
> @@ -432,6 +436,7 @@ define Image/Build/Profile/Default
> 	$(call Image/Build/Profile/WCR150GN,$(1))
> 	$(call Image/Build/Profile/WHRG300N,$(1))
> 	$(call Image/Build/Profile/WL_330N,$(1))
> +	$(call Image/Build/Profile/WL_330N3G,$(1))
> 	$(call Image/Build/Profile/WL341V3,$(1))
> 	$(call Image/Build/Profile/WL351,$(1))
> 	$(call Image/Build/Profile/WR5123GN,$(1))
> diff --git a/target/linux/ramips/rt305x/config-3.2 b/target/linux/ramips/rt305x/config-3.2
> index 993cc5a..a5c9c34 100644
> --- a/target/linux/ramips/rt305x/config-3.2
> +++ b/target/linux/ramips/rt305x/config-3.2
> @@ -117,6 +117,7 @@ CONFIG_RT305X_MACH_WHR_G300N=y
> CONFIG_RT305X_MACH_WL341V3=y
> CONFIG_RT305X_MACH_WL351=y
> CONFIG_RT305X_MACH_WL_330N=y
> +CONFIG_RT305X_MACH_WL_330N3G=y
> CONFIG_RT305X_MACH_WR512_3GN=y
> CONFIG_RT305X_MACH_WR6202=y
> CONFIG_RT305X_MACH_XDX_RN502J=y
> -- 
> 1.7.3.4
> 
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel@lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Patch

diff --git a/target/linux/ramips/base-files/etc/diag.sh b/target/linux/ramips/base-files/etc/diag.sh
index 95f608a..aa02721 100755
--- a/target/linux/ramips/base-files/etc/diag.sh
+++ b/target/linux/ramips/base-files/etc/diag.sh
@@ -69,7 +69,7 @@  get_status_led() {
 	rt-n10-plus)
 		status_led="asus:green:wps"
 		;;
-	rt-n56u | wl-330n )
+	rt-n56u | wl-330n | wl-330n3g)
 		status_led="asus:blue:power"
 		;;
 	sl-r7205)
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 62788cd..3a602f7 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
@@ -69,6 +69,7 @@  case "$FIRMWARE" in
 	wcr-150gn | \
 	whr-g300n | \
 	wl-330n | \
+	wl-330n3g | \
 	wl-351 | \
 	wli-tx4-ag300n | \
 	wr512-3gn | \
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 f523d69..131c9ba 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
@@ -30,6 +30,7 @@  preinit_set_mac_address() {
 	omni-emb |\
 	w502u    |\
 	wl-330n |\
+	wl-330n3g |\
 	wr6202 |\
 	xdxrn502j)
 		mac=$(ramips_get_mac_binary factory 40)
diff --git a/target/linux/ramips/base-files/lib/ramips.sh b/target/linux/ramips/base-files/lib/ramips.sh
index 1298ebd..801a134 100755
--- a/target/linux/ramips/base-files/lib/ramips.sh
+++ b/target/linux/ramips/base-files/lib/ramips.sh
@@ -59,6 +59,9 @@  ramips_board_name() {
 	*"Asus WL-330N")
 		name="wl-330n"
 		;;
+	*"Asus WL-330N3G")
+		name="wl-330n3g"
+		;;
 	*"Aztech HW550-3G")
 		name="hw550-3g"
 		;;
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 c2ec146..46a091b 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
@@ -30,6 +30,7 @@  enum ramips_mach_type {
 	RAMIPS_MACH_RT_N10_PLUS,	/* Asus RT-N10+ */
 	RAMIPS_MACH_NW718,		/* Netcore NW718 */
 	RAMIPS_MACH_WL_330N,		/* Asus WL-330N */
+	RAMIPS_MACH_WL_330N3G,		/* Asus WL-330N3G */
 
 	/* RT3052 based machines */
 	RAMIPS_MACH_ARGUS_ATP52B,	/* Argus ATP-52B */
diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/Kconfig b/target/linux/ramips/files/arch/mips/ralink/rt305x/Kconfig
index ef4ddf4..5c86de3 100644
--- a/target/linux/ramips/files/arch/mips/ralink/rt305x/Kconfig
+++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/Kconfig
@@ -36,6 +36,11 @@  config RT305X_MACH_WL_330N
 	select RALINK_DEV_GPIO_BUTTONS
 	select RALINK_DEV_GPIO_LEDS
 
+config RT305X_MACH_WL_330N3G
+	bool "Asus WL-330N3G board support"
+	select RALINK_DEV_GPIO_BUTTONS
+	select RALINK_DEV_GPIO_LEDS
+
 config RT305X_MACH_HW550_3G
 	bool "Aztech HW550-3G 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 0336936..5230e95 100644
--- a/target/linux/ramips/files/arch/mips/ralink/rt305x/Makefile
+++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/Makefile
@@ -34,6 +34,7 @@  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_WL_330N)	+= mach-wl-330n.o
+obj-$(CONFIG_RT305X_MACH_WL_330N3G)	+= mach-wl-330n3g.o
 obj-$(CONFIG_RT305X_MACH_WL341V3)	+= mach-wl341v3.o
 obj-$(CONFIG_RT305X_MACH_WL351)		+= mach-wl351.o
 obj-$(CONFIG_RT305X_MACH_WR6202)	+= mach-wr6202.o
diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-wl-330n3g.c b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-wl-330n3g.c
new file mode 100644
index 0000000..07ca5a8
--- /dev/null
+++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-wl-330n3g.c
@@ -0,0 +1,100 @@ 
+/*
+ *  Asus WL_330N3G board support
+ *
+ *  Copyright (C) 2012 Frederic Leroy <fredo@starox.org>
+ *
+ *  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/spi/spi.h>
+#include <linux/spi/flash.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 WL_330N3G_GPIO_BUTTON_RESET 10
+#define WL_330N3G_GPIO_BUTTON_WPS 0
+#define WL_330N3G_GPIO_LED_3G_BLUE 9
+#define WL_330N3G_GPIO_LED_3G_RED 13
+#define WL_330N3G_GPIO_LED_POWER 11
+#define WL_330N3G_KEYS_POLL_INTERVAL 20
+#define WL_330N3G_KEYS_DEBOUNCE_INTERVAL	(3 * WL_330N3G_KEYS_POLL_INTERVAL)
+
+const struct flash_platform_data wl_330n3g_flash = {
+	.type		= "mx25l3205d",
+};
+
+struct spi_board_info wl_330n3g_spi_slave_info[] __initdata = {
+	{
+		.modalias	= "m25p80",
+		.platform_data	= &wl_330n3g_flash,
+		.irq		= -1,
+		.max_speed_hz	= 10000000,
+		.bus_num	= 0,
+		.chip_select	= 0,
+	},
+};
+
+static struct gpio_keys_button wl_330n3g_gpio_buttons[] __initdata = {
+	{
+		.desc		= "reset",
+		.type		= EV_KEY,
+		.code		= KEY_RESTART,
+		.debounce_interval = WL_330N3G_KEYS_DEBOUNCE_INTERVAL,
+		.gpio		= WL_330N3G_GPIO_BUTTON_RESET,
+		.active_low	= 1,
+	},
+	{
+		.desc		= "wps",
+		.type		= EV_KEY,
+		.code		= KEY_RESTART,
+		.debounce_interval = WL_330N3G_KEYS_DEBOUNCE_INTERVAL,
+		.gpio		= WL_330N3G_GPIO_BUTTON_WPS,
+		.active_low	= 1,
+	}
+};
+
+static struct gpio_led wl_330n3g_leds_gpio[] __initdata = {
+	{
+		.name		= "asus:blue:3g",
+		.gpio		= WL_330N3G_GPIO_LED_3G_BLUE,
+		.active_low	= 1,
+	}, {
+		.name		= "asus:red:3g",
+		.gpio		= WL_330N3G_GPIO_LED_3G_RED,
+		.active_low	= 1,
+	}, {
+		.name		= "asus:blue:power",
+		.gpio		= WL_330N3G_GPIO_LED_POWER,
+		.active_low	= 1,
+	}
+};
+
+static void __init wl_330n3g_init(void)
+{
+	rt305x_gpio_init(RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT);
+	rt305x_register_spi(wl_330n3g_spi_slave_info,
+			    ARRAY_SIZE(wl_330n3g_spi_slave_info));
+	rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_WLLLL;
+	rt305x_register_ethernet();
+	ramips_register_gpio_leds(-1, ARRAY_SIZE(wl_330n3g_leds_gpio),
+				  wl_330n3g_leds_gpio);
+	ramips_register_gpio_buttons(-1, WL_330N3G_KEYS_POLL_INTERVAL,
+				     ARRAY_SIZE(wl_330n3g_gpio_buttons),
+				     wl_330n3g_gpio_buttons);
+	rt305x_register_wifi();
+	rt305x_register_usb();
+	rt305x_register_wdt();
+}
+
+MIPS_MACHINE(RAMIPS_MACH_WL_330N3G, "WL_330N3G", "Asus WL-330N3G",
+	     wl_330n3g_init);
diff --git a/target/linux/ramips/image/Makefile b/target/linux/ramips/image/Makefile
index 0c37f7e..11c08de 100644
--- a/target/linux/ramips/image/Makefile
+++ b/target/linux/ramips/image/Makefile
@@ -387,6 +387,10 @@  define Image/Build/Profile/WL_330N
 	$(call Image/Build/Template/$(fs_squash)/$(1),GENERIC_4M,wl-330n,WL_330N,ttyS1,57600,spi)
 endef
 
+define Image/Build/Profile/WL_330N3G
+	$(call Image/Build/Template/$(fs_squash)/$(1),GENERIC_4M,wl-330n3g,WL_330N3G,ttyS1,57600,spi)
+endef
+
 define Image/Build/Profile/WL341V3
 	$(call Image/Build/Template/$(fs_squash)/$(1),WL341V3,wl341v3,WL341V3)
 endef
@@ -432,6 +436,7 @@  define Image/Build/Profile/Default
 	$(call Image/Build/Profile/WCR150GN,$(1))
 	$(call Image/Build/Profile/WHRG300N,$(1))
 	$(call Image/Build/Profile/WL_330N,$(1))
+	$(call Image/Build/Profile/WL_330N3G,$(1))
 	$(call Image/Build/Profile/WL341V3,$(1))
 	$(call Image/Build/Profile/WL351,$(1))
 	$(call Image/Build/Profile/WR5123GN,$(1))
diff --git a/target/linux/ramips/rt305x/config-3.2 b/target/linux/ramips/rt305x/config-3.2
index 993cc5a..a5c9c34 100644
--- a/target/linux/ramips/rt305x/config-3.2
+++ b/target/linux/ramips/rt305x/config-3.2
@@ -117,6 +117,7 @@  CONFIG_RT305X_MACH_WHR_G300N=y
 CONFIG_RT305X_MACH_WL341V3=y
 CONFIG_RT305X_MACH_WL351=y
 CONFIG_RT305X_MACH_WL_330N=y
+CONFIG_RT305X_MACH_WL_330N3G=y
 CONFIG_RT305X_MACH_WR512_3GN=y
 CONFIG_RT305X_MACH_WR6202=y
 CONFIG_RT305X_MACH_XDX_RN502J=y