diff --git a/.codespellrc b/.codespellrc new file mode 100644 index 0000000..8271b9f --- /dev/null +++ b/.codespellrc @@ -0,0 +1,3 @@ +[codespell] +ignore-words-list = bloc,ser,dout,exten +write-changes = false diff --git a/.cz.toml b/.cz.toml new file mode 100644 index 0000000..766d1f0 --- /dev/null +++ b/.cz.toml @@ -0,0 +1,21 @@ +[tool.commitizen] +version = "0.0.0" +update_changelog_on_bump = true +tag_format = "v$version" +changelog_start_rev = "v0.0" +changelog_merge_prerelease = true +annotated_tag = true +bump_message = "change: Update version to $new_version" +change_type_order = [ + "BREAKING CHANGE", + "New Features", + "Bug Fixes", + "Code Refactoring", + "Performance Improvements" +] + +[tool.commitizen.change_type_map] +feat = "New Features" +fix = "Bug Fixes" +refactor = "Code Refactoring" +perf = "Performance Improvements" diff --git a/.github/workflows/build_and_release.yml b/.github/workflows/build_and_release.yml new file mode 100644 index 0000000..73cb062 --- /dev/null +++ b/.github/workflows/build_and_release.yml @@ -0,0 +1,75 @@ +name: Build and release + +on: [push] + +jobs: + build_stubs: + runs-on: ubuntu-latest + + steps: + - name: Checkout ref commit + uses: actions/checkout@master + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install esptool + + - name: Build stub + run: | + export TOOLCHAIN_DIR=$HOME/toolchain + + export ESP8266_BINDIR=$TOOLCHAIN_DIR/xtensa-lx106-elf/bin + export ESP32_BINDIR=$TOOLCHAIN_DIR/xtensa-esp32-elf/bin + export ESP32S2_BINDIR=$TOOLCHAIN_DIR/xtensa-esp32s2-elf/bin + export ESP32S3_BINDIR=$TOOLCHAIN_DIR/xtensa-esp32s3-elf/bin + export ESP32C3_BINDIR=$TOOLCHAIN_DIR/riscv32-esp-elf/bin + + export PATH=$PATH:$ESP8266_BINDIR:$ESP32_BINDIR:$ESP32S2_BINDIR:$ESP32S3_BINDIR:$ESP32C3_BINDIR + + ./ci/setup_ci_build_env.sh + make -C flasher_stub V=1 + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + path: flasher_stub/build/esp*.json + if-no-files-found: error + retention-days: 3 + + create_release: + name: Create GitHub release + if: startsWith(github.ref, 'refs/tags/') && !(contains(github.ref_name, 'dev')) + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Get version + id: get_version + run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT + shell: bash + - name: Checkout + uses: actions/checkout@master + with: + fetch-depth: 0 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install --user commitizen + - name: Generate changelog + run: | + cz changelog ${{ steps.get_version.outputs.VERSION }} --template ci/gh_changelog_template.md.j2 --file-name changelog_body.md + cat changelog_body.md + - name: Download artifact + uses: actions/download-artifact@v4 + - name: Create release + id: create_release + uses: softprops/action-gh-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + body_path: changelog_body.md + name: Version ${{ steps.get_version.outputs.VERSION }} + draft: true + prerelease: false + files: esp*.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..17fc34f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +flasher_stub/build/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..5570e40 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,12 @@ +repos: + - repo: https://github.com/codespell-project/codespell + rev: v2.2.5 + hooks: + - id: codespell + - repo: https://github.com/espressif/conventional-precommit-linter + rev: v1.4.0 + hooks: + - id: conventional-precommit-linter + stages: [commit-msg] +default_stages: [commit] +default_install_hook_types: [pre-commit, commit-msg] diff --git a/ci/gh_changelog_template.md.j2 b/ci/gh_changelog_template.md.j2 new file mode 100644 index 0000000..5dc2df5 --- /dev/null +++ b/ci/gh_changelog_template.md.j2 @@ -0,0 +1,28 @@ +{# This changelog template is used for automatically generated GH release notes. #} +{# It is passed to commitizen's --template option in a GH Actions workflow run. #} + +{% for entry in tree %} + +{% for change_key, changes in entry.changes.items() %} + +{% if change_key %} +### {{ change_key }} +{% endif %} + +{% for change in changes %} +{% if change.scope %} +- **{{ change.scope }}**: {{ change.message }} +{% elif change.message %} +- {{ change.message }} +{% endif %} +{% endfor %} +{% endfor %} +{% endfor %} + +Thanks to , and others for contributing to this release! + +# Results of checking the release against common anti-virus SW + + + +The failures are probably false positives. You can mark esptool as safe in your anti-virus SW, or [install esptool from source](https://docs.espressif.com/projects/esptool/en/latest/installation.html). diff --git a/ci/setup_ci_build_env.sh b/ci/setup_ci_build_env.sh new file mode 100755 index 0000000..178bd0e --- /dev/null +++ b/ci/setup_ci_build_env.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +set -exuo pipefail + +ESP8266_TOOLCHAIN_URL="https://dl.espressif.com/dl/xtensa-lx106-elf-linux64-1.22.0-92-g8facf4c-5.2.0.tar.gz" +ESP32_TOOLCHAIN_URL="https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32-elf-gcc11_2_0-esp-2022r1-linux-amd64.tar.xz" +ESP32S2_TOOLCHAIN_URL="https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s2-elf-gcc11_2_0-esp-2022r1-linux-amd64.tar.xz" +ESP32S3_TOOLCHAIN_URL="https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/xtensa-esp32s3-elf-gcc11_2_0-esp-2022r1-linux-amd64.tar.xz" +ESP32C3_TOOLCHAIN_URL="https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-linux-amd64.tar.xz" + +# Setup shell script to download & configure ESP8266 & ESP32 toolchains +# for building the flasher stub program + +mkdir -p ${TOOLCHAIN_DIR} +cd ${TOOLCHAIN_DIR} + +if ! [ -d ${ESP8266_BINDIR} ]; then + wget --continue --no-verbose "${ESP8266_TOOLCHAIN_URL}" + tar zxf $(basename ${ESP8266_TOOLCHAIN_URL}) +fi + +if ! [ -d ${ESP32_BINDIR} ]; then + # gitlab CI image may already have this file + wget --continue --no-verbose "${ESP32_TOOLCHAIN_URL}" + tar Jxf $(basename ${ESP32_TOOLCHAIN_URL}) +fi + +if ! [ -d ${ESP32S2_BINDIR} ]; then + # gitlab CI image may already have this file + wget --continue --no-verbose "${ESP32S2_TOOLCHAIN_URL}" + tar Jxf $(basename ${ESP32S2_TOOLCHAIN_URL}) +fi + +if ! [ -d ${ESP32S3_BINDIR} ]; then + # gitlab CI image may already have this file + wget --continue --no-verbose "${ESP32S3_TOOLCHAIN_URL}" + tar Jxf $(basename ${ESP32S3_TOOLCHAIN_URL}) +fi + +if ! [ -d ${ESP32C3_BINDIR} ]; then + # gitlab CI image may already have this file + wget --continue --no-verbose "${ESP32C3_TOOLCHAIN_URL}" + tar Jxf $(basename ${ESP32C3_TOOLCHAIN_URL}) +fi diff --git a/flasher_stub/Makefile b/flasher_stub/Makefile index 1d78f4d..0eeb7f9 100644 --- a/flasher_stub/Makefile +++ b/flasher_stub/Makefile @@ -50,27 +50,27 @@ ifneq ("$(V)","1") Q = @ endif -STUB = stub_flasher +STUB = esp SRCS = stub_flasher.c slip.c stub_commands.c stub_write_flash.c stub_io.c SRCS_8266 = miniz.c BUILD_DIR = build -ESPTOOL_STUBS_DIR = ../esptool/targets/stub_flasher - -STUB_ELF_8266 = $(BUILD_DIR)/$(STUB)_8266.elf -STUB_ELF_32 = $(BUILD_DIR)/$(STUB)_32.elf -STUB_ELF_32S2 = $(BUILD_DIR)/$(STUB)_32s2.elf -STUB_ELF_32S3_BETA_2 = $(BUILD_DIR)/$(STUB)_32s3beta2.elf -STUB_ELF_32S3 = $(BUILD_DIR)/$(STUB)_32s3.elf -STUB_ELF_32C3 = $(BUILD_DIR)/$(STUB)_32c3.elf -STUB_ELF_32C6BETA = $(BUILD_DIR)/$(STUB)_32c6beta.elf -STUB_ELF_32H2_BETA_1 = $(BUILD_DIR)/$(STUB)_32h2beta1.elf -STUB_ELF_32H2_BETA_2 = $(BUILD_DIR)/$(STUB)_32h2beta2.elf -STUB_ELF_32C2 = $(BUILD_DIR)/$(STUB)_32c2.elf -STUB_ELF_32C6 = $(BUILD_DIR)/$(STUB)_32c6.elf -STUB_ELF_32C5_BETA_3 = $(BUILD_DIR)/$(STUB)_32c5beta3.elf -STUB_ELF_32H2 = $(BUILD_DIR)/$(STUB)_32h2.elf -STUB_ELF_32P4 = $(BUILD_DIR)/$(STUB)_32p4.elf +ESPTOOL_STUBS_DIR = .. + +STUB_ELF_8266 = $(BUILD_DIR)/$(STUB)8266.elf +STUB_ELF_32 = $(BUILD_DIR)/$(STUB)32.elf +STUB_ELF_32S2 = $(BUILD_DIR)/$(STUB)32s2.elf +STUB_ELF_32S3_BETA_2 = $(BUILD_DIR)/$(STUB)32s3beta2.elf +STUB_ELF_32S3 = $(BUILD_DIR)/$(STUB)32s3.elf +STUB_ELF_32C3 = $(BUILD_DIR)/$(STUB)32c3.elf +STUB_ELF_32C6BETA = $(BUILD_DIR)/$(STUB)32c6beta.elf +STUB_ELF_32H2_BETA_1 = $(BUILD_DIR)/$(STUB)32h2beta1.elf +STUB_ELF_32H2_BETA_2 = $(BUILD_DIR)/$(STUB)32h2beta2.elf +STUB_ELF_32C2 = $(BUILD_DIR)/$(STUB)32c2.elf +STUB_ELF_32C6 = $(BUILD_DIR)/$(STUB)32c6.elf +STUB_ELF_32C5_BETA_3 = $(BUILD_DIR)/$(STUB)32c5beta3.elf +STUB_ELF_32H2 = $(BUILD_DIR)/$(STUB)32h2.elf +STUB_ELF_32P4 = $(BUILD_DIR)/$(STUB)32p4.elf STUBS_ELF = ifneq ($(WITHOUT_ESP8266),1) diff --git a/flasher_stub/compare_stubs.py b/flasher_stub/compare_stubs.py deleted file mode 100755 index 74843f0..0000000 --- a/flasher_stub/compare_stubs.py +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/env python -# -# SPDX-FileCopyrightText: 2014-2022 Fredrik Ahlberg, Angus Gratton, -# Espressif Systems (Shanghai) CO LTD, other contributors as noted. -# -# SPDX-License-Identifier: GPL-2.0-or-later - -import os -import sys - -import esptool - -# Compare the esptool stub loaders to freshly built ones in the build directory -# -# (Used by CI to verify the stubs are up to date.) - -THIS_SCRIPT_DIR = os.path.dirname(__file__) -STUB_DIR = "../esptool/targets/stub_flasher/" -BUILD_DIR = "build/" -JSON_NAME = "stub_flasher_{}.json" - - -def diff(path_to_new, path_to_old): - output = "" - new = esptool.loader.StubFlasher(path_to_new) - old = esptool.loader.StubFlasher(path_to_old) - - if new.data_start != old.data_start: - output += " Data start: New {:#x}, old {:#x} \n".format( - new.data_start, old.data_start - ) - if new.text_start != old.text_start: - output += " Text start: New {:#x}, old {:#x} \n".format( - new.text_start, old.text_start - ) - if new.entry != old.entry: - output += " Entrypoint: New {:#x}, old {:#x} \n".format(new.entry, old.entry) - - # data - if new.data != old.data: - if len(new.data) == len(old.data): - for i, (new_b, old_b) in enumerate(zip(new.data, old.data)): - if new_b != old_b: - output += " Data byte {:#x}: new {:#04x} old {:#04x} \n".format( - i, new_b, old_b - ) - else: - output += " Data length: New {} bytes, old {} bytes \n".format( - len(new.data), len(old.data) - ) - - # text - if new.text != old.text: - if len(new.text) == len(old.text): - for i, (new_b, old_b) in enumerate(zip(new.text, old.text)): - if new_b != old_b: - output += " Text byte {:#x}: new {:#04x} old {:#04x} \n".format( - i, new_b, old_b - ) - else: - output += " Text length: New {} bytes, old {} bytes \n".format( - len(new.text), len(old.text) - ) - return output - - -if __name__ == "__main__": - same = True - for chip in esptool.CHIP_LIST: - print("Comparing {} stub: ".format(chip), end="") - # TODO: [ESP32C5] ESPTOOL-825 remove when supported stub flasher - # TODO: [ESP32C61] IDF-9241 remove when supported stub flasher - if chip in ["esp32c5", "esp32c61"]: - print(f"{chip} has not supported stub yet, skipping...") - continue - - chip = chip.replace("esp", "") - old = os.path.join(THIS_SCRIPT_DIR, STUB_DIR, JSON_NAME.format(chip)) - new = os.path.join(THIS_SCRIPT_DIR, BUILD_DIR, JSON_NAME.format(chip)) - - output = diff(new, old) - if output != "": - same = False - print("FAIL") - print( - " Mismatch: {} json file in esptool/targets/stub_flasher/ differs " - "from the just-built stub".format("esp" + chip) - ) - print(output) - else: - print("OK") - - if not same: - sys.exit(1) - else: - print("Stub flasher json files are the same") - sys.exit(0)