Turn datasheets into drivers
Upload a chip datasheet PDF. Embedd extracts register maps and returns validated HAL drivers in C99 or C++17.
How Embedd works
Three engines carry datasheet data through to compilable firmware output.
Register Map Parsing
Embedd reads multi-page PDFs, rebuilds bitfields, and validates the resulting register model.
HAL Code Output
Embedd turns the register model into HAL output with typed accessor functions, bitfield masks, and reset-value constants in C99 or C++17, without runtime dependencies.
Delivery and Setup
Get validated driver output, then use the CLI or REST API with CMake or CI. Rust output is available on the Team plan.
For firmware teams
Register-accurate code
Accessor macros and structs mirror each bitfield's exact silicon offset, width, and access mode. No manual offset arithmetic.
RTOS-ready patterns
Generated HAL code supports portable register access in FreeRTOS, Zephyr, and bare-metal environments.
C99 and C++17 code
C99 maximizes toolchain compatibility. C++17 adds typed enums, constexpr constants, and scoped bitfield accessors for embedded projects.
Test scaffolds
Test driver behaviour in QEMU and Renode before flashing hardware.
CLI or REST API
Run generation from your build pipeline. The CLI works with CMake and Make, while the REST API supports webhook callbacks for async CI workflows.
Chip list
180+ pre-validated chip families: NXP, TI, STMicroelectronics, Nordic, Renesas, Microchip. Submit unlisted chips via supported chips page.
Three steps to drivers
-
1
Select a datasheet
Choose a chip from the supported library or upload a PDF. Embedd accepts datasheets up to 800 pages with multi-column register tables.
-
2
Parse, then generate
The extraction engine rebuilds the register map, links bitfields, and produces driver source with typed accessors and constants.
-
3
Get and integrate
Validated output is delivered for download. Add it to your CMake project and write application code against the HAL.
#ifndef STM32G0B1_GPIO_H
#define STM32G0B1_GPIO_H
#include <stdint.h>
/* GPIO_MODER register */
#define GPIOA_MODER (*((volatile uint32_t *)0x50000000U))
#define GPIO_MODER_MODE0 ((uint32_t)(0x3UL << 0U))
#define GPIO_MODER_MODE0_IN ((uint32_t)(0x0UL << 0U))
#define GPIO_MODER_MODE0_OUT((uint32_t)(0x1UL << 0U))
#define GPIO_MODER_MODE0_AF ((uint32_t)(0x2UL << 0U))
static inline void gpio_set_mode(
GPIO_TypeDef *port,
uint8_t pin,
uint8_t mode) {
uint32_t reg = port->MODER;
reg &= ~(0x3U << (pin * 2U));
reg |= ((mode & 0x3U) << (pin * 2U));
port->MODER = reg;
}
Works with your tools
Output needs no runtime library and fits toolchains that compile standard C.
Broader chip coverage
The roadmap covers full Rust output, currently in beta on the Team plan, deeper RISC-V vendor support, and SVDL export for probe-rs and OpenOCD. Submit a priority chip through the supported chips page or contact us.
View Supported Chips