驱动程序实用程序是 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 通信 请完成以下步骤:
- 通过派生自
ddk::Messageable
使设备可传递。 - 为给定 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 设备执行读写操作。