USB04 - コンポジットクラスドライバは Driver/InterfaceInitialize エントリポイント経由でロードされる
(1998 年 9 月 28 日)
Q: コンポジットクラス USB デバイスをサポートする USB クラスドライバを開発したのですが、このときクラスドライバが DriverInitialize と InterfaceInitialize 両方のエントリポイント経由で呼び出されるということに気づきました。これはどういうことなのですか。
A: これは、デバイスがシステム起動時に検出されるか、"ホットプラグ" されるかによって、Mac OS USB が USB コンポジットドライバをロードする方法が異なるという独特の状況です。
コンポジットクラスの記述を返す USB デバイスに対応した USB クラスドライバのデベロッパは、それらのクラスドライバが DriverInitialize または InterfaceInitialize いずれかのエントリポイント経由で呼び出されるという点に注意する必要があります。DriverDescription レコードの ProductID および VendorID フィールドをセットして、デバイスがデバイス構成文字列に返す値と一致させると、そのドライバの方が、Apple が提供するジェネリックなコンポジットドライバと比較して、より一致すると認識されると思うのは当然です。結局、ドライバの起動時のロードメカニズムとデバイスがホットプラグされたときのロードメカニズムが異なるということがわかります。
Apple では USB コンポジットクラスデバイスのサポートに使用するコンポジットクラスを用意しています。システムを起動するとき、USB ドライバの検出メカニズムは ROM 内のドライバから直接、一致するデバイスを検出します。この中にコンポジットドライバは含まれていますが、ベンダ固有のクラスドライバは含まれていません。コンポジットクラスデバイスが検出されると、“機能拡張”フォルダ内により一致するドライバが存在する場合でも、Apple のジェネリックコンポジットクラスドライバが使用されます。これにより、そのコンポジットドライバがロードされ、それに続いてベンダのクラスドライバが InterfaceInitialize プロシージャ経由で呼び出されます。
ホットプラグを行ったときの処理は以上のような起動時のケースとは対照的です。ホットプラグ時に同じドライバが用意されているとすると、USB は、デベロッパのクラスドライバの方がコンポジットクラスドライバよりも一致すると認識します (VendorID と ProductID による一致の度合いが高いため) 。この場合、デベロッパのクラスドライバは driverInitialize プロシージャ経由で呼び出されます。
なお、この問題はコンポジットクラスデバイスと、VendorID と ProductID の両方を指定するデベロッパクラスドライバの組み合わせでのみ発生します。これらの値のいずれかが DriverDescription レコードにないと、USB はデベロッパのクラスドライバをデバイス (インタフェースではなく) ドライバに一致させません。
これは、v1.0.1 より前の USB ですでに報告されている問題です。USB の将来のバージョンでは、デバイスが起動時に存在するか、ホットプラグされるかに関係なく、コンポジットクラスドライバに対応したドライバのロードはまったく同じメカニズムになる予定です。ただし差し当たりは、コンポジットデバイスに対応したクラスドライバは DeviceInitialize または InterfaceInitialize いずれかのエントリポイント経由で呼び出されると考えてください。これら 2 つのエントリポイントの間には次のような違いがあります。DriverInitialize 呼び出しの場合、ドライバは USBDeviceRequest 呼び出しを使って kUSBRqSetConfig リクエストを発行する必要があります。この呼び出しの例は、Mac OS USB DDK にあるコンポジットクラスドライバのサンプルコードに収められています。
なお、ドライバを interfaceDriver として呼び出すためには、kUSBDoNotMatchInterface が USBDriverLoadingOptions フィールドでセットされていないことを確認してください。
USB クラスドライバを一致させる方法の詳細については、Mac OS USB Developer Web ページからダウンロードできる USB TechNote を参照してください。
-- Rich Kubota
Worldwide Developer Technical Support
|