テクニカル ドキュメント #53



Doc ID: 53
製品: WinDriver
Version:  5.04 - 5.22

WinDriver (v5.04 - 5.22) を使用して USB デバイスをどのようにリセットしますか?

WinDriver には、USB デバイスをリセットする API があります: WD_UsbResetDevice() および WD_UsbResetDeviceEx() (WinDriver v5.04 で追加)。既存の設定を保存しながら、これらの関数を使用して、ハブ ドライバでデバイスを再初期化します。

WD_UsbResetDeviceEx() 関数 (v5.04 で追加) で、ソフト リセット (以前のバージョンで使用していた、WD_UsbResetDevice() 関数で実行したリセットと似ています) とハード リセットを識別できます。

WD_UsbResetDeviceEx() 関数を使用した、ソフト リセットとハード リセットの違いは、次のとおりです:
  • ソフト リセット: デバイスが無効状態になった時のみ、リセット要求を発行します (Microsoft のドライバによって実行時)。

  • ハード リセット: デバイスが無効または有効な状態に関わらず、常にリセット要求を発行します。
ハード リセット オプションを使用するには、WD_UsbResetDeviceEx() へ渡される WD_USB_RESET_DEVICE 構造体の dwOptions フィールドに WD_USB_HARD_RESET フラグを設定します。デフォルトでは、dwOptions フィールドに 0 に設定すると、関数は ソフト リセット を実行します - i.e. 例、現在、デバイスが無効な場合のみ、リセット要求を発行します。

次の例に従って、WD_UsbResetEx() 関数を使用して、ハード リセット を実行します:

    WD_USB_RESET_DEVICE reset;
    BZERO(resest);
    reset.hDevice = hDevice; //The handle received from
        // WD_UsbDeviceRegister()
    reset.dwOptions = WD_USB_HARD_RESET;
    WD_UsbResetDeviceEx(hWD, &reset);

注意: ハード リセットを実行する際にシステム クラッシュを防ぐには、次の内容を実行することを推奨します: WD_UsbResetDeviceEx() を呼出し後、すぐに、デバイスを登録解除し (WD_UsbDeviceUnregister() 関数を呼んで)、スキャンを行い (WD_UsbScanDevice() 関数を呼んで)、再び登録します (WD_UsbDeviceRegister() 関数を呼んで)。これで、Windows がデバイスのすべてのリソースを割り当て、後に起こる可能性のある競合を防ぎます。