Embedded systems and firmware engineer. I work close to the hardware — writing peripheral drivers by hand from the reference manual, building real-time firmware on microcontrollers, and developing device drivers inside the Linux kernel.
Most of my projects start from a datasheet rather than a library. I enjoy understanding exactly what the silicon is doing — which register bit flips, when an interrupt fires, how a task gets scheduled — and building up from there. Lately I've also been putting more effort into testing and CI, because firmware that isn't verified isn't finished.
A few things I'm comfortable with:
- Bare-metal driver development for GPIO, SPI, I2C, and USART, written without a vendor HAL
- Real-time firmware on FreeRTOS — tasks, priorities, queues, semaphores, and ISR-safe design
- Zephyr RTOS — sensor-driver work with an upstream bug fix merged to mainline, plus devicetree and Kconfig
- Linux internals — character device drivers, kernel modules, and upstream contributions (an IIO sensor-driver bug fix + staging cleanups merged to mainline)
- IoT systems end to end, from an ESP8266 collecting sensor data to an MQTT dashboard
- Unit testing, coverage, and continuous integration
| Project | What it shows |
|---|---|
| Nucleof411xx_drivers | STM32F411 GPIO, SPI, I2C, and USART drivers written from scratch — no vendor libraries |
| FreeRTOS | Nine progressive RTOS labs: tasks, priorities, queues, timers, semaphores, notifications |
| IoT-Soilless-Hydroponic-System | A smart-farm prototype: ESP8266 to MQTT to Raspberry Pi to a Node-RED dashboard |
| linux_device_driver | Linux kernel modules and a character device driver with dynamic major/minor allocation |
| Parallel-Computing | Parallelizing a physics simulation with OpenMP and OpenCL — about 7.8x on the GPU stage over the optimized CPU version |
Bug fix — IIO (pressure sensors): iio: pressure: dps310: fix NULL pointer dereference on ACPI probe — fixed a kernel crash during probe when the DPS310 is enumerated via its
ACPI HID (the i2c device-id lookup returned NULL and was dereferenced). Reviewed by the IIO
maintainers, applied to the IIO subsystem tree, and marked for stable backport.
Patch on lore.kernel.org
drivers/staging cleanups: three checkpatch-style patches merged to the Linux staging tree — a CamelCase rename in sm750 (d5c28c0) and shortGIrate to short_gi_rate in rtl8723bs (e6900ce, d9c2a00). My first upstream kernel contributions.
Driver bug fix — BMI270 IMU: drivers: sensor: bmi270: guard any-motion against missing feature set — the driver silently failed to configure any-motion interrupts when
the default (max_fifo) feature set left the any-motion register pointers NULL. On Cortex-M,
address 0 is writable, so the write landed on an unintended feature page and returned false
success, leaving the trigger a no-op. The fix validates the feature set up front and returns
-ENOTSUP with a clear log message. Reviewed by Zephyr maintainers and merged to mainline.
PR #114134 (fixes #112938)
Credential: Zephyr Technical Contributor — official badge issued by The Linux Foundation (July 2026) for code and documentation contributors to the Zephyr Project.
- Earlier: PR #114097 — documentation fix in the Getting Started guide.
Domains: embedded firmware, RTOS, Linux kernel and drivers, sensor and signal I/O, IoT, and test automation.