#bindings #raspberry-pi #videocore #raspberry #vcgencmd

bin+lib videocore-gencmd

实际对 Videocore gencmd 功能的 FFI 绑定

1 个不稳定版本

0.1.0 2021年7月13日

#1781 in 硬件支持

MIT/Apache

54KB
1K SLoC

videocore-gencmd

在 Rust 中实现 Videocore gencmd 接口的实际 FFI 绑定和高级重实现。

绑定

使用 bindgenhttps://github.com/raspberrypi/userland 上可用的代码生成绑定。

实际的生成受控于 run_bindgen 功能,因为不是所有平台都能够运行 bindgen(因为 bindgen 使用 dlopen,这在 musl 上不工作)。如果此功能未被选择,则预先生成的绑定将复制到源代码中。

架构

由于 Broadcom 库尚未完成,因此错误也影响了项目的架构。videocore 状态和实例可能只初始化一次。

通过在 AtomicBool 标志中保留这些信息来在运行时进行检查。

global_singleton 功能下实现了一种在线程之间共享实例的方法。这提供了一种全局、懒加载、弱引用计数的单例。这意味着在第一次使用时,全局状态被初始化。当所有当前使用都被丢弃时,全局单例也会被卸载。当需要另一个实例时,它会再次按需初始化。

除此之外,还可以通过其 new 构造函数初始化 GlobalInstance 实例。

命令

由于 gencmd 接口是一个简单的文本协议,因此即使没有提供特定的实现,也可以使用命令。然后,响应作为字符串返回。在 crate 中提供了解析工具,并实现了响应解析。通过包装接口发送的命令返回的错误始终被解析。

CLI

src/bin/vcgencmd 中实现了一个 CLI,它实现了与原始 C 二进制文件(如 raspberrypi-userland/host_applications/linux/apps/gencmd/gencmd.c 中提供的)相同的功能。CLI 应用程序允许对原始处理(发送提供的命令并仅解析错误响应)以及实现命令的响应解析命令识别。

以下是 videocore-gencmd --help 的输出

videocore-gencmd 0.1.0

USAGE:
    vcgencmd [FLAGS] [OPTIONS] <command>...

FLAGS:
    -h, --help       Prints help information
    -r, --raw        Do not attempt to recognize the command nor parse the response (errors are always parsed)
    -V, --version    Prints version information

OPTIONS:
    -v, --verbosity <verbosity>    Level of verbosity [default: Off]  [possible values: Off, Error, Warn, Info, Debug,
                                   Trace]

ARGS:
    <command>...

依赖关系

~0.3–1.1MB
~23K SLoC