FTD2XXについて

お約束ですが、このページのいかなる記載においても著者は一切の責任をおいません。
(I love Scotland things)

このページは Future Technology Devices International Limited(FTDI) という会社のUSBチップについてのメモです。主にMacOS Xでの利用についての内容になります。

FTDIのチップのMacOS Xで使えるドライバーは以下のようなものがありました。
最初にTTLレベルのRS232Cのモジュールが必要だったので、秋月のFT232Rのモジュール を購入した。その後にJTAGに使えるMPSSEモードがあるFT2232Dのモジュールも購入した。。。

MacでFTのD2XXライブラリのサンプルコードをライブラリをローカルディレクトリに 置いてビルドするMakefileは以下のような感じ。(D2XX/Samples/EEPROM/read)
read: main.c
        cp ../../../bin/10.4-10.5/libftd2xx.0.1.7.dylib libftd2xx.dylib
        install_name_tool -id @executable_path/libftd2xx.dylib libftd2xx.dylib
        gcc -o read main.c -L. -lftd2xx 
買ってから気がついたのだが秋月の2232モジュールには落とし穴がある。2232の JTAGで使う時のMPSSEモードはEEPROMに設定して使用する。ところが秋月の2232の モジュールにはEEPROMがのっていない。IC2が未実装になっていてここに93C46のよ うなEEPROMを実装しないとMPSSEでは使えない。。。このIC2は表面実装のチップな のだが秋月では表面実装できる93C46同等品が販売されていない。FT232Rの方は内部 にEEPROMが入っているのだが、FT2232Dには入っていないってものなんか不思議だ。。。

マルツで93C66を買ってきて(秋葉店で店員さんと棚を見ていてなかなか見つからず 結局入り口付近のマイコンコーナーにあったのだが品切れで2号店で入手) IC2に付けてみた。 SOICなチップの実装は初めてなのでかなり怪しいハンダ付けだ。 とりあえずサンプルコードのreadを実行しらたらエラーになってしまった。 ハンダ付けを確認したが大丈夫そうなので、eraceを実行したところこちらはエラー にならない。このあともう一度readを試したが、相変わらずエラーになる。 結局writeを実行した後にreadを実行しらた正常に動いた。 (後日追記:93C66はHardOffで108円で入手できるPCMCIAなLANカードに付いている事が あるのでそれを再利用した方が安上がりかもしれません)

FTのチップのEEPROMの処理はWindows環境には FT_Prog(旧MProg) というツールがあるのだが、Macにはないのでサンプルプログラムを使っている。 writeを試してread出来るようになったのだが、そもそもwriteコマンドはデフォルの 値を書くだけなので、ちゃんとしたコードを書かないと駄目だと思う。デフォルトの USBのコンフィグレーションとwriteで書いて読み出した内容を置いておく。 (デフォルトのUSBコンフィグレーション, writeで書き込み後のコンフィグレーション, writeで書き込み後のreadの結果)

FTのちょっとこまったところは完全なデータシートを公開していない事だ。また D2XXのドライバについてはソースすら公開されていない。UARTな方はLinuxのソース やBSDのソースがあるのでどうにかなるがD2XXのドライバーは何をやっているのかよ くわからない。libFTDIの方がオープンソースなのでこれを解析すれば良いと思われ る。

D2XXとlibFTDIのMSPEE比較のページ

D2XXのライブラリを/usr/localにコピーせずに openocdをビルドする方法か以下のよ うな感じ。まずヘッダーとライブラリのファイルをopenocdにコピーしてsrcの下に ライブラリのシンボリックリンクを作る。
sh-3.2$ ls -l ftd2xx.h WinTypes.h libftd2xx.dylib src/libftd2xx.dylib 
-rwxr-xr-x@ 1 himori  staff    2230 Apr  4 13:43 WinTypes.h
-rwxr-xr-x@ 1 himori  staff   23433 Apr  4 13:48 ftd2xx.h
-rwxr-xr-x@ 1 himori  staff  212916 Apr  4 14:08 libftd2xx.dylib
lrwxr-xr-x  1 himori  staff      18 Apr  4 14:10 src/libftd2xx.dylib -> ../libft
d2xx.dylib
libftd2xx.dylibは上のMakefileのサンプルのようにinstall_name_toolでパスを書き 換えておく。 configure.inの以下をコメントアウトとパスを書き換える。
#   if test ! -f /usr/local/include/ftd2xx.h ; then
#      AC_MSG_ERROR([ftd2xx library from FTDICHIP.com seems to be missing, can
not find: /usr/local/include/ftd2xx.h])
#   fi

#   CFLAGS="$CFLAGS -I/usr/local/include"
#   LDFLAGS="$LDFLAGS -L/usr/local/lib"
    CFLAGS="$CFLAGS -I/Your path/openocd-0.4.0"
    LDFLAGS="$LDFLAGS -L."
