Skip to content
← All news
Release

Alp SDK v0.13 — a CC3501E BLE GATT server, proven on real AEN801 silicon

Alp SDK v0.13 release card — a CC3501E BLE GATT server proven on real E1M-AEN801 silicon

A runtime BLE GATT server lands on the CC3501E companion and is proven PASS on physical E1M-AEN801 silicon (server-only — no central on the bench). The Zephyr BLE backend gains the same runtime GATT surface host-side, a new Yocto/Linux power backend uses /sys/power/state, and the legacy 31-byte advertising budget is now enforced identically across both BLE backends.

Alp SDK v0.13 brings a runtime Bluetooth LE GATT server to the CC3501E companion radio and proves the server path on real E1M-AEN801 (Alif Ensemble E8) silicon. It is exercised entirely through the portable <alp/ble.h> — the same header an app would use over the Zephyr BLE controller.

The bench proof is the aen-cc3501e-ble-gatt example: a bridge PING, alp_ble_open, a dynamic GATT service register, and advertise_start, run on a physical E1M-AEN801 (SW-DP 0x4C013477) and confirmed persistent across a true cold power-on reset. The GATT registration itself is now dynamic — a new BLE_GATT_REGISTER (0x38) wire message carries a variable-length service/characteristic descriptor the firmware bounds-validates and registers at runtime, returning the attribute handles to the host, replacing the old fixed-demo stub. On the Zephyr side the same backend gains a runtime GATT server plus client read/write, proven host-side under native_sim, along with a read-completion fix that had timed out every successful client read.

Two more surfaces land. A new Yocto/Linux power backend issues request_sleep through /sys/power/state (freeze/standby/mem) with an RTC wakealarm for a timed wake, registered beside the existing Zephyr, Alif-SE, and GD32-supervisor backends. And a new --emit kconfig mode projects a board-scoped Kconfig symbol menu for the VS Code prj.conf language server, anchored to a cross-repo golden fixture so tan-cli and the extension cannot drift apart on the contract.

The generalizable win is portability of the advertising path: the 31-byte legacy adv-data budget is now enforced centrally, before backend dispatch, so an over-budget adv_config is rejected identically on Zephyr and on the CC3501E. The bug that motivated it showed up only on AEN silicon — a 15-character name plus one 128-bit service UUID fit under Zephyr but overflowed on CC3501E — exactly the kind of per-backend divergence a portable API is supposed to erase.

Status stays honest. The GATT proof is server-only: there is no BLE central on the bench, so end-to-end read/write against a peer stays HIL-deferred, and the Zephyr client read/write path is proven only under native_sim, which ships no reachable BLE controller offline. The Yocto power backend’s real-board confirmation is a later bench step. Silicon evidence still covers two SoM families — the E1M-X V2N and the E1M-AEN801; i.MX 93, V2M/DEEPX, and the AEN30x–70x parts remain [UNTESTED] on real hardware.

More news