Skip to content

Commit

Permalink
ipq807x: add QNAP 301w
Browse files Browse the repository at this point in the history
QNAP 301w is a AX WIFI router with 4 1G and 2 10G ports.

Specifications:

    •     CPU: Qualcomm IPQ8072A Quad core Cortex-A53 2.2GHz
    •     RAM: 1024MB of DDR3
    •     Storage: 4GB eMMC (contains kernel and rootfs) / 8MB NOR
          (contains art and u-boot-env)
    •     Ethernet: 4x 1G RJ45 ports + 2 10G ports (Aquantia AQR113C)
    •     WLAN:
          2.4GHz: Qualcomm QCN5024 2x2 802.11b/g/n/ax 1174 Mbps PHY rate
          5GHz: Qualcomm QCN5054 4x4 802.11a/b/g/n/ac/ax 2402 PHY rate

    •     LEDs:
          7 x GPIO-controlled dual color LEDs + 2 GPIO-controlled single color LEDs

            • Buttons: 1x soft reset / 1x WPS
            • Power: 12V DC jack

        A poulated serial header is onboard.
        RX/TX is working, bootwait is active, secure boot is not enabled.

        SSH can be activated in the stock firmware, hold WPS button til the second beep
	(yes the router has a buzzer)
        SSH is available on port 22200, login with user admin and
	password "mac address of the router".

        Installation Instructions:

            • obtain serial access (https://openwrt.org/inbox/toh/qnap/301w#serial)
            • stop auto boot
            • setenv serverip 192.168.10.1
            • setenv ipaddr 192.168.10.10
            • tftpboot the initramfs image
              (openwrt-ipq807x-generic-qnap_301w-initramfs-fit-uImage.itb)
            • bootm

            • make sure that current_entry is set to "0":
              "fw_printenv -n current_entry" should be print "0". If not,
	       do "fw_setenv current_entry 0"
            • copy openwrt-ipq807x-generic-qnap_301w-squashfs-sysupgrade.bin
	          to the device to /tmp folder
            • sysupgrade -n /tmp/openwrt-ipq807x-generic-qnap_301w-squashfs-sysupgrade.bin
              this flashes openwrt to the first kernel and rootfs partition (mmcblk0p1 / mmcblk0p4)
            • reboot

        Note: this leaves the second kernel / rootfs parition untouched. So if you want
              to go back to stock, stop u-boot autoboot, "setenv current_entry 1" ,
	       "saveenv", "bootipq".
              Stock firmware should start from the second partition.
	      Then do a firmwareupgrade in the stock gui, that should overwrite the openwrt
	      in the first partitions

        Make 10G Aquantia phy's work:
              The aquantia phy's need a firmware to work. This can either be loaded
	      in linux with a userspace tool or in u-boot.

              I was not successfull to load the firmware in linux (aq-fw-download) but luckily there is
	      aq_load_fw available in u-boot. But first the right firmware needs to write
	      to the 0:ETHPHYFW mtd partition (it is empty on my device)

              Grab the ethphy firmware image from:
	      https://github.com/kirdesde/nbg7815_gpl/blob/master/target/linux/ipq/ipq807x_64/prebuilt_images/AQR_ethphyfw.mbn
	      and scp that to openwrt.

              Check the 0:ETHPHYFW partition number:
              cat /proc/mtd|grep "0:ETHPHYFW", should be mtd10.

              Backup the 0:ETHPHYFW partition:
              dd if=/dev/mtd10 of=/tmp/ethphyfw.backup, scp ethphyfw.backup to a save place.

              Write the new firmware image to the 0:ETHPHYFW partition:
              "mtd erase /dev/mtd10", "mtd -n write AQR_ethphyfw.mbn /dev/mtd10".

              Reboot to u-boot.

              Check if aq_load_fw is working:

              "aq_load_fw 0", that checks the firmware and if successfull,
	      loads iram and dram to one of the aquantia phy's.

              If that worked, add the aq_load_fw to the bootcmd:
              setenv "'aq_load_fw 0 && aq_load_fw 8 && bootipq'"

              "saveenv"

              "reset"

              Board reboots and the firmware load to both phy's should start and
	      then openwrt boots.

              Check if the 10G ports work.

              Note: lan port labeled "10G-2" is configured as WAN port as per default.
	      All other port are in the br-lan. This can be changed in the network config.

Signed-off-by: Dirk Buchwalder <buchwalder@posteo.de>
  • Loading branch information
Dirk Buchwalder authored and robimarko committed Nov 8, 2021
1 parent 55bb1e2 commit a0e0140
Show file tree
Hide file tree
Showing 12 changed files with 940 additions and 1 deletion.
5 changes: 5 additions & 0 deletions package/boot/uboot-envtools/files/ipq807x
Expand Up @@ -16,6 +16,11 @@ xiaomi,ax9000)
[ -n "$idx" ] && \
ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x20000"
;;
qnap,301w)
idx="$(find_mtd_index 0:appsblenv)"
[ -n "$idx" ] && \
ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x20000" "0x20000" "1"
;;
esac