修正内容を反映するためautoconfを実行してconfigureを実行。
sh-3.2$ autoconf
sh-3.2$ ./configure -enable-ft2232_ftd2xx
これでmakeすればopenocdと同じディレクトリにlibftd2xx.dylibがあれば実行できる バイナリの出来上がり。
sh-3.2$ cd src
sh-3.2$ ./openocd --version
Open On-Chip Debugger 0.4.0 (2010-04-04-14:10)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.berlios.de/doc/doxygen/bugs.html
openocdはビルドできたが、動かないのでD2XXのライブラリの中身をいろいろ 確認してみる。。。

openocdでFT2232Dを使う場合はD2XXライブラリを使った場合は FT_SetBitMode でMPSSEモードを設定しているようだ。 いろいろ調べたところMPSSEモード自体はEEPROMとは関係ないようだ。 ただし環境によってはVCPのドライバとリソースの競合を起こす可能性があるので EEPROMでFIFOモードにしているのかもしれない。MacOSの場合はkextをロードして なければリソースの競合はないので、EEPROMは不必要なのかもしれない。

間違った情報が流れている一つの理由は秋月のマニュアルに 「オプション機能を使うには94C46を実装してデータを設定します。」と 記載がある事も原因なっているように思う。

市販されているFT2232ベースのJTAGアダプターの完全なクローンとしてアプリ側に 見せるにはEEPROMに書き込みを行いProduct Stringなどをいじる必要があるのかも しれないが、openocdでは設定で変更できるので必要はないと思う。

D2XXライブラリを使ってテストプログラムを書いてFT_SetBitMode()でMPSSE(2)を試し てみたのだがまったく動かない。行き詰まったのでAsynchronous Bit Bang Mode(1) も試してみた。AのIOを1Kの抵抗と発光ダイオードでグランドに落として、 試してみたところモジュール接続後一回は正常に動くのだが 二回目にテストプログラムを起動すると、Bus error落ちる。 FT_Open/FT_Closeの間にFT_Writeを二度以上呼ぶと落ちるようだ。 一度しか呼ばなければ落ちない。 使っているD2XXライブラリのバージョンは0.1.7でMacOS Xは10.5.8でMacBook Air で試してる。 不思議なのは落ちた時のIOの状態がUSBから一旦外して付け直しても保持されている。。。

FT2232の情報はインターネット上にたくさんあるが、かなり錯綜している感じがある。 FTDI社のチップの仕様やドライバのクオリティーおよび情報の出し方に問題があるの ではないだろうか。 これだけ情報があるという事は必要とされている製品なんだと思うのだが。

情報が混沌としているのは、もう一つの理由はハードが分かる人とソフトが分かる 人に大きな溝がある事が原因ではないかと思ったりする。溝はコンピュータ業界で はこれだけではなく、サーバが分かる人とクライアントが分かる人などいろいろな ところに存在するように思う。私は一点を追求するタイプではなく広く浅くな人な ので溝がない分知識が浅いのかもしれないが。

もう一つの理由はそもそもJTAGのようなネタはお仕事となることが多く私のように まったくの趣味というケースは少なく、あまり多くの情報は出せない環境の方が多 いからかもしれない。とはいえ日本語のJTAGの情報はかなりいろいろあり助かって いる。

やっとMPSSEの動作が オシロスコープで確認できた。MPSSEの仕様で変と思うのはデータ書き 出しのサイズが1の場合は0を指定する事だ。(オシロの使い方の理解がまだ怪しくて なんかおかしいと思ったら2chが10Xになっていた)6MHzだと1クロック167nsになる。

NewFile4
  ftStatus = FT_Open(0, &ftHandle);
  ftStatus = FT_SetBitMode(ftHandle, 0xFB, 0x02);

  buffCount = 0;
  outBuffer[buffCount++] = 0x86;  // Set TCK/SK Divisor
  outBuffer[buffCount++] = 0x00;
  outBuffer[buffCount++] = 0x00;

  outBuffer[buffCount++] = 0x80; // Set Data Bits Low Bytes
  outBuffer[buffCount++] = 0x08; // Value
  outBuffer[buffCount++] = 0x0B; // Direction 1:OUT, 0:IN
  ftStatus = FT_Write(ftHandle, outBuffer, buffCount, &dwBytesInQueue);

  buffCount = 0;
  // Clock Data Bytes Out on -ve Clock Edge MSB First (no Read)
  outBuffer[buffCount++] = 0x11;
  outBuffer[buffCount++] = 0x00; // LengthL
  outBuffer[buffCount++] = 0x00; // LengthH
  outBuffer[buffCount++] = 0xAA; // Byte1
  ftStatus = FT_Write(ftHandle, outBuffer, buffCount, &dwBytesInQueue);
