From aeb39fff361f27191e24284bcee1d1836bb5f149 Mon Sep 17 00:00:00 2001 From: Brad Barnett <127794626+bdbarnett@users.noreply.github.com> Date: Fri, 30 Oct 2026 09:01:36 -0500 Subject: [PATCH 1/2] docs: relative links for in-repo targets, link mentioned files, fix a moved link --- CONTRIBUTING.md | 18 ++++++------- README.md | 2 +- docs/get-started/install.md | 2 +- docs/guides/add-a-board-variant.md | 4 +-- docs/guides/build-on-windows.md | 2 +- docs/guides/flash-a-board.md | 2 +- docs/guides/read-build-warnings.md | 2 +- docs/guides/use-esp-vision-modules.md | 16 +++++------ docs/how-it-works/circuitpython.md | 2 +- docs/how-it-works/esp-vision.md | 6 ++--- docs/how-it-works/index.md | 2 +- docs/index.md | 2 +- docs/reference/boards.md | 6 ++--- docs/reference/build-command.md | 8 +++--- docs/reference/files.md | 24 ++++++++--------- docs/reference/index.md | 4 +-- docs/reference/modules.md | 38 +++++++++++++-------------- lib-overrides/README.md | 4 +-- 18 files changed, 72 insertions(+), 72 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e20e1e1c..ec339a34 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,18 +9,18 @@ fix is a good first contribution. | Path | What's there | |---|---| -| `build_mp.py` | The build command. | +| [`build_mp.py`](build_mp.py) | The build command. | | `UPSTREAM` | The MicroPython commit the patches apply to. | | `modules.lock`, `deps.lock` | What gets fetched when it's missing, omnipython-lvgl included. | -| `modules/` | The module manifest, `all/`, `tflite/` and `vision/` (esp-vision's), the modules linked or cloned, and the C modules that live only here: `audioif`, `cameraif`, `castif`, `displayif`, `h264enc`, `jpegio`, `mdns`, `pngio`, `ppa`, `tsmux`, `usbhost`. Each has its own README and tests. | +| [`modules/`](modules) | The module manifest, `all/`, `tflite/` and `vision/` (esp-vision's), the modules linked or cloned, and the C modules that live only here: `audioif`, `cameraif`, `castif`, `displayif`, `h264enc`, `jpegio`, `mdns`, `pngio`, `ppa`, `tsmux`, `usbhost`. Each has its own README and tests. | | `modules/.omnipython-lvgl` | LVGL, its bindings and its ports, which `--modules lvgl` compiles: the sibling checkout, linked, or `modules.lock`'s commit, fetched. | -| `patches/` | The patch series and `apply_patches.py`. | -| `variants/`, `boards/` | Our variants and CircuitPython boards. | -| `scripts/` | `exercise_build.sh`, `release_firmware.py`, `stage_firmware_page.py`, `serve_workbench.sh`, `freeze_list.py`, `update_provenance.py`. | -| `.devcontainer/` | One dev container per port. | -| `docs/` | The documentation site. | +| [`patches/`](patches) | The patch series and `apply_patches.py`. | +| [`variants/`](variants), [`boards/`](boards) | Our variants and CircuitPython boards. | +| [`scripts/`](scripts) | `exercise_build.sh`, `release_firmware.py`, `stage_firmware_page.py`, `serve_workbench.sh`, `freeze_list.py`, `update_provenance.py`. | +| [`.devcontainer/`](.devcontainer) | One dev container per port. | +| [`docs/`](docs) | The documentation site. | -The reference pages in [the docs](https://github.com/PyDevices/micropython-pydevices/blob/main/docs/index.md) +The reference pages in [the docs](docs/index.md) describe what each of these does. ## Rules @@ -43,7 +43,7 @@ python3 -m unittest test_provenance -v python3 -m unittest test_release_firmware test_stage_firmware_page -v ``` -Each module has its own workflow under `.github/workflows/`, named for it. +Each module has its own workflow under [`.github/workflows/`](.github/workflows), named for it. ## Change a patch diff --git a/README.md b/README.md index 671abd90..3ab093e2 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,6 @@ For a board, name its port, board and variant, and the modules you want: --flash 16MB --modules displayif,pygraphics ``` -[Docs](https://github.com/PyDevices/micropython-pydevices/blob/main/docs/index.md) · [Examples](https://pydevices.github.io/gallery/gallery/) · [Roadmap](ROADMAP.md) +[Docs](docs/index.md) · [Examples](https://pydevices.github.io/gallery/gallery/) · [Roadmap](ROADMAP.md) Made by [PyDevices](https://pydevices.com). diff --git a/docs/get-started/install.md b/docs/get-started/install.md index b52e488e..ec0daa86 100644 --- a/docs/get-started/install.md +++ b/docs/get-started/install.md @@ -30,7 +30,7 @@ installed at all, use [a codespace](../guides/build-in-a-codespace.md). ## Install what each port needs -`build_mp.py` fetches the big pieces itself: MicroPython, the modules, ESP-IDF, +[`build_mp.py`](../../build_mp.py) fetches the big pieces itself: MicroPython, the modules, ESP-IDF, emsdk, the pico-sdk and picotool, and SDL2 for MinGW. What it can't fetch are your distribution's packages. On Debian or Ubuntu (WSL included): diff --git a/docs/guides/add-a-board-variant.md b/docs/guides/add-a-board-variant.md index a7b48eae..592f5678 100644 --- a/docs/guides/add-a-board-variant.md +++ b/docs/guides/add-a-board-variant.md @@ -7,7 +7,7 @@ cache sizes and tick. ## An esp32 board -On esp32, `build_mp.py` appends our ESP-IDF settings after the board's, so ours +On esp32, [`build_mp.py`](../../build_mp.py) appends our ESP-IDF settings after the board's, so ours win. They come from files it finds by name, each used only if it exists, in this order: @@ -37,7 +37,7 @@ It may also hold: full-speed PHYs, so the USB device comes out on the kit's USB-C marked "USB". The partition table is found the same way, the most specific `partitions.csv` -winning ([`variants/esp32/partitions.esp32s3.csv`](https://github.com/PyDevices/micropython-pydevices/blob/main/variants/esp32/partitions.esp32s3.csv) +winning ([`variants/esp32/partitions.esp32s3.csv`](../../variants/esp32/partitions.esp32s3.csv) adds a coredump partition on the S3, which a standard build leaves unused). Without one, the board's own is used. Either way, autosize grows the app partition when the image doesn't fit. diff --git a/docs/guides/build-on-windows.md b/docs/guides/build-on-windows.md index b01507df..e887e0b8 100644 --- a/docs/guides/build-on-windows.md +++ b/docs/guides/build-on-windows.md @@ -26,7 +26,7 @@ python build_mp.py --port windows --variant pydevices --modules all .\builds\windows\pydevices\micropython.exe ``` -That's all you type. `build_mp.py` finds MSYS2 in `C:\msys64` (set +That's all you type. [`build_mp.py`](../../build_mp.py) finds MSYS2 in `C:\msys64` (set `MSYS2_ROOT` if it's elsewhere), puts its tools first on the build's `PATH`, and uses its `bash`. Left to `PATH`, `bash` from PowerShell is WSL's, which would run the build inside Linux. Without MSYS2 it stops and prints the install diff --git a/docs/guides/flash-a-board.md b/docs/guides/flash-a-board.md index 81de1725..46ed150a 100644 --- a/docs/guides/flash-a-board.md +++ b/docs/guides/flash-a-board.md @@ -34,5 +34,5 @@ For a `.uf2`, mpftp copies it to the board's drive instead. ## After flashing -pydevices' [Bringing up a board](https://github.com/PyDevices/pydevices/blob/main/docs/board-bringup.md) +pydevices' [Bringing up a board](https://github.com/PyDevices/pydevices/blob/main/docs/guides/bring-up-a-board.md) takes a flashed board to one drawing on its own panel. diff --git a/docs/guides/read-build-warnings.md b/docs/guides/read-build-warnings.md index f50a85b0..ab4ea3cb 100644 --- a/docs/guides/read-build-warnings.md +++ b/docs/guides/read-build-warnings.md @@ -18,7 +18,7 @@ comes out as text and a log shows the colour codes raw. Nothing is broken. and still maps the old names. - `Component lockfile contents have changed`, a CMake warning that asks you to mention it in any issue. The build uses its own TinyUSB and a newer ESP-IDF - than upstream's lockfile records; `build_mp.py` puts the lockfile back + than upstream's lockfile records; [`build_mp.py`](../../build_mp.py) puts the lockfile back afterwards. - cmake's `Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed` and `Could NOT find Threads`. diff --git a/docs/guides/use-esp-vision-modules.md b/docs/guides/use-esp-vision-modules.md index 1340b8e8..28c44d7a 100644 --- a/docs/guides/use-esp-vision-modules.md +++ b/docs/guides/use-esp-vision-modules.md @@ -52,12 +52,12 @@ def fill(buffer, shape, dtype): probability = model.predict([fill])[0][0][0] # uint8: 255 is certain ``` -[`tflite_streaming_simpletest.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/tflite/examples/tflite_streaming_simpletest.py) +[`tflite_streaming_simpletest.py`](../../modules/tflite/examples/tflite_streaming_simpletest.py) runs one, and -[`tflite_wakeword.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/tflite/examples/tflite_wakeword.py) +[`tflite_wakeword.py`](../../modules/tflite/examples/tflite_wakeword.py) listens for a wake word, with audiodsp's `audiofeatures` making the slices and ESPHome's detection rules in Python. -[`tflite_wakeword_mic.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/tflite/examples/tflite_wakeword_mic.py) +[`tflite_wakeword_mic.py`](../../modules/tflite/examples/tflite_wakeword_mic.py) does the same live from the board's microphone. It reads the microphone with `board_peripherals.pcm_in()` and hands each block to the frontend's `feed()`: an audiopump `Tap` sees only what the board plays, so it can't carry a @@ -70,11 +70,11 @@ These ran on an ESP32-P4 board, each with an example. The arena is what | Model | Example | Arena | Time | |---|---|---|---| -| microWakeWord hey_jarvis | [`tflite_wakeword_mic.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/tflite/examples/tflite_wakeword_mic.py) | 19,728 bytes | 1.8 ms | -| micro_speech (yes, no) | [`tflite_micro_speech.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/tflite/examples/tflite_micro_speech.py) | 7,840 bytes | 6 ms | -| yamnet-cry-distill-int8 (521 sounds) | [`tflite_sounds.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/tflite/examples/tflite_sounds.py) | 128,128 bytes | 28 ms | -| person_detection | [`tflite_person_detect.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/tflite/examples/tflite_person_detect.py) | 102,416 bytes | 50 ms | -| MobileNet-v2 int8 (ImageNet) | [`tflite_mobilenet.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/tflite/examples/tflite_mobilenet.py) | 2,608,176 bytes | 1.5 s | +| microWakeWord hey_jarvis | [`tflite_wakeword_mic.py`](../../modules/tflite/examples/tflite_wakeword_mic.py) | 19,728 bytes | 1.8 ms | +| micro_speech (yes, no) | [`tflite_micro_speech.py`](../../modules/tflite/examples/tflite_micro_speech.py) | 7,840 bytes | 6 ms | +| yamnet-cry-distill-int8 (521 sounds) | [`tflite_sounds.py`](../../modules/tflite/examples/tflite_sounds.py) | 128,128 bytes | 28 ms | +| person_detection | [`tflite_person_detect.py`](../../modules/tflite/examples/tflite_person_detect.py) | 102,416 bytes | 50 ms | +| MobileNet-v2 int8 (ImageNet) | [`tflite_mobilenet.py`](../../modules/tflite/examples/tflite_mobilenet.py) | 2,608,176 bytes | 1.5 s | Each example's docstring says where to download its model. diff --git a/docs/how-it-works/circuitpython.md b/docs/how-it-works/circuitpython.md index b5400205..e9ebfceb 100644 --- a/docs/how-it-works/circuitpython.md +++ b/docs/how-it-works/circuitpython.md @@ -29,7 +29,7 @@ What differs is one function, and these are its parts. Python requirements in `deps/circuitpython-venv`. - **Our patches and boards go on first.** `patches/circuitpython/*.patch` are applied to `deps/circuitpython` and each `boards/circuitpython//` - is linked into the port's `boards/`, once each; the build record lists the + is linked into the port's [`boards/`](../../boards), once each; the build record lists the patches. [The boards table](../reference/boards.md#circuitpython-boards) lists the boards. - **A module can ask espressif for ESP-IDF components.** CircuitPython's diff --git a/docs/how-it-works/esp-vision.md b/docs/how-it-works/esp-vision.md index 441f0d1b..274d68d8 100644 --- a/docs/how-it-works/esp-vision.md +++ b/docs/how-it-works/esp-vision.md @@ -5,13 +5,13 @@ build with `tflite` and `vision`. This page says what is behind them. ## The pin and the glue -[`modules/.esp-vision`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/.esp-vision) +[`modules/.esp-vision`](../../modules/.esp-vision) pins esp-vision at a full commit in `ESP_VISION.lock`. Its `fetch.sh` links a sibling clone at that commit (`../esp-vision`), or fetches that commit alone. The leading dot keeps it out of `--modules` and `all`, because esp-vision's own `micropython.cmake` is its whole firmware build, not a module. -[`modules/tflite`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/tflite) and [`modules/vision`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/vision) are our glue around esp-vision's files: +[`modules/tflite`](../../modules/tflite) and [`modules/vision`](../../modules/vision) are our glue around esp-vision's files: the ESP-IDF components esp-vision uses, at its versions; the include paths and definitions MicroPython's QSTR scan needs (it sees only a module's own paths, never a linked component's); and four pieces of our own. @@ -50,7 +50,7 @@ compiles with `-std=gnu++2b`, esp-vision's own setting. |---|---|---| | `tflite`: TFLM's own hello-world test (its int8 model, four golden inputs, 0.05 tolerance) | pass, worst error 0.016 | pass, outputs identical | | `tflite`: esp-vision's sine model, per prediction | 104 µs | 397 µs | -| `vision`: [`examples/vision_smoke.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/vision/examples/vision_smoke.py) (draw, read back, `find_blobs`, JPEG out and in, `flush`) | pass; JPEG 42 ms | pass; JPEG 84 ms | +| `vision`: [`examples/vision_smoke.py`](../../modules/vision/examples/vision_smoke.py) (draw, read back, `find_blobs`, JPEG out and in, `flush`) | pass; JPEG 42 ms | pass; JPEG 84 ms | | `espdl`: ESP-DL's pedestrian example photo, against ESP-DL's published boxes | pass, 68 ms, IoU ≥ 0.90 | pass, 176 ms, IoU ≥ 0.92 | | `h264`: 30 frames decoded on the PC by ffmpeg | Constrained Baseline, frames as drawn | (P4 only) | | `rtsp`: ffmpeg on the PC pulls the stream | 151 frames in 10 s at 15 fps | (P4 only) | diff --git a/docs/how-it-works/index.md b/docs/how-it-works/index.md index edb705de..85169fe9 100644 --- a/docs/how-it-works/index.md +++ b/docs/how-it-works/index.md @@ -39,7 +39,7 @@ is the user's side of this. - Upstream is **pinned**. Moving `UPSTREAM` re-validates every patch. - Patches are justified in their headers. Never hand-edit a patched tree: change the patch and prepare again. -- `build_mp.py` names no version and no setting. Pins move in the lock files, +- [`build_mp.py`](../../build_mp.py) names no version and no setting. Pins move in the lock files, and esp32 settings live in sdkconfig fragments it finds by convention. - Publishing binaries is a separate decision from this source repository. diff --git a/docs/index.md b/docs/index.md index 345b2014..141b7e7a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,7 +2,7 @@ micropython-pydevices builds firmware: MicroPython-compatible and CircuitPython-compatible interpreters with the PyDevices C modules compiled in, -for boards, desktops and the browser. One command, `build_mp.py`, does it. +for boards, desktops and the browser. One command, [`build_mp.py`](../build_mp.py), does it. ## Get started diff --git a/docs/reference/boards.md b/docs/reference/boards.md index 67dda594..79d6e84d 100644 --- a/docs/reference/boards.md +++ b/docs/reference/boards.md @@ -23,7 +23,7 @@ For a board that isn't listed, see [Build for a board](../guides/build-for-a-boa ## Variants -Our variants, in `variants/`. +Our variants, in [`variants/`](../../variants). | Port | Variant | What it is | |---|---|---| @@ -36,14 +36,14 @@ Our variants, in `variants/`. | esp32 | `ESP32_GENERIC_P4` `WIFI6_DEV_KIT`, `WIFI6_DEV_KIT_H2` | The P4 DEV-KIT, with the USB device on the two different connectors in the table above. | | rp2 | `RPI_PICO2_W` `PIMORONI_PICO_PLUS2_W` | The Pimoroni Pico Plus 2 W. | -The esp32 [`variants/esp32/`](https://github.com/PyDevices/micropython-pydevices/tree/main/variants/esp32) folder also holds the `sdkconfig` fragments and +The esp32 [`variants/esp32/`](../../variants/esp32) folder also holds the `sdkconfig` fragments and partition table every esp32 or every chip gets: [Add a board variant](../guides/add-a-board-variant.md) says how they combine. ## CircuitPython boards With `--interpreter circuitpython`, boards are CircuitPython's own. These are -ours, in [`boards/circuitpython/`](https://github.com/PyDevices/micropython-pydevices/tree/main/boards/circuitpython), for boards CircuitPython has no definition for: +ours, in [`boards/circuitpython/`](../../boards/circuitpython), for boards CircuitPython has no definition for: | Board | What it is | |---|---| diff --git a/docs/reference/build-command.md b/docs/reference/build-command.md index c14ed459..5c2d576a 100644 --- a/docs/reference/build-command.md +++ b/docs/reference/build-command.md @@ -9,7 +9,7 @@ Leave out `--port` and it asks for port, board and variant. On a port that has boards, leave out `--board` and it asks for that. `--variant` is always -optional. Leave out `--modules` and it lists `modules/` and asks. +optional. Leave out `--modules` and it lists [`modules/`](../../modules) and asks. ## Options @@ -18,7 +18,7 @@ optional. Leave out `--modules` and it lists `modules/` and asks. | `--interpreter` | `micropython` (the default) or `circuitpython`: CircuitPython-compatible firmware from CircuitPython's own ports and boards. | | `--port` | The port: `unix`, `windows`, `webassembly`, `esp32`, `rp2`. With `--interpreter circuitpython`, CircuitPython's own: `espressif`, `raspberrypi`, `unix` and the rest. | | `--board` | The board, by upstream's directory name. | -| `--variant` | A variant of the board or port: upstream's, or one of ours in `variants/`. | +| `--variant` | A variant of the board or port: upstream's, or one of ours in [`variants/`](../../variants). | | `--modules` | A comma list of short names, full paths, or `all`. See [Modules](modules.md). | | `--flash` | esp32 flash size, such as `16MB`. | | `--no-autosize` | esp32 and rp2: refuse instead of growing the firmware's share of flash. | @@ -33,8 +33,8 @@ CircuitPython build they are part of the build record. | Variable | Default | Meaning | |---|---|---| | `OUT_DIR` | `builds/` | Where builds go. | -| `VARIANTS_DIR` | `variants/` | Where our variants are found. | -| `MODULES_DIR` | `modules/` | Where modules are found. | +| `VARIANTS_DIR` | [`variants/`](../../variants) | Where our variants are found. | +| `MODULES_DIR` | [`modules/`](../../modules) | Where modules are found. | | `JOBS` | every core | The parallelism handed to make. | | `MSYS2_ROOT` | `C:\msys64` | On Windows, the MSYS2 whose make and MinGW gcc build the windows port. | | `IDF_TOOLS_PATH` | `~/.espressif` | Where an esp32 build installs ESP-IDF's toolchains. | diff --git a/docs/reference/files.md b/docs/reference/files.md index 77cc62fb..47a7c4bf 100644 --- a/docs/reference/files.md +++ b/docs/reference/files.md @@ -2,17 +2,17 @@ | Path | What it is | |---|---| -| [`build_mp.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/build_mp.py) | The build command: [every option](build-command.md). It fills in `micropython/`, `modules/` and `deps/` if they're missing, prepares the MicroPython tree and runs the port's own `make`. | -| [`UPSTREAM`](https://github.com/PyDevices/micropython-pydevices/blob/main/UPSTREAM) | The MicroPython commit everything applies to. | -| [`modules.lock`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules.lock) | The commits `build_mp.py` fetches when a module isn't there. It also pins [omnipython-lvgl](https://github.com/PyDevices/omnipython-lvgl), LVGL with its bindings and a port per interpreter: a build with `lvgl` (or `all`) fetches it into `modules/.omnipython-lvgl` and compiles the port for its interpreter. Beside sibling checkouts, these are links to those checkouts instead. | -| [`deps.lock`](https://github.com/PyDevices/micropython-pydevices/blob/main/deps.lock) | The toolchains `build_mp.py` fetches: ESP-IDF, emsdk, SDL2 for MinGW, the TinyUSB the esp32 port builds on, and the ESP-IDF components CircuitPython builds ask for. It also pins CircuitPython, for `--interpreter circuitpython`. | -| [`provenance.json`](https://github.com/PyDevices/micropython-pydevices/blob/main/provenance.json) | The MicroPython pin and the checksum of every patch in [`patches/micropython/`](https://github.com/PyDevices/micropython-pydevices/tree/main/patches/micropython) and [`patches/tinyusb/`](https://github.com/PyDevices/micropython-pydevices/tree/main/patches/tinyusb). | -| [`modules/`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules) | [`manifest.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/manifest.py), the manifest every build freezes; `all/`; the modules, [linked or cloned](modules.md); and `.esp-vision/`, the pin for [esp-vision's modules](../how-it-works/esp-vision.md). | -| [`patches/micropython/`](https://github.com/PyDevices/micropython-pydevices/tree/main/patches/micropython) | Our patch series, `0001-…` to `0042-…` (there is no `0026`, whose fix moved into `patches/tinyusb/`), each justified in its own header. | -| [`patches/tinyusb/`](https://github.com/PyDevices/micropython-pydevices/tree/main/patches/tinyusb) | Patches to the TinyUSB the esp32 port builds on the S2, S3 and P4, which `build_mp.py` applies to `deps/espressif__tinyusb` (at its `deps.lock` tag) and builds in place of the port's own copy. | -| [`patches/micropython-lib/`](https://github.com/PyDevices/micropython-pydevices/tree/main/patches/micropython-lib) | micropython-lib's own fixes from after the commit MicroPython's `lib/micropython-lib` points at. A firmware that freezes those packages, and a board whose `/lib` you fill from the submodule, both get them. | -| [`patches/circuitpython/`](https://github.com/PyDevices/micropython-pydevices/tree/main/patches/circuitpython) | Our patches to CircuitPython, applied to `deps/circuitpython`. | -| [`patches/apply_patches.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/patches/apply_patches.py) | Applies the MicroPython series, plus each module's own MicroPython patches, once, as one local commit. `--check` tests a change without applying it. | +| [`build_mp.py`](../../build_mp.py) | The build command: [every option](build-command.md). It fills in `micropython/`, [`modules/`](../../modules) and `deps/` if they're missing, prepares the MicroPython tree and runs the port's own `make`. | +| [`UPSTREAM`](../../UPSTREAM) | The MicroPython commit everything applies to. | +| [`modules.lock`](../../modules.lock) | The commits [`build_mp.py`](../../build_mp.py) fetches when a module isn't there. It also pins [omnipython-lvgl](https://github.com/PyDevices/omnipython-lvgl), LVGL with its bindings and a port per interpreter: a build with `lvgl` (or `all`) fetches it into `modules/.omnipython-lvgl` and compiles the port for its interpreter. Beside sibling checkouts, these are links to those checkouts instead. | +| [`deps.lock`](../../deps.lock) | The toolchains [`build_mp.py`](../../build_mp.py) fetches: ESP-IDF, emsdk, SDL2 for MinGW, the TinyUSB the esp32 port builds on, and the ESP-IDF components CircuitPython builds ask for. It also pins CircuitPython, for `--interpreter circuitpython`. | +| [`provenance.json`](../../provenance.json) | The MicroPython pin and the checksum of every patch in [`patches/micropython/`](../../patches/micropython) and [`patches/tinyusb/`](../../patches/tinyusb). | +| [`modules/`](../../modules) | [`manifest.py`](../../modules/manifest.py), the manifest every build freezes; `all/`; the modules, [linked or cloned](modules.md); and `.esp-vision/`, the pin for [esp-vision's modules](../how-it-works/esp-vision.md). | +| [`patches/micropython/`](../../patches/micropython) | Our patch series, `0001-…` to `0042-…` (there is no `0026`, whose fix moved into [`patches/tinyusb/`](../../patches/tinyusb)), each justified in its own header. | +| [`patches/tinyusb/`](../../patches/tinyusb) | Patches to the TinyUSB the esp32 port builds on the S2, S3 and P4, which [`build_mp.py`](../../build_mp.py) applies to `deps/espressif__tinyusb` (at its `deps.lock` tag) and builds in place of the port's own copy. | +| [`patches/micropython-lib/`](../../patches/micropython-lib) | micropython-lib's own fixes from after the commit MicroPython's `lib/micropython-lib` points at. A firmware that freezes those packages, and a board whose `/lib` you fill from the submodule, both get them. | +| [`patches/circuitpython/`](../../patches/circuitpython) | Our patches to CircuitPython, applied to `deps/circuitpython`. | +| [`patches/apply_patches.py`](../../patches/apply_patches.py) | Applies the MicroPython series, plus each module's own MicroPython patches, once, as one local commit. `--check` tests a change without applying it. | | [`variants/`](boards.md#variants) | Our variants and the esp32 settings. | | [`boards/circuitpython/`](boards.md#circuitpython-boards) | Boards CircuitPython has no definition for. | -| [`scripts/`](https://github.com/PyDevices/micropython-pydevices/tree/main/scripts) | `exercise_build.sh`, `release_firmware.py`, `stage_firmware_page.py`, `serve_workbench.sh`, `freeze_list.py`, `update_provenance.py`. [Contributing](https://github.com/PyDevices/micropython-pydevices/blob/main/CONTRIBUTING.md) says what each is for. | +| [`scripts/`](../../scripts) | `exercise_build.sh`, `release_firmware.py`, `stage_firmware_page.py`, `serve_workbench.sh`, `freeze_list.py`, `update_provenance.py`. [Contributing](../../CONTRIBUTING.md) says what each is for. | diff --git a/docs/reference/index.md b/docs/reference/index.md index b4f9fbae..f4360ae1 100644 --- a/docs/reference/index.md +++ b/docs/reference/index.md @@ -1,7 +1,7 @@ # Reference This repository has no Python package to document, so these pages are tables: -what `build_mp.py` takes, the modules you can name, the boards and variants +what [`build_mp.py`](../../build_mp.py) takes, the modules you can name, the boards and variants built, and the files that pin what a build uses. - [The build command](build-command.md): every option, environment variable and @@ -9,7 +9,7 @@ built, and the files that pin what a build uses. - [Modules](modules.md): the short names `--modules` takes, and which build on CircuitPython. - [Boards and variants](boards.md): the command for each board, and every variant - in `variants/` and `boards/`. + in [`variants/`](../../variants) and [`boards/`](../../boards). - [Files and pins](files.md): `UPSTREAM`, the lock files, the patch series and the scripts. diff --git a/docs/reference/modules.md b/docs/reference/modules.md index 34088417..1ead624d 100644 --- a/docs/reference/modules.md +++ b/docs/reference/modules.md @@ -8,18 +8,18 @@ tracked here or linked from a sibling checkout or cloned at the commit in | Module | What it is | |---|---| -| [`audioif`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/audioif) | The audio hardware under the audio pump, with CircuitPython's `audiobusio.I2SOut` and `audioi2sin.I2SIn` on top. | -| [`cameraif`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/cameraif) | A MIPI-CSI camera as a MicroPython object, on the ESP32-P4. | -| [`castif`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/castif) | Casts an ESP32-P4's screen and sound to a TV over Wi-Fi Display, or serves them as live HLS. | -| [`displayif`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/displayif) | The display buses and panels under `displaydev` (SPI, I2C, i80, QSPI, dot-clock RGB, MIPI-DSI, PicoDVI, RGB matrix, SDL2). The dot-clock, MIPI-DSI, PicoDVI and RGB matrix modules keep CircuitPython's names. | -| [`h264enc`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/h264enc) | RGB565 frames to H.264 on the ESP32-P4's hardware encoder. | -| [`jpegio`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/jpegio) | JPEG decode and encode, with CircuitPython's `jpegio` API. | -| [`mdns`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/mdns) | Find and advertise services on the local network, with CircuitPython's `mdns` API (esp32, rp2, unix, windows). | -| [`picotts`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/picotts) | Text to speech on the SVOX Pico engine, with the API of Adafruit's `adafruit_picotts`. Opt-in, and it needs PSRAM. | -| [`pngio`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/pngio) | PNG encode and decode, RGB565 in and out. | -| [`ppa`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/ppa) | Scale, rotate, convert and fill pixel buffers, on the ESP32-P4's Pixel Processing Accelerator or in portable C elsewhere. | -| [`tsmux`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/tsmux) | MPEG-TS and HLS segments from H.264. | -| [`usbhost`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/usbhost) | The USB host port and isochronous streams that `usb.core` and the `usb.host.*` packages are built on (ESP32-S2, S3 and P4). | +| [`audioif`](../../modules/audioif) | The audio hardware under the audio pump, with CircuitPython's `audiobusio.I2SOut` and `audioi2sin.I2SIn` on top. | +| [`cameraif`](../../modules/cameraif) | A MIPI-CSI camera as a MicroPython object, on the ESP32-P4. | +| [`castif`](../../modules/castif) | Casts an ESP32-P4's screen and sound to a TV over Wi-Fi Display, or serves them as live HLS. | +| [`displayif`](../../modules/displayif) | The display buses and panels under `displaydev` (SPI, I2C, i80, QSPI, dot-clock RGB, MIPI-DSI, PicoDVI, RGB matrix, SDL2). The dot-clock, MIPI-DSI, PicoDVI and RGB matrix modules keep CircuitPython's names. | +| [`h264enc`](../../modules/h264enc) | RGB565 frames to H.264 on the ESP32-P4's hardware encoder. | +| [`jpegio`](../../modules/jpegio) | JPEG decode and encode, with CircuitPython's `jpegio` API. | +| [`mdns`](../../modules/mdns) | Find and advertise services on the local network, with CircuitPython's `mdns` API (esp32, rp2, unix, windows). | +| [`picotts`](../../modules/picotts) | Text to speech on the SVOX Pico engine, with the API of Adafruit's `adafruit_picotts`. Opt-in, and it needs PSRAM. | +| [`pngio`](../../modules/pngio) | PNG encode and decode, RGB565 in and out. | +| [`ppa`](../../modules/ppa) | Scale, rotate, convert and fill pixel buffers, on the ESP32-P4's Pixel Processing Accelerator or in portable C elsewhere. | +| [`tsmux`](../../modules/tsmux) | MPEG-TS and HLS segments from H.264. | +| [`usbhost`](../../modules/usbhost) | The USB host port and isochronous streams that `usb.core` and the `usb.host.*` packages are built on (ESP32-S2, S3 and P4). | ## Modules from other repositories @@ -31,16 +31,16 @@ tracked here or linked from a sibling checkout or cloned at the commit in | `micropython-lib` | MicroPython's own upstream packages, frozen from the checkout the MicroPython tree carries. | | `tflite`, `vision` | [esp-vision's modules](../guides/use-esp-vision-modules.md), opt-in: `all` leaves them out. | -[`modules/all`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/all) is not a module but the rule behind `all`: every module beside it +[`modules/all`](../../modules/all) is not a module but the rule behind `all`: every module beside it except those with an `OPT_IN` file: `picotts`, `tflite` and `vision`. ## Which modules build on CircuitPython What `--modules` can name on CircuitPython, and why a module is missing where it is. "Unix" is CircuitPython's unix port, built and imported in -[`circuitpython.yml`](https://github.com/PyDevices/micropython-pydevices/blob/main/.github/workflows/circuitpython.yml); +[`circuitpython.yml`](../../.github/workflows/circuitpython.yml); "boards" are the five CircuitPython cells of -[`release-firmware.yml`](https://github.com/PyDevices/micropython-pydevices/blob/main/.github/workflows/release-firmware.yml). +[`release-firmware.yml`](../../.github/workflows/release-firmware.yml). | Module | Unix | Boards | Notes | |---|---|---|---| @@ -53,15 +53,15 @@ it is. "Unix" is CircuitPython's unix port, built and imported in | jpegio | yes | ESP32-P4 | Adds only the encoder's C API: CircuitPython has its own `jpegio` decoder. | | cameraif | yes (`available()` is False) | ESP32-P4 | | | mdns | yes | no, on purpose | CircuitPython's boards have an `mdns` of their own; its unix port has none. | -| usbhost | yes, as `_usbhost`, with no host engine | ESP32-P4 | The host engine runs on ESP-IDF's USB host library, which from ESP-IDF 6 is Espressif's `usb` component: `build_mp.py` fetches it at the version `deps.lock` pins. The P4's boards leave its high-speed controller to us. Tethering is left out until the port has a network. The S3's one controller is CircuitPython's drive and REPL, so it gets the module without the engine. On the RP2040 and i.MX, CircuitPython's own `usb.core` is the host. | +| usbhost | yes, as `_usbhost`, with no host engine | ESP32-P4 | The host engine runs on ESP-IDF's USB host library, which from ESP-IDF 6 is Espressif's `usb` component: [`build_mp.py`](../../build_mp.py) fetches it at the version `deps.lock` pins. The P4's boards leave its high-speed controller to us. Tethering is left out until the port has a network. The S3's one controller is CircuitPython's drive and REPL, so it gets the module without the engine. On the RP2040 and i.MX, CircuitPython's own `usb.core` is the host. | | audioif | no | no | Links against audiodsp's audio pump and `cp_compat`, which audiodsp's CircuitPython glue doesn't build. It isn't needed there: audioif gives MicroPython the `audiobusio` and `audioi2sin` that CircuitPython boards already have. | | ulab | CircuitPython's own | CircuitPython's own | | | castif | no: it is the ESP32-P4's | ESP32-P4, with no network | Talks to lwIP directly, the lwIP under CircuitPython's own `socketpool`. CircuitPython's P4 port has no network until it drives the boards' ESP32-C6, so castif is built without one and `start()` says so. Name tsmux, h264enc and ppa with it. | -| h264enc | no: it is the ESP32-P4's encoder | ESP32-P4 | Espressif's `esp_h264`, which CircuitPython's port, built with the component manager off, can't fetch itself, is pinned in `deps.lock` and fetched by `build_mp.py`. Name ppa with it. | +| h264enc | no: it is the ESP32-P4's encoder | ESP32-P4 | Espressif's `esp_h264`, which CircuitPython's port, built with the component manager off, can't fetch itself, is pinned in `deps.lock` and fetched by [`build_mp.py`](../../build_mp.py). Name ppa with it. | | picotts | no | no, on purpose | CircuitPython has Adafruit's `adafruit_picotts`, the same engine and API as a native `.mpy`. | | tflite, vision | no | no, on purpose | esp-vision's modules, for MicroPython only. | | lvgl | yes | all five | One name for both interpreters: a CircuitPython build compiles omnipython-lvgl's `ports/circuitpython`. A board build needs `CIRCUITPY_GIFIO=0`, since LVGL links its own AnimatedGIF decoder; our boards set it. | | micropython-lib | no | no | MicroPython's own upstream packages. | -| pydevices, palettes, pdwidgets | frozen | frozen | Python only. On unix, pydevices also freezes its desktop files (the boards drop them), and pdwidgets and palettes with it: together their names pass CircuitPython's 64 KB frozen-string pool, so `build_mp.py` builds the unix port with four-byte qstr offsets (patches 0001 and 0010). Boards keep two-byte offsets. | +| pydevices, palettes, pdwidgets | frozen | frozen | Python only. On unix, pydevices also freezes its desktop files (the boards drop them), and pdwidgets and palettes with it: together their names pass CircuitPython's 64 KB frozen-string pool, so [`build_mp.py`](../../build_mp.py) builds the unix port with four-byte qstr offsets (patches 0001 and 0010). Boards keep two-byte offsets. | -What is planned for the rest is in the [roadmap](https://github.com/PyDevices/micropython-pydevices/blob/main/ROADMAP.md). +What is planned for the rest is in the [roadmap](../../ROADMAP.md). diff --git a/lib-overrides/README.md b/lib-overrides/README.md index 13354e6d..12310eb1 100644 --- a/lib-overrides/README.md +++ b/lib-overrides/README.md @@ -1,7 +1,7 @@ # lib-overrides Packages from micropython-lib that these firmware builds freeze their own copy -of. `modules/manifest.py` registers this folder ahead of micropython-lib, so a +of. [`modules/manifest.py`](../modules/manifest.py) registers this folder ahead of micropython-lib, so a port's `require("mip")` (bundle-networking on ESP32, `mip-cmdline` on unix) gets the copy here and upstream's is left out. `mpremote mip` is unaffected, since it runs on the host. @@ -20,6 +20,6 @@ The change is the block between `PyDevices patch begins` and `ends` in `mip/__init__.py`, the two `requests.get` calls swapped for `_get`, and a `_drop()` at the end of `install`. Anything that isn't `https://` with a Content-Length (a redirect to http, chunked bodies, a port in the URL) falls -back to `requests.get`. `test_lib_overrides.py` checks that removing those +back to `requests.get`. [`test_lib_overrides.py`](../test_lib_overrides.py) checks that removing those pieces gives upstream's file back, so to move to a newer upstream, copy its `mip/__init__.py` in and re-apply the pieces. From 88338c2a3ae9643be028c390070656f3a7f48a60 Mon Sep 17 00:00:00 2001 From: Brad Barnett <127794626+bdbarnett@users.noreply.github.com> Date: Fri, 30 Oct 2026 09:02:50 -0500 Subject: [PATCH 2/2] docs: keep out-of-site links absolute (Sphinx cannot resolve them) --- docs/get-started/install.md | 2 +- docs/guides/add-a-board-variant.md | 4 +-- docs/guides/build-in-a-codespace.md | 2 +- docs/guides/build-on-windows.md | 2 +- docs/guides/read-build-warnings.md | 2 +- docs/guides/use-esp-vision-modules.md | 16 +++++------ docs/how-it-works/circuitpython.md | 2 +- docs/how-it-works/esp-vision.md | 6 ++--- docs/how-it-works/index.md | 2 +- docs/index.md | 2 +- docs/reference/boards.md | 6 ++--- docs/reference/build-command.md | 8 +++--- docs/reference/files.md | 24 ++++++++--------- docs/reference/index.md | 4 +-- docs/reference/modules.md | 38 +++++++++++++-------------- 15 files changed, 60 insertions(+), 60 deletions(-) diff --git a/docs/get-started/install.md b/docs/get-started/install.md index ec0daa86..3176830b 100644 --- a/docs/get-started/install.md +++ b/docs/get-started/install.md @@ -30,7 +30,7 @@ installed at all, use [a codespace](../guides/build-in-a-codespace.md). ## Install what each port needs -[`build_mp.py`](../../build_mp.py) fetches the big pieces itself: MicroPython, the modules, ESP-IDF, +[`build_mp.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/build_mp.py) fetches the big pieces itself: MicroPython, the modules, ESP-IDF, emsdk, the pico-sdk and picotool, and SDL2 for MinGW. What it can't fetch are your distribution's packages. On Debian or Ubuntu (WSL included): diff --git a/docs/guides/add-a-board-variant.md b/docs/guides/add-a-board-variant.md index 592f5678..95513160 100644 --- a/docs/guides/add-a-board-variant.md +++ b/docs/guides/add-a-board-variant.md @@ -7,7 +7,7 @@ cache sizes and tick. ## An esp32 board -On esp32, [`build_mp.py`](../../build_mp.py) appends our ESP-IDF settings after the board's, so ours +On esp32, [`build_mp.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/build_mp.py) appends our ESP-IDF settings after the board's, so ours win. They come from files it finds by name, each used only if it exists, in this order: @@ -37,7 +37,7 @@ It may also hold: full-speed PHYs, so the USB device comes out on the kit's USB-C marked "USB". The partition table is found the same way, the most specific `partitions.csv` -winning ([`variants/esp32/partitions.esp32s3.csv`](../../variants/esp32/partitions.esp32s3.csv) +winning ([`variants/esp32/partitions.esp32s3.csv`](https://github.com/PyDevices/micropython-pydevices/blob/main/variants/esp32/partitions.esp32s3.csv) adds a coredump partition on the S3, which a standard build leaves unused). Without one, the board's own is used. Either way, autosize grows the app partition when the image doesn't fit. diff --git a/docs/guides/build-in-a-codespace.md b/docs/guides/build-in-a-codespace.md index 0e859cd1..067825dd 100644 --- a/docs/guides/build-in-a-codespace.md +++ b/docs/guides/build-in-a-codespace.md @@ -37,7 +37,7 @@ Explorer, open `builds/` down to your build, right-click `firmware.bin` (or ## Try a webassembly build in workbench The webassembly container opens your build in workbench, the browser IDE. -Build, then run [`scripts/serve_workbench.sh`](../../scripts/serve_workbench.sh): it downloads the newest workbench +Build, then run [`scripts/serve_workbench.sh`](https://github.com/PyDevices/micropython-pydevices/blob/main/scripts/serve_workbench.sh): it downloads the newest workbench release, puts your `micropython.wasm` in it and serves it on port 8000, which the container forwards and your browser opens. Click the simulator button (the display icon) and the REPL that starts is your build. diff --git a/docs/guides/build-on-windows.md b/docs/guides/build-on-windows.md index e887e0b8..bc0b2985 100644 --- a/docs/guides/build-on-windows.md +++ b/docs/guides/build-on-windows.md @@ -26,7 +26,7 @@ python build_mp.py --port windows --variant pydevices --modules all .\builds\windows\pydevices\micropython.exe ``` -That's all you type. [`build_mp.py`](../../build_mp.py) finds MSYS2 in `C:\msys64` (set +That's all you type. [`build_mp.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/build_mp.py) finds MSYS2 in `C:\msys64` (set `MSYS2_ROOT` if it's elsewhere), puts its tools first on the build's `PATH`, and uses its `bash`. Left to `PATH`, `bash` from PowerShell is WSL's, which would run the build inside Linux. Without MSYS2 it stops and prints the install diff --git a/docs/guides/read-build-warnings.md b/docs/guides/read-build-warnings.md index ab4ea3cb..8dc5ffb2 100644 --- a/docs/guides/read-build-warnings.md +++ b/docs/guides/read-build-warnings.md @@ -18,7 +18,7 @@ comes out as text and a log shows the colour codes raw. Nothing is broken. and still maps the old names. - `Component lockfile contents have changed`, a CMake warning that asks you to mention it in any issue. The build uses its own TinyUSB and a newer ESP-IDF - than upstream's lockfile records; [`build_mp.py`](../../build_mp.py) puts the lockfile back + than upstream's lockfile records; [`build_mp.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/build_mp.py) puts the lockfile back afterwards. - cmake's `Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed` and `Could NOT find Threads`. diff --git a/docs/guides/use-esp-vision-modules.md b/docs/guides/use-esp-vision-modules.md index 28c44d7a..1340b8e8 100644 --- a/docs/guides/use-esp-vision-modules.md +++ b/docs/guides/use-esp-vision-modules.md @@ -52,12 +52,12 @@ def fill(buffer, shape, dtype): probability = model.predict([fill])[0][0][0] # uint8: 255 is certain ``` -[`tflite_streaming_simpletest.py`](../../modules/tflite/examples/tflite_streaming_simpletest.py) +[`tflite_streaming_simpletest.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/tflite/examples/tflite_streaming_simpletest.py) runs one, and -[`tflite_wakeword.py`](../../modules/tflite/examples/tflite_wakeword.py) +[`tflite_wakeword.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/tflite/examples/tflite_wakeword.py) listens for a wake word, with audiodsp's `audiofeatures` making the slices and ESPHome's detection rules in Python. -[`tflite_wakeword_mic.py`](../../modules/tflite/examples/tflite_wakeword_mic.py) +[`tflite_wakeword_mic.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/tflite/examples/tflite_wakeword_mic.py) does the same live from the board's microphone. It reads the microphone with `board_peripherals.pcm_in()` and hands each block to the frontend's `feed()`: an audiopump `Tap` sees only what the board plays, so it can't carry a @@ -70,11 +70,11 @@ These ran on an ESP32-P4 board, each with an example. The arena is what | Model | Example | Arena | Time | |---|---|---|---| -| microWakeWord hey_jarvis | [`tflite_wakeword_mic.py`](../../modules/tflite/examples/tflite_wakeword_mic.py) | 19,728 bytes | 1.8 ms | -| micro_speech (yes, no) | [`tflite_micro_speech.py`](../../modules/tflite/examples/tflite_micro_speech.py) | 7,840 bytes | 6 ms | -| yamnet-cry-distill-int8 (521 sounds) | [`tflite_sounds.py`](../../modules/tflite/examples/tflite_sounds.py) | 128,128 bytes | 28 ms | -| person_detection | [`tflite_person_detect.py`](../../modules/tflite/examples/tflite_person_detect.py) | 102,416 bytes | 50 ms | -| MobileNet-v2 int8 (ImageNet) | [`tflite_mobilenet.py`](../../modules/tflite/examples/tflite_mobilenet.py) | 2,608,176 bytes | 1.5 s | +| microWakeWord hey_jarvis | [`tflite_wakeword_mic.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/tflite/examples/tflite_wakeword_mic.py) | 19,728 bytes | 1.8 ms | +| micro_speech (yes, no) | [`tflite_micro_speech.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/tflite/examples/tflite_micro_speech.py) | 7,840 bytes | 6 ms | +| yamnet-cry-distill-int8 (521 sounds) | [`tflite_sounds.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/tflite/examples/tflite_sounds.py) | 128,128 bytes | 28 ms | +| person_detection | [`tflite_person_detect.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/tflite/examples/tflite_person_detect.py) | 102,416 bytes | 50 ms | +| MobileNet-v2 int8 (ImageNet) | [`tflite_mobilenet.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/tflite/examples/tflite_mobilenet.py) | 2,608,176 bytes | 1.5 s | Each example's docstring says where to download its model. diff --git a/docs/how-it-works/circuitpython.md b/docs/how-it-works/circuitpython.md index e9ebfceb..8123b354 100644 --- a/docs/how-it-works/circuitpython.md +++ b/docs/how-it-works/circuitpython.md @@ -29,7 +29,7 @@ What differs is one function, and these are its parts. Python requirements in `deps/circuitpython-venv`. - **Our patches and boards go on first.** `patches/circuitpython/*.patch` are applied to `deps/circuitpython` and each `boards/circuitpython//` - is linked into the port's [`boards/`](../../boards), once each; the build record lists the + is linked into the port's [`boards/`](https://github.com/PyDevices/micropython-pydevices/tree/main/boards), once each; the build record lists the patches. [The boards table](../reference/boards.md#circuitpython-boards) lists the boards. - **A module can ask espressif for ESP-IDF components.** CircuitPython's diff --git a/docs/how-it-works/esp-vision.md b/docs/how-it-works/esp-vision.md index 274d68d8..441f0d1b 100644 --- a/docs/how-it-works/esp-vision.md +++ b/docs/how-it-works/esp-vision.md @@ -5,13 +5,13 @@ build with `tflite` and `vision`. This page says what is behind them. ## The pin and the glue -[`modules/.esp-vision`](../../modules/.esp-vision) +[`modules/.esp-vision`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/.esp-vision) pins esp-vision at a full commit in `ESP_VISION.lock`. Its `fetch.sh` links a sibling clone at that commit (`../esp-vision`), or fetches that commit alone. The leading dot keeps it out of `--modules` and `all`, because esp-vision's own `micropython.cmake` is its whole firmware build, not a module. -[`modules/tflite`](../../modules/tflite) and [`modules/vision`](../../modules/vision) are our glue around esp-vision's files: +[`modules/tflite`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/tflite) and [`modules/vision`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/vision) are our glue around esp-vision's files: the ESP-IDF components esp-vision uses, at its versions; the include paths and definitions MicroPython's QSTR scan needs (it sees only a module's own paths, never a linked component's); and four pieces of our own. @@ -50,7 +50,7 @@ compiles with `-std=gnu++2b`, esp-vision's own setting. |---|---|---| | `tflite`: TFLM's own hello-world test (its int8 model, four golden inputs, 0.05 tolerance) | pass, worst error 0.016 | pass, outputs identical | | `tflite`: esp-vision's sine model, per prediction | 104 µs | 397 µs | -| `vision`: [`examples/vision_smoke.py`](../../modules/vision/examples/vision_smoke.py) (draw, read back, `find_blobs`, JPEG out and in, `flush`) | pass; JPEG 42 ms | pass; JPEG 84 ms | +| `vision`: [`examples/vision_smoke.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/vision/examples/vision_smoke.py) (draw, read back, `find_blobs`, JPEG out and in, `flush`) | pass; JPEG 42 ms | pass; JPEG 84 ms | | `espdl`: ESP-DL's pedestrian example photo, against ESP-DL's published boxes | pass, 68 ms, IoU ≥ 0.90 | pass, 176 ms, IoU ≥ 0.92 | | `h264`: 30 frames decoded on the PC by ffmpeg | Constrained Baseline, frames as drawn | (P4 only) | | `rtsp`: ffmpeg on the PC pulls the stream | 151 frames in 10 s at 15 fps | (P4 only) | diff --git a/docs/how-it-works/index.md b/docs/how-it-works/index.md index 85169fe9..42fbd88c 100644 --- a/docs/how-it-works/index.md +++ b/docs/how-it-works/index.md @@ -39,7 +39,7 @@ is the user's side of this. - Upstream is **pinned**. Moving `UPSTREAM` re-validates every patch. - Patches are justified in their headers. Never hand-edit a patched tree: change the patch and prepare again. -- [`build_mp.py`](../../build_mp.py) names no version and no setting. Pins move in the lock files, +- [`build_mp.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/build_mp.py) names no version and no setting. Pins move in the lock files, and esp32 settings live in sdkconfig fragments it finds by convention. - Publishing binaries is a separate decision from this source repository. diff --git a/docs/index.md b/docs/index.md index 141b7e7a..5f8bcb0f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,7 +2,7 @@ micropython-pydevices builds firmware: MicroPython-compatible and CircuitPython-compatible interpreters with the PyDevices C modules compiled in, -for boards, desktops and the browser. One command, [`build_mp.py`](../build_mp.py), does it. +for boards, desktops and the browser. One command, [`build_mp.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/build_mp.py), does it. ## Get started diff --git a/docs/reference/boards.md b/docs/reference/boards.md index 79d6e84d..69afe9c7 100644 --- a/docs/reference/boards.md +++ b/docs/reference/boards.md @@ -23,7 +23,7 @@ For a board that isn't listed, see [Build for a board](../guides/build-for-a-boa ## Variants -Our variants, in [`variants/`](../../variants). +Our variants, in [`variants/`](https://github.com/PyDevices/micropython-pydevices/tree/main/variants). | Port | Variant | What it is | |---|---|---| @@ -36,14 +36,14 @@ Our variants, in [`variants/`](../../variants). | esp32 | `ESP32_GENERIC_P4` `WIFI6_DEV_KIT`, `WIFI6_DEV_KIT_H2` | The P4 DEV-KIT, with the USB device on the two different connectors in the table above. | | rp2 | `RPI_PICO2_W` `PIMORONI_PICO_PLUS2_W` | The Pimoroni Pico Plus 2 W. | -The esp32 [`variants/esp32/`](../../variants/esp32) folder also holds the `sdkconfig` fragments and +The esp32 [`variants/esp32/`](https://github.com/PyDevices/micropython-pydevices/tree/main/variants/esp32) folder also holds the `sdkconfig` fragments and partition table every esp32 or every chip gets: [Add a board variant](../guides/add-a-board-variant.md) says how they combine. ## CircuitPython boards With `--interpreter circuitpython`, boards are CircuitPython's own. These are -ours, in [`boards/circuitpython/`](../../boards/circuitpython), for boards CircuitPython has no definition for: +ours, in [`boards/circuitpython/`](https://github.com/PyDevices/micropython-pydevices/tree/main/boards/circuitpython), for boards CircuitPython has no definition for: | Board | What it is | |---|---| diff --git a/docs/reference/build-command.md b/docs/reference/build-command.md index 5c2d576a..6828787e 100644 --- a/docs/reference/build-command.md +++ b/docs/reference/build-command.md @@ -9,7 +9,7 @@ Leave out `--port` and it asks for port, board and variant. On a port that has boards, leave out `--board` and it asks for that. `--variant` is always -optional. Leave out `--modules` and it lists [`modules/`](../../modules) and asks. +optional. Leave out `--modules` and it lists [`modules/`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules) and asks. ## Options @@ -18,7 +18,7 @@ optional. Leave out `--modules` and it lists [`modules/`](../../modules) and ask | `--interpreter` | `micropython` (the default) or `circuitpython`: CircuitPython-compatible firmware from CircuitPython's own ports and boards. | | `--port` | The port: `unix`, `windows`, `webassembly`, `esp32`, `rp2`. With `--interpreter circuitpython`, CircuitPython's own: `espressif`, `raspberrypi`, `unix` and the rest. | | `--board` | The board, by upstream's directory name. | -| `--variant` | A variant of the board or port: upstream's, or one of ours in [`variants/`](../../variants). | +| `--variant` | A variant of the board or port: upstream's, or one of ours in [`variants/`](https://github.com/PyDevices/micropython-pydevices/tree/main/variants). | | `--modules` | A comma list of short names, full paths, or `all`. See [Modules](modules.md). | | `--flash` | esp32 flash size, such as `16MB`. | | `--no-autosize` | esp32 and rp2: refuse instead of growing the firmware's share of flash. | @@ -33,8 +33,8 @@ CircuitPython build they are part of the build record. | Variable | Default | Meaning | |---|---|---| | `OUT_DIR` | `builds/` | Where builds go. | -| `VARIANTS_DIR` | [`variants/`](../../variants) | Where our variants are found. | -| `MODULES_DIR` | [`modules/`](../../modules) | Where modules are found. | +| `VARIANTS_DIR` | [`variants/`](https://github.com/PyDevices/micropython-pydevices/tree/main/variants) | Where our variants are found. | +| `MODULES_DIR` | [`modules/`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules) | Where modules are found. | | `JOBS` | every core | The parallelism handed to make. | | `MSYS2_ROOT` | `C:\msys64` | On Windows, the MSYS2 whose make and MinGW gcc build the windows port. | | `IDF_TOOLS_PATH` | `~/.espressif` | Where an esp32 build installs ESP-IDF's toolchains. | diff --git a/docs/reference/files.md b/docs/reference/files.md index 47a7c4bf..028dab35 100644 --- a/docs/reference/files.md +++ b/docs/reference/files.md @@ -2,17 +2,17 @@ | Path | What it is | |---|---| -| [`build_mp.py`](../../build_mp.py) | The build command: [every option](build-command.md). It fills in `micropython/`, [`modules/`](../../modules) and `deps/` if they're missing, prepares the MicroPython tree and runs the port's own `make`. | -| [`UPSTREAM`](../../UPSTREAM) | The MicroPython commit everything applies to. | -| [`modules.lock`](../../modules.lock) | The commits [`build_mp.py`](../../build_mp.py) fetches when a module isn't there. It also pins [omnipython-lvgl](https://github.com/PyDevices/omnipython-lvgl), LVGL with its bindings and a port per interpreter: a build with `lvgl` (or `all`) fetches it into `modules/.omnipython-lvgl` and compiles the port for its interpreter. Beside sibling checkouts, these are links to those checkouts instead. | -| [`deps.lock`](../../deps.lock) | The toolchains [`build_mp.py`](../../build_mp.py) fetches: ESP-IDF, emsdk, SDL2 for MinGW, the TinyUSB the esp32 port builds on, and the ESP-IDF components CircuitPython builds ask for. It also pins CircuitPython, for `--interpreter circuitpython`. | -| [`provenance.json`](../../provenance.json) | The MicroPython pin and the checksum of every patch in [`patches/micropython/`](../../patches/micropython) and [`patches/tinyusb/`](../../patches/tinyusb). | -| [`modules/`](../../modules) | [`manifest.py`](../../modules/manifest.py), the manifest every build freezes; `all/`; the modules, [linked or cloned](modules.md); and `.esp-vision/`, the pin for [esp-vision's modules](../how-it-works/esp-vision.md). | -| [`patches/micropython/`](../../patches/micropython) | Our patch series, `0001-…` to `0042-…` (there is no `0026`, whose fix moved into [`patches/tinyusb/`](../../patches/tinyusb)), each justified in its own header. | -| [`patches/tinyusb/`](../../patches/tinyusb) | Patches to the TinyUSB the esp32 port builds on the S2, S3 and P4, which [`build_mp.py`](../../build_mp.py) applies to `deps/espressif__tinyusb` (at its `deps.lock` tag) and builds in place of the port's own copy. | -| [`patches/micropython-lib/`](../../patches/micropython-lib) | micropython-lib's own fixes from after the commit MicroPython's `lib/micropython-lib` points at. A firmware that freezes those packages, and a board whose `/lib` you fill from the submodule, both get them. | -| [`patches/circuitpython/`](../../patches/circuitpython) | Our patches to CircuitPython, applied to `deps/circuitpython`. | -| [`patches/apply_patches.py`](../../patches/apply_patches.py) | Applies the MicroPython series, plus each module's own MicroPython patches, once, as one local commit. `--check` tests a change without applying it. | +| [`build_mp.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/build_mp.py) | The build command: [every option](build-command.md). It fills in `micropython/`, [`modules/`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules) and `deps/` if they're missing, prepares the MicroPython tree and runs the port's own `make`. | +| [`UPSTREAM`](https://github.com/PyDevices/micropython-pydevices/blob/main/UPSTREAM) | The MicroPython commit everything applies to. | +| [`modules.lock`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules.lock) | The commits [`build_mp.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/build_mp.py) fetches when a module isn't there. It also pins [omnipython-lvgl](https://github.com/PyDevices/omnipython-lvgl), LVGL with its bindings and a port per interpreter: a build with `lvgl` (or `all`) fetches it into `modules/.omnipython-lvgl` and compiles the port for its interpreter. Beside sibling checkouts, these are links to those checkouts instead. | +| [`deps.lock`](https://github.com/PyDevices/micropython-pydevices/blob/main/deps.lock) | The toolchains [`build_mp.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/build_mp.py) fetches: ESP-IDF, emsdk, SDL2 for MinGW, the TinyUSB the esp32 port builds on, and the ESP-IDF components CircuitPython builds ask for. It also pins CircuitPython, for `--interpreter circuitpython`. | +| [`provenance.json`](https://github.com/PyDevices/micropython-pydevices/blob/main/provenance.json) | The MicroPython pin and the checksum of every patch in [`patches/micropython/`](https://github.com/PyDevices/micropython-pydevices/tree/main/patches/micropython) and [`patches/tinyusb/`](https://github.com/PyDevices/micropython-pydevices/tree/main/patches/tinyusb). | +| [`modules/`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules) | [`manifest.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/modules/manifest.py), the manifest every build freezes; `all/`; the modules, [linked or cloned](modules.md); and `.esp-vision/`, the pin for [esp-vision's modules](../how-it-works/esp-vision.md). | +| [`patches/micropython/`](https://github.com/PyDevices/micropython-pydevices/tree/main/patches/micropython) | Our patch series, `0001-…` to `0042-…` (there is no `0026`, whose fix moved into [`patches/tinyusb/`](https://github.com/PyDevices/micropython-pydevices/tree/main/patches/tinyusb)), each justified in its own header. | +| [`patches/tinyusb/`](https://github.com/PyDevices/micropython-pydevices/tree/main/patches/tinyusb) | Patches to the TinyUSB the esp32 port builds on the S2, S3 and P4, which [`build_mp.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/build_mp.py) applies to `deps/espressif__tinyusb` (at its `deps.lock` tag) and builds in place of the port's own copy. | +| [`patches/micropython-lib/`](https://github.com/PyDevices/micropython-pydevices/tree/main/patches/micropython-lib) | micropython-lib's own fixes from after the commit MicroPython's `lib/micropython-lib` points at. A firmware that freezes those packages, and a board whose `/lib` you fill from the submodule, both get them. | +| [`patches/circuitpython/`](https://github.com/PyDevices/micropython-pydevices/tree/main/patches/circuitpython) | Our patches to CircuitPython, applied to `deps/circuitpython`. | +| [`patches/apply_patches.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/patches/apply_patches.py) | Applies the MicroPython series, plus each module's own MicroPython patches, once, as one local commit. `--check` tests a change without applying it. | | [`variants/`](boards.md#variants) | Our variants and the esp32 settings. | | [`boards/circuitpython/`](boards.md#circuitpython-boards) | Boards CircuitPython has no definition for. | -| [`scripts/`](../../scripts) | `exercise_build.sh`, `release_firmware.py`, `stage_firmware_page.py`, `serve_workbench.sh`, `freeze_list.py`, `update_provenance.py`. [Contributing](../../CONTRIBUTING.md) says what each is for. | +| [`scripts/`](https://github.com/PyDevices/micropython-pydevices/tree/main/scripts) | `exercise_build.sh`, `release_firmware.py`, `stage_firmware_page.py`, `serve_workbench.sh`, `freeze_list.py`, `update_provenance.py`. [Contributing](https://github.com/PyDevices/micropython-pydevices/blob/main/CONTRIBUTING.md) says what each is for. | diff --git a/docs/reference/index.md b/docs/reference/index.md index f4360ae1..191fa51d 100644 --- a/docs/reference/index.md +++ b/docs/reference/index.md @@ -1,7 +1,7 @@ # Reference This repository has no Python package to document, so these pages are tables: -what [`build_mp.py`](../../build_mp.py) takes, the modules you can name, the boards and variants +what [`build_mp.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/build_mp.py) takes, the modules you can name, the boards and variants built, and the files that pin what a build uses. - [The build command](build-command.md): every option, environment variable and @@ -9,7 +9,7 @@ built, and the files that pin what a build uses. - [Modules](modules.md): the short names `--modules` takes, and which build on CircuitPython. - [Boards and variants](boards.md): the command for each board, and every variant - in [`variants/`](../../variants) and [`boards/`](../../boards). + in [`variants/`](https://github.com/PyDevices/micropython-pydevices/tree/main/variants) and [`boards/`](https://github.com/PyDevices/micropython-pydevices/tree/main/boards). - [Files and pins](files.md): `UPSTREAM`, the lock files, the patch series and the scripts. diff --git a/docs/reference/modules.md b/docs/reference/modules.md index 1ead624d..2d537ab7 100644 --- a/docs/reference/modules.md +++ b/docs/reference/modules.md @@ -8,18 +8,18 @@ tracked here or linked from a sibling checkout or cloned at the commit in | Module | What it is | |---|---| -| [`audioif`](../../modules/audioif) | The audio hardware under the audio pump, with CircuitPython's `audiobusio.I2SOut` and `audioi2sin.I2SIn` on top. | -| [`cameraif`](../../modules/cameraif) | A MIPI-CSI camera as a MicroPython object, on the ESP32-P4. | -| [`castif`](../../modules/castif) | Casts an ESP32-P4's screen and sound to a TV over Wi-Fi Display, or serves them as live HLS. | -| [`displayif`](../../modules/displayif) | The display buses and panels under `displaydev` (SPI, I2C, i80, QSPI, dot-clock RGB, MIPI-DSI, PicoDVI, RGB matrix, SDL2). The dot-clock, MIPI-DSI, PicoDVI and RGB matrix modules keep CircuitPython's names. | -| [`h264enc`](../../modules/h264enc) | RGB565 frames to H.264 on the ESP32-P4's hardware encoder. | -| [`jpegio`](../../modules/jpegio) | JPEG decode and encode, with CircuitPython's `jpegio` API. | -| [`mdns`](../../modules/mdns) | Find and advertise services on the local network, with CircuitPython's `mdns` API (esp32, rp2, unix, windows). | -| [`picotts`](../../modules/picotts) | Text to speech on the SVOX Pico engine, with the API of Adafruit's `adafruit_picotts`. Opt-in, and it needs PSRAM. | -| [`pngio`](../../modules/pngio) | PNG encode and decode, RGB565 in and out. | -| [`ppa`](../../modules/ppa) | Scale, rotate, convert and fill pixel buffers, on the ESP32-P4's Pixel Processing Accelerator or in portable C elsewhere. | -| [`tsmux`](../../modules/tsmux) | MPEG-TS and HLS segments from H.264. | -| [`usbhost`](../../modules/usbhost) | The USB host port and isochronous streams that `usb.core` and the `usb.host.*` packages are built on (ESP32-S2, S3 and P4). | +| [`audioif`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/audioif) | The audio hardware under the audio pump, with CircuitPython's `audiobusio.I2SOut` and `audioi2sin.I2SIn` on top. | +| [`cameraif`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/cameraif) | A MIPI-CSI camera as a MicroPython object, on the ESP32-P4. | +| [`castif`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/castif) | Casts an ESP32-P4's screen and sound to a TV over Wi-Fi Display, or serves them as live HLS. | +| [`displayif`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/displayif) | The display buses and panels under `displaydev` (SPI, I2C, i80, QSPI, dot-clock RGB, MIPI-DSI, PicoDVI, RGB matrix, SDL2). The dot-clock, MIPI-DSI, PicoDVI and RGB matrix modules keep CircuitPython's names. | +| [`h264enc`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/h264enc) | RGB565 frames to H.264 on the ESP32-P4's hardware encoder. | +| [`jpegio`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/jpegio) | JPEG decode and encode, with CircuitPython's `jpegio` API. | +| [`mdns`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/mdns) | Find and advertise services on the local network, with CircuitPython's `mdns` API (esp32, rp2, unix, windows). | +| [`picotts`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/picotts) | Text to speech on the SVOX Pico engine, with the API of Adafruit's `adafruit_picotts`. Opt-in, and it needs PSRAM. | +| [`pngio`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/pngio) | PNG encode and decode, RGB565 in and out. | +| [`ppa`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/ppa) | Scale, rotate, convert and fill pixel buffers, on the ESP32-P4's Pixel Processing Accelerator or in portable C elsewhere. | +| [`tsmux`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/tsmux) | MPEG-TS and HLS segments from H.264. | +| [`usbhost`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/usbhost) | The USB host port and isochronous streams that `usb.core` and the `usb.host.*` packages are built on (ESP32-S2, S3 and P4). | ## Modules from other repositories @@ -31,16 +31,16 @@ tracked here or linked from a sibling checkout or cloned at the commit in | `micropython-lib` | MicroPython's own upstream packages, frozen from the checkout the MicroPython tree carries. | | `tflite`, `vision` | [esp-vision's modules](../guides/use-esp-vision-modules.md), opt-in: `all` leaves them out. | -[`modules/all`](../../modules/all) is not a module but the rule behind `all`: every module beside it +[`modules/all`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/all) is not a module but the rule behind `all`: every module beside it except those with an `OPT_IN` file: `picotts`, `tflite` and `vision`. ## Which modules build on CircuitPython What `--modules` can name on CircuitPython, and why a module is missing where it is. "Unix" is CircuitPython's unix port, built and imported in -[`circuitpython.yml`](../../.github/workflows/circuitpython.yml); +[`circuitpython.yml`](https://github.com/PyDevices/micropython-pydevices/blob/main/.github/workflows/circuitpython.yml); "boards" are the five CircuitPython cells of -[`release-firmware.yml`](../../.github/workflows/release-firmware.yml). +[`release-firmware.yml`](https://github.com/PyDevices/micropython-pydevices/blob/main/.github/workflows/release-firmware.yml). | Module | Unix | Boards | Notes | |---|---|---|---| @@ -53,15 +53,15 @@ it is. "Unix" is CircuitPython's unix port, built and imported in | jpegio | yes | ESP32-P4 | Adds only the encoder's C API: CircuitPython has its own `jpegio` decoder. | | cameraif | yes (`available()` is False) | ESP32-P4 | | | mdns | yes | no, on purpose | CircuitPython's boards have an `mdns` of their own; its unix port has none. | -| usbhost | yes, as `_usbhost`, with no host engine | ESP32-P4 | The host engine runs on ESP-IDF's USB host library, which from ESP-IDF 6 is Espressif's `usb` component: [`build_mp.py`](../../build_mp.py) fetches it at the version `deps.lock` pins. The P4's boards leave its high-speed controller to us. Tethering is left out until the port has a network. The S3's one controller is CircuitPython's drive and REPL, so it gets the module without the engine. On the RP2040 and i.MX, CircuitPython's own `usb.core` is the host. | +| usbhost | yes, as `_usbhost`, with no host engine | ESP32-P4 | The host engine runs on ESP-IDF's USB host library, which from ESP-IDF 6 is Espressif's `usb` component: [`build_mp.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/build_mp.py) fetches it at the version `deps.lock` pins. The P4's boards leave its high-speed controller to us. Tethering is left out until the port has a network. The S3's one controller is CircuitPython's drive and REPL, so it gets the module without the engine. On the RP2040 and i.MX, CircuitPython's own `usb.core` is the host. | | audioif | no | no | Links against audiodsp's audio pump and `cp_compat`, which audiodsp's CircuitPython glue doesn't build. It isn't needed there: audioif gives MicroPython the `audiobusio` and `audioi2sin` that CircuitPython boards already have. | | ulab | CircuitPython's own | CircuitPython's own | | | castif | no: it is the ESP32-P4's | ESP32-P4, with no network | Talks to lwIP directly, the lwIP under CircuitPython's own `socketpool`. CircuitPython's P4 port has no network until it drives the boards' ESP32-C6, so castif is built without one and `start()` says so. Name tsmux, h264enc and ppa with it. | -| h264enc | no: it is the ESP32-P4's encoder | ESP32-P4 | Espressif's `esp_h264`, which CircuitPython's port, built with the component manager off, can't fetch itself, is pinned in `deps.lock` and fetched by [`build_mp.py`](../../build_mp.py). Name ppa with it. | +| h264enc | no: it is the ESP32-P4's encoder | ESP32-P4 | Espressif's `esp_h264`, which CircuitPython's port, built with the component manager off, can't fetch itself, is pinned in `deps.lock` and fetched by [`build_mp.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/build_mp.py). Name ppa with it. | | picotts | no | no, on purpose | CircuitPython has Adafruit's `adafruit_picotts`, the same engine and API as a native `.mpy`. | | tflite, vision | no | no, on purpose | esp-vision's modules, for MicroPython only. | | lvgl | yes | all five | One name for both interpreters: a CircuitPython build compiles omnipython-lvgl's `ports/circuitpython`. A board build needs `CIRCUITPY_GIFIO=0`, since LVGL links its own AnimatedGIF decoder; our boards set it. | | micropython-lib | no | no | MicroPython's own upstream packages. | -| pydevices, palettes, pdwidgets | frozen | frozen | Python only. On unix, pydevices also freezes its desktop files (the boards drop them), and pdwidgets and palettes with it: together their names pass CircuitPython's 64 KB frozen-string pool, so [`build_mp.py`](../../build_mp.py) builds the unix port with four-byte qstr offsets (patches 0001 and 0010). Boards keep two-byte offsets. | +| pydevices, palettes, pdwidgets | frozen | frozen | Python only. On unix, pydevices also freezes its desktop files (the boards drop them), and pdwidgets and palettes with it: together their names pass CircuitPython's 64 KB frozen-string pool, so [`build_mp.py`](https://github.com/PyDevices/micropython-pydevices/blob/main/build_mp.py) builds the unix port with four-byte qstr offsets (patches 0001 and 0010). Boards keep two-byte offsets. | -What is planned for the rest is in the [roadmap](../../ROADMAP.md). +What is planned for the rest is in the [roadmap](https://github.com/PyDevices/micropython-pydevices/blob/main/ROADMAP.md).