USB FX3がBulkInでハングアップする
ほとんどのPCでは大丈夫だけれども、特定のPCでは、EZ-USB FX3がBulkInでハングアップするという現象が起きてしまいます。
EZ-USB FX3からデータを入力するには、CyAPI.libを使って、
USBDevice->BulkInEndPt->XferData(data, len);
とやります。
このXferData()を実行して、ターゲットがデータを送ってこなければ指定したタイムアウトまで待待つはずです。しかし、一部のPCではターゲットがすぐにデータを返さないとFailしてしまうようなのです。
実際にFPGAからFX3に向かってデータを送信するまでの時間をマイクロ秒単位で変えていってみたところ、125μ秒を超えるとハングアップする可能性が出てくることがわかりました。
波形は上の波形で毎回同じでも、返すタイミングが伸びていくとダメなようです。
おそらく、XferData()を実行すると、INパケットが発行されるのでしょう。ここでFPGAがすぐにデータを返せばよいのですが、125μ秒を超えてしまってNAKが返った(EZ-USB FX3が「まだデータが用意できていない」ことを示した)場合は、一部のPCでは関数がFailしてしまうのだと思います。
デバイスドライバを最新のcyusb3.sys(2013年6月10日、16:13:38 V1.2.3.3)に置き換えてみても、結果は同じでした。
本来は、EZ-USB FX3がNAKを返しても、繰り返しリトライするべきだと思うのですが・・
で、CyAPIのライブラリの中を見てみると、このXferData()という関数は、中でBeginDataXfer()、WaitForXfer()、FinishDataXfer()を呼び出しているだけなので、自分でこれらの関数を呼び出してみたのですが、結果は同じでした。
BeginDataXfer()でINパケットを発行するらしいのですが、つまり、BeginDataXfer()の時点でFX3がデータを送信する準備できていないければダメなのです。だから、データが用意できるまで待たせることができません。
これはEZ-USB FX3にFPGAをつなぐ場合だけではなく、どうやらFX3のファームウェアでパケットを作って返す場合でも同じことが起こるようです。
なお、BeginDataXfer()では、DeviceIoControlでIOCTL_ADAPT_SEND_NON_EP0_DIRECTというリクエストを発行しているようです。
DeviceIoControl (hDevice, IOCTL_ADAPT_SEND_NON_EP0_DIRECT, pXmitBuf, iXmitBufSize, buf, bufLen, &dwReturnBytes, ov);
だから、これ以上の解析はドライバの中まで入ってみてみないといけないようです。
今のところ回避方法はみつかっていません。
- 問題が起きるPCではUSB2.0で接続する
- BulkIN転送では125μ秒以上、待たせないようにする
くらいの解決策しか見当たりません。
最近のコメント