- 5
- Architecture Layers
- 30 FPS
- Render Rate
- 4 MB
- Full Runtime
- ~18 ms
- Frame Budget
Modular by Contract, Not by Convention
Most embedded firmware grows into a monolith. Peripheral access is scattered, boot order is tribal knowledge, and swapping one driver breaks three others.
o-OS enforces a single Hardware Abstraction Layer that every module must cross. Ownership tokens prevent conflicts at compile time. The EventBus wires modules together without coupling them. The result is firmware you can read, test, and extend without fear.
- One HAL contract — swap any peripheral without touching application logic
- Static EventBus with ownership tokens: no heap allocation at runtime
- Arduino-first workflow — flash and iterate with the tools you already know
One Contract, Four Responsibilities
o-Core
The kernel layer: system tick (~18 ms), static EventBus (8 subscribers/type), ownership token allocation, and the boot sequence that brings every other module to life.
o-Control
Input and navigation: TCA8418 keyboard dispatch, application routing, and AppRegistry management — 12 fixed slots plus dynamic SD scan.
o-Sense
Sensor integration: BMI270 IMU driver, GPS and expansion-bus peripherals — all accessed through the uniform HAL sensor contract.
o-Device
Device drivers: ST7789 display at 30 FPS (240×135), ES8311 audio over I2S, WiFi/BLE/LoRa radio, and microSD — all ownership-token-gated.
How o-OS Works
-
Flash
Flash the TEST partition to your Cardputer ADV via Arduino IDE. The launcher boots immediately — no manual configuration required.
-
Boot
o-Core initialises the HAL contract, allocates ownership tokens to all modules, and brings up the EventBus before any user code runs.
-
Navigate
o-Control reads TCA8418 keyboard input and routes each event to the focused application via the AppRegistry — no polling, no blocking.
-
Connect
o-Sense and o-Device negotiate peripheral ownership tokens. Display, IMU, radio, and audio modules come online in a deterministic, conflict-free sequence.
-
Build
Add a new app to an AppRegistry slot, deploy to the ota_0 partition, and swap without reflashing the TEST launcher — iteration stays fast.
Six Engines. One Architecture.
EventBus
Static publish-subscribe bus — 8 subscribers per type, zero heap allocation at runtime. Modules communicate by contract, never by direct reference.
HAL Ownership Tokens
Exclusive peripheral ownership enforced at compile time. No runtime races, no double-init bugs — the build fails before the firmware ships.
ScreenConsole UI
240×135 ST7789 canvas with layered drawing primitives and 30 FPS refresh. A deterministic ~18 ms frame budget keeps every update smooth.
Radio-First Navigation
WiFi, BLE, and expansion-bus radio managed through a unified device interface. Switching connectivity mode is a single ownership-token swap.
Persistent Boot
Dual-partition scheme: TEST launcher and ota_0 user app. Deploy a new build and swap partitions without reflashing the launcher — iteration cost stays near zero.
Single Board Profile
One boardProfile.h configures all pin mappings, peripherals, and capabilities for the Cardputer ADV. Change the target board by changing one file.
What Is Inside
| Hardware Target | |
|---|---|
| Device | M5Stack Cardputer ADV |
| SoC | ESP32-S3 |
| Display | ST7789, 240×135 px |
| Keyboard | TCA8418 |
| IMU | BMI270 |
| Storage | 4 MB internal flash + microSD (SPI) |
| Audio | ES8311 / I2S |
| Radio | WiFi + BLE on-chip; LoRa/NRF/GPS via expansion |
| Runtime | |
|---|---|
| Language | C++ (Arduino framework) |
| Partitions | TEST (launcher) + ota_0 (user app) |
| Frame rate | 30 FPS (~18 ms/frame) |
| EventBus | 8 subscribers/type (static) |
| AppRegistry | 12 fixed slots + SD scan |
| Build tool | VS Code + Arduino IDE |
Roadmap
-
Foundation Release
Core kernel, EventBus (8 subs/type), HAL ownership tokens, ScreenConsole (30 FPS), AppRegistry (12 slots), and dual-partition boot.
-
Sensor & Audio
BMI270 IMU integration, ES8311 audio output pipeline, GPS and expansion-bus interface for o-Sense.
-
OTA & Power
OTA update flow, power management API, and a community module registry for sharing AppRegistry apps.
Build on o-OS
Build on o-OS
Fork the repo, flash your Cardputer ADV, and start building layered embedded applications today.
