驱动程序实用程序

驱动程序实用程序是 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 API,您需要将新的 FIDL 文件添加到 /sdk/fidl 中的某个文件夹中。

如需在尚未提供 FIDL API 的 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++,请使用以下代码:

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

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

这会调用 Transfer() 方法,以便向 I2C 设备写入和读取数据。