Hardware Reference

LibreScoot runs on two ARM boards inside the scooter: the MDB (vehicle control) and the DBC (dashboard UI and navigation).

MDB — Middle Driver Board

The main vehicle controller. Talks to the ECU over CAN, reads keycards and batteries via NFC, and manages cellular/GPS connectivity.

ComponentDetails
SoCARMv7 Cortex-A series
RAMDDR3
StorageeMMC (A/B Mender partitions)
CAN BusECU communication (Bosch / Votol motor controller)
NFCPN7150 (keycard authentication + battery BMS communication)
4G ModemSIM7100E (cellular + GPS)
Bluetooth/nRFnRF52840 co-processor via USOCK (UART + CBOR)
IP Address192.168.7.1 (USB Ethernet gadget)

nRF52840 Co-processor

The nRF52840 handles Bluetooth Low Energy and LED control. It communicates with the MDB via a USOCK protocol (UART framing with CBOR encoding). The bluetooth-service on the MDB owns this interface and exposes BLE state to Redis.

DBC — Dashboard Computer

Runs the dashboard UI (Flutter on a 480×480 display) and offline navigation.

ComponentDetails
SoCNXP i.MX6DL — dual Cortex-A9 @ 800 MHz
Display480×480 parallel RGB565 at 59.1 Hz
GPUVivante GC2000 (3D, etnaviv) + GC355 (2D)
Ambient LightOPT3001 sensor, read by dbc-illumination-service for auto-brightness
StorageeMMC (A/B Mender partitions + /data user partition)
IP Address192.168.7.2 (USB Ethernet gadget, via MDB)

Display pipeline

The IPU (Image Processing Unit) drives the parallel display via /dev/fb0. The GPU renders to an EGL surface using the render node (/dev/dri/renderD128) and blits to the framebuffer. The GPU and display are separate subsystems; etnaviv has no KMS connectors.

Network Topology

The MDB and DBC are connected via USB Ethernet gadget. The MDB runs a Redis instance; DBC services connect to it over the network.

MDB 192.168.7.1

Redis :6379
SSH :22

USB Ethernet
DBC 192.168.7.2

Redis client → 192.168.7.1:6379
SSH :22

From an external machine, SSH into the MDB first, then jump to the DBC:

ssh root@<mdb-ip>               # MDB direct
ssh -J root@<mdb-ip> root@192.168.7.2  # DBC via jump

UART Debug Access

Both boards expose a 3-pin UART debug header at 115200 baud, 8N1. No hardware flow control.

MDB Debug UART

PinSignal
Pin 1GND
Pin 2TXD (MDB transmits)
Pin 3RXD (MDB receives)

Baud rate: 115200

DBC Debug UART

The i.MX6DL exposes a serial console on its debug UART header. Connect a 3.3V UART adapter. Do not use 5V.

Baud rate: 115200

Voltage: 3.3V logic

Voltage warning: Both UART headers use 3.3V logic levels. Using a 5V adapter will damage the hardware.

Boot Flow

MDB Boot Sequence

  1. U-Boot loads from eMMC boot partition
  2. Kernel decompresses and initializes hardware
  3. systemd starts services in dependency order
  4. vehicle-service enters stand-by state, scooter is ready for keycard

DBC Boot Sequence

  1. U-Boot (stored in eMMC boot partition, mmcblk3boot0) loads kernel and DTB from /boot/ on the active rootfs partition
  2. Kernel initializes i.MX6DL, IPU, and etnaviv GPU
  3. Plymouth boot splash starts early (~T+3s), animates until multi-user.target
  4. scootui Flutter dashboard starts via dbc-dispatcher
  5. The /data partition (mmcblk3p4) mounts at ~T+7s after fsck, so it's not available for early services

Mender A/B Partitions

Both boards use Mender for OTA updates with atomic A/B partition switching. The active partition is selected by U-Boot on each boot. A failed update automatically rolls back to the previous partition on the next boot attempt.

PartitionContents
mmcblk?p1U-Boot environment
mmcblk?p2Rootfs A (active)
mmcblk?p3Rootfs B (inactive / update target)
mmcblk?p4/data, persistent user data (maps, settings)

← Architecture Services Reference →