From 4be24ec9d2585379c90eb4cbee75d6fbbf43159e Mon Sep 17 00:00:00 2001 From: mike_ding Date: Wed, 23 Apr 2025 17:53:03 +0800 Subject: [PATCH] Support for AP72TIP and AP72TIP-v4 on APNOS v4.x Signed-off-by: mike_ding --- feeds/qca-wifi-7/ath12k-wifi/Makefile | 27 + .../ath12k-wifi/ap72tip-IPQ5332.bin | Bin 0 -> 63488 bytes .../ath12k-wifi/ap72tip-QCN92XX.bin | Bin 0 -> 161792 bytes .../ath12k-wifi/ap72tip-v4-IPQ5332.bin | Bin 0 -> 63488 bytes .../ath12k-wifi/ap72tip-v4-QCN92XX.bin | Bin 0 -> 161792 bytes .../ath12k-wifi/board-2-ap72tip-IPQ5332.json | 20 + .../ath12k-wifi/board-2-ap72tip-QCN92XX.json | 20 + .../board-2-ap72tip-v4-IPQ5332.json | 20 + .../board-2-ap72tip-v4-QCN92XX.json | 20 + .../board-2.bin.ap72tip-v4.IPQ5332 | Bin 0 -> 89292 bytes .../board-2.bin.ap72tip-v4.QCN92XX | Bin 0 -> 187596 bytes .../ath12k-wifi/board-2.bin.ap72tip.IPQ5332 | Bin 0 -> 89292 bytes .../ath12k-wifi/board-2.bin.ap72tip.QCN92XX | Bin 0 -> 187596 bytes feeds/qca-wifi-7/ath12k-wifi/generate.sh | 6 + .../ipq53xx/base-files/etc/board.d/01_leds | 2 + .../ipq53xx/base-files/etc/board.d/02_network | 16 + .../etc/hotplug.d/firmware/10-ath12k-caldata | 2 + .../base-files/lib/upgrade/platform.sh | 4 + .../dts/ipq5332-sercomm-ap72tip-v4.dts | 591 +++++++++++++++++ .../ipq53xx/dts/ipq5332-sercomm-ap72tip.dts | 601 ++++++++++++++++++ feeds/qca-wifi-7/ipq53xx/dts/ipq5332.dtsi | 30 + .../ipq53xx/generic/config-6.1-platform | 2 +- feeds/qca-wifi-7/ipq53xx/image/ipq53xx.mk | 20 +- profiles/sercomm_ap72tip-v4.yml | 16 + profiles/sercomm_ap72tip.yml | 10 +- 25 files changed, 1398 insertions(+), 9 deletions(-) create mode 100644 feeds/qca-wifi-7/ath12k-wifi/ap72tip-IPQ5332.bin create mode 100644 feeds/qca-wifi-7/ath12k-wifi/ap72tip-QCN92XX.bin create mode 100644 feeds/qca-wifi-7/ath12k-wifi/ap72tip-v4-IPQ5332.bin create mode 100644 feeds/qca-wifi-7/ath12k-wifi/ap72tip-v4-QCN92XX.bin create mode 100644 feeds/qca-wifi-7/ath12k-wifi/board-2-ap72tip-IPQ5332.json create mode 100644 feeds/qca-wifi-7/ath12k-wifi/board-2-ap72tip-QCN92XX.json create mode 100644 feeds/qca-wifi-7/ath12k-wifi/board-2-ap72tip-v4-IPQ5332.json create mode 100644 feeds/qca-wifi-7/ath12k-wifi/board-2-ap72tip-v4-QCN92XX.json create mode 100644 feeds/qca-wifi-7/ath12k-wifi/board-2.bin.ap72tip-v4.IPQ5332 create mode 100644 feeds/qca-wifi-7/ath12k-wifi/board-2.bin.ap72tip-v4.QCN92XX create mode 100644 feeds/qca-wifi-7/ath12k-wifi/board-2.bin.ap72tip.IPQ5332 create mode 100644 feeds/qca-wifi-7/ath12k-wifi/board-2.bin.ap72tip.QCN92XX create mode 100644 feeds/qca-wifi-7/ipq53xx/dts/ipq5332-sercomm-ap72tip-v4.dts create mode 100644 feeds/qca-wifi-7/ipq53xx/dts/ipq5332-sercomm-ap72tip.dts create mode 100644 profiles/sercomm_ap72tip-v4.yml diff --git a/feeds/qca-wifi-7/ath12k-wifi/Makefile b/feeds/qca-wifi-7/ath12k-wifi/Makefile index e71062508..0f82c0e00 100755 --- a/feeds/qca-wifi-7/ath12k-wifi/Makefile +++ b/feeds/qca-wifi-7/ath12k-wifi/Makefile @@ -63,6 +63,17 @@ $(call Package/ath12k-wifi-default) TITLE:=board-2.bin for WF189W endef +define Package/ath12k-wifi-sercomm-ap72tip +$(call Package/ath12k-wifi-default) + TITLE:=board-2.bin for AP72TIP +endef + +define Package/ath12k-wifi-sercomm-ap72tip-v4 +$(call Package/ath12k-wifi-default) + TITLE:=board-2.bin for AP72TIP-v4 +endef + + define Package/ath12k-wifi-cig-wf189/install $(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/ $(INSTALL_DIR) $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/ @@ -110,9 +121,25 @@ define Package/ath12k-wifi-cig-wf189h/install $(INSTALL_DATA) ./ipq5332_qcn6432.regdb $(1)/lib/firmware/ath12k/QCN6432/hw1.0/regdb.bin endef +define Package/ath12k-wifi-sercomm-ap72tip/install + $(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/ + $(INSTALL_DIR) $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/ + $(INSTALL_DATA) ./board-2.bin.ap72tip.QCN92XX $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/board-2.bin + $(INSTALL_DATA) ./board-2.bin.ap72tip.IPQ5332 $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/board-2.bin +endef + +define Package/ath12k-wifi-sercomm-ap72tip-v4/install + $(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/ + $(INSTALL_DIR) $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/ + $(INSTALL_DATA) ./board-2.bin.ap72tip-v4.QCN92XX $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/board-2.bin + $(INSTALL_DATA) ./board-2.bin.ap72tip-v4.IPQ5332 $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/board-2.bin +endef + $(eval $(call BuildPackage,ath12k-wifi-cig-wf189)) $(eval $(call BuildPackage,ath12k-wifi-edgecore-eap105)) $(eval $(call BuildPackage,ath12k-wifi-sonicfi-rap7110c-341x)) $(eval $(call BuildPackage,ath12k-wifi-sonicfi-rap750w-311a)) $(eval $(call BuildPackage,ath12k-wifi-cig-wf189w)) $(eval $(call BuildPackage,ath12k-wifi-cig-wf189h)) +$(eval $(call BuildPackage,ath12k-wifi-sercomm-ap72tip)) +$(eval $(call BuildPackage,ath12k-wifi-sercomm-ap72tip-v4)) diff --git a/feeds/qca-wifi-7/ath12k-wifi/ap72tip-IPQ5332.bin b/feeds/qca-wifi-7/ath12k-wifi/ap72tip-IPQ5332.bin new file mode 100644 index 0000000000000000000000000000000000000000..6d918ff1cc2b6f7d8aac34b2b9f4f55db32a75c4 GIT binary patch literal 63488 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 +#include +#include +#include "ipq5332.dtsi" +#include "ipq5332-default-memory.dtsi" + +/ { + model = "Sercomm WiFi-7"; + compatible = "sercomm,ap72tip-v4", "qcom,ipq5332-ap-mi01.6", "qcom,ipq5332"; + + aliases { + serial0 = &blsp1_uart0; /*console*/ + serial1 = &blsp1_uart1; /*ble*/ + ethernet0 = "/soc/dp1"; + ethernet1 = "/soc/dp2"; + }; + + chosen { + stdout-path = "serial0"; + }; + + soc@0 { + +#if 0 //AQR114C + mdio:mdio@90000 { + pinctrl-0 = <&mdio1_pins>; + pinctrl-names = "default"; + phy-reset-gpio = <&tlmm 0 GPIO_ACTIVE_LOW>; + phyaddr_fixup = <0xC90F018>; + uniphyaddr_fixup = <0xC90F014>; + mdio_clk_fixup; /* MDIO clock sequence fix up flag */ + status = "okay"; + + phy0: ethernet-phy@0 { + reg = <24>; + }; + + phy1: ethernet-phy@1 { //aqr114c + reg = <0>; + compatible ="ethernet-phy-ieee802.3-c45"; + }; + }; + + ess-instance { + ess-switch@3a000000 { + switch_cpu_bmp = <0x1>; /* cpu port bitmap */ + switch_lan_bmp = <0x0>; /* lan port bitmap */ + switch_wan_bmp = <0x6>; /* wan port bitmap */ + switch_mac_mode = <0xc>; /* mac mode for uniphy instance0*/ + switch_mac_mode1 = <0xf>; /* mac mode for uniphy instance1*/ + switch_mac_mode2 = <0xff>; /* mac mode for uniphy instance2*/ + + qcom,port_phyinfo { + port@0 { + port_id = <1>; + phy_address = <24>; + mdiobus = <&mdio>; + }; + port@1 { //aqr114c + port_id = <2>; + phy_address = <0>; + mdiobus = <&mdio>; + ethernet-phy-ieee802.3-c45; + }; + }; + }; + }; + + dp1 { + device_type = "network"; + compatible = "qcom,nss-dp"; + qcom,id = <1>; + reg = <0x3a500000 0x4000>; + qcom,mactype = <1>; + local-mac-address = [000000000000]; + mdio-bus = <&mdio>; + qcom,phy-mdio-addr = <24>; + qcom,link-poll = <1>; + phy-mode = "sgmii"; + }; + dp2 { + device_type = "network"; + compatible = "qcom,nss-dp"; + qcom,id = <2>; + reg = <0x3a504000 0x4000>; + qcom,mactype = <1>; + local-mac-address = [000000000000]; + qcom,phy-mdio-addr = <0>; + qcom,link-poll = <1>; + phy-mode = "sgmii"; + }; +#else //SFP + mdio:mdio@90000 { + pinctrl-0 = <&mdio1_pins>; + pinctrl-names = "default"; + /*gpio0 for napa*/ + phy-reset-gpio = <&tlmm 0 GPIO_ACTIVE_LOW>; + status = "okay"; + phy0: ethernet-phy@0 { + reg = <24>; + }; + }; + ess-instance { + ess-switch@3a000000 { + switch_cpu_bmp = <0x1>; /* cpu port bitmap */ + switch_lan_bmp = <0x0>; /* lan port bitmap */ + switch_wan_bmp = <0x6>; /* wan port bitmap */ + switch_mac_mode = <0xc>; /* mac mode for uniphy instance0*/ + switch_mac_mode1 = <0xe>; /* mac mode for uniphy instance1 sfp PORT_WRAPPER_10GBASE_R*/ + switch_mac_mode2 = <0xff>; /* mac mode for uniphy instance2*/ + qcom,port_phyinfo { + port@0 { + port_id = <1>; + phy_address = <24>; + mdiobus = <&mdio>; + }; + port@1 { + port_id = <2>; + phy_address = <30>; + media-type = "sfp"; + }; + }; + }; + }; + dp1 { + device_type = "network"; + compatible = "qcom,nss-dp"; + qcom,id = <1>; + reg = <0x3a500000 0x4000>; + qcom,mactype = <1>; + local-mac-address = [000000000000]; + mdio-bus = <&mdio>; + qcom,phy-mdio-addr = <24>; + qcom,link-poll = <1>; + phy-mode = "sgmii"; + }; + dp2 { + device_type = "network"; + compatible = "qcom,nss-dp"; + qcom,id = <2>; + reg = <0x3a504000 0x4000>; + qcom,mactype = <1>; + local-mac-address = [000000000000]; + mdio-bus = <&mdio>; + qcom,phy-mdio-addr = <30>; + qcom,link-poll = <1>; + phy-mode = "sgmii"; + }; + +#endif + + /* EDMA host driver configuration for the board */ + edma@3ab00000 { + qcom,txdesc-ring-start = <4>; /* Tx desc ring start ID */ + qcom,txdesc-rings = <12>; /* Total number of Tx desc rings to be provisioned */ + qcom,mht-txdesc-rings = <8>; /* Extra Tx desc rings to be provisioned for MHT SW ports */ + qcom,txcmpl-ring-start = <4>; /* Tx complete ring start ID */ + qcom,txcmpl-rings = <12>; /* Total number of Tx complete rings to be provisioned */ + qcom,mht-txcmpl-rings = <8>; /* Extra Tx complete rings to be provisioned for mht sw ports. */ + qcom,rxfill-ring-start = <4>; /* Rx fill ring start ID */ + qcom,rxfill-rings = <4>; /* Total number of Rx fill rings to be provisioned */ + qcom,rxdesc-ring-start = <12>; /* Rx desc ring start ID */ + qcom,rxdesc-rings = <4>; /* Total number of Rx desc rings to be provisioned */ + qcom,rx-page-mode = <0>; /* Rx fill ring page mode */ + qcom,tx-map-priority-level = <1>; /* Tx priority level per port */ + qcom,rx-map-priority-level = <1>; /* Rx priority level per core */ + qcom,ppeds-num = <2>; /* Number of PPEDS nodes */ + /* PPE-DS node format: */ + qcom,ppeds-map = <1 1 1 1 32 8>, /* PPEDS Node#0 ring and queue map */ + <2 2 2 2 40 8>; /* PPEDS Node#1 ring and queue map */ + qcom,txdesc-map = <8 9 10 11>, /* Port0 per-core Tx ring map */ + <12 13 14 15>, /* MHT-Port1 per-core Tx ring map */ + <4 5 6 7>, /* MHT-Port2 per-core Tx ring map/packets from vp*/ + <16 17 18 19>, /* MHT-Port3 per-core Tx ring map */ + <20 21 22 23>; /* MHT-Port4 per-core Tx ring map */ + qcom,txdesc-fc-grp-map = <1 2 3 4 5>; /* Per GMAC flow control group map */ + qcom,rxfill-map = <4 5 6 7>; /* Per-core Rx fill ring map */ + qcom,rxdesc-map = <12 13 14 15>; /* Per-core Rx desc ring map */ + qcom,rx-queue-start = <0>; /* Rx queue start */ + qcom,rx-ring-queue-map = <0 8 16 24>, /* Priority 0 queues per-core Rx ring map */ + <1 9 17 25>, /* Priority 1 queues per-core Rx ring map */ + <2 10 18 26>, /* Priority 2 queues per-core Rx ring map */ + <3 11 19 27>, /* Priority 3 queues per-core Rx ring map */ + <4 12 20 28>, /* Priority 4 queues per-core Rx ring map */ + <5 13 21 29>, /* Priority 5 queues per-core Rx ring map */ + <6 14 22 30>, /* Priority 6 queues per-core Rx ring map */ + <7 15 23 31>; /* Priority 7 queues per-core Rx ring map */ + interrupts = <0 163 4>, /* Tx complete ring id #4 IRQ info */ + <0 164 4>, /* Tx complete ring id #5 IRQ info */ + <0 165 4>, /* Tx complete ring id #6 IRQ info */ + <0 166 4>, /* Tx complete ring id #7 IRQ info */ + <0 167 4>, /* Tx complete ring id #8 IRQ info */ + <0 168 4>, /* Tx complete ring id #9 IRQ info */ + <0 169 4>, /* Tx complete ring id #10 IRQ info */ + <0 170 4>, /* Tx complete ring id #11 IRQ info */ + <0 171 4>, /* Tx complete ring id #12 IRQ info */ + <0 172 4>, /* Tx complete ring id #13 IRQ info */ + <0 173 4>, /* Tx complete ring id #14 IRQ info */ + <0 174 4>, /* Tx complete ring id #15 IRQ info */ + <0 139 4>, /* Rx desc ring id #12 IRQ info */ + <0 140 4>, /* Rx desc ring id #13 IRQ info */ + <0 141 4>, /* Rx desc ring id #14 IRQ info */ + <0 142 4>, /* Rx desc ring id #15 IRQ info */ + <0 191 4>, /* Misc error IRQ info */ + <0 160 4>, /* PPEDS Node #1(TxComp ring id #1) TxComplete IRQ info */ + <0 128 4>, /* PPEDS Node #1(Rx Desc ring id #1) Rx Desc IRQ info */ + <0 152 4>, /* PPEDS Node #1(RxFill Desc ring id #1) Rx Fill IRQ info */ + <0 161 4>, /* PPEDS Node #2(TxComp ring id #2) TxComplete IRQ info */ + <0 129 4>, /* PPEDS Node #2(Rx Desc ring id #2) Rx Desc IRQ info */ + <0 153 4>, /* PPEDS Node #2(RxFill Desc ring id #2) Rx Fill IRQ info */ + <0 175 4>, /* MHT port Tx complete ring id #16 IRQ info */ + <0 176 4>, /* MHT port Tx complete ring id #17 IRQ info */ + <0 177 4>, /* MHT port Tx complete ring id #18 IRQ info */ + <0 178 4>, /* MHT port Tx complete ring id #19 IRQ info */ + <0 179 4>, /* MHT port Tx complete ring id #20 IRQ info */ + <0 180 4>, /* MHT port Tx complete ring id #21 IRQ info */ + <0 181 4>, /* MHT port Tx complete ring id #22 IRQ info */ + <0 182 4>; /* MHT port Tx complete ring id #23 IRQ info */ + }; + + leds { + compatible = "gpio-leds"; + + led@25 { + label = "blue:status"; + gpios = <&tca6416 9 GPIO_ACTIVE_HIGH>; + default-state = "off"; + }; + led@61 { + label = "green:phy"; + gpios = <&tca6416 15 GPIO_ACTIVE_HIGH>; + }; + led@62 { + label = "yellow:phy"; + gpios = <&tca6416 14 GPIO_ACTIVE_HIGH>; + }; + }; + + gpio_keys { + compatible = "gpio-keys"; + pinctrl-0 = <&button_pins>; + pinctrl-names = "default"; + button@1 { + label = "rst"; + linux,code = ; + gpios = <&tlmm 1 GPIO_ACTIVE_LOW>; + linux,input-type = <1>; + debounce-interval = <60>; + }; + }; + + wsi: wsi { + id = <0>; + num_chip = <2>; + status = "okay"; + chip_info = <0 1 1>, + <1 1 0>; + }; + }; +}; + +&wifi0 { +// led-gpio = <&tlmm 36 GPIO_ACTIVE_HIGH>; + qcom,rproc = <&q6_wcss_pd1>; + qcom,rproc_rpd = <&q6v5_wcss>; + qcom,multipd_arch; + qcom,userpd-subsys-name = "q6v5_wcss_userpd1"; + memory-region = <&q6_region>; + qcom,wsi = <&wsi>; + qcom,wsi_index = <0>; + qcom,board_id = <0x16>; + status = "okay"; +}; + +&qcn9224_pcie1 { + status = "okay"; +}; + +&blsp1_uart0 { + pinctrl-0 = <&serial_0_pins>; + pinctrl-names = "default"; + status = "okay"; +}; + +&blsp1_uart1 { + pinctrl-0 = <&serial_1_pins>; + pinctrl-names = "default"; + status = "disabled"; +}; + +&blsp1_i2c2 { + clock-frequency = <400000>; + pinctrl-0 = <&i2c_0_pins>; + pinctrl-names = "default"; + status = "okay"; + + tca6416: gpio@20 { + compatible = "ti,tca6416"; + reg = <0x20>; + gpio-controller; + #gpio-cells = <2>; + }; +}; + +&blsp1_spi0 { //nor flash + pinctrl-0 = <&spi_0_data_clk_pins &spi_0_cs_pins>; + pinctrl-names = "default"; + status = "okay"; + + flash@0 { + compatible = "n25q128a11"; + //, "jedec,spi-nor"; + reg = <0>; + #address-cells = <1>; + #size-cells = <1>; + spi-max-frequency = <50000000>; + }; +}; + +&blsp1_spi1 { /*tpm*/ + pinctrl-0 = <&spi_1_pins>; + pinctrl-names = "default"; + cs-select = <0>; + status = "okay"; + + tpm: spi-tpm@0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "st,st33htpm-spi"; + reg = <0>; + spi-max-frequency = <20000000>; + status = "okay"; + }; +}; + +&pcm { + pinctrl-0 = <&audio_pins_pri>; + pinctrl-names = "primary"; + status = "disabled"; +}; + +&sdhc { + bus-width = <4>; + max-frequency = <192000000>; + mmc-ddr-1_8v; + mmc-hs200-1_8v; + non-removable; + pinctrl-0 = <&sdc_default_state>; + pinctrl-names = "default"; + status = "disabled"; +}; + +&sleep_clk { + clock-frequency = <32000>; +}; + +&xo { + clock-frequency = <24000000>; +}; + +&qpic_bam { + status = "okay"; +}; + +&qpic_nand { + pinctrl-0 = <&qspi_default_state>; + pinctrl-names = "default"; + status = "okay"; + + nandcs@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <1>; + + nand-ecc-strength = <8>; + nand-ecc-step-size = <512>; + nand-bus-width = <8>; + }; +}; + +&pcie1_phy_x2 { + status = "okay"; +}; + +&pcie1 { + pinctrl-0 = <&pcie1_default_state>; + pinctrl-names = "default"; + perst-gpios = <&tlmm 47 GPIO_ACTIVE_LOW>; + status = "okay"; + + pcie1_rp { + reg = <0 0 0 0 0>; + + qcom,mhi@1 { + reg = <0 0 0 0 0>; + boot-args = <0x2 0x4 0x34 0x3 0x0 0x0 /* MX Rail, GPIO52, Drive strength 0x3 */ + 0x4 0x4 0x18 0x3 0x0 0x0 /* RFA1p2 Rail, GPIO24, Drive strength 0x3 */ + 0x0 0x4 0x0 0x0 0x0 0x0>; /* End of arguments */ + memory-region = <&qcn9224_pcie1>; + qcom,wsi = <&wsi>; + qcom,wsi_index = <1>; + qcom,board_id = <0x100f>; //0x1019->0x100f + }; + }; +}; + +/* PINCTRL */ + +&tlmm { + + audio_pins_pri: audio_pinmux_pri { + mux_1 { + pins = "gpio29"; + function = "audio_pri"; + drive-strength = <8>; + bias-pull-down; + }; + + mux_2 { + pins = "gpio30"; + function = "audio_pri"; + drive-strength = <8>; + bias-pull-down; + }; + + mux_3 { + pins = "gpio31"; + function = "audio_pri"; + drive-strength = <4>; + bias-pull-down; + }; + + mux_4 { + pins = "gpio32"; + function = "audio_pri"; + drive-strength = <4>; + bias-pull-down; + }; + }; + + i2c_0_pins: i2c-0-state { + pins = "gpio43", "gpio45"; + function = "blsp2_i2c0"; + drive-strength = <8>; + bias-pull-up; + }; + + spi_1_pins: spi-1-pins { /* tpm */ + pins = "gpio29", "gpio30", "gpio31", "gpio32"; + function = "blsp1_spi0"; + drive-strength = <8>; + bias-pull-down; + }; + + sdc_default_state: sdc-default-state { + clk-pins { + pins = "gpio13"; + function = "sdc_clk"; + drive-strength = <8>; + bias-disable; + }; + + cmd-pins { + pins = "gpio12"; + function = "sdc_cmd"; + drive-strength = <8>; + bias-pull-up; + }; + + data-pins { + pins = "gpio8", "gpio9", "gpio10", "gpio11"; + function = "sdc_data"; + drive-strength = <8>; + bias-pull-up; + }; + }; + + spi_0_data_clk_pins: spi-0-data-clk-state { + pins = "gpio14", "gpio15", "gpio16"; + function = "blsp0_spi"; + drive-strength = <2>; + bias-pull-down; + }; + + spi_0_cs_pins: spi-0-cs-state { + pins = "gpio17"; + function = "blsp0_spi"; + drive-strength = <2>; + bias-pull-up; + }; + + qspi_default_state: qspi-default-state { + qspi_clock { + pins = "gpio13"; + function = "qspi_clk"; + drive-strength = <8>; + bias-pull-down; + }; + + qspi_cs { + pins = "gpio12"; + function = "qspi_cs"; + drive-strength = <8>; + bias-pull-up; + }; + + qspi_data { + pins = "gpio8", "gpio9", "gpio10", "gpio11"; + function = "qspi_data"; + drive-strength = <8>; + bias-pull-down; + }; + }; + + serial_1_pins: serial1-pinmux { /*ble*/ +// pins = "gpio33", "gpio34", "gpio35", "gpio36"; + pins = "gpio33", "gpio35"; + function = "blsp1_uart2"; + drive-strength = <8>; + bias-pull-up; + }; + +/* gpio_leds_default: gpio-leds-default-state { + pins = "gpio36"; + function = "gpio"; + drive-strength = <8>; + bias-pull-down; + };*/ + + button_pins: button-state { + pins = "gpio1"; + function = "gpio"; + drive-strength = <8>; + bias-pull-up; + }; + + pwm_pins: pwm-state { + pins = "gpio46"; + function = "pwm0"; + drive-strength = <8>; + }; + + pcie1_default_state: pcie1-default-state { + pins = "gpio47"; + function = "gpio"; + drive-strength = <8>; + bias-pull-up; + output-low; + }; +}; + +&license_manager { + status = "okay"; +}; + +&usb3 { + qcom,multiplexed-phy; + status = "okay"; +}; + +&pwm { + pinctrl-0 = <&pwm_pins>; + pinctrl-names = "default"; + status = "okay"; +}; + +&hs_m31phy_0 { + status = "okay"; +}; + +&ssuniphy_0 { + status = "okay"; +}; + +//sercomm add +&wifi3 { + /* QCN9224 5G+6G */ + hremote_node = <&qcn9224_pcie1>; + qcom,board_id = <0x100f>; + status = "okay"; +}; diff --git a/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-sercomm-ap72tip.dts b/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-sercomm-ap72tip.dts new file mode 100644 index 000000000..9c3e783cd --- /dev/null +++ b/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-sercomm-ap72tip.dts @@ -0,0 +1,601 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) +/* + * IPQ5332 RDP468 board device tree source + * + * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. + */ + +/dts-v1/; + +#include +#include +#include +#include "ipq5332.dtsi" +#include "ipq5332-default-memory.dtsi" + +/ { + model = "Sercomm WiFi-7"; + compatible = "sercomm,ap72tip", "qcom,ipq5332-ap-mi01.6", "qcom,ipq5332"; + + aliases { + serial0 = &blsp1_uart0; /*console*/ + serial1 = &blsp1_uart1; /*ble*/ + ethernet0 = "/soc/dp1"; + ethernet1 = "/soc/dp2"; + }; + + chosen { + stdout-path = "serial0"; + }; + + soc@0 { + +#if 1 //AQR114C + mdio:mdio@90000 { + pinctrl-0 = <&mdio1_pins>; + pinctrl-names = "default"; + phy-reset-gpio = <&tlmm 0 GPIO_ACTIVE_LOW>; + phyaddr_fixup = <0xC90F018>; + uniphyaddr_fixup = <0xC90F014>; + mdio_clk_fixup; /* MDIO clock sequence fix up flag */ + status = "okay"; + + phy0: ethernet-phy@0 { + reg = <24>; + }; + + phy1: ethernet-phy@1 { //aqr114c + reg = <0>; + compatible ="ethernet-phy-ieee802.3-c45"; + }; + }; + + ess-instance { + ess-switch@3a000000 { + switch_cpu_bmp = <0x1>; /* cpu port bitmap */ + switch_lan_bmp = <0x0>; /* lan port bitmap */ + switch_wan_bmp = <0x6>; /* wan port bitmap */ + switch_mac_mode = <0xc>; /* mac mode for uniphy instance0*/ + switch_mac_mode1 = <0xf>; /* mac mode for uniphy instance1*/ + switch_mac_mode2 = <0xff>; /* mac mode for uniphy instance2*/ + + qcom,port_phyinfo { + port@0 { + port_id = <1>; + phy_address = <24>; + mdiobus = <&mdio>; + }; + port@1 { //aqr114c + port_id = <2>; + phy_address = <0>; + mdiobus = <&mdio>; + ethernet-phy-ieee802.3-c45; + }; + }; + }; + }; + + dp1 { + device_type = "network"; + compatible = "qcom,nss-dp"; + qcom,id = <1>; + reg = <0x3a500000 0x4000>; + qcom,mactype = <1>; + local-mac-address = [000000000000]; + mdio-bus = <&mdio>; + qcom,phy-mdio-addr = <24>; + qcom,link-poll = <1>; + phy-mode = "sgmii"; + }; + dp2 { + device_type = "network"; + compatible = "qcom,nss-dp"; + qcom,id = <2>; + reg = <0x3a504000 0x4000>; + qcom,mactype = <1>; + local-mac-address = [000000000000]; + qcom,phy-mdio-addr = <0>; + qcom,link-poll = <1>; + phy-mode = "sgmii"; + }; +#else //SFP + dp1 { + device_type = "network"; + compatible = "qcom,nss-dp"; + qcom,id = <1>; + reg = <0x3a500000 0x4000>; + qcom,mactype = <1>; + local-mac-address = [000000000000]; + mdio-bus = <&mdio>; + qcom,phy-mdio-addr = <24>; + qcom,link-poll = <1>; + phy-mode = "sgmii"; + }; + dp2 { + device_type = "network"; + compatible = "qcom,nss-dp"; + qcom,id = <2>; + reg = <0x3a504000 0x4000>; + qcom,mactype = <1>; + local-mac-address = [000000000000]; + mdio-bus = <&mdio>; + qcom,phy-mdio-addr = <30>; + qcom,link-poll = <1>; + phy-mode = "sgmii"; + }; + + mdio:mdio@90000 { + status = "okay"; + pinctrl-0 = <&mdio1_pins>; + pinctrl-names = "default"; + /*gpio0 for napa*/ + phy-reset-gpio = <&tlmm 0 0>; + + phy0: ethernet-phy@0 { + reg = <24>; + }; + }; + + ess-instance { + ess-switch@3a000000 { + switch_cpu_bmp = <0x1>; /* cpu port bitmap */ + switch_lan_bmp = <0x0>; /* lan port bitmap */ + switch_wan_bmp = <0x6>; /* wan port bitmap */ + switch_mac_mode = <0xc>; /* mac mode for uniphy instance0*/ + switch_mac_mode1 = <0xe>; /* mac mode for uniphy instance1 sfp PORT_WRAPPER_10GBASE_R*/ + switch_mac_mode2 = <0xff>; /* mac mode for uniphy instance2*/ + qcom,port_phyinfo { + port@0 { + port_id = <1>; + phy_address = <24>; + }; + port@1 { + port_id = <2>; + phy_address = <30>; + media-type = "sfp"; + }; + }; + }; + }; + +#endif + + /* EDMA host driver configuration for the board */ + edma@3ab00000 { + qcom,txdesc-ring-start = <4>; /* Tx desc ring start ID */ + qcom,txdesc-rings = <12>; /* Total number of Tx desc rings to be provisioned */ + qcom,mht-txdesc-rings = <8>; /* Extra Tx desc rings to be provisioned for MHT SW ports */ + qcom,txcmpl-ring-start = <4>; /* Tx complete ring start ID */ + qcom,txcmpl-rings = <12>; /* Total number of Tx complete rings to be provisioned */ + qcom,mht-txcmpl-rings = <8>; /* Extra Tx complete rings to be provisioned for mht sw ports. */ + qcom,rxfill-ring-start = <4>; /* Rx fill ring start ID */ + qcom,rxfill-rings = <4>; /* Total number of Rx fill rings to be provisioned */ + qcom,rxdesc-ring-start = <12>; /* Rx desc ring start ID */ + qcom,rxdesc-rings = <4>; /* Total number of Rx desc rings to be provisioned */ + qcom,rx-page-mode = <0>; /* Rx fill ring page mode */ + qcom,tx-map-priority-level = <1>; /* Tx priority level per port */ + qcom,rx-map-priority-level = <1>; /* Rx priority level per core */ + qcom,ppeds-num = <2>; /* Number of PPEDS nodes */ + /* PPE-DS node format: */ + qcom,ppeds-map = <1 1 1 1 32 8>, /* PPEDS Node#0 ring and queue map */ + <2 2 2 2 40 8>; /* PPEDS Node#1 ring and queue map */ + qcom,txdesc-map = <8 9 10 11>, /* Port0 per-core Tx ring map */ + <12 13 14 15>, /* MHT-Port1 per-core Tx ring map */ + <4 5 6 7>, /* MHT-Port2 per-core Tx ring map/packets from vp*/ + <16 17 18 19>, /* MHT-Port3 per-core Tx ring map */ + <20 21 22 23>; /* MHT-Port4 per-core Tx ring map */ + qcom,txdesc-fc-grp-map = <1 2 3 4 5>; /* Per GMAC flow control group map */ + qcom,rxfill-map = <4 5 6 7>; /* Per-core Rx fill ring map */ + qcom,rxdesc-map = <12 13 14 15>; /* Per-core Rx desc ring map */ + qcom,rx-queue-start = <0>; /* Rx queue start */ + qcom,rx-ring-queue-map = <0 8 16 24>, /* Priority 0 queues per-core Rx ring map */ + <1 9 17 25>, /* Priority 1 queues per-core Rx ring map */ + <2 10 18 26>, /* Priority 2 queues per-core Rx ring map */ + <3 11 19 27>, /* Priority 3 queues per-core Rx ring map */ + <4 12 20 28>, /* Priority 4 queues per-core Rx ring map */ + <5 13 21 29>, /* Priority 5 queues per-core Rx ring map */ + <6 14 22 30>, /* Priority 6 queues per-core Rx ring map */ + <7 15 23 31>; /* Priority 7 queues per-core Rx ring map */ + interrupts = <0 163 4>, /* Tx complete ring id #4 IRQ info */ + <0 164 4>, /* Tx complete ring id #5 IRQ info */ + <0 165 4>, /* Tx complete ring id #6 IRQ info */ + <0 166 4>, /* Tx complete ring id #7 IRQ info */ + <0 167 4>, /* Tx complete ring id #8 IRQ info */ + <0 168 4>, /* Tx complete ring id #9 IRQ info */ + <0 169 4>, /* Tx complete ring id #10 IRQ info */ + <0 170 4>, /* Tx complete ring id #11 IRQ info */ + <0 171 4>, /* Tx complete ring id #12 IRQ info */ + <0 172 4>, /* Tx complete ring id #13 IRQ info */ + <0 173 4>, /* Tx complete ring id #14 IRQ info */ + <0 174 4>, /* Tx complete ring id #15 IRQ info */ + <0 139 4>, /* Rx desc ring id #12 IRQ info */ + <0 140 4>, /* Rx desc ring id #13 IRQ info */ + <0 141 4>, /* Rx desc ring id #14 IRQ info */ + <0 142 4>, /* Rx desc ring id #15 IRQ info */ + <0 191 4>, /* Misc error IRQ info */ + <0 160 4>, /* PPEDS Node #1(TxComp ring id #1) TxComplete IRQ info */ + <0 128 4>, /* PPEDS Node #1(Rx Desc ring id #1) Rx Desc IRQ info */ + <0 152 4>, /* PPEDS Node #1(RxFill Desc ring id #1) Rx Fill IRQ info */ + <0 161 4>, /* PPEDS Node #2(TxComp ring id #2) TxComplete IRQ info */ + <0 129 4>, /* PPEDS Node #2(Rx Desc ring id #2) Rx Desc IRQ info */ + <0 153 4>, /* PPEDS Node #2(RxFill Desc ring id #2) Rx Fill IRQ info */ + <0 175 4>, /* MHT port Tx complete ring id #16 IRQ info */ + <0 176 4>, /* MHT port Tx complete ring id #17 IRQ info */ + <0 177 4>, /* MHT port Tx complete ring id #18 IRQ info */ + <0 178 4>, /* MHT port Tx complete ring id #19 IRQ info */ + <0 179 4>, /* MHT port Tx complete ring id #20 IRQ info */ + <0 180 4>, /* MHT port Tx complete ring id #21 IRQ info */ + <0 181 4>, /* MHT port Tx complete ring id #22 IRQ info */ + <0 182 4>; /* MHT port Tx complete ring id #23 IRQ info */ + }; + + leds { + compatible = "gpio-leds"; + + led@25 { + label = "blue:status"; + gpios = <&tca6416 9 GPIO_ACTIVE_HIGH>; + default-state = "off"; + }; + led@24 { + label = "red:status"; + gpios = <&tca6416 10 GPIO_ACTIVE_HIGH>; + }; + led_power: led@16 { + label = "green:status"; + gpios = <&tca6416 11 GPIO_ACTIVE_HIGH>; + }; + led@61 { + label = "green:phy"; + gpios = <&tca6416 15 GPIO_ACTIVE_HIGH>; + }; + led@62 { + label = "yellow:phy"; + gpios = <&tca6416 14 GPIO_ACTIVE_HIGH>; + }; + }; +/* + gpio_keys { + compatible = "gpio-keys"; + pinctrl-0 = <&button_pins>; + pinctrl-names = "default"; + button@1 { + label = "rst"; + linux,code = ; + gpios = <&tlmm 25 GPIO_ACTIVE_LOW>; + linux,input-type = <1>; + debounce-interval = <60>; + }; + };*/ + + wsi: wsi { + id = <0>; + num_chip = <2>; + status = "okay"; + chip_info = <0 1 1>, + <1 1 0>; + }; + }; +}; + +&wifi0 { +// led-gpio = <&tlmm 36 GPIO_ACTIVE_HIGH>; + qcom,rproc = <&q6_wcss_pd1>; + qcom,rproc_rpd = <&q6v5_wcss>; + qcom,multipd_arch; + qcom,userpd-subsys-name = "q6v5_wcss_userpd1"; + memory-region = <&q6_region>; + qcom,wsi = <&wsi>; + qcom,wsi_index = <0>; + qcom,board_id = <0x16>; + status = "okay"; +}; + +&qcn9224_pcie1 { + status = "okay"; +}; + +&blsp1_uart0 { + pinctrl-0 = <&serial_0_pins>; + pinctrl-names = "default"; + status = "okay"; +}; + +&blsp1_uart1 { + pinctrl-0 = <&serial_1_pins>; + pinctrl-names = "default"; + status = "disabled"; +}; + +&blsp1_i2c2 { + clock-frequency = <400000>; + pinctrl-0 = <&i2c_0_pins>; + pinctrl-names = "default"; + status = "okay"; + + tca6416: gpio@20 { + compatible = "ti,tca6416"; + reg = <0x20>; + gpio-controller; + #gpio-cells = <2>; + }; +}; + +&blsp1_spi0 { //nor flash + pinctrl-0 = <&spi_0_data_clk_pins &spi_0_cs_pins>; + pinctrl-names = "default"; + status = "okay"; + + flash@0 { + compatible = "n25q128a11"; + //, "jedec,spi-nor"; + reg = <0>; + #address-cells = <1>; + #size-cells = <1>; + spi-max-frequency = <50000000>; + }; +}; + +&blsp1_spi1 { /*tpm*/ + pinctrl-0 = <&spi_1_pins>; + pinctrl-names = "default"; + cs-select = <0>; + status = "okay"; + + tpm: spi-tpm@0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "st,st33htpm-spi"; + reg = <0>; + spi-max-frequency = <20000000>; + status = "okay"; + }; +}; + +&pcm { + pinctrl-0 = <&audio_pins_pri>; + pinctrl-names = "primary"; + status = "disabled"; +}; + +&sdhc { + bus-width = <4>; + max-frequency = <192000000>; + mmc-ddr-1_8v; + mmc-hs200-1_8v; + non-removable; + pinctrl-0 = <&sdc_default_state>; + pinctrl-names = "default"; + status = "disabled"; +}; + +&sleep_clk { + clock-frequency = <32000>; +}; + +&xo { + clock-frequency = <24000000>; +}; + +&qpic_bam { + status = "okay"; +}; + +&qpic_nand { + pinctrl-0 = <&qspi_default_state>; + pinctrl-names = "default"; + status = "okay"; + + nandcs@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <1>; + + nand-ecc-strength = <8>; + nand-ecc-step-size = <512>; + nand-bus-width = <8>; + }; +}; + +&pcie1_phy_x2 { + status = "okay"; +}; + +&pcie1 { + pinctrl-0 = <&pcie1_default_state>; + pinctrl-names = "default"; + perst-gpios = <&tlmm 47 GPIO_ACTIVE_LOW>; + status = "okay"; + + pcie1_rp { + reg = <0 0 0 0 0>; + + qcom,mhi@1 { + reg = <0 0 0 0 0>; + boot-args = <0x2 0x4 0x34 0x3 0x0 0x0 /* MX Rail, GPIO52, Drive strength 0x3 */ + 0x4 0x4 0x18 0x3 0x0 0x0 /* RFA1p2 Rail, GPIO24, Drive strength 0x3 */ + 0x0 0x4 0x0 0x0 0x0 0x0>; /* End of arguments */ + memory-region = <&qcn9224_pcie1>; + qcom,wsi = <&wsi>; + qcom,wsi_index = <1>; + qcom,board_id = <0x100f>; //0x1019->0x100f + }; + }; +}; + +/* PINCTRL */ + +&tlmm { + + audio_pins_pri: audio_pinmux_pri { + mux_1 { + pins = "gpio29"; + function = "audio_pri"; + drive-strength = <8>; + bias-pull-down; + }; + + mux_2 { + pins = "gpio30"; + function = "audio_pri"; + drive-strength = <8>; + bias-pull-down; + }; + + mux_3 { + pins = "gpio31"; + function = "audio_pri"; + drive-strength = <4>; + bias-pull-down; + }; + + mux_4 { + pins = "gpio32"; + function = "audio_pri"; + drive-strength = <4>; + bias-pull-down; + }; + }; + + i2c_0_pins: i2c-0-state { + pins = "gpio43", "gpio45"; + function = "blsp2_i2c0"; + drive-strength = <8>; + bias-pull-up; + }; + + spi_1_pins: spi-1-pins { /* tpm */ + pins = "gpio29", "gpio30", "gpio31", "gpio32"; + function = "blsp1_spi0"; + drive-strength = <8>; + bias-pull-down; + }; + + sdc_default_state: sdc-default-state { + clk-pins { + pins = "gpio13"; + function = "sdc_clk"; + drive-strength = <8>; + bias-disable; + }; + + cmd-pins { + pins = "gpio12"; + function = "sdc_cmd"; + drive-strength = <8>; + bias-pull-up; + }; + + data-pins { + pins = "gpio8", "gpio9", "gpio10", "gpio11"; + function = "sdc_data"; + drive-strength = <8>; + bias-pull-up; + }; + }; + + spi_0_data_clk_pins: spi-0-data-clk-state { + pins = "gpio14", "gpio15", "gpio16"; + function = "blsp0_spi"; + drive-strength = <2>; + bias-pull-down; + }; + + spi_0_cs_pins: spi-0-cs-state { + pins = "gpio17"; + function = "blsp0_spi"; + drive-strength = <2>; + bias-pull-up; + }; + + qspi_default_state: qspi-default-state { + qspi_clock { + pins = "gpio13"; + function = "qspi_clk"; + drive-strength = <8>; + bias-pull-down; + }; + + qspi_cs { + pins = "gpio12"; + function = "qspi_cs"; + drive-strength = <8>; + bias-pull-up; + }; + + qspi_data { + pins = "gpio8", "gpio9", "gpio10", "gpio11"; + function = "qspi_data"; + drive-strength = <8>; + bias-pull-down; + }; + }; + + serial_1_pins: serial1-pinmux { /*ble*/ +// pins = "gpio33", "gpio34", "gpio35", "gpio36"; + pins = "gpio33", "gpio35"; + function = "blsp1_uart2"; + drive-strength = <8>; + bias-pull-up; + }; + +/* gpio_leds_default: gpio-leds-default-state { + pins = "gpio36"; + function = "gpio"; + drive-strength = <8>; + bias-pull-down; + };*/ +/* + button_pins: button-state { + pins = "gpio25"; + function = "gpio"; + drive-strength = <8>; + bias-pull-up; + };*/ + + pwm_pins: pwm-state { + pins = "gpio46"; + function = "pwm0"; + drive-strength = <8>; + }; + + pcie1_default_state: pcie1-default-state { + pins = "gpio47"; + function = "gpio"; + drive-strength = <8>; + bias-pull-up; + output-low; + }; +}; + +&license_manager { + status = "okay"; +}; + +&usb3 { + qcom,multiplexed-phy; + status = "okay"; +}; + +&pwm { + pinctrl-0 = <&pwm_pins>; + pinctrl-names = "default"; + status = "okay"; +}; + +&hs_m31phy_0 { + status = "okay"; +}; + +&ssuniphy_0 { + status = "okay"; +}; + +//sercomm add +&wifi3 { + /* QCN9224 5G+6G */ + hremote_node = <&qcn9224_pcie1>; + qcom,board_id = <0x100f>; + status = "okay"; +}; diff --git a/feeds/qca-wifi-7/ipq53xx/dts/ipq5332.dtsi b/feeds/qca-wifi-7/ipq53xx/dts/ipq5332.dtsi index 1f4c9af98..e6dc15524 100755 --- a/feeds/qca-wifi-7/ipq53xx/dts/ipq5332.dtsi +++ b/feeds/qca-wifi-7/ipq53xx/dts/ipq5332.dtsi @@ -736,6 +736,36 @@ status = "disabled"; }; + blsp1_spi1: spi@78b6000 { + compatible = "qcom,spi-qup-v2.2.1"; + #address-cells = <1>; + #size-cells = <0>; + reg = <0x078b6000 0x600>; + interrupts = ; + spi-max-frequency = <50000000>; + clocks = <&gcc GCC_BLSP1_QUP2_SPI_APPS_CLK>, + <&gcc GCC_BLSP1_AHB_CLK>; + clock-names = "core", "iface"; + dmas = <&blsp_dma 6>, <&blsp_dma 7>; + dma-names = "tx", "rx"; + status = "disabled"; + }; + + blsp1_i2c2: i2c@78b7000 { + compatible = "qcom,i2c-qup-v2.2.1"; + #address-cells = <1>; + #size-cells = <0>; + reg = <0x78b7000 0x600>; + interrupts = ; + clocks = <&gcc GCC_BLSP1_AHB_CLK>, + <&gcc GCC_BLSP1_QUP3_I2C_APPS_CLK>; + clock-names = "iface", "core"; + clock-frequency = <400000>; + dmas = <&blsp_dma 8>, <&blsp_dma 9>; + dma-names = "rx", "tx"; + status = "disabled"; + }; + blsp1_i2c1: i2c@78b6000 { compatible = "qcom,i2c-qup-v2.2.1"; reg = <0x078b6000 0x600>; diff --git a/feeds/qca-wifi-7/ipq53xx/generic/config-6.1-platform b/feeds/qca-wifi-7/ipq53xx/generic/config-6.1-platform index cab2fbd90..7a3ad85fa 100644 --- a/feeds/qca-wifi-7/ipq53xx/generic/config-6.1-platform +++ b/feeds/qca-wifi-7/ipq53xx/generic/config-6.1-platform @@ -2288,7 +2288,7 @@ CONFIG_GPIOLIB_FASTPATH_LIMIT=512 # CONFIG_GPIO_ML_IOH is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_MPC8XXX is not set -# CONFIG_GPIO_PCA953X is not set +CONFIG_GPIO_PCA953X=y # CONFIG_GPIO_PCA953X_IRQ is not set # CONFIG_GPIO_PCA9570 is not set # CONFIG_GPIO_PCF857X is not set diff --git a/feeds/qca-wifi-7/ipq53xx/image/ipq53xx.mk b/feeds/qca-wifi-7/ipq53xx/image/ipq53xx.mk index 88c5adeb3..346e0624b 100755 --- a/feeds/qca-wifi-7/ipq53xx/image/ipq53xx.mk +++ b/feeds/qca-wifi-7/ipq53xx/image/ipq53xx.mk @@ -14,16 +14,30 @@ endef TARGET_DEVICES += cig_wf189 define Device/sercomm_ap72tip - DEVICE_TITLE := Sercomm AP72 TIP + DEVICE_TITLE := Sercomm AP72TIP DEVICE_DTS := ipq5332-sercomm-ap72tip - DEVICE_DTS_CONFIG := config@mi01.2-qcn9160-c1 + DEVICE_DTS_DIR := ../dts + DEVICE_DTS_CONFIG := config@mi01.6 IMAGES := sysupgrade.tar nand-factory.bin nand-factory.ubi IMAGE/sysupgrade.tar := sysupgrade-tar | append-metadata IMAGE/nand-factory.bin := append-ubi | qsdk-ipq-factory-nand IMAGE/nand-factory.ubi := append-ubi DEVICE_PACKAGES := ath12k-wifi-sercomm-ap72tip ath12k-firmware-qcn92xx ath12k-firmware-ipq5332 endef -#TARGET_DEVICES += sercomm_ap72tip +TARGET_DEVICES += sercomm_ap72tip + +define Device/sercomm_ap72tip-v4 + DEVICE_TITLE := Sercomm AP72TIP-v4 + DEVICE_DTS := ipq5332-sercomm-ap72tip-v4 + DEVICE_DTS_DIR := ../dts + DEVICE_DTS_CONFIG := config@mi01.6 + IMAGES := sysupgrade.tar nand-factory.bin nand-factory.ubi + IMAGE/sysupgrade.tar := sysupgrade-tar | append-metadata + IMAGE/nand-factory.bin := append-ubi | qsdk-ipq-factory-nand + IMAGE/nand-factory.ubi := append-ubi + DEVICE_PACKAGES := ath12k-wifi-sercomm-ap72tip-v4 ath12k-firmware-qcn92xx ath12k-firmware-ipq5332 +endef +TARGET_DEVICES += sercomm_ap72tip-v4 define Device/edgecore_eap105 DEVICE_TITLE := Edgecore EAP105 diff --git a/profiles/sercomm_ap72tip-v4.yml b/profiles/sercomm_ap72tip-v4.yml new file mode 100644 index 000000000..3f36991c6 --- /dev/null +++ b/profiles/sercomm_ap72tip-v4.yml @@ -0,0 +1,16 @@ +--- +profile: sercomm_ap72tip-v4 +target: ipq53xx +subtarget: generic +description: Build image for the Sercomm AP72TIP-v4 +image: bin/targets/ipq53xx/generic/openwrt-ipq53xx-sercomm_ap72tip-v4-squashfs-sysupgrade.tar +feeds: + - name: qca + path: ../../feeds/qca-wifi-7 +include: + - ucentral-ap +packages: + - ipq53xx + - qca-ssdk-shell +diffconfig: | + CONFIG_KERNEL_IPQ_MEM_PROFILE=0 diff --git a/profiles/sercomm_ap72tip.yml b/profiles/sercomm_ap72tip.yml index 39efb1864..95900925c 100644 --- a/profiles/sercomm_ap72tip.yml +++ b/profiles/sercomm_ap72tip.yml @@ -2,14 +2,14 @@ profile: sercomm_ap72tip target: ipq53xx subtarget: generic -description: Build image for the Sercomm AP72 TIP +description: Build image for the Sercomm AP72TIP image: bin/targets/ipq53xx/generic/openwrt-ipq53xx-sercomm_ap72tip-squashfs-sysupgrade.tar feeds: - - name: ipq95xx - path: ../../feeds/ipq95xx -packages: - - ipq53xx + - name: qca + path: ../../feeds/qca-wifi-7 include: - ucentral-ap +packages: + - ipq53xx diffconfig: | CONFIG_KERNEL_IPQ_MEM_PROFILE=0