none
USBホストコントローラのバッファをクリアしたい RRS feed

  • 質問

  • はじめて質問させていただきます。

    bear_graceと申します。

    よろしくお願いします。

    WDK 7600.16385.1 (KMDF1.9) の環境でUSBデバイスドライバの開発をおこなっています。

    動作環境は、Windows 7 x64です。

    USBドライバに

    (1) USBホスト側のバッファをクリアする、

    (2) USBデバイス側のバッファをクリアする

    という機能を実装しようと考えております。

    (2)はUSBデバイスに対し、ベンダーリクエストを送信し、デバイス側のバッファをクリアすることができました。

    「(1)のUSBホスト側のバッファをクリアする」ですが、WDFのどの関数で実装してよいかわかりません。

    過去にご経験されたことがある方、なにか気になる点、その他、ご意見などありましたら、是非とも教えていただけないでしょうか?

    よろしくお願い致します。

    • 移動 Mike Wang (MSCS) 2012年10月2日 13:00 (移動元:Windows デバイスドライバー開発)
    2012年7月12日 10:06

回答

  • 確認ですが、何らかの理由で osrusbfx2 などのサンプルにある ResetPipe の実装は使わずに、あるいはそれとは別にホスト側のバッファだけをクリアする方法が知りたいということでしょうか。

    だとすると上位のプロトコルやデバイス側の実装にも依存するので、具体的にはケースバイケースでの対応になるのではないかと思います。一番簡単やり易いのは、ご自身が開発するUSBドライバの中でバッファ1とバッファ2を作成・管理して管理することです。バッファ操作だけで行いますので、特にWDFの関数は使いません。しかし後述するように、バッファク・リアだけが目的で、このようなバッファ管理をドライバ内部に実装するには注意が必要です。

    クリアしたいバッファというのが、USBバスドライバやUSBホストコントローラドライバの内部のバッファということであれば、そのような操作をする手段は提供されていませんし、また(直接下位ドライバを呼び出す等して)使用するべきではありません。なぜならば、バスドライバやホストドライバとそれらが動作するデバイスやバスは単一ではないからです。一般的なドライバでは前述のResetPipe やResetDeviceだけで十分用が足りています。

    想像ですが、おそらく不要なデータをデバイス側とホスト側のアプリケーションに読ませたくないとかいう意図があるのでしょうが、それを実装した場合にはデータをドライバが削除することになりますので、このような機能をドライバで実装するのは十分な注意が必要です。

    例えば、決められたパターンのヘッダが出てくるまで読み飛ばしたいというような事例が考えられますが、そのような機能は(サービスはミドルウェアも含めた)アプリケーションで実装して、ドライバは単なる土管として動作させた方がデバッグが簡単になると同時に、システム全体は仕様変更への対応やトラブル発生時の調査がし易いという利点が多くあります。

    2012年7月17日 13:50
    モデレータ

すべての返信

  • 確認ですが、何らかの理由で osrusbfx2 などのサンプルにある ResetPipe の実装は使わずに、あるいはそれとは別にホスト側のバッファだけをクリアする方法が知りたいということでしょうか。

    だとすると上位のプロトコルやデバイス側の実装にも依存するので、具体的にはケースバイケースでの対応になるのではないかと思います。一番簡単やり易いのは、ご自身が開発するUSBドライバの中でバッファ1とバッファ2を作成・管理して管理することです。バッファ操作だけで行いますので、特にWDFの関数は使いません。しかし後述するように、バッファク・リアだけが目的で、このようなバッファ管理をドライバ内部に実装するには注意が必要です。

    クリアしたいバッファというのが、USBバスドライバやUSBホストコントローラドライバの内部のバッファということであれば、そのような操作をする手段は提供されていませんし、また(直接下位ドライバを呼び出す等して)使用するべきではありません。なぜならば、バスドライバやホストドライバとそれらが動作するデバイスやバスは単一ではないからです。一般的なドライバでは前述のResetPipe やResetDeviceだけで十分用が足りています。

    想像ですが、おそらく不要なデータをデバイス側とホスト側のアプリケーションに読ませたくないとかいう意図があるのでしょうが、それを実装した場合にはデータをドライバが削除することになりますので、このような機能をドライバで実装するのは十分な注意が必要です。

    例えば、決められたパターンのヘッダが出てくるまで読み飛ばしたいというような事例が考えられますが、そのような機能は(サービスはミドルウェアも含めた)アプリケーションで実装して、ドライバは単なる土管として動作させた方がデバッグが簡単になると同時に、システム全体は仕様変更への対応やトラブル発生時の調査がし易いという利点が多くあります。

    2012年7月17日 13:50
    モデレータ
  • Atom Hidaka 様

    返信が遅くなり大変申し訳ありませんでした。

    的確、丁寧、非常に参考になる回答をどうもありがとうございます。

    >確認ですが、何らかの理由で osrusbfx2 などのサンプルにある ResetPipe の実装は使わずに、

    >あるいはそれとは別にホスト側のバッファだけをクリアする方法が知りたいということでしょうか。

    後者のホスト側のバッファだけをクリアする方法があるのか知りたく質問させていただきました。

    >クリアしたいバッファというのが、USBバスドライバやUSBホストコントローラドライバの内部のバッファということであれば、

    >そのような操作をする手段は提供されていませんし、また(直接下位ドライバを呼び出す等して)使用するべきではありません。

    そうなのですね。

    手段が提供されていないのですね。

    >なぜならば、バスドライバやホストドライバとそれらが動作するデバイスやバスは単一ではないからです。

    ↑のような理由があるからUSBバスドライバやUSBホストコントローラドライバの内部のバッファをクリアする手段が提供されていないのですね。

    返信いただき、どうもありがとうございました。

    助かりました。

    また機会があったときはよろしくお願い致します。

    2012年8月10日 13:06