config_load ubootenv
Expand Down
2 changes: 2 additions & 0 deletions package/firmware/ipq-wifi/Makefile
Expand Up @@ -50,6 +50,7 @@ ALLWIFIBOARDS:= \
nec_wg2600hp3 \
plasmacloud_pa1200 \
plasmacloud_pa2200 \
qnap_301w \
qxwlan_e2600ac \
redmi_ax6 \
xiaomi_ax3600 \
Expand Down Expand Up @@ -148,6 +149,7 @@ $(eval $(call generate-ipq-wifi-package,mobipromo_cm520-79f,MobiPromo CM520-79F)
$(eval $(call generate-ipq-wifi-package,nec_wg2600hp3,NEC Platforms WG2600HP3))
$(eval $(call generate-ipq-wifi-package,plasmacloud_pa1200,Plasma Cloud PA1200))
$(eval $(call generate-ipq-wifi-package,plasmacloud_pa2200,Plasma Cloud PA2200))
$(eval $(call generate-ipq-wifi-package,qnap_301w,QNAP 301w))
$(eval $(call generate-ipq-wifi-package,qxwlan_e2600ac,Qxwlan E2600AC))
$(eval $(call generate-ipq-wifi-package,redmi_ax6,Redmi AX6))
$(eval $(call generate-ipq-wifi-package,xiaomi_ax3600,Xiaomi AX3600))
Expand Down
Binary file not shown.
8 changes: 8 additions & 0 deletions target/linux/ipq807x/base-files/etc/board.d/01_leds
Expand Up @@ -10,6 +10,14 @@ redmi,ax6|\
xiaomi,ax3600)
ucidef_set_led_netdev "wan" "WAN" "blue:network" "eth0"
;;
qnap,301w)
ucidef_set_led_netdev "lan1" "LAN1" "green:lan1" "eth0"
ucidef_set_led_netdev "lan2" "LAN2" "green:lan2" "eth1"
ucidef_set_led_netdev "lan3" "LAN3" "green:lan3" "eth2"
ucidef_set_led_netdev "lan4" "LAN4" "green:lan4" "eth3"
ucidef_set_led_netdev "10G_1" "10G_1" "green:10g_1" "eth4"
ucidef_set_led_netdev "10G_2" "10G_2" "green:10g_2" "eth5"
;;
esac

board_config_flush
Expand Down
3 changes: 3 additions & 0 deletions target/linux/ipq807x/base-files/etc/board.d/02_network
Expand Up @@ -14,6 +14,9 @@ ipq807x_setup_interfaces()
edimax,cax1800)
ucidef_set_interfaces_lan_wan "eth0"
;;
qnap,301w)
ucidef_set_interfaces_lan_wan "eth0 eth1 eth2 eth3 eth4" "eth5"
;;
redmi,ax6|\
xiaomi,ax3600)
ucidef_set_interfaces_lan_wan "eth1 eth2 eth3" "eth0"
Expand Down
Expand Up @@ -10,6 +10,7 @@ case "$FIRMWARE" in
"ath11k/IPQ8074/hw2.0/caldata.bin")
case "$board" in
edimax,cax1800|\
qnap,301w|\
redmi,ax6|\
xiaomi,ax3600|\
xiaomi,ax9000)
Expand Down
83 changes: 83 additions & 0 deletions target/linux/ipq807x/base-files/lib/upgrade/mmc.sh
@@ -0,0 +1,83 @@
#
# Copyright (C) 2016 lede-project.org
#

