[OpenWrt-Devel] [PATCH 4/6] [kernel] ath79: all LEDs and buttons for Netgear WNR2000v3

Michal Cieslakiewicz michal.cieslakiewicz at wp.pl
Wed Jan 20 18:12:41 EST 2016


From: Michal Cieslakiewicz <michal.cieslakiewicz at wp.pl>

This patch provides full GPIO support for WNR2000v3 (LEDs and buttons).
It exposes all LEDs to operating system, including Ethernet ones.

Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz at wp.pl>

---

This patch contains correct definitions of all LEDs and buttons for WNR2000v3,
both platform (attached to SoC) and additional ones (connected with wireless
chip). Extra name field is reserved for WLAN LED that is handled in a special
way by ath9k module - now it follows 'vendor:colour:function' scheme instead
of generic 'ath9k-phyX' name.

Based on analysis of GPL'ed u-boot sources from Netgear site, AR7241 chip is
reprogrammed to drive LEDs instead of JTAG and release control of Ethernet
lights to operating system. Default OpenWRT configuration is in place.

This patch requires kernel source with 3 earlier patches from this set applied:
* ath9k: enable GPIO access for ar9287 and ar9285
* ath9k: be verbose if platform-supplied hardware MAC is used
* ath79: new functions for passing GPIO data to wireless module


 base-files/etc/board.d/01_leds          |   14 +++
 base-files/etc/diag.sh                  |    1 
 files/arch/mips/ath79/mach-wnr2000-v3.c |  137 +++++++++++++++++++++++++++++---
 3 files changed, 142 insertions(+), 10 deletions(-)


diff -pruN a/openwrt/target/linux/ar71xx/base-files/etc/board.d/01_leds b/openwrt/target/linux/ar71xx/base-files/etc/board.d/01_leds
--- a/openwrt/target/linux/ar71xx/base-files/etc/board.d/01_leds	2016-01-20 19:52:14.684729838 +0100
+++ b/openwrt/target/linux/ar71xx/base-files/etc/board.d/01_leds	2016-01-20 19:52:14.548737868 +0100
@@ -676,6 +676,20 @@ wlae-ag300n)
 	ucidef_set_led_netdev "wireless" "WIRELESS" "buffalo:green:wireless" "wlan0"
 	;;
 
+wnr2000-v3)
+	ucidef_set_led_netdev "wan-green" "WAN (green)" "netgear:green:wan" "eth0"
+	ucidef_set_led_default "wan-amber" "WAN (amber)" "netgear:amber:wan" "0"
+	ucidef_set_led_netdev "wlan" "WLAN" "netgear:blue:wlan" "wlan0"
+	ucidef_set_led_switch "lan1green" "LAN1 (green)" "netgear:green:lan1" "switch0" "0x02"
+	ucidef_set_led_switch "lan2green" "LAN2 (green)" "netgear:green:lan2" "switch0" "0x04"
+	ucidef_set_led_switch "lan3green" "LAN3 (green)" "netgear:green:lan3" "switch0" "0x08"
+	ucidef_set_led_switch "lan4green" "LAN4 (green)" "netgear:green:lan4" "switch0" "0x10"
+	ucidef_set_led_default "lan1amber" "LAN1 (amber)" "netgear:amber:lan1" "0"
+	ucidef_set_led_default "lan2amber" "LAN2 (amber)" "netgear:amber:lan2" "0"
+	ucidef_set_led_default "lan3amber" "LAN3 (amber)" "netgear:amber:lan3" "0"
+	ucidef_set_led_default "lan4amber" "LAN4 (amber)" "netgear:amber:lan4" "0"
+	;;
+
 wnr2000-v4)
 	ucidef_set_led_netdev "wan" "WAN" "netgear:green:wan" "eth0"
 	ucidef_set_led_netdev "wlan" "WLAN" "netgear:blue:wlan" "wlan0"
