開始執行 DFv1 到 DFv2 遷移作業之前,經常會問 以下問題能幫助您辨別特殊情況或極端情況 你可能需要給出不同驅動程式庫費用。
相容性填充詞是什麼?何時需要?
DFv1 和 DFv2 驅動程式位於節點拓撲的單一分支版本下 樹狀結構 (也就是所有驅動程式都遷移至 DFv2) 後, 才能相互交流為協助進行遷移 Fuchsia 驅動程式庫架構團隊打造了相容性輔助程式,以便 推出 DFv1 驅動程式。
如果目標驅動程式庫人和仍在使用
Banjo 與這些驅動程式不會同時遷移至 DFv2。
您必須使用這個相容性輔助程式 (手動建立
compat::DeviceServer
),以在不同架構中啟用驅動程式
以便彼此溝通
如要進一步瞭解如何在 DFv2 驅動程式中使用相容性輔助程式, 請參閱 在 DFv2 驅動程式中設定 Compat 裝置伺服器 指南。
DFv2 驅動程式可以使用相容性輔助程式與 Banjo 通訊協定通訊嗎?
雖然我們強烈建議將 DFv1 驅動程式庫從 如果 DFv2 驅動程式庫需要的話,不妨試試 FIDL 一些現有的 Banjo 通訊協定 相容性輔助程式 以下功能:
compat::BanjoServer
可讓您輕鬆提供 Banjo (請參閱banjo_server.h
)。compat::ConnectBanjo
可讓你輕鬆與 Banjo 連結 (請參閱banjo_client.h
)。
如要進一步瞭解這些功能,請參閱 在 DFv2 驅動程式中提供 Banjo 通訊協定 指南。
DFv2 驅動程式是否可以使用複合節點的相容性墊片?
複合驅動程式的遷移程序幾乎與 但複合型驅動程式稍有不同 以及從父項節點連線至 Banjo 或 FIDL 通訊協定的方法。
由於複合節點具有多個父項,因此複合驅動程式 識別父項名稱例如: 下列是與 Banjo 建立連線的正常驅動程式庫 父項:
zx::result client_result =
compat::ConnectBanjo<ddk::HidDeviceProtocolClient>(incoming());
除了父項以外,複合驅動程式的方法幾乎相同 需要新增名稱:
zx::result client_result =
compat::ConnectBanjo<ddk::HidDeviceProtocolClient>(incoming(), "gpio-int")
新的 DFv2 驅動程式庫介面有哪些變更?
DFv2 的一項重大變化是駕駛人掌控生命週期 驅動程式建立的子nodes (或裝置)。 這與 DFv1 不同,後者是指驅動程式庫架構 裝置的循環,例如拆解裝置、 透過裝置樹狀結構
在 DFv1 中,裝置由 zx_protocol_device
控管
而駕駛則是由 zx_driver_ops
控制。
如果使用 ddktl
,就必須使用 zx_protocol_device
中的介面
由混合範本類別的 Ddk*()
函式包裝。在 DFv2 中
這些介面有異動
。
服務探索在 DFv2 中如何運作?
在 DFv2 中,必須使用 FIDL 服務建立通訊協定
以獲得最佳效能和最安全的連線父項驅動程式庫會將 FIDL 服務新增至
fdf::OutgoingDirectory
物件並提供給子節點
如此一來,上驅動程式庫就能為
子節點
DFv1 和 DFv2 驅動程式會以下列方式進行不同:
在 DFv1 中,驅動程式庫設定並傳遞
DeviceAddArgs::set_runtime_service_offers()
呼叫。接著是驅動程式庫 建立fdf::OutgoingDirectory
物件並傳遞用戶端 透過DeviceAddArgs::set_outgoing_dir()
呼叫結束控制代碼。在 DFv2 中,驅動程式庫設定並傳遞
NodeAddArgs::offers
物件。驅動程式會把服務新增到 由DriverBase
類別包裝的傳出目錄 (原始 由Start()
函式提供)。子項驅動程式庫繫結至 子節點,驅動程式代管程序會傳遞傳入的命名空間 含有傳送至子項驅動程式庫Start()
函式的服務。
在兒童驅動程式庫端,DFv1 和 DFv2 驅動程式也會連線到 以不同方式提供服務:
- DFv1 驅動程式庫會呼叫
DdkConnectRuntimeProtocol<ServiceInstanceName>()
方法。 DFv2 驅動程式庫在偵測到時呼叫
incoming()->Connect<ServiceInstanceName>()
使用DriverBase
類別。若需更多資訊,請參閲 使用 DFv2 服務探索。
驅動程式節點 (或裝置) 如何在 DFv2 系統中公開?
Fuchsia 擁有一棵全球的裝置樹,這種檔案系統稱為
devfs
,會以 /dev
的形式轉送至大多數元件。時間
驅動程式庫新增「裝置節點」,即可選擇新增
「檔案」放入 devfs
。接著,devfs
中的這個檔案會允許其他元件
才與驅動程式庫交談舉例來說,音訊驅動程式庫可能會新增
喇叭裝置節點與音訊驅動程式庫想確認
元件則可使用此節點將音訊輸出至喇叭。完成
此時,音訊驅動程式庫會新增 (或公開) devfs
節點
,讓揚聲器顯示為 /dev/class/audio/<random_number>
系統中的功能
詳情請參閱在 DFv2 驅動程式中設定 devfs。 指南。
DFv1 中可用的 DFv2 中未使用哪些功能?
如果 DFv1 驅動程式庫呼叫 load_firmware()
函式
在 DDK 程式庫中,您需要自行實作,因為
函式,不適用於 DFv2。不過,這是正常現象
易於實作。
DFv2 中的繫結規則有哪些異動?
DFv2 節點包含 FIDL 服務提供的節點屬性。
然而,在下列情況下,您不太可能需要修改繫結規則 將現有的 DFv1 驅動程式庫遷移至 DFv2
DFv2 的記錄功能有哪些異動?
DFv2 驅動程式無法使用 zxlogf()
函式或任何偵錯程式庫
以納入或使用這個函式。zxlogf()
定義於
並從以下位置移除://src/lib/ddk/include/lib/ddk/debug.h
DFv2 中的依附元件遷移至 DFv2 的驅動程式必須
停止使用這個程式庫和其他程式庫
這一切仰賴它
不過,全新的相容性程式庫
Fuchsia 來源樹狀結構 (fuchsia.git
) 環境中可用的資源,為
新增功能,允許 DFv2 驅動程式使用 DFv1 樣式記錄功能。
DFv2 中的檢查功能有哪些異動?
DFv1 驅動程式會使用驅動程式庫專屬檢查函式來建立和更新
驅動程式庫維護指標舉例來說,在 DFv1 中
系統會呼叫 DeviceAddArgs::set_inspect_vmo()
函式來表示
驅動程式庫用於檢查的 VMO。在 DFv2 中
建立 inspect::ComponentInspector
物件。
調度員在 DFv2 中執行的動作
FIDL 檔案會為用戶端和伺服器產生範本和資料類型 配對。用戶端和伺服器結束之間是一個管道 每一端的調度器都會從管道擷取資料。如要 如需調度員的相關資訊,請參閱 驅動程式調度器和執行緒。
將 DFv1 驅動程式庫遷移至 DFv2 時,新的執行緒模型會有哪些問題?
DFv2 中的 FIDL 呼叫並非以單一執行緒為基礎,且為非同步
(雖然您也可以新增 .sync()
設為同步廣告)
呼叫 FIDL 呼叫或使用 fdf::WireSyncClient
)。驅動因素通常
我們不建議進行同步呼叫,因為它們可能會封鎖
執行 Vertex AI 工作(不過,驅動程式庫可以視需要
具有 FDF_DISPATCHER_OPTION_ALLOW_SYNC_CALLS
選項的調度工具,
僅支援
同步處理調度工具。)
鑒於 Banjo (DFv1) 與 FIDL (DFv2),您需要決定哪一種 FIDL 呼叫類型 (即 以及您想在遷移時使用的同步或非同步資料)。如果您的 原始程式碼專為 Banjo 同步性質所設計 必須讓所有內容非同步 請考慮先使用同步版的 FIDL (也就是 但可能會暫時降低效能。 之後,您可以回頭查看這些通話,並使用 同步呼叫
DFv2 中的測試驅動程式有哪些異動?
驅動程式庫單元測試中使用的 mock_ddk
程式庫為
DFv1 的特定檔案新的測試程式庫現已
適用於 DFv2 驅動程式
進行遷移時,應該將驅動程式分支成 DFv2 版本嗎?
分支現有驅動程式庫來進行遷移,取決於複雜度 驅動程式庫。一般而言,建議避免在 因為可能會產生更多工作不過 如果是較大的駕駛,不妨將驅動程式庫分支 DFv2 版本,方便您逐步 放在小塊中
你可以在 GN 引數中新增驅動程式元件,即可製作驅動程式庫的分支
並使用旗標決定要採用 DFv1 或 DFv2 版本。這個
CL 範例示範了 DFv2 分支
已新增 msd-arm-mali
驅動程式庫。
有哪些推薦讀物?
fuchsia.dev 的 DFv2 概念文件和
與上一個 DFv1 相比的Gerrit 變更
Intel Wi-Fi 驅動程式庫遷移 (
pcie-iwlwifi-driver.cc
檔案
包含大部分的新 API)。