トップ回答者
Transaction Error から復帰について

質問
-
【環境】
Windows 7 Professional 32bit
CPU:Core i 5
チップセット:Intel HM55
【事象】
USB接続でタッチパネルを接続しているのですが、たまに動作が停止してしまう症状が発生します。
USBトレースログなどを使用して色々調べると、動画再生などCPUに負荷がかかったときに、
USB Host Controller上で、Interrupt 転送 (URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER) を実行中に、
Transaction Error (USBD_STATUS_XACT_ERROR) が発生しており、その後の通信が正常に行えない状況と
なっているようでした。
そこで、下記のサイトなどを参考に、Transaction Errorから復帰を試みる処理をデバイスドライバに追加しようとしています。
USB Transfer May Fail Due to Transaction Error
http://support.microsoft.com/kb/960958
USBパイプの操作
http://msdn.microsoft.com/ja-jp/library/ff553109(VS.85).aspx
この作業の中で別の問題が発生しました。
上記サイトを参考に、Transaction Errorが発生したことを検出した際に復帰処理として下記を実行するように処理を追加いたしました。
//Interruptのinパイプから同期データ受信
WdfUsbTargetPipeReadSynchronously
// エラー発生時はリセットを試みる
else if (status == STATUS_UNSUCCESSFUL)
//ターゲットを止める
WdfIoTargetStop(WdfUsbTargetDeviceGetIoTarget(devContext->UsbDevice), WdfIoTargetCancelSentIo);
//通信を止める
WdfUsbTargetPipeAbortSynchronously
//パイプリセットを行う
WdfUsbTargetPipeResetSynchronously
//ターゲットを再開する
WdfIoTargetStart
この処理を入れた状態で試すと、Transaction Errorが発生した後に上記の処理が実行されるのですが
WdfUsbTargetPipeAbortSynchronouslyを実行したまま止まってしまう現象が発生しました。
試しに、WdfUsbTargetPipeAbortSynchronously関数にタイムアウトを設けると、タイムアウト時間経過後に
戻ってきます。
しかし、タイムアウトを設けないと何も応答が無い状態で止まってしまいます。
なぜ止まってしまうかわかりますでしょうか?
上記の御社サイトには、タイムアウトに関する記述はありませんでしたが、
WdfUsbTargetPipeAbortSynchronously関数には、タイムアウトを設けるべきなのでしょうか?
また、適切なタイムアウト時間はあるのでしょうか?
参考になるサイトなど教えて頂けると助かります。
ちなみに該当部分のソースは下記になります。
// required arg check
status = WdfUsbTargetPipeAbortSynchronously(devContext->InterruptPipe, WDF_NO_HANDLE, NULL);
if (!NT_SUCCESS(status)) {
ErrLogL("WdfUsbTargetPipeAbortSynchronously error.[0x%X]", status);
goto end;
}
DbgLog("WdfUsbTargetPipeAbortSynchronously OK.");
if (!WdfRequestSend(Request, WdfUsbTargetDeviceGetIoTarget(devContext->UsbDevice), &RequestOptions)) {
ErrLogL("WdfRequestSend error. After the WdfUsbTargetPipeAbortSynchronously.");
goto end;
}- 移動 星 睦美 2012年10月5日 4:55 フォーラムのクローズ (移動元:Windows 7 ハードウェア)
回答
-
デバイス ドライバー開発上の問題なので、Windows クライアント開発の MSDN フォーラムに移動 (再質問) した方が良いかと思います。
http://social.msdn.microsoft.com/Forums/ja-JP/windowsgeneraldevelopmentissuesja/threads
hebikuzure
- 編集済み Hebikuzure aka Murachi AkiraMVP 2012年10月5日 9:44
- 回答としてマーク apt-get 2012年10月9日 9:53
すべての返信
-
デバイス ドライバー開発上の問題なので、Windows クライアント開発の MSDN フォーラムに移動 (再質問) した方が良いかと思います。
http://social.msdn.microsoft.com/Forums/ja-JP/windowsgeneraldevelopmentissuesja/threads
hebikuzure
- 編集済み Hebikuzure aka Murachi AkiraMVP 2012年10月5日 9:44
- 回答としてマーク apt-get 2012年10月9日 9:53