驱动程序实用程序

驱动程序实用程序是 Fuchsia 应用,可与用于 并由驱动程序导出例如内部集成电路 (I2C) 可以通过驱动程序 i2c 命令行实用程序。 例如:

driver i2c ping
/dev/class/i2c/000: OK
[00164.657] 04506:05266> i2c: error on bus
Error -1
/dev/class/i2c/001: ERROR
/dev/class/i2c/002: OK
/dev/class/i2c/003: OK
/dev/class/i2c/004: OK

API

驱动程序和应用之间的通信机制是 FIDL,以及 FIDL API 由任何给定驱动程序导出的数据完全定义了可以对哪些诊断执行 。例如,对于 I2C, i2c.fidl,因此还有一个 Transfer() FIDL 方法,允许对 I2C 设备执行读写操作。

TODO(https://fxbug.dev/42122211):添加了检查用法说明。

发现

Fuchsia 驱动程序模型定义了 devfs 文件系统(请参阅 设备型号,也就是 用户空间服务和应用访问设备的方式。作为 您可以浏览 devfs 文件系统,查看会导出哪些设备, 请注意,同一设备可通过多种方式访问,您可以使用 lsdev 命令来查找关系,如下所示:

lsdev /dev/class/i2c/000
topological path for /dev/class/i2c/000: /dev/sys/platform/i2c-0/aml-i2c/i2c/i2c-2-44

创建新的驱动程序实用程序

发现

您可以通过 devfs 发现现有驱动程序。新设备可被检测到 当其驱动程序执行 DdkAdd()(针对 C++ 驱动程序)运算时。

API

spiutil 等现有实用程序使用的是当前现有的 FIDL API。接收者 扩展由现有驱动程序导出的功能, 现有驱动程序导出可以通过以下方式进行扩展/改进: FIDL ABI 和 API 兼容性指南。 如果没有现成的 FIDL API,则需要将新的 FIDL 文件添加到 /sdk/fidl 中的一个文件夹。

在尚未提供 FIDL 的 C++ 驱动程序中启用 FIDL 通信 请完成以下步骤:

  1. 通过派生自 ddk::Messageable 使设备可传递。
  2. 为给定 FIDL API 的 FIDL 协议方法添加方法。

例如,对于 SPI

using SpiChildType =
    ddk::Device<SpiChild, ddk::Messageable<fuchsia_hardware_spi::Device>::Mixin>;
class SpiChild : public SpiChildType,
                 public ddk::SpiProtocol<SpiChild, ddk::base_protocol> {
...
  // FIDL methods.
  void Transmit(fidl::VectorView<uint8_t> data, TransmitCompleter::Sync completer) override;
...

实用工具

如需实现与设备通信的 Fuchsia 应用, 调用 FIDL API。为此,请利用您所用语言对应的 FIDL 绑定。 选择,对于 C++:

例如,对于 i2cutil 中使用新的 C++ 绑定的 I2C 我们有:

fidl::WireSyncClient<fuchsia_hardware_i2c::Device2> client(zx::channel(channel));
auto read = client.Transfer(...);

这将调用 Transfer() 方法,以便对 I2C 设备执行读写操作。