From 6c47beebd3366ac8b5a4dc01a10374aa521d8af0 Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Mon, 5 Apr 2021 23:51:39 +0800 Subject: [PATCH] sync openmptcprouter --- build.sh | 20 +- config-4018 | 10 - config-4019 | 12 - config1 | 256 ----------- root/package/base-files/files/etc/banner | 43 +- .../files/etc/board.d/99-default_network | 16 + root/package/base-files/files/etc/shadow | 5 - root/package/firmware/ipq-wifi/Makefile | 26 +- .../ipq-wifi/board-p2w_r619ac.qca4019 | Bin 0 -> 24300 bytes .../ipq-wifi/board-pangu_l1000.qca4019 | Bin 631600 -> 0 bytes root/rules.mk | 432 ++++++++++++++++++ .../ipq40xx/base-files/etc/board.d/01_leds | 81 ---- .../ipq40xx/base-files/etc/board.d/02_network | 33 +- .../base-files/etc/board.d/03_gpio_switches | 24 - .../etc/hotplug.d/firmware/11-ath10k-caldata | 46 +- .../base-files/etc/init.d/adjust_network | 205 --------- .../ipq40xx/base-files/lib/adjust_network.sh | 86 ---- .../ipq40xx/base-files/lib/upgrade/linksys.sh | 122 ----- .../base-files/lib/upgrade/openmesh.sh | 106 ----- .../base-files/lib/upgrade/platform.sh | 22 +- .../arm/boot/dts/qcom-ipq4019-r619ac-128m.dts | 18 + .../arch/arm/boot/dts/qcom-ipq4019-r619ac.dts | 12 + ...019-l1000.dts => qcom-ipq4019-r619ac.dtsi} | 318 +++++-------- .../ipq40xx/image/{generic.mk => Makefile} | 190 +++----- .../901-arm-boot-add-dts-files.patch | 15 +- .../999-ipq40xx-unlock-cpu-frequency.patch | 53 --- 26 files changed, 694 insertions(+), 1457 deletions(-) delete mode 100644 config-4018 delete mode 100644 config-4019 delete mode 100644 config1 mode change 100755 => 100644 root/package/base-files/files/etc/banner create mode 100755 root/package/base-files/files/etc/board.d/99-default_network delete mode 100755 root/package/base-files/files/etc/shadow mode change 100755 => 100644 root/package/firmware/ipq-wifi/Makefile create mode 100644 root/package/firmware/ipq-wifi/board-p2w_r619ac.qca4019 delete mode 100755 root/package/firmware/ipq-wifi/board-pangu_l1000.qca4019 create mode 100644 root/rules.mk delete mode 100755 root/target/linux/ipq40xx/base-files/etc/board.d/01_leds delete mode 100755 root/target/linux/ipq40xx/base-files/etc/board.d/03_gpio_switches mode change 100755 => 100644 root/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata delete mode 100755 root/target/linux/ipq40xx/base-files/etc/init.d/adjust_network delete mode 100755 root/target/linux/ipq40xx/base-files/lib/adjust_network.sh delete mode 100755 root/target/linux/ipq40xx/base-files/lib/upgrade/linksys.sh delete mode 100755 root/target/linux/ipq40xx/base-files/lib/upgrade/openmesh.sh mode change 100755 => 100644 root/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh create mode 100644 root/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac-128m.dts create mode 100644 root/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac.dts rename root/target/linux/ipq40xx/files/arch/arm/boot/dts/{qcom-ipq4019-l1000.dts => qcom-ipq4019-r619ac.dtsi} (50%) mode change 100755 => 100644 rename root/target/linux/ipq40xx/image/{generic.mk => Makefile} (83%) mode change 100755 => 100644 root/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch delete mode 100755 root/target/linux/ipq40xx/patches-5.4/999-ipq40xx-unlock-cpu-frequency.patch diff --git a/build.sh b/build.sh index 9d83bf58..d3dfd774 100755 --- a/build.sh +++ b/build.sh @@ -42,7 +42,7 @@ OMR_KERNEL=${OMR_KERNEL:-5.4} OMR_RELEASE=${OMR_RELEASE:-$(git describe --tags `git rev-list --tags --max-count=1` | tail -1 | cut -d '-' -f1)} OMR_REPO=${OMR_REPO:-http://$OMR_HOST:$OMR_PORT/release/$OMR_RELEASE/$OMR_TARGET} -OMR_FEED_URL="${OMR_FEED_URL:-https://github.com/suyuan168/openmptcprouter-feeds}" +OMR_FEED_URL="${OMR_FEED_URL:-https://github.com/ysurac/openmptcprouter-feeds}" OMR_FEED_SRC="${OMR_FEED_SRC:-develop}" CUSTOM_FEED_URL="${CUSTOM_FEED_URL}" @@ -62,10 +62,6 @@ elif [ "$OMR_TARGET" = "rpi4" ]; then OMR_REAL_TARGET="aarch64_cortex-a72" elif [ "$OMR_TARGET" = "rpi2" ]; then OMR_REAL_TARGET="arm_cortex-a7_neon-vfpv4" -elif [ "$OMR_TARGET" = "4018" ]; then - OMR_REAL_TARGET="arm_cortex-a7_neon-vfpv4" -elif [ "$OMR_TARGET" = "4019" ]; then - OMR_REAL_TARGET="arm_cortex-a7_neon-vfpv4" elif [ "$OMR_TARGET" = "wrt3200acm" ]; then OMR_REAL_TARGET="arm_cortex-a9_vfpv3-d16" elif [ "$OMR_TARGET" = "wrt32x" ]; then @@ -207,9 +203,6 @@ fi if [ "$OMR_PACKAGES" = "mini" ]; then echo "CONFIG_PACKAGE_${OMR_DIST}-mini=y" >> "$OMR_TARGET/source/.config" fi -if [ "$OMR_PACKAGES" = "zuixiao" ]; then - echo "CONFIG_PACKAGE_${OMR_DIST}-zuixiao=y" >> "$OMR_TARGET/source/.config" -fi if [ "$OMR_TARGET" = "bpi-r1" -a "$OMR_OPENWRT" = "master" ]; then # We disable mc in master, because it leads to unknown compilation errors on bpi-r1 target @@ -339,6 +332,13 @@ if ! patch -Rf -N -p1 -s --dry-run < ../../patches/nanqinlang.patch; then fi echo "Done" +echo "Checking if remove_abi patch is set or not" +if ! patch -Rf -N -p1 -s --dry-run < ../../patches/remove_abi.patch; then + echo "apply..." + patch -N -p1 -s < ../../patches/remove_abi.patch +fi +echo "Done" + # Add BBR2 patch, only working on 64bits images for now if [ "$OMR_TARGET" = "x86_64" ] || [ "$OMR_TARGET" = "bpi-r64" ] || [ "$OMR_TARGET" = "rpi4" ] || [ "$OMR_TARGET" = "espressobin" ] || [ "$OMR_TARGET" = "r2s" ] || [ "$OMR_TARGET" = "rpi3" ]; then echo "Checking if BBRv2 patch is set or not" @@ -420,9 +420,6 @@ if [ "$OMR_KERNEL" = "5.4" ]; then echo "Set to kernel 5.4 for mediatek arch (BPI-R2)" find target/linux/mediatek -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=4.19%KERNEL_PATCHVER:=5.4%g' {} \; echo "Done" - echo "Set to kernel 5.4 for IPQ (4019)" - find target/linux/ipq40xx -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=4.19%KERNEL_PATCHVER:=5.4%g' {} \; - echo "Done" fi #rm -rf feeds/packages/libs/libwebp @@ -443,7 +440,6 @@ cd "$OMR_TARGET/source" echo "Update feeds index" cp .config .config.keep scripts/feeds clean -scripts/feeds install -a scripts/feeds update -a #cd - diff --git a/config-4018 b/config-4018 deleted file mode 100644 index ab81d56f..00000000 --- a/config-4018 +++ /dev/null @@ -1,10 +0,0 @@ -CONFIG_TARGET_ipq40xx=y -CONFIG_TARGET_ipq40xx_generic=y -CONFIG_TARGET_ipq40xx_generic_DEVICE_8dev_jalapeno=y -CONFIG_TARGET_BOARD="ipq40xx" -CONFIG_TARGET_SUBTARGET="generic" -CONFIG_TARGET_ARCH_PACKAGES="arm_cortex-a7_neon-vfpv4" -CONFIG_PACKAGE_ath10k-board-qca4019=y -CONFIG_PACKAGE_ath10k-firmware-qca4019-ct=y -CONFIG_PACKAGE_kmod-ath10k-ct-smallbuffers=y -CONFIG_KERNEL_ARM_MODULE_PLTS=y \ No newline at end of file diff --git a/config-4019 b/config-4019 deleted file mode 100644 index e923623a..00000000 --- a/config-4019 +++ /dev/null @@ -1,12 +0,0 @@ -CONFIG_TARGET_ipq40xx=y -CONFIG_TARGET_ipq40xx_generic=y -CONFIG_TARGET_ipq40xx_generic_DEVICE_pangu_l1000=y -CONFIG_TARGET_BOARD="ipq40xx" -CONFIG_TARGET_SUBTARGET="generic" -CONFIG_TARGET_ARCH_PACKAGES="arm_cortex-a7_neon-vfpv4" -CONFIG_DEFAULT_ath10k-firmware-qca4019-ct=y -CONFIG_DEFAULT_ipq-wifi-pangu_l1000=y -CONFIG_DEFAULT_kmod-ath10k-ct=y -CONFIG_PACKAGE_ipq-wifi-pangu_l1000=y -CONFIG_PACKAGE_ath10k-firmware-qca4019-ct -CONFIG_KERNEL_ARM_MODULE_PLTS=y \ No newline at end of file diff --git a/config1 b/config1 deleted file mode 100644 index 7b627e04..00000000 --- a/config1 +++ /dev/null @@ -1,256 +0,0 @@ -CONFIG_DEVEL=y -CONFIG_TOOLCHAINOPTS=y -CONFIG_ALL_KMODS=y -CONFIG_BUSYBOX_CUSTOM=y -CONFIG_BUSYBOX_CONFIG_ADDUSER=y -CONFIG_BUSYBOX_CONFIG_ARP=y -CONFIG_BUSYBOX_CONFIG_ARPING=y -CONFIG_BUSYBOX_CONFIG_ASH_RANDOM_SUPPORT=y -CONFIG_BUSYBOX_CONFIG_BASE64=y -CONFIG_BUSYBOX_CONFIG_BC=y -CONFIG_BUSYBOX_CONFIG_CHPASSWD=y -CONFIG_BUSYBOX_CONFIG_DELUSER=y -CONFIG_BUSYBOX_CONFIG_DIFF=y -CONFIG_BUSYBOX_CONFIG_FEATURE_DATE_NANO=y -CONFIG_BUSYBOX_CONFIG_FEATURE_DIFF_DIR=y -CONFIG_BUSYBOX_CONFIG_FEATURE_PS_LONG=y -CONFIG_BUSYBOX_CONFIG_FEATURE_SEAMLESS_BZ2=y -CONFIG_BUSYBOX_CONFIG_FEATURE_SHOW_THREADS=y -CONFIG_BUSYBOX_CONFIG_FEATURE_STAT_FILESYSTEM=y -CONFIG_BUSYBOX_CONFIG_FEATURE_STAT_FORMAT=y -# CONFIG_BUSYBOX_CONFIG_FEATURE_TOP_DECIMALS is not set -# CONFIG_BUSYBOX_CONFIG_FEATURE_TOP_SMP_CPU is not set -# CONFIG_BUSYBOX_CONFIG_FEATURE_TOP_SMP_PROCESS is not set -CONFIG_BUSYBOX_CONFIG_FEATURE_USE_TERMIOS=y -CONFIG_BUSYBOX_CONFIG_FEATURE_VI_UNDO=y -CONFIG_BUSYBOX_CONFIG_FEATURE_VI_UNDO_QUEUE=y -CONFIG_BUSYBOX_CONFIG_FEATURE_VI_UNDO_QUEUE_MAX=32 -CONFIG_BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_PARALLEL=y -CONFIG_BUSYBOX_CONFIG_IOSTAT=y -CONFIG_BUSYBOX_CONFIG_LOADKMAP=y -CONFIG_BUSYBOX_CONFIG_LSPCI=y -CONFIG_BUSYBOX_CONFIG_LSUSB=y -CONFIG_BUSYBOX_CONFIG_NOHUP=y -CONFIG_BUSYBOX_CONFIG_PKILL=y -CONFIG_BUSYBOX_CONFIG_STAT=y -CONFIG_BUSYBOX_CONFIG_STTY=y -CONFIG_BUSYBOX_CONFIG_TELNET=y -CONFIG_BUSYBOX_CONFIG_TIMEOUT=y -CONFIG_BUSYBOX_CONFIG_WATCH=y -# CONFIG_GDB is not set -CONFIG_GRUB_SERIAL="" -CONFIG_GRUB_TIMEOUT="0" -CONFIG_GRUB_TITLE="OpenMPTCProuter" -CONFIG_KERNEL_AIO=y -CONFIG_KERNEL_DEBUG_GPIO=y -# CONFIG_KERNEL_DEBUG_INFO is not set -CONFIG_KERNEL_DEBUG_PINCTRL=y -CONFIG_KERNEL_DEVTMPFS=y -CONFIG_KERNEL_DEVTMPFS_MOUNT=y -CONFIG_KERNEL_DIRECT_IO=y -CONFIG_KERNEL_DMA_ACPI=y -CONFIG_KERNEL_FANOTIFY=y -CONFIG_KERNEL_FHANDLE=y -CONFIG_KERNEL_IPC_NS=y -# CONFIG_KERNEL_MAGIC_SYSRQ is not set -CONFIG_KERNEL_MMC_SDHCI_ACPI=y -CONFIG_KERNEL_NAMESPACES=y -CONFIG_KERNEL_NET_NS=y -CONFIG_KERNEL_PID_NS=y -# CONFIG_KERNEL_SWAP is not set -CONFIG_KERNEL_USER_NS=y -CONFIG_KERNEL_UTS_NS=y -# CONFIG_PACKAGE_dnsmasq is not set -CONFIG_PACKAGE_kmod-8021q=y -CONFIG_PACKAGE_kmod-ata-ahci=y -CONFIG_PACKAGE_kmod-ata-core=y -CONFIG_PACKAGE_kmod-block2mtd=y -CONFIG_PACKAGE_kmod-bridge=y -CONFIG_PACKAGE_kmod-crypto-gcm=y -CONFIG_PACKAGE_kmod-gpio-button-hotplug=y -CONFIG_PACKAGE_kmod-hid=y -CONFIG_PACKAGE_kmod-hid-generic=y -CONFIG_PACKAGE_kmod-i2c-gpio=y -CONFIG_PACKAGE_kmod-i2c-gpio-custom=y -CONFIG_PACKAGE_kmod-ifb=y -CONFIG_PACKAGE_kmod-ikconfig=y -CONFIG_PACKAGE_kmod-input-evdev=y -CONFIG_PACKAGE_kmod-loop=y -CONFIG_PACKAGE_kmod-macvlan=y -CONFIG_PACKAGE_kmod-mmc=y -CONFIG_PACKAGE_kmod-mmc-spi=y -CONFIG_PACKAGE_kmod-random-core=y -CONFIG_DEFAULT_kmod-r8169=y -CONFIG_PACKAGE_kmod-scsi-core=y -CONFIG_PACKAGE_kmod-sctp=y -CONFIG_PACKAGE_kmod-sdhci=y -CONFIG_PACKAGE_kmod-serial-8250=y -CONFIG_PACKAGE_kmod-stp=y -CONFIG_PACKAGE_kmod-usb-acm=y -CONFIG_PACKAGE_kmod-usb-core=y -CONFIG_PACKAGE_kmod-usb-hid=y -CONFIG_PACKAGE_kmod-usb-net=y -CONFIG_PACKAGE_kmod-usb-net-asix=y -CONFIG_PACKAGE_kmod-usb-net-asix-ax88179=y -CONFIG_PACKAGE_kmod-usb-net-cdc-eem=y -CONFIG_PACKAGE_kmod-usb-net-cdc-ether=y -CONFIG_PACKAGE_kmod-usb-net-cdc-mbim=y -CONFIG_PACKAGE_kmod-usb-net-cdc-ncm=y -CONFIG_PACKAGE_kmod-usb-net-cdc-subset=y -CONFIG_PACKAGE_kmod-usb-net-dm9601-ether=y -CONFIG_PACKAGE_kmod-usb-net-hso=y -CONFIG_PACKAGE_kmod-usb-net-huawei-cdc-ncm=y -CONFIG_PACKAGE_kmod-usb-net-ipheth=y -CONFIG_PACKAGE_kmod-usb-net-kalmia=y -CONFIG_PACKAGE_kmod-usb-net-kaweth=y -CONFIG_PACKAGE_kmod-usb-net-mcs7830=y -CONFIG_PACKAGE_kmod-usb-net-pegasus=y -CONFIG_PACKAGE_kmod-usb-net-qmi-wwan=y -CONFIG_PACKAGE_kmod-usb-net-rndis=y -CONFIG_PACKAGE_kmod-usb-net-rtl8150=y -CONFIG_PACKAGE_kmod-usb-net-rtl8152=y -CONFIG_PACKAGE_kmod-usb-net-sierrawireless=y -CONFIG_PACKAGE_kmod-usb-net-smsc95xx=y -CONFIG_PACKAGE_kmod-usb-net-sr9700=y -CONFIG_PACKAGE_kmod-usb-serial=y -CONFIG_PACKAGE_kmod-usb-serial-ark3116=y -CONFIG_PACKAGE_kmod-usb-serial-belkin=y -CONFIG_PACKAGE_kmod-usb-serial-ch341=y -CONFIG_PACKAGE_kmod-usb-serial-cp210x=y -CONFIG_PACKAGE_kmod-usb-serial-cypress-m8=y -CONFIG_PACKAGE_kmod-usb-serial-ftdi=y -CONFIG_PACKAGE_kmod-usb-serial-garmin=y -CONFIG_PACKAGE_kmod-usb-serial-ipw=y -CONFIG_PACKAGE_kmod-usb-serial-keyspan=y -CONFIG_PACKAGE_kmod-usb-serial-mct=y -CONFIG_PACKAGE_kmod-usb-serial-mos7720=y -CONFIG_PACKAGE_kmod-usb-serial-option=y -CONFIG_PACKAGE_kmod-usb-serial-oti6858=y -CONFIG_PACKAGE_kmod-usb-serial-pl2303=y -CONFIG_PACKAGE_kmod-usb-serial-qualcomm=y -CONFIG_PACKAGE_kmod-usb-serial-sierrawireless=y -CONFIG_PACKAGE_kmod-usb-serial-simple=y -CONFIG_PACKAGE_kmod-usb-serial-ti-usb=y -CONFIG_PACKAGE_kmod-usb-serial-visor=y -CONFIG_PACKAGE_kmod-usb-serial-wwan=y -CONFIG_PACKAGE_kmod-usb-storage=y -CONFIG_PACKAGE_kmod-usb-wdm=y -CONFIG_PACKAGE_kmod-usb2=y -CONFIG_PACKAGE_kmod-usb3=y -CONFIG_PACKAGE_kmod-veth=y -CONFIG_PACKAGE_kmod-3c59x=y -CONFIG_PACKAGE_kmod-8139cp=y -CONFIG_PACKAGE_kmod-8139too=y -CONFIG_PACKAGE_kmod-atl1=y -CONFIG_PACKAGE_kmod-atl1c=y -CONFIG_PACKAGE_kmod-atl1e=y -CONFIG_PACKAGE_kmod-atl2=y -CONFIG_PACKAGE_kmod-b44=y -CONFIG_PACKAGE_kmod-bnx2=y -CONFIG_PACKAGE_kmod-dm9000=y -CONFIG_PACKAGE_kmod-e100=y -CONFIG_PACKAGE_kmod-e1000=y -CONFIG_PACKAGE_kmod-e1000e=y -CONFIG_PACKAGE_kmod-et131x=y -CONFIG_PACKAGE_kmod-ethoc=y -CONFIG_PACKAGE_kmod-forcedeth=y -CONFIG_PACKAGE_kmod-gigaset=y -CONFIG_PACKAGE_kmod-hfcmulti=y -CONFIG_PACKAGE_kmod-hfcpci=y -CONFIG_PACKAGE_kmod-natsemi=y -CONFIG_PACKAGE_kmod-ne2k-pci=y -CONFIG_PACKAGE_kmod-of-mdio=y -CONFIG_PACKAGE_kmod-pcnet32=y -CONFIG_PACKAGE_kmod-phy-broadcom=y -CONFIG_PACKAGE_kmod-ppfe=y -CONFIG_PACKAGE_kmod-r6040=y -CONFIG_PACKAGE_kmod-r8169=y -CONFIG_PACKAGE_kmod-sis190=y -CONFIG_PACKAGE_kmod-sis900=y -CONFIG_PACKAGE_kmod-skge=y -CONFIG_PACKAGE_kmod-sky2=y -CONFIG_PACKAGE_kmod-solos-pci=y -CONFIG_PACKAGE_kmod-spi-ks8995=y -CONFIG_PACKAGE_kmod-tg3=y -CONFIG_PACKAGE_kmod-tulip=y -CONFIG_PACKAGE_kmod-via-rhine=y -CONFIG_PACKAGE_kmod-via-velocity=y -CONFIG_PACKAGE_kmod-vmxnet3=y -CONFIG_PACKAGE_kmod-fs-vfat=y -CONFIG_PACKAGE_kmod-macremapper=m -CONFIG_TARGET_IMAGES_PAD=y -CONFIG_TARGET_ROOTFS_EXT4=y -CONFIG_KERNEL_TCP_CONG_CDG=y -CONFIG_KERNEL_TCP_CONG_HTCP=y -CONFIG_KERNEL_TCP_CONG_HSTCP=y -CONFIG_KERNEL_TCP_CONG_HYBLA=y -CONFIG_KERNEL_TCP_CONG_ILLINOIS=y -CONFIG_KERNEL_TCP_CONG_SCALABLE=y -CONFIG_KERNEL_TCP_CONG_VEGAS=y -CONFIG_KERNEL_TCP_CONG_VENO=y -CONFIG_KERNEL_TCP_CONG_WESTWOOD=y -CONFIG_KERNEL_TCP_CONG_YEAH=y -CONFIG_KERNEL_TCP_CONG_LIA=y -CONFIG_KERNEL_TCP_CONG_BBR=y -CONFIG_KERNEL_TCP_CONG_NANQINLANG=y -CONFIG_KERNEL_TCP_CONG_OLIA=y -CONFIG_KERNEL_TCP_CONG_WVEGAS=y -CONFIG_KERNEL_TCP_CONG_BALIA=y -CONFIG_KERNEL_MPTCP_FULLMESH=y -CONFIG_KERNEL_DEFAULT_FULLMESH=y -CONFIG_KERNEL_MPTCP_NDIFFPORTS=y -# CONFIG_KERNEL_DEFAULT_NDIFFPORTS is not set -CONFIG_KERNEL_MPTCP_BINDER=y -CONFIG_KERNEL_MPTCP_ECF=y -# CONFIG_KERNEL_DEFAULT_BINDER is not set -# CONFIG_KERNEL_DEFAULT_DUMMY is not set -CONFIG_KERNEL_MPTCP_ROUNDROBIN=y -# CONFIG_KERNEL_DEFAULT_ROUNDROBIN is not set -CONFIG_KERNEL_MPTCP_REDUNDANT=y -# CONFIG_KERNEL_DEFAULT_REDUNDANT is not set -CONFIG_KERNEL_DEFAULT_SCHEDULER=y -CONFIG_KERNEL_MPTCP=y -CONFIG_KERNEL_CRYPTO_SHA256=y -CONFIG_LUCI_LANG_hu=y -CONFIG_LUCI_LANG_pt=y -CONFIG_LUCI_LANG_sk=y -CONFIG_LUCI_LANG_ro=y -CONFIG_LUCI_LANG_en=y -CONFIG_LUCI_LANG_pl=y -CONFIG_LUCI_LANG_uk=y -CONFIG_LUCI_LANG_ja=y -CONFIG_LUCI_LANG_vi=y -CONFIG_LUCI_LANG_de=y -CONFIG_LUCI_LANG_no=y -CONFIG_LUCI_LANG_ms=y -CONFIG_LUCI_LANG_zh_Hans=y -CONFIG_LUCI_LANG_zh_Hant=y -CONFIG_LUCI_LANG_ko=y -CONFIG_LUCI_LANG_he=y -CONFIG_LUCI_LANG_zh-tw=y -CONFIG_LUCI_LANG_tr=y -CONFIG_LUCI_LANG_sv=y -CONFIG_LUCI_LANG_ru=y -CONFIG_LUCI_LANG_el=y -CONFIG_LUCI_LANG_ca=y -CONFIG_LUCI_LANG_es=y -CONFIG_LUCI_LANG_pt_BR=y -CONFIG_LUCI_LANG_cs=y -CONFIG_LUCI_LANG_fr=y -CONFIG_LUCI_LANG_it=y -CONFIG_LUCI_LANG_ar=y -CONFIG_LUCI_LANG_bg=y -CONFIG_LUCI_LANG_bn_BD=y -CONFIG_LUCI_LANG_fi=y -CONFIG_LUCI_LANG_hi=y -CONFIG_LUCI_LANG_mr=y -CONFIG_LUCI_LANG_nb_NO=y -CONFIG_TARGET_ROOTFS_PARTSIZE=512 -CONFIG_TARGET_KERNEL_PARTSIZE=64 -CONFIG_OPENSSL_WITH_CHACHA_POLY1305=y -# CONFIG_LUCI_CSSTIDY is not set -# CONFIG_LIBCURL_WOLFSSL is not set -# CONFIG_PACKAGE_libustream-wolfssl is not set -CONFIG_KERNEL_DEVMEM=y -CONFIG_KERNEL_DEVKMEM=y -CONFIG_AUTOREMOVE=y diff --git a/root/package/base-files/files/etc/banner b/root/package/base-files/files/etc/banner old mode 100755 new mode 100644 index 4dd2e767..01a091a6 --- a/root/package/base-files/files/etc/banner +++ b/root/package/base-files/files/etc/banner @@ -1,39 +1,8 @@ - -/*** - * ,s555SB@@& - * :9H####@@@@@Xi - * 1@@@@@@@@@@@@@@8 - * ,8@@@@@@@@@B@@@@@@8 - * :B@@@@X3hi8Bs;B@@@@@Ah, - * ,8i r@@@B: 1S ,M@@@@@@#8; - * 1AB35.i: X@@8 . SGhr ,A@@@@@@@@S - * 1@h31MX8 18Hhh3i .i3r ,A@@@@@@@@@5 - * ;@&i,58r5 rGSS: :B@@@@@@@@@@A - * 1#i . 9i hX. .: .5@@@@@@@@@@@1 - * sG1, ,G53s. 9#Xi;hS5 3B@@@@@@@B1 - * .h8h.,A@@@MXSs, #@H1: 3ssSSX@1 - * s ,@@@@@@@@@@@@Xhi, r#@@X1s9M8 .GA981 - * ,. rS8H#@@@@@@@@@@#HG51;. .h31i;9@r .8@@@@BS;i; - * .19AXXXAB@@@@@@@@@@@@@@#MHXG893hrX#XGGXM@@@@@@@@@@MS - * s@@MM@@@hsX#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&, - * :GB@#3G@@Brs ,1GM@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B, - * .hM@@@#@@#MX 51 r;iSGAM@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8 - * :3B@@@@@@@@@@@&9@h :Gs .;sSXH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@: - * s&HA#@@@@@@@@@@@@@@M89A;.8S. ,r3@@@@@@@@@@@@@@@@@@@@@@@@@@@r - * ,13B@@@@@@@@@@@@@@@@@@@5 5B3 ;. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@i - * 5#@@#&@@@@@@@@@@@@@@@@@@9 .39: ;@@@@@@@@@@@@@@@@@@@@@@@@@@@; - * 9@@@X:MM@@@@@@@@@@@@@@@#; ;31. H@@@@@@@@@@@@@@@@@@@@@@@@@@: - * SH#@B9.rM@@@@@@@@@@@@@B :. 3@@@@@@@@@@@@@@@@@@@@@@@@@@5 - * ,:. 9@@@@@@@@@@@#HB5 .M@@@@@@@@@@@@@@@@@@@@@@@@@B - * ,ssirhSM@&1;i19911i,. s@@@@@@@@@@@@@@@@@@@@@@@@@@S - * ,,,rHAri1h1rh&@#353Sh: 8@@@@@@@@@@@@@@@@@@@@@@@@@#: - * .A3hH@#5S553&@@#h i:i9S #@@@@@@@@@@@@@@@@@@@@@@@@@A. - * - * - * 又看源码,看你妹妹呀! - */ - + ___ __ __ ___ _____ ___ ___ _ + / _ \ _ __ ___ _ _ | \/ | _ \_ _/ __| _ \_ _ ___ _ _| |_ ___ _ _ + | (_) | '_ \/ -_) ' \| |\/| | _/ | || (__| _/ '_/ _ \ || | _/ -_) '_| + \___/| .__/\___|_||_|_| |_|_| |_| \___|_| |_| \___/\_,_|\__\___|_| + |_| ------------------------------------------------------------------------------ -55860.com QQ 175338181 weixin:xinyangla -(%C) + (%C) ------------------------------------------------------------------------------ diff --git a/root/package/base-files/files/etc/board.d/99-default_network b/root/package/base-files/files/etc/board.d/99-default_network new file mode 100755 index 00000000..55d5d79a --- /dev/null +++ b/root/package/base-files/files/etc/board.d/99-default_network @@ -0,0 +1,16 @@ +#!/bin/sh +# +# Copyright (C) 2013-2015 OpenWrt.org +# + +. /lib/functions/uci-defaults.sh + +board_config_update + +json_is_a network object && exit 0 + +ucidef_set_interface_lan 'eth0' + +board_config_flush + +exit 0 diff --git a/root/package/base-files/files/etc/shadow b/root/package/base-files/files/etc/shadow deleted file mode 100755 index 40218708..00000000 --- a/root/package/base-files/files/etc/shadow +++ /dev/null @@ -1,5 +0,0 @@ -root:$1$ie.8vTnt$7EzhI1ZYiwp8hSAC4eSId0:18473:0:99999:7::: -daemon:*:0:0:99999:7::: -ftp:*:0:0:99999:7::: -network:*:0:0:99999:7::: -nobody:*:0:0:99999:7::: diff --git a/root/package/firmware/ipq-wifi/Makefile b/root/package/firmware/ipq-wifi/Makefile old mode 100755 new mode 100644 index 0d625608..8bf3b414 --- a/root/package/firmware/ipq-wifi/Makefile +++ b/root/package/firmware/ipq-wifi/Makefile @@ -30,24 +30,15 @@ ALLWIFIBOARDS:= \ avm_fritzrepeater-1200 \ buffalo_wtr-m2133hp \ cellc_rtl30vw \ - devolo_magic-2-wifi-next \ dlink_dap2610 \ - edgecore_ecw5410 \ - edgecore_oap100 \ engenius_eap2200 \ engenius_emd1 \ engenius_emr3500 \ ezviz_cs-w3-wd1200g-eup \ - glinet_gl-ap1300 \ glinet_gl-s1300 \ linksys_ea8300 \ - linksys_mr8300-v0 \ - luma_wrtq-329acn \ + p2w_r619ac \ mobipromo_cm520-79f \ - nec_wg2600hp3 \ - plasmacloud_pa1200 \ - plasmacloud_pa2200 \ - pangu_l1000 \ qxwlan_e2600ac ALLWIFIPACKAGES:=$(foreach BOARD,$(ALLWIFIBOARDS),ipq-wifi-$(BOARD)) @@ -56,7 +47,7 @@ define Package/ipq-wifi-default SUBMENU:=ath10k Board-Specific Overrides SECTION:=firmware CATEGORY:=Firmware - DEPENDS:=@(TARGET_ipq40xx||TARGET_ipq806x) + DEPENDS:=@TARGET_ipq40xx TITLE:=Custom Board endef @@ -114,24 +105,15 @@ $(eval $(call generate-ipq-wifi-package,aruba_ap-303,Aruba AP-303)) $(eval $(call generate-ipq-wifi-package,avm_fritzrepeater-1200,AVM FRITZRepeater 1200)) $(eval $(call generate-ipq-wifi-package,buffalo_wtr-m2133hp,Buffalo WTR-M2133HP)) $(eval $(call generate-ipq-wifi-package,cellc_rtl30vw, Cell C RTL30VW)) -$(eval $(call generate-ipq-wifi-package,devolo_magic-2-wifi-next,devolo Magic 2 WiFi next)) $(eval $(call generate-ipq-wifi-package,dlink_dap2610,D-Link DAP-2610)) -$(eval $(call generate-ipq-wifi-package,edgecore_ecw5410,Edgecore ECW5410)) -$(eval $(call generate-ipq-wifi-package,edgecore_oap100,Edgecore OAP100)) $(eval $(call generate-ipq-wifi-package,engenius_eap2200,EnGenius EAP2200)) $(eval $(call generate-ipq-wifi-package,engenius_emd1,EnGenius EMD1)) $(eval $(call generate-ipq-wifi-package,engenius_emr3500,EnGenius EMR3500)) $(eval $(call generate-ipq-wifi-package,ezviz_cs-w3-wd1200g-eup,EZVIZ CS-W3-WD1200G EUP)) -$(eval $(call generate-ipq-wifi-package,glinet_gl-ap1300,GL.iNet GL-AP1300)) $(eval $(call generate-ipq-wifi-package,glinet_gl-s1300,GL.iNet GL-S1300)) $(eval $(call generate-ipq-wifi-package,linksys_ea8300,Linksys EA8300)) -$(eval $(call generate-ipq-wifi-package,linksys_mr8300-v0,Linksys MR8300)) -$(eval $(call generate-ipq-wifi-package,luma_wrtq-329acn,Luma WRTQ-329ACN)) $(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,qxwlan_e2600ac,Qxwlan E2600AC)) -$(eval $(call generate-ipq-wifi-package,pangu_l1000,PANGU L1000)) +$(eval $(call generate-ipq-wifi-package,p2w_r619ac,P&W R619AC)) -$(foreach PACKAGE,$(ALLWIFIPACKAGES),$(eval $(call BuildPackage,$(PACKAGE)))) \ No newline at end of file +$(foreach PACKAGE,$(ALLWIFIPACKAGES),$(eval $(call BuildPackage,$(PACKAGE)))) diff --git a/root/package/firmware/ipq-wifi/board-p2w_r619ac.qca4019 b/root/package/firmware/ipq-wifi/board-p2w_r619ac.qca4019 new file mode 100644 index 0000000000000000000000000000000000000000..a1b1166f6f9dd713fd5d45bbf50767a03703e902 GIT binary patch literal 24300 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�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
  • h@PR5m2 z%TTW)LzrvtNHlR>&jSKFX?vYx(rd1-O-JW5>4v+VTI1U5o_PzgC&C!O=Ng{vJP;wC z$H=S$b3@?R^?w~*OmOL=fkPh+teSq1?TnlU8z@kwL40n%q>5s*;dC1e#Ywiv> z`uZY|OyJ}%SrvKM*DDD)_H#wXo0rJlUjME<_p3uSwP(KUFEPYhu< z8pg9o=q4`$HAjsa=bpf2&6q3KzMmX3^@3;fshL8(#MykKp-ka~x&%}OY`!6QOuoHb zduR{-@KJjhC;Uk>+*5HbL+kGDhHTUxY5?DGPsB0TJ~3`rd0G6fLnW1a;>-5DoUGTl zH|5%&2{qBRC%N_py7mhQU3)f@NW|3LD5Y!f;V4~uXz#vhn|A8j&!IW*Q_;0I?ThvE zxrlC;m1}RJYY&h0KtOkvfgyCqDpy0_6Zl*NGTaD~z2T};(sFWQom!KQ2f_zTdr2O;|A`dy%5zhZ2pv!%YQC_iT{o38!iFG1IS z?0V;EXki2B<$nYP6l4JwU3(~ib?vQAsF|=b?)))Wh4DGa(0{6=cGcdP!jSb3S}Tub zl_$LJpTVSSf4RA&deyGz&7nD?Ee9LcmBnrMU(2Lxf9rH<-P*m9Lf)!RAz!8_8c#XQ?ps-+W+t5zkI{4 zYrhbdL-pl<_~E;6sk~0@FjUT@Yfn5=rp@&j_C(L9UNK?Am1|EvoiWrbCmw_BIDi`iwaL7$hnan;%=?KqL--)4iIw`RbV5heuiR;hc!(Ia9K0v%C(=S zAvm>Jd%5;b?UYgFm}_sswNF|RS5s11R&wyj%LLax#X#47-ES;$?cwdEt8(o*z8zYq z)0cl9x%T%k*Pi2bwww)f?e+NByo8Gj=)q(6To5Jp&OSdWm}~$1Tq{@TDdyU{!c};7 zeb95||N7VOCk=V^VbF=^l4~DHeobu%L2q|GkLk)XaP8H7lx(?P*Z#^?bX7yyu+E`x z+eURxtJcoz9OrWFyRXsKW7TcDLR&kt+p8U*M$^OW(!+Ej!QP;W_iV7UIy*Dgi~vT!-4VcC zdv~7!?l*oN#a`#Q2nLvIue$XWLcqDNgKvcV%Ji5(Slp7>=t%6%L=0TyRmj>6%(Z8Q z1}97r0nD}c!W)WW z&`0;7-dOOgaqZ-ckjGzP!)uS>9ecg?WT- z{{&wmWs}XFYgO0YsJ>KN8!#$Oo(Kd2L~OJL1Oy;rqs_+i`CxQWdyit)f@y+Y!PkQO z{-S{VfX09keJ@!{7$*#C%{a<-W+XLf!{--F>vO>cR@^1ii^O#9mMAd+fnyi}i~vSp zrXXOMYyUrg{P#cn{`bFw!Ad1j5uii@1pJ@=`#=Bn+i(8^Vr;thGFeI@nH4>K`sY76 zUhAGo*PdKkpm#33+Q2k#7`XN{p<2(iZ*9|QPmIzxgPa`aa_#A^JRA1=Om20Wi5o#VdeNW6?M|17-ww1!7;k~bn?=bXdOs^Ni*pnOM7t}S%Liy4scgH)`4a%Kz z>G*B+Mde|6mNaVohNfSoRLG?v#J8}F-j9hzP@q*^t=uY4m>AKVQyo$i$fcTF>RyFH zzEK)C{;~SJvRs}a6%hsQJ%BICBC{!!h04N-Pc&VsYQ<*xO3f##i;BwZOldL{XjLAd z3yeL8k)VlDO}DBB>RmoQqWM78ppeUDnsHU9;z;(o*g&#{{fg~Wm&PAJmnQCNI@NEf z$`$LzuWS0$%}{uw=2KO>q9!{#HhBDw`aQBsVMLeiKa7?aFHTdZ}dM zwx&Z>so0bqNfh|(fdo*xIo__WQteb`PTYaSD&-DEE_Cw}V3{TrLTZ<~R`E*qVzR(v z7=tb5mNyf4&|IbnMhTAV;UA8JaRGX z9m(OKUGuW;_wPOZvNGb0Me<8Gj$FxTUD^~}ePd*wI``a5zX(2bwzu$1(ovCO;l|Gg z51dbHj4EHeQ#G=+M|v)-fv;#9+}V|UTv*NDb!Xu4#k992mHe#_hss)08zT+`?ra#| z+8y5%RI{LDXr%Uov@@{{i%M0U8{bVj;{WRWb$17MonL)SwBLXGqr1wXO`S1s1(a*9 zSNE-H7T54!Z*JdoJf$X3J}>*`@aykM-wrGH-+5V6){}WwRLv_M9IjH!-W4DAmEY>A zJo8FJTzNpjmmlSximP9|&-c~AkvDp?&PN^<>}wl3*qz!OT_-5H(q7iIwtC4Me(Ns} z9O_u}PDG_(XUAYkd-|#HD*nz3m&-b2$0MrzcAP%*>YFJF@pgXNjiIWpji+O41NXY^ z#K8l{2+RNkrmDOFYk_)Wz+YB*!$lF{;o|T@GzY#k(IpIX?OozB z;7&Y41auU8onz8C*Vm?_^O>1y|mi&$RiVU@t3TMJnZY0gnSz3ii|fek?W7&eS1i7;k`h2 zep}nXV-HWSIq!pA0;3VR12&ZyU5~SldE0gnOA)_fJH|vuMNa4DD|9B;zJF+Fs1L4| zTCMJ)tg~}qaBy(IVgiv9l$|<=>q;0|Lcd5iWv`>Xy}c7m_l4M(2L{MWSrb4riuh*l z_dtP4XJm^UFz-+;0xQY zT#?Dx{EHVazE4c+-d>rE&9_h2UVW*jr{@D|f06k6rZ(JDaV{h6>;_0>)c)f8@S>L) z?y309=h`1xO8v*qgu|}ts+UVjcg5{0FN@z@T2>KXw&!INu6^=y9oIfRFDpHMf^NOm-2Q5fxvy zY}t?BfA1j^%tOFCNTs(~0{fmoi4eL^H$~t6nsV<$!00^eM|cCRHB;_A(MKX_p)vO! zdC#8h?Z$Qe&DN{q1JAVvTqfDw2G z2z+?f1I_Uuo>9RsIM1L-#wLndYKpdO$;*_zvdq2rfj6g6zL+Zi z=lP!6^0IwJg;Wd$!Fwr(8x!|FMrYBHgo(v5F{Bq38mjf|iV;FDx{8DlsN7 zF!!FilO5IH(7K_^z?vS$SAa&zGs@dQ;kiTd;hWeBoM-1k-suItZ7im6{{7i z*|_%)J|(#KAFEF&OXcbE^vOX@t!j&6nPM3m_x|B1aPOboRKKO%uE7wlq2NkWEzf7tP*~7%W zztW>@&3-HXP|)^|uk37*y(Kvk@EQ~MexxVsP09X6g$uK~`U+2{91Ypc+rq@X|D@|@ zM=kn-^v@b#6PISSKu(&!;IE|s1xF&x0Xy#ya$f~nhQtrjlf_2@|Pb;W8>aC zX!P^Ylb;IE`k#tD{`sff=>Po*sJhrJAYhGq4^O(`akUt}-c{>`g#@}%jCyho{R`E4 zVZn=BDMmi(2mC^VwO&}TzbnNoObr)F0`9#pLJ_cuffpo(V;F2Q;NE9=Oa2MA-)Oh5 z;rKP7i$C`rNn<9YFIgo{r?yBqMjj?M7a0`p1_uO4?!71G-aCt*?_BOZxsEiGchkzf zpUJ@Du}vQWT-J=aaPOyY1kP>QKJLA9`(#`@hkvXrS*DFL#L^$OaD|q8PcXE(aPJfK z-21`}@mU2qTZ%Fc)y1z|zAUkv7&FDYzvc^^saeNB_MT{WNiXswH1Fs7z?)4l;_WBF zyPpF;OeT>mqu`@>_eds~jsEs;XH)47c=vXh2zh*NTF{htZ<@}0&d$3h`eMr_1~6F7W80dg7Ji!UyKPy0^I z*m?I;tJl`j6=$v*JasiL{bb-;bF-o>rzrKwwa%vcJw@wtR*emHo@lNt`+3fav0?D4 z$_jFp6VGRF+?K?k?}o0u+q}PQLs8n3;m+grrA2u;vavxTTTxDq6bhVbu7%hdszA&V z^j-h8hWc$qt8?O@=sWehi!veG<<4d(x?UPPcCGV#eMM1$G*Me1#<+i0&TL+t#RaS& zN+!<)l(>x3)$=^+-T!8;BJtIL)T`Z9O)K|AZ4Fv~Z|HD))`{54z~c7d?d_{hh^qWb z?skrLrf2D~unNCoSH}hSj~M|Yl`Dp&HsWur-Wcm3 zN#sB&_w@82_OoVrd&6h(DDxR;sVmO@^6mUsL1bhE{6>kx!$IjvEH3nN8I>!>QO(d` zOG`}+#gTvU#o4o|LF#$;0-wM9jnb^wYu<;>^YQfZ`a7A`12L6%HdIW!`&g}MS@NRL z0MPt_^@ot4K=25Ihy8ZMpkPEq1W^&So$w;7GR9RZi$i+0{8?YfDyn5U<5D%7y&m% z0Bhd6@x{kOcP#|Cl1;egbFI-??Tt0wJv^y~N7cfR#e#?k5%usJJlBcAx8_p)3nU%l zVYA17_^jz!3ynFrfpdB9O-P-{gF5=nz{-rLH%PvXS8 z&%0=%cTe)}{k7r_@Rl-y;N25~_e}4IA~u`z?ty-gN^kb^?xC&wrtLYJcTe<@XhUe! z5HtT>&!;!aY<8m0$ANcmRGPV6TX^?6oqJmEo<0)a3qWl1=FPKZd*KCV^6t|Fy@Idp z{8R=39M-$nP9L{iVa9_t`s0C5Faj6>jDQ;=P+UxF)ARYh^C-E>yj)>!LT+A~FpZZj zOco|5B>y^@w_3P5VRc@jFp(z}QatZ7t!?T)W*5=z$z-|~u}gzu6C_-oq0Btq{Z#et zCr?fs(B!F;R3Vd16ZYKoPsvlmacPrReqqm*SYX4AXx?jZE;&rZ~7wkead1(W9{j%td)dq`bVm6Mk&^$%v!yC1oDRIw>jBIeKTZ$ES}e@lEyu$W2j{>s^kU72elLP7)` z=l1Mfmm8PtAB6Sp@e2kcFtZStstSiSz5Cv#ifn0Jkt{hjDk>6wL4iXQ5gslMFZ6a9 z6%Ne1pILJnkH!HAaOJf-I-di&{ybNKdH2AHcOqxsl{ofHeR1`;T2+(7UC;D6A(`;)B*`S(KQ#c#^*|WU8X3>Vw?VoI=h|fiIyR3Tm z`bNQH=G_}*v34R52oSN+2A|hO#73Kq=kvknqV^uy_3kO&{e6E?Kz=}Dz=*z=9Ge2( zJ!#ys!)GiEj9VF|TsAL-;sQ)Cn#M3nrid_|+l&%ZB{+r=zzARjW(oq^wiRp?i^E_z zfBozClZM*%MC^b5`0s!C{qKJVo?h?%r~m%XfBp8`|A5#+jP!SxO>R z=hLTu{u330><%*~z56(0TM`?s4Y-)c1OnE(r=D$$>K}2qq08kN3g+FLzJ8wE7{8#d zQ5MRVKDj&Iscum2luOxo_oMfLAPxmu)z!+a@`Q;I%{kQ}MS)z(#=F1w0C@LgHifcK zSvc{Drb|_=*eqYk#=9ST0KEH&QBAk12I^ftKBDmxXzx_Nr7Bmf z8^5mUQ#V85jcmO8`wxM44@2$IoK;t=ilIwt^}DLWN;w0gLYqb9cbe*B5zY0&joGs>s6>AD`gi8*W}A*B`(8_K@V= zd+kBn+6EpwLyz9s$kMv@Y)5;z@{TM+@$M--tVE#{RI&2%w`|){yr)#va-prOw}0U3 z$gMl~K70JDuWV01{aU+WU>}X#82QNdgb!`DsAph^&*zKzdHg0?fh?JyEKbf#ZlaaO zNZm0wU#(RhvmHd%5~y8k2H@VfdQEffDr>@GttA^+Tzo=&9BTq=RjdiDRk0>?*=!(K zY@@L@VPie+klj!0$M@p}3xgAa^OlL1@t5(|2-hU6$y+8|_T3t-&xLod*4brPPo&M* z57k+8g3b*!_B%OP@G~@lSilbvQoQ>VaSET-xKDX1v!Hk1-TeU=wHFE_z|8lCvvevm zZRYFUA6QEL=UxQ|4!ry1L>=!wKYioRw#MfrB_<}88*=Xd?RyUo^qVjLpHF~sFG5Rt zq2gkM=K8>wCV|0QPaWre!z&wK-?(YZ>sgz&Zpy6_2dwbJ7f8vOcEn4^fP?_OI z(AW((eOuhTg<#xrx_+*TGgs-ytkmo==yK<9{fV6Iu`6R&b`BqYJLmOSS*&bqsPjZ~ zW!cYjR*VgUS5;P!vz&M;J91ePgZc;GK3-6im=YV`KUDvA!Oqx}*p#tBB3n^TjuZ-< zYOXEH%UMGfxDvAjT^(v}D%v4k5gT*$>f7%Y$P-t@E*-nv*<4>*v|buJcCGV#eMM1$ zG*Me1#-MZ7UA!D^9V3L?5+yFcxO$$>wp}OE>z0;>Y(LZfTJu`vl7k_y-y1sIo^>L& zGO)OPczgS*6QU}=64lwlH&-8AvOB2Y?Q>h-UR4#dFR<|Q!TR?%ok*w(-TldMZTp5( z@wFlQ-f8-I?aI>F9f9i`PH+Cj%0p2lfdyACm$hX#zf>DsdiPpQ&(dRI6@JC8jtlM| zGXhgxWrJGb4H2>P^z`%~_OoVrdwb8;n$JMvw!}bkl`S$d0)C^!;o+cgB^DQYxy&jX zGcq$Xs^`ozaqjKYBmm() z*(E(DY%u2@bM9rM?#a0~xUFDxnO-mU#@zBvEFLtM>4H(hD6t@brv?i!M&X%&lF@+h z2}S@TfDyn5U<5D%Zj1ot+`I9`chjMpQSN_m5g?3M3l{psHJ^nlTrtTS=N>qDadAsx zBSk{j^q_M~Km-T+=b|3*Q3a}hF6p`AoHXncp>6N?jieC)$DZKchXDa95~xsO*ob2b zKM9G&At7QDy8vnt5S)Hb&poK(B&;rbdd+F?c>n!NU>^}|Hn2}Vy>o{t_C6SqkIIG69WbUC8`qwW zJCZ+dPhD8+UN6aIhljQ9?EnoIacu;+tQm9R+`IND?eCr7sengw?lYfe^74dv33+*$ zDCKF21X)Yp%rt7e`Y{$M&hv9E`O(EE9XARD(AjPsO8*WAUOB_ zy#Pcpp>y8|4$0xR$hr4i?KI9ki_Sd@=br2>)6P2Q9_!p|aWm1ucZ|;cY^I9>v8n3Z z{}*MCSgO~CySgSOx_al$Gp55>E@LTmCalcjF<837blOZni5`pdkGv*?Hp7RasslaI zm4Egix8ra;{s#|K7wL(Hu6m;3KY60B?#x2p$-L0QdtNB@WpBjupXIIpFYNq&;ubIh z7=f9DfMw48^P_XWbZJ5Yu@P$x#8Y!Ix#}==FYYDsA-ot?2^``v%^l3Sr|wlp^|!2U z=yG{}f_3gqUq4^`gStt%TfR!_KXL2BreE$Zk);XPbnZX81A^>d-2CvIvP3S00{`$~ z^Dp<5tW67G)43nH13LGb8!DATk)0aL*Nmu|6{Xp-#1J-}duTy|KECdPUi0yL=PLKf*Ghvm_f)48#qu<12%FCR^}C>Rueq%{Sy?Jil?H!!OLb1M zH-AkcpH1f;3dEuhM}MhOlxMF_4Epen>OI99`LaYmHl6$HpJ1JP(`jjbJ`-+;@EFXm zt9b;YWR8h>#060@?<9`6Hv%g4#-^m2kllV;K5TvM7pu#|<%@EebnZ(}q*h0k1a5v& zTHm<-P+U<^-n>L6o%<8&Evlrt2!-#a!A?c<+8RlzAdgAs{z9v~F=@YO$AYwvPVTQ+ zQxaXkU%{kve_LI4a^>NOk_E4fy?3ZlS{Av@cQupFy{c=|iP%GdugzWi_|mJV;wpoR zUrb}txo_)!^<>=P;MZSFy?>?r-16G6z4O;G>D-Tew5vVwSZMkD4POjbytn+Q@QwLd zSm)loUn_X@GY^5ODsW((d;KE~OP)Ee{{`Am!LIXtHy#@9E!D)HHuGjD9+9&Uu*$jT z%Jgt_K4%U1IjPqw=N=w_gW$}P*jUm@h>I4BwH}Vm09;&unlk9z&o|b&&wW7Y+!IGO zoqN|GC+?vs0;JA8aN=p5`<51jdM}NPT>oich{${6I-ma@u;ea5Y~-h*VIp?>AE;PQ z4-p$CV|PC0^Dlsctzqor+k7L1Ridn;jpo*~9qr-CJF*Ps+_S&8<&c6o_Z&dNS)MNh zxU3mt&ON1b|GabVU-0-p$lK$o?%y84xffNtKIgtdt8>2=`pZG*K52!HbAO=h;Qp%m zs`$MnE0!%!tXXELbszjK@a|_FXUaoyATKBiLpGRbAgdsdv7Zbtf z8HgWKGu65`O()K6(Yl9gg$y@8I48Cc?FI*%?8O%sz&C46&BRkH?y%C9wCl=ft}^Ee3B=jF)QwC-=*2Ce(= z`mZ(AZ!21z69+}#so!0c36l6MTK7-@Yu#JD?k>3K?Sfsh3gdH-;Zg7YH**zrno@~8IFCu|{!w>DL)Kn#j^FBs{fFMk zJrun)AQNldKL-`^&fUV+C02o)Nug9BgT+ zsoAn6FH4GEd~vq+Lw-_8RD_t2wMPPmD>G5L0<)4}nSRK2~edk%Wmwp#i|X z2ey1jP#}2r$Dky9zZg*w)T*s-DlsN(Fz=pv+A*qs=;4MgmuDz5k9TkWAI3Ps^m?&3 z=7MiAahJGUOpFpni3I^XHCTW#3S*Rv;J_ys0gM1f03(1AzzARjEFxgeiJwE8!#MHg zZP2v)7aZ1x#X;gkjKK4N0L7ND-czpmtk>jHIjr&S;Yl?-qZWoN7DPmdsE6O+xlW9b zI4AoTNIJyBd4Vg%!ofsgfZrl;;7Ih(m0~V685ueQdi03UqgU~H9w0**(4swF&>m@> zdO{QbA0JYh_z^sWL9t63H)F4c|pRUgrGd?30{UUBO&A08N6I!ZbEKenlO!*Eld_BCnWzm znYUWFI$?EQqA-ys6;fR9Gp%jvK4uruJ&?(CeZVdaicOGkd5$vkxc7P6N>#nL?tP`d zyD;{w{qdMQIdMRfr%qCZOg2sI*Q{43t3uf{@4MPSoPDx&qFz&^PE*BCzBi%NY*%Nf zma=KytJ~p&yptUh?`qyq=c`_x?3p;JIiTLEjAzrl?`{Xpd&qWLQ=uwQteE_8qE%C; z+NO}PY2K?lh%Tuonl<~CnexcVzKOG%O4U}yS~ku5?heqrpKP1>rDnHsZFUe8ZPJt} zGqQu(H1B&lK=Xd`;zXmSSh+fT@nrkNJDNR8S@vQ!&HL^S(7c~KJ5i_ErcBNjOrD!K zswo1G$EJDTLyW-|bN)Mb+ya;DflPn~}UUIFL#6{>zTC{FO1$ix3*?IeH-bm4x`v zP$td$M?F==87rbf0_Tl>c;JofY@yiKk4f|Xp8CL!{LHvWp4Y9un#y(A;#mJ6Ce8a> zZAW(Jtc{ECn?0nismjSqmih-XY2J@qJgV4~DG~E$_qQK9n7<`HC0NX)d4J_>#jeaX z5g{Rhj&pnVuFH)}_7B3E_ip<#!2_S62uxLp!aD8n$Iv;ay+$M^-_rQyHB5&W7 zc=k+varKEl0GxV?1J5IQ^aRI#?mLpkOyJ5dStU-Vwy?uXR*~B!U#}#ROHc6WeH!P& zMjX9GB=?@++j~p?iR9o@Jp8X+ef;j+KU2;7sqo;L$~qfcnq$v)w1+S6$TFCFPcN(4 zb;R6zyI{kGTp0l_YsQ#+kGc2G{@-b-ep|Wsi8{@DYux*5z9zc&B=>%<522t=>ZoJg zd%!`@sV8A!-Rbjj;NBa30}(Ul-xlsYam5Tbtb4D&Oj!3`kA+(! z^Ly>4qvumyZG%2z-TUddaCWxIq+4$z_ufo5-_EXZE{3`H+UEhI^m74A4(8tL&~fQc z1#o$eGV{3i#!P$jGtPe$IAnCoH?ero9A*Z>C}EUX5WrJ|1sJ37OhCzKK==eBfDyn5 zU<5D%7y&m%z?>J4x%X~79q`bn69G5p@?-8j=H5@|%gtpY(AL%4KX7&A)}4EwJ^s~KwkH^9XwhqmGwg`D_cQE*;^D|- zT-J;+_a1Za?fswYh;kKL-TO4CjDzld(h42-e%-;J?LAmlT@}A> znO?w2r+(;R5PhV5{gIjfu21Lc%|&#(B1HX|mK2!q?m=I}+uM7VfgxlI@7^C8Fx&#* z+;B5(-`e>?Fl%|9mvl?K`?0H?r|S0>tTw9cvvxY42Wy}&Z zcD?g7w6Gy()!0W+KtUF`43(4?t(V3^b?56ViVCEO+5#~)p*j;5jPV$_TymRH;!>%r z=jlIHQoCwzOkv3S2d$OIvdR-)_s_UDbhth1L~LbXar^N0_EjfDRemLxn@g%!?TX$U znlsvRuwh+U+;;!9pAXi*zv)CmRp{~%7Y2Dhrl0x39Pa$8XB4NAV z+AEjK+OnHpstqo^d#$Et>9Md1zhYO%1^15`0VCeMISukB;%}@agIX=~?i;ry27dWw zezGt!G6H_1#NpwfbR`xSdby0s6*Dq3GrDbC!A7w-3E-oz$hQz=$@Jxa_~E;6sl3iciivlhU}$kmVxuF;fXjJI*zklrUb--y zmn2N$>7?b&9o@6BQTmYsCkONHbueMxJq3lGdt&ZZoK#;m+@hvv4F6(`LQJn0dt)}g z0mKEkK#fttD6t@brv?i!Mq!MS5gaTh&PR!*VI0N?U<5D%7y*m`M!@Y5z`T36yX0;^ z;2+G)MIgbvd)2M45CZ;v9eh>fSEfhTeCCaN<*3yN7kL%3c7xEk_xncDh(O~$8u&TU z0)!$#%u);+actoyA+b0lL~LRgAZ{KNi+8j}B3YaV`tcA#!0Go$OF<}h4iCwY%&T}d z4|)1~&fNh=Uqby9+l)ql6e;lWQStZN}z;QqZZ!eZcW`%ok0A!M0%FLxU6{wCD}{k}!}&Xk}v z=%d!Wg*yH_8}D8SgVbB9fZ)IT%%0`#rDMP&bo(cG18$RX;N2V5=K#LHKp;TGMq5BY z03tTpY&@S2Mi;gBC}u5~Cg>G>Ex7M53dj#=3>eY(lC^|!!m!qiqiknJR2Um(k7<3* zUpvJum}1U!j!|Ml1;;P~7y*ocJ0YOw%`@@t|L2eY{)gZH{&xTf#l0*m(CcSxO?s<$wD0&wp|}7a#NPwRfAN^j)VV2lMWA=wRMG1%;h^;_sp%=brGV zNV|{9+g1t-i1)rSzQfR;5p7zsCpX3~sB4sk@}*Dij(4gXlso0p@!RT)%ER(3Y1H@) zO}|R1kV`{|&x(!SkBLQ4pjBP1+$v9)7}11aDHifcKSvc{Drb|_=*eqYE`9yV5QJI}7O@;!k$^&$Pu?H~{G%>2_R@Feg z%g0AFAE+7>a=A=1uIf}A$zB&5NVc$Fv7PGD_yg$D#9d9N`YlztV%_+4O`p0M3UAbW zs%lr%WM{_)kKa+hM|LTU=+ga%u@VGB?a`c7SF4JlOKSDIs>4dT=DNB^QJ$SHT{`ip zrcYI`cvTui6_7*|V>quqs@kXA2#MXQIz_&GDRiV=SuI~Ll}y~$bf_v7o3bN`0-rsQ z07^H<+tpR7oyyFKJCInV+@Z*YZe9W`)1*R3?NZk&Uddie7I+L}u*LA*2N$$3N*E;; z1n|^g0mdk7GfGCK@d-u%wcR*)CG|plQ*g~C&1;>RXJZ-`A3Sm~>mAAApk4E_?)UFK z{jxIRjYaZHH;!D%XkFSATzz9?pE~#4OTP#{bhfwfOwv)2V&TTm2M?T2Ym6#iyi+x@ zwMTj`tbwm+8r<2Hd|X(~-*so;@Wr&ZC6)ZG4~NQHQyU`=1nz7Y-r61C6jZaIWN4)J zgS0cT4U0-uog3dxI^zH8{B?H+cb#8-OtjyB`=h(cp-r7JZv~WVu2=W1X%^S;UvF;T zbUdXdP(CmF=J4z9N#71D_uqM0Q`VDtR#eR^9vrSx%ia|q_Lbl2sXX&aLtJ@4!IvN9 zo{FnqywCU5!I3w5v(85z73^ypI@q1s99<_Uxzb+Nw6=Q58-D9A4;<=P^G-yiU}wi* zNqhRK@GAb!3zy3}WXB__{C1o^^Xi)^3h{P++Kr*Au8pT-YXkSNV@)f*YoZBL3J{69&8H`N&_DL+j7H=R*i>S4 zJz04lNynB04!)06=0nEF%e0ebM-dX=G zxz~F{t9PFXML6i)CnxE6_Z#;fd1G%$W&EbfU1jn4m51Ut7pz~ANZe9Vn)kl{#mv2L zBs&KRqOQul=Xh7_IPQIxf`o+Q4s-7bpu}i43tm&@-v1Y6k65bLhP%2ZCc1j(&C_#X z2+wjEOQ|+5hvEX3;H1+qN;DFdjy9uYsWQi=@tP3Y3?GiF4)jD<{@H`vj>GZzA3RW9 zq$e7>>WPN`rA5pV+pW(xN{MQ_Oo z330Kpkq{ugXff^C6H5dm>WhxldeM>Msl=G36gSQLt7zFRt?8V_T5H!i-Dc)o?)^)2 zpKc9516QQ8UY#d$n%iT8b?ME9Qa$=oU0j}{kY9w*MtvOux$gt+`_-$%miOU=U9!A4 z?{p_=hH+x_GF(XfikKS4`J@Fnq1|Yxet;?5U z?!C;M-~R$_s9@Lmz8en>_m=qvY^eg)g z2=P2_%{nkQ1dd&sl#8u4i!)3+0wnj|6LasK#m{#x_dfpCt!0B?qXs4eUuJtkXb5Sc zW^Y7oPxw%4W>v8!5TEuS%&f$;a_?;iaoS6afEmn%QF1caeg$2#1ncy9775e@WtgJ2 zH_m0vcw^zteP=FqU)J0n|ANh5l0?7qWiosGA<|-A3JD1Yqh5Qq`$S=?EP(|53TE>S zU*&9h?Bm`qA^r-=wEHWhZ@4E@L&-mHmiL!06JwzEeSLc0FdmQ`z!UPblCyXl`74rF z@YeE+I*1>7^!lUeKX{G=Zqs7V{M=UVeIjS>{mnTZ9%$AvkiI7dwWJqz#R$#yfiG7A z0}*x0+dx0! z6ctDlwFP2~`)B3M1=oOam#kbfGTHekap?v3Jo*<9_cBw@*?+2}cGcdP!jSb3S}Tub zl_$LJpK)*KaC_E?*vi1-_TlaAt4@fj{7No2msGFX6}>q$XSC&D!@9D#?fz>&AFO|W z(}{$t(A}R5*S2ps6<-^&@7C$ky0v>Hg}hatLcUBz!gjy4S1y;eWjDW68(ez#T20T= zV__A3#Z&J&u3iB3IiYBO~B9N*o>z zYFA=$p_j`jT}=n>)77SB?*0Ex{>wL%ZoOXjK6IXsrym<3AXzKk74r{~h zE*u`P-3VCa-rHUC6bl-&7T7D}nvcB(mrTLj`)9%1$J~2+Cx05~*86=UX+)rN9}WDR zFd#rh0u@RO8*yymCn2#oBt&dt7a(pP6^nPYMk1Ni1O0dip$k4dkF*qoV(0LX49UDm z-oC%5Rx_VmbhNkIxZHDq0Kx6|1a5!DNmyNWg04QB-aQ?67N?$Tz0T*}Gt#XI61Z&% z4y0QXoLa*43{GLcSSf{A%jdNKuX5-r% k#+M|~AG9F2_qO{pjC(&o^6f3|Ewk>aR6~xvdvfppe{lF&o&W#< diff --git a/root/rules.mk b/root/rules.mk new file mode 100644 index 00000000..a33ba4bf --- /dev/null +++ b/root/rules.mk @@ -0,0 +1,432 @@ +# +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2016 LEDE Project +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +ifneq ($(__rules_inc),1) +__rules_inc=1 + +ifeq ($(DUMP),) + -include $(TOPDIR)/.config +endif +include $(TOPDIR)/include/debug.mk +include $(TOPDIR)/include/verbose.mk + +ifneq ($(filter check,$(MAKECMDGOALS)),) +CHECK:=1 +DUMP:=1 +endif + +export TMP_DIR:=$(TOPDIR)/tmp +export TMPDIR:=$(TMP_DIR) + +qstrip=$(strip $(subst ",,$(1))) +#")) + +empty:= +space:= $(empty) $(empty) +comma:=, +merge=$(subst $(space),,$(1)) +confvar=$(shell echo '$(foreach v,$(1),$(v)=$(subst ','\'',$($(v))))' | $(STAGING_DIR_HOST)/bin/mkhash md5) +strip_last=$(patsubst %.$(lastword $(subst .,$(space),$(1))),%,$(1)) + +paren_left = ( +paren_right = ) +chars_lower = a b c d e f g h i j k l m n o p q r s t u v w x y z +chars_upper = A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + +define sep + +endef + +define newline + + +endef + +__tr_list = $(join $(join $(1),$(foreach char,$(1),$(comma))),$(2)) +__tr_head_stripped = $(subst $(space),,$(foreach cv,$(call __tr_list,$(1),$(2)),$$$(paren_left)subst$(cv)$(comma))) +__tr_head = $(subst $(paren_left)subst,$(paren_left)subst$(space),$(__tr_head_stripped)) +__tr_tail = $(subst $(space),,$(foreach cv,$(1),$(paren_right))) +__tr_template = $(__tr_head)$$(1)$(__tr_tail) + +$(eval toupper = $(call __tr_template,$(chars_lower),$(chars_upper))) +$(eval tolower = $(call __tr_template,$(chars_upper),$(chars_lower))) + +version_abbrev = $(if $(if $(CHECK),,$(DUMP)),$(1),$(shell printf '%.8s' $(1))) + +_SINGLE=export MAKEFLAGS=$(space); +CFLAGS:= +ARCH:=$(subst i486,i386,$(subst i586,i386,$(subst i686,i386,$(call qstrip,$(CONFIG_ARCH))))) +ARCH_PACKAGES:=$(call qstrip,$(CONFIG_TARGET_ARCH_PACKAGES)) +BOARD:=$(call qstrip,$(CONFIG_TARGET_BOARD)) +SUBTARGET:=$(call qstrip,$(CONFIG_TARGET_SUBTARGET)) +TARGET_OPTIMIZATION:=$(call qstrip,$(CONFIG_TARGET_OPTIMIZATION)) +export EXTRA_OPTIMIZATION:=$(filter-out -fno-plt,$(call qstrip,$(CONFIG_EXTRA_OPTIMIZATION))) +TARGET_SUFFIX=$(call qstrip,$(CONFIG_TARGET_SUFFIX)) +BUILD_SUFFIX:=$(call qstrip,$(CONFIG_BUILD_SUFFIX)) +SUBDIR:=$(patsubst $(TOPDIR)/%,%,${CURDIR}) +BUILD_SUBDIR:=$(patsubst $(TOPDIR)/%,%,${CURDIR}) +NPROC:=$(shell sysctl -n hw.ncpu 2>/dev/null || nproc) +export SHELL:=/usr/bin/env bash + +IS_PACKAGE_BUILD := $(if $(filter package/%,$(BUILD_SUBDIR)),1) + +OPTIMIZE_FOR_CPU=$(subst i386,i486,$(ARCH)) + +ifneq (,$(findstring $(ARCH) , aarch64 aarch64_be powerpc )) + FPIC:=-fPIC +else + FPIC:=-fpic +endif + +HOST_FPIC:=-fPIC + +ARCH_SUFFIX:=$(call qstrip,$(CONFIG_CPU_TYPE)) +GCC_ARCH:= + +ifneq ($(ARCH_SUFFIX),) + ARCH_SUFFIX:=_$(ARCH_SUFFIX) +endif +ifneq ($(filter -march=armv%,$(TARGET_OPTIMIZATION)),) + GCC_ARCH:=$(patsubst -march=%,%,$(filter -march=armv%,$(TARGET_OPTIMIZATION))) +endif +ifdef CONFIG_HAS_SPE_FPU + TARGET_SUFFIX:=$(TARGET_SUFFIX)spe +endif +ifdef CONFIG_MIPS64_ABI + ifneq ($(CONFIG_MIPS64_ABI_O32),y) + ARCH_SUFFIX:=$(ARCH_SUFFIX)_$(call qstrip,$(CONFIG_MIPS64_ABI)) + endif +endif + +DEFAULT_SUBDIR_TARGETS:=clean download prepare compile update refresh prereq dist distcheck configure check check-depends + +define DefaultTargets +$(foreach t,$(DEFAULT_SUBDIR_TARGETS) $(1), + .$(t): + $(t): .$(t) + .PHONY: $(t) .$(t) +) +endef + +DL_DIR:=$(if $(call qstrip,$(CONFIG_DOWNLOAD_FOLDER)),$(call qstrip,$(CONFIG_DOWNLOAD_FOLDER)),$(TOPDIR)/dl) +OUTPUT_DIR:=$(if $(call qstrip,$(CONFIG_BINARY_FOLDER)),$(call qstrip,$(CONFIG_BINARY_FOLDER)),$(TOPDIR)/bin) +BIN_DIR:=$(OUTPUT_DIR)/targets/$(BOARD)/$(SUBTARGET) +INCLUDE_DIR:=$(TOPDIR)/include +SCRIPT_DIR:=$(TOPDIR)/scripts +BUILD_DIR_BASE:=$(TOPDIR)/build_dir +ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) + GCCV:=$(call qstrip,$(CONFIG_GCC_VERSION)) + LIBC:=$(call qstrip,$(CONFIG_LIBC)) + REAL_GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-openwrt-linux$(if $(TARGET_SUFFIX),-$(TARGET_SUFFIX)) + GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-openwrt-linux + DIR_SUFFIX:=_$(LIBC)$(if $(CONFIG_arm),_eabi) + BIN_DIR:=$(BIN_DIR)$(if $(CONFIG_USE_MUSL),,-$(LIBC)) + TARGET_DIR_NAME = target-$(ARCH)$(ARCH_SUFFIX)$(DIR_SUFFIX)$(if $(BUILD_SUFFIX),_$(BUILD_SUFFIX)) + TOOLCHAIN_DIR_NAME = toolchain-$(ARCH)$(ARCH_SUFFIX)_gcc-$(GCCV)$(DIR_SUFFIX) +else + ifeq ($(CONFIG_NATIVE_TOOLCHAIN),) + GNU_TARGET_NAME=$(call qstrip,$(CONFIG_TARGET_NAME)) + else + GNU_TARGET_NAME=$(shell gcc -dumpmachine) + endif + REAL_GNU_TARGET_NAME=$(GNU_TARGET_NAME) + LIBC:=$(call qstrip,$(CONFIG_LIBC)) + TARGET_DIR_NAME:=target-$(GNU_TARGET_NAME)_$(LIBC)$(if $(BUILD_SUFFIX),_$(BUILD_SUFFIX)) + TOOLCHAIN_DIR_NAME:=toolchain-$(GNU_TARGET_NAME) +endif + +ifeq ($(or $(CONFIG_EXTERNAL_TOOLCHAIN),$(CONFIG_TARGET_uml)),) + ifeq ($(CONFIG_GCC_USE_IREMAP),y) + iremap = -iremap$(1):$(2) + else + iremap = -f$(if $(CONFIG_REPRODUCIBLE_DEBUG_INFO),file,macro)-prefix-map=$(1)=$(2) + endif +endif + +PACKAGE_DIR:=$(BIN_DIR)/packages +PACKAGE_DIR_ALL:=$(TOPDIR)/staging_dir/packages/$(BOARD) +BUILD_DIR:=$(BUILD_DIR_BASE)/$(TARGET_DIR_NAME) +STAGING_DIR:=$(TOPDIR)/staging_dir/$(TARGET_DIR_NAME) +BUILD_DIR_TOOLCHAIN:=$(BUILD_DIR_BASE)/$(TOOLCHAIN_DIR_NAME) +TOOLCHAIN_DIR:=$(TOPDIR)/staging_dir/$(TOOLCHAIN_DIR_NAME) +STAMP_DIR:=$(BUILD_DIR)/stamp +STAMP_DIR_HOST=$(BUILD_DIR_HOST)/stamp +TARGET_ROOTFS_DIR?=$(if $(call qstrip,$(CONFIG_TARGET_ROOTFS_DIR)),$(call qstrip,$(CONFIG_TARGET_ROOTFS_DIR)),$(BUILD_DIR)) +TARGET_DIR:=$(TARGET_ROOTFS_DIR)/root-$(BOARD) +STAGING_DIR_ROOT:=$(STAGING_DIR)/root-$(BOARD) +STAGING_DIR_IMAGE:=$(STAGING_DIR)/image +BUILD_LOG_DIR:=$(if $(call qstrip,$(CONFIG_BUILD_LOG_DIR)),$(call qstrip,$(CONFIG_BUILD_LOG_DIR)),$(TOPDIR)/logs) +PKG_INFO_DIR := $(STAGING_DIR)/pkginfo + +BUILD_DIR_HOST:=$(if $(IS_PACKAGE_BUILD),$(BUILD_DIR_BASE)/hostpkg,$(BUILD_DIR_BASE)/host) +STAGING_DIR_HOST:=$(TOPDIR)/staging_dir/host +STAGING_DIR_HOSTPKG:=$(TOPDIR)/staging_dir/hostpkg + +TARGET_PATH:=$(subst $(space),:,$(filter-out .,$(filter-out ./,$(subst :,$(space),$(PATH))))) +TARGET_INIT_PATH:=$(call qstrip,$(CONFIG_TARGET_INIT_PATH)) +TARGET_INIT_PATH:=$(if $(TARGET_INIT_PATH),$(TARGET_INIT_PATH),/usr/sbin:/sbin:/usr/bin:/bin) +TARGET_CFLAGS:=$(TARGET_OPTIMIZATION)$(if $(CONFIG_DEBUG), -g3) $(call qstrip,$(CONFIG_EXTRA_OPTIMIZATION)) +TARGET_CXXFLAGS = $(TARGET_CFLAGS) +TARGET_ASFLAGS_DEFAULT = $(TARGET_CFLAGS) +TARGET_ASFLAGS = $(TARGET_ASFLAGS_DEFAULT) +TARGET_CPPFLAGS:=-I$(STAGING_DIR)/usr/include +TARGET_LDFLAGS:=-L$(STAGING_DIR)/usr/lib -L$(STAGING_DIR)/lib +ifneq ($(CONFIG_EXTERNAL_TOOLCHAIN),) +LIBGCC_S_PATH=$(realpath $(wildcard $(call qstrip,$(CONFIG_LIBGCC_ROOT_DIR))/$(call qstrip,$(CONFIG_LIBGCC_FILE_SPEC)))) +LIBGCC_S=$(if $(LIBGCC_S_PATH),-L$(dir $(LIBGCC_S_PATH)) -lgcc_s) +LIBGCC_A=$(realpath $(lastword $(wildcard $(dir $(LIBGCC_S_PATH))/gcc/*/*/libgcc.a))) +else +LIBGCC_A=$(lastword $(wildcard $(TOOLCHAIN_DIR)/lib/gcc/*/*/libgcc.a)) +LIBGCC_S=$(if $(wildcard $(TOOLCHAIN_DIR)/lib/libgcc_s.so),-L$(TOOLCHAIN_DIR)/lib -lgcc_s,$(LIBGCC_A)) +endif + +ifeq ($(CONFIG_ARCH_64BIT),y) + LIB_SUFFIX:=64 +endif + +ifndef DUMP + ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) + -include $(TOOLCHAIN_DIR)/info.mk + export GCC_HONOUR_COPTS:=0 + TARGET_CROSS:=$(if $(TARGET_CROSS),$(TARGET_CROSS),$(OPTIMIZE_FOR_CPU)-openwrt-linux$(if $(TARGET_SUFFIX),-$(TARGET_SUFFIX))-) + TARGET_CFLAGS+= -fhonour-copts -Wno-error=unused-but-set-variable -Wno-error=unused-result + TARGET_CPPFLAGS+= -I$(TOOLCHAIN_DIR)/usr/include + ifeq ($(CONFIG_USE_MUSL),y) + TARGET_CPPFLAGS+= -I$(TOOLCHAIN_DIR)/include/fortify + endif + TARGET_CPPFLAGS+= -I$(TOOLCHAIN_DIR)/include + TARGET_LDFLAGS+= -L$(TOOLCHAIN_DIR)/usr/lib -L$(TOOLCHAIN_DIR)/lib + TARGET_PATH:=$(TOOLCHAIN_DIR)/bin:$(TARGET_PATH) + else + ifeq ($(CONFIG_NATIVE_TOOLCHAIN),) + TARGET_CROSS:=$(call qstrip,$(CONFIG_TOOLCHAIN_PREFIX)) + TOOLCHAIN_ROOT_DIR:=$(call qstrip,$(CONFIG_TOOLCHAIN_ROOT)) + TOOLCHAIN_BIN_DIRS:=$(patsubst ./%,$(TOOLCHAIN_ROOT_DIR)/%,$(call qstrip,$(CONFIG_TOOLCHAIN_BIN_PATH))) + TOOLCHAIN_INC_DIRS:=$(patsubst ./%,$(TOOLCHAIN_ROOT_DIR)/%,$(call qstrip,$(CONFIG_TOOLCHAIN_INC_PATH))) + TOOLCHAIN_LIB_DIRS:=$(patsubst ./%,$(TOOLCHAIN_ROOT_DIR)/%,$(call qstrip,$(CONFIG_TOOLCHAIN_LIB_PATH))) + ifneq ($(TOOLCHAIN_BIN_DIRS),) + TARGET_PATH:=$(subst $(space),:,$(TOOLCHAIN_BIN_DIRS)):$(TARGET_PATH) + endif + ifneq ($(TOOLCHAIN_INC_DIRS),) + TARGET_CPPFLAGS+= $(patsubst %,-I%,$(TOOLCHAIN_INC_DIRS)) + endif + ifneq ($(TOOLCHAIN_LIB_DIRS),) + TARGET_LDFLAGS+= $(patsubst %,-L%,$(TOOLCHAIN_LIB_DIRS)) + endif + TARGET_PATH:=$(TOOLCHAIN_DIR)/bin:$(TARGET_PATH) + endif + endif +endif +TARGET_PATH_PKG:=$(STAGING_DIR)/host/bin:$(STAGING_DIR_HOSTPKG)/bin:$(TARGET_PATH) + +ifeq ($(CONFIG_SOFT_FLOAT),y) + SOFT_FLOAT_CONFIG_OPTION:=--with-float=soft + ifeq ($(CONFIG_arm),y) + TARGET_CFLAGS+= -mfloat-abi=soft + else + TARGET_CFLAGS+= -msoft-float + endif +else + SOFT_FLOAT_CONFIG_OPTION:= + ifeq ($(CONFIG_arm),y) + TARGET_CFLAGS+= -mfloat-abi=hard + endif +endif + +export PATH:=$(TARGET_PATH) +export STAGING_DIR STAGING_DIR_HOST STAGING_DIR_HOSTPKG +export SH_FUNC:=. $(INCLUDE_DIR)/shell.sh; + +PKG_CONFIG:=$(STAGING_DIR_HOST)/bin/pkg-config + +export PKG_CONFIG + +HOSTCC:=gcc +HOSTCXX:=g++ +HOST_CPPFLAGS:=-I$(STAGING_DIR_HOST)/include $(if $(IS_PACKAGE_BUILD),-I$(STAGING_DIR_HOSTPKG)/include -I$(STAGING_DIR)/host/include) +HOST_CFLAGS:=-O2 $(HOST_CPPFLAGS) +HOST_LDFLAGS:=-L$(STAGING_DIR_HOST)/lib $(if $(IS_PACKAGE_BUILD),-L$(STAGING_DIR_HOSTPKG)/lib -L$(STAGING_DIR)/host/lib) + +ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) + TARGET_AR:=$(TARGET_CROSS)gcc-ar + TARGET_RANLIB:=$(TARGET_CROSS)gcc-ranlib + TARGET_NM:=$(TARGET_CROSS)gcc-nm +else + TARGET_AR:=$(TARGET_CROSS)ar + TARGET_RANLIB:=$(TARGET_CROSS)ranlib + TARGET_NM:=$(TARGET_CROSS)nm +endif + +BUILD_KEY=$(TOPDIR)/key-build + +FAKEROOT:=$(STAGING_DIR_HOST)/bin/fakeroot + +TARGET_CC:=$(TARGET_CROSS)gcc +TARGET_CXX:=$(TARGET_CROSS)g++ +KPATCH:=$(SCRIPT_DIR)/patch-kernel.sh +SED:=$(STAGING_DIR_HOST)/bin/sed -i -e +ESED:=$(STAGING_DIR_HOST)/bin/sed -E -i -e +CP:=cp -fpR +LN:=ln -sf +XARGS:=xargs -r + +BASH:=bash +TAR:=tar +FIND:=find +PATCH:=patch +PYTHON:=python + +INSTALL_BIN:=install -m0755 +INSTALL_SUID:=install -m4755 +INSTALL_DIR:=install -d -m0755 +INSTALL_DATA:=install -m0644 +INSTALL_CONF:=install -m0600 + +TARGET_CC_NOCACHE:=$(TARGET_CC) +TARGET_CXX_NOCACHE:=$(TARGET_CXX) +HOSTCC_NOCACHE:=$(HOSTCC) +HOSTCXX_NOCACHE:=$(HOSTCXX) +export TARGET_CC_NOCACHE +export TARGET_CXX_NOCACHE +export HOSTCC_NOCACHE +export HOSTCXX_NOCACHE + +ifneq ($(CONFIG_CCACHE),) + TARGET_CC:= ccache_cc + TARGET_CXX:= ccache_cxx + HOSTCC:= ccache $(HOSTCC) + HOSTCXX:= ccache $(HOSTCXX) + export CCACHE_BASEDIR:=$(TOPDIR) + export CCACHE_DIR:=$(if $(call qstrip,$(CONFIG_CCACHE_DIR)),$(call qstrip,$(CONFIG_CCACHE_DIR)),$(TOPDIR)/.ccache) + export CCACHE_COMPILERCHECK:=%compiler% -dumpmachine; %compiler% -dumpversion +endif + +TARGET_CONFIGURE_OPTS = \ + AR="$(TARGET_AR)" \ + AS="$(TARGET_CC) -c $(TARGET_ASFLAGS)" \ + LD=$(TARGET_CROSS)ld \ + NM="$(TARGET_NM)" \ + CC="$(TARGET_CC)" \ + GCC="$(TARGET_CC)" \ + CXX="$(TARGET_CXX)" \ + RANLIB="$(TARGET_RANLIB)" \ + STRIP=$(TARGET_CROSS)strip \ + OBJCOPY=$(TARGET_CROSS)objcopy \ + OBJDUMP=$(TARGET_CROSS)objdump \ + SIZE=$(TARGET_CROSS)size + +# strip an entire directory +ifneq ($(CONFIG_NO_STRIP),) + RSTRIP:=: + STRIP:=: +else + ifneq ($(CONFIG_USE_STRIP),) + STRIP:=$(TARGET_CROSS)strip $(call qstrip,$(CONFIG_STRIP_ARGS)) + else + ifneq ($(CONFIG_USE_SSTRIP),) + STRIP:=$(STAGING_DIR_HOST)/bin/sstrip $(call qstrip,$(CONFIG_SSTRIP_ARGS)) + endif + endif + RSTRIP= \ + export CROSS="$(TARGET_CROSS)" \ + $(if $(PKG_BUILD_ID),KEEP_BUILD_ID=1) \ + $(if $(CONFIG_KERNEL_KALLSYMS),NO_RENAME=1) \ + $(if $(CONFIG_KERNEL_PROFILING),KEEP_SYMBOLS=1); \ + NM="$(TARGET_CROSS)nm" \ + STRIP="$(STRIP)" \ + STRIP_KMOD="$(SCRIPT_DIR)/strip-kmod.sh" \ + PATCHELF="$(STAGING_DIR_HOST)/bin/patchelf" \ + $(SCRIPT_DIR)/rstrip.sh +endif + +ifeq ($(CONFIG_IPV6),y) + DISABLE_IPV6:= +else + DISABLE_IPV6:=--disable-ipv6 +endif + +TAR_OPTIONS:=-xf - + +ifeq ($(CONFIG_BUILD_LOG),y) + BUILD_LOG:=1 +endif + +export BISON_PKGDATADIR:=$(STAGING_DIR_HOST)/share/bison +export M4:=$(STAGING_DIR_HOST)/bin/m4 + +define shvar +V_$(subst .,_,$(subst -,_,$(subst /,_,$(1)))) +endef + +define shexport +export $(call shvar,$(1))=$$(call $(1)) +endef + +# Execute commands under flock +# $(1) => The shell expression. +# $(2) => The lock name. If not given, the global lock will be used. +ifneq ($(wildcard $(STAGING_DIR_HOST)/bin/flock),) + define locked + SHELL= \ + flock \ + $(TMP_DIR)/.$(if $(2),$(strip $(2)),global).flock \ + -c '$(subst ','\'',$(1))' + endef +else + locked=$(1) +endif + +# Recursively copy paths into another directory, purge dangling +# symlinks before. +# $(1) => File glob expression +# $(2) => Destination directory +define file_copy + for src_dir in $(sort $(foreach d,$(wildcard $(1)),$(dir $(d)))); do \ + ( cd $$src_dir; find -type f -or -type d ) | \ + ( cd $(2); while :; do \ + read FILE; \ + [ -z "$$FILE" ] && break; \ + [ -L "$$FILE" ] || continue; \ + echo "Removing symlink $(2)/$$FILE"; \ + rm -f "$$FILE"; \ + done; ); \ + done; \ + $(CP) $(1) $(2) +endef + +# Calculate sha256sum of any plain file within a given directory +# $(1) => Input directory +# $(2) => If set, recurse into subdirectories +define sha256sums + (cd $(1); find . $(if $(2),,-maxdepth 1) -type f -not -name 'sha256sums' -printf "%P\n" | sort | \ + xargs -r $(STAGING_DIR_HOST)/bin/mkhash -n sha256 | sed -ne 's!^\(.*\) \(.*\)$$!\1 *\2!p' > sha256sums) +endef + +# file extension +ext=$(word $(words $(subst ., ,$(1))),$(subst ., ,$(1))) + +all: +FORCE: ; +.PHONY: FORCE + +check: FORCE + @true + +val.%: + @$(if $(filter undefined,$(origin $*)),\ + echo "$* undefined" >&2, \ + echo '$(subst ','"'"',$($*))' \ + ) + +var.%: + @$(if $(filter undefined,$(origin $*)),\ + echo "$* undefined" >&2, \ + echo "$*='"'$(subst ','"'\"'\"'"',$($*))'"'" \ + ) + +endif #__rules_inc diff --git a/root/target/linux/ipq40xx/base-files/etc/board.d/01_leds b/root/target/linux/ipq40xx/base-files/etc/board.d/01_leds deleted file mode 100755 index 90aef777..00000000 --- a/root/target/linux/ipq40xx/base-files/etc/board.d/01_leds +++ /dev/null @@ -1,81 +0,0 @@ -# -# Copyright (C) 2015 OpenWrt.org -# - -. /lib/functions/uci-defaults.sh - -board_config_update - -board=$(board_name) - -case "$board" in -alfa-network,ap120c-ac) - ucidef_set_led_netdev "wan" "WAN" "amber:wan" "eth1" - ;; -asus,rt-ac58u) - ucidef_set_led_netdev "wan" "WAN" "blue:wan" "eth1" - ucidef_set_led_switch "lan" "LAN" "blue:lan" "switch0" "0x1e" - ;; -avm,fritzbox-4040) - ucidef_set_led_wlan "wlan" "WLAN" "green:wlan" "phy0tpt" "phy1tpt" - ucidef_set_led_netdev "wan" "WAN" "green:wan" "eth1" - ucidef_set_led_switch "lan" "LAN" "green:lan" "switch0" "0x1e" - ;; -avm,fritzbox-7530 |\ -glinet,gl-b1300) - ucidef_set_led_wlan "wlan" "WLAN" "green:wlan" "phy0tpt" - ;; -edgecore,oap100) - ucidef_set_led_wlan "wlan2g" "WLAN2G" "blue:wlan2g" "phy0tpt" - ucidef_set_led_wlan "wlan5g" "WLAN5G" "blue:wlan5g" "phy1tpt" - ;; -engenius,eap1300) - ucidef_set_led_netdev "lan" "LAN" "blue:lan" "eth0" - ucidef_set_led_wlan "wlan2g" "WLAN2G" "blue:wlan2g" "phy0tpt" - ucidef_set_led_wlan "wlan5g" "WLAN5G" "yellow:wlan5g" "phy1tpt" - ucidef_set_led_default "mesh" "MESH" "blue:mesh" "0" - ;; -engenius,eap2200) - ucidef_set_led_netdev "lan1" "LAN1" "blue:lan1" "eth0" - ucidef_set_led_netdev "lan2" "LAN2" "blue:lan2" "eth1" - ;; -engenius,ens620ext) - ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wlan2g" "phy0tpt" - ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wlan5g" "phy1tpt" - ucidef_set_led_netdev "lan1" "LAN1" "green:lan1" "eth0" - ucidef_set_led_netdev "lan2" "LAN2" "green:lan2" "eth1" - ;; -mobipromo,cm520-79f) - ucidef_set_led_netdev "wan" "WAN" "blue:wan" "eth1" - ucidef_set_led_switch "lan1" "LAN1" "blue:lan1" "switch0" "0x10" - ucidef_set_led_switch "lan2" "LAN2" "blue:lan2" "switch0" "0x08" - ;; -pangu,l1000) - ucidef_set_led_default "power" "POWER" "blue:power" "1" - ucidef_set_led_wlan "wlan2g" "WLAN2G" "blue:wlan2g" "phy0tpt" - ucidef_set_led_wlan "wlan5g" "WLAN5G" "blue:wlan5g" "phy1tpt" - ucidef_set_led_netdev "wan" "WAN" "blue:wan" "eth1" - ucidef_set_led_netdev "4g1" "4g1" "blue:4g1" "4g1" - ucidef_set_led_netdev "4g2" "4g2" "blue:4g2" "4g2" - ucidef_set_led_netdev "4g3" "4g3" "blue:4g3" "4g3" - ;; -netgear,ex6100v2 |\ -netgear,ex6150v2) - ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:router" "phy0tpt" - ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:client" "phy1tpt" - ;; -qxwlan,e2600ac-c1 |\ -qxwlan,e2600ac-c2) - ucidef_set_led_wlan "wlan2g" "WLAN0" "green:wlan0" "phy0tpt" - ucidef_set_led_wlan "wlan5g" "WLAN1" "green:wlan1" "phy1tpt" - ;; -zyxel,nbg6617 |\ -zyxel,wre6606) - ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wlan2g" "phy0tpt" - ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wlan5g" "phy1tpt" - ;; -esac - -board_config_flush - -exit 0 \ No newline at end of file diff --git a/root/target/linux/ipq40xx/base-files/etc/board.d/02_network b/root/target/linux/ipq40xx/base-files/etc/board.d/02_network index 6be4f23d..0ac8b59a 100755 --- a/root/target/linux/ipq40xx/base-files/etc/board.d/02_network +++ b/root/target/linux/ipq40xx/base-files/etc/board.d/02_network @@ -1,3 +1,4 @@ +#!/bin/sh # # Copyright (c) 2015 The Linux Foundation. All rights reserved. # Copyright (c) 2011-2015 OpenWrt.org @@ -15,10 +16,7 @@ ipq40xx_setup_interfaces() 8dev,jalapeno|\ alfa-network,ap120c-ac|\ engenius,emr3500|\ - engenius,ens620ext|\ - luma,wrtq-329acn|\ - plasmacloud,pa1200|\ - plasmacloud,pa2200) + engenius,ens620ext) ucidef_set_interfaces_lan_wan "eth0" "eth1" ;; aruba,ap-303|\ @@ -40,13 +38,13 @@ ipq40xx_setup_interfaces() ;; asus,map-ac2200|\ cilab,meshpoint-one|\ - edgecore,ecw5211|\ - edgecore,oap100|\ openmesh,a42|\ openmesh,a62) ucidef_set_interfaces_lan_wan "eth1" "eth0" ;; asus,rt-ac58u|\ + p2w,r619ac-128m|\ + p2w,r619ac|\ zyxel,nbg6617) ucidef_set_interfaces_lan_wan "eth0" "eth1" ucidef_add_switch "switch0" \ @@ -54,9 +52,7 @@ ipq40xx_setup_interfaces() ;; avm,fritzbox-4040|\ linksys,ea6350v3|\ - pangu,l1000|\ - linksys,ea8300|\ - linksys,mr8300) + linksys,ea8300) ucidef_set_interfaces_lan_wan "eth0" "eth1" ucidef_add_switch "switch0" \ "0u@eth0" "1:lan" "2:lan" "3:lan" "4:lan" @@ -65,10 +61,7 @@ ipq40xx_setup_interfaces() ucidef_add_switch "switch0" \ "0u@eth0" "1:lan" "2:lan" "3:lan" "4:lan" ;; - avm,fritzrepeater-3000) - ucidef_add_switch "switch0" \ - "0u@eth0" "4:lan:1" "5:lan:2" - ;; + avm,fritzrepeater-3000|\ compex,wpj419|\ compex,wpj428|\ engenius,eap2200) @@ -84,15 +77,11 @@ ipq40xx_setup_interfaces() ucidef_add_switch "switch0" \ "0u@eth0" "3:lan" "4:lan" ;; - devolo,magic-2-wifi-next) - ucidef_set_interface_lan "eth0 eth1 eth2" - ;; ezviz,cs-w3-wd1200g-eup) ucidef_set_interfaces_lan_wan "eth0" "eth1" ucidef_add_switch "switch0" \ "0u@eth0" "2:lan:3" "3:lan:2" "4:lan:1" "0u@eth1" "5:wan" ;; - glinet,gl-ap1300 |\ glinet,gl-b1300 |\ glinet,gl-s1300) ucidef_set_interfaces_lan_wan "eth0" "eth1" @@ -132,7 +121,9 @@ ipq40xx_setup_macs() 8dev,habanero-dvk) label_mac=$(mtd_get_mac_binary "ART" 0x1006) ;; - asus,rt-ac58u) + asus,rt-ac58u|\ + p2w,r619ac-128m|\ + p2w,r619ac) CI_UBIPART=UBI_DEV wan_mac=$(mtd_get_mac_binary_ubi Factory 0x1006) lan_mac=$(mtd_get_mac_binary_ubi Factory 0x5006) @@ -141,10 +132,6 @@ ipq40xx_setup_macs() cilab,meshpoint-one) label_mac=$(mtd_get_mac_binary "ART" 0x1006) ;; - devolo,magic-2-wifi-next) - lan_mac=$(mtd_get_mac_ascii APPSBLENV MacAddress0) - label_mac=$lan_mac - ;; dlink,dap-2610) lan_mac=$(mtd_get_mac_ascii bdcfg lanmac) label_mac=$lan_mac @@ -183,4 +170,4 @@ ipq40xx_setup_interfaces $board ipq40xx_setup_macs $board board_config_flush -exit 0 \ No newline at end of file +exit 0 diff --git a/root/target/linux/ipq40xx/base-files/etc/board.d/03_gpio_switches b/root/target/linux/ipq40xx/base-files/etc/board.d/03_gpio_switches deleted file mode 100755 index a15f60b8..00000000 --- a/root/target/linux/ipq40xx/base-files/etc/board.d/03_gpio_switches +++ /dev/null @@ -1,24 +0,0 @@ -. /lib/functions/uci-defaults.sh - -board_config_update - -board=$(board_name) - -case "$board" in -cellc,rtl30vw) - ucidef_add_gpio_switch "w_disable" "W_DISABLE mPCIE pin" "398" "1" - ucidef_add_gpio_switch "pmd_resin_n" "PMD_RESIN_N pin" "399" "1" - ucidef_add_gpio_switch "mcpie_vcc" "LTE power" "400" "0" - ucidef_add_gpio_switch "usb_vcc" "USB power" "401" "0" - ;; -cilab,meshpoint-one) - ucidef_add_gpio_switch "poe_passtrough" "POE passtrough enable" "413" "1" - ;; -compex,wpj428) - ucidef_add_gpio_switch "sim_card_select" "SIM card select" "3" "0" - ;; -esac - -board_config_flush - -exit 0 \ No newline at end of file diff --git a/root/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/root/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata old mode 100755 new mode 100644 index f48e7719..4b69c79f --- a/root/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +++ b/root/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata @@ -36,12 +36,10 @@ case "$FIRMWARE" in ath10k_patch_mac $(mtd_get_mac_binary ORGDATA 0x32) ;; engenius,eap2200 |\ - openmesh,a62 |\ - plasmacloud,pa2200) + openmesh,a62) caldata_extract "0:ART" 0x9000 0x2f20 ;; - linksys,ea8300 |\ - linksys,mr8300) + linksys,ea8300) caldata_extract "ART" 0x9000 0x2f20 # OEM assigns 4 sequential MACs ath10k_patch_mac $(macaddr_setbit_la $(macaddr_add "$(cat /sys/class/net/eth0/address)" 4)) @@ -55,11 +53,12 @@ case "$FIRMWARE" in alfa-network,ap120c-ac |\ cilab,meshpoint-one |\ ezviz,cs-w3-wd1200g-eup |\ - glinet,gl-ap1300 |\ glinet,gl-b1300 |\ glinet,gl-s1300 |\ linksys,ea6350v3 |\ mobipromo,cm520-79f |\ + p2w,r619ac-128m |\ + p2w,r619ac |\ qcom,ap-dk01.1-c1) caldata_extract "ART" 0x1000 0x2f20 ;; @@ -96,24 +95,15 @@ case "$FIRMWARE" in cellc,rtl30vw |\ compex,wpj419 |\ compex,wpj428 |\ - edgecore,ecw5211 |\ - edgecore,oap100 |\ engenius,eap1300 |\ engenius,eap2200 |\ - luma,wrtq-329acn|\ openmesh,a42 |\ openmesh,a62 |\ - plasmacloud,pa1200 |\ - plasmacloud,pa2200 |\ qxwlan,e2600ac-c1 |\ qxwlan,e2600ac-c2 |\ unielec,u4019-32m) caldata_extract "0:ART" 0x1000 0x2f20 ;; - devolo,magic-2-wifi-next) - caldata_extract "ART" 0x1000 0x2f20 - ath10k_patch_mac $(mtd_get_mac_ascii APPSBLENV WiFiMacAddress0) - ;; dlink,dap-2610) caldata_extract "ART" 0x1000 0x2f20 ath10k_patch_mac $(mtd_get_mac_ascii bdcfg wlanmac) @@ -130,12 +120,7 @@ case "$FIRMWARE" in caldata_extract "ART" 0x1000 0x2f20 ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii u-boot-env ethaddr) +2) ;; - linksys,ea8300 |\ - linksys,mr8300) - caldata_extract "ART" 0x1000 0x2f20 - ath10k_patch_mac $(macaddr_add "$(cat /sys/class/net/eth0/address)" 2) - ;; - pangu,l1000) + linksys,ea8300) caldata_extract "ART" 0x1000 0x2f20 ath10k_patch_mac $(macaddr_add "$(cat /sys/class/net/eth0/address)" 2) ;; @@ -163,11 +148,12 @@ case "$FIRMWARE" in alfa-network,ap120c-ac |\ cilab,meshpoint-one |\ ezviz,cs-w3-wd1200g-eup |\ - glinet,gl-ap1300 |\ glinet,gl-b1300 |\ glinet,gl-s1300 |\ linksys,ea6350v3 |\ mobipromo,cm520-79f |\ + p2w,r619ac-128m |\ + p2w,r619ac |\ qcom,ap-dk01.1-c1) caldata_extract "ART" 0x5000 0x2f20 ;; @@ -204,24 +190,15 @@ case "$FIRMWARE" in cellc,rtl30vw |\ compex,wpj419 |\ compex,wpj428 |\ - edgecore,ecw5211 |\ - edgecore,oap100 |\ engenius,eap1300 |\ engenius,eap2200 |\ - luma,wrtq-329acn|\ openmesh,a42 |\ openmesh,a62 |\ - plasmacloud,pa1200 |\ - plasmacloud,pa2200 |\ qxwlan,e2600ac-c1 |\ qxwlan,e2600ac-c2 |\ unielec,u4019-32m) caldata_extract "0:ART" 0x5000 0x2f20 ;; - devolo,magic-2-wifi-next) - caldata_extract "ART" 0x5000 0x2f20 - ath10k_patch_mac $(mtd_get_mac_ascii APPSBLENV WiFiMacAddress1) - ;; dlink,dap-2610) caldata_extract "ART" 0x5000 0x2f20 ath10k_patch_mac $(mtd_get_mac_ascii bdcfg wlanmac_a) @@ -238,12 +215,7 @@ case "$FIRMWARE" in caldata_extract "ART" 0x5000 0x2f20 ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii u-boot-env ethaddr) +3) ;; - linksys,ea8300 |\ - linksys,mr8300) - caldata_extract "ART" 0x5000 0x2f20 - ath10k_patch_mac $(macaddr_add "$(cat /sys/class/net/eth0/address)" 3) - ;; - pangu,l1000) + linksys,ea8300) caldata_extract "ART" 0x5000 0x2f20 ath10k_patch_mac $(macaddr_add "$(cat /sys/class/net/eth0/address)" 3) ;; @@ -267,4 +239,4 @@ case "$FIRMWARE" in *) exit 1 ;; -esac \ No newline at end of file +esac diff --git a/root/target/linux/ipq40xx/base-files/etc/init.d/adjust_network b/root/target/linux/ipq40xx/base-files/etc/init.d/adjust_network deleted file mode 100755 index 6089259e..00000000 --- a/root/target/linux/ipq40xx/base-files/etc/init.d/adjust_network +++ /dev/null @@ -1,205 +0,0 @@ -#!/bin/sh /etc/rc.common -# Copyright (C) 2006-2011 OpenWrt.org - -START=99 -STOP=98 - -rps_flow_cnt=4096 -core_count=$(grep -c processor /proc/cpuinfo) -rps_sock_flow_ent=`expr $core_count \* $rps_flow_cnt` -queue_cores="0 1 2" -queue_irq_cores="1 2" -wifi_core="3" -usb_core="0" - -############### util functions ############### - -to_hex_list() { - local cores=$1 - local converted="" - for core in $(echo $cores | awk '{print}') - do - local hex="$(gen_hex_mask "$core")" - converted="$converted $hex" - done - echo `echo $converted | sed 's/^ *//'` -} - -gen_hex_mask() { - local cores=$1 - local mask=0 - for core in $(echo $cores | awk '{print}') - do - local bit="$((1 << $core))" - let "mask = mask + bit" - done - local hex="$(printf %x "$mask")" - echo "$hex" -} - -val_at_index() { - local values=$1 - local idx=$2 - echo `echo $values | awk -v i=$idx '{print $i}'` -} - -size_of_list() { - local list=$1 - local spaces=`echo $list | grep -o ' ' | wc -l` - echo `expr $spaces + 1` -} - -set_core_mask() { - local file=$1 - local cores=$2 - local mask="$(gen_hex_mask "$cores")" - echo $mask > $file -} - -set_core_mask_round() { - local files=$1 - local cores=$2 - local step_size=$3 - [ ! -n "$3" ] && step_size=1 - - local core_count="$(size_of_list "$cores")" - local counter=0 - local idx=1 - local roof=`expr $core_count \* $step_size` - for file in $(echo $files | awk '{print}') - do - let "idx = counter / step_size + 1" - local core="$(val_at_index "$cores" $idx)" - set_core_mask $file $core - let "counter = counter + 1" - [ $counter -ge $roof ] && counter=0 - done -} - -############### assign network queues ############### - -set_interface_round() { - local interface=$1 - local cores=$2 - local step_size=$3 - [ ! -n "$3" ] && step_size=1 - - echo "using round mask for interface: $interface, step size: $step_size" - set_core_mask_round "$(ls /sys/class/net/$interface/queues/tx-*/xps_cpus)" "$cores" $step_size - set_core_mask_round "$(ls /sys/class/net/$interface/queues/rx-*/rps_cpus)" "$cores" $step_size - - for file in /sys/class/net/$interface/queues/rx-[0-9]*/rps_flow_cnt - do - echo $rps_flow_cnt > $file - done -} - -set_interface() { - local interface=$1 - local cores=$2 - - echo "using cores: $cores for interface: $interface" - - for file in /sys/class/net/$interface/queues/rx-[0-9]*/rps_cpus - do - set_core_mask $file "$cores" - echo $rps_flow_cnt > `dirname $file`/rps_flow_cnt - done - - for file in /sys/class/net/$interface/queues/tx-[0-9]*/xps_cpus - do - set_core_mask $file "$cores" - done -} - -set_interface_queues() { - echo "using cpu: $queue_cores for network queues" - for dev in /sys/class/net/eth* - do - [ -d "$dev" ] || continue - - local interface=`basename $dev` - - set_interface $interface "$queue_cores" - done - - for dev in /sys/class/net/wlan* - do - [ -d "$dev" ] || continue - - local interface=`basename $dev` - - set_interface $interface "$queue_cores" - done - - for dev in /sys/class/net/eth* - do - local eth=`basename $dev` - echo "enabling offload on $eth" - ethtool -K $eth rx-checksum on >/dev/null 2>&1 - ethtool -K $eth tx-checksum-ip-generic on >/dev/null 2>&1 || ( - ethtool -K $eth tx-checksum-ipv4 on >/dev/null 2>&1 - ethtool -K $eth tx-checksum-ipv6 on >/dev/null 2>&1) - ethtool -K $eth tx-scatter-gather on >/dev/null 2>&1 - ethtool -K $eth gso on >/dev/null 2>&1 - ethtool -K $eth gro on >/dev/null 2>&1 - ethtool -K $eth lro on >/dev/null 2>&1 - ethtool -K $eth tso on >/dev/null 2>&1 - ethtool -K $eth ufo on >/dev/null 2>&1 - done - - echo $rps_sock_flow_ent > /proc/sys/net/core/rps_sock_flow_entries - sysctl -w net.core.rps_sock_flow_entries=$rps_sock_flow_ent -} - -############### assign interrupts ############### -set_irq_cores() { - local mask="$(gen_hex_mask "$2")" - echo "set mask $mask for irq: $1" - echo $mask > "/proc/irq/$1/smp_affinity" -} - -set_irq_pattern() { - local name_pattern="$1" - local cores="$2" - - for irq in `grep "$name_pattern" /proc/interrupts | cut -d: -f1 | sed 's, *,,'` - do - set_irq_cores $irq "$cores" - done -} - -set_irq_interleave() { - local name_pattern=$1 - local cores=$2 - local step_size=$3 - - local files="" - for irq in `grep "$name_pattern" /proc/interrupts | cut -d: -f1 | sed 's, *,,'` - do - files="$files\ - /proc/irq/$irq/smp_affinity" - done - - set_core_mask_round "$files" "$cores" "$step_size" -} - -set_irqs() { - #dma - set_irq_pattern bam_dma "$usb_core" - - #ethernet - set_irq_interleave eth_tx "$queue_irq_cores" 4 - set_irq_interleave eth_rx "$queue_irq_cores" 1 - - #pcie - set_irq_pattern pcie "$wifi_core" - - #usb - set_irq_pattern usb "$usb_core" -} - -start() { - set_interface_queues - set_irqs -} \ No newline at end of file diff --git a/root/target/linux/ipq40xx/base-files/lib/adjust_network.sh b/root/target/linux/ipq40xx/base-files/lib/adjust_network.sh deleted file mode 100755 index fb39463e..00000000 --- a/root/target/linux/ipq40xx/base-files/lib/adjust_network.sh +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/sh -# this scripts is used for adjust cpu's choice of interrupts. -# - -################################################ -# Adjust smp_affinity of edma -# Globals: -# None -# Arguments: -# None -# Returns: -# None -# Remark: -# execute only once on start-up. -################################################ -adjust_edma_smp_affinity() { - grep -q edma_eth_ /proc/interrupts || return 0 - local nr=`cat /proc/cpuinfo | grep processor | wc -l` - local cpu=0 - local tx_irq_num - - for tx_num in `seq 0 1 15` ; do - cpu=`printf "%x" $((1<<((tx_num/4+3)%nr)))` - tx_irq_num=`grep -m1 edma_eth_tx$tx_num /proc/interrupts | cut -d ':' -f 1 | tail -n1 | tr -d ' '` - [ -n "$tx_irq_num" ] && echo $cpu > /proc/irq/$tx_irq_num/smp_affinity - done - - for rx_num in `seq 0 1 7` ; do - cpu=`printf "%x" $((1<<((rx_num/2)%nr)))` - rx_irq_num=`grep -m1 edma_eth_rx$rx_num /proc/interrupts | cut -d ':' -f 1 | tail -n1 | tr -d ' '` - [ -n "$rx_irq_num" ] && echo $cpu > /proc/irq/$rx_irq_num/smp_affinity - done -} - -################################################ -# Adjust smp_affinity of ath10k for 2G and 5G -# Globals: -# None -# Arguments: -# None -# Returns: -# None -# Remark: -# execute only once on start-up. -################################################ -adjust_radio_smp_affinity() { - local irqs="`grep -E 'ath10k' /proc/interrupts | cut -d ':' -f 1 | tr -d ' '`" - local nr=`cat /proc/cpuinfo | grep processor | wc -l` - local idx=2 - - for irq in $irqs; do - cpu=`printf "%x" $((1<<((idx)%nr)))` - echo $cpu > /proc/irq/$irq/smp_affinity - idx=$((idx+1)) - done -} - -################################################ -# Adjust queue of eth -# Globals: -# None -# Arguments: -# None -# Returns: -# None -# Remark: -# Each network reboot needs to be executed. -################################################ -adjust_eth_queue() { - local nr=`cat /proc/cpuinfo | grep processor | wc -l` - local cpu=`printf "%x" $(((1< $exps - echo 256 > `dirname $exps`/rps_flow_cnt - done - which ethtool >/dev/null 2>&1 && ethtool -K $eth gro off - done - - echo 1024 > /proc/sys/net/core/rps_sock_flow_entries -} \ No newline at end of file diff --git a/root/target/linux/ipq40xx/base-files/lib/upgrade/linksys.sh b/root/target/linux/ipq40xx/base-files/lib/upgrade/linksys.sh deleted file mode 100755 index de09d34a..00000000 --- a/root/target/linux/ipq40xx/base-files/lib/upgrade/linksys.sh +++ /dev/null @@ -1,122 +0,0 @@ -linksys_get_target_firmware() { - local cur_boot_part mtd_ubi0 - - cur_boot_part="$(/usr/sbin/fw_printenv -n boot_part)" - if [ -z "${cur_boot_part}" ]; then - mtd_ubi0=$(cat /sys/devices/virtual/ubi/ubi0/mtd_num) - case "$(grep -E "^mtd${mtd_ubi0}:" /proc/mtd | cut -d '"' -f 2)" in - kernel|rootfs) - cur_boot_part=1 - ;; - alt_kernel|alt_rootfs) - cur_boot_part=2 - ;; - esac - >&2 printf "Current boot_part='%s' selected from ubi0/mtd_num='%s'" \ - "${cur_boot_part}" "${mtd_ubi0}" - fi - - # OEM U-Boot for EA6350v3, EA8300 and MR8300; bootcmd= - # if test $auto_recovery = no; - # then bootipq; - # elif test $boot_part = 1; - # then run bootpart1; - # else run bootpart2; - # fi - - case "$cur_boot_part" in - 1) - fw_setenv -s - <<-EOF - boot_part 2 - auto_recovery yes - EOF - printf "alt_kernel" - return - ;; - 2) - fw_setenv -s - <<-EOF - boot_part 1 - auto_recovery yes - EOF - printf "kernel" - return - ;; - *) - return - ;; - esac -} - -linksys_get_root_magic() { - (get_image "$@" | dd skip=786432 bs=4 count=1 | hexdump -v -n 4 -e '1/1 "%02x"') 2>/dev/null -} - -platform_do_upgrade_linksys() { - local magic_long="$(get_magic_long "$1")" - - local rm_oem_fw_vols="squashfs ubifs" # from OEM [alt_]rootfs UBI - local vol - - mkdir -p /var/lock - local part_label="$(linksys_get_target_firmware)" - touch /var/lock/fw_printenv.lock - - if [ -z "$part_label" ]; then - echo "cannot find target partition" - exit 1 - fi - - local target_mtd=$(find_mtd_part "$part_label") - - [ "$magic_long" = "73797375" ] && { - CI_KERNPART="$part_label" - if [ "$part_label" = "kernel" ]; then - CI_UBIPART="rootfs" - else - CI_UBIPART="alt_rootfs" - fi - - local mtdnum="$(find_mtd_index "$CI_UBIPART")" - if [ ! "$mtdnum" ]; then - echo "cannot find ubi mtd partition $CI_UBIPART" - return 1 - fi - - local ubidev="$(nand_find_ubi "$CI_UBIPART")" - if [ ! "$ubidev" ]; then - ubiattach -m "$mtdnum" - sync - ubidev="$(nand_find_ubi "$CI_UBIPART")" - fi - - if [ "$ubidev" ]; then - for vol in $rm_oem_fw_vols; do - ubirmvol "/dev/$ubidev" -N "$vol" 2>/dev/null - done - fi - - # complete std upgrade - nand_upgrade_tar "$1" - } - - [ "$magic_long" = "27051956" ] && { - # This magic is for a uImage (which is a sysupgrade image) - # check firmwares' rootfs types - local oldroot="$(linksys_get_root_magic "$target_mtd")" - local newroot="$(linksys_get_root_magic "$1")" - - if [ "$newroot" = "55424923" ] && [ "$oldroot" = "55424923" ]; then - # we're upgrading from a firmware with UBI to one with UBI - # erase everything to be safe - # - Is that really needed? Won't remove (or comment) the if, - # because it may be needed in a future device. - #mtd erase $part_label - #get_image "$1" | mtd -n write - $part_label - echo "writing \"$1\" UBI image to \"$part_label\" (UBI)..." - get_image "$1" | mtd write - "$part_label" - else - echo "writing \"$1\" image to \"$part_label\"" - get_image "$1" | mtd write - "$part_label" - fi - } -} diff --git a/root/target/linux/ipq40xx/base-files/lib/upgrade/openmesh.sh b/root/target/linux/ipq40xx/base-files/lib/upgrade/openmesh.sh deleted file mode 100755 index 8e02186e..00000000 --- a/root/target/linux/ipq40xx/base-files/lib/upgrade/openmesh.sh +++ /dev/null @@ -1,106 +0,0 @@ -# The U-Boot loader of the OpenMesh devices requires image sizes and -# checksums to be provided in the U-Boot environment. -# The OpenMesh devices come with 2 main partitions - while one is active -# sysupgrade will flash the other. The boot order is changed to boot the -# newly flashed partition. If the new partition can't be booted due to -# upgrade failures the previously used partition is loaded. - -platform_do_upgrade_openmesh() { - local tar_file="$1" - local restore_backup - local primary_kernel_mtd - - local setenv_script="/tmp/fw_env_upgrade" - - local kernel_mtd="$(find_mtd_index $PART_NAME)" - local kernel_offset="$(cat /sys/class/mtd/mtd${kernel_mtd}/offset)" - local total_size="$(cat /sys/class/mtd/mtd${kernel_mtd}/size)" - - # detect to which flash region the new image is written to. - # - # 1. check what is the mtd index for the first flash region on this - # device - # 2. check if the target partition ("inactive") has the mtd index of - # the first flash region - # - # - when it is: the new bootseq will be 1,2 and the first region is - # modified - # - when it isnt: bootseq will be 2,1 and the second region is - # modified - # - # The detection has to be done via the hardcoded mtd partition because - # the current boot might be done with the fallback region. Let us - # assume that the current bootseq is 1,2. The bootloader detected that - # the image in flash region 1 is corrupt and thus switches to flash - # region 2. The bootseq in the u-boot-env is now still the same and - # the sysupgrade code can now only rely on the actual mtd indexes and - # not the bootseq variable to detect the currently booted flash - # region/image. - # - # In the above example, an implementation which uses bootseq ("1,2") to - # detect the currently booted image would assume that region 1 is booted - # and then overwrite the variables for the wrong flash region (aka the - # one which isn't modified). This could result in a device which doesn't - # boot anymore to Linux until it was reflashed with ap51-flash. - local next_boot_part="1" - case "$(board_name)" in - openmesh,a42) - primary_kernel_mtd=8 - ;; - openmesh,a62) - primary_kernel_mtd=10 - ;; - *) - echo "failed to detect primary kernel mtd partition for board" - return 1 - ;; - esac - [ "$kernel_mtd" = "$primary_kernel_mtd" ] || next_boot_part="2" - - local board_dir=$(tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$') - board_dir=${board_dir%/} - - local kernel_length=$(tar xf $tar_file ${board_dir}/kernel -O | wc -c) - local rootfs_length=$(tar xf $tar_file ${board_dir}/root -O | wc -c) - # rootfs without EOF marker - rootfs_length=$((rootfs_length-4)) - - local kernel_md5=$(tar xf $tar_file ${board_dir}/kernel -O | md5sum); kernel_md5="${kernel_md5%% *}" - # md5 checksum of rootfs with EOF marker - local rootfs_md5=$(tar xf $tar_file ${board_dir}/root -O | dd bs=1 count=$rootfs_length | md5sum); rootfs_md5="${rootfs_md5%% *}" - - # - # add tar support to get_image() to use default_do_upgrade() instead? - # - - # take care of restoring a saved config - [ -n "$UPGRADE_BACKUP" ] && restore_backup="${MTD_CONFIG_ARGS} -j ${UPGRADE_BACKUP}" - - mtd -q erase inactive - tar xf $tar_file ${board_dir}/root -O | mtd -n -p $kernel_length $restore_backup write - $PART_NAME - tar xf $tar_file ${board_dir}/kernel -O | mtd -n write - $PART_NAME - - # prepare new u-boot env - if [ "$next_boot_part" = "1" ]; then - echo "bootseq 1,2" > $setenv_script - else - echo "bootseq 2,1" > $setenv_script - fi - - printf "kernel_size_%i 0x%08x\n" $next_boot_part $kernel_length >> $setenv_script - printf "vmlinux_start_addr 0x%08x\n" ${kernel_offset} >> $setenv_script - printf "vmlinux_size 0x%08x\n" ${kernel_length} >> $setenv_script - printf "vmlinux_checksum %s\n" ${kernel_md5} >> $setenv_script - - printf "rootfs_size_%i 0x%08x\n" $next_boot_part $((total_size-kernel_length)) >> $setenv_script - printf "rootfs_start_addr 0x%08x\n" $((kernel_offset+kernel_length)) >> $setenv_script - printf "rootfs_size 0x%08x\n" ${rootfs_length} >> $setenv_script - printf "rootfs_checksum %s\n" ${rootfs_md5} >> $setenv_script - - # store u-boot env changes - mkdir -p /var/lock - fw_setenv -s $setenv_script || { - echo "failed to update U-Boot environment" - return 1 - } -} diff --git a/root/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh b/root/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh old mode 100755 new mode 100644 index 396bc5d9..f874aa4b --- a/root/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh +++ b/root/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh @@ -59,7 +59,6 @@ platform_do_upgrade() { case "$(board_name)" in 8dev,jalapeno |\ aruba,ap-303 |\ - pangu,l1000 |\ aruba,ap-303h |\ aruba,ap-365 |\ avm,fritzbox-7530 |\ @@ -67,14 +66,8 @@ platform_do_upgrade() { avm,fritzrepeater-3000 |\ buffalo,wtr-m2133hp |\ cilab,meshpoint-one |\ - edgecore,ecw5211 |\ - edgecore,oap100 |\ engenius,eap2200 |\ - glinet,gl-ap1300 |\ - luma,wrtq-329acn |\ mobipromo,cm520-79f |\ - p2w,r619ac-64m |\ - p2w,r619ac-128m |\ qxwlan,e2600ac-c2) nand_do_upgrade "$1" ;; @@ -102,12 +95,13 @@ platform_do_upgrade() { CI_UBIPART="ubifs" askey_do_upgrade "$1" ;; - compex,wpj419) + compex,wpj419|\ + p2w,r619ac-128m|\ + p2w,r619ac) nand_do_upgrade "$1" ;; linksys,ea6350v3 |\ - linksys,ea8300 |\ - linksys,mr8300) + linksys,ea8300) platform_do_upgrade_linksys "$1" ;; meraki,mr33) @@ -115,11 +109,9 @@ platform_do_upgrade() { nand_do_upgrade "$1" ;; openmesh,a42 |\ - openmesh,a62 |\ - plasmacloud,pa1200 |\ - plasmacloud,pa2200) + openmesh,a62) PART_NAME="inactive" - platform_do_upgrade_dualboot_datachk "$1" + platform_do_upgrade_openmesh "$1" ;; zyxel,nbg6617) zyxel_do_upgrade "$1" @@ -128,4 +120,4 @@ platform_do_upgrade() { default_do_upgrade "$1" ;; esac -} \ No newline at end of file +} diff --git a/root/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac-128m.dts b/root/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac-128m.dts new file mode 100644 index 00000000..b51378a7 --- /dev/null +++ b/root/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac-128m.dts @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "qcom-ipq4019-r619ac.dtsi" + +/ { + model = "P&W R619AC 128M"; + compatible = "p2w,r619ac-128m"; + + chosen { + bootargs-append = " root=/dev/ubiblock0_1 rootfstype=squashfs"; + }; +}; + +&rootfs_part1 { + reg = <0x0 0x8000000>; +}; + +/delete-node/ &rootfs_part2; diff --git a/root/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac.dts b/root/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac.dts new file mode 100644 index 00000000..31010dd1 --- /dev/null +++ b/root/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac.dts @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "qcom-ipq4019-r619ac.dtsi" + +/ { + model = "P&W R619AC"; + compatible = "p2w,r619ac"; + + chosen { + bootargs-append = " root=/dev/ubiblock0_1 rootfstype=squashfs"; + }; +}; diff --git a/root/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-l1000.dts b/root/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac.dtsi old mode 100755 new mode 100644 similarity index 50% rename from root/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-l1000.dts rename to root/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac.dtsi index 19104df3..81018dd0 --- a/root/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-l1000.dts +++ b/root/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-r619ac.dtsi @@ -1,8 +1,4 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later OR MIT - * - * Copyright (c) 2018 Peng Zhang - * - */ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT #include "qcom-ipq4019.dtsi" #include @@ -10,26 +6,12 @@ #include / { - - model = "GZ841902_55860.com"; - compatible = "pangu,l1000", "qcom,ipq4019"; - - - memory { - device_type = "memory"; - reg = <0x80000000 0x20000000>; /* 512MB */ - }; - - aliases { - sdhc1 = &sdhci; - led-boot = &power; - led-failsafe = &power; - led-running = &power; - led-upgrade = &power; - }; - - chosen { - bootargs-append = " root=/dev/ubiblock0_1 rootfstype=squashfs"; + aliases { + led-boot = &led_sys; + led-failsafe = &led_sys; + led-running = &led_sys; + led-upgrade = &led_sys; + label-mac-device = &gmac0; }; soc { @@ -41,8 +23,6 @@ status = "okay"; pinctrl-0 = <&mdio_pins>; pinctrl-names = "default"; - reset-gpios = <&tlmm 47 GPIO_ACTIVE_LOW>; - reset-delay-us = <2000>; }; ess-psgmii@98000 { @@ -56,11 +36,9 @@ }; tcsr@194b000 { - /* select hostmode */ compatible = "qcom,tcsr"; reg = <0x194b000 0x100>; qcom,usb-hsphy-mode-select = ; - status = "okay"; }; ess_tcsr@1953000 { @@ -93,15 +71,6 @@ ess-switch@c000000 { status = "okay"; - switch_lan_bmp = <0x18>; - switch_wan_bmp = <0x20>; - }; - - i2c@78b7000 { /* BLSP1 QUP2 */ - pinctrl-0 = <&i2c_0_pins>; - pinctrl-names = "default"; - - status = "okay"; }; edma@c080000 { @@ -109,6 +78,29 @@ }; }; + leds { + compatible = "gpio-leds"; + pinctrl-0 = <&led_pins>; + pinctrl-names = "default"; + + led_sys: sys { + label = "r619ac:blue:sys"; + gpios = <&tlmm 39 GPIO_ACTIVE_HIGH>; + }; + + wlan2g { + label = "r619ac:blue:wlan2g"; + gpios = <&tlmm 32 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "phy0tpt"; + }; + + wlan5g { + label = "r619ac:blue:wlan5g"; + gpios = <&tlmm 50 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "phy1tpt"; + }; + }; + keys { compatible = "gpio-keys"; @@ -118,79 +110,18 @@ linux,code = ; }; }; - - leds { - compatible = "gpio-leds"; - - power: status { - label = "blue:status"; - gpios = <&tlmm 3 GPIO_ACTIVE_LOW>; - }; - - wlan2g { - label = "blue:wlan2g"; - gpios = <&tlmm 1 GPIO_ACTIVE_LOW>; - }; - - wlan5g { - label = "bule:wlan5g"; - gpios = <&tlmm 2 GPIO_ACTIVE_LOW>; - }; - - wan { - label = "bule:wan"; - gpios = <&tlmm 4 GPIO_ACTIVE_LOW>; - }; - 4g1 { - label = "bule:4g1"; - gpios = <&tlmm 44 GPIO_ACTIVE_LOW>; - }; - 4g2 { - label = "bule:4g2"; - gpios = <&tlmm 45 GPIO_ACTIVE_LOW>; - }; - 4g3 { - label = "bule:4g3"; - gpios = <&tlmm 46 GPIO_ACTIVE_LOW>; - }; - usb { - label = "bule:usb"; - gpios = <&tlmm 5 GPIO_ACTIVE_LOW>; - trigger-sources = <&usb2>, <&usb3>; - linux,default-trigger = "usbport"; - }; - }; -}; - -&vqmmc { - status = "okay"; -}; - -&sdhci { - status = "okay"; - pinctrl-0 = <&sd_pins>; - pinctrl-names = "default"; - cd-gpios = <&tlmm 22 GPIO_ACTIVE_LOW>; - vqmmc-supply = <&vqmmc>; }; &blsp_dma { status = "okay"; }; -&cryptobam { - status = "okay"; -}; - &blsp1_spi1 { - pinctrl-0 = <&spi_0_pins>; - pinctrl-names = "default"; status = "okay"; - cs-gpios = <&tlmm 12 GPIO_ACTIVE_HIGH>; flash@0 { - compatible = "jedec,spi-nor"; reg = <0>; + compatible = "jedec,spi-nor"; spi-max-frequency = <24000000>; partitions { @@ -198,57 +129,80 @@ #address-cells = <1>; #size-cells = <1>; - SBL1@0 { + partition@0 { label = "SBL1"; reg = <0x0 0x40000>; read-only; }; - MIBIB@40000 { + partition@40000 { label = "MIBIB"; reg = <0x40000 0x20000>; + read-only; }; - QSEE@60000 { + partition@60000 { label = "QSEE"; reg = <0x60000 0x60000>; read-only; }; - CDT@c0000 { + partition@c0000 { label = "CDT"; reg = <0xc0000 0x10000>; read-only; }; - DDRPARAMS@d0000 { + partition@d0000 { label = "DDRPARAMS"; reg = <0xd0000 0x10000>; read-only; }; - APPSBLENV@e0000 { + partition@e0000 { label = "APPSBLENV"; reg = <0xe0000 0x10000>; + read-only; }; - APPSBL@f0000 { + partition@f0000 { label = "APPSBL"; reg = <0xf0000 0x80000>; + read-only; }; - ART@170000 { + partition@1 { + label = "Bootloader"; + reg = <0x0 0x170000>; + read-only; + }; + + partition@170000 { label = "ART"; reg = <0x170000 0x10000>; + read-only; + }; + + partition@180000 { + label = "unused"; + reg = <0x180000 0xe80000>; }; }; }; }; -&nand { - pinctrl-0 = <&nand_pins>; +&blsp1_uart1 { + pinctrl-0 = <&serial_0_pins>; pinctrl-names = "default"; status = "okay"; +}; + +&cryptobam { + status = "okay"; +}; + +&nand { + status = "okay"; nand@0 { partitions { @@ -256,9 +210,14 @@ #address-cells = <1>; #size-cells = <1>; - rootfs@0 { + rootfs_part1: partition@0 { label = "rootfs"; - reg = <0x0 0x8000000>; + reg = <0x0 0x4000000>; + }; + + rootfs_part2: partition@4000000 { + label = "unused1"; + reg = <0x4000000 0x4000000>; }; }; }; @@ -268,33 +227,21 @@ status = "okay"; }; -&blsp1_uart1 { - pinctrl-0 = <&serial_pins>; - pinctrl-names = "default"; - status = "okay"; -}; - -&blsp1_uart2 { - pinctrl-0 = <&serial_1_pins>; +&sdhci { + pinctrl-0 = <&sd_0_pins>; pinctrl-names = "default"; + vqmmc-supply = <&vqmmc>; status = "okay"; }; &tlmm { - serial_pins: serial_pinmux { - mux { - pins = "gpio16", "gpio17"; - function = "blsp_uart0"; - bias-disable; - }; - }; - mdio_pins: mdio_pinmux { mux_1 { pins = "gpio6"; function = "mdio"; bias-pull-up; }; + mux_2 { pins = "gpio7"; function = "mdc"; @@ -302,88 +249,53 @@ }; }; - serial_1_pins: serial1_pinmux { - mux { - pins = "gpio8", "gpio9", - "gpio10", "gpio11"; - function = "blsp_uart1"; - bias-disable; - }; - }; - - i2c_0_pins: i2c-0-pinmux { - mux { - pins = "gpio20", "gpio21"; - function = "blsp_i2c0"; - bias-disable; - }; - }; - - spi_0_pins: spi_0_pinmux { - pinmux { - function = "blsp_spi0"; - pins = "gpio13", "gpio14", "gpio15"; - }; - pinmux_cs { - function = "gpio"; - pins = "gpio12"; - }; - pinconf { - pins = "gpio13", "gpio14", "gpio15"; - drive-strength = <12>; - bias-disable; - }; - pinconf_cs { - pins = "gpio12"; - drive-strength = <2>; - bias-disable; - output-high; - }; - }; - - nand_pins: nand_pins { - pullups { - pins = "gpio52", "gpio53", "gpio58", - "gpio59"; - function = "qpic"; - bias-pull-up; - }; - - pulldowns { - pins = "gpio54", "gpio55", "gpio56", - "gpio57", "gpio60", "gpio61", - "gpio62", "gpio63", "gpio64", - "gpio65", "gpio66", "gpio67", - "gpio68", "gpio69"; - function = "qpic"; - bias-pull-down; - }; - }; - - sd_pins: sd_pins { - pinmux { + sd_0_pins: sd_0_pinmux { + mux_1 { + pins = "gpio23", "gpio24", "gpio25", "gpio26", "gpio28"; function = "sdio"; - pins = "gpio23", "gpio24", "gpio25", "gpio26", - "gpio28", "gpio29", "gpio30", "gpio31"; drive-strength = <10>; }; - pinmux_sd_clk { - function = "sdio"; + mux_2 { pins = "gpio27"; + function = "sdio"; drive-strength = <16>; }; + }; - pinmux_sd7 { - function = "sdio"; - pins = "gpio32"; - drive-strength = <10>; + serial_0_pins: serial0-pinmux { + mux { + pins = "gpio16", "gpio17"; + function = "blsp_uart0"; bias-disable; }; }; + + led_pins: led_pinmux { + mux { + pins = "gpio32", "gpio39", "gpio50"; + function = "gpio"; + bias-pull-up; + output-low; + }; + + mux_1 { + pins = "gpio52"; + function = "gpio"; + bias-pull-up; + output-high; + }; + + mux_2 { + pins = "gpio61"; + function = "gpio"; + bias-pull-down; + output-high; + }; + }; }; -&usb2_hs_phy { +&usb3_ss_phy { status = "okay"; }; @@ -391,16 +303,20 @@ status = "okay"; }; -&usb3_ss_phy { +&usb2_hs_phy { + status = "okay"; +}; + +&vqmmc { status = "okay"; }; &wifi0 { status = "okay"; - qcom,ath10k-calibration-variant = "PANGU-L1000"; + qcom,ath10k-calibration-variant = "R619AC"; }; &wifi1 { status = "okay"; - qcom,ath10k-calibration-variant = "PANGU-L1000"; -}; \ No newline at end of file + qcom,ath10k-calibration-variant = "R619AC"; +}; diff --git a/root/target/linux/ipq40xx/image/generic.mk b/root/target/linux/ipq40xx/image/Makefile similarity index 83% rename from root/target/linux/ipq40xx/image/generic.mk rename to root/target/linux/ipq40xx/image/Makefile index 148110e4..44b6da6d 100644 --- a/root/target/linux/ipq40xx/image/generic.mk +++ b/root/target/linux/ipq40xx/image/Makefile @@ -1,8 +1,23 @@ +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/image.mk DEVICE_VARS += NETGEAR_BOARD_ID NETGEAR_HW_ID DEVICE_VARS += RAS_BOARD RAS_ROOTFS_SIZE RAS_VERSION DEVICE_VARS += WRGG_DEVNAME WRGG_SIGNATURE +define Device/Default + PROFILES := Default + KERNEL_DEPENDS = $$(wildcard $(DTS_DIR)/$$(DEVICE_DTS).dts) + KERNEL_INITRAMFS_PREFIX := $$(IMG_PREFIX)-$(1)-initramfs + KERNEL_PREFIX := $$(IMAGE_PREFIX) + KERNEL_LOADADDR := 0x80208000 + DEVICE_DTS = $$(SOC)-$(lastword $(subst _, ,$(1))) + SUPPORTED_DEVICES := $(subst _,$(comma),$(1)) + IMAGES := sysupgrade.bin + IMAGE/sysupgrade.bin = sysupgrade-tar | append-metadata + IMAGE/sysupgrade.bin/squashfs := +endef + define Device/FitImage KERNEL_SUFFIX := -fit-uImage.itb KERNEL = kernel-bin | gzip | fit gzip $$(DTS_DIR)/$$(DEVICE_DTS).dtb @@ -115,21 +130,6 @@ define Device/8dev_jalapeno endef TARGET_DEVICES += 8dev_jalapeno -define Device/pangu_l1000 - $(call Device/FitImage) - $(call Device/UbiFit) - DEVICE_VENDOR := PANGU - DEVICE_MODEL := L1000 - SOC := qcom-ipq4019 - DEVICE_DTS := qcom-ipq4019-l1000 - KERNEL_INSTALL := 1 - BLOCKSIZE := 128k - PAGESIZE := 2048 - BOARD_NAME := l1000 - DEVICE_PACKAGES := ipq-wifi-pangu_l1000 -endef -TARGET_DEVICES += pangu_l1000 - define Device/alfa-network_ap120c-ac $(call Device/FitImage) $(call Device/UbiFit) @@ -156,7 +156,6 @@ endef define Device/aruba_ap-303 $(call Device/aruba_glenmorangie) DEVICE_MODEL := AP-303 - DEVICE_PACKAGES += uboot-envtools endef TARGET_DEVICES += aruba_ap-303 @@ -169,7 +168,7 @@ TARGET_DEVICES += aruba_ap-303h define Device/aruba_ap-365 $(call Device/aruba_glenmorangie) DEVICE_MODEL := AP-365 - DEVICE_PACKAGES += kmod-hwmon-ad7418 uboot-envtools + DEVICE_PACKAGES += kmod-hwmon-ad7418 endef TARGET_DEVICES += aruba_ap-365 @@ -318,25 +317,6 @@ define Device/compex_wpj428 endef TARGET_DEVICES += compex_wpj428 -define Device/devolo_magic-2-wifi-next - $(call Device/FitImage) - DEVICE_VENDOR := devolo - DEVICE_MODEL := Magic 2 WiFi next - SOC := qcom-ipq4018 - KERNEL_SIZE := 4096k - - # If the bootloader sees 0xDEADC0DE and this trailer at the 64k boundary of a TFTP image - # it will bootm it, just like we want for the initramfs. - KERNEL_INITRAMFS := kernel-bin | gzip | fit gzip $$(DTS_DIR)/$$(DEVICE_DTS).dtb | pad-to 64k |\ - append-string -e '\xDE\xAD\xC0\xDE{"fl_initramfs":""}\x00' - - IMAGE_SIZE := 26624k - IMAGES := sysupgrade.bin - IMAGE/sysupgrade.bin := append-kernel | append-rootfs | pad-rootfs | append-metadata - DEVICE_PACKAGES := ipq-wifi-devolo_magic-2-wifi-next uboot-envtools -endef -TARGET_DEVICES += devolo_magic-2-wifi-next - define Device/dlink_dap-2610 $(call Device/FitImageLzma) DEVICE_VENDOR := D-Link @@ -364,32 +344,6 @@ define Device/dlink_dap-2610 endef TARGET_DEVICES += dlink_dap-2610 -define Device/edgecore_ecw5211 - $(call Device/FitImage) - $(call Device/UbiFit) - DEVICE_VENDOR := Edgecore - DEVICE_MODEL := ECW5211 - SOC := qcom-ipq4018 - BLOCKSIZE := 128k - PAGESIZE := 2048 - DEVICE_PACKAGES := kmod-tpm-i2c-atmel kmod-usb-acm uboot-envtools -endef -TARGET_DEVICES += edgecore_ecw5211 - -define Device/edgecore_oap100 - $(call Device/FitImage) - $(call Device/UbiFit) - DEVICE_VENDOR := Edgecore - DEVICE_MODEL := OAP100 - SOC := qcom-ipq4019 - BLOCKSIZE := 128k - PAGESIZE := 2048 - IMAGES := nand-sysupgrade.bin - DEVICE_DTS_CONFIG := config@ap.dk07.1-c1 - DEVICE_PACKAGES := ipq-wifi-edgecore_oap100 kmod-usb-acm kmod-usb-net kmod-usb-net-cdc-qmi uqmi -endef -TARGET_DEVICES += edgecore_oap100 - define Device/engenius_eap1300 $(call Device/FitImage) DEVICE_VENDOR := EnGenius @@ -483,21 +437,6 @@ define Device/ezviz_cs-w3-wd1200g-eup endef TARGET_DEVICES += ezviz_cs-w3-wd1200g-eup -define Device/glinet_gl-ap1300 - $(call Device/FitImage) - $(call Device/UbiFit) - DEVICE_VENDOR := GL.iNet - DEVICE_MODEL := GL-AP1300 - SOC := qcom-ipq4018 - DEVICE_DTS_CONFIG := config@ap.dk01.1-c2 - BLOCKSIZE := 128k - PAGESIZE := 2048 - IMAGE_SIZE := 131072k - KERNEL_INSTALL := 1 - DEVICE_PACKAGES := ipq-wifi-glinet_gl-ap1300 -endef -TARGET_DEVICES += glinet_gl-ap1300 - define Device/glinet_gl-b1300 $(call Device/FitImage) DEVICE_VENDOR := GL.iNet @@ -576,34 +515,6 @@ define Device/linksys_ea8300 endef TARGET_DEVICES += linksys_ea8300 -define Device/linksys_mr8300 - $(call Device/FitzImage) - DEVICE_VENDOR := Linksys - DEVICE_MODEL := MR8300 - SOC := qcom-ipq4019 - KERNEL_SIZE := 3072k - IMAGE_SIZE := 87040k - BLOCKSIZE := 128k - PAGESIZE := 2048 - UBINIZE_OPTS := -E 5 # EOD marks to "hide" factory sig at EOF - IMAGES += factory.bin - IMAGE/factory.bin := append-kernel | pad-to $$$$(KERNEL_SIZE) | append-ubi | linksys-image type=MR8300 - DEVICE_PACKAGES := uboot-envtools ath10k-firmware-qca9888-ct ipq-wifi-linksys_mr8300-v0 kmod-usb-ledtrig-usbport -endef -TARGET_DEVICES += linksys_mr8300 - -define Device/luma_wrtq-329acn - $(call Device/FitImage) - DEVICE_VENDOR := Luma Home - DEVICE_MODEL := WRTQ-329ACN - SOC := qcom-ipq4018 - DEVICE_PACKAGES := ipq-wifi-luma_wrtq-329acn kmod-ath3k kmod-eeprom-at24 kmod-i2c-gpio uboot-envtools - IMAGE_SIZE := 76632k - BLOCKSIZE := 128k - PAGESIZE := 2048 -endef -TARGET_DEVICES += luma_wrtq-329acn - define Device/meraki_mr33 $(call Device/FitImage) DEVICE_VENDOR := Cisco Meraki @@ -629,7 +540,6 @@ TARGET_DEVICES += mobipromo_cm520-79f define Device/netgear_ex61x0v2 $(call Device/DniImage) - DEVICE_VENDOR := NETGEAR DEVICE_DTS_CONFIG := config@4 NETGEAR_BOARD_ID := EX6150v2series NETGEAR_HW_ID := 29765285+16+0+128+2x2 @@ -639,6 +549,7 @@ endef define Device/netgear_ex6100v2 $(call Device/netgear_ex61x0v2) + DEVICE_VENDOR := Netgear DEVICE_MODEL := EX6100 DEVICE_VARIANT := v2 endef @@ -646,6 +557,7 @@ TARGET_DEVICES += netgear_ex6100v2 define Device/netgear_ex6150v2 $(call Device/netgear_ex61x0v2) + DEVICE_VENDOR := Netgear DEVICE_MODEL := EX6150 DEVICE_VARIANT := v2 endef @@ -681,40 +593,9 @@ define Device/openmesh_a62 IMAGE/sysupgrade.bin/squashfs := append-rootfs | pad-rootfs | sysupgrade-tar rootfs=$$$$@ | append-metadata DEVICE_PACKAGES := ath10k-firmware-qca9888-ct uboot-envtools endef + TARGET_DEVICES += openmesh_a62 -define Device/plasmacloud_pa1200 - $(call Device/FitImageLzma) - DEVICE_VENDOR := Plasma Cloud - DEVICE_MODEL := PA1200 - SOC := qcom-ipq4018 - DEVICE_DTS_CONFIG := config@pc.pa1200 - BLOCKSIZE := 64k - KERNEL = kernel-bin | lzma | fit lzma $$(DTS_DIR)/$$(DEVICE_DTS).dtb | pad-to $$(BLOCKSIZE) - IMAGE_SIZE := 15616k - IMAGES += factory.bin - IMAGE/factory.bin := append-rootfs | pad-rootfs | openmesh-image ce_type=PA1200 - IMAGE/sysupgrade.bin/squashfs := append-rootfs | pad-rootfs | sysupgrade-tar rootfs=$$$$@ | append-metadata - DEVICE_PACKAGES := uboot-envtools ipq-wifi-plasmacloud-pa1200 -endef -TARGET_DEVICES += plasmacloud_pa1200 - -define Device/plasmacloud_pa2200 - $(call Device/FitImageLzma) - DEVICE_VENDOR := Plasma Cloud - DEVICE_MODEL := PA2200 - SOC := qcom-ipq4019 - DEVICE_DTS_CONFIG := config@pc.pa2200 - BLOCKSIZE := 64k - KERNEL = kernel-bin | lzma | fit lzma $$(DTS_DIR)/$$(DEVICE_DTS).dtb | pad-to $$(BLOCKSIZE) - IMAGE_SIZE := 15552k - IMAGES += factory.bin - IMAGE/factory.bin := append-rootfs | pad-rootfs | openmesh-image ce_type=PA2200 - IMAGE/sysupgrade.bin/squashfs := append-rootfs | pad-rootfs | sysupgrade-tar rootfs=$$$$@ | append-metadata - DEVICE_PACKAGES := ath10k-firmware-qca9888-ct ipq-wifi-plasmacloud-pa2200 uboot-envtools -endef -TARGET_DEVICES += plasmacloud_pa2200 - define Device/qcom_ap-dk01.1-c1 DEVICE_VENDOR := Qualcomm Atheros DEVICE_MODEL := AP-DK01.1 @@ -746,6 +627,35 @@ define Device/qcom_ap-dk04.1-c1 endef TARGET_DEVICES += qcom_ap-dk04.1-c1 +define Device/p2w_r619ac + $(call Device/FitzImage) + $(call Device/UbiFit) + DEVICE_VENDOR := P&W + DEVICE_MODEL := R619AC + SOC := qcom-ipq4019 + DEVICE_DTS_CONFIG := config@10 + BLOCKSIZE := 128k + PAGESIZE := 2048 + IMAGES += nand-factory.bin + IMAGE/nand-factory.bin := append-ubi | qsdk-ipq-factory-nand + DEVICE_PACKAGES := ipq-wifi-p2w_r619ac +endef +TARGET_DEVICES += p2w_r619ac + +define Device/p2w_r619ac-128m + $(call Device/FitzImage) + $(call Device/UbiFit) + DEVICE_VENDOR := P&W + DEVICE_MODEL := R619AC + DEVICE_VARIANT := 128M + SOC := qcom-ipq4019 + DEVICE_DTS_CONFIG := config@10 + BLOCKSIZE := 128k + PAGESIZE := 2048 + DEVICE_PACKAGES := ipq-wifi-p2w_r619ac +endef +TARGET_DEVICES += p2w_r619ac-128m + define Device/qxwlan_e2600ac-c1 $(call Device/FitImage) DEVICE_VENDOR := Qxwlan @@ -819,4 +729,6 @@ define Device/zyxel_wre6606 IMAGE/sysupgrade.bin := append-kernel | append-rootfs | pad-rootfs | append-metadata | check-size DEVICE_PACKAGES := -kmod-ath10k-ct kmod-ath10k-ct-smallbuffers endef -TARGET_DEVICES += zyxel_wre6606 \ No newline at end of file +TARGET_DEVICES += zyxel_wre6606 + +$(eval $(call BuildImage)) diff --git a/root/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch b/root/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch old mode 100755 new mode 100644 index 79daa03f..ade7a675 --- a/root/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch +++ b/root/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch @@ -10,7 +10,7 @@ Signed-off-by: John Crispin --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile -@@ -837,11 +837,59 @@ dtb-$(CONFIG_ARCH_QCOM) += \ +@@ -837,11 +837,52 @@ dtb-$(CONFIG_ARCH_QCOM) += \ qcom-apq8074-dragonboard.dtb \ qcom-apq8084-ifc6540.dtb \ qcom-apq8084-mtp.dtb \ @@ -18,25 +18,19 @@ Signed-off-by: John Crispin + qcom-ipq4018-ap120c-ac.dtb \ + qcom-ipq4018-dap-2610.dtb \ + qcom-ipq4018-cs-w3-wd1200g-eup.dtb \ -+ qcom-ipq4018-magic-2-wifi-next.dtb \ + qcom-ipq4018-ea6350v3.dtb \ + qcom-ipq4018-eap1300.dtb \ -+ qcom-ipq4018-ecw5211.dtb \ + qcom-ipq4018-emd1.dtb \ + qcom-ipq4018-emr3500.dtb \ + qcom-ipq4018-ens620ext.dtb \ + qcom-ipq4018-ex6100v2.dtb \ + qcom-ipq4018-ex6150v2.dtb \ + qcom-ipq4018-fritzbox-4040.dtb \ -+ qcom-ipq4018-gl-ap1300.dtb \ + qcom-ipq4018-jalapeno.dtb \ + qcom-ipq4018-meshpoint-one.dtb \ + qcom-ipq4018-nbg6617.dtb \ -+ qcom-ipq4019-oap100.dtb \ -+ qcom-ipq4018-pa1200.dtb \ + qcom-ipq4018-rt-ac58u.dtb \ + qcom-ipq4018-wre6606.dtb \ -+ qcom-ipq4018-wrtq-329acn.dtb \ qcom-ipq4019-ap.dk01.1-c1.dtb \ qcom-ipq4019-ap.dk04.1-c1.dtb \ qcom-ipq4019-ap.dk04.1-c3.dtb \ @@ -49,12 +43,12 @@ Signed-off-by: John Crispin + qcom-ipq4019-fritzbox-7530.dtb \ + qcom-ipq4019-fritzrepeater-1200.dtb \ + qcom-ipq4019-fritzrepeater-3000.dtb \ ++ qcom-ipq4019-r619ac.dtb \ ++ qcom-ipq4019-r619ac-128m.dtb \ + qcom-ipq4019-map-ac2200.dtb \ -+ qcom-ipq4019-mr8300.dtb \ + qcom-ipq4019-e2600ac-c1.dtb \ + qcom-ipq4019-e2600ac-c2.dtb \ + qcom-ipq4019-habanero-dvk.dtb \ -+ qcom-ipq4019-pa2200.dtb \ + qcom-ipq4019-rtl30vw.dtb \ + qcom-ipq4019-u4019-32m.dtb \ + qcom-ipq4019-wpj419.dtb \ @@ -66,7 +60,6 @@ Signed-off-by: John Crispin + qcom-ipq4029-gl-b1300.dtb \ + qcom-ipq4029-gl-s1300.dtb \ + qcom-ipq4029-mr33.dtb \ -+ qcom-ipq4019-l1000.dtb \ qcom-ipq8064-ap148.dtb \ qcom-msm8660-surf.dtb \ - qcom-msm8960-cdp.dtb \ \ No newline at end of file + qcom-msm8960-cdp.dtb \ diff --git a/root/target/linux/ipq40xx/patches-5.4/999-ipq40xx-unlock-cpu-frequency.patch b/root/target/linux/ipq40xx/patches-5.4/999-ipq40xx-unlock-cpu-frequency.patch deleted file mode 100755 index c08658bb..00000000 --- a/root/target/linux/ipq40xx/patches-5.4/999-ipq40xx-unlock-cpu-frequency.patch +++ /dev/null @@ -1,53 +0,0 @@ -From: William -Subject: [PATCH] ipq40xx: improve CPU clock -Date: Tue, 15 Dec 2020 15:26:35 +0800 - -This patch will match the clock-latency-ns values in the device tree -for those found inside the OEM device tree and kernel source code and -unlock 896Mhz CPU operating points. - -Signed-off-by: William ---- ---- a/arch/arm/boot/dts/qcom-ipq4019.dtsi -+++ b/arch/arm/boot/dts/qcom-ipq4019.dtsi -@@ -114,20 +114,24 @@ - - opp-48000000 { - opp-hz = /bits/ 64 <48000000>; -- clock-latency-ns = <256000>; -+ clock-latency-ns = <100000>; - }; - opp-200000000 { - opp-hz = /bits/ 64 <200000000>; -- clock-latency-ns = <256000>; -+ clock-latency-ns = <100000>; - }; - opp-500000000 { - opp-hz = /bits/ 64 <500000000>; -- clock-latency-ns = <256000>; -+ clock-latency-ns = <100000>; - }; - opp-716000000 { - opp-hz = /bits/ 64 <716000000>; -- clock-latency-ns = <256000>; -+ clock-latency-ns = <100000>; - }; -+ opp-896000000 { -+ opp-hz = /bits/ 64 <896000000>; -+ clock-latency-ns = <100000>; -+ }; - }; - - memory { ---- a/drivers/clk/qcom/gcc-ipq4019.c -+++ b/drivers/clk/qcom/gcc-ipq4019.c -@@ -579,6 +579,9 @@ static const struct freq_tbl ftbl_gcc_ap - F(632000000, P_DDRPLLAPSS, 1, 0, 0), - F(672000000, P_DDRPLLAPSS, 1, 0, 0), - F(716000000, P_DDRPLLAPSS, 1, 0, 0), -+ F(768000000, P_DDRPLLAPSS, 1, 0, 0), -+ F(823000000, P_DDRPLLAPSS, 1, 0, 0), -+ F(896000000, P_DDRPLLAPSS, 1, 0, 0), - { } - }; - \ No newline at end of file