ci(release): also build and attach the Pico W UF2 #22
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 firmware | |
| on: | |
| push: | |
| branches: | |
| - "**" | |
| workflow_dispatch: | |
| env: | |
| PICO_SDK_REF: 2.2.0 | |
| # Pin TinyUSB to the exact commit the local SDK 2.2.0 install ships and that is | |
| # hardware-verified. NOT a tag: the 0.20.0 tag predates the usbd control-transfer | |
| # wLength fixes (e954302c1 / 8a63f9c57) that the MS OS 2.0 descriptor fetch needs; | |
| # building against 0.20.0 makes the MINIMAL USB variant fail to enumerate on | |
| # Windows (Code 10). The SDK 2.2.0 submodule itself pins an even older 0.18.0, so | |
| # we override to this post-0.20.0 commit. | |
| TINYUSB_REF: 08f9855e3dc51291a8c30e2eeccab31f8f07d0a9 | |
| PICO_SDK_PATH: ${{ github.workspace }}/pico-sdk | |
| APT_PACKAGES: >- | |
| cmake | |
| python3 | |
| build-essential | |
| gcc-arm-none-eabi | |
| libnewlib-arm-none-eabi | |
| libstdc++-arm-none-eabi-newlib | |
| ninja-build | |
| jobs: | |
| build: | |
| name: Build UF2 artifacts | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| - name: Set firmware version | |
| run: printf 'FIRMWARE_VERSION=%s\n' "${GITHUB_SHA::7}" >> "$GITHUB_ENV" | |
| - name: Prepare build dependency cache | |
| id: apt-cache | |
| run: | | |
| mkdir -p "$RUNNER_TEMP/apt-cache/partial" | |
| . /etc/os-release | |
| package_hash="$(printf '%s' "$APT_PACKAGES" | sha256sum | cut -d ' ' -f 1)" | |
| echo "dir=$RUNNER_TEMP/apt-cache" >> "$GITHUB_OUTPUT" | |
| echo "os=${ID}-${VERSION_ID}" >> "$GITHUB_OUTPUT" | |
| echo "package-hash=$package_hash" >> "$GITHUB_OUTPUT" | |
| - name: Cache build dependencies | |
| uses: actions/cache@v4 | |
| with: | |
| path: ${{ steps.apt-cache.outputs.dir }} | |
| key: ${{ runner.os }}-${{ runner.arch }}-apt-${{ steps.apt-cache.outputs.os }}-${{ steps.apt-cache.outputs.package-hash }} | |
| restore-keys: | | |
| ${{ runner.os }}-${{ runner.arch }}-apt-${{ steps.apt-cache.outputs.os }}- | |
| - name: Install build dependencies | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get -o Dir::Cache::archives="${{ steps.apt-cache.outputs.dir }}" install --download-only -y $APT_PACKAGES | |
| sudo apt-get -o Dir::Cache::archives="${{ steps.apt-cache.outputs.dir }}" install -y $APT_PACKAGES | |
| sudo chmod -R a+rX "${{ steps.apt-cache.outputs.dir }}" | |
| - name: Cache Pico SDK | |
| id: cache-pico-sdk | |
| uses: actions/cache@v4 | |
| with: | |
| path: ${{ env.PICO_SDK_PATH }} | |
| key: ${{ runner.os }}-${{ runner.arch }}-pico-sdk-${{ env.PICO_SDK_REF }}-tinyusb-${{ env.TINYUSB_REF }} | |
| - name: Download Pico SDK | |
| if: steps.cache-pico-sdk.outputs.cache-hit != 'true' | |
| run: | | |
| git clone --depth 1 --branch "$PICO_SDK_REF" https://github.com/raspberrypi/pico-sdk.git "$PICO_SDK_PATH" | |
| git -C "$PICO_SDK_PATH" submodule update --init --recursive | |
| - name: Switch TinyUSB to pinned commit | |
| run: | | |
| if ! git -C "$PICO_SDK_PATH/lib/tinyusb" cat-file -e "$TINYUSB_REF^{commit}" 2>/dev/null; then | |
| git -C "$PICO_SDK_PATH/lib/tinyusb" fetch --depth 1 origin "$TINYUSB_REF" | |
| fi | |
| git -C "$PICO_SDK_PATH/lib/tinyusb" checkout --detach "$TINYUSB_REF" | |
| - name: Build standard firmware | |
| run: | | |
| cmake -S . -B build/standard -G Ninja \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DPICO_SDK_PATH="$PICO_SDK_PATH" \ | |
| -DVERSION="$FIRMWARE_VERSION" | |
| cmake --build build/standard --target ds5-bridge | |
| mkdir -p artifacts | |
| cp build/standard/ds5-bridge.uf2 artifacts/ds5-bridge.uf2 | |
| - name: Build verbose-diagnostics firmware | |
| # Verbose UART logging (GP0 TX, 115200 8N1). No USB serial -- diagnostics | |
| # are UART-only so they don't perturb the USB audio timing. | |
| run: | | |
| cmake -S . -B build/debug -G Ninja \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DPICO_SDK_PATH="$PICO_SDK_PATH" \ | |
| -DENABLE_VERBOSE=ON \ | |
| -DVERSION="$FIRMWARE_VERSION" | |
| cmake --build build/debug --target ds5-bridge | |
| cp build/debug/ds5-bridge.uf2 artifacts/ds5-bridge-debug.uf2 | |
| - name: Build Waveshare RP2350B-Plus-W firmware | |
| # USB-C / 16MB-flash Pico 2 W alternative. Different RM2 GPIO wiring + | |
| # forced boot2 XIP setup for its Puya flash (see CMakeLists.txt). This is | |
| # a shipped release artifact (see release.yml), so guard it on every push. | |
| run: | | |
| cmake -S . -B build/waveshare -G Ninja \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DPICO_SDK_PATH="$PICO_SDK_PATH" \ | |
| -DWAVESHARE_RP2350B_PLUS_W_BUILD=ON \ | |
| -DVERSION="$FIRMWARE_VERSION" | |
| cmake --build build/waveshare --target ds5-bridge | |
| cp build/waveshare/ds5-bridge.uf2 artifacts/ds5-bridge-waveshare.uf2 | |
| - name: Build no-batt-led firmware (compile check only) | |
| # Also flips ENABLE_WAKE_LINK=ON here (C1): wake_link.cpp compiles under | |
| # no other job, so a refactor of wake.cpp / wake_link.h could silently | |
| # rot it. Folding it onto this compile-check job guards it without a | |
| # whole new matrix entry. | |
| run: | | |
| cmake -S . -B build/no-batt-led -G Ninja \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DPICO_SDK_PATH="$PICO_SDK_PATH" \ | |
| -DENABLE_BATT_LED=OFF \ | |
| -DENABLE_WAKE_LINK=ON \ | |
| -DVERSION="$FIRMWARE_VERSION" | |
| cmake --build build/no-batt-led --target ds5-bridge | |
| - name: Build no-wake firmware (compile check only) | |
| # ENABLE_WAKE_HID=ON is the default, so building it OFF is the useful | |
| # guard: it excludes wake.cpp + the dynamic MINIMAL/FULL descriptor and | |
| # host-suspend machinery, so a cleanup can silently break that path | |
| # unless something compiles it. | |
| run: | | |
| cmake -S . -B build/no-wake -G Ninja \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DPICO_SDK_PATH="$PICO_SDK_PATH" \ | |
| -DENABLE_WAKE_HID=OFF \ | |
| -DVERSION="$FIRMWARE_VERSION" | |
| cmake --build build/no-wake --target ds5-bridge | |
| - name: Build no-wifi firmware (compile check only) | |
| # ENABLE_WIFI_WOL=OFF excludes the largest #ifdef region: wifi_net.cpp, | |
| # web_api.cpp, lwIP, the portal and mDNS. Nothing ships this, but it must | |
| # compile so cleanups to the WiFi path can't rot the excluded branch. | |
| run: | | |
| cmake -S . -B build/no-wifi -G Ninja \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DPICO_SDK_PATH="$PICO_SDK_PATH" \ | |
| -DENABLE_WIFI_WOL=OFF \ | |
| -DVERSION="$FIRMWARE_VERSION" | |
| cmake --build build/no-wifi --target ds5-bridge | |
| - name: Build Pico W firmware | |
| run: | | |
| cmake -S . -B build/picow -G Ninja \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DPICO_SDK_PATH="$PICO_SDK_PATH" \ | |
| -DPICO_W_BUILD=ON \ | |
| -DVERSION="$FIRMWARE_VERSION" | |
| cmake --build build/picow --target ds5-bridge | |
| cp build/picow/ds5-bridge.uf2 artifacts/ds5-bridge-picow.uf2 | |
| - name: Upload standard UF2 artifact | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| path: artifacts/ds5-bridge.uf2 | |
| archive: false | |
| if-no-files-found: error | |
| - name: Upload Debug UF2 artifact | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| path: artifacts/ds5-bridge-debug.uf2 | |
| archive: false | |
| if-no-files-found: error | |
| - name: Upload Waveshare UF2 artifact | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| path: artifacts/ds5-bridge-waveshare.uf2 | |
| archive: false | |
| if-no-files-found: error | |
| - name: Upload PicoW UF2 artifact | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| path: artifacts/ds5-bridge-picow.uf2 | |
| archive: false | |
| if-no-files-found: error |