5 个版本

0.3.0 2024年5月11日
0.2.3 2023年1月21日
0.2.2 2022年10月15日
0.2.1 2022年9月15日
0.2.0 2022年7月31日

#117 in Unix APIs

Download history 285/week @ 2024-04-26 340/week @ 2024-05-03 511/week @ 2024-05-10 247/week @ 2024-05-17 455/week @ 2024-05-24 236/week @ 2024-05-31 467/week @ 2024-06-07 334/week @ 2024-06-14 320/week @ 2024-06-21 287/week @ 2024-06-28 464/week @ 2024-07-05 317/week @ 2024-07-12 450/week @ 2024-07-19 433/week @ 2024-07-26 332/week @ 2024-08-02 269/week @ 2024-08-09

1,560 下载量/每月
用于 iceprogrs

MIT 许可证

82KB
2K SLoC

libgpiod 在 Rust 中

github crate docs MIT CI

Rust crate 用于与 Linux GPIO 字符设备交互。

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

由于所有功能都依赖于 Linux 函数调用,此 crate 仅支持 Linux 系统。

ABI 兼容性

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

Crates

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

使用示例

输入值

use gpiod::{Chip, Options, Masked, AsValuesMut};

fn main() -> std::io::Result<()> {
    let chip = Chip::new(0)?; // 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)?;

    // get all three values
    let values = inputs.get_values([false; 3])?;

    println!("values: {:?}", values);

    // get second value only
    let values = inputs.get_values([None, Some(false), None])?;

    println!("values: {:?}", values);

    // get values via bits
    let values = inputs.get_values(0u8)?;

    println!("values: {:#b}", values);

    // get only second value via bits
    let values = inputs.get_values(Masked::<u8>::default().with(1, Some(false)))?;

    println!("values: {:#b}", values);

    Ok(())
}

输出值

use gpiod::{Chip, Options, Masked, AsValuesMut};

fn main() -> std::io::Result<()> {
    let chip = Chip::new("gpiochip0")?; // 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)?;

    // set all two values
    outputs.set_values([true, false])?;

    // set second value only
    outputs.set_values([None, Some(false)])?;

    // set values from bits
    outputs.set_values(0b01u8)?;

    // set only second value from bits
    outputs.set_values(Masked::<u8>::default().with(1, Some(true)))?;

    Ok(())
}

监视值

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

fn main() -> std::io::Result<()> {
    let chip = Chip::new("gpiochip0")?; // 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)?;

    loop {
        let event = inputs.read_event()?;

        println!("event: {:?}", event);
    }

    Ok(())
}

依赖项

~2MB
~41K SLoC