Build OpenWrt: rm1800-wifi @ ImmortalWrt (VIKINGYFY) · IPQ60XX-RM1800 #72
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build OpenWrt | |
| run-name: >- | |
| Build OpenWrt: | |
| ${{ inputs.config_name }} @ | |
| ${{ contains(inputs.repo_url, 'breeze303') && 'LibWrt' || (contains(inputs.repo_url, 'immortalwrt') || contains(inputs.repo_url, 'VIKINGYFY')) && 'ImmortalWrt' || 'OpenWrt' }} | |
| (${{ contains(inputs.repo_url, 'VIKINGYFY') && 'VIKINGYFY' || contains(inputs.repo_url, 'breeze303') && 'breeze303' || 'immortalwrt' }}) | |
| · ${{ inputs.release_tag }} | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| config_name: | |
| description: Config filename without .config | |
| required: true | |
| type: choice | |
| options: | |
| - rm1800-minimal | |
| - rm1800-wifi | |
| - rm1800-gateway | |
| default: rm1800-wifi | |
| release_tag: | |
| description: Release tag | |
| required: true | |
| type: string | |
| default: IPQ60XX-RM1800 | |
| repo_url: | |
| description: Source OpenWrt/ImmortalWrt repo | |
| required: true | |
| type: choice | |
| options: | |
| - https://github.com/VIKINGYFY/immortalwrt.git@main | |
| - https://github.com/immortalwrt/immortalwrt.git@master | |
| - https://github.com/breeze303/openwrt-6.x.git@main-nss | |
| default: https://github.com/VIKINGYFY/immortalwrt.git@main | |
| note: | |
| description: Build note (shows in run name + summary) | |
| required: false | |
| type: string | |
| permissions: | |
| contents: write | |
| env: | |
| # REPO_URL: https://github.com/breeze303/openwrt-6.x.git | |
| # REPO_BRANCH: main-nss | |
| # REPO_URL: https://github.com/immortalwrt/immortalwrt.git | |
| # REPO_BRANCH: master | |
| # REPO_URL: ${{ inputs.repo_url }} | |
| # REPO_BRANCH: ${{ inputs.repo_branch }} | |
| CONFIG_FILE: configs/${{ inputs.config_name }}.config | |
| # CONFIG_DESCRIPTION: ${{ inputs.config_description }} | |
| FIRMWARE_TAG: ${{ inputs.release_tag }} | |
| CLASH_KERNEL: amd64 | |
| CACHE_TOOLCHAIN: true | |
| UPLOAD_BIN_DIR: false | |
| FIRMWARE_RELEASE: true | |
| TZ: Europe/Paris | |
| jobs: | |
| Build: | |
| runs-on: ubuntu-22.04 | |
| steps: | |
| - name: Build note | |
| if: inputs.note != '' | |
| run: echo "📝 ${{ inputs.note }}" >> "$GITHUB_STEP_SUMMARY" | |
| - name: Check Server Performance(检查服务器性能) | |
| run: | | |
| echo "Warning ⚠" | |
| echo "The allocated runner has limited performance. If you select too many packages/plugins, watch CPU usage carefully." | |
| echo -e "Known CPU models, descending performance: 7763, 8370C, 8272CL, 8171M, E5-2673\n" | |
| echo "-------------------------- CPU info --------------------------" | |
| echo "Physical CPU count: $(cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l)" | |
| echo -e "CPU core info: $(cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c)\n" | |
| echo "-------------------------- Memory info --------------------------" | |
| echo "Installed memory details:" | |
| echo -e "$(sudo lshw -short -C memory | grep GiB)\n" | |
| echo "-------------------------- Disk info --------------------------" | |
| echo "Disk count: $(ls /dev/sd* | grep -v [1-9] | wc -l)" && df -hT | |
| - name: Initialization Environment(初始化环境) | |
| env: | |
| DEBIAN_FRONTEND: noninteractive | |
| run: | | |
| # Fast cleanup | |
| docker images -q | xargs -r docker rmi || true | |
| sudo rm -rf /usr/share/dotnet /etc/apt/sources.list.d /usr/local/lib/android $AGENT_TOOLSDIRECTORY | |
| # Fast install of OpenWrt/LEDE dependencies | |
| sudo -E apt-get -qq update | |
| sudo -E apt-get -qq install -y --no-install-recommends \ | |
| ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \ | |
| bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext \ | |
| gcc-multilib g++-multilib git gperf haveged help2man intltool libc6-dev-i386 \ | |
| libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses5-dev \ | |
| libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz mkisofs msmtp nano ninja-build \ | |
| p7zip p7zip-full patch pkgconf python2.7 python3 python3-pyelftools python3-setuptools \ | |
| qemu-utils rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip \ | |
| vim wget xmlto xxd zlib1g-dev | |
| sudo timedatectl set-timezone "$TZ" | |
| - name: Combine Disks(合并磁盘) | |
| uses: easimon/maximize-build-space@master | |
| with: | |
| swap-size-mb: 1024 | |
| temp-reserve-mb: 100 | |
| root-reserve-mb: 1024 | |
| - name: Checkout | |
| uses: actions/checkout@main | |
| - name: Resolve source | |
| run: | | |
| SOURCE="${{ github.event.inputs.repo_url }}" | |
| REPO_URL="${SOURCE%@*}" | |
| REPO_BRANCH="${SOURCE##*@}" | |
| echo "REPO_URL=$REPO_URL" >> "$GITHUB_ENV" | |
| echo "REPO_BRANCH=$REPO_BRANCH" >> "$GITHUB_ENV" | |
| # OS name from the repo | |
| case "$REPO_URL" in | |
| *breeze303*) OS_LABEL="LibWrt" ;; | |
| *immortalwrt*) OS_LABEL="ImmortalWrt" ;; | |
| *VIKINGYFY*) OS_LABEL="ImmortalWrt-V" ;; | |
| *) OS_LABEL="OpenWrt" ;; | |
| esac | |
| # Variant from config_name (strip the rm1800- prefix, Title-case) | |
| VARIANT_RAW="${{ github.event.inputs.config_name }}" | |
| VARIANT="${VARIANT_RAW#rm1800-}" | |
| case "$VARIANT" in | |
| minimal) VARIANT_LABEL="Minimal" ;; | |
| wifi) VARIANT_LABEL="Wi-Fi" ;; | |
| gateway) VARIANT_LABEL="Gateway" ;; | |
| *) VARIANT_LABEL="$VARIANT" ;; | |
| esac | |
| echo "OS_LABEL=$OS_LABEL" >> "$GITHUB_ENV" | |
| echo "CONFIG_DESCRIPTION=Xiaomi AX1800(RM1800) ${OS_LABEL} ${VARIANT_LABEL} build" >> "$GITHUB_ENV" | |
| echo "FIRMWARE_TAG=${FIRMWARE_TAG}-${OS_LABEL}-${VARIANT_LABEL}" >> "$GITHUB_ENV" | |
| echo "VARIANT_LABEL=$VARIANT_LABEL" >> "$GITHUB_ENV" | |
| echo "Resolved $REPO_URL @ $REPO_BRANCH → ${OS_LABEL} ${VARIANT_LABEL}" | |
| - name: Validate selected config | |
| run: | | |
| test -f "$CONFIG_FILE" || { | |
| echo "::error::Config not found: $CONFIG_FILE" | |
| exit 1 | |
| } | |
| echo "Using config: $CONFIG_FILE" | |
| echo "Description: $CONFIG_DESCRIPTION" | |
| - name: Clone Source Code(克隆源代码) | |
| run: | | |
| df -hT $GITHUB_WORKSPACE | |
| git clone $REPO_URL -b $REPO_BRANCH openwrt | |
| cd openwrt | |
| echo "OPENWRT_PATH=$PWD" >> $GITHUB_ENV | |
| VERSION_INFO=$(git show -s --date=short --format="Author: %an<br/>Date: %cd<br/>Message: %s<br/>Hash: %H") | |
| echo "VERSION_INFO=$VERSION_INFO" >> $GITHUB_ENV | |
| - name: Cache OpenWrt downloads | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| openwrt/dl | |
| openwrt/feeds | |
| openwrt/.ccache | |
| key: openwrt-${{ runner.os }}-${{ hashFiles(format('configs/{0}.config', inputs.config_name)) }} | |
| restore-keys: | | |
| openwrt-${{ runner.os }}- | |
| - name: Diagnose AX1800 DTS structure | |
| run: | | |
| cd $OPENWRT_PATH | |
| echo "=== locate ax1800 dts anywhere in the tree ===" | |
| find target/linux -iname '*ax1800*.dts*' -o -iname '*ipq6000*.dts*' 2>/dev/null | |
| echo "=== what the image profile references ===" | |
| grep -rn 'DEVICE_DTS\|xiaomi_ax1800' target/linux/qualcommax/image/ 2>/dev/null | |
| cd $OPENWRT_PATH | |
| DTS=target/linux/qualcommax/dts/ipq6000-ax1800.dts | |
| DTS=$(find target/linux -iname '*ax1800*.dts' | grep -vi 'gl-\|mt7621' | head -1) | |
| test -n "$DTS" || { echo "::error::AX1800 DTS not found"; exit 1; } | |
| echo "Patching DTS: $DTS" # must print ipq6000-ax1800.dts, NOT gl-ax1800 | |
| echo "=== board DTS ($DTS) ===" | |
| cat "$DTS" | |
| echo "=== what it #includes ===" | |
| grep -n '#include\|/include/' "$DTS" | |
| echo "=== wifi node label + how it's referenced ===" | |
| # find the wifi node definition and any &label references across the tree | |
| grep -rn 'wifi@\|c000000\|&wifi\|q6@\|wcss' target/linux/qualcommax/dts/ target/linux/qualcommax/files*/arch/arm64/boot/dts/qcom/ 2>/dev/null | head -40 | |
| echo "=== existing reserved-memory / memory-region nodes ===" | |
| grep -rn 'reserved-memory\|memory-region\|shared-dma-pool\|linux,cma' target/linux/qualcommax/dts/ target/linux/qualcommax/files*/arch/arm64/boot/dts/qcom/ 2>/dev/null | head -40 | |
| echo "=== chosen / bootargs anywhere in the include chain ===" | |
| grep -rn 'chosen\|bootargs' target/linux/qualcommax/dts/ target/linux/qualcommax/files*/arch/arm64/boot/dts/qcom/ 2>/dev/null | head -20 | |
| - name: Check available IPQ60xx devices | |
| run: | | |
| cd $OPENWRT_PATH | |
| grep -R "DEVICE_.*\(xiaomi\|redmi\|ax1800\|rm1800\)" target/linux/qualcommax/image target/linux/*/image || true | |
| - name: Install Feeds(安装feeds) | |
| run: | | |
| cd $OPENWRT_PATH | |
| ./scripts/feeds update -a | |
| ./scripts/feeds install -a | |
| - name: Load Custom Configuration(加载自定义配置) | |
| run: | | |
| [ -e files ] && mv files $OPENWRT_PATH/files | |
| cp $CONFIG_FILE $OPENWRT_PATH/.config | |
| - name: Fix kernel config for non-interactive build | |
| run: | | |
| cd $OPENWRT_PATH | |
| for f in target/linux/generic/config-*; do | |
| echo '# CONFIG_ALLOC_SKB_PAGE_FRAG_DISABLE is not set' >> "$f" | |
| done | |
| rm -rf build_dir/target-* | |
| - name: Neuter NSS patches (VIKINGYFY) | |
| run: | | |
| cd $OPENWRT_PATH | |
| echo "=== NSS patches present ==="; ls package/kernel/mac80211/patches/nss/ 2>/dev/null || echo "none" | |
| rm -rf package/kernel/mac80211/patches/nss | |
| grep -rn 'select ATH11K_NSS_SUPPORT\|select MAC80211_NSS_SUPPORT' \ | |
| target/linux/qualcommax/ package/kernel/mac80211/ 2>/dev/null || echo "✅ no NSS selects remain" | |
| - name: CMA children defaults + reserve 8M via DTS | |
| run: | | |
| cd $OPENWRT_PATH | |
| # CMA parent comes from the seed (CONFIG_KERNEL_CMA/DMA_CMA). | |
| # Here we only pin the CHILD symbols so syncconfig never prompts in CI. | |
| for f in target/linux/generic/config-*; do | |
| sed -i '/CONFIG_CMA[ =]/d; /CONFIG_CMA is not set/d; /CONFIG_CMA_/d; /CONFIG_DMA_CMA/d' "$f" | |
| printf '%s\n' \ | |
| 'CONFIG_CMA=y' \ | |
| 'CONFIG_DMA_CMA=y' \ | |
| '# CONFIG_CMA_DEBUG is not set' \ | |
| '# CONFIG_CMA_DEBUGFS is not set' \ | |
| '# CONFIG_CMA_SYSFS is not set' \ | |
| 'CONFIG_CMA_AREAS=7' \ | |
| 'CONFIG_CMA_SIZE_MBYTES=0' \ | |
| 'CONFIG_CMA_SIZE_SEL_MBYTES=y' \ | |
| '# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set' \ | |
| '# CONFIG_CMA_SIZE_SEL_MIN is not set' \ | |
| '# CONFIG_CMA_SIZE_SEL_MAX is not set' \ | |
| 'CONFIG_CMA_ALIGNMENT=8' >> "$f" | |
| done | |
| # reserve 32M via the board DTS bootargs (order-safe) | |
| DTS=target/linux/qualcommax/dts/ipq6000-ax1800.dts | |
| # DTS=$(find target/linux -iname '*ax1800*.dts' | grep -vi 'gl-\|mt7621' | head -1) | |
| test -n "$DTS" || { echo "::error::AX1800 DTS not found"; exit 1; } | |
| echo "Patching DTS: $DTS" # must print ipq6000-ax1800.dts, NOT gl-ax1800 | |
| sed -i 's/ cma=[0-9]*M//g' "$DTS" | |
| printf '\n/ {\n\treserved-memory {\n\t\twifi_cma: wifi_cma@49000000 {\n\t\t\tcompatible = "shared-dma-pool";\n\t\t\treusable;\n\t\t\tlinux,cma-default;\n\t\t\treg = <0x0 0x49000000 0x0 0x02000000>;\n\t\t};\n\t};\n};\n' >> "$DTS" | |
| echo "=== reserved-memory cma in DTS ==="; grep -n -A6 'wifi_cma' "$DTS" || true | |
| - name: Disable NSS wifi offload + pin 256M mem profile | |
| run: | | |
| cd $OPENWRT_PATH | |
| sed -i '/CONFIG_ATH11K_NSS_SUPPORT/d; /CONFIG_NSS_DRV_WIFIOFFLOAD_ENABLE/d; /CONFIG_MAC80211_NSS_SUPPORT/d; /CONFIG_PACKAGE_kmod-qca-nss-drv-wifioffload/d; /CONFIG_IPQ_MEM_PROFILE/d; /CONFIG_ATH11K_MEM_PROFILE/d' .config | |
| printf '%s\n' \ | |
| '# CONFIG_ATH11K_NSS_SUPPORT is not set' \ | |
| '# CONFIG_NSS_DRV_WIFIOFFLOAD_ENABLE is not set' \ | |
| '# CONFIG_MAC80211_NSS_SUPPORT is not set' \ | |
| '# CONFIG_PACKAGE_kmod-qca-nss-drv-wifioffload is not set' \ | |
| 'CONFIG_IPQ_MEM_PROFILE_256=y' \ | |
| 'CONFIG_ATH11K_MEM_PROFILE_256M=y' >> .config | |
| - name: Stamp version + build id | |
| working-directory: openwrt | |
| run: | | |
| CONFIG="${{ github.event.inputs.config_name }}" | |
| TAG="${{ github.event.inputs.release_tag }}" | |
| SHA="${GITHUB_SHA::7}" | |
| RUN="${{ github.run_id }}" | |
| STAMP="$(date -u +%FT%TZ)" | |
| # OS_LABEL + REPO_BRANCH come from the Resolve step via $GITHUB_ENV | |
| VERSION_NUMBER="${CONFIG}-${REPO_BRANCH}-${SHA}" | |
| SAFE_OS="$(printf '%s' "$OS_LABEL" | tr -d '\r\n' | sed 's/[^A-Za-z0-9._-]/-/g')" | |
| SAFE_VER="$(printf '%s' "$VERSION_NUMBER" | tr -d '\r\n' | sed 's/[^A-Za-z0-9._-]/-/g')" | |
| # enable the PARENT symbol, else defconfig strips DIST/NUMBER | |
| sed -i '/^# CONFIG_VERSIONOPT is not set/d; /^CONFIG_VERSIONOPT=/d; /^CONFIG_VERSION_DIST=/d; /^CONFIG_VERSION_NUMBER=/d' .config | |
| { | |
| echo "CONFIG_VERSIONOPT=y" | |
| echo "CONFIG_VERSION_DIST=\"${SAFE_OS}\"" | |
| echo "CONFIG_VERSION_NUMBER=\"${SAFE_VER}\"" | |
| } >> .config | |
| mkdir -p files/etc | |
| cat > files/etc/build-id <<EOF | |
| os=${SAFE_OS} | |
| config=${CONFIG} | |
| release_tag=${TAG} | |
| repo_url=${REPO_URL} | |
| repo_branch=${REPO_BRANCH} | |
| sha=${SHA} | |
| run_id=${RUN} | |
| built=${STAMP} | |
| version_info=${VERSION_INFO//<br\/>/; } | |
| EOF | |
| echo "Stamped: ${SAFE_OS} ${SAFE_VER}" | |
| - name: Resolve config and check selected device | |
| run: | | |
| cd $OPENWRT_PATH | |
| make defconfig | |
| sed -i 's/^CONFIG_ATH11K_NSS_SUPPORT=y$/# CONFIG_ATH11K_NSS_SUPPORT is not set/' .config | |
| sed -i 's/^CONFIG_NSS_DRV_WIFIOFFLOAD_ENABLE=y$/# CONFIG_NSS_DRV_WIFIOFFLOAD_ENABLE is not set/' .config | |
| sed -i 's/^CONFIG_MAC80211_NSS_SUPPORT=y$/# CONFIG_MAC80211_NSS_SUPPORT is not set/' .config | |
| echo "=== NSS state after defconfig ==="; grep -E 'NSS|MEM_PROFILE' .config || true | |
| SOURCE_REPO="$(echo $REPO_URL | awk -F '/' '{print $(NF)}')" | |
| echo "SOURCE_REPO=$SOURCE_REPO" >> $GITHUB_ENV | |
| DEVICE_TARGET=$(grep '^CONFIG_TARGET_BOARD=' .config | cut -d'"' -f2) | |
| DEVICE_SUBTARGET=$(grep '^CONFIG_TARGET_SUBTARGET=' .config | cut -d'"' -f2) | |
| DEVICE_PROFILE=$(grep '^CONFIG_TARGET_PROFILE=' .config | cut -d'"' -f2) | |
| echo "DEVICE_TARGET=$DEVICE_TARGET" >> $GITHUB_ENV | |
| echo "DEVICE_SUBTARGET=$DEVICE_SUBTARGET" >> $GITHUB_ENV | |
| echo "DEVICE_PROFILE=$DEVICE_PROFILE" >> $GITHUB_ENV | |
| echo "=== selected target ===" | |
| grep -E "CONFIG_TARGET_(BOARD|SUBTARGET|PROFILE)=" .config || true | |
| echo "=== selected ipq60xx devices ===" | |
| grep -E "CONFIG_TARGET_DEVICE_qualcommax_ipq60xx_DEVICE_.*=y" .config || true | |
| echo "=== available xiaomi/redmi device defines ===" | |
| grep -n -B5 -A20 "define Device/.*\(xiaomi\|redmi\|ax1800\)" target/linux/qualcommax/image/ipq60xx.mk || true | |
| echo "=== written config version ===" | |
| grep CONFIG_VERSION_ .config || true | |
| echo "=== CMA seed (OpenWrt .config) ===" | |
| grep -E '^CONFIG_KERNEL_CMA=|^CONFIG_KERNEL_DMA_CMA=' .config || echo "SEED LINES MISSING" | |
| grep -E '^CONFIG_CMA=|^CONFIG_DMA_CMA=' build_dir/target-*/linux-*/linux-*/.config 2>/dev/null || echo "kernel .config not built yet" | |
| # after make defconfig + your existing NSS sed lines: | |
| echo "=== NSS assertion ===" | |
| if grep -qE '^CONFIG_(ATH11K_NSS_SUPPORT|MAC80211_NSS_SUPPORT)=y' .config; then | |
| echo "::error::NSS still enabled after neuter — patch removal did not take"; exit 1 | |
| fi | |
| echo "✅ NSS disabled in .config" | |
| - name: Validate RM1800 build configuration | |
| run: | | |
| cd "$OPENWRT_PATH" | |
| echo "=== Available Xiaomi/Redmi Device Profiles ===" | |
| grep -o "CONFIG_TARGET_DEVICE_qualcommax_ipq60xx_DEVICE_[a-zA-Z0-9_]*" .config || true | |
| cat target/linux/qualcommax/image/ipq60xx.mk | grep -iE 'xiaomi|redmi|ax1800|rm1800' || true | |
| # Temporarily bypass the hard failure so you can see the logs | |
| exit 0 | |
| - name: Monitor-ring recon (locate core.c post-extract) | |
| run: | | |
| cd $OPENWRT_PATH | |
| make package/kernel/mac80211/{clean,prepare} V=s QUILT=1 2>/dev/null || true | |
| ATH=$(find build_dir -path '*ath11k/core.c' | head -1) | |
| echo "core.c: ${ATH:-NOT FOUND}" | |
| [ -n "$ATH" ] && grep -n 'rxdma1_enable\|IPQ6018\|\.hw_rev' "$ATH" | head -40 || true | |
| - name: Cache Toolchain(缓存工具链) | |
| if: env.CACHE_TOOLCHAIN == 'true' | |
| uses: HiGarfield/cachewrtbuild@main | |
| with: | |
| ccache: false | |
| mixkey: ${{ env.SOURCE_REPO }}-${{ env.REPO_BRANCH }}-${{ env.DEVICE_TARGET }}-${{ env.DEVICE_SUBTARGET }} | |
| prefix: ${{ env.OPENWRT_PATH }} | |
| - name: Disable IPQ6018 monitor rings | |
| run: | | |
| cd $OPENWRT_PATH | |
| make package/kernel/mac80211/{clean,prepare} V=s QUILT=1 2>/dev/null || true | |
| ATH=$(find build_dir -path '*ath11k/core.c' | head -1) | |
| test -n "$ATH" || { echo "::error::core.c not found"; exit 1; } | |
| awk ' | |
| /\.hw_rev = ATH11K_HW_IPQ6018_HW10/ {inblk=1} | |
| inblk && /\.rxdma1_enable = true/ {sub(/true/,"false"); inblk=0} | |
| {print} | |
| ' "$ATH" > "$ATH.tmp" && mv "$ATH.tmp" "$ATH" | |
| echo "=== IPQ6018 rxdma1 after patch ===" | |
| grep -n 'IPQ6018_HW10' -A25 "$ATH" | grep 'rxdma1_enable' | |
| - name: Compile Firmware(开始编译固件) | |
| id: compile | |
| run: | | |
| cd $OPENWRT_PATH | |
| echo -e "$(nproc) thread compile" | |
| make -j$(nproc) || make -j1 || make -j1 V=s | |
| echo "status=success" >> $GITHUB_OUTPUT | |
| echo "DATE=$(date +"%Y-%m-%d %H:%M:%S")" >> $GITHUB_ENV | |
| echo "FILE_DATE=$(date +"%Y.%m.%d")" >> $GITHUB_ENV | |
| - name: Verify compiled DTB has the CMA reserved-memory pool | |
| if: always() | |
| run: | | |
| cd $OPENWRT_PATH | |
| DTB=$(find build_dir -name 'image-ipq6000-ax1800.dtb' | head -1) | |
| echo "DTB: $DTB" | |
| DTC=$(find staging_dir build_dir -type f -name dtc 2>/dev/null | head -1) | |
| echo "DTC: $DTC" | |
| if [ -z "$DTB" ] || [ -z "$DTC" ]; then | |
| echo "⚠️ DTB or dtc not found, skipping verify (non-fatal)"; exit 0 | |
| fi | |
| DTS=$("$DTC" -I dtb -O dts "$DTB" 2>/dev/null) | |
| echo "$DTS" | grep -iA8 'reserved-memory' || echo "NO reserved-memory node" | |
| if echo "$DTS" | grep -iE 'wifi_cma|linux,cma-default' >/dev/null; then | |
| echo "✅ CMA pool + cma-default present in DTB" | |
| else | |
| echo "❌ CMA pool MISSING from DTB" | |
| fi | |
| - name: Check Space Usage(检查空间使用情况) | |
| if: (!cancelled()) | |
| run: df -hT | |
| - name: Upload Bin Directory(上传固件) | |
| if: steps.compile.outputs.status == 'success' && env.UPLOAD_BIN_DIR == 'true' | |
| uses: actions/upload-artifact@main | |
| with: | |
| name: ${{ env.SOURCE_REPO }}-bin-${{ env.DEVICE_TARGET }}-${{ env.DEVICE_SUBTARGET }}-${{ env.FILE_DATE }} | |
| path: ${{ env.OPENWRT_PATH }}/bin | |
| - name: Organize Files(整理文件) | |
| if: steps.compile.outputs.status == 'success' | |
| run: | | |
| cd $OPENWRT_PATH/bin/targets/*/* | |
| cat sha256sums | |
| cp $OPENWRT_PATH/.config build.config | |
| # --- rename firmware to include variant + repo --- | |
| TAG="${SOURCE_REPO}-${VARIANT_LABEL}" # e.g. immortalwrt-Wi-Fi | |
| SAFE_TAG="$(printf '%s' "$TAG" | tr -d '\r\n' | sed 's/[^A-Za-z0-9._-]/-/g')" | |
| for f in *xiaomi_ax1800*factory*.ubi *xiaomi_ax1800*sysupgrade*.bin; do | |
| [ -e "$f" ] || continue | |
| # insert the tag right before the file extension | |
| base="${f%.*}"; ext="${f##*.}" | |
| mv "$f" "${base}-${SAFE_TAG}.${ext}" | |
| echo "renamed -> ${base}-${SAFE_TAG}.${ext}" | |
| done | |
| ls -la *.ubi *.bin 2>/dev/null | |
| mkdir -p packages | |
| find "$OPENWRT_PATH/bin/packages" -name "*.ipk" -exec mv {} packages/ \; || true | |
| tar -zcf Packages.tar.gz packages | |
| rm -rf packages feeds.buildinfo version.buildinfo | |
| echo "FIRMWARE_PATH=$PWD" >> $GITHUB_ENV | |
| - name: Upload Firmware To Artifact(将固件上传到Artifact) | |
| if: steps.compile.outputs.status == 'success' && env.FIRMWARE_RELEASE != 'true' | |
| uses: actions/upload-artifact@main | |
| with: | |
| name: ${{ env.SOURCE_REPO }}-firmware-${{ env.DEVICE_TARGET }}-${{ env.DEVICE_SUBTARGET }}-${{ env.FILE_DATE }} | |
| path: ${{ env.FIRMWARE_PATH }} | |
| - name: Upload Firmware To Release(发布固件) | |
| if: steps.compile.outputs.status == 'success' && env.FIRMWARE_RELEASE == 'true' | |
| uses: ncipollo/release-action@v1 | |
| with: | |
| name: R${{ env.DATE }} for ${{ env.FIRMWARE_TAG }} | |
| allowUpdates: true | |
| tag: ${{ env.FIRMWARE_TAG }} | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| artifacts: ${{ env.FIRMWARE_PATH }}/* | |
| body: | | |
| **This is OpenWrt Firmware for ${{ env.FIRMWARE_TAG }}** | |
| ### 📒 Firmware info | |
| **${{ env.CONFIG_DESCRIPTION }}** | |
| - ⚙️ Config: `${{ inputs.config_name }}` | |
| - 🛜 Target: `${{ env.DEVICE_TARGET }}/${{ env.DEVICE_SUBTARGET }}` | |
| - ⚽ Source: ${{ env.REPO_URL }} | |
| - 💝 Branch: `${{ env.REPO_BRANCH }}` | |
| - 🛠️ Built: `${{ env.DATE }}` | |
| - 💻 Platform: ${{ env.FIRMWARE_TAG }} | |
| - 🌐 Default address: 192.168.1.1 | |
| - 🔑 Default password: password | |
| ### 🧊 Firmware version | |
| - Last source update before this build: | |
| - ${{ env.VERSION_INFO }} | |
| - name: Summary | |
| if: always() | |
| run: | | |
| { | |
| echo "## Build ${{ inputs.config_name }}" | |
| echo "- Source: ${REPO_URL}@${REPO_BRANCH}" | |
| echo "- cma= in DTS: $(grep -o 'cma=[0-9]*M' "$OPENWRT_PATH/target/linux/qualcommax/dts/ipq6000-ax1800.dts" 2>/dev/null || echo MISSING)" | |
| echo "- SHA256:"; echo '```'; cat "$FIRMWARE_PATH/sha256sums" 2>/dev/null || echo "no artifacts" | grep -E 'ubi|bin'; echo '```' | |
| echo "=== CMA resolved (kernel .config, after build) ===" | |
| grep -E '^CONFIG_CMA=|^CONFIG_DMA_CMA=' build_dir/target-*/linux-*/linux-*/.config 2>/dev/null || echo "kernel .config not built yet" | |
| } >> "$GITHUB_STEP_SUMMARY" | |