From: Xiaoning Kang <kan...@gmail.com> HiWifi HC6361(aka tw150v1) is a router developed by http://www.hiwifi.com, which is basically a WR703N with larger flash and ram. It also carries a 4G emmc chip. The manufacturer had released a copy of modified openwrt sources at https://code.hiwifi.com/. so I tried to migrate those changes to openwrt trunk.
Most of the changes were imported, with a few exceptions like button handling. The firmware builds and runs fine on my router. Signed-off-by: Xiaoning Kang <kan...@gmail.com> -- diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh index 3962aa2..55e9a0b 100755 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh @@ -149,6 +149,9 @@ get_status_led() { tl-wr2543n) status_led="tp-link:green:wps" ;; + tw150v1) + status_led="tw150v1:green:system" + ;; unifi) status_led="ubnt:green:dome" ;; diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds index bd1c4b7..ed30755 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds @@ -229,6 +229,11 @@ tl-wr2543n) ucidef_set_led_usbdev "usb" "USB" "tp-link:green:usb" "1-1" ;; +tw150v1) + ucidef_set_led_default "inet" "INET" "tw150v1:green:internet" "0" + ucidef_set_led_wlan "wlan" "WLAN" "tw150v1:green:wlan-2p4" "wifi0tpt" + ;; + wrt160nl) ucidef_set_led_wlan "wlan" "WLAN" "wrt160nl:blue:wlan" "phy0tpt" ;; @@ -272,6 +277,10 @@ wzr-hp-g300nh) ucidef_set_led_netdev "router" "Router" "buffalo:green:router" "eth1" ucidef_set_led_usbdev "usb" "USB" "buffalo:blue:usb" "1-1" ;; +tw150v1) + ucidef_set_led_default "inet" "INET" "tw150v1:green:internet" "0" + ucidef_set_led_wlan "wlan" "WLAN" "tw150v1:green:wlan-2p4" "wifi0tpt" + ;; zcn-1523h-2) ucidef_set_led_netdev "lan1" "lan1" "zcn-1523h:green:lan1" "eth0" diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network index 3d6ab29..03e30c4 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network @@ -271,6 +271,7 @@ tl-wdr3500 |\ tl-wr741nd |\ tl-wr741nd-v4 |\ tl-wr841n-v7 |\ +tw150v1 |\ whr-g301n |\ whr-hp-g300n |\ whr-hp-gn |\ diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh index 06786e7..b5c50bd 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -573,6 +573,9 @@ ar71xx_board_detect() { "8devices Carambola2"*) name="carambola2" ;; + *"Hiwifi Wireless HC6361 Board") + name="tw150v1" + ;; esac case "$machine" in diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh index 28e4a91..5122c64 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -106,6 +106,13 @@ platform_check_image() { } return 0 ;; + tw150v1) + [ "$magic_long" != "68737173" -a "$magic_long" != "2705" ] && { + echo "Invalid image type." + return 1 + } + return 0 + ;; ap81 | \ ap83 | \ ap132 | \ @@ -324,6 +331,9 @@ platform_do_upgrade() { om2p-lc) platform_do_upgrade_openmesh "$ARGV" ;; + tw150v1) + platform_do_upgrade_twarxx "$ARGV" + ;; *) default_do_upgrade "$ARGV" ;; diff --git a/target/linux/ar71xx/config-3.10 b/target/linux/ar71xx/config-3.10 index f88d008..ee41ffd 100644 --- a/target/linux/ar71xx/config-3.10 +++ b/target/linux/ar71xx/config-3.10 @@ -84,6 +84,7 @@ CONFIG_ATH79_MACH_TL_WR741ND_V4=y CONFIG_ATH79_MACH_TL_WR841N_V1=y CONFIG_ATH79_MACH_TL_WR841N_V8=y CONFIG_ATH79_MACH_TL_WR941ND=y +CONFIG_ATH79_MACH_TW150V1=y CONFIG_ATH79_MACH_UBNT=y CONFIG_ATH79_MACH_UBNT_XM=y CONFIG_ATH79_MACH_WHR_HP_G300N=y diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tw150v1.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tw150v1.c new file mode 100644 index 0000000..738d890 --- /dev/null +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tw150v1.c @@ -0,0 +1,194 @@ +/* + * Hiwifi Wireless AR9331 Dreamboard (HORNET SoC) support + * + * Copyright (C) 2012-2013 eric + * + * 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/gpio.h> +#include <linux/proc_fs.h> + +#include <asm/mach-ath79/ath79.h> +#include <asm/mach-ath79/ar71xx_regs.h> + +#include "common.h" +#include "dev-eth.h" +#include "dev-gpio-buttons.h" +#include "dev-leds-gpio.h" +#include "dev-m25p80.h" +#include "dev-usb.h" +#include "dev-wmac.h" +#include "machtypes.h" + + +#define TW150V1_GPIO_LED_WLAN_2P4 0 /* 2.4G wlan led */ +#define TW150V1_GPIO_LED_USBFLAG 6 /* usb flag */ +#define TW150V1_GPIO_LED_SYSTEM 1 /* system led */ +#define TW150V1_GPIO_LED_INTERNET 27 /* internet led */ + +#define TW150V1_GPIO_USBPOWER 20 /* usb power control */ +#define TW150V1_GPIO_BTN_RST 11 /* reset and wps button */ + +#define TW150V1_GPIO_LED_LAN1 13 +#define TW150V1_GPIO_LED_LAN2 14 +#define TW150V1_GPIO_LED_LAN3 15 +#define TW150V1_GPIO_LED_LAN4 16 +#define TW150V1_GPIO_LED_WAN 17 + +#define TW150V1_KEYS_POLL_INTERVAL 20 /* msecs */ +#define TW150V1_KEYS_DEBOUNCE_INTERVAL (3 * TW150V1_KEYS_POLL_INTERVAL) + +extern void ar933x_eth_leds_on(void); +extern void ar933x_eth_leds_off(void); + +static struct gpio_led tw150v1_leds_gpio[] __initdata = { + { + .name = "tw150v1:green:wlan-2p4", + .gpio = TW150V1_GPIO_LED_WLAN_2P4, + .active_low = 1, + }, { + .name = "tw150v1:green:system", + .gpio = TW150V1_GPIO_LED_SYSTEM, + .active_low = 1, + }, { + .name = "tw150v1:green:internet", + .gpio = TW150V1_GPIO_LED_INTERNET, + .active_low = 1, + } +}; + +static struct gpio_keys_button tw150v1_gpio_keys[] __initdata = { + { + .desc = "reset", + .type = EV_KEY, + .code = KEY_RESTART, + .debounce_interval = TW150V1_KEYS_DEBOUNCE_INTERVAL, + .gpio = TW150V1_GPIO_BTN_RST, + .active_low = 1, + } +}; + +void __init ath79_set_usb_power_gpio(unsigned int gpio, unsigned long flags, + const char *label) +{ + int err; + + err = gpio_request_one(gpio, flags, label); + if (err) { + pr_err("ath79: can't setup GPIO%u (%s), err=%d\n", + gpio, label, err); + return; + } + + err = gpio_export(gpio, false); + if (err) { + pr_err("ath79: can't export GPIO%u (%s), err=%d\n", + gpio, label, err); + } + + return; +} + +static inline void *memmem(const void *s1, const void *s2, size_t len1, size_t len2) +{ + char *bf = (char *)s1, *pt = (char *)s2; + size_t i, j; + + if (len2 > len1) + return NULL; + + for (i = 0; i <= (len1 - len2); ++i) { + for (j = 0; j < len2; ++j) + if (pt[j] != bf[i + j]) break; + if (j == len2) return (bf + i); + } + return NULL; +} + +static u8 __init *get_mac_from_bdinfo(u8 *mac, void *bdinfo, size_t info_sz) +{ + const char mac_key[] = "fac_mac = "; + size_t mac_key_len = strlen(mac_key); + void *mac_sp = NULL; + unsigned int mac_ints[6]; + int i; + + if (!(mac_sp = memmem(bdinfo, mac_key, info_sz, mac_key_len))) { + printk(KERN_ERR "%s: Cannot find MAC address prefix string '%s'.\n", + __FUNCTION__, mac_key); + return NULL; + } + mac_sp += mac_key_len; + + if (sscanf(mac_sp, "%2x:%2x:%2x:%2x:%2x:%2x", &mac_ints[0], + &mac_ints[1], &mac_ints[2], &mac_ints[3], &mac_ints[4], + &mac_ints[5]) != 6) { + printk(KERN_ERR "%s: Cannot get correct MAC address.\n", __FUNCTION__); + return NULL; + } + + for (i = 0; i < 6; i++) + mac[i] = (u8)mac_ints[i]; + + return mac; +} + +static void __init tw150v1_setup(void) +{ + u8 mac[6]; + + u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000); + + u8 no_cal_pattern[12]; + u8 cal_test_data[12]; + + ath79_setup_ar933x_phy4_switch(false, false); + + ath79_gpio_function_enable( + AR933X_GPIO_FUNC_ETH_SWITCH_LED0_EN | + AR933X_GPIO_FUNC_ETH_SWITCH_LED1_EN | + AR933X_GPIO_FUNC_ETH_SWITCH_LED2_EN | + AR933X_GPIO_FUNC_ETH_SWITCH_LED3_EN | + AR933X_GPIO_FUNC_ETH_SWITCH_LED4_EN); + + ath79_register_m25p80(NULL); + + /* check board radio is calibrated or not */ + memset(no_cal_pattern, 0xff, sizeof(no_cal_pattern)); + + memcpy(cal_test_data, ee, 4); + memcpy(cal_test_data + 4, ee + 0x140, 4); + memcpy(cal_test_data + 8, ee + 0x1e0, 4); + + if (0 == memcmp(no_cal_pattern, cal_test_data, sizeof(cal_test_data))) + { + printk(KERN_WARNING "TW150-v1: MISS RADIO CAL DATA!\n"); + } + + ath79_register_leds_gpio(-1, ARRAY_SIZE(tw150v1_leds_gpio), + tw150v1_leds_gpio); + ath79_register_gpio_keys_polled(-1, TW150V1_KEYS_POLL_INTERVAL, + ARRAY_SIZE(tw150v1_gpio_keys), + tw150v1_gpio_keys); + + ath79_set_usb_power_gpio(TW150V1_GPIO_USBPOWER, GPIOF_OUT_INIT_HIGH, + "USB power"); + ath79_register_usb(); + + get_mac_from_bdinfo(mac, (void *)KSEG1ADDR(0x1f010000), 0x200); + + ath79_init_mac(ath79_eth0_data.mac_addr, mac, 1); + ath79_init_mac(ath79_eth1_data.mac_addr, mac, 0); /* eth0(GE1) and wifi0 use same mac_addr */ + + ath79_register_mdio(0, 0x0); + + ath79_register_eth(1); + ath79_register_eth(0); + + ath79_register_wmac(ee, mac); +} + +MIPS_MACHINE(ATH79_MACH_TW150V1, "HC6361", "Hiwifi Wireless HC6361 Board", tw150v1_setup); diff --git a/target/linux/ar71xx/generic/profiles/twr.mk b/target/linux/ar71xx/generic/profiles/twr.mk new file mode 100644 index 0000000..6ccb36e --- /dev/null +++ b/target/linux/ar71xx/generic/profiles/twr.mk @@ -0,0 +1,21 @@ +# +# Copyright (C) 2012-2013 Hiwifi Wireless +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +define Profile/TW150V1 + NAME:=Hiwifi Wireless TW150V1 Board (AR9331) + PACKAGES:= kmod-usb-core kmod-usb2 kmod-usb-storage kmod-usb-storage-extras \ + ppp-mod-pppol2tp ppp-mod-pptp \ + kmod-crypto-deflate kmod-fs-ext4 kmod-fs-msdos kmod-fs-ntfs kmod-fs-vfat \ + kmod-ledtrig-gpio kmod-ledtrig-usbdev \ + kmod-nls-cp437 kmod-nls-iso8859-1 kmod-nls-utf8 \ + e2fsprogs +endef + +define Profile/TW150V1/description + Package set optimized for the Hiwifi Wireless AR9331 New Board. +endef +$(eval $(call Profile,TW150V1)) diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile index a1b53bc..f12c059 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -201,6 +201,7 @@ wndr3700v2_mtdlayout=mtdparts=spi0.0:320k(u-boot)ro,128k(u-boot-env)ro,15872k(fi wndr4300_mtdlayout=mtdparts=ar934x-nfc:256k(u-boot)ro,256k(u-boot-env)ro,256k(caldata),512k(pot),2048k(language),512k(config),3072k(traffic_meter),1152k(kernel),24448k(rootfs),25600k@0x6c0000(firmware),256k(caldata_backup),-(reserved) zcn1523h_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,6208k(rootfs),1472k(kernel),64k(configure)ro,64k(mfg)ro,64k(art)ro,7680k@0x50000(firmware) mynet_n600_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,64k(devdata)ro,64k(devconf)ro,15872k(firmware),64k(radiocfg)ro +tw150v1_mtdlayout=mtdparts=spi0.0:64k(u-boot)ro,64k(bdinfo)ro,1280k(kernel),14848k(rootfs),64k(backup)ro,64k(art)ro,16128k@0x20000(firmware) define Image/BuildKernel cp $(KDIR)/vmlinux.elf $(VMLINUX).elf @@ -758,6 +759,21 @@ define Image/Build/Zcomax fi endef +define Image/Build/twseriesMkImage + @echo "twseriesMkImage: d1-$(1),d2-$(2),d3-$(3),d4-$(4),d5-$(5),d6-$(6),d7-$(7),d8-$(8)" + $(call Sysupgrade/$(7),$(1),$(2),$(5),$(6)) + if [ -e "$(call sysupname,$(1),$(2))" ]; then \ + dd if=$(KDIR_TMP)/vmlinux-$(2).uImage \ + of=$(call imgname,kernel,$(2)).bin bs=64k conv=sync; \ + dd if=$(KDIR)/root.$(1) \ + of=$(call imgname,$(1),$(2)-rootfs).bin bs=128k conv=sync; \ + fi +endef + +define Image/Build/twseriesLZMA + $(call MkuImageLzma,$(2),$(3) $(4)) + $(call Image/Build/twseriesMkImage,$(1),$(2),$(3),$(4),$(5),$(6),$(7)) +endef define Jffs2Template define Image/Build/Template/$(1)/jffs2-$(2) @@ -797,6 +813,8 @@ $(eval $(call SingleProfile,AthGzip,64k,AP81,ap81,AP81,ttyS0,115200,,1310720,661 $(eval $(call SingleProfile,AthGzip,64k,AP83,ap83,AP83,ttyS0,115200,,1310720,6619136,KRuImage)) $(eval $(call SingleProfile,AthGzip,64k,AP96,ap96,AP96,ttyS0,115200,$$(ap96_mtdlayout),1769472,6291456,RKuImage)) +$(eval $(call SingleProfile,twseriesLZMA,64k,TW150V1,tw150v1,HC6361,ttyATH0,115200,$$(tw150v1_mtdlayout),1310720,15204352,KRuImage)) + $(eval $(call SingleProfile,AthLzma,64k,ALFAAP96,alfa-ap96,ALFA-AP96,ttyS0,115200,$$(alfa_ap96_mtdlayout),2097152,13631488,RKuImage)) $(eval $(call SingleProfile,AthLzma,64k,ALL0258N,all0258n,ALL0258N,ttyS0,115200,$$(all0258n_mtdlayout),65536,5373952,KRuImage)) $(eval $(call SingleProfile,AthLzma,256k,ALL0315N,all0315n,ALL0315N,ttyS0,115200,$$(all0315n_mtdlayout),262144,12845056,KRuImage)) diff --git a/target/linux/ar71xx/patches-3.10/981-MIPS-ath79-turbowireless-machine.patch b/target/linux/ar71xx/patches-3.10/981-MIPS-ath79-turbowireless-machine.patch new file mode 100644 index 0000000..91114f9 --- /dev/null +++ b/target/linux/ar71xx/patches-3.10/981-MIPS-ath79-turbowireless-machine.patch @@ -0,0 +1,52 @@ +--- a/arch/mips/ath79/Makefile ++++ b/arch/mips/ath79/Makefile +@@ -104,4 +106,5 @@ + obj-$(CONFIG_ATH79_MACH_WZR_HP_AG300H) += mach-wzr-hp-ag300h.o + obj-$(CONFIG_ATH79_MACH_WZR_HP_G450H) += mach-wzr-hp-g450h.o + obj-$(CONFIG_ATH79_MACH_ZCN_1523H) += mach-zcn-1523h.o + obj-$(CONFIG_ATH79_MACH_CARAMBOLA2) += mach-carambola2.o ++obj-$(CONFIG_ATH79_MACH_TW150V1) += mach-tw150v1.o + + +--- a/arch/mips/ath79/machtypes.h ++++ b/arch/mips/ath79/machtypes.h +@@ -115,6 +115,7 @@ + ATH79_MACH_WZR_HP_G300NH, /* Buffalo WZR-HP-G300NH */ + ATH79_MACH_WZR_HP_G300NH2, /* Buffalo WZR-HP-G300NH2 */ + ATH79_MACH_WZR_HP_G450H, /* Buffalo WZR-HP-G450H */ ++ ATH79_MACH_TW150V1, /* Hiwifi Wireless AR9331 New Board */ + ATH79_MACH_ZCN_1523H_2, /* Zcomax ZCN-1523H-2-xx */ + ATH79_MACH_ZCN_1523H_5, /* Zcomax ZCN-1523H-5-xx */ + }; + + #endif /* _ATH79_MACHTYPE_H */ +--- a/arch/mips/ath79/Kconfig ++++ b/arch/mips/ath79/Kconfig +@@ -219,6 +219,16 @@ + select ATH79_DEV_LEDS_GPIO + select ATH79_DEV_M25P80 + select ATH79_DEV_USB ++ ++config ATH79_MACH_TW150V1 ++ bool "Hiwifi Wireless TW150V1 Board (AR9331) support" ++ select SOC_AR933X ++ 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_WP543 + bool "Compex WP543/WPJ543 board support" +--- a/drivers/usb/host/Kconfig ++++ b/drivers/usb/host/Kconfig +@@ -219,7 +219,7 @@ + + config USB_EHCI_ATH79 + bool "EHCI support for AR7XXX/AR9XXX SoCs (DEPRECATED)" +- depends on (SOC_AR71XX || SOC_AR724X || SOC_AR913X || SOC_AR933X) ++ depends on (SOC_AR71XX || SOC_AR724X || SOC_AR913X || SOC_AR933X || SOC_AR934X) + select USB_EHCI_ROOT_HUB_TT + select USB_EHCI_HCD_PLATFORM + default y _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel