From dd5d52aac7fa13ecbc691856943256f0adc187d0 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Wed, 19 May 2021 21:04:43 +0200 Subject: [PATCH] ipq807x: add Xiaomi AX3600 Xiaomi AX3600 is a budget 802.11ax dual-band router/AP. Specifications: * CPU: Qualcomm IPQ8071A Quad core Cortex-A53 1.4GHz * RAM: 512MB of DDR3 * Storage: 256MB of parallel NAND * Ethernet: 4x1G RJ45 ports (QCA8075) with 1x status LED per port * WLAN: * PCI based Qualcomm QCA9889 1x1 802.11ac Wawe 2 for IoT * 2.4GHz: Qualcomm QCN5024 2x2 802.11b/g/n/ax 574 Mbps PHY rate * 5GHz: Qualcomm QCN5054 4x4@80MHz or 2x2@160MHz 802.11a/b/g/n/ac/ax 2402 PHY rate * LED-s: * System (Blue and Yellow) * IoT (Blue) * Network (Blue and Yellow) * Buttons: 1x Soft reset * Power: 12V DC Jack Installation instructions: Obtaining SSH access is mandatory https://openwrt.org/inbox/toh/xiaomi/xiaomi_ax3600#obtain_ssh_access Installation is done by the ubiformat method, through SSH: 1. Open an SSH shell to the router 2. Copy the file openwrt-ipq807x-generic-xiaomi_ax3600-initramfs-factory.ubi to the /tmp directory 3. Check which rootfs partition is your router booted in (0 = rootfs | 1 = rootfs_1): nvram get flag_boot_rootfs 4. Find the rootfs and rootfs_1 mtd indexes respectively: cat /proc/mtd Please confirm if mtd12 and mtd13 are the correct indexes from above! 5. Use the command ubiformat to flash the opposite mtd with UBI image: If nvram get flag_boot_rootfs returned 0: ubiformat /dev/mtd13 -y -f /tmp/openwrt-ipq807x-generic-xiaomi_ax3600-initramfs-factory.ubi -s 2048 -O 2048 && nvram set flag_boot_rootfs=1 && nvram set flag_last_success=1 && nvram commit otherwise: ubiformat /dev/mtd12 -y -f /tmp/openwrt-ipq807x-generic-xiaomi_ax3600-initramfs-factory.ubi -s 2048 -O 2048 && nvram set flag_boot_rootfs=0 && nvram set flag_last_success=0 && nvram commit 6. Reboot the device by: reboot Previous commands flashed an ubinized OpenWrt initramfs that will serve as the intermediate step since OpenWrt uses unified rootfs in order to fully utilize NAND and provide enough space for packages. Continue in order to pernamently flash OpenWrt: 7. SSH into OpenWrt from one of the LAN ports 8. Copy the file openwrt-ipq807x-generic-xiaomi_ax3600-squashfs-sysupgrade.bin to the /tmp directory 9. Sysupgrade the device: sysupgrade -n /tmp/openwrt-ipq807x-generic-xiaomi_ax3600-squashfs-sysupgrade.bin Device will reboot with OpenWrt, and then sysupgrade can be used to upgrade the device when desired. Signed-off-by: Robert Marko Signed-off-by: Ansuel Smith --- package/boot/uboot-envtools/files/ipq807x | 24 + package/firmware/ipq-wifi/Makefile | 15 +- .../ipq-wifi/board-xiaomi_ax3600.ipq8074 | Bin 0 -> 131176 bytes .../ipq-wifi/board-xiaomi_ax3600.qca9889 | Bin 0 -> 2260 bytes .../ipq807x/base-files/etc/board.d/01_leds | 16 + .../ipq807x/base-files/etc/board.d/02_network | 28 + .../etc/hotplug.d/firmware/11-ath11k-caldata | 20 + .../ipq807x/base-files/etc/init.d/bootcount | 14 + .../base-files/lib/upgrade/platform.sh | 34 + .../arm64/boot/dts/qcom/ipq8071-ax3600.dts | 73 +++ .../arm64/boot/dts/qcom/ipq8071-ax3600.dtsi | 587 ++++++++++++++++++ target/linux/ipq807x/image/generic.mk | 18 + 12 files changed, 827 insertions(+), 2 deletions(-) create mode 100644 package/boot/uboot-envtools/files/ipq807x create mode 100644 package/firmware/ipq-wifi/board-xiaomi_ax3600.ipq8074 create mode 100644 package/firmware/ipq-wifi/board-xiaomi_ax3600.qca9889 create mode 100644 target/linux/ipq807x/base-files/etc/board.d/01_leds create mode 100644 target/linux/ipq807x/base-files/etc/board.d/02_network create mode 100644 target/linux/ipq807x/base-files/etc/hotplug.d/firmware/11-ath11k-caldata create mode 100755 target/linux/ipq807x/base-files/etc/init.d/bootcount create mode 100644 target/linux/ipq807x/base-files/lib/upgrade/platform.sh create mode 100644 target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8071-ax3600.dts create mode 100644 target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8071-ax3600.dtsi diff --git a/package/boot/uboot-envtools/files/ipq807x b/package/boot/uboot-envtools/files/ipq807x new file mode 100644 index 00000000000000..bf116d1fca0c9f --- /dev/null +++ b/package/boot/uboot-envtools/files/ipq807x @@ -0,0 +1,24 @@ +[ -e /etc/config/ubootenv ] && exit 0 + +touch /etc/config/ubootenv + +. /lib/uboot-envtools.sh +. /lib/functions.sh + +board=$(board_name) + +case "$board" in +xiaomi,ax3600) + idx="$(find_mtd_index 0:appsblenv)" + [ -n "$idx" ] && \ + ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x20000" + idx2="$(find_mtd_index bdata)" + [ -n "$idx2" ] && \ + ubootenv_add_uci_sys_config "/dev/mtd$idx2" "0x0" "0x10000" "0x20000" + ;; +esac + +config_load ubootenv +config_foreach ubootenv_add_app_config + +exit 0 diff --git a/package/firmware/ipq-wifi/Makefile b/package/firmware/ipq-wifi/Makefile index 2096b5f2d6be32..9cc33fd5243154 100644 --- a/package/firmware/ipq-wifi/Makefile +++ b/package/firmware/ipq-wifi/Makefile @@ -40,6 +40,7 @@ ALLWIFIBOARDS:= \ qxwlan_e2600ac-c2 \ sony_ncp-hg100-cellular \ teltonika_rutx \ + xiaomi_ax3600 \ zte_mf289f ALLWIFIPACKAGES:=$(foreach BOARD,$(ALLWIFIBOARDS),ipq-wifi-$(BOARD)) @@ -48,7 +49,7 @@ define Package/ipq-wifi-default SUBMENU:=ath10k Board-Specific Overrides SECTION:=firmware CATEGORY:=Firmware - DEPENDS:=@(TARGET_ipq40xx||TARGET_ipq806x) + DEPENDS:=@(TARGET_ipq40xx||TARGET_ipq806x||TARGET_ipq807x) TITLE:=Custom Board endef @@ -57,6 +58,11 @@ define ipq-wifi-install-one-to $(INSTALL_DATA) $(1) $(2)/lib/firmware/ath10k/$(3)/board-2.bin endef +define ipq-wifi-install-ath11-one-to + $(INSTALL_DIR) $(2)/lib/firmware/ath11k/$(3)/ + $(INSTALL_DATA) $(1) $(2)/lib/firmware/ath11k/$(3)/board-2.bin +endef + define ipq-wifi-install-one $(if $(filter $(suffix $(1)),.QCA4019 .qca4019),\ $(call ipq-wifi-install-one-to,$(1),$(2),QCA4019/hw1.0),\ @@ -64,8 +70,12 @@ define ipq-wifi-install-one $(call ipq-wifi-install-one-to,$(1),$(2),QCA9888/hw2.0),\ $(if $(filter $(suffix $(1)),.QCA9984 .qca9984),\ $(call ipq-wifi-install-one-to,$(1),$(2),QCA9984/hw1.0),\ + $(if $(filter $(suffix $(1)),.QCA9889 .qca9889),\ + $(call ipq-wifi-install-one-to,$(1),$(2),QCA9887/hw1.0),\ + $(if $(filter $(suffix $(1)),.IPQ8074 .ipq8074),\ + $(call ipq-wifi-install-ath11-one-to,$(1),$(2),IPQ8074/hw2.0),\ $(error Unrecognized board-file suffix '$(suffix $(1))' for '$(1)')\ - ))) + ))))) endef # Blank line required at end of above define due to foreach context @@ -116,6 +126,7 @@ $(eval $(call generate-ipq-wifi-package,qxwlan_e2600ac-c1,Qxwlan E2600AC C1)) $(eval $(call generate-ipq-wifi-package,qxwlan_e2600ac-c2,Qxwlan E2600AC C2)) $(eval $(call generate-ipq-wifi-package,sony_ncp-hg100-cellular,Sony NCP-HG100/Cellular)) $(eval $(call generate-ipq-wifi-package,teltonika_rutx,Teltonika RUTX)) +$(eval $(call generate-ipq-wifi-package,xiaomi_ax3600,Xiaomi AX3600)) $(eval $(call generate-ipq-wifi-package,zte_mf289f,ZTE MF289F)) $(foreach PACKAGE,$(ALLWIFIPACKAGES),$(eval $(call BuildPackage,$(PACKAGE)))) diff --git a/package/firmware/ipq-wifi/board-xiaomi_ax3600.ipq8074 b/package/firmware/ipq-wifi/board-xiaomi_ax3600.ipq8074 new file mode 100644 index 0000000000000000000000000000000000000000..fd37fe8eb1fcb02130a3a4f529454d71a50c132e GIT binary patch literal 131176 zcmeHw33OD~ndV=wo{AF4Qb{UptWv2Ygxk(wY!GMxNgx&@gb>;{B!O+P0n02lwgIsS zEI?wDFvM{j;@C-!Pfm~Hb`qaCu}$JEolY{RPoJJl;_gl|6Q?^p(=(&#^z?Z8bk?2@HR?|Zs!->$a32MX(UwLOWN z#dQxZTfEp|^rDGFblpfE`j7iVX}Lp8>~wZ^}7#=rH(zYWH}jYe(!b2*)?zzJ}ZOYD;x#JC)e?i@mcCv zVthP~xxr5XzGsJUcME$anCzL~?3v%}ncwW0-|U&+?3v%}ncson5QoEMG9pp)T`%xa&d7I_sPuL2e-A*}g0&U3Qh>6Dl-NQQ&u zxYu>L=lehU>5xV0 z?wQdHGiT0p^IPY?F2o`AM!+_Vpp9x08G$IdF}PpwfDqvBoQmA7s-X~=Fa%uklR+Jx zuu;`O3W4!KV1}dyuG}3C>AZRKW@n})#QjclI2_ivk+XY|GF7*==7h9 z%zIxX?NyPalW30v$E*iM+zZhDA8oY%g~(itpY~d?J?^i~T8j4RX#d}BwErdM|88*p z9KRX!Unb&;NBe({-2PdF^uIwL?+5!h6~JIt9xzC=i2>JuIiwN8V?hj73L3EMxgXSVL)G~^gv-?>cNX&sqHU(A?q1$D{}(j z;^!NB^N(ikPQiJ@485;3oX_jb?nuE|)C}jp)Ow}xbmmh@+squ1t6$l6b!B(v!SMbX zKhfX$SE_pQ(O;^i?WyZc{dp%d_gVY9@On*O-f8~MPrNS3IBjcnZ#UW-$6YlC{@5zZYL? zy;9JXwLiJltc9mUUa#xVKONrR`Oh_+%R8L;L`u_Oy>85};FxcB60V2LaP_s;{zA^r zvJS2n^E+UjU!cG2J=XsEzR+}`pwst+*U}&6XY}W_$jux}eJcb$4Fq_f>eCokjX60H zD68A~?oZ9znz#7&e<0#}TV(!aTvtCXlDt(U0r!VuagQv<#*(wYC*uDm?w4N0{gK_c z&xH0~+~@Qpp$|QB2iZRm$$V2}!9}#+i}p2WkNYYfT+_!!*=W!4zk%_upgrcFT8Z`# zpnW3R+xRO^4(=`a-xJBeJ<55wHy)ACSZR7tzO)(1Tj&K`tmbJ!m^<~z#{I!;=pprJ0ozlL8qps22k)7Q_Wx>A576Gw z1GG;=doR`>H*1)B0DJU(3wi*1O2d=I$*{)+=u>Pm^gxd+2imhA?bELX?YRo`0FEBC zw`0$S9(;X>9;_UJ9`ptEU`qf8&uokz9eMsae;3dL%F)n+2FQWyr#=6V$Z|0J0qoJx z1L#o-+d~e9J=^%ZOV%%dKXjRTFb8r>##uHV{_q~^(Z59=-|%NQpa-vF{_rQM@JC+w zBg3EB_`6fU8wC9UYEc{!vzY+B7rW|R{^anQV+0X;}gV$lt zCjxRX_7yMM|If&B+>!`4jq_BU0@!ucJ%=J3itPrKd2t2KY%UxFutJ&@axH2F#cl5F#~IXO+*S= z-^2Ld7$ZG^98&6mBjtcS$fW{{L{aT@wu;I{-*q9{-4PEN=OfQPJ}%g{$MnEz;hb)0Dhh46ualN(0Sk59yl27 zZCr0;Vg8xl8sbk1(0)Gj2(pM2c+N7eyMUv4PULlO9PRlZBI8IsGVJkn%f0}=Z1{B> za=4`)(64h}u2y!s4H}ptS4A_$I>(GO17$5smN)6fZq0@LQYyfPR_#0_D&IInp2Sd|_u__#5~WoD&T>TKxJw9<;Zy zzZ-hQ_8k8>#y9l{_|3HOj917Xd;os{IfPxe1@*~}9{9hD_HUv6MPL}b55)7n-Rr(= zv^Vqs{%8)a7ly3|=J=N|KK3Q!x|8z<4tD0h2y)1RJ^Elz^MPYpJ@kO*1N!BUZ0G^y zXzD>%P!4EsT({YfL)gATJ%T+C#~&E?!QQu=Z>Y!c$FW$vo%4;U2gW(=ZTPkRA%30b zbsIp2_UEDJwE1XnV}D-wJ;(v)lMJ+T74zQ<9J#Ly<9uM~ z0p#d|KbQ}DH1-9I&->D|erH1uei1z9q5Ztm(Bo#vk^UqBaV5556CK>N99 zpH>AucyJhc06n_p{R56~<9cJ!htR_zdXNM;df*Rc+1MAt?&rat)3!m5n15W7JvkWd zt@aFm!24i4Tg|j_J~8HR`ZJzypod=gLqm^koO45Zfc-i1>yRV-`kW5vQw{oAihj~C z7dzMgyxw>d?P-rV=Y_7@?D~Tr!k*AR9plf1J*U+|4={cL{E^4T0U>nV2|Ws3cfv2) zJ*N)UgW155dKmAusRyuUUh`yp5&i)CLg;*f_A_nV*EQ@JaAgDEXu+ly0rU>m9_T~X=5loqe; z#VI|o4b_ycsPte;i`VwzlpffIYD!mBdN8HMYkP4@4{Sp49yirgTN62UA+Swil=Lz&2Dj(3?dUl*B+LyCEt#UB$^p(0( zxd$^J;d|3&=<8`ZykfV%DP^OXBhuGbb1Z+qzm4xdnc-wl)3N-Htk%>mW)6N$=?e|# zR~*fHlJ5bVp|g9-p$B)S*T$_hb3`s(Xz0v;(!VWn-C$ntJJy}&1_65AIy94mFC`p zBMbNNxj-`d4uaWEtbLea*-7pUQ6MyFX^Q*uU*m!NKfD z`5uQE`pz{!zv6L!L-GbQN90=nwyuH$S=+7n_4d{sS-!{Dl(KoS-t#ZEonP|wf=Bt> zq#2H$sytYliQfH=oSkm%TmFBDd3*8oTli_}ls3nHhSz>kj2U z=BrJy%&)(%>BNeC{x&Q2C(l(qzkF|IbFu}ON z-|6m}XLEP?>aF_sa)0Z|!u>hh`F~!R;mVbkQ~3w|?R?+b45zxc9xB|ES)XFj=W~~9 zj_2+7w|gzJ>^t8~9cr=4_e_6XSMC8{JKy&-!|4~Qo>}%-MvYZpUg_O&q-bw?byBHW zOQgTQ@x+S#{;>I-=xsTkzb~te&&`>k|6KEPd5>o`Sn=!at2>#y-`B?H@6B-OawGJ` z-{!U8cdozT)QW?d+pYR?{%j-q%dAg**la2CN>AJKMZ0qv(<~Ug{9;R2{(*&$Sh0HX zV&l;~Vqh8L!r6vr3!m`SS?#x{ukJ+dK3`jsMR(8i)*M;3C!;yZGDd%Y>#4$nSv&ar zxfw2=<$C?~DVF*5pMChLg2%JM=KNf5+o_cY7d~ojd;Waw5%`F0RvkYF{bO6JJcu9c zJPf~=t{8LKZpE~(Z`;ZI{aIo9a+jaL76=5+Pb%OCYsr>-?uA#(D<*3P9* zrne+n?5!uLL&+As>OE8WbkUy7I;%eS^wpmz;QTChbO|=I@?iEO*7f#ZZaG1HvFi9s zJ=+hj+?^dJ%Ol6PA6m6Dy&|c2aDLqvYC3bD%xJMgg>x;> z7VKJBpJv%V`p+~SU$HN%)#}48ovVLtIds=*3w>u=p3Q@QPO-E-d$I0VZilZW*@Au7 zh5F;mpUQ0GJMv~Yb*|=c?(U36tL>jWwdLSLkK{CYSDUp&UOL@$pkPOKb@H0QymP(v zNAmXinyvoe^y!8}g}XEBQY}95?CH9LxsPPkTHAJ=Z#Z7CAHLl(zwV2TC-U~ecUtE6 zh0E>7S3Z@~W|haabFI%8K9Sv!W*Osir<(Q`Y|pMrwaoeGxr*mk!T%*&>h+wiIheQ8 z7v_ihx~mVac+6iLW*--7JD2T+ty=B;Qf+7cKHoO${`=C!jn5QtPqwV%dheEl#d{Vu zc`aBSJG$fPRgb2ZdshwOcdDoA@G@YZZ1D$YU#NaMZ)aw0szsI;UZ{Vja94I+s%8J^ zzSwjk53;mkb)~=YBy_Fas%z)Z)?#14-fijc+S&H!3gHjpiw5U%`FLYTep^;Wn#Dej zc2^!M>PWBkTH0RhZhU6>W4@Xci|$_OZa#!Lhvjwkww@?>DmzSW=PuP8Tl%DLn^pe? zXP{CF0fm4ha zpb$_9Cy)5Kssx1QY@a0fm4hapb$_9CX{%o9pn)qR<++4i%<10)BrcD9e|Tk?G6uWej0q0pnbrmE{Lv?DWhGj6a0M?}?3b z`Sg~)W%c;2!od)OFv#6qDW}sJg>ZLGYRqRdQ*>jW={WQGuVs!hjQQjyS%+nHO*?z8 zzx|^Jrg@lTVpG!{V+43E9pf%lcM1W8z&Ii>3)iX)OK#rzQ`OpY?X@@G{n4FkEx9?| zddqJPex5sX?cU)!kQmXuod4cH2!21l^HGFWgrVQ9Ep>Hf9@DH-#ZXyRX3e*zC$f%p z+@a}5xlk1p0t$goAkc1v)+T;6H8s@@{jRI3s4(-GMxCaLii)zb^=sBx^R4N-xlRp& zIsbe_CX-ED*K18%*KW0@BOxg9=t%BMc6pb$_9CxfgD3*&Mm$W((&5j8|zizM3-j~HmExiPLA<3cyI=$IK=1l<_raG~bY+1_uf ze5$}U0#4W|jMNF!bU0zBh%PcA1skV?6L#u^ojPHsPS`1;hNwHo*-o9XQzz`y2|IPd zPMs5Er_Wsr0Qp>Se>T5u3rbZS6$0a=#$(>?s1`X6jpN`Su#r3C;2+}P9}rz|7~}3A z;@}_R;2+}PAL8I25H&B0 z^}tRMU7iWBQxELa13UG=PCc+wL=92*jI*73V5c6~sRwrIft`AkolYZdpS(+rhn>d5 zPUB&x@vu`wSNsInX*}#S9(EcJJB^2(B5H_w{5acbJnS?cb{Y>mjfb7aD?6RM$~%o_ zKIR8|)#11!Fjdua+<{XA*hXNg>X=&B=n=53M5^MrATW9fsvhhhFfPIyhfeLRWg_d0 z!xB}OBSc^#<*vq>TnLO%rBt(VKwxrdj+*U6A}|i>rn(#<0uw2BHP+-pV1z0)b((1d zcqSFki-w*}1&_b|M0`HgE&?v}7xpYGc>Ikg;`6L_`*)+iuxDSv+j#!fZuezP@BZ{w zb<29*zE!r|E`M@ag_^BGU~(a#!H*&0vF-sK@nbyW4L&Az@HuakJ5laLxpUwUp81}z z=e}?0C`Os7xdv{AKTnSJ&A|F*V0|+N+=w2;)`@)1e3VPNV{^@o_2TdKgU_)KbWY^6 z?01~pI25XVXL9);HCu&%LO>y)5KstAX9S!$ha>(m{M{|&;p~m5BOaQ_ce%#lXcpF` z6X)>o_rm4EC(hyF@2L%RPUO34W4xS*-Icez|HGk` z%FqAl&@8!C-gNc@YV8UEg@8gpA)pY@wSk*D-Yvq7S*MP7i*)AzqlTy>9@23y7SW|o zz`I7D*to|bL&up=$2(0r-f7bDPLn&2N6QAczmdJtQ6{2dGt`7y{J|M!;1VW~!! zI?jYT?#=3WmrBRGRC@G4r;hij^a*;OYP{BUyM8O%KL{07ULO2UjjU;9^$G!nfI?un z2)MCVy0KTfu~!=ZwHo$HH}*RL|60_*(;;5S4Ly6jK*FWjlD7&dnKZVs3W=&J&3K* z*eel{AA|hKyH`eIuZ+fC8I8R%8hd3l_R47NmCB3&=!d~gZUWuq7>WFSc4`QnednF?B zV~{_2_evM`N*DG@7xqdQ_DUD_N*DG@*A(3=8(tDI<8W<3)gKuGp_|?+F(wF%ObV)% zLLh*^m?+^i??ma+KJ18zhQV(Ucy zR*221kEmK4?lpz~7Rf;8ME)Mhh$cOXM(SPcyUoL>`6vVw0tx|zfI>haa61G%IEN!@ zh&tlO_#H0rF|mWc#f5U5!x44FLlgPiT%$OS-L|O*=kV~~{KEQh4oAdqehs)0J&3In z`CDMOo$MGCcyJC6|E;ls&WZfJu`yV}u)0v^@Y`9s%2x;|1QY@a0fm4<;BG@89_MgG z4N*t@7{9X#J|=eXw>D9Zb2y@ocxWPjdvjO^Fq@U*aSjjvO;4;3=Ws;)rsseg(Sz7J zk-zn6bLu0i7LRjy_-~00bWY^&iH>N}qiCeg;dh&dQS(shapb$_9Cy) z5Kssx1QY@a0fm4Z(T*@Dg+b) z3ITxfNfGdhK9^J1C0B~ql5(yK-thoeMj{s@4YI}{avsT(;;kfd{Tga+AdyR# z4k@lAk$X@UOYtUBj#ng!HET&M^Gl`_SCh!)aJ(uKxdm+3Kq7aa~o1!O34}$%N~*pDJdb5>p-6+s9bMw%gL3JSXL#4Qqn*oSAZ3jY$A~>V$CWNxi!)( zC7Vg)*0QXaM6OI$NeLzpSZ%8`N=Z41Wjk1N9f@3x6KhyYB6k2~8`qP_9Tu;wE+&!d z#%ed#lgRaeTfLT)lLM^Lu4)a5W!L04vbu~!?q#W!)#W5|ud-boiQF6HHj~JGn_MM{ z2p)5Q+dyL3`xs$;C5hbkz^$$)k^3>Z1`@fy1h-}*iQHd9E7oixk^33B%_MRkV!YDT zBtv4(Wm3A1#Ij#Xylkx@vFsnwXK5*kW&c2~ibU>T!L8juBKL3PDoN!22yWe45;@J0 zD-~-=vG#TAN#y(}TepEk?mlvrByx+%m66CjF?gyy3sg^|UFC1yIsh&jc zKROy^Qw@pS&sejHL~gy7C!5xj$bHDNEhKWkBv(ly_iJ+1By#^AI#^#tBKMJFm29db zkz0p8*KQ(_`)9UWLn8N2qzA4$kmg`HIXYNk!vNlodj#o({_nfv!wiJ`d9YxK`QWCin1Y%C{{dl6jOY7)7tsJUq^iQG%zDmIbGy#lUgHHq9l=x6O#5`Fm_DBD_0V%eW+ zAIa8o61g`~R=Jf#?mf(G>pBv-_t|bEiQIR{Z6J~R0ctiBlgRxw%1XDA$bH0`l_YW( z;gicYlISM}SXN46*}s5Wy`Dtw73_^wwIp&S&Pu6jAd&k6#;aOSA}3g1)jAT_7lR$I zs*1!iFT8$LIf+~6H3X68+#$fLTK=iDli6Zh5$ZL{0^Tz~n)|2|M=SRquFwr;EdpAr4rG!Rie2P#OcVCD5qDV9LeIs-a5nik+_|IFVV1rnXtB5&c*Nmg>nzTDbN)s$ohQT}^;yZ%yCo~?KTCGhuVi6Vt1Oz?hS-j{U2>uy zLEIrZ?nh;jdl%wkvM72d;^T#aX#!Us8KA=VGQfzd#pTEajZ{C6%L>Kq*s$d2@oL=4dPpjK4oGRV+KD?{#CH;uR^_`(XaHF3&_+fN$ z#x4yG5a9JNUY8l(Il&4nx6aRl9T@91n+waMP=C<_fh_X6xWd}Azx!7N21I+HaZk#8 zvwwqkh4{sq26XjUUvPelwJ6r0;u?YFnz$jBAP-H}MNgO)>~FDV@Uhv!@fK?{Q63fN z&kxo|d-CZIS$REn!OCzxW0l!Iq#>c@LZ0M{0)_aOJbDcF2Hu!|RNS&)jlg{4Lme!R zB0f>EK6AbXUV6N*DA0iQb(u9gt6-1^9`_Xo*kJ#9?7s{09zB3puE}FIsGnfvqr{nb z?~=fP#6L>(q(6Bu&uBrO^$RWi>oPNKL9hd^&neNV=6Z_2JJ5p}ikyM*c^$$)9;Lb# z8^|H=kcELl{CgAaHHlenW{`JE%-m3hS)jfrB?5zhapb$_9Cy) z5Kssx1QY@a0fm4hapb$_9Cy)5Ksu*0)hVz5{;+j literal 0 HcmV?d00001 diff --git a/package/firmware/ipq-wifi/board-xiaomi_ax3600.qca9889 b/package/firmware/ipq-wifi/board-xiaomi_ax3600.qca9889 new file mode 100644 index 0000000000000000000000000000000000000000..af4405cd53cb9ca94b9fd2b75856bf84ac0d22cf GIT binary patch literal 2260 zcmWG^cGPtY@h~*-)^+lC402(}&CO*1f*l+nl7S%+h?7c-Z3~h!b;?rnQu2#z4b3c) zby8BxGLutn4Gc^Tbc#!piYtptQgd~oDhz-CNffRYC|Z_Sl$n@UVjGc}n4g=e>lk5d zW?%rclM!f-3(!s%4wgC=#-6_)BzG-hV3239_he#l(E&L|9*6~j7z8R97y=+H3=)?( zhC)&V_!$(K6c_{r85sf?L6CvLNO9}dt^ABX|FZLvVh|10axuc(sK5Y%AUB>ncaDZO z5;9tfkr5QFU?2ixfauiJWMnQW?6V9E4h5Zy7`Oy78QM@a{wQbQ zWNL0@!@y8bI(HEaSJh9R0b)bwH9HDQm#+cgs(O$b1dUDHrpCsG8kpG7Q<0YuQIV4s zQIeAvQ6&N}F!)4dOjxn^=vh|I2vDv^0{?zjFtBhWFf=2HF)%&SX9U%9> */ + +/dts-v1/; + +#include "ipq8071-ax3600.dtsi" + +/ { + model = "Xiaomi AX3600"; + compatible = "xiaomi,ax3600", "qcom,ipq8074"; + + leds { + compatible = "gpio-leds"; + + led_system_blue: system-blue { + label = "blue:system"; + gpios = <&tlmm 42 GPIO_ACTIVE_HIGH>; + }; + + led_system_yellow: system-yellow { + label = "yellow:system"; + gpios = <&tlmm 43 GPIO_ACTIVE_HIGH>; + }; + + network-yellow { + label = "yellow:network"; + gpios = <&tlmm 22 GPIO_ACTIVE_HIGH>; + }; + + network-blue { + label = "blue:network"; + gpios = <&tlmm 21 GPIO_ACTIVE_HIGH>; + }; + + aiot { + label = "blue:aiot"; + gpios = <&tlmm 51 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "phy0tpt"; + }; + }; +}; + +&pcie_qmp0 { + status = "okay"; +}; + +&pcie0 { + status = "okay"; + + perst-gpio = <&tlmm 52 GPIO_ACTIVE_HIGH>; + + bridge@0,0 { + reg = <0x00000000 0 0 0 0>; + #address-cells = <3>; + #size-cells = <2>; + ranges; + + wifi0: wifi@1,0 { + status = "okay"; + + compatible = "qcom,ath10k"; + reg = <0x00010000 0 0 0 0>; + + qcom,ath10k-calibration-variant = "Xiaomi-AX3600"; + nvmem-cell-names = "calibration"; + nvmem-cells = <&caldata_qca9889>; + }; + }; +}; + +&wifi { + qcom,ath11k-calibration-variant = "Xiaomi-AX3600"; +}; diff --git a/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8071-ax3600.dtsi b/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8071-ax3600.dtsi new file mode 100644 index 00000000000000..f26a9eedc7144e --- /dev/null +++ b/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8071-ax3600.dtsi @@ -0,0 +1,587 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +/* Copyright (c) 2021, Robert Marko */ + +#include "ipq8074-512m.dtsi" +#include "ipq8074-ac-cpu.dtsi" +#include "ipq8074-ess.dtsi" +#include +#include + +/ { + aliases { + serial0 = &blsp1_uart5; + led-boot = &led_system_yellow; + led-failsafe = &led_system_yellow; + led-running = &led_system_blue; + led-upgrade = &led_system_yellow; + /* Aliases as required by u-boot to patch MAC addresses */ + ethernet1 = &dp2; + ethernet2 = &dp3; + ethernet3 = &dp4; + ethernet4 = &dp5; + label-mac-device = &dp2; + }; + + chosen { + stdout-path = "serial0:115200n8"; + bootargs-append = " root=/dev/ubiblock0_0"; + }; + + keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + gpios = <&tlmm 34 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + }; +}; + +&tlmm { + mdio_pins: mdio-pins { + mdc { + pins = "gpio68"; + function = "mdc"; + drive-strength = <8>; + bias-pull-up; + }; + + mdio { + pins = "gpio69"; + function = "mdio"; + drive-strength = <8>; + bias-pull-up; + }; + }; +}; + +&blsp1_uart5 { + status = "okay"; +}; + +&prng { + status = "okay"; +}; + +&cryptobam { + status = "okay"; +}; + +&crypto { + status = "okay"; +}; + +&qpic_bam { + status = "okay"; +}; + +&qpic_nand { + status = "okay"; + + /* + * Bootloader will find the NAND DT node by the compatible and + * then "fixup" it by adding the partitions from the SMEM table + * using the legacy bindings thus making it impossible for us + * to change the partition table or utilize NVMEM for calibration. + * So add a dummy partitions node that bootloader will populate + * and set it as disabled so the kernel ignores it instead of + * printing warnings due to the broken way bootloader adds the + * partitions. + */ + partitions { + status = "disabled"; + }; + + nand@0 { + reg = <0>; + nand-ecc-strength = <4>; + nand-ecc-step-size = <512>; + nand-bus-width = <8>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "0:sbl1"; + reg = <0x0 0x100000>; + read-only; + }; + + partition@100000 { + label = "0:mibib"; + reg = <0x100000 0x100000>; + read-only; + }; + + partition@200000 { + label = "0:qsee"; + reg = <0x200000 0x300000>; + read-only; + }; + + partition@500000 { + label = "0:devcfg"; + reg = <0x500000 0x80000>; + read-only; + }; + + partition@580000 { + label = "0:rpm"; + reg = <0x580000 0x80000>; + read-only; + }; + + partition@600000 { + label = "0:cdt"; + reg = <0x600000 0x80000>; + read-only; + }; + + partition@680000 { + label = "0:appsblenv"; + reg = <0x680000 0x80000>; + }; + + partition@700000 { + label = "0:appsbl"; + reg = <0x700000 0x100000>; + read-only; + }; + + partition@800000 { + label = "0:art"; + reg = <0x800000 0x80000>; + read-only; + + compatible = "nvmem-cells"; + #address-cells = <1>; + #size-cells = <1>; + + caldata_qca9889: caldata@4d000 { + reg = <0x33000 0x844>; + }; + }; + + partition@880000 { + label = "bdata"; + reg = <0x880000 0x80000>; + }; + + partition@900000 { + /* This is crash + crash_syslog parts combined */ + label = "pstore"; + reg = <0x900000 0x100000>; + }; + + /* Make the first rootfs a dedicated ubi partition for kernel */ + partition@a00000 { + label = "ubi_kernel"; + reg = <0xa00000 0x23c0000>; + }; + + /* Place the real rootfs in the original second rootfs and + * expand it to the end of the nand + */ + rootfs: partition@2dc0000 { + label = "rootfs"; + reg = <0x2dc0000 0xd240000>; + }; + }; + }; +}; + +&mdio { + status = "okay"; + + pinctrl-0 = <&mdio_pins>; + pinctrl-names = "default"; + reset-gpios = <&tlmm 37 GPIO_ACTIVE_LOW>; + + qca8075_1: ethernet-phy@1 { + reg = <1>; + }; + + qca8075_2: ethernet-phy@2 { + reg = <2>; + }; + + qca8075_3: ethernet-phy@3 { + reg = <3>; + }; + + qca8075_4: ethernet-phy@4 { + reg = <4>; + }; +}; + +&switch { + status = "okay"; + + switch_cpu_bmp = <0x1>; /* cpu port bitmap */ + switch_lan_bmp = <0x1e>; /* lan port bitmap */ + switch_wan_bmp = <0x20>; /* wan port bitmap */ + switch_mac_mode = <0x0>; /* mac mode for uniphy instance0*/ + switch_mac_mode1 = <0xff>; /* mac mode for uniphy instance1*/ + switch_mac_mode2 = <0xff>; /* mac mode for uniphy instance2*/ + bm_tick_mode = <0>; /* bm tick mode */ + tm_tick_mode = <0>; /* tm tick mode */ + + qcom,port_phyinfo { + port@0 { + port_id = <1>; + phy_address = <0>; + }; + port@1 { + port_id = <2>; + phy_address = <1>; + }; + port@2 { + port_id = <3>; + phy_address = <2>; + }; + port@3 { + port_id = <4>; + phy_address = <3>; + }; + port@4 { + port_id = <5>; + phy_address = <4>; + }; + }; + + port_scheduler_resource { + port@0 { + port_id = <0>; + ucast_queue = <0 143>; + mcast_queue = <256 271>; + l0sp = <0 35>; + l0cdrr = <0 47>; + l0edrr = <0 47>; + l1cdrr = <0 7>; + l1edrr = <0 7>; + }; + port@1 { + port_id = <1>; + ucast_queue = <144 159>; + mcast_queue = <272 275>; + l0sp = <36 39>; + l0cdrr = <48 63>; + l0edrr = <48 63>; + l1cdrr = <8 11>; + l1edrr = <8 11>; + }; + port@2 { + port_id = <2>; + ucast_queue = <160 175>; + mcast_queue = <276 279>; + l0sp = <40 43>; + l0cdrr = <64 79>; + l0edrr = <64 79>; + l1cdrr = <12 15>; + l1edrr = <12 15>; + }; + port@3 { + port_id = <3>; + ucast_queue = <176 191>; + mcast_queue = <280 283>; + l0sp = <44 47>; + l0cdrr = <80 95>; + l0edrr = <80 95>; + l1cdrr = <16 19>; + l1edrr = <16 19>; + }; + port@4 { + port_id = <4>; + ucast_queue = <192 207>; + mcast_queue = <284 287>; + l0sp = <48 51>; + l0cdrr = <96 111>; + l0edrr = <96 111>; + l1cdrr = <20 23>; + l1edrr = <20 23>; + }; + port@5 { + port_id = <5>; + ucast_queue = <208 223>; + mcast_queue = <288 291>; + l0sp = <52 55>; + l0cdrr = <112 127>; + l0edrr = <112 127>; + l1cdrr = <24 27>; + l1edrr = <24 27>; + }; + port@6 { + port_id = <6>; + ucast_queue = <224 239>; + mcast_queue = <292 295>; + l0sp = <56 59>; + l0cdrr = <128 143>; + l0edrr = <128 143>; + l1cdrr = <28 31>; + l1edrr = <28 31>; + }; + port@7 { + port_id = <7>; + ucast_queue = <240 255>; + mcast_queue = <296 299>; + l0sp = <60 63>; + l0cdrr = <144 159>; + l0edrr = <144 159>; + l1cdrr = <32 35>; + l1edrr = <32 35>; + }; + }; + port_scheduler_config { + port@0 { + port_id = <0>; + l1scheduler { + group@0 { + sp = <0 1>; /*L0 SPs*/ + /*cpri cdrr epri edrr*/ + cfg = <0 0 0 0>; + }; + }; + l0scheduler { + group@0 { + /*unicast queues*/ + ucast_queue = <0 4 8>; + /*multicast queues*/ + mcast_queue = <256 260>; + /*sp cpri cdrr epri edrr*/ + cfg = <0 0 0 0 0>; + }; + group@1 { + ucast_queue = <1 5 9>; + mcast_queue = <257 261>; + cfg = <0 1 1 1 1>; + }; + group@2 { + ucast_queue = <2 6 10>; + mcast_queue = <258 262>; + cfg = <0 2 2 2 2>; + }; + group@3 { + ucast_queue = <3 7 11>; + mcast_queue = <259 263>; + cfg = <0 3 3 3 3>; + }; + }; + }; + port@1 { + port_id = <1>; + l1scheduler { + group@0 { + sp = <36>; + cfg = <0 8 0 8>; + }; + group@1 { + sp = <37>; + cfg = <1 9 1 9>; + }; + }; + l0scheduler { + group@0 { + ucast_queue = <144>; + ucast_loop_pri = <16>; + mcast_queue = <272>; + mcast_loop_pri = <4>; + cfg = <36 0 48 0 48>; + }; + }; + }; + port@2 { + port_id = <2>; + l1scheduler { + group@0 { + sp = <40>; + cfg = <0 12 0 12>; + }; + group@1 { + sp = <41>; + cfg = <1 13 1 13>; + }; + }; + l0scheduler { + group@0 { + ucast_queue = <160>; + ucast_loop_pri = <16>; + mcast_queue = <276>; + mcast_loop_pri = <4>; + cfg = <40 0 64 0 64>; + }; + }; + }; + port@3 { + port_id = <3>; + l1scheduler { + group@0 { + sp = <44>; + cfg = <0 16 0 16>; + }; + group@1 { + sp = <45>; + cfg = <1 17 1 17>; + }; + }; + l0scheduler { + group@0 { + ucast_queue = <176>; + ucast_loop_pri = <16>; + mcast_queue = <280>; + mcast_loop_pri = <4>; + cfg = <44 0 80 0 80>; + }; + }; + }; + port@4 { + port_id = <4>; + l1scheduler { + group@0 { + sp = <48>; + cfg = <0 20 0 20>; + }; + group@1 { + sp = <49>; + cfg = <1 21 1 21>; + }; + }; + l0scheduler { + group@0 { + ucast_queue = <192>; + ucast_loop_pri = <16>; + mcast_queue = <284>; + mcast_loop_pri = <4>; + cfg = <48 0 96 0 96>; + }; + }; + }; + port@5 { + port_id = <5>; + l1scheduler { + group@0 { + sp = <52>; + cfg = <0 24 0 24>; + }; + group@1 { + sp = <53>; + cfg = <1 25 1 25>; + }; + }; + l0scheduler { + group@0 { + ucast_queue = <208>; + ucast_loop_pri = <16>; + mcast_queue = <288>; + mcast_loop_pri = <4>; + cfg = <52 0 112 0 112>; + }; + }; + }; + port@6 { + port_id = <6>; + l1scheduler { + group@0 { + sp = <56>; + cfg = <0 28 0 28>; + }; + group@1 { + sp = <57>; + cfg = <1 29 1 29>; + }; + }; + l0scheduler { + group@0 { + ucast_queue = <224>; + ucast_loop_pri = <16>; + mcast_queue = <292>; + mcast_loop_pri = <4>; + cfg = <56 0 128 0 128>; + }; + }; + }; + port@7 { + port_id = <7>; + l1scheduler { + group@0 { + sp = <60>; + cfg = <0 32 0 32>; + }; + group@1 { + sp = <61>; + cfg = <1 33 1 33>; + }; + }; + l0scheduler { + group@0 { + ucast_queue = <240>; + ucast_loop_pri = <16>; + mcast_queue = <296>; + cfg = <60 0 144 0 144>; + }; + }; + }; + }; +}; + +&edma { + status = "okay"; +}; + +&soc { + dp2: dp2 { + device_type = "network"; + compatible = "qcom,nss-dp"; + qcom,id = <2>; + reg = <0x3a001200 0x200>; + qcom,mactype = <0>; + local-mac-address = [000000000000]; + phy-handle = <&qca8075_1>; + phy-mode = "sgmii"; + label = "wan"; + }; + + dp3: dp3 { + device_type = "network"; + compatible = "qcom,nss-dp"; + qcom,id = <3>; + reg = <0x3a001400 0x200>; + qcom,mactype = <0>; + local-mac-address = [000000000000]; + phy-handle = <&qca8075_2>; + phy-mode = "sgmii"; + label = "lan1"; + }; + + dp4: dp4 { + device_type = "network"; + compatible = "qcom,nss-dp"; + qcom,id = <4>; + reg = <0x3a001600 0x200>; + qcom,mactype = <0>; + local-mac-address = [000000000000]; + phy-handle = <&qca8075_3>; + phy-mode = "sgmii"; + label = "lan2"; + }; + + dp5: dp5 { + device_type = "network"; + compatible = "qcom,nss-dp"; + qcom,id = <5>; + reg = <0x3a001800 0x200>; + qcom,mactype = <0>; + local-mac-address = [000000000000]; + phy-handle = <&qca8075_4>; + phy-mode = "sgmii"; + label = "lan3"; + }; +}; + +&wifi { + status = "okay"; + + qcom,ath11k-fw-memory-mode = <1>; +}; diff --git a/target/linux/ipq807x/image/generic.mk b/target/linux/ipq807x/image/generic.mk index 91a3daeedf7963..11cca5450618ee 100644 --- a/target/linux/ipq807x/image/generic.mk +++ b/target/linux/ipq807x/image/generic.mk @@ -16,3 +16,21 @@ define Device/UbiFit IMAGE/factory.ubi := append-ubi IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata endef + +define Device/xiaomi_ax3600 + $(call Device/FitImage) + $(call Device/UbiFit) + DEVICE_VENDOR := Xiaomi + DEVICE_MODEL := AX3600 + BLOCKSIZE := 128k + PAGESIZE := 2048 + DEVICE_DTS_CONFIG := config@ac04 + SOC := ipq8071 + KERNEL_SIZE := 36608k + DEVICE_PACKAGES := ipq-wifi-xiaomi_ax3600 kmod-ath10k-ct-smallbuffers ath10k-firmware-qca9887-ct +ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),) + ARTIFACTS := initramfs-factory.ubi + ARTIFACT/initramfs-factory.ubi := append-image-stage initramfs-uImage.itb | ubinize-kernel +endif +endef +TARGET_DEVICES += xiaomi_ax3600