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

Reply via email to