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が動かせます。