駕駛工具

驅動程式公用程式是 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() 允許從 I2C 裝置寫入及讀取的 FIDL 方法。

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 API 如何擴充/改進現有驅動程式庫匯出項目 FIDL ABI 與 API 相容性指南。 在沒有 FIDL API 的情況下,您需要將新的 FIDL API 新增至 /sdk/fidl 中的資料夾。

在尚未提供 FIDL 的 C++ 驅動程式中啟用 FIDL 通訊功能 API,請完成下列步驟:

  1. ddk::Messageable 導出裝置,讓裝置難以送達。
  2. 為指定 FIDL API 的 FIDL 通訊協定方法新增方法。

例如「SPI」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 裝置寫入及讀取資料。