1 个不稳定版本
0.1.0 | 2021年7月13日 |
---|
#1781 in 硬件支持
54KB
1K SLoC
videocore-gencmd
在 Rust 中实现 Videocore gencmd 接口的实际 FFI 绑定和高级重实现。
绑定
使用 bindgen
从 https://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