驅動程式 FIDL 多工淘汰淘汰

目標和動機

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

這種多重處理功能需要驅動程式架構擁有管道,才能手動提供節點和控制器通訊協定。這會防止底層驅動程式庫擁有管道,進而限制驅動程式可執行的操作,並防止驅動程式使用標準 FIDL 線路伺服器物件和模式。

這種隱含的多重處理功能也違反 FIDL 組合設計原則。FIDL 設計原則指出,通訊協定可以在編譯時成為多個通訊協定的 composed。不過,驅動程式架構會在執行階段執行此組合,因此不會知道裝置所使用的 FIDL 通訊協定。

許多與 devfs 互動的用戶端會將其管道從一個 FIDL 通訊協定投放至另一個,這會移除類型安全性,並通常使程式碼更難追蹤。

這個專案旨在從 Driver Framework 中移除 FIDL 多工處理。這項作業需要更新與駕駛員互動的用戶端。

這項專案完成後,駕駛人將可擁有自己和客戶之間的管道。

技術背景

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

如何提供協助

選擇工作

許可清單中的每一行都代表一項工作。這些工作可隨意挑選。

fuchsia.io/Nodefuchsia.device/Controller 各有一個許可清單。

執行工作

很抱歉,這類多重處理是隱含的,因此沒有好方法可以預先找出哪些程式碼會依賴這項功能。我們最好的工具就是從許可清單中移除一行,看看哪些內容會中斷。

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

依賴多工處理的元件必須先能存取問題中的 devfs 路徑。搜尋 CML 檔案中的 devdev-classdev-class-{name},是尋找相關元件的絕佳方法。

修正 fuchsia.io/Node

如果移除這項多工處理功能,使用裝置做為檔案描述元 (fd) 的程式碼就會中斷。

以下程式碼看起來很可疑: fbl::unique_fd fd; zx_status_t status = fdio_open3(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 的程式碼就會中斷。這些位置可能比較容易找到,因為您可以使用 grep 在任何故障元件中尋找此通訊協定的用法。

以下程式碼看起來很可疑: 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 通訊協定仍依賴多工處理。

贊助商

如有任何問題或想瞭解最新進度,請與我們聯絡: