build.sh runs inside Docker (mounted at /scripts/build.sh via docker-compose volume). flash.sh runs on the host and takes the project name as an argument, auto-detecting the .uf2 file. Usage: cd color_switcher && docker compose run --rm pico-build bash /scripts/build.sh cd .. && ./flash.sh color_switcher
3.6 KiB
3.6 KiB
Pico Projects
A collection of Raspberry Pi Pico (RP2040) firmware projects with shared reusable components. Each project is self-contained in its own subfolder; shared MCU drivers and HAL abstractions live in common/ as git submodules.
Cloning
git clone --recursive http://git.teqanylogix.com:3000/mohamed.salem/pi_pico.git
The --recursive flag pulls all submodules in common/. If you already cloned without it:
git submodule update --init --recursive
Projects
| Project | Description | Target Board |
|---|---|---|
| color_switcher | Interactive color-switching firmware with USB-CDC serial commands and WS2812B LED control via PIO | Waveshare RP2040-Zero |
Shared Components (git submodules)
| Component | Repo | Description |
|---|---|---|
| STD_TYPES | std_types | Fixed-width types, status enums, utility macros |
| MCU_UART | mcu_uart | Hardware UART driver with DMA/ISR TX and ring buffer RX |
| MCU_USB | mcu_usb | USB-CDC virtual serial port driver with ring buffer RX |
| MCU_PIO | mcu_pio | Generic PIO state machine driver with WS2812 program |
| HAL_COM | hal_com | Transport-agnostic communication (function-pointer dispatch) |
| HAL_LED | hal_led | LED strip/pixel abstraction with intensity scaling |
Each submodule ships with a default config (cfg/). Projects can override configs by placing their own cfg files earlier in the CMake include path.
Getting Started
Each project is independent. To work on one, cd into its folder:
cd color_switcher/
docker compose build # first time only
docker compose run --rm pico-build bash /scripts/build.sh # compile
cd .. && ./flash.sh color_switcher # flash (hold BOOTSEL + plug in)
See each project's own README.md for project-specific instructions.
Prerequisites
- Docker and Docker Compose
No local ARM toolchain needed — everything builds inside Docker containers.
Repository Structure
pico/
├── common/ # shared reusable components (git submodules)
│ ├── STD_TYPES/ # fixed-width types and macros
│ ├── MCU_UART/ # hardware UART driver
│ ├── MCU_USB/ # USB-CDC driver
│ ├── MCU_PIO/ # generic PIO driver + ws2812.pio
│ ├── HAL_COM/ # communication abstraction
│ └── HAL_LED/ # LED strip abstraction
├── color_switcher/ # project: WS2812B color switcher
│ ├── cmake/ # modular CMake build system
│ ├── src/ # project-specific components (APP_CLSW, SYS_ECU)
│ ├── Dockerfile # containerized ARM cross-compilation
│ ├── docker-compose.yml
│ └── docker-compose.yml
│ └── CLAUDE.md / README.md
├── build.sh # shared build script (runs inside Docker)
├── flash.sh # shared flash script (runs on host macOS)
├── .gitmodules
├── CLAUDE.md
└── README.md # this file