0x11コマンドで連続して送るとだいたい1クロック分がバイト間に間に入るようだ。 一回のFT_Writeで複数のコマンドを送るとコマンド間で5クロック程度の空きが入る。 FT_Writeを複数呼び出すとこれは800us程度(4790クロック分)空きが入る。

NewFile8 NewFile9 NewFile10
  for(loopCount = 0; loopCount < 1024; ++loopCount) {
    buffCount = 0;
    // Clock Data Bits In and Out LSB First 
    outBuffer[buffCount++] = 0x3A;
    outBuffer[buffCount++] = 0x00; // Length
    outBuffer[buffCount++] = 0xFF; // Byte1
    ftStatus = FT_Write(ftHandle, outBuffer, buffCount, &dwBytesInQueue);
    if(ftStatus != FT_OK) {
      printf("Failed to FT_Write\n");
    }
    do {
      ftStatus = FT_GetQueueStatus(ftHandle, &dwRxBytes);
      if(ftStatus != FT_OK) {
        printf("FT_GetQueueStatus\n");
      }
    } while(dwRxBytes == 0);
    ftStatus = FT_Read(ftHandle, pbyRxBuffer, dwRxSize, &dwBytesReturned);
    if(ftStatus != FT_OK) {
      printf("Failed to FT_Read\n");
    }
  }
上記のようなビット単位のオペレーションはとっても遅い。上の実行に19秒も かかってしまう。

秋月のFT2232Dのモジュールで3.3VでJTAGを行いたい場合は、JP2Aのジャンパーを 外して外部から3.3Vを供給しなければならない。

手元にあって使っていなかったWN-G54/R3でJTAGを試されたKatsuya Iidaさんの ページがみつかった。 ここにあったサンプルコードをパラレルからFT/DXX用に 書き換えて試したところIMPCDOEが40404000となったので ちゃんと使えるようになったと思われる。

パラレルとUSBモジュールではレガシーなパラレルの方が遅いように思われるだが、 JTAGなどのクロックベースのシリアルインターフェースではパラレルの方が断然早 いようだ。ただMacではパラレルのインターフェースがある機種は存在しないので USBモジュールで効率を上げるしか手はない。

FT2232のBitModeを使っているが、普通のUSBのパラレルインターフェースではJTAG はできないようだ。

FT_SetLatencyTimerを設定すると転送速度が変わる。最低値が2なのだがあまり小 さくするとライブラリの中のコードで"Trace/BPT trap"と表示されで止まる。 上記の1024回のループは2では4秒くらいで10を設定すると12秒くらいだ。ただ2だ とかなりの確率で"Trace/BPT trap"が発生する。

IMPCDOEが40404000とならなければならないところが10204000とか202040000とかに なってしまう。なんかビットずれしているように見える。オシロのプローブを つなぐと安定するので、とりあえず1KΩ(茶,黒,赤)をTDOに入れたら改善したように 思われる。

WN-G54/R3とFT2232Dモジュールの接続はWNのシリアルのピンからGNDとVCC(3.3V)をとり FTのGNDとVCCIOAにつなぐ。FTのJP2Aは外しておく。 TRST_Nは100ΩでVCCにつなぐ。AD0,AD1,AD2,AD3をTCK/TDI/TDO/TMSにつなぐ。 TDOには1KΩを入れた。TRST_N以外の接続方法のサンプルは以下のようになります。

名称ピン番号 JTAGMIPS-EJTAG
AD040 TCK9
AD139 TDI3
AD238 TDO5
AD337 TMS7
VCCIOA18 VREF14
GND25 GND2

私の環境ではLatencyTimerは15くらいで安定する。

本来のターゲットのJTAG探しが進展がないので、とりあえずてんげなドライバに 2232のサポートを入れてみた。といってもInfo.plistにエントリーを追加しただけ なのだが。2232は二つインターフェースがあり一つ目はJTAGのサポートがあるの で二つ目のインターフェースを使おうとFindNextInterface()で二つ目を探したが エラーなどは発生しないがデータの受信ができない。

Iidaさんのページにあった、PrAccのサンプルコードもFT用に修正してsvnに入れて おいた。この修正ではビット単位とir/drをまとめてFT_Writeするコードが入 っている。ビット単位でFT_Writeした場合PRIdの取得に40.15秒かかっていたがまと めてFT_Writeした場合には0.94秒で処理できる。ビット単位で処理する場合LatencyTimer を大きくしないとエラーになったり止まったりする。まとめて処理する場合は LatencyTimerをかなり小さくしてもエラーが起きにくいようだ。またirは読み込み が必要ないのでno Read(0x1A)で処理している。一度の1Aで複数ビット送ると正常に動 かず0x1Aで1ビットずつ積んでFT_Writeしている。

