// Zephyr RTOS · ISO 14229 UDS

ISO 14229 UDS diagnostics
on Zephyr RTOS.

A complete, YAML-configured UDS stack that generates production C source for Zephyr. Covers all 19 UDS services, CAN ISO-TP and DoIP transports, ASIL-B safety wrappers, and a full pytest suite — all from a single config file. GPL v2 runtime is free on GitHub.

UDS on Zephyr — done right.

On Zephyr the diagnostics problem is mostly a binding problem. The RTOS already gives you a CAN driver model, a network stack and a settings subsystem — so the work is wiring generated UDS handlers to a devicetree device correctly, not writing drivers. EDS generates those handlers from a 30-line YAML description and hands them a const struct device *:

diagnostics_config.yaml

ecu:
  name: BCM
  addressing:
    can_id_request:  0x7DF
    can_id_response: 0x7E8

sessions:
  - default
  - extended
  - programming

services:
  - id: 0x22   # ReadDataByIdentifier
  - id: 0x2E   # WriteDataByIdentifier
  - id: 0x27   # SecurityAccess
  - id: 0x31   # RoutineControl
  - id: 0x34   # RequestDownload
  - id: 0x36   # TransferData
  - id: 0x37   # RequestTransferExit
  - id: 0x19   # ReadDTCInformation
  - id: 0x14   # ClearDiagnosticInformation

dids:
  - id: 0xF190
    name: VIN
    length: 17
    read_sessions: [default, extended]
  - id: 0xF187
    name: PartNumber
    length: 10
    read_sessions: [default, extended]
    write_sessions: [extended]
    write_security: [1]

Generated output

python3 tools/codegen.py \
  --config diagnostics_config.yaml \
  --out build/ \
  --safety-wrappers \
  --asil-level B \
  --test-gen

build/
  uds_server.c/.h      # UDS dispatcher + Zephyr thread
  uds_dids.c/.h        # DID read/write handlers
  uds_dtcs.c/.h        # DTC storage (NVM-backed)
  uds_sessions.c/.h    # session state machine
  uds_security.c/.h    # AES-128-CMAC SecurityAccess
  uds_safety.c/.h      # ASIL-B 5-step validation
  test_uds.py          # pytest suite (CI-ready)

Zephyr west integration

# west.yml — add EDS as a Zephyr module
manifest:
  projects:
    - name: eds
      url: https://github.com/Xaloqi/EDS
      revision: v1.18.1
      path: modules/eds

# prj.conf
CONFIG_EDS=y
CONFIG_EDS_ISOTP=y
CONFIG_EDS_DOIP=y

All 19 UDS services, on either RTOS.

Service coverage is a property of the generator, not of Zephyr — the same 19 services are produced for a FreeRTOS build from the same YAML. The full list, the generated file layout and the codegen flags live on the EDS product page.

What is Zephyr-specific is everything below: how those handlers reach a CAN controller, how DTCs survive a reboot, and how you run the whole thing with no hardware at all.

Built for Zephyr — not bolted on.

EDS uses Zephyr's native kernel primitives: a dedicated UDS thread on the system workqueue, k_msgq for ISO-TP frames, zephyr/settings.h for NVM-backed DTC storage, and zephyr/canbus/isotp.h for CAN framing. No POSIX shim. No HAL bypass.


ASIL-B artifacts, and what Zephyr contributes.

Every generated handler runs a 5-step validation chain before its body — DID existence, session permission, security level, access permission, data length — produced by codegen rather than written by hand. The chain, the deviation log and the traceability matrix are covered on the Safety & security page.

The Zephyr-specific part is the evidence you can produce cheaply: native_sim runs the full generated pytest suite on the host in CI, so the ASIL-B behaviour is exercised on every commit rather than only on a bench. The Professional tier adds the safety manual, HARA and RTM built against that same configuration.

Free runtime. Two paid tiers.

The GPL v2 runtime is always free on GitHub. Developer adds the code generator, test generation, ARXML import and the AI CLI; Professional adds the ASIL-B safety artifacts and the harness. Annual licence, offline after activation.

Blog: UDS on Zephyr in 30 minutes → Blog: ASIL-B UDS on Zephyr → Blog: UDS on FreeRTOS → Blog: CAN to DoIP migration → FreeRTOS UDS landing page → TestLab — campaign runner →