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
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.dyliblibftd2xx.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.htmlopenocdはビルドできたが、動かないのでD2XXのライブラリの中身をいろいろ 確認してみる。。。
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クロック分)空きが入る。
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秒も かかってしまう。
名称 | ピン番号 | JTAG | MIPS-EJTAG |
AD0 | 40 | TCK | 9 |
AD1 | 39 | TDI | 3 |
AD2 | 38 | TDO | 5 |
AD3 | 37 | TMS | 7 |
VCCIOA | 18 | VREF | 14 |
GND | 25 | GND | 2 |
ピン番号 | JTAG | 電源ON | ピン番号 | JTAG | 電源ON |
1 | ? | H | 2 | GND | L |
3 | TDI | H | 4 | GND | L |
5 | TDO | H | 6 | GND | L |
7 | TMS | H | 8 | GND | L |
9 | TCK | H | 10 | GND | L |
11 | ? | H | 12 | NC |
$ ./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 ...ところが、これはぬか喜びになり、backupは途中では"Trace/BPT"や"Bus Error"で 落ちたり途中で止まって使えない。。。 Latencyを大きくすればエラーになりにくいが、現実的に使えるスピードではない。。。... 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 ***
FT2232 | ピン番号 | SPI | ピン番号 |
AD0 | 40 | Serial Clock | 6 |
AD1 | 39 | Serial Data Input | 5 |
AD2 | 38 | Serial Data Output | 2 |
AD3 | 37 | Chip Select | 1 |
名称 | ピン番号 | JTAG | WLI3-TX1-G54 |
AD0 | 3 | TCK | 9 |
AD1 | 4 | TDI | 3 |
AD2 | 5 | TDO | 5 |
AD3 | 6 | TMS | 7 |
GND | 39,40 | GND | 2 |
$ 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!
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
Signal | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 |
FT232RL/FT245RL | 1 | 5 | 3 | 11 | 2 | 9 | 10 | 6 |
名称 | TXD | RXD | RTS# | CTS# | DTR# | DSR# | DCD# | RI# |
秋月モジュール | 1 | 5 | 3 | 10 | 2 | 8 | 9 | 6 |
HD44780 Pin | 11 | 12 | 13 | 14 | 5 | 4 | 6 | - | HD44780 Name | DB4 | DB5 | DB6 | DB7 | R/W | RS | E | - |
$ 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
Model | VendorID | ProductID | Version | Speed | BitBang | MPSSE |
FT245AM | 0x0403 | 0x6001 | 0x0200 | Full | ||
FT2232L | 0x0403 | 0x6010 | 0x0500 | Full | ○ | ○ |
FT2232D | 0x0403 | 0x6010 | 0x0500 | Full | ○ | ○ |
FT232RL | 0x0403 | 0x6001 | 0x0600 | Full | ○ | |
FT245RL | 0x0403 | 0x6001 | 0x0600 | Full | ○ | |
FT2232HL | 0x0403 | 0x6010 | 0x0700 | High | ○ | ○ |
FT232H | 0x0403 | 0x6014 | 0x0900 | High | ○ | ○ |
FT231X | 0x0403 | 0x6015 | 0x1000 | Full | ○ | |
$ 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 . $ makeMakefileはこんな風に書き換えてみた。
$ 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への書き込みは できた。
最初はSOP8のクリップを買ってきて、書き込みをしていたが、エラーがたびたび 起こっていたので、ソケットを購入してみた。SOPなパッケージは幅がいくつかあって MXICのFlashの幅にちょうど良いのがAitendoにあった。ソケットが2500円とちょっと 高かったが、変換基板も2000円もして二段重ねでちょっと扱いにくいような気もした ので、150円の基板を加工して自分で作ってみた。
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系の人が設計したからなような 気もするが。
わけあってAUの2003年くらいの携帯のデータを転送したいとおもいつきいろいろ調べて ケーブルを自作してみた。この頃のAUの携帯はTTLレベルのシリアルがコネクタに出て いて、2005年くらい以降の携帯はコネクタの形状は同じだがUSBの信号に変わっている ようだ。前のタイプのケーブルはシリアルUSB変換が内蔵されていて、後のタイプは 直接USBコネクタに接続さている。このタイプのケーブル(Owltech)をHardOffで108円で 購入して分解してケーブルを4本つないでFT232Rに接続してみた。転送はWindowsで KTransというフリーウエアを使ってみた。
1 | GND | 8 | GND | 11 | TX | 13 | RX |
AitendoのArduinoのユニバーサル基板でQFP48が載る物があったのでFT232Hでインター フェースを作ってみた。秋月の変換基板(100円)よりは高いが(216円)これだけで組み 立てられるので、いいかも。FT232Hは3.3V系なので、5V系のArduinoのISPとして使う にはレベルコンバータがいるな。。。後先考えない方なんで、作ってから考えている。 (2015/03/29)
swddudeをMacでビルドして みて試しているのだが、以下のように信号は出ているのだがOKが返ってこない。 何でだろう。
UrJtagで167Kの書き込みとベリファイに2時間30分くらいかかる。
sop8なFlashでflashromすぐに使えるようにしてみた。
FTいじり始めた最初の頃いろいろやろうと思って2232を変換基板に貼付けたものが 放置されていたので、空中配線でモジュール作ってみた。USBコネクタはAmazonで 中国発送の安いものを入手して使っている。放置していたのは変換基板自体が大きくて これをユニバーサル基板に貼付けると意味なく大きくなるためだった。 最近はめっきり3.3V系の232Hなどのモジュールを使う事が多く、さして用途がある 訳では無いのだが。