WRT54G/GS EJTAG Debrick UtilityもFT用の修正をいれてsvnにつっこんでおいた。 手元にWRTがないので完全な確認はできていないが、多分動くのではないかと思う。 Debrickってなにかとおもったら、フラッシュを飛ばしたジャンクをアメリカでは 煉瓦と言うようで、煉瓦から元に戻す事をDebrickと言っているようだ。

手元にあった、BUFFALOのWLI3-TX1-G54を分解して12PinのJTAGおぼしきところ 接続して wrt54gコマンドを動かしたら正常に動いた。

ピン番号JTAG電源ON ピン番号JTAG電源ON
1?H 2GNDL
3TDIH 4GNDL
5TDOH 6GNDL
7TMSH 8GNDL
9TCKH 10GNDL
11?H 12NC

$ ./wrt54g -probeonly

====================================
WRT54G/GS EJTAG Debrick Utility v4.8
====================================

Probing bus ... Done

Instruction Length set to 8

CPU Chip ID: 00010100011100010010000101111111 (1471217F)
*** Found a Broadcom BCM4712 Rev 1 CPU chip ***

    - EJTAG IMPCODE ....... : 00000000100000000000100100000100 (00800904)
    - EJTAG Version ....... : 1 or 2.0
    - EJTAG DMA Support ... : Yes

Issuing Processor / Peripheral Reset ... Done
Enabling Memory Writes ... Done
Halting Processor ...  ... Done
Clearing Watchdog ... Done

Probing Flash at (Flash Window: 0x1fc00000) ... Done

Flash Vendor ID: 00000000000000000000000010001001 (00000089)
Flash Device ID: 00000000000000000000000000010110 (00000016)
*** Found a Intel 28F320J3 2Mx16       (4MB) Flash Chip ***

    - Flash Chip Window Start .... : 1fc00000
    - Flash Chip Window Length ... : 00400000
    - Selected Area Start ........ : 00000000
    - Selected Area Length ....... : 00000000



 *** REQUESTED OPERATION IS COMPLETE ***
ところが、これはぬか喜びになり、backupは途中では"Trace/BPT"や"Bus Error"で 落ちたり途中で止まって使えない。。。 Latencyを大きくすればエラーになりにくいが、現実的に使えるスピードではない。。。

Latencyを大きくしていろいろusleepを入れたところ1Kをエラー無しでダンプでき るようになったが1Kに2分もかかる。4Mだと8192分となり5.6日かかる。。。

Macのライブラリなのでこんなに不安定なのだろうか。メーカーに聞くと/usr/local にインストールしていないからではないかとかまったく的外れな回答が帰ってきそ うだ。libFTDIで書き換えると良くなるのだろうか。。。

FT2232ピン番号SPIピン番号
AD040Serial Clock6
AD139Serial Data Input5
AD238Serial Data Output2
AD337Chip Select 1

MPSSEモードではないが赤外線リモコンをFTのBit Bangモードで作っている ページをみつけたので試しに ブレッドボードで作ってみて、 サンプルプログラムを書いてみた。 38Kのキャリアを作るためのFT_SetBaudRateのパラメータがまったくわからず適当に 設定してオシロで確認して値を設定した。オリジナルはlibFTDIで作っているようだが、 こちらは純正のD2XXを使っている。 汎用リモコンソフトは アルマジロで作ってみた。

RIMG0002 Copy_2 Copy_1

MCU Host Bus Emulationでは8255などの懐かしいチップがつなげるようだ。手元の8255 調べたら、NEC D8255AC-2,D71055Cと三菱のM5L8255AP-5に三つもあったので時間がで きたら試してみたい。

ヤフオクで入手した機材がすべてGPIB対応の機種であったので、GPIBを試してみたと 思って考えていたのだが昔のコントローラチップを2232のMPUモードでコントロール する方法と、GPIBの16本の信号線を2232で直接制御する方法が考えついた。 前者はμPD7210,8291A,TMS9914などがあるようだがすでにディスコンになっているも のがほとんどで、入手が難しいようだ。 後者は祖師谷ハムエンジニアリングさんが同じ事考えて2007年以前に基板を 起こされていた。後日追記:祖師谷ハムエンジニアリングさんではFTベースの GPIBモジュールはディスコンにされたそうです。

PICを使ってシリアル/GPIB変換を行う記事がトランジスター技術の2005年2月にあっ たようです。PICのライターも持っていないので、2232だけでコントロールできると よいのだが。。。

GPIBのハンドシェークを実現するためにはFT_GetBitMode(),FT_Write()を繰り返す 方法が適当なのではないかと思われる。 ここここが 参考になった。

FT_SetBitModeで入力出力を設定しているので、GPIBで利用する場合はデータバスは 切り替えて使わなければならないのかもしれない。

ストロベリーリナックスの2232Hのモジュールを購入してみた。

D2XXなドライバーはいつの間にか1.0.4というバージョンが出ていた。いままで使っ ていたバージョンは0.1.7だった。0.1.7は10.3からのサポートだったが1.0.4は10.4 以降のサポートになっている。(2011/06/28)

