| # TinyUSB Development Guide |
| |
| ## Build Commands |
| |
| ### CMake Build System (Preferred) |
| CMake with Ninja is the preferred build method for TinyUSB development. |
| |
| - Build example with Ninja: |
| ```bash |
| cd examples/device/cdc_msc |
| mkdir build && cd build |
| cmake -G Ninja -DBOARD=raspberry_pi_pico .. |
| ninja |
| ``` |
| - Debug build: `cmake -G Ninja -DBOARD=raspberry_pi_pico -DCMAKE_BUILD_TYPE=Debug ..` |
| - With logging: `cmake -G Ninja -DBOARD=raspberry_pi_pico -DLOG=2 ..` |
| - With RTT logger: `cmake -G Ninja -DBOARD=raspberry_pi_pico -DLOG=2 -DLOGGER=rtt ..` |
| - Flash with JLink: `ninja cdc_msc-jlink` |
| - Flash with OpenOCD: `ninja cdc_msc-openocd` |
| - Generate UF2: `ninja cdc_msc-uf2` |
| - List all targets: `ninja -t targets` |
| |
| ### Make Build System (Alternative) |
| - Build example: `cd examples/device/cdc_msc && make BOARD=raspberry_pi_pico all` |
| - For specific example: `cd examples/{device|host|dual}/{example_name} && make BOARD=raspberry_pi_pico all` |
| - Flash with JLink: `make BOARD=raspberry_pi_pico flash-jlink` |
| - Flash with OpenOCD: `make BOARD=raspberry_pi_pico flash-openocd` |
| - Debug build: `make BOARD=raspberry_pi_pico DEBUG=1 all` |
| - With logging: `make BOARD=raspberry_pi_pico LOG=2 all` |
| - With RTT logger: `make BOARD=raspberry_pi_pico LOG=2 LOGGER=rtt all` |
| - Generate UF2: `make BOARD=raspberry_pi_pico all uf2` |
| |
| ### Additional Options |
| - Select RootHub port: `RHPORT_DEVICE=1` (make) or `-DRHPORT_DEVICE=1` (cmake) |
| - Set port speed: `RHPORT_DEVICE_SPEED=OPT_MODE_FULL_SPEED` (make) or `-DRHPORT_DEVICE_SPEED=OPT_MODE_FULL_SPEED` (cmake) |
| |
| ### Dependencies |
| - Get dependencies: `python tools/get_deps.py rp2040` |
| - Or from example: `cd examples/device/cdc_msc && make BOARD=raspberry_pi_pico get-deps` |
| |
| ### Testing |
| - Run unit tests: `cd test/unit-test && ceedling test:all` |
| - Run specific test: `cd test/unit-test && ceedling test:test_fifo` |
| |
| ### Pre-commit Hooks |
| Before building, it's recommended to run pre-commit to ensure code quality: |
| - Run pre-commit on all files: `pre-commit run --all-files` |
| - Run pre-commit on staged files: `pre-commit run` |
| - Install pre-commit hook: `pre-commit install` |
| |
| ## Code Style Guidelines |
| - 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 |
| - 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 |
| |
| ## Project Structure |
| - src/: Core TinyUSB stack code |
| - hw/: Board support packages and MCU drivers |
| - examples/: Reference examples for device/host/dual |
| - test/: Unit tests and hardware integration tests |
| |
| ## Release Process |
| To prepare a new release: |
| 1. Update the `version` variable in `tools/make_release.py` to the new version number |
| 2. Run the release script: `python tools/make_release.py` |
| - This will update version numbers in `src/tusb_option.h`, `repository.yml`, and `library.json` |
| - It will also regenerate documentation |
| 3. Update `docs/info/changelog.rst` with release notes |
| 4. Commit changes and create release tag |