USBカーネルはドライバをLInuxカーネルの特定のHCIにどのように接続しますか?

USBカーネルはドライバをLInuxカーネルの特定のHCIにどのように接続しますか?

カーネルソースコードにある既存のvhci_hcdに基づいてVHCIドライバを作成しようとしています。私の最初のアイデアは、USBコアによってブリッジされたVHCIコードを使用するためのUSBドライバを書くことでした。

vhci_hcd 出口に基づいて VHCI ドライバーをロードし、「lsusb」出力から生成された仮想ハブを表示できます。デフォルトでは、deviceID/productID は USB コアによって生成されました。ただし、deviceID / productIDに基づくVHCIにUSBドライバを接続できません(IDが一致してもUSBドライバでプローブ()機能を実行することはできません)。

これが予想される動作かどうかを知っている人はいますか? USBドライバはVHCIではなく実際のHCIにのみ接続できますか?

答え1

予備の回答:

家庭を整理し、問題を明確にするために努力しましょう。

私はsysfsまたはioctlを介してVHCIと通信するユーザースペースプログラムの代わりにVHCIと通信するUSB​​ドライバを作成したいと思います。

「USBドライバ」とは、どういう意味ですか?特定のデバイス(USBカメラなど)用のカーネルドライバを実装しますか?これは「USB Gadget Driver」となり、カーネルにはすでにこれらのドライバがたくさんあるので、そのコードを見てください。ガジェットドライバをテストする場合は、必要であり、dummy_hdcカーネルガジェットドライバが表すすべてのデバイスを含む仮想ルートハブを作成します。

VHCIプロジェクトは、次のように特別に設計されています。ユーザースペース(仮想)デバイス用のUSBドライバ。 「sysfs または ioctl を介して通信するユーザー空間プログラム」を望まない場合、VHCI は間違った選択です。

私が理解したのは、VHCIは実際のハードウェアに接続されているOHCI / UHCIコードに似ています。

はい、ルートハブを提供します。これまでは似ています。

USBドライバはUSBコア、最終的にOHCI / UHCI、およびハードウェアと通信します。

あなたは私をここで失った。どの「USBドライバ」について話していますか?コンピュータとユーザーが(実際の)USBデバイスと対話できるようにするカーネルドライバを意味しますか?たとえば、usb_storageUSB大容量記憶装置は次のように表示されますか/dev/sd*?これは、VHCI ユーザ空間ドライバや USB ガジェットカーネルドライバとは完全に独立しています。

これらのドライバを使用するには、エミュレートされたUSBデバイスをカーネルガジェットドライバとして提供するか、dummy_hdcVHCIを介してユーザースペースドライバを提供して、物理USBバスにそのデバイスを物理USBデバイスとして提供する必要があります。

したがって、実際の質問が「最終的に実際のハードウェアでなければならない新しいUSBデバイスがあり、それについてLinuxカーネルドライバを作成したいのですが、最初にテストしたいのです」とすると、次のようになります。二つドライバー:1つは開発したいカーネルドライバー、もう1つはまだ存在していないデバイスをエミュレートする仮想コンパニオンです。カーネルスペース(ガジェットドライバ)またはユーザースペース(VHCI)でこれを行うことができます。

関連情報