カーネルソースコードにある既存の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_storage
USB大容量記憶装置は次のように表示されますか/dev/sd*
?これは、VHCI ユーザ空間ドライバや USB ガジェットカーネルドライバとは完全に独立しています。
これらのドライバを使用するには、エミュレートされたUSBデバイスをカーネルガジェットドライバとして提供するか、dummy_hdc
VHCIを介してユーザースペースドライバを提供して、物理USBバスにそのデバイスを物理USBデバイスとして提供する必要があります。
したがって、実際の質問が「最終的に実際のハードウェアでなければならない新しいUSBデバイスがあり、それについてLinuxカーネルドライバを作成したいのですが、最初にテストしたいのです」とすると、次のようになります。二つドライバー:1つは開発したいカーネルドライバー、もう1つはまだ存在していないデバイスをエミュレートする仮想コンパニオンです。カーネルスペース(ガジェットドライバ)またはユーザースペース(VHCI)でこれを行うことができます。