驅動程式 FIDL 多工淘汰淘汰

目標與激勵

驅動程式架構會管理硬體裝置和用戶端之間的連線。過去,這個連線提供三種 FIDL 通訊協定: - fuchsia.io/Node - fuchsia.device/Controller - 裝置的實際 FIDL 通訊協定

此多工處理需要驅動程式架構擁有管道,以便手動提供節點和控制器通訊協定。這樣可以防止基礎驅動程式庫擁有管道,進而限制驅動程式能執行的作業,並避免驅動程式使用標準 FIDL 線路伺服器物件和模式。

這種隱式多工處理也會違反組合的 FIDL 設計原則。FIDL 設計原則中,通訊協定在編譯時可以是多個通訊協定的 composed。然而,驅動程式架構會在執行階段執行這項組成,而且不知道裝置所說的 FIDL 通訊協定。

與 devfs 互動的許多用戶端會將各自的管道從一種 FIDL 通訊協定投放到另一個,進而消除類型安全,讓程式碼更難以依循。

這項專案最初目標是從驅動程式架構中移除 FIDL 多工處理功能。在這種情況下,你必須更新與駕駛員互動的用戶端。

完成這項專案後,駕駛人將能在自己與其用戶端之間取得管道。

技術背景

貢獻者應熟悉 FIDL 用戶端。貢獻者不必熟悉駕駛人或驅動程式庫架構。

如何提供協助

挑選工作

許可清單中的每一行都代表一項工作。您可以在這裡挑選這些工作。

fuchsia.io/Node 有 1 個許可清單和 fuchsia.device/Controller 的許可清單。

執行工作

遺憾的是,這個多工處理是隱式的,所以沒有什麼好方法能得知哪個程式碼需要先使用此程式碼。最好的工具就是從許可清單中移除一行 並找出會造成破壞的情況

要找出元件最簡單的方法,就是先確認 QEMU 啟動。如果仍無法啟動,請檢查並修正所有錯誤。QEMU 啟動後,您可以透過 CQ 執行 CL,以嘗試尋找其他錯誤。

依賴多工處理的元件會先擁有相關 Devfs 路徑的存取權。藉由搜尋 devdev-classdev-class-{name} 的 CML 檔案,是找到相關元件的好方法。

修正 fuchsia.io/Node

如果移除這個多工處理,則使用裝置做為檔案描述元 (或稱 fd) 的程式碼將會中斷。

這類程式碼非常可疑: fbl::unique_fd fd; zx_status_t status = fdio_open(dev_path, 0, fd.reset_and_get_address());

應替換為 FIDL 導向的程式碼: zx::result client_end = component::Connect<fidl_my_protocol::Protocol>(dev_path);

修正 fuchsia.device/Controller

如果移除這個多工處理,連線至 fuchsia.device/Controller 的程式碼將會中斷。使用者可能會更容易找到這些位置,因為在損壞的任何元件中,g 代表可能會使用這個通訊協定。

程式碼看起來會像這樣: component::ConnectAt<fuchsia_device::Controller>(caller.directory(), device_path);

修正方式為開啟裝置控制器的路徑,此路徑一律為裝置路徑加上 /device_controller

舉例來說,以下是更新後的程式碼:std::string device_controller_path = device_path + "/device_controller"; component::ConnectAt<fuchsia_device::Controller>(caller.directory(), device_controller_path);

這適用於類別路徑和邏輯路徑,例如:/dev/class/input/000/device_controller /dev/sys/platform/usb/usb-hid/device_controller

此外,也請留意將管道投放到裝置控制器的程式碼: fidl::WireCall<fuchsia_device::Controller>(channel)->Rebind();

您必須找出程式碼接收 channel 的位置,然後更新以連線至裝置控制器。

如果程式碼會來回轉換單一管道,則需要更新才能傳輸兩個頻道。

完成工作

您的 CL 通過 CQ 後,應該就可以合併了!感謝你提供協助。

範例

偵錯

如果您移除類別,但仍有程式碼使用多工處理,您將會看到以下錯誤訊息:

{$TOPOLOGICAL_PATH} ({$PROTOCOL_ID}): Failed to send message with ordinal={$ORDINAL} to device: FIDL endpoint was unbound due to unexpected message, status: ZX_ERR_NOT_SUPPORTED (-2), detail: unknown ordinal
It is possible that this message relied on deprecated FIDL multiplexing.
For more information see https://fuchsia.dev/fuchsia-src/contribute/open_projects/drivers/fidl_multiplexing

拓撲路徑和通訊協定 ID 可做為良好提示,說明哪些裝置和 FIDL 通訊協定仍依賴多工處理。

贊助商

提出問題或查看最新狀態: