驅動程式公用程式是 Fuchsia 應用程式,可與用於診斷的裝置進行通訊,並由驅動程式匯出。舉例來說,您可以透過 driver i2c 指令列公用程式掃描並與 Inter-Integrated Circuit (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 通訊,請完成下列步驟:
- 從
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++:
舉例來說,如果要使用新的 C++ 繫結,在 i2cutil 中使用 I2C,我們有:
fidl::WireSyncClient<fuchsia_hardware_i2c::Device2> client(zx::channel(channel));
auto read = client.Transfer(...);
這會呼叫 Transfer()
方法,以便寫入及讀取 I2C 裝置。