The SDK ships 70+ chip drivers under chips/<part>/. Each driver is independent, opt-in, and named after the chip's natural manufacturer name (no alp_ prefix — that's reserved for SDK-level abstractions).
The original ~20 drivers (Tier-0 — on-module silicon for AEN / V2N / V2N-M1, plus the EVK carrier-side parts) carry the [ABI-STABLE] annotation and ride the SDK's normal ABI guarantees. The 51 drivers added in the v0.5 §D ecosystem expansion are marked [ABI-EXPERIMENTAL] + [UNTESTED] — they compile and pass NULL-arg smoke tests but haven't been HiL-verified on silicon yet. Treat lifecycle sequencing + numbers as paper-correct until the v1.0 verification sweep lands.
Opting in
Two equivalent ways to enable a chip driver:
chips:
- lsm6dso
- ssd1306
# prj.conf — manual
CONFIG_ALP_SDK_CHIP_LSM6DSO=y
CONFIG_ALP_SDK_CHIP_SSD1306=y
The board.yaml path is preferred because it lets the loader cross-check that the SoM actually routes the bus the chip needs.
Driver shape
Every driver follows the same shape:
#include <alp/chips/<part>.h>
<part>_t ctx;
<part>_init(&ctx, bus, address_or_handle);
<part>_<op>(&ctx, ...);
_init() ACK-probes the chip on its bus. If the chip isn't populated, _init returns ALP_ERR_NOT_READY; well-written firmware handles this gracefully.
Catalogue (selected)
Sensors
| Driver | Part | Bus | Use |
|---|
lsm6dso | ST LSM6DSO | I²C / SPI | 6-axis IMU |
bmi323 | Bosch BMI323 | I²C / SPI | 6-axis IMU |
icm42670 | TDK ICM-42670 | I²C / SPI | 6-axis IMU |
lis2dw12 | ST LIS2DW12 | I²C / SPI | 3-axis accelerometer |
bmp581 | Bosch BMP581 | I²C | Barometric pressure |
bme280 | Bosch BME280 | I²C | T/RH/pressure |
tmp112 | TI TMP112 | I²C | Temperature (on every Alp Lab SoM) |
ina236 | TI INA236 | I²C | Current / voltage monitor |
Power
| Driver | Part | Notes |
|---|
act8760 | Qorvo ACT88760-120.E1 | Primary PMIC (V2N family) |
da9292 | Renesas DA9292 | Secondary PMIC (V2N family) |
tps628640 | TI TPS628640 | Optional / DEEPX rail bucks |
Clocks + RTC
| Driver | Part | Notes |
|---|
clk_5l35023b | Renesas / IDT 5L35023B | Clock generator (V2N family) |
rv3028c7 | Micro Crystal RV-3028-C7 | Battery-backed RTC (every Alp Lab SoM) |
Storage + memory
| Driver | Part | Notes |
|---|
eeprom_24c128 | Onsemi N24S128 | 128-byte SoM manifest EEPROM |
Connectivity
| Driver | Part | Notes |
|---|
cc3501e | TI CC3501E | Wi-Fi 6 + BLE 5.4 coprocessor (AEN family) |
murata_lbee5hy2fy | Murata LBEE5HY2FY-922 | Wi-Fi 6 + BLE 5.4 combo (V2N family) |
rtl8211fdi | Realtek RTL8211FDI | Gigabit Ethernet PHY (×2 on V2N) |
Security
| Driver | Part | Notes |
|---|
optiga_trust_m | Infineon OPTIGA Trust M | Secure element (every Alp Lab SoM) |
Co-processors + bridges
| Driver | Part | Notes |
|---|
gd32g553 | GD GD32G553 | V2N supervisor MCU (8 PWM, 8 ADC, 2 DAC, 4 QEnc, 18 GPIO) |
deepx_dxm1 | DEEPX DX-M1 | NPU (V2N-M1 only) — bring_up sequencer |
gd32_swd | bit-bang controller | SWD recovery for the GD32 bridge |
IO + UI
| Driver | Part | Notes |
|---|
tcal9538 | NXP TCAL9538 | 8-bit I/O expander |
ssd1306 | Solomon SSD1306 | Monochrome 128×64 OLED |
ssd1331 | Solomon SSD1331 | Small colour OLED |
ov5640 | OmniVision OV5640 | 5 MP MIPI CSI camera |
cam_mux | Pericom CAM_MUX | Camera input mux |
tas2563 | TI TAS2563 | Class-D speaker amplifier |
pdm_mic | PDM microphone helper | Front-end for <alp/audio.h> |
button_led | helper | Composite button + LED widget driver |
v0.5 §D ecosystem expansion
51 drivers added under the chip-and-library ecosystem design. Every entry below ships with header + _init/probe + Kconfig + metadata YAML + NULL-arg ZTEST; the marker [UNTESTED] means no HiL silicon bring-up yet.
Camera sensors [UNTESTED]
| Driver | Part | Bus / interface | Notes |
|---|
ov2640 | OmniVision OV2640 | DVP | 2 MP general-purpose |
ov5645 | OmniVision OV5645 | MIPI CSI-2 | 5 MP autofocus |
ov7670 | OmniVision OV7670 | DVP | VGA cost-sensitive |
ov9281 | OmniVision OV9281 | MIPI CSI-2 | 1 MP global-shutter mono |
ar0234 | onsemi AR0234 | MIPI CSI-2 | 1080p global-shutter |
imx219 | Sony IMX219 | MIPI CSI-2 | 8 MP — RPi Cam v2 |
imx477 | Sony IMX477 | MIPI CSI-2 | 12 MP — RPi HQ Camera |
gc2145 | GalaxyCore GC2145 | DVP | 2 MP cost-sensitive |
Camera SerDes [UNTESTED]
| Driver | Part | Standard |
|---|
ti_ds90ub953_954 | TI DS90UB953 / 954 | FPD-Link III |
maxim_max9295_9296 | Maxim MAX9295 / 9296 | GMSL2 |
Displays [UNTESTED]
| Driver | Part | Notes |
|---|
st7789 | Sitronix ST7789 | 240×240 / 240×320 SPI TFT |
ili9341 | Ilitek ILI9341 | 240×320 SPI TFT |
ili9488 | Ilitek ILI9488 | 320×480 SPI TFT |
ra8875 | RAiO RA8875 | 5–7″ TFT controller w/ resistive touch |
sh1106 | Sino Wealth SH1106 | 128×64 mono OLED — drop-in alt to SSD1306 |
il3820 | Solomon IL3820 | 4.2″ tri-colour e-paper |
gdew0154t8 | GoodDisplay 1.54″ | 1.54″ e-paper |
External NPU [UNTESTED]
| Driver | Part | Notes |
|---|
hailo_8l | Hailo-8L | M.2 PCIe NPU — host-side bring-up sequence |
Industrial sensing [UNTESTED]
| Driver | Part | Class |
|---|
bmp390 | Bosch BMP390 | Barometric pressure |
ms5611 | TE MS5611 | Barometric pressure |
lps22hb | ST LPS22HB | Barometric pressure |
vl53l1x | ST VL53L1X | Time-of-flight distance |
vl53l5cx | ST VL53L5CX | 8×8 ToF array |
a02yyuw | DFRobot A02YYUW | Ultrasonic distance (UART) |
tsl2591 | AMS TSL2591 | Ambient light (2-channel) |
veml7700 | Vishay VEML7700 | Ambient light (16-bit) |
qmc5883l | QST QMC5883L | 3-axis magnetometer |
as5048a_b | AMS AS5048 A/B | Magnetic rotary encoder (I²C) |
mt6701 | MagnTek MT6701 | Magnetic rotary encoder (I²C) |
hx711 | Avia HX711 | 24-bit strain-gauge ADC |
max31855 | Maxim MAX31855 | Thermocouple → signed milli-C |
max31865 | Maxim MAX31865 | RTD (PT100/PT1000) — 15-bit + fault |
Motor / actuator control [UNTESTED]
| Driver | Part | Notes |
|---|
drv8833 | TI DRV8833 | Dual H-bridge |
drv8825 | TI DRV8825 | Stepper driver (STEP/DIR) |
tmc2209 | Trinamic TMC2209 | Stepper w/ UART tuning (CRC-8) |
a4988 | Allegro A4988 | Stepper driver |
Cellular / RF / GNSS [UNTESTED]
| Driver | Part | Class |
|---|
quectel_bg95 | Quectel BG95 | LTE-M / NB-IoT modem (AT) |
quectel_bg77 | Quectel BG77 | LTE-M / NB-IoT modem (AT) |
ublox_sara_r5 | u-blox SARA-R5 | LTE-M modem (AT) |
semtech_sx1262 | Semtech SX1262 | LoRa radio (opcode) |
semtech_sx1276 | Semtech SX1276 | LoRa radio (register) |
ublox_neo_m9n | u-blox NEO-M9N | GNSS (UART NMEA) |
ublox_max_m10s | u-blox MAX-M10S | GNSS (UART NMEA) |
atgm336h | Zhongkewei ATGM336H | GNSS (UART NMEA) |
atecc608b | Microchip ATECC608B | Crypto co-processor (ATCA) |
Audio [UNTESTED]
| Driver | Part | Notes |
|---|
ics_43434 | InvenSense ICS-43434 | MEMS mic (I²S) |
inmp441 | InvenSense INMP441 | MEMS mic (I²S, cost-sensitive) |
wm8960 | Cirrus / Wolfson WM8960 | Stereo codec (I²C config + I²S) |
tlv320aic3204 | TI TLV320AIC3204 | Premium stereo codec w/ miniDSP |
max98357a | ADI MAX98357A | 3W class-D mono amp |
es8388 | Everest ES8388 | Stereo codec (China-domestic) |
Browse the full per-driver metadata under metadata/chips/; each .yaml carries verification: status alongside vendor / MPN / bus / Kconfig binding.
Driver status
Each driver carries a status field in its metadata/chips/<part>.yaml:
| Status | Meaning |
|---|
stub | Header exists; calls return ALP_ERR_NOSUPPORT. |
partial | Core operations implemented; some advanced features pending. |
complete | Full feature coverage; HW-verified. |
The current per-driver status is tracked in docs/test-plan.md.
Per-SoM populated chips
Which drivers are populated on each SoM family:
| Driver | AEN | V2N | V2N-M1 | N93 |
|---|
cc3501e | ✓ | | | |
murata_lbee5hy2fy | | ✓ | ✓ | |
rtl8211fdi | | ✓×2 | ✓×2 | |
gd32g553 | | ✓ | ✓ | |
deepx_dxm1 | | | ✓ | |
act8760 / da9292 | | ✓ | ✓ | |
rv3028c7 | ✓ | ✓ | ✓ | TBD |
optiga_trust_m | ✓ | ✓ | ✓ | TBD |
eeprom_24c128 | ✓ | ✓ | ✓ | TBD |
tmp112 | ✓ | ✓ | ✓ | TBD |
EVK-populated carrier-side chips (lsm6dso, bmp581, ssd1306, ov5640, tas2563, etc.) are available on both EVKs by default; declare carrier.name: E1M-EVK or E1M-X-EVK in board.yaml.
Idiomatic usage
#include <alp/peripheral.h>
#include <alp/chips/lsm6dso.h>
alp_i2c_t *bus = alp_i2c_open(&(alp_i2c_config_t){
.bus_id = 0u,
.bitrate_hz = 400000u,
});
lsm6dso_t imu;
if (lsm6dso_init(&imu, bus, LSM6DSO_I2C_ADDR_PRIMARY) != ALP_OK) {
printk("[lsm6dso] init failed\n");
return;
}
lsm6dso_set_accel_odr(&imu, LSM6DSO_ODR_104_HZ);
lsm6dso_set_accel_fs(&imu, LSM6DSO_FS_2G);
lsm6dso_sample_t s;
while (1) {
lsm6dso_read(&imu, &s);
printk("ax=%d ay=%d az=%d\n", s.ax, s.ay, s.az);
k_msleep(10);
}
See also