Message ID | 1460289627-27414-1-git-send-email-jens.steinhauser@gmail.com |
---|---|
State | RFC |
Headers | show |
Hi On 10/04/2016 14:00, Jens Steinhauser wrote: > This patch adds support for the TP-Link TL-WR810N. > https://wiki.openwrt.org/toh/tp-link/tl-wr810n > > The device has a slide switch to select its mode of operation when using > the stock firmware. After looking at how it's implemented for similar > devices, I also used 'struct gpio_keys_button { .type = EV_SW, .code = BTN_... }' > to support the switch, but both 'switch_b0' and 'switch_b1' are missing > when using 'evtest' and 'thd', only the 'reset' button shows up in the > output of the programs. > > Changing '.code' to some SW_ value, for example SW_LID and SW_TABLET_MODE, > makes them usable with both 'evtest' and 'thd'. Am I missing something, > or is EV_SW + BTN_... an invalid combination? i use EV_SW and KEY_RFKILL on various boards and it works well. look at package/base-files/files/etc/rc.button/rfkill to see how to handle the events in userland John > > Apart from this, OpenWrt is running fine on the device. > > Signed-off-by: Jens Steinhauser <jens.steinhauser@gmail.com> > --- > .../linux/ar71xx/base-files/etc/board.d/02_network | 1 + > target/linux/ar71xx/base-files/etc/diag.sh | 1 + > target/linux/ar71xx/base-files/lib/ar71xx.sh | 3 + > .../ar71xx/base-files/lib/upgrade/platform.sh | 1 + > target/linux/ar71xx/config-4.1 | 1 + > target/linux/ar71xx/config-4.4 | 1 + > .../ar71xx/files/arch/mips/ath79/Kconfig.openwrt | 10 ++ > target/linux/ar71xx/files/arch/mips/ath79/Makefile | 1 + > .../ar71xx/files/arch/mips/ath79/mach-tl-wr810n.c | 135 +++++++++++++++++++++ > .../linux/ar71xx/files/arch/mips/ath79/machtypes.h | 1 + > target/linux/ar71xx/generic/profiles/tp-link.mk | 11 ++ > target/linux/ar71xx/image/Makefile | 8 ++ > 12 files changed, 174 insertions(+) > create mode 100644 target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr810n.c > > diff --git a/target/linux/ar71xx/base-files/etc/board.d/02_network b/target/linux/ar71xx/base-files/etc/board.d/02_network > index 8fdfa07..8754e62 100755 > --- a/target/linux/ar71xx/base-files/etc/board.d/02_network > +++ b/target/linux/ar71xx/base-files/etc/board.d/02_network > @@ -396,6 +396,7 @@ pb44 |\ > routerstation|\ > tl-wr710n |\ > tl-wr720n-v3|\ > +tl-wr810n |\ > wpe72) > ucidef_set_interfaces_lan_wan "eth1" "eth0" > ;; > diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh > index 1f9bd3f..bd6f3f8 100644 > --- a/target/linux/ar71xx/base-files/etc/diag.sh > +++ b/target/linux/ar71xx/base-files/etc/diag.sh > @@ -332,6 +332,7 @@ get_status_led() { > tl-wr703n | \ > tl-wr710n | \ > tl-wr720n-v3 | \ > + tl-wr810n | \ > tl-wr941nd-v6) > status_led="tp-link:blue:system" > ;; > diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh > index 3d4541e..522f541 100755 > --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh > +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh > @@ -922,6 +922,9 @@ ar71xx_board_detect() { > *"TL-WR720N"*) > name="tl-wr720n-v3" > ;; > + *"TL-WR810N") > + name="tl-wr810n" > + ;; > *"TL-MR10U") > name="tl-mr10u" > ;; > diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh > index d44ece5..e4fb8b8 100755 > --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh > +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh > @@ -377,6 +377,7 @@ platform_check_image() { > tl-wr720n-v3 | \ > tl-wr741nd | \ > tl-wr741nd-v4 | \ > + tl-wr810n | \ > tl-wr841n-v1 | \ > tl-wa830re-v2 | \ > tl-wr841n-v7 | \ > diff --git a/target/linux/ar71xx/config-4.1 b/target/linux/ar71xx/config-4.1 > index fa98643..1baee7e 100644 > --- a/target/linux/ar71xx/config-4.1 > +++ b/target/linux/ar71xx/config-4.1 > @@ -157,6 +157,7 @@ CONFIG_ATH79_MACH_TL_WR703N=y > CONFIG_ATH79_MACH_TL_WR720N_V3=y > CONFIG_ATH79_MACH_TL_WR741ND=y > CONFIG_ATH79_MACH_TL_WR741ND_V4=y > +CONFIG_ATH79_MACH_TL_WR810N=y > CONFIG_ATH79_MACH_TL_WR841N_V1=y > CONFIG_ATH79_MACH_TL_WR841N_V8=y > CONFIG_ATH79_MACH_TL_WR841N_V9=y > diff --git a/target/linux/ar71xx/config-4.4 b/target/linux/ar71xx/config-4.4 > index ec04c28..9c0db09 100644 > --- a/target/linux/ar71xx/config-4.4 > +++ b/target/linux/ar71xx/config-4.4 > @@ -159,6 +159,7 @@ CONFIG_ATH79_MACH_TL_WR703N=y > CONFIG_ATH79_MACH_TL_WR720N_V3=y > CONFIG_ATH79_MACH_TL_WR741ND=y > CONFIG_ATH79_MACH_TL_WR741ND_V4=y > +CONFIG_ATH79_MACH_TL_WR810N=y > CONFIG_ATH79_MACH_TL_WR841N_V1=y > CONFIG_ATH79_MACH_TL_WR841N_V8=y > CONFIG_ATH79_MACH_TL_WR841N_V9=y > diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt > index 8c77645..8ce6620 100644 > --- a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt > +++ b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt > @@ -1274,6 +1274,16 @@ config ATH79_MACH_TL_WR741ND_V4 > select ATH79_DEV_USB > select ATH79_DEV_WMAC > > +config ATH79_MACH_TL_WR810N > + bool "TP-LINK TL-WR810N support" > + select SOC_QCA953X > + select ATH79_DEV_ETH > + select ATH79_DEV_GPIO_BUTTONS > + select ATH79_DEV_LEDS_GPIO > + select ATH79_DEV_M25P80 > + select ATH79_DEV_USB > + select ATH79_DEV_WMAC > + > config ATH79_MACH_TL_WR841N_V1 > bool "TP-LINK TL-WR841N v1 support" > select SOC_AR71XX > diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Makefile b/target/linux/ar71xx/files/arch/mips/ath79/Makefile > index 862a2e3..9af7e50 100644 > --- a/target/linux/ar71xx/files/arch/mips/ath79/Makefile > +++ b/target/linux/ar71xx/files/arch/mips/ath79/Makefile > @@ -158,6 +158,7 @@ obj-$(CONFIG_ATH79_MACH_TL_WDR4300) += mach-tl-wdr4300.o > obj-$(CONFIG_ATH79_MACH_TL_WDR6500_V2) += mach-tl-wdr6500-v2.o > obj-$(CONFIG_ATH79_MACH_TL_WR741ND) += mach-tl-wr741nd.o > obj-$(CONFIG_ATH79_MACH_TL_WR741ND_V4) += mach-tl-wr741nd-v4.o > +obj-$(CONFIG_ATH79_MACH_TL_WR810N) += mach-tl-wr810n.o > obj-$(CONFIG_ATH79_MACH_TL_WR841N_V1) += mach-tl-wr841n.o > obj-$(CONFIG_ATH79_MACH_TL_WR841N_V8) += mach-tl-wr841n-v8.o > obj-$(CONFIG_ATH79_MACH_TL_WR841N_V9) += mach-tl-wr841n-v9.o > diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr810n.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr810n.c > new file mode 100644 > index 0000000..906c5f8 > --- /dev/null > +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr810n.c > @@ -0,0 +1,135 @@ > +/* > + * TP-LINK TL-WR810N board support > + * > + * Copyright (c) 2012 Qualcomm Atheros > + * Copyright (c) 2012 Gabor Juhos <juhosg@openwrt.org> > + * Copyright (c) 2016 Jens Steinhauser <jens.steinhauser@gmail.com> > + * > + * Permission to use, copy, modify, and/or distribute this software for any > + * purpose with or without fee is hereby granted, provided that the above > + * copyright notice and this permission notice appear in all copies. > + * > + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES > + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF > + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR > + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES > + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN > + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF > + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > + */ > + > +#include <linux/gpio.h> > +#include <linux/platform_device.h> > +#include <linux/ar8216_platform.h> > + > +#include <asm/mach-ath79/ar71xx_regs.h> > + > +#include "common.h" > +#include "dev-gpio-buttons.h" > +#include "dev-eth.h" > +#include "dev-leds-gpio.h" > +#include "dev-m25p80.h" > +#include "dev-usb.h" > +#include "dev-wmac.h" > +#include "machtypes.h" > + > +#define TL_WR810N_GPIO_SWITCH_B1 0 > +#define TL_WR810N_GPIO_SWITCH_B0 1 > +#define TL_WR810N_GPIO_USB_POWER 11 > +#define TL_WR810N_GPIO_BTN_RESET 12 > +#define TL_WR810N_GPIO_LED_SYSTEM 13 > + > +#define TL_WR810N_KEYS_POLL_INTERVAL 20 /* msecs */ > +#define TL_WR810N_KEYS_DEBOUNCE_INTERVAL (3 * TL_WR810N_KEYS_POLL_INTERVAL) > + > +#define TL_WR810N_WMAC_CALDATA_OFFSET 0x1000 > + > +static const char *tl_wr810n_part_probes[] = { > + "tp-link", > + NULL, > +}; > + > +static struct flash_platform_data tl_wr810n_flash_data = { > + .part_probes = tl_wr810n_part_probes, > +}; > + > +static struct gpio_led tl_wr810n_leds_gpio[] __initdata = { > + { > + .name = "tp-link:blue:system", > + .gpio = TL_WR810N_GPIO_LED_SYSTEM, > + .active_low = 1, > + }, > +}; > + > +static struct gpio_keys_button tl_wr810n_gpio_keys[] __initdata = { > + { > + .desc = "reset", > + .type = EV_KEY, > + .code = KEY_RESTART, > + .debounce_interval = TL_WR810N_KEYS_DEBOUNCE_INTERVAL, > + .gpio = TL_WR810N_GPIO_BTN_RESET, > + .active_low = 1, > + }, > + { > + .desc = "switch_b0", > + .type = EV_SW, > + .code = BTN_0, > + .debounce_interval = TL_WR810N_KEYS_DEBOUNCE_INTERVAL, > + .gpio = TL_WR810N_GPIO_SWITCH_B0, > + .active_low = 0, > + }, > + { > + .desc = "switch_b1", > + .type = EV_SW, > + .code = BTN_1, > + .debounce_interval = TL_WR810N_KEYS_DEBOUNCE_INTERVAL, > + .gpio = TL_WR810N_GPIO_SWITCH_B1, > + .active_low = 0, > + }, > +}; > + > +static void __init tl_wr810n_setup(void) > +{ > + u8 *mac = (u8 *) KSEG1ADDR(0x1f01fc00); > + u8 *art = (u8 *) KSEG1ADDR(0x1fff0000); > + > + ath79_setup_ar933x_phy4_switch(false, false); > + > + ath79_register_m25p80(&tl_wr810n_flash_data); > + ath79_register_leds_gpio(-1, > + ARRAY_SIZE(tl_wr810n_leds_gpio), > + tl_wr810n_leds_gpio); > + ath79_register_gpio_keys_polled(-1, > + TL_WR810N_KEYS_POLL_INTERVAL, > + ARRAY_SIZE(tl_wr810n_gpio_keys), > + tl_wr810n_gpio_keys); > + > + ath79_register_mdio(0, 0x0); > + > + /* WAN */ > + ath79_eth0_data.duplex = DUPLEX_FULL; > + ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII; > + ath79_eth0_data.speed = SPEED_100; > + ath79_eth0_data.phy_mask = BIT(4); > + ath79_init_mac(ath79_eth0_data.mac_addr, mac, 1); > + ath79_register_eth(0); > + > + /* LAN */ > + ath79_switch_data.phy4_mii_en = 1; > + ath79_eth1_data.duplex = DUPLEX_FULL; > + ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII; > + ath79_eth1_data.speed = SPEED_1000; > + ath79_switch_data.phy_poll_mask |= BIT(4); > + ath79_init_mac(ath79_eth1_data.mac_addr, mac, -1); > + ath79_register_eth(1); > + > + ath79_register_wmac(art + TL_WR810N_WMAC_CALDATA_OFFSET, mac); > + > + gpio_request_one(TL_WR810N_GPIO_USB_POWER, > + GPIOF_OUT_INIT_HIGH | GPIOF_EXPORT_DIR_FIXED, > + "USB power"); > + ath79_register_usb(); > +} > + > +MIPS_MACHINE(ATH79_MACH_TL_WR810N, "TL-WR810N", "TP-LINK TL-WR810N", > + tl_wr810n_setup); > diff --git a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h > index 0363c88..a4a8252 100644 > --- a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h > +++ b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h > @@ -192,6 +192,7 @@ enum ath79_mach_type { > ATH79_MACH_TL_WR720N_V3, /* TP-LINK TL-WR720N v3/v4 */ > ATH79_MACH_TL_WR741ND, /* TP-LINK TL-WR741ND */ > ATH79_MACH_TL_WR741ND_V4, /* TP-LINK TL-WR741ND v4 */ > + ATH79_MACH_TL_WR810N, /* TP-LINK TL-WR810N */ > ATH79_MACH_TL_WR841N_V1, /* TP-LINK TL-WR841N v1 */ > ATH79_MACH_TL_WR841N_V7, /* TP-LINK TL-WR841N/ND v7 */ > ATH79_MACH_TL_WR841N_V8, /* TP-LINK TL-WR841N/ND v8 */ > diff --git a/target/linux/ar71xx/generic/profiles/tp-link.mk b/target/linux/ar71xx/generic/profiles/tp-link.mk > index 2875290..c44b22c 100644 > --- a/target/linux/ar71xx/generic/profiles/tp-link.mk > +++ b/target/linux/ar71xx/generic/profiles/tp-link.mk > @@ -332,6 +332,17 @@ endef > $(eval $(call Profile,TLWR743)) > > > +define Profile/TLWR810 > + NAME:=TP-Link TL-WR810N > + PACKAGES:=kmod-usb-core kmod-usb2 > +endef > + > +define Profile/TLWR810/Description > + Package set optimized for the TP-LINK TL-WR810N. > +endef > +$(eval $(call Profile,TLWR810)) > + > + > define Profile/TLWR841 > NAME:=TP-LINK TL-WR841N/ND > PACKAGES:= > diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile > index e4e2fcf..1f0cfcd 100644 > --- a/target/linux/ar71xx/image/Makefile > +++ b/target/linux/ar71xx/image/Makefile > @@ -783,6 +783,14 @@ define Device/tl-wr741nd-v5 > CONSOLE := ttyATH0,115200 > endef > > +define Device/tl-wr810n > + $(Device/tplink-8mlzma) > + BOARDNAME := TL-WR810N > + DEVICE_PROFILE := TLWR810 > + TPLINK_HWID := 0x08100001 > +endef > +TARGET_DEVICES += tl-wr810n > + > define Device/tl-wr743nd-v1 > $(Device/tplink-4m) > BOARDNAME := TL-WR741ND >
On 04/25/2016 10:02 PM, John Crispin wrote: > Hi > > On 10/04/2016 14:00, Jens Steinhauser wrote: >> This patch adds support for the TP-Link TL-WR810N. >> https://wiki.openwrt.org/toh/tp-link/tl-wr810n >> >> The device has a slide switch to select its mode of operation when using >> the stock firmware. After looking at how it's implemented for similar >> devices, I also used 'struct gpio_keys_button { .type = EV_SW, .code = BTN_... }' >> to support the switch, but both 'switch_b0' and 'switch_b1' are missing >> when using 'evtest' and 'thd', only the 'reset' button shows up in the >> output of the programs. >> >> Changing '.code' to some SW_ value, for example SW_LID and SW_TABLET_MODE, >> makes them usable with both 'evtest' and 'thd'. Am I missing something, >> or is EV_SW + BTN_... an invalid combination? > > i use EV_SW and KEY_RFKILL on various boards and it works well. look at > package/base-files/files/etc/rc.button/rfkill to see how to handle the > events in userland > > John Thanks for the hint, indeed the switches can be used like ordinary buttons with procd. What's missing is a way to get the initial switch state after start-up, but that seems to be a limitation of the gpio-button-hotplug driver and procd, not an error in the initialization code. I'll resend the patch rebased onto current git. Jens
On 02/05/2016 00:05, Jens Steinhauser wrote: > On 04/25/2016 10:02 PM, John Crispin wrote: >> Hi >> >> On 10/04/2016 14:00, Jens Steinhauser wrote: >>> This patch adds support for the TP-Link TL-WR810N. >>> https://wiki.openwrt.org/toh/tp-link/tl-wr810n >>> >>> The device has a slide switch to select its mode of operation when using >>> the stock firmware. After looking at how it's implemented for similar >>> devices, I also used 'struct gpio_keys_button { .type = EV_SW, .code = BTN_... }' >>> to support the switch, but both 'switch_b0' and 'switch_b1' are missing >>> when using 'evtest' and 'thd', only the 'reset' button shows up in the >>> output of the programs. >>> >>> Changing '.code' to some SW_ value, for example SW_LID and SW_TABLET_MODE, >>> makes them usable with both 'evtest' and 'thd'. Am I missing something, >>> or is EV_SW + BTN_... an invalid combination? >> >> i use EV_SW and KEY_RFKILL on various boards and it works well. look at >> package/base-files/files/etc/rc.button/rfkill to see how to handle the >> events in userland >> >> John > > Thanks for the hint, indeed the switches can be used like ordinary buttons with procd. What's missing is a way to get the initial switch state after start-up, but that seems to be a limitation of the gpio-button-hotplug driver and procd, not an error in the initialization code. > when using EV_SW it should send one initial event with the starting state. i am sure i added that at some point. i've just put a task onto my todo list. i'll have a look at it the next days. John
On 05/02/2016 10:55 AM, John Crispin wrote: > On 02/05/2016 00:05, Jens Steinhauser wrote: >> On 04/25/2016 10:02 PM, John Crispin wrote: >>> Hi >>> >>> On 10/04/2016 14:00, Jens Steinhauser wrote: >>>> This patch adds support for the TP-Link TL-WR810N. >>>> https://wiki.openwrt.org/toh/tp-link/tl-wr810n >>>> >>>> The device has a slide switch to select its mode of operation when using >>>> the stock firmware. After looking at how it's implemented for similar >>>> devices, I also used 'struct gpio_keys_button { .type = EV_SW, .code = BTN_... }' >>>> to support the switch, but both 'switch_b0' and 'switch_b1' are missing >>>> when using 'evtest' and 'thd', only the 'reset' button shows up in the >>>> output of the programs. >>>> >>>> Changing '.code' to some SW_ value, for example SW_LID and SW_TABLET_MODE, >>>> makes them usable with both 'evtest' and 'thd'. Am I missing something, >>>> or is EV_SW + BTN_... an invalid combination? >>> >>> i use EV_SW and KEY_RFKILL on various boards and it works well. look at >>> package/base-files/files/etc/rc.button/rfkill to see how to handle the >>> events in userland >>> >>> John >> >> Thanks for the hint, indeed the switches can be used like ordinary buttons with procd. What's missing is a way to get the initial switch state after start-up, but that seems to be a limitation of the gpio-button-hotplug driver and procd, not an error in the initialization code. >> > > when using EV_SW it should send one initial event with the starting > state. i am sure i added that at some point. i've just put a task onto > my todo list. i'll have a look at it the next days. I used the following script to react on switch changes: root@OpenWrt:/# cat /etc/hotplug.d/button/btn #!/bin/sh logger "$0 $BUTTON $ACTION" echo "$0 $BUTTON $ACTION" >>/tmp/btn Directly after start-up the file /tmp/btn is empty and no messages got logged. Enabling the debug messages of the driver shows that it generates some events after it is loaded: [ 4.263157] gpio-keys: event type=5, code=256, value=0 [ 4.263179] gpio-keys: create event, name=BTN_0, seen=42949377, pressed=0 [ 4.263192] gpio-keys: event type=5, code=257, value=1 [ 4.263203] gpio-keys: create event, name=BTN_1, seen=42949377, pressed=1 [ 4.263231] gpio-keys: added variable 'released@' [ 4.263241] gpio-keys: added variable 'HOME=/' [ 4.263252] gpio-keys: added variable 'PATH=/sbin:/bin:/usr/sbin:/usr/bin' [ 4.263263] gpio-keys: added variable 'SUBSYSTEM=button' [ 4.263273] gpio-keys: added variable 'ACTION=released' [ 4.263283] gpio-keys: added variable 'BUTTON=BTN_0' [ 4.263293] gpio-keys: added variable 'TYPE=switch' [ 4.263303] gpio-keys: added variable 'SEEN=42949377' [ 4.263314] gpio-keys: added variable 'SEQNUM=258' [ 4.263340] gpio-keys: added variable 'pressed@' [ 4.263349] gpio-keys: added variable 'HOME=/' [ 4.263360] gpio-keys: added variable 'PATH=/sbin:/bin:/usr/sbin:/usr/bin' [ 4.263371] gpio-keys: added variable 'SUBSYSTEM=button' [ 4.263381] gpio-keys: added variable 'ACTION=pressed' [ 4.263390] gpio-keys: added variable 'BUTTON=BTN_1' [ 4.263400] gpio-keys: added variable 'TYPE=switch' [ 4.263410] gpio-keys: added variable 'SEEN=42949377' [ 4.263420] gpio-keys: added variable 'SEQNUM=259' [ 4.263455] ehci-platform ehci-platform: USB 2.0 started, EHCI 1.00 [ 4.270905] hub 1-0:1.0: USB hub found [ 4.275308] hub 1-0:1.0: 1 port detected [ 4.282975] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver [ 4.291082] ohci-platform: OHCI generic platform driver [ 4.299513] uhci_hcd: USB Universal Host Controller Interface driver [ 4.316930] init: - preinit - [ 5.025936] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready [ 5.054558] random: procd urandom read with 8 bits of entropy available [ 8.292207] jffs2: notice: (359) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found. [ 8.310100] mount_root: switching to jffs2 overlay [ 8.358949] procd: - early - [ 8.362073] procd: - watchdog - [ 9.052180] procd: - ubus - [ 9.172024] procd: - init - The procd messages come a few seconds after the messages from the driver, so maybe it's just to early for userspace to react? When I reload the driver, the events are processed by procd/the button handling script: root@OpenWrt:/# cat /tmp/btn cat: can't open '/tmp/btn': No such file or directory root@OpenWrt:/# rmmod gpio_button_hotplug root@OpenWrt:/# modprobe gpio_button_hotplug root@OpenWrt:/# cat /tmp/btn /etc/rc.button/BTN_0 BTN_0 released /sbin/hotplug-call BTN_0 released /etc/rc.button/BTN_1 BTN_1 pressed /sbin/hotplug-call BTN_1 pressed Jens
On 02/05/2016 20:50, Jens Steinhauser wrote: > On 05/02/2016 10:55 AM, John Crispin wrote: >> On 02/05/2016 00:05, Jens Steinhauser wrote: >>> On 04/25/2016 10:02 PM, John Crispin wrote: >>>> Hi >>>> >>>> On 10/04/2016 14:00, Jens Steinhauser wrote: >>>>> This patch adds support for the TP-Link TL-WR810N. >>>>> https://wiki.openwrt.org/toh/tp-link/tl-wr810n >>>>> >>>>> The device has a slide switch to select its mode of operation when using >>>>> the stock firmware. After looking at how it's implemented for similar >>>>> devices, I also used 'struct gpio_keys_button { .type = EV_SW, .code = BTN_... }' >>>>> to support the switch, but both 'switch_b0' and 'switch_b1' are missing >>>>> when using 'evtest' and 'thd', only the 'reset' button shows up in the >>>>> output of the programs. >>>>> >>>>> Changing '.code' to some SW_ value, for example SW_LID and SW_TABLET_MODE, >>>>> makes them usable with both 'evtest' and 'thd'. Am I missing something, >>>>> or is EV_SW + BTN_... an invalid combination? >>>> >>>> i use EV_SW and KEY_RFKILL on various boards and it works well. look at >>>> package/base-files/files/etc/rc.button/rfkill to see how to handle the >>>> events in userland >>>> >>>> John >>> >>> Thanks for the hint, indeed the switches can be used like ordinary buttons with procd. What's missing is a way to get the initial switch state after start-up, but that seems to be a limitation of the gpio-button-hotplug driver and procd, not an error in the initialization code. >>> >> >> when using EV_SW it should send one initial event with the starting >> state. i am sure i added that at some point. i've just put a task onto >> my todo list. i'll have a look at it the next days. > > I used the following script to react on switch changes: > > root@OpenWrt:/# cat /etc/hotplug.d/button/btn > #!/bin/sh > logger "$0 $BUTTON $ACTION" > echo "$0 $BUTTON $ACTION" >>/tmp/btn > > Directly after start-up the file /tmp/btn is empty and no messages got logged. Enabling the debug messages of the driver shows that it generates some events after it is loaded: > > [ 4.263157] gpio-keys: event type=5, code=256, value=0 > [ 4.263179] gpio-keys: create event, name=BTN_0, seen=42949377, pressed=0 > [ 4.263192] gpio-keys: event type=5, code=257, value=1 > [ 4.263203] gpio-keys: create event, name=BTN_1, seen=42949377, pressed=1 > [ 4.263231] gpio-keys: added variable 'released@' > [ 4.263241] gpio-keys: added variable 'HOME=/' > [ 4.263252] gpio-keys: added variable 'PATH=/sbin:/bin:/usr/sbin:/usr/bin' > [ 4.263263] gpio-keys: added variable 'SUBSYSTEM=button' > [ 4.263273] gpio-keys: added variable 'ACTION=released' > [ 4.263283] gpio-keys: added variable 'BUTTON=BTN_0' > [ 4.263293] gpio-keys: added variable 'TYPE=switch' > [ 4.263303] gpio-keys: added variable 'SEEN=42949377' > [ 4.263314] gpio-keys: added variable 'SEQNUM=258' > [ 4.263340] gpio-keys: added variable 'pressed@' > [ 4.263349] gpio-keys: added variable 'HOME=/' > [ 4.263360] gpio-keys: added variable 'PATH=/sbin:/bin:/usr/sbin:/usr/bin' > [ 4.263371] gpio-keys: added variable 'SUBSYSTEM=button' > [ 4.263381] gpio-keys: added variable 'ACTION=pressed' > [ 4.263390] gpio-keys: added variable 'BUTTON=BTN_1' > [ 4.263400] gpio-keys: added variable 'TYPE=switch' > [ 4.263410] gpio-keys: added variable 'SEEN=42949377' > [ 4.263420] gpio-keys: added variable 'SEQNUM=259' > [ 4.263455] ehci-platform ehci-platform: USB 2.0 started, EHCI 1.00 > [ 4.270905] hub 1-0:1.0: USB hub found > [ 4.275308] hub 1-0:1.0: 1 port detected > [ 4.282975] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver > [ 4.291082] ohci-platform: OHCI generic platform driver > [ 4.299513] uhci_hcd: USB Universal Host Controller Interface driver > [ 4.316930] init: - preinit - > [ 5.025936] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready > [ 5.054558] random: procd urandom read with 8 bits of entropy available > [ 8.292207] jffs2: notice: (359) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found. > [ 8.310100] mount_root: switching to jffs2 overlay > [ 8.358949] procd: - early - > [ 8.362073] procd: - watchdog - > [ 9.052180] procd: - ubus - > [ 9.172024] procd: - init - > > The procd messages come a few seconds after the messages from the driver, so maybe it's just to early for userspace to react? > > When I reload the driver, the events are processed by procd/the button handling script: > > root@OpenWrt:/# cat /tmp/btn > cat: can't open '/tmp/btn': No such file or directory > root@OpenWrt:/# rmmod gpio_button_hotplug > root@OpenWrt:/# modprobe gpio_button_hotplug > root@OpenWrt:/# cat /tmp/btn > /etc/rc.button/BTN_0 BTN_0 released > /sbin/hotplug-call BTN_0 released > /etc/rc.button/BTN_1 BTN_1 pressed > /sbin/hotplug-call BTN_1 pressed > > Jens > thanks for debugging, looks like a regression, this used to work for sure. i'll have a look at it. John
diff --git a/target/linux/ar71xx/base-files/etc/board.d/02_network b/target/linux/ar71xx/base-files/etc/board.d/02_network index 8fdfa07..8754e62 100755 --- a/target/linux/ar71xx/base-files/etc/board.d/02_network +++ b/target/linux/ar71xx/base-files/etc/board.d/02_network @@ -396,6 +396,7 @@ pb44 |\ routerstation|\ tl-wr710n |\ tl-wr720n-v3|\ +tl-wr810n |\ wpe72) ucidef_set_interfaces_lan_wan "eth1" "eth0" ;; diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh index 1f9bd3f..bd6f3f8 100644 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh @@ -332,6 +332,7 @@ get_status_led() { tl-wr703n | \ tl-wr710n | \ tl-wr720n-v3 | \ + tl-wr810n | \ tl-wr941nd-v6) status_led="tp-link:blue:system" ;; diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh index 3d4541e..522f541 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -922,6 +922,9 @@ ar71xx_board_detect() { *"TL-WR720N"*) name="tl-wr720n-v3" ;; + *"TL-WR810N") + name="tl-wr810n" + ;; *"TL-MR10U") name="tl-mr10u" ;; diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh index d44ece5..e4fb8b8 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -377,6 +377,7 @@ platform_check_image() { tl-wr720n-v3 | \ tl-wr741nd | \ tl-wr741nd-v4 | \ + tl-wr810n | \ tl-wr841n-v1 | \ tl-wa830re-v2 | \ tl-wr841n-v7 | \ diff --git a/target/linux/ar71xx/config-4.1 b/target/linux/ar71xx/config-4.1 index fa98643..1baee7e 100644 --- a/target/linux/ar71xx/config-4.1 +++ b/target/linux/ar71xx/config-4.1 @@ -157,6 +157,7 @@ CONFIG_ATH79_MACH_TL_WR703N=y CONFIG_ATH79_MACH_TL_WR720N_V3=y CONFIG_ATH79_MACH_TL_WR741ND=y CONFIG_ATH79_MACH_TL_WR741ND_V4=y +CONFIG_ATH79_MACH_TL_WR810N=y CONFIG_ATH79_MACH_TL_WR841N_V1=y CONFIG_ATH79_MACH_TL_WR841N_V8=y CONFIG_ATH79_MACH_TL_WR841N_V9=y diff --git a/target/linux/ar71xx/config-4.4 b/target/linux/ar71xx/config-4.4 index ec04c28..9c0db09 100644 --- a/target/linux/ar71xx/config-4.4 +++ b/target/linux/ar71xx/config-4.4 @@ -159,6 +159,7 @@ CONFIG_ATH79_MACH_TL_WR703N=y CONFIG_ATH79_MACH_TL_WR720N_V3=y CONFIG_ATH79_MACH_TL_WR741ND=y CONFIG_ATH79_MACH_TL_WR741ND_V4=y +CONFIG_ATH79_MACH_TL_WR810N=y CONFIG_ATH79_MACH_TL_WR841N_V1=y CONFIG_ATH79_MACH_TL_WR841N_V8=y CONFIG_ATH79_MACH_TL_WR841N_V9=y diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt index 8c77645..8ce6620 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt +++ b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt @@ -1274,6 +1274,16 @@ config ATH79_MACH_TL_WR741ND_V4 select ATH79_DEV_USB select ATH79_DEV_WMAC +config ATH79_MACH_TL_WR810N + bool "TP-LINK TL-WR810N support" + select SOC_QCA953X + select ATH79_DEV_ETH + select ATH79_DEV_GPIO_BUTTONS + select ATH79_DEV_LEDS_GPIO + select ATH79_DEV_M25P80 + select ATH79_DEV_USB + select ATH79_DEV_WMAC + config ATH79_MACH_TL_WR841N_V1 bool "TP-LINK TL-WR841N v1 support" select SOC_AR71XX diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Makefile b/target/linux/ar71xx/files/arch/mips/ath79/Makefile index 862a2e3..9af7e50 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/Makefile +++ b/target/linux/ar71xx/files/arch/mips/ath79/Makefile @@ -158,6 +158,7 @@ obj-$(CONFIG_ATH79_MACH_TL_WDR4300) += mach-tl-wdr4300.o obj-$(CONFIG_ATH79_MACH_TL_WDR6500_V2) += mach-tl-wdr6500-v2.o obj-$(CONFIG_ATH79_MACH_TL_WR741ND) += mach-tl-wr741nd.o obj-$(CONFIG_ATH79_MACH_TL_WR741ND_V4) += mach-tl-wr741nd-v4.o +obj-$(CONFIG_ATH79_MACH_TL_WR810N) += mach-tl-wr810n.o obj-$(CONFIG_ATH79_MACH_TL_WR841N_V1) += mach-tl-wr841n.o obj-$(CONFIG_ATH79_MACH_TL_WR841N_V8) += mach-tl-wr841n-v8.o obj-$(CONFIG_ATH79_MACH_TL_WR841N_V9) += mach-tl-wr841n-v9.o diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr810n.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr810n.c new file mode 100644 index 0000000..906c5f8 --- /dev/null +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr810n.c @@ -0,0 +1,135 @@ +/* + * TP-LINK TL-WR810N board support + * + * Copyright (c) 2012 Qualcomm Atheros + * Copyright (c) 2012 Gabor Juhos <juhosg@openwrt.org> + * Copyright (c) 2016 Jens Steinhauser <jens.steinhauser@gmail.com> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <linux/gpio.h> +#include <linux/platform_device.h> +#include <linux/ar8216_platform.h> + +#include <asm/mach-ath79/ar71xx_regs.h> + +#include "common.h" +#include "dev-gpio-buttons.h" +#include "dev-eth.h" +#include "dev-leds-gpio.h" +#include "dev-m25p80.h" +#include "dev-usb.h" +#include "dev-wmac.h" +#include "machtypes.h" + +#define TL_WR810N_GPIO_SWITCH_B1 0 +#define TL_WR810N_GPIO_SWITCH_B0 1 +#define TL_WR810N_GPIO_USB_POWER 11 +#define TL_WR810N_GPIO_BTN_RESET 12 +#define TL_WR810N_GPIO_LED_SYSTEM 13 + +#define TL_WR810N_KEYS_POLL_INTERVAL 20 /* msecs */ +#define TL_WR810N_KEYS_DEBOUNCE_INTERVAL (3 * TL_WR810N_KEYS_POLL_INTERVAL) + +#define TL_WR810N_WMAC_CALDATA_OFFSET 0x1000 + +static const char *tl_wr810n_part_probes[] = { + "tp-link", + NULL, +}; + +static struct flash_platform_data tl_wr810n_flash_data = { + .part_probes = tl_wr810n_part_probes, +}; + +static struct gpio_led tl_wr810n_leds_gpio[] __initdata = { + { + .name = "tp-link:blue:system", + .gpio = TL_WR810N_GPIO_LED_SYSTEM, + .active_low = 1, + }, +}; + +static struct gpio_keys_button tl_wr810n_gpio_keys[] __initdata = { + { + .desc = "reset", + .type = EV_KEY, + .code = KEY_RESTART, + .debounce_interval = TL_WR810N_KEYS_DEBOUNCE_INTERVAL, + .gpio = TL_WR810N_GPIO_BTN_RESET, + .active_low = 1, + }, + { + .desc = "switch_b0", + .type = EV_SW, + .code = BTN_0, + .debounce_interval = TL_WR810N_KEYS_DEBOUNCE_INTERVAL, + .gpio = TL_WR810N_GPIO_SWITCH_B0, + .active_low = 0, + }, + { + .desc = "switch_b1", + .type = EV_SW, + .code = BTN_1, + .debounce_interval = TL_WR810N_KEYS_DEBOUNCE_INTERVAL, + .gpio = TL_WR810N_GPIO_SWITCH_B1, + .active_low = 0, + }, +}; + +static void __init tl_wr810n_setup(void) +{ + u8 *mac = (u8 *) KSEG1ADDR(0x1f01fc00); + u8 *art = (u8 *) KSEG1ADDR(0x1fff0000); + + ath79_setup_ar933x_phy4_switch(false, false); + + ath79_register_m25p80(&tl_wr810n_flash_data); + ath79_register_leds_gpio(-1, + ARRAY_SIZE(tl_wr810n_leds_gpio), + tl_wr810n_leds_gpio); + ath79_register_gpio_keys_polled(-1, + TL_WR810N_KEYS_POLL_INTERVAL, + ARRAY_SIZE(tl_wr810n_gpio_keys), + tl_wr810n_gpio_keys); + + ath79_register_mdio(0, 0x0); + + /* WAN */ + ath79_eth0_data.duplex = DUPLEX_FULL; + ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII; + ath79_eth0_data.speed = SPEED_100; + ath79_eth0_data.phy_mask = BIT(4); + ath79_init_mac(ath79_eth0_data.mac_addr, mac, 1); + ath79_register_eth(0); + + /* LAN */ + ath79_switch_data.phy4_mii_en = 1; + ath79_eth1_data.duplex = DUPLEX_FULL; + ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII; + ath79_eth1_data.speed = SPEED_1000; + ath79_switch_data.phy_poll_mask |= BIT(4); + ath79_init_mac(ath79_eth1_data.mac_addr, mac, -1); + ath79_register_eth(1); + + ath79_register_wmac(art + TL_WR810N_WMAC_CALDATA_OFFSET, mac); + + gpio_request_one(TL_WR810N_GPIO_USB_POWER, + GPIOF_OUT_INIT_HIGH | GPIOF_EXPORT_DIR_FIXED, + "USB power"); + ath79_register_usb(); +} + +MIPS_MACHINE(ATH79_MACH_TL_WR810N, "TL-WR810N", "TP-LINK TL-WR810N", + tl_wr810n_setup); diff --git a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h index 0363c88..a4a8252 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h +++ b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h @@ -192,6 +192,7 @@ enum ath79_mach_type { ATH79_MACH_TL_WR720N_V3, /* TP-LINK TL-WR720N v3/v4 */ ATH79_MACH_TL_WR741ND, /* TP-LINK TL-WR741ND */ ATH79_MACH_TL_WR741ND_V4, /* TP-LINK TL-WR741ND v4 */ + ATH79_MACH_TL_WR810N, /* TP-LINK TL-WR810N */ ATH79_MACH_TL_WR841N_V1, /* TP-LINK TL-WR841N v1 */ ATH79_MACH_TL_WR841N_V7, /* TP-LINK TL-WR841N/ND v7 */ ATH79_MACH_TL_WR841N_V8, /* TP-LINK TL-WR841N/ND v8 */ diff --git a/target/linux/ar71xx/generic/profiles/tp-link.mk b/target/linux/ar71xx/generic/profiles/tp-link.mk index 2875290..c44b22c 100644 --- a/target/linux/ar71xx/generic/profiles/tp-link.mk +++ b/target/linux/ar71xx/generic/profiles/tp-link.mk @@ -332,6 +332,17 @@ endef $(eval $(call Profile,TLWR743)) +define Profile/TLWR810 + NAME:=TP-Link TL-WR810N + PACKAGES:=kmod-usb-core kmod-usb2 +endef + +define Profile/TLWR810/Description + Package set optimized for the TP-LINK TL-WR810N. +endef +$(eval $(call Profile,TLWR810)) + + define Profile/TLWR841 NAME:=TP-LINK TL-WR841N/ND PACKAGES:= diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile index e4e2fcf..1f0cfcd 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -783,6 +783,14 @@ define Device/tl-wr741nd-v5 CONSOLE := ttyATH0,115200 endef +define Device/tl-wr810n + $(Device/tplink-8mlzma) + BOARDNAME := TL-WR810N + DEVICE_PROFILE := TLWR810 + TPLINK_HWID := 0x08100001 +endef +TARGET_DEVICES += tl-wr810n + define Device/tl-wr743nd-v1 $(Device/tplink-4m) BOARDNAME := TL-WR741ND
This patch adds support for the TP-Link TL-WR810N. https://wiki.openwrt.org/toh/tp-link/tl-wr810n The device has a slide switch to select its mode of operation when using the stock firmware. After looking at how it's implemented for similar devices, I also used 'struct gpio_keys_button { .type = EV_SW, .code = BTN_... }' to support the switch, but both 'switch_b0' and 'switch_b1' are missing when using 'evtest' and 'thd', only the 'reset' button shows up in the output of the programs. Changing '.code' to some SW_ value, for example SW_LID and SW_TABLET_MODE, makes them usable with both 'evtest' and 'thd'. Am I missing something, or is EV_SW + BTN_... an invalid combination? Apart from this, OpenWrt is running fine on the device. Signed-off-by: Jens Steinhauser <jens.steinhauser@gmail.com> --- .../linux/ar71xx/base-files/etc/board.d/02_network | 1 + target/linux/ar71xx/base-files/etc/diag.sh | 1 + target/linux/ar71xx/base-files/lib/ar71xx.sh | 3 + .../ar71xx/base-files/lib/upgrade/platform.sh | 1 + target/linux/ar71xx/config-4.1 | 1 + target/linux/ar71xx/config-4.4 | 1 + .../ar71xx/files/arch/mips/ath79/Kconfig.openwrt | 10 ++ target/linux/ar71xx/files/arch/mips/ath79/Makefile | 1 + .../ar71xx/files/arch/mips/ath79/mach-tl-wr810n.c | 135 +++++++++++++++++++++ .../linux/ar71xx/files/arch/mips/ath79/machtypes.h | 1 + target/linux/ar71xx/generic/profiles/tp-link.mk | 11 ++ target/linux/ar71xx/image/Makefile | 8 ++ 12 files changed, 174 insertions(+) create mode 100644 target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr810n.c