# libgpiod in Rust for async-std
[](https://github.com/katyo/gpiod-rs)
[](https://crates.io/crates/async-std-gpiod)
[](https://docs.rs/async-std-gpiod)
[](https://opensource.org/licenses/MIT)
[](https://github.com/katyo/gpiod-rs/actions?query=workflow%3ARust)
Rust crate for interfacing with Linux GPIO character devices.
This crate supports [async-std](https://async.rs/) async runtime.
It provides an interface to the Linux GPIO using the chardev module.
This interface involves calling [ioctl](https://man7.org/linux/man-pages/man2/ioctl.2.html) 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](https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/).
Since all functionality is dependent on Linux function calls, this crate only compiles for Linux systems.
## ABI compatibility
Both v1 (>= 4.0) and v2 (>= v5.10) ABI currently supported but edge detection implemented for v2 only.
Sysfs-based API (< 4.0) does not supported.
## Crates
- [gpiod-core](https://crates.io/crates/gpiod-core) - core abstractions and low level interface (not for end users)
- [gpiod](https://crates.io/crates/gpiod) - sync interface which supports synchronous operation only
- [tokio-gpiod](https://crates.io/crates/tokio-gpiod) - async interface for [tokio](https://tokio.rs/) fans
- **[async-std-gpiod](https://crates.io/crates/async-std-gpiod)** - async interface for [async-std](https://async.rs/) fans
## Usage examples
Input values:
```no_run
use async_std_gpiod::{Chip, Options};
#[async_std::main]
async fn main() -> std::io::Result<()> {
let chip = Chip::new("gpiochip0").await?; // open chip
let opts = Options::input([27, 3, 11]) // configure lines offsets
.consumer("my-inputs"); // optionally set consumer string
let inputs = chip.request_lines(opts).await?;
let values = inputs.get_values([false; 3]).await?;
println!("values: {:?}", values);
Ok(())
}
```
Output values:
```no_run
use async_std_gpiod::{Chip, Options};
#[async_std::main]
async fn main() -> std::io::Result<()> {
let chip = Chip::new("gpiochip0").await?; // open chip
let opts = Options::output([9, 21]) // configure lines offsets
.values([false, true]) // optionally set initial values
.consumer("my-outputs"); // optionally set consumer string
let outputs = chip.request_lines(opts).await?;
outputs.set_values([true, false]).await?;
Ok(())
}
```
Monitor values:
```no_run
use async_std_gpiod::{Chip, Options, EdgeDetect};
#[async_std::main]
async fn main() -> std::io::Result<()> {
let chip = Chip::new("gpiochip0").await?; // open chip
let opts = Options::input([4, 7]) // configure lines offsets
.edge(EdgeDetect::Both) // configure edges to detect
.consumer("my-inputs"); // optionally set consumer string
let mut inputs = chip.request_lines(opts).await?;
loop {
let event = inputs.read_event().await?;
println!("event: {:?}", event);
}
Ok(())
}
```