1 个不稳定版本

0.3.0 2024年5月11日

#1027 in Unix APIs

MIT 许可证

82KB
2K SLoC

Rust 版 libgpiod,支持异步

github crate docs MIT CI

Rust 库,用于与 Linux GPIO 字符设备接口。此库支持多种异步运行时,如 smolasync-std

它提供了通过 chardev 模块访问 Linux GPIO 的接口。此接口涉及调用 ioctl 函数,这些函数是不安全的,并且需要一些不直观的变量映射。为了简化此过程,此库提供了一个 [Chip] 结构,它封装了在安全的 Rust 函数中的接口。这里提供的功能高度受到 libgpiod 的启发。

由于所有功能都依赖于 Linux 函数调用,因此此库仅适用于 Linux 系统。

ABI 兼容性

支持 ABI v1(linux >= 4.0)和 v2(linux >= v5.10),但仅对 v2 实现了边缘检测。已弃用的基于 sysfs 的 API(linux < 4.0)目前完全不支持。

  • gpiod-core - 核心抽象和低级接口(不适用于最终用户)
  • gpiod - 仅支持同步操作的同步接口
  • tokio-gpiod - 为 tokio 粉丝提供的异步接口
  • async-gpiod - 用于非 tokio 异步运行时的异步接口

使用示例

输入值

use async_gpiod::{Chip, Options};

#[smol_potat::main]
async fn main() -> std::io::Result<()> {
    let chip = Chip::new(0).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(())
}

输出值

use async_gpiod::{Chip, Options};

#[smol_potat::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(())
}

监视值

use async_gpiod::{Chip, Options, EdgeDetect};

#[smol_potat::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(())
}

依赖项

~5–13MB
~165K SLoC