diff -pruN a/openwrt/target/linux/ar71xx/base-files/etc/diag.sh b/openwrt/target/linux/ar71xx/base-files/etc/diag.sh
--- a/openwrt/target/linux/ar71xx/base-files/etc/diag.sh	2016-01-20 19:52:14.667730841 +0100
+++ b/openwrt/target/linux/ar71xx/base-files/etc/diag.sh	2016-01-20 19:52:14.531738872 +0100
@@ -368,6 +368,7 @@ get_status_led() {
 	wndr3700v4 | \
 	wndr4300 | \
 	wnr2000 | \
+	wnr2000-v3 |\
 	wnr2200 |\
 	wnr612-v2 |\
 	wnr1000-v2 |\
diff -pruN a/openwrt/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c b/openwrt/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c
--- a/openwrt/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c	2016-01-20 19:52:14.724727476 +0100
+++ b/openwrt/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c	2016-01-20 19:52:14.591735329 +0100
@@ -14,6 +14,7 @@
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
+#include <linux/platform_device.h>
 
 #include <asm/mach-ath79/ath79.h>
 #include <asm/mach-ath79/ar71xx_regs.h> /* needed to disable switch LEDs */
@@ -26,11 +27,25 @@
 #include "dev-m25p80.h"
 #include "machtypes.h"
 
+/* ar7142 GPIOs */
 #define WNR2000V3_GPIO_LED_WAN_GREEN	0
 #define WNR2000V3_GPIO_LED_LAN1_AMBER	1
-#define WNR2000V3_GPIO_LED_LAN4_AMBER	12
-#define WNR2000V3_GPIO_LED_PWR_GREEN	14
+#define WNR2000V3_GPIO_LED_LAN2_AMBER	6
+#define WNR2000V3_GPIO_LED_WPS_GREEN	7
+#define WNR2000V3_GPIO_LED_LAN3_AMBER	8
 #define WNR2000V3_GPIO_BTN_WPS		11
+#define WNR2000V3_GPIO_LED_LAN4_AMBER	12
+#define WNR2000V3_GPIO_LED_LAN1_GREEN	13
+#define WNR2000V3_GPIO_LED_LAN2_GREEN	14
+#define WNR2000V3_GPIO_LED_LAN3_GREEN	15
+#define WNR2000V3_GPIO_LED_LAN4_GREEN	16
+#define WNR2000V3_GPIO_LED_WAN_AMBER	17
+/* ar9287 GPIOs */
+#define WNR2000V3_GPIO_WMAC_LED_WLAN_BLUE	1
+#define WNR2000V3_GPIO_WMAC_LED_TEST_AMBER	2
+#define WNR2000V3_GPIO_WMAC_LED_POWER_GREEN	3
+#define WNR2000V3_GPIO_WMAC_BTN_RESET		8
+#define WNR2000V3_GPIO_WMAC_BTN_RFKILL		9
 
 #define WNR612V2_GPIO_LED_PWR_GREEN	11
 
@@ -69,16 +84,67 @@
 
 static struct gpio_led wnr2000v3_leds_gpio[] __initdata = {
 	{
-		.name		= "wnr2000v3:green:power",
-		.gpio		= WNR2000V3_GPIO_LED_PWR_GREEN,
+		.name		= "netgear:green:wan",
+		.gpio		= WNR2000V3_GPIO_LED_WAN_GREEN,
 		.active_low	= 1,
 	}, {
-		.name		= "wnr2000v3:green:wan",
-		.gpio		= WNR2000V3_GPIO_LED_WAN_GREEN,
+		.name		= "netgear:amber:lan1",
+		.gpio		= WNR2000V3_GPIO_LED_LAN1_AMBER,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:amber:lan2",
+		.gpio		= WNR2000V3_GPIO_LED_LAN2_AMBER,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:amber:lan3",
+		.gpio		= WNR2000V3_GPIO_LED_LAN3_AMBER,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:amber:lan4",
+		.gpio		= WNR2000V3_GPIO_LED_LAN4_AMBER,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:green:wps",
+		.gpio		= WNR2000V3_GPIO_LED_WPS_GREEN,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:green:lan1",
+		.gpio		= WNR2000V3_GPIO_LED_LAN1_GREEN,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:green:lan2",
+		.gpio		= WNR2000V3_GPIO_LED_LAN2_GREEN,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:green:lan3",
+		.gpio		= WNR2000V3_GPIO_LED_LAN3_GREEN,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:green:lan4",
+		.gpio		= WNR2000V3_GPIO_LED_LAN4_GREEN,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:amber:wan",
+		.gpio		= WNR2000V3_GPIO_LED_WAN_AMBER,
+		.active_low	= 1,
+	}
+};
+
+static struct gpio_led wnr2000v3_wmac_leds_gpio[] = {
+	{
+		.name		= "netgear:green:power",
+		.gpio		= WNR2000V3_GPIO_WMAC_LED_POWER_GREEN,
+		.active_low	= 1,
+		.default_state	= LEDS_GPIO_DEFSTATE_ON,
+	}, {
+		.name		= "netgear:amber:test",
+		.gpio		= WNR2000V3_GPIO_WMAC_LED_TEST_AMBER,
 		.active_low	= 1,
 	}
 };
 
+static const char *wnr2000v3_wmac_led_name = "netgear:blue:wlan";
+
 static struct gpio_led wnr612v2_leds_gpio[] __initdata = {
 	{
 		.name		= "netgear:green:power",
@@ -171,13 +237,32 @@ static struct gpio_led wpn824n_wmac_leds
 	}
 };
 
-static struct gpio_keys_button wnr2000v3_gpio_keys[] __initdata = {
+static struct gpio_keys_button wnr2000v3_keys_gpio[] __initdata = {
 	{
 		.desc		= "wps",
 		.type		= EV_KEY,
 		.code		= KEY_WPS_BUTTON,
 		.debounce_interval = WNR2000V3_KEYS_DEBOUNCE_INTERVAL,
 		.gpio		= WNR2000V3_GPIO_BTN_WPS,
+		.active_low	= 1,
+	}
+};
+
+static struct gpio_keys_button wnr2000v3_wmac_keys_gpio[] = {
+	{
+		.desc		= "reset",
+		.type		= EV_KEY,
+		.code		= KEY_RESTART,
+		.debounce_interval = WNR2000V3_KEYS_DEBOUNCE_INTERVAL,
+		.gpio		= WNR2000V3_GPIO_WMAC_BTN_RESET,
+		.active_low	= 1,
+	}, {
+		.desc		= "rfkill",
+		.type		= EV_KEY,
+		.code		= KEY_RFKILL,
+		.debounce_interval = WNR2000V3_KEYS_DEBOUNCE_INTERVAL,
+		.gpio		= WNR2000V3_GPIO_WMAC_BTN_RFKILL,
+		.active_low	= 1,
 	}
 };
 
@@ -207,12 +292,44 @@ static void __init wnr2000v3_setup(void)
 {
 	wnr_common_setup();
 
+	/*
+	 * Disable JTAG to use all AR724X GPIO LEDs.
+	 * Also disable CLKs and bit 20 as u-boot does.
+	 * Finally, allow OS to control all link LEDs.
+	 */
+	ath79_gpio_function_setup(AR724X_GPIO_FUNC_JTAG_DISABLE |
+				  AR724X_GPIO_FUNC_UART_EN,
+				  AR724X_GPIO_FUNC_CLK_OBS1_EN |
+				  AR724X_GPIO_FUNC_CLK_OBS2_EN |
+				  AR724X_GPIO_FUNC_CLK_OBS3_EN |
+				  AR724X_GPIO_FUNC_CLK_OBS4_EN |
+				  AR724X_GPIO_FUNC_CLK_OBS5_EN |
+				  AR724X_GPIO_FUNC_GE0_MII_CLK_EN |
+				  AR724X_GPIO_FUNC_ETH_SWITCH_LED0_EN |
+				  AR724X_GPIO_FUNC_ETH_SWITCH_LED1_EN |
+				  AR724X_GPIO_FUNC_ETH_SWITCH_LED2_EN |
+				  AR724X_GPIO_FUNC_ETH_SWITCH_LED3_EN |
+				  AR724X_GPIO_FUNC_ETH_SWITCH_LED4_EN |
+				  BIT(20));
+
 	ath79_register_leds_gpio(-1, ARRAY_SIZE(wnr2000v3_leds_gpio),
 				 wnr2000v3_leds_gpio);
 
-	ath79_register_gpio_keys_polled(-1, WNR2000V3_KEYS_POLL_INTERVAL,
-					ARRAY_SIZE(wnr2000v3_gpio_keys),
-					wnr2000v3_gpio_keys);
+	/* do not use id=-1, we can have more GPIO key-polled devices */
+	ath79_register_gpio_keys_polled(PLATFORM_DEVID_AUTO,
+					WNR2000V3_KEYS_POLL_INTERVAL,
+					ARRAY_SIZE(wnr2000v3_keys_gpio),
+					wnr2000v3_keys_gpio);
+
+	ap9x_pci_setup_wmac_led_pin(0, WNR2000V3_GPIO_WMAC_LED_WLAN_BLUE);
+	ap9x_pci_setup_wmac_led_name(0, wnr2000v3_wmac_led_name);
+
+	ap9x_pci_setup_wmac_leds(0, wnr2000v3_wmac_leds_gpio,
+				 ARRAY_SIZE(wnr2000v3_wmac_leds_gpio));
+
+	ap9x_pci_setup_wmac_btns(0, wnr2000v3_wmac_keys_gpio,
+			 	 ARRAY_SIZE(wnr2000v3_wmac_keys_gpio),
+				 WNR2000V3_KEYS_POLL_INTERVAL);
 }
 
 MIPS_MACHINE(ATH79_MACH_WNR2000_V3, "WNR2000V3", "NETGEAR WNR2000 V3", wnr2000v3_setup);
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list