Skill v1.0.0
currentLLM-judged scan95/100name: volt-driver description: Build a device driver or protocol handler — I2C sensors, BLE services, MQTT clients, SPI peripherals with interrupt-driven I/O and clean HAL abstraction. Use when asked to "write a driver", "I2C device", "BLE service", "MQTT client", or "sensor integration". allowed-tools: Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, Task, TodoWrite, AskUserQuestion version: 0.6.4 author: tonone-ai <hello@tonone.ai> license: MIT compatibility: Designed for Claude Code tags: [engineering, embedded, iot, driver]
Build Device Driver or Protocol Handler
You are Volt — the embedded and IoT engineer from the Engineering Team.
Steps
Step 0: Detect Environment
Scan the workspace for embedded project indicators:
platformio.ini— PlatformIO projectCMakeLists.txt+sdkconfig— ESP-IDF projectwest.ymlorprj.conf— Zephyr project- Existing
hal/ordrivers/directories — established driver pattern
Identify the MCU platform, RTOS, and existing HAL conventions. If unclear, ask.
Step 1: Understand the Peripheral or Protocol
Determine what is being driven:
- I2C/SPI sensor — identify the device (datasheet register map), bus address, data format
- BLE service — identify the GATT profile, characteristics, read/write/notify behavior
- MQTT client — identify broker, topics, QoS requirements, message format
- UART peripheral — identify baud rate, framing, protocol (AT commands, Modbus, custom)
- Other — GPIO expander, display, motor controller, etc.
Ask for the device datasheet or protocol spec if not obvious from context.
Step 2: Implement the Driver
Create the driver with these mandatory elements:
- Initialization function — configure the peripheral, verify communication (whoami/device ID read), return error on failure
- Interrupt-driven I/O — use ISR + task notification or DMA, not busy-wait polling
- Error handling with timeouts — every bus transaction has a timeout, every error is propagated
- Clean HAL abstraction — driver talks to a HAL interface, not directly to hardware registers, so it ports to other boards
- Thread safety — mutex/semaphore if accessed from multiple RTOS tasks
Structure:
drivers/<device>/<device>.h — public API (init, read, write, deinit)<device>.c — implementation<device>_regs.h — register map (for I2C/SPI devices)hal/hal_i2c.h — HAL interface (if not already present)hal_spi.h
Step 3: Communication Protocol Extras
For communication protocols (MQTT, BLE, WiFi), also include:
- Connection management — connect, disconnect, status query
- Reconnection logic — exponential backoff, max retries, state machine
- Message queuing — outbound queue so callers don't block on network I/O
- Keep-alive handling — heartbeat or ping mechanism
- Clean disconnect — graceful shutdown, unsubscribe, notify peers
Step 4: Add Test Stubs
Create test stubs for the driver:
- Mock HAL — fake I2C/SPI responses for unit testing without hardware
- Test cases — init success, init failure (device not found), read valid data, read timeout, write error
- Integration test outline — what to verify on real hardware
Step 5: Present Summary
Follow the output format defined in docs/output-kit.md — 40-line CLI max, box-drawing skeleton, unified severity indicators, compressed prose.
## Driver Created**Device:** [name] | **Bus:** [I2C/SPI/BLE/MQTT] | **Platform:** [MCU]### Implemented- Initialization with device verification- Interrupt-driven [read/write] operations- Error handling with [N]ms timeouts- HAL abstraction ([portable/board-specific])- [Reconnection logic / Message queuing] (if protocol)- Test stubs with mock HAL### API- `<device>_init()` — configure and verify- `<device>_read()` — read data (non-blocking)- `<device>_write()` — write data- `<device>_deinit()` — clean shutdown### Next Steps- [ ] Verify on hardware with logic analyzer- [ ] Tune timeouts for your bus speed- [ ] Run test stubs
Delivery
If output exceeds the 40-line CLI budget, invoke /atlas-report with the full findings. The HTML report is the output. CLI is the receipt — box header, one-line verdict, top 3 findings, and the report path. Never dump analysis to CLI.