目標和動機
驅動程式架構會管理硬體裝置和用戶端之間的連線。這個連線先前曾提供三種 FIDL 通訊協定:
- fuchsia.io/Node
- fuchsia.device/Controller
- 裝置的實際 FIDL 通訊協定
這種多重處理功能需要驅動程式架構擁有管道,才能手動提供節點和控制器通訊協定。這會防止底層驅動程式庫擁有管道,進而限制驅動程式可執行的操作,並防止驅動程式使用標準 FIDL 線路伺服器物件和模式。
這種隱含的多重處理功能也違反 FIDL 組合設計原則。FIDL 設計原則指出,通訊協定可以在編譯時成為多個通訊協定的 composed
。不過,驅動程式架構會在執行階段執行此組合,因此不會知道裝置所使用的 FIDL 通訊協定。
許多與 devfs 互動的用戶端會將其管道從一個 FIDL 通訊協定投放至另一個,這會移除類型安全性,並通常使程式碼更難追蹤。
這個專案旨在從 Driver Framework 中移除 FIDL 多工處理。這項作業需要更新與駕駛員互動的用戶端。
這項專案完成後,駕駛人將可擁有自己和客戶之間的管道。
技術背景
貢獻者應熟悉 FIDL 用戶端。但不必熟悉驅動程式或驅動程式庫架構。
如何提供協助
選擇工作
許可清單中的每一行都代表一項工作。這些工作可隨意挑選。
fuchsia.io/Node
和 fuchsia.device/Controller
各有一個許可清單。
執行工作
很抱歉,這類多重處理是隱含的,因此沒有好方法可以預先找出哪些程式碼會依賴這項功能。我們最好的工具就是從許可清單中移除一行,看看哪些內容會中斷。
尋找元件的最簡單方法,就是先確認 QEMU 是否能順利啟動。如果無法啟動,請檢查並修正任何錯誤。QEMU 啟動後,您可以透過 CQ 執行 CL,嘗試找出其他錯誤。
依賴多工處理的元件必須先能存取問題中的 devfs 路徑。搜尋 CML 檔案中的 dev
、dev-class
或 dev-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 通訊協定仍依賴多工處理。
贊助商
如有任何問題或想瞭解最新進度,請與我們聯絡: