驅動程式公用程式是 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.fidl 提供的 Transfer()
FIDL 方法,可允許寫入及讀取 I2C 裝置。
TODO(https://fxbug.dev/42122211):新增檢查用法說明。
探索
駕駛人宣傳的服務可轉送至非驅動程式庫元件。當服務能力傳送至非驅動程式元件時,該元件會看到該服務的所有例項匯總清單。(請參閱「駕駛員通訊」)。使用者可以瀏覽元件架構,查看哪些服務會宣傳,以及使用 fx component
指令將服務導向何處。
建立新的驅動程式庫公用程式
探索
您可以使用 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++:
舉例來說,針對 i2cutil 中的 I2C,我們使用新的 C++ 繫結:
fidl::WireSyncClient<fuchsia_hardware_i2c::Device2> client(zx::channel(channel));
auto read = client.Transfer(...);
這會呼叫 Transfer()
方法,以便寫入及讀取 I2C 裝置。