« 14/10/04 ハゼ釣り | トップページ | 14/11/22 千葉エリア »

14/11/07 FTDI USB3.0互換性問題

好んでFTDIのICを使用するんだけど、ちょっとドハマリした事があったのでその時の覚書。

●現象
MPSSEモードでFT2232Hを制御するためlibMPSSE.dllを使うが、SPI_GetNumChannels()でチャネル数が取得できない、SPI_GetChannelInfo()でデバイスの情報が取得できない、SPI_OpenChannel()でオープンできない等、正常動作しなかった。
ちなみにFT232Hは問題なし。
動作環境はWindows7 Professional (64bit)。

試しにlibMPSSE.dllのAPIは使用せず、FTD2XX.dllのAPIであるFT_GetDeviceInfoList()を実行。
すると接続しているデバイスの情報を取得できたが、「Location ID」が"0"になっていた。
(0x00000331といった値になるハズ)

01_log
<図01>FT_GetDeviceInfoList()の取得結果

●解析
この「Location ID」が"0"になる現象について調べるとFTDI社による見解が公開されており(下記リンク先参照)、簡単に言うとWindows8以前のOSでUSB3.0のルートハブ系統に接続すると予期しない動作となるとの事で、本現象はTN152の「2.1.2 Location ID Retuned As 0」に該当する。

FTDIとしては、これはUSBホストベンダによる問題であり、USBデバイスの製造者が解決する問題ではない、として対策はしない方針のようです。
言い分も分かるけど、ちょっと困りますね。

・FTDI テクニカルノート「TN_152 USB3.0 Compatibility Issues Explained」
http://www.ftdichip.com/Support/Documents/TechnicalNotes/TN_152_USB_3.0_Compatibility_Issues_Explained.pdf

・TN_152のヒューマンデータによる和訳
http://www.hdl.co.jp/USB/FTDI/lt2/index.html

公開されているlibMPSSE.dllのソースコードから、SPI_GetNumChannels()でチャネル数が取得できない原因を調べていくと、ftdi_mid.cにてLocation IDを参照している箇所あり。
上記問題から、正しくチャネル数が検出できなかったようです。
ちなみにFT232Hの場合はLocation IDを参照していないため、初めから問題なかったようです。

02_source
<図02>「ftdi_mid.c」の該当箇所

●対策
FTDI テクニカルノートTN_152では、
・USB2.0のポートに接続する。
・Windows8以降のOSを使用する。
としているが、まだまだWindows7環境が多い事と、USBポートを限定させるのも使い勝手が悪いのでlibMPSSE.dllを修正してみました。
添付しますのでお使い下さい。
「libMPSSE.dll.zip」をダウンロード

<図02>の該当箇所を仮修正(if文をコメントアウト)しMinGWでコンパイル。
生成されたlibMPSSE.dllで動作検証を行い、SPI_GetNumChannels()でのチャネル数取得、SPI_GetChannelInfo()やSPI_OpenChannel()等で期待通りの動作をする事と、実際のデバイスからも信号出力される事を確認しました。

03_a0xaa
<図03>Ach SPI_DATA = 0xAA時の波形

04_a0x55
<図04>Ach SPI_DATA = 0x55時の波形

05_agpio
<図05>Ach GPIO(H→L→H)時の波形

Bch側も同様に動作しているので波形は省略。

●考察
今回行った仮修正の妥当性について。
修正対象となったftdi_mid.cのMid_CheckMPSSEAvailable()は、対象デバイスの中から利用可能なMPSSE数を取得する関数で(表1参照)。
FT232HやFT2232Hに関しては総チャネル数に対して利用可能なMPSSE数が同数のため、今回行ったコメントアウトによる修正でも問題ないと思います。
しかしFT2232D(またはC、L)やFT4232Hのように総チャネル数に対してMPSSE数が異なるデバイスを使用する際は別の対策を行う必要がありそうです。

                                                                                     
<表1>総チャネル数とMPSSE数
デバイス 総チャネル数 MPSSE数
FT232H 1 1
FT2232D/C/L 2 1
FT2232H 2 2
FT4232H 4 2

|

« 14/10/04 ハゼ釣り | トップページ | 14/11/22 千葉エリア »

電子工作」カテゴリの記事

プログラミング」カテゴリの記事

コメント

libusb-1.0+libftdiの組み合わせでUSB3.0問題に遭遇しましたが
FTDI純正のドライバでも同じようなこと起こるんです江

投稿: | 2015年4月 9日 (木) 17時25分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/222376/60806062

この記事へのトラックバック一覧です: 14/11/07 FTDI USB3.0互換性問題:

« 14/10/04 ハゼ釣り | トップページ | 14/11/22 千葉エリア »