Ivan's Blog
主题

embedded-hal driver

embedded-hal driver 表示一个 crate 的主 API 明确建立在 embedded-hal trait 生态之上,目标是被其他 firmware 或 board-support 代码组合进系统,而不是自己成为整机应用。这里的核心不是器件名,而是“驱动 crate 的复用边界”。 这个 Topic 关注的是 crate API 形状、trait 依赖、feature flags、测试方式和下游组合方式。

  • 硬件

目录

Definition

embedded-hal driver 表示一个 crate 的主 API 明确建立在 embedded-hal trait 生态之上,目标是被其他 firmware 或 board-support 代码组合进系统,而不是自己成为整机应用。这里的核心不是器件名,而是“驱动 crate 的复用边界”。

这个 Topic 关注的是 crate API 形状、trait 依赖、feature flags、测试方式和下游组合方式。它通常会和 Embedded Rust、Async embedded、I2C 一起出现,但不替代这些 Topic:embedded-hal driver 解释驱动层契约,其他 Topic 解释语言生态、并发模型或具体总线/协议(projects/bq25730-rs.md、projects/ina3221-async-rs.md、projects/pca9546a-rs.md)。

When to use

当 Cargo.toml、README、crate 描述或 project snapshot 明确表明仓库的主要交付物是基于 embedded-hal 的 driver crate 时使用。若项目只是消费某个 driver、或只是 firmware repo 内部顺带有一点外设封装,不应直接命中。

如果一个改动会影响 driver API、trait bounds、feature flags、mock-based tests、寄存器访问封装、error type、bus ownership 或 sync/async 集成方式,就应该命中 embedded-hal driver。反过来,若改动主要影响板级任务调度、UI、网络、整机部署或协议编排,则应该回到更相邻的 Topic。

Habits / defaults

  • 倾向保持 crate 小而可组合:核心逻辑收敛在 src/lib.rs 或少量模块,让下游 firmware 自己决定任务模型、总线共享和重试策略(projects/pca9546a-rs.md)。
  • feature flags 常用于 async support、logging、芯片变体或可选功能;这些开关应影响扩展能力,而不是把核心寄存器语义拆散(projects/tps55288-rs.md、projects/bq25730-rs.md)。
  • 测试通常以 embedded-hal mocks、寄存器级单元测试或 trait-level 验证为主,而不是要求每个 crate 自带 HIL;板级真实验证留给下游 firmware 仓库(projects/ina3221-async-rs.md)。
  • API 设计要优先表达器件语义,而不是泄露过多 board-specific 假设。驱动层可以知道寄存器、状态机和总线事务,但不应强行把整机调度、UI 逻辑或业务策略塞进 crate。
  • 若同时支持 sync/async,用 trait layering 或 feature gating 维持单一语义源,避免为两套执行模型复制两份互相漂移的驱动实现(projects/ft6336u-async.md、projects/bq769x0-async-rs.md)。
  • 文档里应明确这个 driver 依赖哪类总线/trait、是否需要外部 delay、是否暴露 burst read/write、错误如何包装;这些都直接影响下游 firmware 是否能安全接入。

Reference implementations

  • projects/bq25730-rs.md:带 sync/async support 的电源管理 driver,适合看 feature-based API layering。
  • projects/bq769x0-async-rs.md:多芯片家族 driver,适合看 crate 如何保持复用而不绑死整机实现。
  • projects/ft6336u-async.md:触摸控制器 driver,适合看外设交互语义与 async 能力如何共存。
  • projects/ina3221-async-rs.md:强调 mock-first 测试路径,适合说明 driver crate 的验证默认值。
  • projects/pca9546a-rs.md:很小的 I2C mux crate,适合说明“驱动层保持薄、把系统策略留给下游”。

Failure modes

  • 只因为依赖名或 crate 关键字命中就打 embedded-hal driver,却没有 driver crate 级别证据支撑,最后会让 Topic 失去判别力。
  • 把 embedded-hal driver 当成整个仓库的总括标签,忽略 Embedded Rust、Async embedded、I2C 等相邻 Topic,会让后续 Agent 无法判断真正应该验证的是驱动 API、运行时并发还是具体协议。
  • API 设计泄露太多 board-specific 假设,会让 crate 难以复用;Topic 回答里应优先审查 trait 边界,而不是默认接受“能在当前板子上跑”。
  • 只做 HIL 不做 mock/trait-level tests,会让小改动验证成本过高;反过来只做 mock 不写器件语义和时序假设,也可能让驱动表面通过、上板失败。

Evidence index

  • projects/bq25730-rs.md
  • projects/bq769x0-async-rs.md
  • projects/ft6336u-async.md
  • projects/gc9307-async-rs.md
  • projects/gc9d01-rs.md
  • projects/ina3221-async-rs.md
  • projects/pca9546a-rs.md
  • projects/sc8815-rs.md
  • projects/sw2303-rs.md
  • projects/tca6424-rs.md
  • projects/tps55288-rs.md
  • projects/xca9545a-async-rs.md
  • skills/style-playbook/references/data/topics/embedded-hal-driver.json