驅動程式公用程式是 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,請完成下列步驟:
- 從
ddk::Messageable
導出裝置,讓裝置難以送達。 - 為指定 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 裝置寫入及讀取資料。