駕駛工具

驅動程式公用程式是 Fuchsia 應用程式,可與用來診斷及匯出驅動程式的裝置進行通訊。舉例來說,您可以透過 driver 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.fidlTransfer() 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 API 可以按照 FIDL ABI 和 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++:

舉例來說,i2cutil 中使用新 C++ 繫結的 I2C 版本如下:

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

這會呼叫 Transfer() 方法,以便從 I2C 裝置寫入及讀取資料。