# this can be used as a generic mmc upgrade script
# just add a device entry in platform.sh,
# define "kernelname" and "rootfsname" and call mmc_do_upgrade
# after the kernel and rootfs flash a loopdev (as overlay) is
# setup on top of the rootfs partition
# for the proper function a padded rootfs image is needed, basically
# append "pad-to 64k" to the image definition
# this is based on the ipq806x zyxel.sh mmc upgrade

. /lib/functions.sh

mmc_do_upgrade() {
local tar_file="$1"
local rootfs=
local kernel=

[ -z "$kernel" ] && kernel=$(find_mmc_part ${kernelname})
[ -z "$rootfs" ] && rootfs=$(find_mmc_part ${rootfsname})

[ -z "$kernel" ] && echo "Upgrade failed: kernel partition not found! Rebooting..." && reboot -f
[ -z "$rootfs" ] && echo "Upgrade failed: rootfs partition not found! Rebooting..." && reboot -f

mmc_do_flash $tar_file $kernel $rootfs

return 0
}

mmc_do_flash() {
local tar_file=$1
local kernel=$2
local rootfs=$3

# keep sure its unbound
losetup --detach-all || {
echo Failed to detach all loop devices. Skip this try.
reboot -f
}

# use the first found directory in the tar archive
local board_dir=$(tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$')
board_dir=${board_dir%/}

echo "flashing kernel to $kernel"
tar xf $tar_file ${board_dir}/kernel -O >$kernel

echo "flashing rootfs to ${rootfs}"
tar xf $tar_file ${board_dir}/root -O >"${rootfs}"

# a padded rootfs is needed for overlay fs creation
local offset=$(tar xf $tar_file ${board_dir}/root -O | wc -c)
[ $offset -lt 65536 ] && {
echo Wrong size for rootfs: $offset
sleep 10
reboot -f
}

# Mount loop for rootfs_data
local loopdev="$(losetup -f)"
losetup -o $offset $loopdev $rootfs || {
echo "Failed to mount looped rootfs_data."
sleep 10
reboot -f
}

echo "Format new rootfs_data at position ${offset}."
mkfs.ext4 -F -L rootfs_data $loopdev
mkdir /tmp/new_root
mount -t ext4 $loopdev /tmp/new_root && {
echo "Saving config to rootfs_data at position ${offset}."
cp -v "$UPGRADE_BACKUP" "/tmp/new_root/$BACKUP_FILE"
umount /tmp/new_root
}

# Cleanup
losetup -d $loopdev >/dev/null 2>&1
sync
umount -a
reboot -f
}
5 changes: 5 additions & 0 deletions target/linux/ipq807x/base-files/lib/upgrade/platform.sh
Expand Up @@ -13,6 +13,11 @@ platform_do_upgrade() {
edimax,cax1800)
nand_do_upgrade "$1"
;;
qnap,301w)
kernelname="0:HLOS"
rootfsname="rootfs"
mmc_do_upgrade "$1"
;;
redmi,ax6|\
xiaomi,ax3600|\
xiaomi,ax9000)
Expand Down
1 change: 1 addition & 0 deletions target/linux/ipq807x/config-5.10
@@ -1,6 +1,7 @@
CONFIG_64BIT=y
# CONFIG_APQ_GCC_8084 is not set
# CONFIG_APQ_MMCC_8084 is not set
CONFIG_AQUANTIA_PHY=y
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
CONFIG_ARCH_KEEP_MEMBLOCK=y
Expand Down

0 comments on commit a0e0140

Please sign in to comment.