libgpiod in Rust
![CI](https://img.shields.io/github/actions/workflow/status/katyo/gpiod-rs/ci.yml?branch=master&style=for-the-badge&logo=github-actions&logoColor=white)
Rust crate for interfacing with Linux GPIO character devices.
It provides an interface to the Linux GPIO using the chardev module.
This interface involves calling ioctl funcions which are unsafe and require some unintuitive variable mapping.
To ease this process, this crate provides a [Chip] struct which encapsulates the interface in safe Rust functions.
The functionality provided here is highly inspired by libgpiod.
Since all functionality is dependent on Linux function calls, this crate only compiles for Linux systems.
ABI compatibility
Both ABI v1 (linux >= 4.0) and v2 (linux >= v5.10) supported but edge detection implemented for v2 only.
Deprecated sysfs-based API (linux < 4.0) currently is not supported at all.
Crates
- gpiod-core - core abstractions and low level interface (not for end users)
- gpiod - sync interface which supports synchronous operation only
- tokio-gpiod - async interface for tokio fans
- async-gpiod - async interface to use with non-tokio async runtimes
Usage examples
Input values:
use gpiod::{Chip, Options, Masked, AsValuesMut};
fn main() -> std::io::Result<()> {
let chip = Chip::new(0)?;
let opts = Options::input([27, 3, 11]) .consumer("my-inputs");
let inputs = chip.request_lines(opts)?;
let values = inputs.get_values([false; 3])?;
println!("values: {:?}", values);
let values = inputs.get_values([None, Some(false), None])?;
println!("values: {:?}", values);
let values = inputs.get_values(0u8)?;
println!("values: {:#b}", values);
let values = inputs.get_values(Masked::<u8>::default().with(1, Some(false)))?;
println!("values: {:#b}", values);
Ok(())
}
Output values:
use gpiod::{Chip, Options, Masked, AsValuesMut};
fn main() -> std::io::Result<()> {
let chip = Chip::new("gpiochip0")?;
let opts = Options::output([9, 21]) .values([false, true]) .consumer("my-outputs");
let outputs = chip.request_lines(opts)?;
outputs.set_values([true, false])?;
outputs.set_values([None, Some(false)])?;
outputs.set_values(0b01u8)?;
outputs.set_values(Masked::<u8>::default().with(1, Some(true)))?;
Ok(())
}
Monitor values:
use gpiod::{Chip, Options, EdgeDetect};
fn main() -> std::io::Result<()> {
let chip = Chip::new("gpiochip0")?;
let opts = Options::input([4, 7]) .edge(EdgeDetect::Both) .consumer("my-inputs");
let mut inputs = chip.request_lines(opts)?;
loop {
let event = inputs.read_event()?;
println!("event: {:?}", event);
}
Ok(())
}