Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/warthog618/gpiosim-rs

A Rust library for creating and controlling GPIO simulators for testing users of the Linux GPIO uAPI.
https://github.com/warthog618/gpiosim-rs

gpio linux mocking simulator testing-tools

Last synced: 3 months ago
JSON representation

A Rust library for creating and controlling GPIO simulators for testing users of the Linux GPIO uAPI.

Awesome Lists containing this project

README

        

# gpiosim

[![Build Status](https://img.shields.io/github/actions/workflow/status/warthog618/gpiosim-rs/rust.yml?logo=github&branch=master)](https://github.com/warthog618/gpiosim-rs/actions/workflows/rust.yml)
[![github](https://img.shields.io/badge/github-warthog618/gpiosim--rs-8da0cb.svg?logo=github)](https://github.com/warthog618/gpiosim-rs)
[![crate](https://img.shields.io/crates/v/gpiosim.svg?color=fc8d62&logo=rust)](https://crates.io/crates/gpiosim)
![LICENSE](https://img.shields.io/crates/l/gpiosim.svg)

A Rust library for creating and controlling GPIO simulators for testing users of
the Linux GPIO uAPI (both v1 and v2).

The simulators are provided by the Linux [**gpio-sim**](https://www.kernel.org/doc/html/latest/admin-guide/gpio/gpio-sim.html) kernel module and require a
recent kernel (5.19 or later) built with **CONFIG_GPIO_SIM**.

Simulators contain one or more **Chip**s, each with a collection of lines being
simulated. A **Builder** is responsible for constructing the **Sim** and taking it live.
Configuring a simulator involves adding **Bank**s, representing the
chip, to the builder.

Once live, the **Chip** exposes lines which may be manipulated to drive the
GPIO uAPI from the kernel side.
For input lines, applying a pull using **Chip** pull methods controls the level
of the simulated line. For output lines, the **Chip.get_level** method returns
the level the simulated line is being driven to by userspace.

For tests that only require lines on a single chip, the **Simpleton**
provides a slightly simpler interface.

Dropping the **Sim** deconstructs the simulator, removing the **gpio-sim**
configuration and the corresponding gpiochips.

Configuring a simulator involves *configfs*, and manipulating the chips once live
involves *sysfs*, so root permissions are typically required to run a simulator.

## Example Usage

Creating a simulator with two chips, with 8 and 42 lines respectively, each with
several named lines and a hogged line:

```rust
use gpiosim::{Bank, Direction, Level};

let sim = gpiosim::builder()
.with_name("some unique name")
.with_bank(
Bank::new(8, "left")
.name(3, "LED0")
.name(5, "BUTTON1")
.hog(2, "hogster", Direction::OutputLow)
)
.with_bank(
Bank::new(42, "right")
.name(3, "BUTTON2")
.name(4, "LED2")
.hog(7, "hogster", Direction::OutputHigh),
)
.live()?;

let chips = sim.chips();
let c = &chips[0];
c.set_pull(5, Level::High);
let level = c.get_level(3)?;
```

Use a **Simpleton** to create a single chip simulator with 12 lines, for where multiple chips or
named lines are not required:

```rust
let s = gpiosim::Simpleton::new(12);
s.set_pull(5, Level::High);
let level = s.get_level(3)?;
```

## License

Licensed under either of

- Apache License, Version 2.0 ([LICENSE-APACHE](https://github.com/warthog618/gpiosim-rs/blob/master/LICENSES/Apache-2.0.txt) or
)
- MIT license ([LICENSE-MIT](https://github.com/warthog618/gpiosim-rs/blob/master/LICENSES/MIT.txt) or )

at your option.

## Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.