diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 00000000..7f8653b0
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,180 @@
+name: 'Build'
+
+on: push
+
+env:
+ TARGETS: f6
+
+jobs:
+ build:
+ runs-on: [self-hosted]
+ steps:
+ - name: 'Cleanup workspace'
+ uses: AutoModality/action-clean@v1
+
+ - name: 'Decontaminate previous build leftovers'
+ run: |
+ git submodule status \
+ || git checkout `git rev-list --max-parents=0 HEAD | tail -n 1`
+
+ - name: 'Checkout code'
+ uses: actions/checkout@v2
+ with:
+ fetch-depth: 0
+ submodules: true
+
+ - name: 'Docker cache'
+ uses: satackey/action-docker-layer-caching@v0.0.11
+ continue-on-error: true
+ with:
+ key: docker-cache-${{ hashFiles('docker/**') }}-{hash}
+ restore-keys: docker-cache-${{ hashFiles('docker/**') }}-
+
+ - name: 'Build docker image'
+ uses: ./.github/actions/docker
+
+ - name: 'Make artifacts directory'
+ run: |
+ test -d artifacts && rm -rf artifacts || true
+ mkdir artifacts
+
+ - name: 'Generate tag suffix'
+ if: startsWith(github.ref, 'refs/tags/') == true
+ run: echo "SUFFIX=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
+
+ - name: 'Generate branch suffix'
+ if: startsWith(github.ref, 'refs/tags/') != true
+ run: echo "SUFFIX=$(date +'%Y-%m-%d')-$(git rev-parse --short HEAD)" >> $GITHUB_ENV
+
+ - name: 'Build bootloader in docker'
+ uses: ./.github/actions/docker
+ with:
+ run: |
+ for TARGET in ${TARGETS}
+ do
+ make -j$(nproc) -C bootloader TARGET=${TARGET}
+ done
+
+ - name: 'Generate dfu file for bootloader'
+ uses: ./.github/actions/docker
+ with:
+ run: |
+ for TARGET in ${TARGETS}
+ do
+ hex2dfu \
+ -i bootloader/.obj/${TARGET}/bootloader.hex \
+ -o bootloader/.obj/${TARGET}/bootloader.dfu
+ done
+
+ - name: 'Build firmware in docker'
+ uses: ./.github/actions/docker
+ with:
+ run: |
+ for TARGET in ${TARGETS}
+ do
+ make -j$(nproc) -C firmware TARGET=${TARGET}
+ done
+
+ - name: 'Generate dfu file for firmware'
+ uses: ./.github/actions/docker
+ with:
+ run: |
+ for TARGET in ${TARGETS}
+ do
+ hex2dfu \
+ -i firmware/.obj/${TARGET}/firmware.hex \
+ -o firmware/.obj/${TARGET}/firmware.dfu
+ done
+
+ - name: 'Generate full hex file'
+ uses: ./.github/actions/docker
+ with:
+ run: |
+ for TARGET in ${TARGETS}
+ do
+ srec_cat \
+ bootloader/.obj/${TARGET}/bootloader.hex -Intel \
+ firmware/.obj/${TARGET}/firmware.hex -Intel \
+ -o firmware/.obj/${TARGET}/full.hex -Intel
+ done
+
+ - name: 'Move upload files'
+ uses: ./.github/actions/docker
+ with:
+ run: |
+ for TARGET in ${TARGETS}
+ do
+ mv bootloader/.obj/${TARGET}/bootloader.dfu \
+ artifacts/flipper-z-${TARGET}-bootloader-${SUFFIX}.dfu
+ mv bootloader/.obj/${TARGET}/bootloader.bin \
+ artifacts/flipper-z-${TARGET}-bootloader-${SUFFIX}.bin
+ mv bootloader/.obj/${TARGET}/bootloader.elf \
+ artifacts/flipper-z-${TARGET}-bootloader-${SUFFIX}.elf
+ mv firmware/.obj/${TARGET}/firmware.dfu \
+ artifacts/flipper-z-${TARGET}-firmware-${SUFFIX}.dfu
+ mv firmware/.obj/${TARGET}/firmware.bin \
+ artifacts/flipper-z-${TARGET}-firmware-${SUFFIX}.bin
+ mv firmware/.obj/${TARGET}/firmware.elf \
+ artifacts/flipper-z-${TARGET}-firmware-${SUFFIX}.elf
+ done
+
+ - name: 'Generate full dfu file'
+ uses: ./.github/actions/docker
+ with:
+ run: |
+ for TARGET in ${TARGETS}
+ do
+ hex2dfu \
+ -i firmware/.obj/${TARGET}/full.hex \
+ -o artifacts/flipper-z-${TARGET}-full-${SUFFIX}.dfu
+ done
+
+ - name: 'Full flash asssembly: bootloader as base'
+ run: |
+ for TARGET in ${TARGETS}
+ do
+ cp \
+ artifacts/flipper-z-${TARGET}-bootloader-${SUFFIX}.bin \
+ artifacts/flipper-z-${TARGET}-full-${SUFFIX}.bin
+ done
+
+ - name: 'Full flash asssembly: bootloader padding'
+ run: |
+ for TARGET in ${TARGETS}
+ do
+ truncate -s 32768 artifacts/flipper-z-${TARGET}-full-${SUFFIX}.bin
+ done
+
+ - name: 'Full flash asssembly: append firmware'
+ run: |
+ for TARGET in ${TARGETS}
+ do
+ cat \
+ artifacts/flipper-z-${TARGET}-firmware-${SUFFIX}.bin \
+ >> artifacts/flipper-z-${TARGET}-full-${SUFFIX}.bin
+ done
+
+ - name: 'Publish artifacts'
+ uses: actions/upload-artifact@v2
+ with:
+ name: artifacts
+ path: artifacts/*
+ if-no-files-found: error
+ retention-days: 7
+
+ - name: 'Upload artifacts to update server'
+ uses: burnett01/rsync-deployments@4.1
+ with:
+ switches: -avzP --delete
+ path: artifacts/
+ remote_path: "${{ secrets.RSYNC_DEPLOY_BASE_PATH }}${GITHUB_REF##*/}/"
+ remote_host: ${{ secrets.RSYNC_DEPLOY_HOST }}
+ remote_port: ${{ secrets.RSYNC_DEPLOY_PORT }}
+ remote_user: ${{ secrets.RSYNC_DEPLOY_USER }}
+ remote_key: ${{ secrets.RSYNC_DEPLOY_KEY }}
+
+ - name: 'Trigger update server reindex'
+ uses: wei/curl@master
+ with:
+ args: -X POST -F 'key=${{ secrets.REINDEX_KEY }}' ${{ secrets.REINDEX_URL }}
+
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
deleted file mode 100644
index d5108a59..00000000
--- a/.github/workflows/ci.yml
+++ /dev/null
@@ -1,177 +0,0 @@
-name: 'CI'
-
-on: push
-
-env:
- TARGETS: f6
-
-jobs:
- build:
- runs-on: [self-hosted]
- steps:
- - name: Cleanup workspace
- uses: AutoModality/action-clean@v1
-
- - name: Checkout code
- uses: actions/checkout@v2
- with:
- fetch-depth: 0
- - name: Checkout submodules
- run: git submodule update --init --recursive
- - name: Checkout submodules
- run: git submodule sync
-
- - uses: satackey/action-docker-layer-caching@v0.0.11
- continue-on-error: true
- with:
- key: docker-cache-${{ hashFiles('docker/**') }}-{hash}
- restore-keys: docker-cache-${{ hashFiles('docker/**') }}-
- - name: Build docker image
- uses: ./.github/actions/docker
-
- - name: Check syntax
- uses: ./.github/actions/docker
- continue-on-error: false
- with:
- run: /syntax_check.sh
-
- - name: Build bootloader in docker
- uses: ./.github/actions/docker
- with:
- run: for TARGET in ${TARGETS}; do make -j$(nproc) -C bootloader TARGET=${TARGET}; done
-
- - name: Generate dfu file for bootloader
- uses: ./.github/actions/docker
- with:
- run: for TARGET in ${TARGETS}; do hex2dfu -i bootloader/.obj/${TARGET}/bootloader.hex -o bootloader/.obj/${TARGET}/bootloader.dfu; done
-
- - name: Build firmware in docker
- uses: ./.github/actions/docker
- with:
- run: for TARGET in ${TARGETS}; do make -j$(nproc) -C firmware TARGET=${TARGET}; done
-
- - name: Generate dfu file for firmware
- uses: ./.github/actions/docker
- with:
- run: for TARGET in ${TARGETS}; do hex2dfu -i firmware/.obj/${TARGET}/firmware.hex -o firmware/.obj/${TARGET}/firmware.dfu; done
-
- - name: Generate full hex file
- uses: ./.github/actions/docker
- with:
- run: |
- for TARGET in ${TARGETS}; do
- srec_cat bootloader/.obj/${TARGET}/bootloader.hex -Intel firmware/.obj/${TARGET}/firmware.hex -Intel -o ${TARGET}_full.hex -Intel
- done
-
- - name: Move upload files
- uses: ./.github/actions/docker
- with:
- run: |
- for TARGET in ${TARGETS}; do
- mv bootloader/.obj/${TARGET}/bootloader.dfu ${TARGET}_bootloader.dfu
- mv bootloader/.obj/${TARGET}/bootloader.bin ${TARGET}_bootloader.bin
- mv bootloader/.obj/${TARGET}/bootloader.elf ${TARGET}_bootloader.elf
- mv firmware/.obj/${TARGET}/firmware.dfu ${TARGET}_firmware.dfu
- mv firmware/.obj/${TARGET}/firmware.bin ${TARGET}_firmware.bin
- mv firmware/.obj/${TARGET}/firmware.elf ${TARGET}_firmware.elf
- done
-
- - name: Generate full dfu file
- uses: ./.github/actions/docker
- with:
- run: for TARGET in ${TARGETS}; do hex2dfu -i ${TARGET}_full.hex -o ${TARGET}_full.dfu; done
-
- - name: Copy bootloader for full.bin
- run: for TARGET in ${TARGETS}; do cp ${TARGET}_bootloader.bin ${TARGET}_full.bin; done
- - name: Truncate full.bin
- run: for TARGET in ${TARGETS}; do truncate -s 32768 ${TARGET}_full.bin; done
- - name: Add firmware.bin at full.bin
- run: for TARGET in ${TARGETS}; do cat ${TARGET}_firmware.bin >> ${TARGET}_full.bin; done
-
- - name: Copy last target to full.dfu
- run: cp ${TARGETS##*" "}_full.dfu full.dfu
-
- - name: Publish artifacts
- uses: actions/upload-artifact@v2
- with:
- name: artifacts
- path: |
- *_bootloader.dfu
- *_bootloader.bin
- *_firmware.dfu
- *_firmware.bin
- *_full.dfu
- *_full.bin
- full.dfu
- if-no-files-found: error
- retention-days: 7
-
- upload:
- name: Upload artifacts to external storage
- needs: build
- runs-on: [self-hosted]
- steps:
-
- - name: Make empty dir
- run: mkdir -p empty
-
- - name: Clear upload dir
- uses: burnett01/rsync-deployments@4.1
- with:
- switches: -cvzr --delete
- path: empty/
- remote_path: "${{ secrets.RSYNC_DEPLOY_BASE_PATH }}${GITHUB_REF##*/}/"
- remote_host: ${{ secrets.RSYNC_DEPLOY_HOST }}
- remote_port: ${{ secrets.RSYNC_DEPLOY_PORT }}
- remote_user: ${{ secrets.RSYNC_DEPLOY_USER }}
- remote_key: ${{ secrets.RSYNC_DEPLOY_KEY }}
-
- - name: Generate files list
- run: ls *_bootloader.dfu *_firmware.dfu *_full.dfu *_bootloader.bin *_firmware.bin *_full.bin *_bootloader.elf *_firmware.elf full.dfu > uploadlist.txt
-
- - name: Upload artifacts
- uses: burnett01/rsync-deployments@4.1
- with:
- switches: -cvzr --delete --files-from=uploadlist.txt
- remote_path: "${{ secrets.RSYNC_DEPLOY_BASE_PATH }}${GITHUB_REF##*/}/"
- remote_host: ${{ secrets.RSYNC_DEPLOY_HOST }}
- remote_port: ${{ secrets.RSYNC_DEPLOY_PORT }}
- remote_user: ${{ secrets.RSYNC_DEPLOY_USER }}
- remote_key: ${{ secrets.RSYNC_DEPLOY_KEY }}
-
- - name: Trigger reindex
- uses: wei/curl@master
- with:
- args: -X POST -F 'key=${{ secrets.REINDEX_KEY }}' ${{ secrets.REINDEX_URL }}
-
- genpic:
- name: Generate pic
- needs: upload
- if: github.ref == 'refs/heads/release'
- runs-on: [self-hosted]
- steps:
- - name: Set test env
- run: echo "NUMBER_OF_COMMITS=$(git rev-list --count HEAD)" >> $GITHUB_ENV
- - name: Test output NUMBER_OF_COMMITS
- run: echo $NUMBER_OF_COMMITS
- - name: Test output date
- run: |
- GET_DATE=$(date +"%b %d")
- PREP_DATE=$(echo "${GET_DATE^^}")
- echo "PREP_DATE=$PREP_DATE" >> $GITHUB_ENV
- - name: Test output PREP_DATE
- run: echo $PREP_DATE
- - name: Gen pic
- uses: ./.github/actions/docker
- with:
- run: convert ./.github/assets/latest-firmware-template.png -font ./.github/assets/Born2bSportyV2.ttf -weight 700 -pointsize 140 -annotate +900+330 "$NUMBER_OF_COMMITS $PREP_DATE" latest-firmware-banner.png
- - name: Upload pic
- uses: burnett01/rsync-deployments@4.1
- with:
- switches: -avzp --delete
- path: latest-firmware-banner.png
- remote_path: "${{ secrets.RSYNC_DEPLOY_BASE_PATH }}/"
- remote_host: ${{ secrets.RSYNC_DEPLOY_HOST }}
- remote_port: ${{ secrets.RSYNC_DEPLOY_PORT }}
- remote_user: ${{ secrets.RSYNC_DEPLOY_USER }}
- remote_key: ${{ secrets.RSYNC_DEPLOY_KEY }}
diff --git a/.github/workflows/lint_c.yml b/.github/workflows/lint_c.yml
new file mode 100644
index 00000000..e1955a7e
--- /dev/null
+++ b/.github/workflows/lint_c.yml
@@ -0,0 +1,40 @@
+name: 'Lint C/C++ with clang-format'
+
+on: push
+
+env:
+ TARGETS: f6
+
+jobs:
+ lint_c_cpp:
+ runs-on: [self-hosted]
+ steps:
+ - name: 'Cleanup workspace'
+ uses: AutoModality/action-clean@v1
+
+ - name: 'Checkout code'
+ uses: actions/checkout@v2
+ with:
+ fetch-depth: 0
+
+ - name: 'Checkout submodules: update'
+ run: git submodule update --init --recursive
+
+ - name: 'Checkout submodules: sync'
+ run: git submodule sync
+
+ - name: 'Docker cache'
+ uses: satackey/action-docker-layer-caching@v0.0.11
+ continue-on-error: true
+ with:
+ key: docker-cache-${{ hashFiles('docker/**') }}-{hash}
+ restore-keys: docker-cache-${{ hashFiles('docker/**') }}-
+
+ - name: 'Build docker image'
+ uses: ./.github/actions/docker
+
+ - name: 'Check syntax'
+ uses: ./.github/actions/docker
+ continue-on-error: false
+ with:
+ run: /syntax_check.sh
diff --git a/.github/workflows/black.yml b/.github/workflows/lint_python.yml
similarity index 85%
rename from .github/workflows/black.yml
rename to .github/workflows/lint_python.yml
index c16e972e..dc0fefd1 100644
--- a/.github/workflows/black.yml
+++ b/.github/workflows/lint_python.yml
@@ -1,13 +1,13 @@
-name: Python Lint
+name: 'Python Lint'
on:
push:
paths:
- '**.py'
pull_request:
-
+
jobs:
- lint:
+ lint_python:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
diff --git a/.github/workflows/reindex.yml b/.github/workflows/reindex.yml
new file mode 100644
index 00000000..56971eec
--- /dev/null
+++ b/.github/workflows/reindex.yml
@@ -0,0 +1,15 @@
+name: 'Reindex'
+
+on:
+ release:
+ types: [prereleased,released]
+
+jobs:
+ reindex:
+ name: 'Reindex updates'
+ runs-on: [self-hosted]
+ steps:
+ - name: Trigger reindex
+ uses: wei/curl@master
+ with:
+ args: -X POST -F 'key=${{ secrets.REINDEX_KEY }}' ${{ secrets.REINDEX_URL }}
diff --git a/ReadMe.md b/ReadMe.md
index beedd496..5b26bd81 100644
--- a/ReadMe.md
+++ b/ReadMe.md
@@ -10,12 +10,12 @@ This repo will become completely public closer to the device shipping date.
# Update firmware
-
+Get Latest Firmware from Update Server
Flipper Zero's firmware consists of three components:
-- Core2 firmware - proprietary componenets by ST: FUS + radio stack.
+- Core2 firmware set - proprietary componenets by ST: FUS + radio stack.
- Core1 Bootloader - controls basic hardware initialization and loads firmware
- Core1 Firmware - HAL + OS + Drivers + Applications
@@ -46,7 +46,7 @@ One liner: `./flash_core1_main.sh`
## With USB DFU
-1. Download latest [Firmware](https://update.flipperzero.one/release/full.dfu)
+1. Download latest [Firmware](https://update.flipperzero.one)
2. Reboot Flipper to Bootloader
- Press and hold `← Left` + `↩ Back` for reset