From c2a4d011810fd3aef6084e1be2f199e8e6057ccf Mon Sep 17 00:00:00 2001 From: Dustin Butler Date: Sun, 5 Jan 2025 14:40:35 -0700 Subject: [PATCH 1/3] Build images with Docker and Flash --- .dockerignore | 2 + Dockerfile | 12 +++ image-factory/.gitignore | 2 + image-factory/Dockerfile-expressif | 16 ++++ image-factory/README.md | 52 +++++++++++++ image-factory/build-images.sh | 116 +++++++++++++++++++++++++++++ image-factory/image-1.png | Bin 0 -> 15028 bytes src/components/LandingHero.tsx | 32 +++++++- src/lib/types.ts | 21 +++++- 9 files changed, 251 insertions(+), 2 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 image-factory/.gitignore create mode 100644 image-factory/Dockerfile-expressif create mode 100644 image-factory/README.md create mode 100755 image-factory/build-images.sh create mode 100644 image-factory/image-1.png diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..e060e97 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +Dockerfile +image-factory \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..25ae5d7 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM node:latest + +WORKDIR /app + +COPY . /app + +RUN npm install +RUN npm run build +RUN npm install --global serve +RUN ln -s /app/out out/bitaxe-web-flasher + +CMD [ "serve", "out" ] diff --git a/image-factory/.gitignore b/image-factory/.gitignore new file mode 100644 index 0000000..37465b4 --- /dev/null +++ b/image-factory/.gitignore @@ -0,0 +1,2 @@ +*.bin +firmware_data.csv \ No newline at end of file diff --git a/image-factory/Dockerfile-expressif b/image-factory/Dockerfile-expressif new file mode 100644 index 0000000..50180f7 --- /dev/null +++ b/image-factory/Dockerfile-expressif @@ -0,0 +1,16 @@ +ARG IDF_VERSION +FROM espressif/idf:${IDF_VERSION} + +RUN apt-get update && apt-get install -y \ + curl \ + gnupg \ + ca-certificates + +RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - + +RUN apt-get install -y nodejs=22.11.0-1nodesource1 + +RUN npm install -g @angular/cli + +ENV IDF_TARGET="esp32s3" + diff --git a/image-factory/README.md b/image-factory/README.md new file mode 100644 index 0000000..091bdce --- /dev/null +++ b/image-factory/README.md @@ -0,0 +1,52 @@ +# Build Factory Images With Docker + +build-images.sh is a script that builds the factory images with only Docker as a dependency. + +After the images are built the script runs the web flasher to allow flashing the Bitaxe + with the newly built dev images. It should open your default browser to http://localhost:3000. + +## Requirements + +Docker must be installed. https://docs.docker.com/get-started/get-docker/ + +ESP_MINER_PATH must be set to the path of the ESP-Miner project. + +```shell +export ESP_MINER_PATH=~/dev/ESP-Miner +``` + +It can be set when running the build-images.sh script. + +```shell +./image-factory/build-images.sh ESP_MINER_PATH=~/dev/ESP-Miner -t mytag +``` + +## Building Images + +The command is run from the web flasher project root `./image-factory/build-images.sh`. To build images +for all boards specify a tag. The tag defaults to `dev`. + +```shell +./image-factory/build-images.sh -t 2.4.2b +``` + +To build an image for a specific board using expressif/idf version v5.5-dev + +```shell +./image-factory/build-images.sh -e v5.5-dev -b 204 -t PR-609 +``` + + If the images were already built previously you can launch the web flasher only with + +```shell +./image-factory/build-images.sh -f +``` + +## Image Location + +This build process puts the factory images into the `image-factory` directory. The images +are named `esp-miner-factory--.bin`. The web flasher is configured to look for +these local images by loading the `firmware_data.csv` file, supplementing the existing released firmware. + +![alt text](image-1.png) + diff --git a/image-factory/build-images.sh b/image-factory/build-images.sh new file mode 100755 index 0000000..0853071 --- /dev/null +++ b/image-factory/build-images.sh @@ -0,0 +1,116 @@ +#!/bin/bash + +if [ ! -d "$ESP_MINER_PATH" ]; then + echo "ESP_MINER_PATH not found: $ESP_MINER_PATH" + exit 1 +fi + +board="" +idf_version="v5.4" +flash_only=0 +tag="dev" + +function show_help() { + echo "Usage: build-images.sh [OPTIONS]" + echo "Options:" + echo " -b board: Build only board image. example: 601" + echo " -e: espressif/idf version. default: $idf_version" + echo " -f: Only launch the web flasher" + echo " -t tag: Add tag to image name esp-miner-factory--.bin. default: $tag" +} + +if [ $# -eq 0 ]; then + show_help + exit 0 +fi + +while getopts "b:e:ft:" opt; do + case "$opt" in + f) + flash_only=1 + ;; + b) board=$OPTARG + ;; + e) idf_version=$OPTARG + ;; + t) tag=$OPTARG + ;; + esac +done + +if [ $flash_only -eq 0 ]; then + echo "Building esp-miner-factory with idf version $idf_version" + docker build -t esp-miner-factory \ + --build-arg IDF_VERSION=$idf_version \ + -f image-factory/Dockerfile-expressif . + + docker run --rm -v $ESP_MINER_PATH:/project -w /project esp-miner-factory idf.py build + + if [ -z "$board" ]; then + boards="102 201 202 203 204 205 401 402 403 601" + else + boards=$board + fi + + for board in $boards; do + if [ -f "$ESP_MINER_PATH/config-$board.cvs" ]; then + # Build config.bin for $board + docker run --rm -w /project -v $ESP_MINER_PATH:/project esp-miner-factory \ + /opt/esp/idf/components/nvs_flash/nvs_partition_generator/nvs_partition_gen.py \ + generate config-${board}.cvs config.bin 0x6000 + + bin_file="esp-miner-factory-${board}-${tag}.bin" + + # Creating image for board $board to public/firmware + docker run --rm -w /project -v $ESP_MINER_PATH:/project \ + -v $PWD/image-factory:/firmware \ + esp-miner-factory \ + /project/merge_bin.sh -c /firmware/$bin_file + + # Tell webflasher about our local firmware + name="" + case "$board" in + "102") + name="Max" + ;; + "201"|"202"|"203"|"204"|"205") + name="Ultra" + ;; + "401"|"402"|"403") + name="Supra" + ;; + "601") + name="Gamma" + ;; + esac + echo "Found board: $board" + if [ -n "$name" ]; then + echo "$name,$board,$tag,firmware_local/$bin_file" >> image-factory/firmware_data.csv + echo "name: $name" + fi + fi + done +fi + +# Remove duplicates from firmware_data.csv +sort -u image-factory/firmware_data.csv -o image-factory/firmware_data.csv + +# Build webflasher image +docker build -t bitaxe-web-flasher . + +Open web browser to the local webflasher +if command -v xdg-open >/dev/null 2>&1; then + # Linux + xdg-open "http://localhost:3000" +elif command -v open >/dev/null 2>&1; then + # macOS + open "http://localhost:3000" +elif command -v start >/dev/null 2>&1; then + # Windows + start "http://localhost:3000" +fi + +# Use start the web flasher with the dev firmware in the build-docker directory +docker run --rm --name bwf \ + -v $PWD/image-factory:/app/out/firmware_local \ + -p 3000:3000 bitaxe-web-flasher diff --git a/image-factory/image-1.png b/image-factory/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..33feb7e2d649bc29edaf0aa091f64284d0b4dbe4 GIT binary patch literal 15028 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 literal 0 HcmV?d00001 diff --git a/src/components/LandingHero.tsx b/src/components/LandingHero.tsx index ff86b8d..5b8d951 100644 --- a/src/components/LandingHero.tsx +++ b/src/components/LandingHero.tsx @@ -8,13 +8,15 @@ import { useTranslation } from 'react-i18next' import Header from './Header' import InstructionPanel from './InstructionPanel' import Selector from './Selector' -import device_data from './firmware_data.json' +import { FirmwareData } from '../lib/types' +import firmware_data from './firmware_data.json' import { Terminal } from '@xterm/xterm'; import '@xterm/xterm/css/xterm.css'; export default function LandingHero() { const { t } = useTranslation(); + const [device_data, setDeviceData] = useState(firmware_data) const [selectedDevice, setSelectedDevice] = useState('') const [selectedBoardVersion, setSelectedBoardVersion] = useState('') const [selectedFirmware, setSelectedFirmware] = useState('') @@ -37,6 +39,34 @@ export default function LandingHero() { const userAgent = navigator.userAgent.toLowerCase(); const isChromium = /chrome|chromium|crios|edge/i.test(userAgent); setIsChromiumBased(isChromium); + + // Released firmware data + const firmwareData = firmware_data + + // Append the local built firmware if available + fetch('/firmware_local/firmware_data.csv') + .then((response) => { + if (response.ok) { + response.text().then(data => { + const lines = data.split('\n'); + lines.map(line => { + const [device, board, version, path] = line.split(','); + + const firmwareDevice = firmwareData.devices.find(d => d.name == device); + if (!firmwareDevice) return; + + const firmwareBoard = firmwareDevice.boards.find(b => b.name == board); + if (!firmwareBoard) return; + + const existingFirmware = firmwareBoard.supported_firmware.find(f => f.version === version); + if (existingFirmware) return; + + firmwareBoard.supported_firmware.push({ version, path }); + }); + setDeviceData(firmwareData) + }) + } + }) }, []); useEffect(() => { diff --git a/src/lib/types.ts b/src/lib/types.ts index 9bb706b..37ade6b 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,2 +1,21 @@ // Add any shared types here -export type DeviceModel = 'max' | 'ultra' | 'supra' | 'gamma' | 'ultrahex' | 'suprahex'; \ No newline at end of file +export type DeviceModel = 'max' | 'ultra' | 'supra' | 'gamma' | 'ultrahex' | 'suprahex'; + +export type FirmwareData = { + devices: Device[] +} + +type Device = { + name: string + boards: Board[] +} + +type Board = { + name: string + supported_firmware: Firmware[] +} + +type Firmware = { + version: string + path: string +} \ No newline at end of file From 57951b40bb7d96b35f78eecbad438591570cefc9 Mon Sep 17 00:00:00 2001 From: Dustin Butler Date: Tue, 7 Jan 2025 18:54:47 -0700 Subject: [PATCH 2/3] Set a default version so Docker doesn't complain --- image-factory/Dockerfile-expressif | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image-factory/Dockerfile-expressif b/image-factory/Dockerfile-expressif index 50180f7..758022c 100644 --- a/image-factory/Dockerfile-expressif +++ b/image-factory/Dockerfile-expressif @@ -1,4 +1,4 @@ -ARG IDF_VERSION +ARG IDF_VERSION=v5.4 FROM espressif/idf:${IDF_VERSION} RUN apt-get update && apt-get install -y \ From 5d47acd1bc9f3f3036d6029307f9d8816e137c27 Mon Sep 17 00:00:00 2001 From: Dustin Butler Date: Sat, 11 Jan 2025 21:59:26 -0700 Subject: [PATCH 3/3] Stop on build error --- image-factory/build-images.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/image-factory/build-images.sh b/image-factory/build-images.sh index 0853071..7d51e54 100755 --- a/image-factory/build-images.sh +++ b/image-factory/build-images.sh @@ -45,6 +45,10 @@ if [ $flash_only -eq 0 ]; then -f image-factory/Dockerfile-expressif . docker run --rm -v $ESP_MINER_PATH:/project -w /project esp-miner-factory idf.py build + if [ $? -ne 0 ]; then + echo "IDF build failed, check the logs for more information" + exit 1 + fi if [ -z "$board" ]; then boards="102 201 202 203 204 205 401 402 403 601"