#devices #driver #toolkit #read-write #async-read #device-drivers

no-std 设备驱动程序

一个用于编写更好的设备驱动程序的工具包,更快

14 个不稳定版本 (6 个重大更改)

新版本 0.7.0 2024 年 8 月 22 日
0.6.0 2024 年 5 月 26 日
0.5.3 2024 年 1 月 8 日
0.4.2 2024 年 6 月 27 日
0.1.0 2020 年 9 月 28 日

嵌入式开发 中排名第 174

Download history 13/week @ 2024-05-03 2/week @ 2024-05-10 1/week @ 2024-05-17 156/week @ 2024-05-24 24/week @ 2024-05-31 34/week @ 2024-06-07 21/week @ 2024-06-14 55/week @ 2024-06-21 37/week @ 2024-06-28 8/week @ 2024-07-05 23/week @ 2024-07-19 208/week @ 2024-07-26 19/week @ 2024-08-02 15/week @ 2024-08-09 108/week @ 2024-08-16

每月下载量 353
用于 2 crates

MIT/Apache 许可证

36KB
637 行代码

设备驱动程序工具包 #![no_std] crates.io 文档

一个用于编写更好的设备驱动程序的工具包,更快。

这个 crate 包含一组 trait,用于表示设备、寄存器和命令。您可以使用宏以方便的方式实现寄存器和命令。

您可以轻松地为用户提供阻塞和异步接口。

目前您有以下选项

欢迎反馈和建议!请直接在 github 上提交问题。我想为这个 crate 添加更多功能,但只有在我(或者你)需要的时候。

我明白文档有些不足,但示例应该相当直观。对于使用此 crate 的真实驱动程序示例,您还可以查看: https://github.com/diondokter/s2lp

还需要改进

  • 添加一次性读取多个寄存器的能力
  • 命令行界面以生成实现(提高驱动程序用户的编译时间)

注意:在https://github.com/illicitonion/num_enum/pull/77 合并之前,您需要将 num_enum 导入到使用设备驱动宏的 crate 中。这需要在 Cargo.toml 中添加。仅仅从设备驱动中重新导出是不够的。

架构

该 crate 由三部分组成

  • device-driver:主要的 crate,重新导出所需的一切。它定义了一组表示设备和寄存器的 trait。设备 trait 应由驱动 crate 实现,以便让系统知道如何读取和写入寄存器。所有这些操作都是通过包含有关寄存器所需所有信息的寄存器 trait 来完成的。虽然可以手动实现寄存器和它们的字段,但这个 crate 提供了非常方便的功能来生成所有这些。
  • device-driver-generation:这相当于后端。它包含了一种设备及其寄存器和字段的中间表示形式的定义。从那里,它可以生成实现上述设备驱动 trait 的 Rust 代码。它还为各种类型提供了自定义的 serde 反序列化例程,以便它们可以方便地表达。
  • device-driver-macros:包含所有的 proc 宏。一个宏接受一个定义文件的路径。然后它使用 serde 将其反序列化为 '生成' 表示形式。另一个宏定义了自定义的 Rust 语法,并将其转换为 '生成' 表示形式。两者都生成寄存器和它们的字段的实现。

语义版本控制

任何可能破坏用户代码的东西都应引发 破坏性 的语义版本控制提升。这包括宏格式和文件寄存器定义格式。

generationmacros crate 被视为内部组件,因此它们在语义版本控制提升上可能不会那么严格。这主要是为了使它们与主要 crate 的版本保持一致。

如果您直接依赖于这些 crate,请告诉我!如果我知道这些有直接用户,我会对版本更加严格。

许可证

根据您选择的以下任何一个许可证授权:

由您选择。

贡献

除非您明确表示,否则根据 Apache-2.0 许可证定义的,您有意提交的任何旨在包含在作品中的贡献,都应双重许可,如上所述,没有任何附加条款或条件。

变更日志

未发布

0.7.0 (22-08-24)

  • 破坏性变更:改进了命令调度的 API
  • 添加了缓冲区支持
  • 添加了严格模式转换。这使得类型需要 From<primitive> 而不是 TryFrom<primitive>。但是,读取寄存器字段的结果不再是。
  • 为寄存器添加了字节序选项,以便它们可以作为小端读取和存储。(如果没有指定,它仍然默认为大端)
  • 在寄存器结构体上添加了 BitAnd、BitOr 和 BitXor。它并不像我希望的那样一致,但在下一个版本中应该会得到修复。
  • 添加了对寄存器块的支持

0.6.0 (26-05-24)

  • 更新:将宏重命名,使其不包含“register”这个词
  • 添加了定义命令的方法

0.5.3 (08-01-24)

  • 改进了README,增加了硬链接和更多解释
  • 现在生成的设备寄存器函数也进行了文档化

0.5.2 (08-01-24)

  • 异步读取和修改现在可以使用寄存器代替其读取和写入类型

0.5.1 (08-01-24)

  • 移除了意外引入的强制std依赖

0.5.0 (07-01-24)

  • 更新:从零开始重新构建了crate。现在更依赖于类型系统,所有宏都是proc-macros。这使得它更容易维护和扩展。
  • 新的寄存器特质
  • 新的设备特质
  • 几乎所有旧功能仍然支持

0.4.1 (13-12-22)

  • 意外地将0.4.0的异步标志默认开启,导致其在稳定版上无法编译。

0.4.0(2022年12月13日)(已撤回)

  • 为寄存器接口添加了异步支持。使用async功能标志来激活它。启用后,您将能够访问ll::register_async模块,该模块将为您生成异步代码。
  • 更新了依赖项(主要是将bitvec更新到1.0,这使得这次发布成为一个技术上的重大变化)

0.3.1 (22-12-21)

  • 为低级错误添加了文档(#14

0.3.0 (02-05-21)

  • 为所有寄存器R添加了更好的Debug实现,打印十六进制原始值。现在还有选项(#[generate(Debug)])以获取更好的Debug实现,该实现还会打印出所有字段,但要求所有字段都实现Debug。请参阅(#10)了解其工作原理。

0.2.0 (19-04-21)

  • 现在所有与“W”的用户交互都通过&mut进行,而不是直接进行,以支持更多类型的代码结构(#7

依赖项

~3–4MB
~81K SLoC