FTのJTAGネタはNikonのPD-10というWIFIモジュールのジャンクが手に入って、分解 して調べたところLinux-MIPSが入っている事がわかったので、いじってモバイルWIFI にでも出来ないかと思って調べ始めた。三つ買ったジャンクの一つを壊してしまった ので、いったんあきらめたのだが引き続き試してみようかと思う。

2232Hでwrt54gコマンドを試したら動かなかったので、Rev 185で一部のコードを元 に戻してある。なんでおかしくなったのはかぼちぼち調べたい。ストロベリー リナックスの2232Hのモジュールは3.3Vなので、3.3Vなターゲットに直接つなげて 便利だ。

名称ピン番号 JTAGWLI3-TX1-G54
AD03 TCK9
AD14 TDI3
AD25 TDO5
AD36 TMS7
GND39,40 GND2

わけあってarduinoを始めた。 手元にFTなモジュールは売るほどあるので、シリアル インターフェースの「Arduino Pro Mini 328 5V 16MHz」 と「Arduino Pro 328ー3.3V/8MHz」を購入してみた。 3.3Vの方はストロベリーリナックスのモジュールで、5Vの方は秋月のモジュールで 接続している。

arduinoはAVRというワンチップマイコンににブートローダーを焼いたものだと今更 理解した。このブートローダーの焼き込みにFTのチップが使えるようだ。AVRにはJTAG のインターフェースがあるようだ。

arduinoのブートはFTでも焼けるがいろいろ用意しなければならないので、一つarduino を買ってarduinoから焼けば 標準のIDEだけで済むのでらくだ。

BELKINのシリアルアダプタもarduinoで使えるATMEGAでは ないがAVRだったことに今更気がついた。

上の事を調べていてやっと気がついたのだがFTのJTAGネタはBitBangとMPSSEの両方で できるようだ。FTのページではJTAGにはMPSSEをフューチャーしていることも混乱の 要因の気がする。

FTDIにMacのVCPのドライバーがData.RIsD2XXのチェックをしていないとメールしたら Windowsのドライバーでしか有効でないと返事が来た。赤外線のモジュールとして 使っているFTのデバイスはVCPで見えてほしくないので、サポートしてほしいのだが。 という事なので、EEPROMはMacでは意味がなかった訳だ。。。


FT2232Lを秋月で買ってきて、5Vと3.3Vが切り替えが出来るようにレギュレータ付けて モジュールを作ってみた。秋月の2232Dのモジュールも切り替えは出来るが3.3Vは 外部電源になるので、接続が面倒なケースもあるので作った。2232シリーズは C(鉛フリーがL)が最初でDが後でHがその後に発売されたようだ。

秋月で2011/11/11に232Hのモジュールが発売されていたので、購入してみた。USBに つないでUSB Proberで確認したところ認識されず、不良品かと思ったのだが、ホーム ページの説明書を見たところ、電源ラインを接続しないとダメだった。ちゃんと つないだところ正常に認識された。後日追記:現在販売されているモジュールは ジャンパーピンが付いているようだ。買ってきてそのままでは動作しないのは さすがにクレームが多かったのかもしれない。

スクリーンショット(2011-12-04 10.18.31) IMGP0308
GPIBを試しているのだが、Mac OS X libftd2xx.1.0.4でFT_GetBitModeすると FT_IO_ERROR(4)になっていた。1.1.0では大丈夫のようだ。どうにもこうにも FTははまりどころが多い。^ ^;

FTのデバイスは山ほどあるので、アルマジロで利用するデバイスを選択できるように したのだが、FT_ListDevicesは第三引数の値でリストのサイズが第一引数か 第二引数に返るかが変わる。あまり普通は見かけない仕様だ。。。

IMGP0463

ArduinoでGPIBを試された方がいて、それをお手本にFT2232DでGPIBを実装してみた。 ソースは ここ(ftgpib.c)に突っ込んでみた。

ストロベリー・リナックスで購入したLCDもどきのELモジュール制御(SEL10016G)のため に245のBitBangを試してみた。このモジュールはHD44780というキャラクターLCDを拡張 したもので、使えそうなコードをネットで検索したところ Lars Englundさんが書いたBitBangのコードが見つかり、Mac OS Xで makeでコンパイルできるようにして、グラフィックモードのソースを追加してみた。 グラフィックモードでは1バイトごとにBitBangするのはあまりに遅いため バッファリングしてまとめて送るようにしてみた。おかげでスクロールさせても かなりきれいに見えます。 ソースはここにおきました。

HD44780_FT245R IMGP1179

上記の回路図でストロベリー・リナックスの モジュールは1番ピンと2番ピンが逆です。 上記の回路をFT232RLで試したところ、ChipIDは動作するにも関わらず、Graphと Kanjiは全く動作しないどころか、焦げ臭い匂いがしてきました。245に戻したところ なにも問題なく動くいたのですが。。。

