Linux GPIO in BenchCI

BenchCI provides native support for controlling and observing Linux GPIO lines.

This allows you to integrate real hardware signals (reset lines, status pins, interrupts, etc.) into automated test workflows.


What is Linux GPIO?

On Linux systems, GPIOs are exposed via the GPIO character device interface:

  • /dev/gpiochip0

  • /dev/gpiochip1

Each chip contains multiple GPIO lines (channels), which can be:

  • configured as input or output

  • read or driven

  • monitored for edge events (rising / falling)

BenchCI uses the modern libgpiod interface (not the deprecated sysfs GPIO).


Why use GPIO in BenchCI?

GPIO control is essential for real hardware validation:

  • reset devices

  • trigger boot modes

  • simulate button presses

  • monitor ready/interrupt signals

  • synchronize test steps with hardware state

Instead of manual interaction, BenchCI allows you to define these behaviors declaratively in your test suite.


Example Use Cases

Reset control

- gpio_set:
    line: reset_n
    value: false

- sleep_ms: 100

- gpio_set:
    line: reset_n
    value: true

Wait for device ready

- gpio_expect:
    line: ready
    value: true
    within_ms: 3000

Wait for interrupt (edge detection)

- gpio_wait_edge:
    line: irq
    edge: rising
    within_ms: 2000

Board Configuration

GPIO lines are defined in board.yaml.

Example:

gpio:
  reset_n:
    backend: local_gpio
    chip: /dev/gpiochip0
    line: 17
    direction: output
    active_high: false

  ready:
    backend: local_gpio
    chip: /dev/gpiochip0
    line: 18
    direction: input
    active_high: true
    bias: pull_down

  irq:
    backend: local_gpio
    chip: /dev/gpiochip0
    line: 19
    direction: input
    active_high: true
    bias: pull_down
    edge: rising

Configuration Fields

Common

  • backend: must be local_gpio

  • chip: GPIO chip device (e.g. /dev/gpiochip0)

  • line: line number within the chip


Direction

direction: output

or

direction: input


Active Level

active_high: true

or

active_high: false

This defines the logical meaning of the signal:

  • true → ACTIVE state

  • false → INACTIVE state

BenchCI automatically maps this to the correct electrical level.

Example:

active_high: true → value true = GPIO HIGH active_high: false → value true = GPIO LOW


Bias (input only)

bias: pull_up bias: pull_down bias: disabled

Used for stabilizing input lines.


Edge Detection (input only)

edge: rising edge: falling edge: both

Required for gpio_wait_edge.


Test Suite Steps

Set output

- gpio_set:
    line: reset_n
    value: true

Read input

- gpio_get:
    line: ready

Wait for value

- gpio_expect:
    line: ready
    value: true
    within_ms: 1000

Wait for edge

- gpio_wait_edge:
    line: irq
    edge: rising
    within_ms: 2000

Logical vs Physical Values

BenchCI uses logical values, not raw voltage levels.

This means:

  • value: true → signal is ACTIVE

  • value: false → signal is INACTIVE

The actual electrical level depends on active_high.

This makes tests portable and easier to understand.


Requirements

To use Linux GPIO:

  • Linux system with /dev/gpiochipX

  • libgpiod installed

  • Python gpiod bindings available

  • appropriate permissions to access GPIO devices


Permissions

You may need to run:

sudo usermod -aG gpio $USER

or run BenchCI with sufficient privileges.


Notes

  • GPIO lines are requested exclusively by BenchCI during execution

  • Make sure no other process is using the same GPIO lines

  • Edge detection requires proper hardware configuration (pull-ups/downs)


Summary

BenchCI allows you to:

  • control GPIO outputs

  • read input states

  • wait for signal changes

  • integrate real hardware signals into CI workflows

This enables reliable, repeatable hardware validation without manual interaction.