FT2232Hの落とし穴
FT2232HのチャンネルAとBのMPSSEを同時に使おうとして嵌ったというお話。
環境
- 2.6.34.6-54.fc13.x86_64
- libftd2xx.0.4.16
- libftdi.1.17.0
本編
http://www.ftdichip.com/のチップはUSB<->シリアル変換によく使われますが、複数のチャンネルを同時に使う例はなかなか見当たりません。そこで初めはプロプライエタリなlibftd2xxを使って以下のようなコードを書いていました。
#include <ftd2xx.h> ... FT_HANDLE h0,h1; FT_OpenEx("Dual RS232-HS A",FT_OPEN_BY_DESCRIPTION,&h0); /* FT_SetBitMode(h0,...) */ FT_OpenEx("Dual RS232-HS B",FT_OPEN_BY_DESCRIPTION,&h1); /* FT_SetBitMode(h1,...) */
しかし、なぜか二回目のFT_OpenExの数ms後にSIGSEGVで落ちてしまう。これはFT_SetBitModeとFT_Openの順番を変えたり、プロセスを分割したりしても回避できませんでした。
そこでオープンソースなlibftdiに切り替えて、
struct ftdi_context fctx0,fctx1; ftdi_init(&fctx0); ftdi_usb_open(&fctx0,0x0403,0x6010); ftdi_set_interface(&fctx0,INTERFACE_A); // optional, since INTERFACE_A is chosen by default. ftdi_init(&fctx1); ftdi_set_usbdev(&fctx1,fctx0.usb_dev); ftdi_set_interface(&fctx1,INTERFACE_B);
とすると問題なく動作しました。これでやっと例のHMDが動かせます。