summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhathach <[email protected]>2025-11-19 22:26:10 +0700
committerhathach <[email protected]>2025-11-19 22:26:10 +0700
commit9d7b401c3d98d7923ce3b53d4a129e156e4c9a97 (patch)
tree99368961456094a614ae2743fc58a1268c0be2fb
parentd1a261ec1260483b9c7fa2c1a2f2fbb2e36c074d (diff)
remove copilot-instructions.md, update and use AGENTS.md instead
-rw-r--r--.github/copilot-instructions.md214
-rwxr-xr-x.github/workflows/ci_set_matrix.py3
-rw-r--r--AGENTS.md130
3 files changed, 67 insertions, 280 deletions
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
deleted file mode 100644
index 9f9ab7e72..000000000
--- a/.github/copilot-instructions.md
+++ /dev/null
@@ -1,214 +0,0 @@
-# TinyUSB
-TinyUSB is an open-source cross-platform USB Host/Device stack for embedded systems, designed to be memory-safe with no dynamic allocation and thread-safe with all interrupt events deferred to non-ISR task functions.
-
-Always reference these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the info here.
-
-## Working Effectively
-
-### Bootstrap and Build Setup
-- Install ARM GCC toolchain: `sudo apt-get update && sudo apt-get install -y gcc-arm-none-eabi`
-- Fetch core dependencies: `python3 tools/get_deps.py` -- takes <1 second. NEVER CANCEL.
-- For specific board families: `python3 tools/get_deps.py FAMILY_NAME` (e.g., rp2040, stm32f4)
-- Dependencies are cached in `lib/` and `hw/mcu/` directories
-
-### Build Examples
-Choose ONE of these approaches:
-
-**Option 1: Individual Example with CMake (RECOMMENDED)**
-```bash
-cd examples/device/cdc_msc
-mkdir -p build && cd build
-cmake -DBOARD=raspberry_pi_pico -DCMAKE_BUILD_TYPE=MinSizeRel ..
-cmake --build . -j4
-```
--- takes 1-2 seconds. NEVER CANCEL. Set timeout to 5+ minutes.
-
-**CMake with Ninja (Alternative)**
-```bash
-cd examples/device/cdc_msc
-mkdir build && cd build
-cmake -G Ninja -DBOARD=raspberry_pi_pico ..
-ninja
-```
-
-**Option 2: Individual Example with Make**
-```bash
-cd examples/device/cdc_msc
-make BOARD=raspberry_pi_pico all
-```
--- takes 2-3 seconds. NEVER CANCEL. Set timeout to 5+ minutes.
-
-**Option 3: All Examples for a Board**
-```bash
-python3 tools/build.py -b BOARD_NAME
-```
--- takes 15-20 seconds, may have some objcopy failures that are non-critical. NEVER CANCEL. Set timeout to 30+ minutes.
-
-### Build Options
-- **Debug build**:
- - CMake: `-DCMAKE_BUILD_TYPE=Debug`
- - Make: `DEBUG=1`
-- **With logging**:
- - CMake: `-DLOG=2`
- - Make: `LOG=2`
-- **With RTT logger**:
- - CMake: `-DLOG=2 -DLOGGER=rtt`
- - Make: `LOG=2 LOGGER=rtt`
-- **RootHub port selection**:
- - CMake: `-DRHPORT_DEVICE=1`
- - Make: `RHPORT_DEVICE=1`
-- **Port speed**:
- - CMake: `-DRHPORT_DEVICE_SPEED=OPT_MODE_FULL_SPEED`
- - Make: `RHPORT_DEVICE_SPEED=OPT_MODE_FULL_SPEED`
-
-### Flashing and Deploymen
-- **Flash with JLink**:1
- - CMake: `ninja cdc_msc-jlink`
- - Make: `make BOARD=raspberry_pi_pico flash-jlink`
-- **Flash with OpenOCD**:
- - CMake: `ninja cdc_msc-openocd`
- - Make: `make BOARD=raspberry_pi_pico flash-openocd`
-- **Generate UF2**:
- - CMake: `ninja cdc_msc-uf2`
- - Make: `make BOARD=raspberry_pi_pico all uf2`
-- **List all targets** (CMake/Ninja): `ninja -t targets`
-
-### Unit Testing
-- Install Ceedling: `sudo gem install ceedling`
-- Run all unit tests: `cd test/unit-test && ceedling` or `cd test/unit-test && ceedling test:all` -- takes 4 seconds. NEVER CANCEL. Set timeout to 10+ minutes.
-- Run specific test: `cd test/unit-test && ceedling test:test_fifo`
-- Tests use Unity framework with CMock for mocking
-
-### Documentation
-- Install requirements: `pip install -r docs/requirements.txt`
-- Build docs: `cd docs && sphinx-build -b html . _build` -- takes 2-3 seconds. NEVER CANCEL. Set timeout to 10+ minutes.
-
-### Code Quality and Validation
-- Format code: `clang-format -i path/to/file.c` (uses `.clang-format` config)
-- Check spelling: `pip install codespell && codespell` (uses `.codespellrc` config)
-- Pre-commit hooks validate unit tests and code quality automatically
-
-### Static Analysis with PVS-Studio
-- **Analyze whole project**:
- ```bash
- pvs-studio-analyzer analyze -f examples/cmake-build-raspberry_pi_pico/compile_commands.json -R .PVS-Studio/.pvsconfig -o pvs-report.log -j12 --dump-files --misra-cpp-version 2008 --misra-c-version 2023 --use-old-parser
- ```
-- **Analyze specific source files**:
- ```bash
- pvs-studio-analyzer analyze -f examples/cmake-build-raspberry_pi_pico/compile_commands.json -R .PVS-Studio/.pvsconfig -S path/to/file.c -o pvs-report.log -j12 --dump-files --misra-cpp-version 2008 --misra-c-version 2023 --use-old-parser
- ```
-- **Multiple specific files**:
- ```bash
- pvs-studio-analyzer analyze -f examples/cmake-build-raspberry_pi_pico/compile_commands.json -R .PVS-Studio/.pvsconfig -S src/file1.c -S src/file2.c -o pvs-report.log -j12 --dump-files --misra-cpp-version 2008 --misra-c-version 2023 --use-old-parser
- ```
-- Requires `compile_commands.json` in the build directory (generated by CMake with `-DCMAKE_EXPORT_COMPILE_COMMANDS=ON`)
-- Use `-f` option to specify path to `compile_commands.json`
-- Use `-R .PVS-Studio/.pvsconfig` to specify rule configuration file
-- Use `-j12` for parallel analysis with 12 threads
-- `--dump-files` saves preprocessed files for debugging
-- `--misra-c-version 2023` enables MISRA C:2023 checks
-- `--misra-cpp-version 2008` enables MISRA C++:2008 checks
-- `--use-old-parser` uses legacy parser for compatibility
-- Analysis takes ~10-30 seconds depending on project size. Set timeout to 5+ minutes.
-- View results: `plog-converter -a GA:1,2 -t errorfile pvs-report.log` or open in PVS-Studio GUI
-
-## Validation
-
-### ALWAYS Run These After Making Changes
-1. **Pre-commit validation** (RECOMMENDED): `pre-commit run --all-files`
- - Install pre-commit: `pip install pre-commit && pre-commit install`
- - Runs all quality checks, unit tests, spell checking, and formatting
- - Takes 10-15 seconds. NEVER CANCEL. Set timeout to 15+ minutes.
-2. **Build validation**: Build at least one example that exercises your changes
- ```bash
- cd examples/device/cdc_msc
- make BOARD=raspberry_pi_pico all
- ```
-
-### Manual Testing Scenarios
-- **Device examples**: Cannot be fully tested without real hardware, but must build successfully
-- **Unit tests**: Exercise core stack functionality - ALL tests must pass
-- **Build system**: Must be able to build examples for multiple board families
-
-### Board Selection for Testing
-- **STM32F4**: `stm32f407disco` - no external SDK required, good for testing
-- **RP2040**: `raspberry_pi_pico` - requires Pico SDK, commonly used
-- **Other families**: Check `hw/bsp/FAMILY/boards/` for available boards
-
-## Common Tasks and Time Expectations
-
-### Repository Structure Quick Reference
-```
-├── src/ # Core TinyUSB stack
-│ ├── class/ # USB device classes (CDC, HID, MSC, Audio, etc.)
-│ ├── portable/ # MCU-specific drivers (organized by vendor)
-│ ├── device/ # USB device stack core
-│ ├── host/ # USB host stack core
-│ └── common/ # Shared utilities (FIFO, etc.)
-├── examples/ # Example applications
-│ ├── device/ # Device examples (cdc_msc, hid_generic, etc.)
-│ ├── host/ # Host examples
-│ └── dual/ # Dual-role examples
-├── hw/bsp/ # Board Support Packages
-│ └── FAMILY/boards/ # Board-specific configurations
-├── test/unit-test/ # Unit tests using Ceedling
-├── tools/ # Build and utility scripts
-└── docs/ # Sphinx documentation
-```
-
-### Build Time Reference
-- **Dependency fetch**: <1 second
-- **Single example build**: 1-3 seconds
-- **Unit tests**: ~4 seconds
-- **Documentation build**: ~2.5 seconds
-- **Full board examples**: 15-20 seconds
-- **Toolchain installation**: 2-5 minutes (one-time)
-
-### Key Files to Know
-- `tools/get_deps.py`: Manages dependencies for MCU families
-- `tools/build.py`: Builds multiple examples, supports make/cmake
-- `src/tusb.h`: Main TinyUSB header file
-- `src/tusb_config.h`: Configuration template
-- `examples/device/cdc_msc/`: Most commonly used example for testing
-- `test/unit-test/project.yml`: Ceedling test configuration
-
-### Debugging Build Issues
-- **Missing compiler**: Install `gcc-arm-none-eabi` package
-- **Missing dependencies**: Run `python3 tools/get_deps.py FAMILY`
-- **Board not found**: Check `hw/bsp/FAMILY/boards/` for valid board names
-- **objcopy errors**: Often non-critical in full builds, try individual example builds
-
-### Working with USB Device Classes
-- **CDC (Serial)**: `src/class/cdc/` - Virtual serial port
-- **HID**: `src/class/hid/` - Human Interface Device (keyboard, mouse, etc.)
-- **MSC**: `src/class/msc/` - Mass Storage Class (USB drive)
-- **Audio**: `src/class/audio/` - USB Audio Class
-- Each class has device (`*_device.c`) and host (`*_host.c`) implementations
-
-### MCU Family Support
-- **STM32**: Largest support (F0, F1, F2, F3, F4, F7, G0, G4, H7, L4, U5, etc.)
-- **Raspberry Pi**: RP2040, RP2350 with PIO-USB host support
-- **NXP**: iMXRT, Kinetis, LPC families
-- **Microchip**: SAM D/E/G/L families
-- Check `hw/bsp/` for complete list and `docs/reference/boards.rst` for details
-
-## Code Style Guidelines
-
-### General Coding Standards
-- Use C99 standard
-- Memory-safe: no dynamic allocation
-- Thread-safe: defer all interrupt events to non-ISR task functions
-- 2-space indentation, no tabs
-- Use snake_case for variables/functions
-- Use UPPER_CASE for macros and constants
-- Follow existing variable naming patterns in files you're modifying
-- Include proper header comments with MIT license
-- Add descriptive comments for non-obvious functions
-
-### Best Practices
-- When including headers, group in order: C stdlib, tusb common, drivers, classes
-- Always check return values from functions that can fail
-- Use TU_ASSERT() for error checking with return statements
-- Follow the existing code patterns in the files you're modifying
-
-Remember: TinyUSB is designed for embedded systems - builds are fast, tests are focused, and the codebase is optimized for resource-constrained environments.
diff --git a/.github/workflows/ci_set_matrix.py b/.github/workflows/ci_set_matrix.py
index 3789b4116..9d0e42c2e 100755
--- a/.github/workflows/ci_set_matrix.py
+++ b/.github/workflows/ci_set_matrix.py
@@ -41,7 +41,8 @@ family_list = {
"stm32f4": ["arm-gcc", "arm-clang", "arm-iar"],
"stm32f7": ["arm-gcc", "arm-clang", "arm-iar"],
"stm32g0 stm32g4 stm32h5": ["arm-gcc", "arm-clang", "arm-iar"],
- "stm32h7 stm32h7rs": ["arm-gcc", "arm-clang", "arm-iar"],
+ "stm32h7": ["arm-gcc", "arm-clang", "arm-iar"],
+ "stm32h7rs": ["arm-gcc", "arm-clang", "arm-iar"],
"stm32l0 stm32l4": ["arm-gcc", "arm-clang", "arm-iar"],
"stm32n6": ["arm-gcc"],
"stm32u0 stm32u5 stm32wb": ["arm-gcc", "arm-clang", "arm-iar"],
diff --git a/AGENTS.md b/AGENTS.md
index 27bc60515..d00a4b114 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,52 +1,43 @@
-# Agent Handbook
+# TinyUSB Agent Instructions
-## Shared TinyUSB Ground Rules
+TinyUSB is an open-source cross-platform USB Host/Device stack for embedded systems, designed to be memory-safe with no
+dynamic allocation and thread-safe with all interrupt events deferred to non-ISR task functions.
+
+Always reference these instructions first and fallback to search or bash commands only when you encounter unexpected
+information that does not match the info here.
+
+## Shared Ground Rules
- Keep TinyUSB memory-safe: avoid dynamic allocation, defer ISR work to task context, and follow C99 with two-space indentation/no tabs.
- Match file organization: core stack under `src`, MCU/BSP support in `hw/{mcu,bsp}`, examples under `examples/{device,host,dual}`, docs in `docs`, tests under `test/{unit-test,fuzz,hil}`.
- Use descriptive snake_case for helpers, reserve `tud_`/`tuh_` for public APIs, `TU_` for macros, and keep headers self-contained with `#if CFG_TUSB_MCU` guards where needed.
- Prefer `.clang-format` for C/C++ formatting, run `pre-commit run --all-files` before submitting, and document board/HIL coverage when applicable.
- Commit in imperative mood, keep changes scoped, and supply PRs with linked issues plus test/build evidence.
-## Build and Test Cheatsheet
-- Fetch dependencies once with `python3 tools/get_deps.py [FAMILY]`; assets land in `lib/` and `hw/mcu/`.
-- CMake (preferred): `cmake -G Ninja -DBOARD=<board> -DCMAKE_BUILD_TYPE={MinSizeRel|Debug}` inside an example `build/` dir, then `ninja` or `cmake --build .`.
-- Make (alt): `make BOARD=<board> [DEBUG=1] [LOG=2 LOGGER=rtt] all` from the example root; add `uf2`, `flash-openocd`, or `flash-jlink` targets as needed.
-- Bulk builds: `python3 tools/build.py -b <board>` to sweep all examples; expect occasional non-critical objcopy warnings.
-- Unit tests: `cd test/unit-test && ceedling test:all` (or a specific `test_<module>`), honor Unity/CMock fixtures under `test/support`.
-- Docs: `pip install -r docs/requirements.txt` then `sphinx-build -b html . _build` from `docs/`.
-
-## Validation Checklist
-1. `pre-commit run --all-files` after edits (install with `pip install pre-commit && pre-commit install`).
-2. Build at least one representative example (e.g., `examples/device/cdc_msc`) via CMake+Ninja or Make.
-3. Run unit tests relevant to touched modules; add fuzz/HIL coverage when modifying parsers or protocol state machines.
-
-## Copilot Agent Notes (`.github/copilot-instructions.md`)
-# TinyUSB
-TinyUSB is an open-source cross-platform USB Host/Device stack for embedded systems, designed to be memory-safe with no dynamic allocation and thread-safe with all interrupt events deferred to non-ISR task functions.
-
-Always reference these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the info here.
-### Working Effectively
+## Bootstrap and Build Setup
-#### Bootstrap and Build Setup
- Install ARM GCC toolchain: `sudo apt-get update && sudo apt-get install -y gcc-arm-none-eabi`
- Fetch core dependencies: `python3 tools/get_deps.py` -- takes <1 second. NEVER CANCEL.
- For specific board families: `python3 tools/get_deps.py FAMILY_NAME` (e.g., rp2040, stm32f4)
- Dependencies are cached in `lib/` and `hw/mcu/` directories
-#### Build Examples
+## Build Examples
+
Choose ONE of these approaches:
**Option 1: Individual Example with CMake (RECOMMENDED)**
+
```bash
cd examples/device/cdc_msc
mkdir -p build && cd build
cmake -DBOARD=raspberry_pi_pico -DCMAKE_BUILD_TYPE=MinSizeRel ..
cmake --build . -j4
```
+
-- takes 1-2 seconds. NEVER CANCEL. Set timeout to 5+ minutes.
**CMake with Ninja (Alternative)**
+
```bash
cd examples/device/cdc_msc
mkdir build && cd build
@@ -55,63 +46,74 @@ ninja
```
**Option 2: Individual Example with Make**
+
```bash
cd examples/device/cdc_msc
make BOARD=raspberry_pi_pico all
```
+
-- takes 2-3 seconds. NEVER CANCEL. Set timeout to 5+ minutes.
**Option 3: All Examples for a Board**
+
```bash
python3 tools/build.py -b BOARD_NAME
```
+
-- takes 15-20 seconds, may have some objcopy failures that are non-critical. NEVER CANCEL. Set timeout to 30+ minutes.
-#### Build Options
+## Build Options
+
- **Debug build**:
- - CMake: `-DCMAKE_BUILD_TYPE=Debug`
- - Make: `DEBUG=1`
+ - CMake: `-DCMAKE_BUILD_TYPE=Debug`
+ - Make: `DEBUG=1`
- **With logging**:
- - CMake: `-DLOG=2`
- - Make: `LOG=2`
+ - CMake: `-DLOG=2`
+ - Make: `LOG=2`
- **With RTT logger**:
- - CMake: `-DLOG=2 -DLOGGER=rtt`
- - Make: `LOG=2 LOGGER=rtt`
+ - CMake: `-DLOG=2 -DLOGGER=rtt`
+ - Make: `LOG=2 LOGGER=rtt`
- **RootHub port selection**:
- - CMake: `-DRHPORT_DEVICE=1`
- - Make: `RHPORT_DEVICE=1`
+ - CMake: `-DRHPORT_DEVICE=1`
+ - Make: `RHPORT_DEVICE=1`
- **Port speed**:
- - CMake: `-DRHPORT_DEVICE_SPEED=OPT_MODE_FULL_SPEED`
- - Make: `RHPORT_DEVICE_SPEED=OPT_MODE_FULL_SPEED`
+ - CMake: `-DRHPORT_DEVICE_SPEED=OPT_MODE_FULL_SPEED`
+ - Make: `RHPORT_DEVICE_SPEED=OPT_MODE_FULL_SPEED`
+
+## Flashing and Deployment
-#### Flashing and Deployment
- **Flash with JLink**:
- - CMake: `ninja cdc_msc-jlink`
- - Make: `make BOARD=raspberry_pi_pico flash-jlink`
+ - CMake: `ninja cdc_msc-jlink`
+ - Make: `make BOARD=raspberry_pi_pico flash-jlink`
- **Flash with OpenOCD**:
- - CMake: `ninja cdc_msc-openocd`
- - Make: `make BOARD=raspberry_pi_pico flash-openocd`
+ - CMake: `ninja cdc_msc-openocd`
+ - Make: `make BOARD=raspberry_pi_pico flash-openocd`
- **Generate UF2**:
- - CMake: `ninja cdc_msc-uf2`
- - Make: `make BOARD=raspberry_pi_pico all uf2`
+ - CMake: `ninja cdc_msc-uf2`
+ - Make: `make BOARD=raspberry_pi_pico all uf2`
- **List all targets** (CMake/Ninja): `ninja -t targets`
-#### Unit Testing
+## Unit Testing
+
- Install Ceedling: `sudo gem install ceedling`
-- Run all unit tests: `cd test/unit-test && ceedling` or `cd test/unit-test && ceedling test:all` -- takes 4 seconds. NEVER CANCEL. Set timeout to 10+ minutes.
+- Run all unit tests: `cd test/unit-test && ceedling` or `cd test/unit-test && ceedling test:all` -- takes 4 seconds.
+ NEVER CANCEL. Set timeout to 10+ minutes.
- Run specific test: `cd test/unit-test && ceedling test:test_fifo`
- Tests use Unity framework with CMock for mocking
-#### Documentation
+## Documentation
+
- Install requirements: `pip install -r docs/requirements.txt`
- Build docs: `cd docs && sphinx-build -b html . _build` -- takes 2-3 seconds. NEVER CANCEL. Set timeout to 10+ minutes.
-#### Code Quality and Validation
+## Code Quality and Validation
+
- Format code: `clang-format -i path/to/file.c` (uses `.clang-format` config)
- Check spelling: `pip install codespell && codespell` (uses `.codespellrc` config)
- Pre-commit hooks validate unit tests and code quality automatically
-#### Static Analysis with PVS-Studio
+## Static Analysis with PVS-Studio
+
- **Analyze whole project**:
```bash
pvs-studio-analyzer analyze -f examples/cmake-build-raspberry_pi_pico/compile_commands.json -R .PVS-Studio/.pvsconfig -o pvs-report.log -j12 --dump-files --misra-cpp-version 2008 --misra-c-version 2023 --use-old-parser
@@ -135,32 +137,40 @@ python3 tools/build.py -b BOARD_NAME
- Analysis takes ~10-30 seconds depending on project size. Set timeout to 5+ minutes.
- View results: `plog-converter -a GA:1,2 -t errorfile pvs-report.log` or open in PVS-Studio GUI
-### Validation
+## Validation Checklist
+
+### ALWAYS Run These After Making Changes
-#### ALWAYS Run These After Making Changes
1. **Pre-commit validation** (RECOMMENDED): `pre-commit run --all-files`
- - Install pre-commit: `pip install pre-commit && pre-commit install`
- - Runs all quality checks, unit tests, spell checking, and formatting
- - Takes 10-15 seconds. NEVER CANCEL. Set timeout to 15+ minutes.
+ - Install pre-commit: `pip install pre-commit && pre-commit install`
+ - Runs all quality checks, unit tests, spell checking, and formatting
+ - Takes 10-15 seconds. NEVER CANCEL. Set timeout to 15+ minutes.
2. **Build validation**: Build at least one example that exercises your changes
```bash
cd examples/device/cdc_msc
make BOARD=raspberry_pi_pico all
```
+3. Run unit tests relevant to touched modules; add fuzz/HIL coverage when modifying parsers or protocol state machines.
-#### Manual Testing Scenarios
+### Manual Testing Scenarios
- **Device examples**: Cannot be fully tested without real hardware, but must build successfully
- **Unit tests**: Exercise core stack functionality - ALL tests must pass
- **Build system**: Must be able to build examples for multiple board families
-#### Board Selection for Testing
+### Board Selection for Testing
- **STM32F4**: `stm32f407disco` - no external SDK required, good for testing
- **RP2040**: `raspberry_pi_pico` - requires Pico SDK, commonly used
- **Other families**: Check `hw/bsp/FAMILY/boards/` for available boards
-### Common Tasks and Time Expectations
+## Release Instructions
+
+1. Bump the release version variable at the top of `tools/make_release.py`.
+2. Execute `python tools/make_release.py` to refresh `src/tusb_option.h`, `repository.yml`, and `library.json`.
+3. Generate release notes by running `git log <last-release-tag>..HEAD`, then add a new entry to
+ `docs/info/changelog.rst` that follows the existing format (heading, date, highlights, categorized bullet lists).
+4. Proceed with tagging/publishing once builds and tests succeed.
-#### Repository Structure Quick Reference
+## Repository Structure Quick Reference
```
├── src/ # Core TinyUSB stack
│ ├── class/ # USB device classes (CDC, HID, MSC, Audio, etc.)
@@ -235,13 +245,3 @@ python3 tools/build.py -b BOARD_NAME
- Follow the existing code patterns in the files you're modifying
Remember: TinyUSB is designed for embedded systems - builds are fast, tests are focused, and the codebase is optimized for resource-constrained environments.
-
-## Claude Agent Notes (`CLAUDE.md`)
-- Default to CMake+Ninja for builds, but align with Make workflows when users rely on legacy scripts; provide DEBUG/LOG/LOGGER knobs consistently.
-- Highlight dependency helpers (`tools/get_deps.py rp2040`) and reference core locations: `src/`, `hw/`, `examples/`, `test/`.
-- Run `clang-format` on all touched files to ensure consistent formatting.
-- Use `TU_ASSERT` for all fallible calls to enforce runtime checks.
-- Ensure header comments retain the MIT license notice.
-- Add descriptive comments for non-trivial code paths to aid maintainability.
-- Release flow primer: bump `tools/make_release.py` version, run the script (updates `src/tusb_option.h`, `repository.yml`, `library.json`), refresh `docs/info/changelog.rst`, then tag.
-- Testing reminders: Ceedling full or targeted runs, specify board/OS context, and ensure logging of manual hardware outcomes when available.