驱动程序实用程序

驱动程序实用程序属于 Fuchsia 应用,可与用于诊断的设备通信并由驱动程序导出。例如,集成电路 (I2C) 设备可以通过 driver 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/05:00:2/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。为此,请针对 C++ 使用所选语言的 FIDL 绑定:

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

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

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