Skip to main content
The Hardware Abstraction Layer (HAL) is how the agent adapts to different companion computers. It identifies the board, loads the matching YAML profile, and hands the profile’s hardware facts (buses, encoders, cameras, radios, displays, GPIO) to the installer and the services. The board list is on Supported hardware.

Board detection

Detection lives in ados.hal.detect. It tries each source in order and stops at the first match:
  1. /etc/ados/board_override, if present. It holds a board profile’s YAML file name without the extension (for example rock-5c-lite). Use it as the manual correction when detection picks the wrong board. An unknown value is logged and ignored.
  2. The first token of /proc/device-tree/compatible, which uniquely identifies a board even when several boards share a model string.
  3. /proc/device-tree/model, matched against each profile’s model_patterns.
  4. The Hardware or model line of /proc/cpuinfo, matched the same way.
  5. The generic profile for the architecture: generic-arm64, or generic-x86_64 on x86.
Some boards ship one device tree for several hardware bins. A profile can list variants, which are resolved by CPU core count. RAM and core count come from psutil. The result is persisted as a hardware snapshot; print it with:

Default tier

Each board profile declares a default_tier (1-4) describing compute class. It is reported in status and used to refuse plugins whose compatibility.min_tier the board cannot meet. Which services run is decided by the node profile (drone/ground_station/workstation/compute), not the tier. The generic profiles are tiered from detected RAM: See Node profiles for what each profile runs, and Manifest for compatibility.min_tier.

Board profile schema

Each profile is a YAML file at src/ados/hal/boards/<name>.yaml, validated by the BoardProfile Pydantic model in src/ados/hal/detect.py. Keys the model does not define are ignored. The file name (without .yaml) is the board id used by board_override and by extension supported_boards lists. A short real profile, cm4.yaml:
For a profile that uses every section, read src/ados/hal/boards/rock-5c-lite.yaml or rk3576.yaml in the ADOSDroneAgent repository.

HAL modules

Adding a new board

1

Read the board identity

SSH into the board and read the strings detection matches against:
2

Create the YAML file

Create src/ados/hal/boards/<your-board>.yaml. The file name becomes the board id. At minimum:
3

Describe the hardware

Add the sections from the schema that apply: video, compute, cameras, radios, flight_controller, displays, GPIO and buttons.
4

Pick the default tier

Choose the tier from the board’s RAM and accelerator, using the RAM bands above as a guide. The tier only gates extensions that set compatibility.min_tier.
5

Test

Install the agent on the board and check what it detected:
The board name and tier should match your YAML file. If detection picked another profile, check model_patterns, or write the file name to /etc/ados/board_override to confirm the profile loads.
6

Submit a pull request

Add the YAML file and open a pull request against altnautica/ADOSDroneAgent. Include the board model, where to buy it, and any quirks you found while testing.
The generic profiles work on any 64-bit ARM or x86_64 machine, so you can run the agent without a custom profile. A board profile improves detection and enables board-specific hardware such as the right UART path, cameras, displays and button pins.

Next steps

Supported hardware

The shipped board profiles.

Systemd services

Which units each profile runs.
Last modified on October 11, 2026