UrJTAGをローカルにdylibに置いてビルドする方法。 UrJTAGのディレクトリにライブラリとヘッダーをコピーしてconfigureとmakeを 実行します。秋月で取り扱っているMACHXO2の評価ボード認識してみました。
$ cp ../FT_D2XX_Lib.1.2.2/D2XX/bin/10.5-10.7/libftd2xx.1.2.2.dylib libftd2xx.dylib
$ cp ../FT_D2XX_Lib.1.2.2/D2XX/bin/*h .
$ install_name_tool -id @executable_path/libftd2xx.dylib libftd2xx.dylib
$ cd src
$ ln -s ../libftd2xx.dylib .
$ cd ..
$ ./configure LDFLAGS=-L. CFLAGS=-I.
$ make
$ cd src
$ ./jtag
jtag> cable ft2232
Connected to libftd2xx driver.
jtag> detect
IR length: 8
Chain length: 1
Device Id: 00000001001010110010000001000011 (0x00000000012B2043)
Cannot open /usr/local/share/urjtag/MANUFACTURERS
  Unknown manufacturer!
chain.c(149) Part 0 without active instruction
chain.c(200) Part 0 without active instruction
chain.c(149) Part 0 without active instruction
jtag> 
configureの--datarootdirでurjtagディレクトリがあるディレクトリを設定すると、 MANUFACTURERSファイルが読み込まれます。デフォルト値は/usr/local/shareです。
jtag> detect
IR length: 8
Chain length: 1
Device Id: 00000001001010110010000001000011 (0x00000000012B2043)
  Manufacturer: Lattice Semiconductors
  Unknown part!

D2XXのSamples/EEPROM/readでEEPROMを見てみました。
bash-3.2$ ./read 
Library version = 0x10202
Opening port 0
FT_Open succeeded.  Handle is 0x100827a00
FT_GetDeviceInfo succeeded.  Device is type 6.
FT_EE_Read succeeded.

Signature1 = 0
Signature2 = -1
Version = 3
VendorId = 0x0403
ProductId = 0x6010
Manufacturer = Lattice
ManufacturerId = 
Description = Lattice FTUSB Interface Cable
SerialNumber = 
MaxPower = 500
PnP = 1
SelfPowered = 0
RemoteWakeup = 0
Returning 0

シャープの16×2のLCDが入手できたので、再びLCD関係を調べてみたところ 『昼夜逆転』工作室さん とELMさんが 参考になりそうだった。

Signal D0D1D2D3 D4D5D6D7
FT232RL/FT245RL 15311 29106
名称 TXDRXDRTS#CTS# DTR#DSR#DCD#RI#
秋月モジュール 15310 2896
HD44780 Pin 11121314 546-
HD44780 Name DB4DB5DB6DB7 R/WRSE-

秋月電子でFT231Xの取り扱いが始まっていたので、購入してピッチ変換基板 にハンダ付けして試してみた。(2013/06/20)

IMGP2095

今更なのだが、avrdudeとserjtag04eを「なんでも作っちゃう、かも。」さんの ページを参考に ftdiのライブラリを実行ファイルと同じフォルダに置いてビルドする方法。 なぜ、/usr/local/にコピーする事を嫌っているかというと、コピーしてないMacでは 動かなくなりポータビリティーがなくなることと、Mac OS Xではユーザアカウントで USBを使えるのに/usr/localへのコピーは管理者権限が必要なためだったりします。
MacでAVRを使う場合は一つArduinoを買って、ArduinoをISPにしてUSBTINYを作って 使うと、ArduinoのIDEに入っている純正のavrdudeが使えるので便利だと思ったので、 これまで試していませんでした。
$ cp ../FT_D2XX_Lib.1.2.2/D2XX/bin/10.5-10.7/libftd2xx.1.2.2.dylib libftd2xx.dylib
$ cp ../FT_D2XX_Lib.1.2.2/D2XX/bin/*h .
$ install_name_tool -id @executable_path/libftd2xx.dylib libftd2xx.dylib
$ ./configure CFLAGS=-DSUPPORT_FT245R LIBS=-lftd2xx LDFLAGS=-L. CFLAGS=-I.
$ make

ModelVendorIDProductIDVersion SpeedBitBangMPSSE
FT245AM0x04030x60010x0200 Full
FT2232L0x04030x60100x0500 Full
FT2232D0x04030x60100x0500 Full
FT232RL0x04030x60010x0600 Full
FT245RL0x04030x60010x0600 Full
FT2232HL0x04030x60100x0700 High
FT232H0x04030x60140x0900 High
FT231X0x04030x60150x1000 Full

立川にあるP社系のS社の放出品がハードオフに流れていてFT245AMを使った西常盤商行の モジュールをジャンクで入手したのだが、FT_D2XX_LibのSamples/EEPROM/eraseを実行 したら0.1.7, 1.0.4, 1.1.0では問題なかったのだが1.2.2ではエラーになっていた。。。

ハムフェアで祖師谷ハムエンジニアの方と話す事ができて、GPIBの評価ボードを分けて もらった。

IMGP2378

ながらく放置してあった、さるのこしかけをこれに 合わせて修正してみた。

Make Faireで@morecat_labさんから FT231Xの基板を分けてもらった。変換基板で作るとかなり大きくなるのでちょっと 嬉しい。

PIC32MXを調べていて、pic32progというオープン ソースがFTのMPSSEをFTやlibFTDIのライブラリを使わず、libusb 0.1で処理していて 吃驚した。

ルータのFreeBSDを試していて、シリアルコンソールにftなデバイスを使っているが、 Macでcuなデバイスをcuコマンドで開くとctsを無視する事が出来ない。sttyで見ると -crtsctsとはなっているが。しかたがないので、 Jerminalというオープンソース を使う事にした。

FONのflash書き換えのため調べたところ flashromというオープンソースがあった。MPSSEを使ったFT2232のサポートもある のだがlibftdiベースのようだ。libftdiはcmakeを使っていて、cmakeはインストールし たくない。

libftdiをcmakeを使わずにビルドしてみた。
$ cd src
$ sed 's/@MAJOR_VERSION@/2/;s/@MINOR_VERSION@/0/;s/@.*@//' ftdi_version_i.h.in  
 > ftdi_version_i.h
$ cc -I../../libusb-1.0.19/libusb/ -c *.c
$ ar r libftdi.a *o
ar: creating archive libftdi.a
で、flashromなのだが、こちらはmakeでごりごりマシンタイプやライブラリなどを チェックしてビルドするようになっている。flashromはFTDIなどの外付けの プログラマー以外にPCやMacのマザーのFlashの直接の焼き直しにも対応していて、 コード構成が複雑になっているのmakeだけでビルドするのはポータビリティーが 良くないように思う。

$ cp ../libusb-1.0.19/libusb/.libs/libusb-1.0.a .
$ cp ../libftdi1-1.2/src/libftdi.a .
$ cp ../libftdi1-1.2/src/ftdi.h .
$ make
Makefileはこんな風に書き換えてみた。
$ diff Makefile.org Makefile
83,84c83,95
< CPPFLAGS += -I/opt/local/include -I/usr/local/include
< LDFLAGS += -L/opt/local/lib -L/usr/local/lib
---
> CPPFLAGS += -I.
> LDFLAGS += -L.
> CONFIG_INTERNAL = no
> CONFIG_RAYER_SPI = no
> CONFIG_NIC3COM = no
> CONFIG_GFXNVIDIA = no
> CONFIG_SATASII = no
> CONFIG_DRKAISER = no
> CONFIG_NICREALTEK = no
> CONFIG_NICINTEL = no
> CONFIG_NICINTEL_SPI = no
> CONFIG_OGP_SPI = no
> CONFIG_SATAMV = no
507c518
< FTDILIBS := $(shell pkg-config --libs libftdi 2>/dev/null || printf "%s" "-lft
di -lusb")
---
> FTDILIBS := $(shell pkg-config --libs libftdi 2>/dev/null || printf "%s" "-lft
di -lusb-1.0")
ストロベリーリナックスの2232HモジュールにFlashつないで確認してみた。
$ ./flashrom -p ft2232_spi:type=2232H,port=A
flashrom v0.9.7-r1711 on Darwin 10.8.0 (i386)
flashrom is free software, get the source code at http://www.flashrom.org

Calibrating delay loop... OK.
Found Macronix flash chip "MX25L6405(D)" (8192 kB, SPI) on ft2232_spi.
Found Macronix flash chip "MX25L6406E/MX25L6436E" (8192 kB, SPI) on ft2232_spi.
Found Macronix flash chip "MX25L6445E" (8192 kB, SPI) on ft2232_spi.
Multiple flash chip definitions match the detected chip(s): "MX25L6405(D)", "MX2
5L6406E/MX25L6436E", "MX25L6445E"
Please specify which chip definition to use with the -c <chipname> option.
FTをUSBに接続した直後はほぼ動作するが連続してコマンドを実行すると認識できな かったりして、少し不安定だ。ただ、25L1605からの読み込みと25L6406への書き込みは できた。

flashromのドキュメントはmanページ見ろと書いてあって、生のnroffへのリンクにな っている。なんだかなー。。。

読み込みと書き込みの時にプログレスが表示されないので、本当に動作しているのか 心配になる。

最初はSOP8のクリップを買ってきて、書き込みをしていたが、エラーがたびたび 起こっていたので、ソケットを購入してみた。SOPなパッケージは幅がいくつかあって MXICのFlashの幅にちょうど良いのがAitendoにあった。ソケットが2500円とちょっと 高かったが、変換基板も2000円もして二段重ねでちょっと扱いにくいような気もした ので、150円の基板を加工して自分で作ってみた。

IMGP1407

3.3Vにした2232Lでflashromを試してみたが動作しない。12MHzのコードも入っている ように見えるが、FTDIのVID/PIDは2232Hのコードになっているようだ。FTDIは何で 2232L/Dと2232Hを同じPIDにしてしまったのか、はなはだ疑問だ。

秋月で買ったの232Hモジュールでも問題なく動作した。2Mの読み込みに18秒くらいで 2232Hと同じくらいのスピードだった。

Flash 8-PIN FTDI Flash 16-PIN
1 CS# CTS# ADBUS3 7
2 SO/SIO1 RTS# ADBUS2 8
3 WP#/ACC 3V3 9
4 GND GND 10
5 SI/SIO0 RXD ADBUS1 15
6 SCLK TXD ADBUS0 16
7 HOLD# 3V3 1
8 VCC 3V3 2

OpenOCD 0.8.0を試してみたのだが0.4で使えたconfigureの改造は雪豹のautoconfが 古くて出来なく、むりやりconfigureを改造してconfigureを通して、その後に src/Makefileをいじってどうにかビルドできた。ftdiのサポートはD2XXやlibFTDIでは なくlibusb 1.0ベースとなている。これはなんかどうもごたごたがあったようだ。

10.9からApple製のFTDIのドライバがOSに入っていて、なんとそれがまともに動かない という話がネットにあった。また10.10では署名が無いドライバはデフォルトではロード されないので、FTDIの純正のドライバーはそのままでは使えない。なんかAppleは MacOS Xを壊そうとしているのではないかとすら、思えてくる。

BitBang/MPSSEで使う場合はkextがロードされていると使えないので、kextは/System の下にはインストールせずkextloadで使う時にロードしている。10.9以降ではBitBang/ MPSSEがそのままでは使えないのは、FTDIに対する業務妨害にも思える。

10.9は自宅に無いので、ネットの情報を見ると10.9に入っているApple製のFTDI ドライバはどうもDTRの処理が出来ていないような感じだ。 FTDIはそもそもUSBプロトコルについての資料を公開していないので、Appleもそれを 持っているのか分からない。これだとバルクをつないだだけの自作てんげなドライバー と変わりがない。 FTDIのドライバを10.9でAppleが作ったのは10.10で署名無しがロードできなくなり 困る人がいるからという筋書きだったのかもしれない。もう狂ってるとしか言いようが ない。

232Hはグランドが8本(AGND含めると11本)もあるのになんでQFP48なパッケージ なんだろう。2232系のMPSSEが入っているので2232系の人が設計したからなような 気もするが。

IMGP1608

わけあってAUの2003年くらいの携帯のデータを転送したいとおもいつきいろいろ調べて ケーブルを自作してみた。この頃のAUの携帯はTTLレベルのシリアルがコネクタに出て いて、2005年くらい以降の携帯はコネクタの形状は同じだがUSBの信号に変わっている ようだ。前のタイプのケーブルはシリアルUSB変換が内蔵されていて、後のタイプは 直接USBコネクタに接続さている。このタイプのケーブル(Owltech)をHardOffで108円で 購入して分解してケーブルを4本つないでFT232Rに接続してみた。転送はWindowsで KTransというフリーウエアを使ってみた。

1 GND 8 GND 11 TX 13 RX

AU_CON IMGP1664

AitendoのArduinoのユニバーサル基板でQFP48が載る物があったのでFT232Hでインター フェースを作ってみた。秋月の変換基板(100円)よりは高いが(216円)これだけで組み 立てられるので、いいかも。FT232Hは3.3V系なので、5V系のArduinoのISPとして使う にはレベルコンバータがいるな。。。後先考えない方なんで、作ってから考えている。 (2015/03/29)

IMGP1707

swddudeをMacでビルドして みて試しているのだが、以下のように信号は出ているのだがOKが返ってこない。 何でだろう。

SWD

UrJtagで167Kの書き込みとベリファイに2時間30分くらいかかる。

sop8なFlashでflashromすぐに使えるようにしてみた。

IMGP0279

FTいじり始めた最初の頃いろいろやろうと思って2232を変換基板に貼付けたものが 放置されていたので、空中配線でモジュール作ってみた。USBコネクタはAmazonで 中国発送の安いものを入手して使っている。放置していたのは変換基板自体が大きくて これをユニバーサル基板に貼付けると意味なく大きくなるためだった。 最近はめっきり3.3V系の232Hなどのモジュールを使う事が多く、さして用途がある 訳では無いのだが。

IMGP0333


Copyright (C) 2010-2012 Hiroki Mori All Rights Reserved.