在一個項目中,我參與,我們有以下的硬件設置:兩個相互依賴的Linux內核模塊的結構?
Linux PC ------> "Router" +----> "Device A" | +----> "Device B"
的Linux PC是一個標準的X86 PC。
「路由器」是我們開發的一塊硬件,它連接到我們系統中的其他硬件。在這個例子中「設備A」。 「路由器」使用USB連接到Linux PC。
「設備A」和「設備B」是系統中的一些硬件。它們通過某個通信通道連接到「路由器」硬件(在這種情況下不重要)。
我的任務是爲「設備A」(及其後的其他設備)編寫Linux設備驅動程序。
我已經構建了一個通用的USB驅動程序,談到「路由器」,這工作正常。我的計劃是有一個看起來像這樣的驅動程序堆棧:
+----------+----------+ | dev_A.ko | dev_B.ko | +----------+----------+ | router.ko | +---------------------+ | Linux USB driver | +---------------------+
即:設備驅動程序使用而這又是建立在標準的Linux USB的「router.ko」內核模塊的硬件進行通信驅動核心。
我的問題是,對於Linux PC,只有一個物理設備:通過USB連接的「路由器」硬件,這意味着設備驅動程序成爲某種虛擬設備。
我可以將設備驅動程序和路由器設備驅動程序編譯成一個大的內核模塊,但它似乎不是最好的解決方案。另外,由於「設備A」先前已經直接連接到Linux PC,因此已經存在用於其的具有明確定義的用戶空間接口的驅動程序,該接口必須被保持,因爲已經有應用程序在生產中需要對話它。
我的問題或多或少地歸結爲:
鑑於上述情形的硬件,你將如何構建Linux內核模塊?
在USB中'router'是一個USB集線器。您可以讓您的路由器看起來像集線器,設備A和設備B看起來像連接到集線器的USB設備? –
或者,也許你想使用USB(不能想到名字)多功能接口。你知道,就像你有一個假裝在同一個設備上的CDROM和硬盤驅動器的USB密鑰一樣。 –
不,''router'可以由於各種原因而不能看起來像USB集線器。實際上,我甚至可能根本無法控制路由器硬件上的USB功能。它可以隨時被USB-to-serial芯片代替(將USB串口暴露給linux主機,串口暴露給'router'device)。 –