Linux から FX2 USB 2.0 を使う


モノはやっぱりオプティマイズさんとこのこれ。 FX2 チップな基板て、ここのしか知らな ... かったんが、 ググったら もひとつでてきた。 こっちは EEPROM が載るのね。ともあれ、128pin モノの CY7C68013 を入手するには いまんとここらの基板ごと買うしかないよーな気がするのは変わらんが。

製作

やっぱりハンダ付けから。 FX2 のハンダ付けはベタッと付けてあとでソルダーウイック (1.5mm 幅のを使った) で引き上げる方式。 オプティマイズさんとこの 手順ではソルダーウイック使ってないのが凄いぞ。 手順にも書かれているが、ランドに盛ってあるハンダはかなり多い。 ... 多すぎて仮止めしようとするとハンダのヤマからチップのピンが滑べってずれ落ちる (;_;) 1 辺が 0.1mm 強ずれたおかげでハンダ付けから導通チェックまで 1 時間近くかかってしまた。

チップコンデンサはやっぱり 22pF と 0.1uF の二種類を使うが、 こちらはさくさくと 22pF を先に貼りつけてしまえるので無問題。

気ぃ抜いたところで唯一のチェックポイントは、電解コンデンサの背の高さ。 付属のは 13mm 近くあるタイプだが、これだと部品面側にコネクタを付けるとコンデンサがつっかえる。 寝かせるほど周囲にスペースはないので、部品面側にコネクタを付けるなら低背のコンデンサを調達しなければならない。 ... んだが交換はしてない。

ところでやっぱり、この基板てばケースに止めるための穴が開いてないんね。 コネクタが三方にあるから力的な観点では問題ないが ...。

基板サイズ

基板サイズがどこにも書いてないのでメモ。実測で 54mm x 66mm だった。
MINI EZ-USB はともかく、なんでそれ以外の似たようなサイズの基板がこうもばらばらなんだろ。

端子ピン配置

そしてやっぱり本家に一覧がないのでこちらもメモ。 ピン数に余裕があるだけあって BKPT や *WAKEUP も配線されている。
CN1:   CN2:   CN3:
1 Vbus 2 Vbus
3 NC 4 A11
5 A12 6 A13
7 A14 8 A15
9 INT4 10 T0
11 T1 12 T2
13 IFCLK 14 BKPT
15 EA 16 SCL
17 SDA 18 OE#
19 PSEN# 20 RD#
21 WR# 22 CS#
23 PB0/FD0 24 PB1/FD1
25 PB2/FD2 26 PB3/FD3
27 TxD0 28 RxD0
29 TxD1 30 RxD1
31 PB4/FD4 32 PB5/FD5
33 PB6/FD6 34 PB7/FD7
35 D0 36 D1
37 NC 38 NC
39 GND 40 GND
1 GND 2 GND
3 D2 4 D3
5 D4 6 CTL3
7 CTL4 8 CTL0/*FLAGA
9 CTL1/*FLAGB 10 CTL2/*FLAGC
11 PC0/GPIFADR0 12 PC1/GPIFADR1
13 PC2/GPIFADR2 14 PC3/GPIFADR3
15 PC4/GPIFADR4 16 PC5/GPIFADR5
17 PC6/GPIFADR6 18 PC7/GPIFADR7
19 PA0/INT0# 20 PA1/INT1#
21 PA2/*SLOE 22 PA3/*WU2
23 D5 24 D6
25 D7 26 PA4/FIFOADR0
27 PA5/FIFOADR1 28 PA6/*PKTEND
29 PA7/FLAGD/SLCS# 30 A0
31 A1 32 A2
33 A3 34 CTL5
35 RESET# 36 *WAKEUP
37 PD0/FD8 38 PD1/FD9
39 PD2/FD10 40 NC
1 PD3/FD11 2 INT5#
3 PE0/T0OUT 4 PE1/T1OUT
5 PE2/T2OUT 6 PE3/RxD0OUT
7 PE4/RxD1OUT 8 PE5/INT6
9 PE6/T2EX 10 PE7/GPIFADR8
11 A4 12 A5
13 A6 14 A7
15 PD4/FD12 16 PD5/FD13
17 PD6/FD14 18 PD7/FD15
19 A8 20 A9
21 A10 22 CLKOUT
23 RDY0/*SLRD 24 RDY1/*SLWR
25 RDY2 26 RDY3
27 RDY4 28 RDY5
29 NC 30 NC
31 NC 32 NC
33 NC 34 NC
35 Vcc(3.3V) 36 Vcc(3.3V)
37 Vdd(5V) 38 Vdd(5V)
39 GND 40 GND
チップのピンなりでコネクタにまわしてるだけってこともあってか、 A[0:15] とか FD[0:15] とかあっちこっち飛んで、どーしたらよかろ ...。 CN2 の 40 ピンも NC にするくらいならノイズ対策的にも GND を配線して欲しかったかな。

1st ローダの準備

fxload も使えるようだが fx2_programmer を使った。

% fx2_programmer --help

fx2_programmer  bus device function [parameters]

       Function    Parameters            Description
       dump_busses                       show all available devices
       dump        start len             dump RAM contents
       bulk_dump   endpoint len chunk    dump data read of bulk endpoint
       bulk_bench  endpoint len chunk    benchmark throughput of bulk endpoint
       upload      file start len        upload binary file to RAM
       set         address byte          changes values of a single byte
       program     file.ihx              programs fx2 using Intel hex format file
この便利さには換えられん。ただ、ロード動作には一癖ある。 EZ-USB 系のローダのように一発というわけではない。 /proc/bus/usb/001/002 に FX2 が繋がっている場合で:
# fx2_programmer 001 002  set 0xE600 1
# fx2_programmer 001 002  program ex2.ihx
# fx2_programmer 001 002  set 0xE600 0
のように、ポート 0xE600 (CPU Control & Status register) の bit0 (8051RES) に対して準備 (リセットシーケンスへ) と後処理 (リセットシーケンスから脱出) を明示する必要がある。

バス名、デバイス名は数字を直書きするのでなく、これもふつー fx2_progammer に検索させる:

# fx2_programmer any any dump_busses
とすると、FX2 なデバイスを探しだす。この結果を環境変数で受けて fx2_programmer program に渡すなんてことをするあたりは付属の program_and_start.sh にも書かれているが、略。

サンプルファームと動作テスト

fx2_programmer に付属する ex2 を使う。 fx2_programmer のページに飛ぶといかにも ex2.c だけ拾って sdcc -mmcs51 ex2.c すればいいように見えるが、 ヘッダが足りない。ちゃんと cvs から 8051 モジュール全体を拾ってこなければならない。

% cd 8051/ex2
% make
% su root
# sh program_and_start.sh

で、ファーム (ex2.ihx) を送ったのち、バルクな通信のテストと速度を計測してくれる。 TP240 で 150kB/s、PC で 250kB/s だったので内部的には usbstress の firmware.asm と同じ? ただ、こちらは一応 C のソースになっているので下地用に使える。小さいし。

注意:
PC のハードウエアは USB 2.0 に対応しているが、ehci 入れてないのでこの時点では FS 動作している。

追記、ハイスピードテスト

PC 側で事前に
# modprobe ehci-hcd
しておけばカードを繋いだ時に USB2 として繋がる:
ehci_hcd 00:03.3: GetStatus port 1 status 001803 POWER sig=j  CSC CONNECT
hub.c: port 1, portstatus 501, change 1, 480 Mb/s
hub.c: port 1 connection change
hub.c: port 1, portstatus 501, change 1, 480 Mb/s
hub.c: port 1, portstatus 501, change 0, 480 Mb/s
hub.c: port 1, portstatus 501, change 0, 480 Mb/s
hub.c: port 1, portstatus 501, change 0, 480 Mb/s
hub.c: port 1, portstatus 501, change 0, 480 Mb/s
hub.c: port 1, portstatus 511, change 0, 480 Mb/s
hub.c: port 1 of hub 1 not reset yet, waiting 10ms
hub.c: port 1, portstatus 511, change 0, 480 Mb/s
hub.c: port 1 of hub 1 not reset yet, waiting 10ms
ehci_hcd 00:03.3: port 1 high speed
ehci_hcd 00:03.3: GetStatus port 1 status 001005 POWER sig=se0  PE CONNECT
hub.c: port 1, portstatus 503, change 10, 480 Mb/s
hub.c: new USB device 00:03.3-1, assigned address 2
usb.c: kmalloc IF ccd03f40, numif 1
usb.c: new device strings: Mfr=0, Product=0, SerialNumber=0
usb.c: unhandled interfaces on device
usb.c: USB device 2 (vend/prod 0x4b4/0x8613) is not claimed by any active driver.
  Length              = 18
  DescriptorType      = 01
  USB version         = 2.00
    ...
    以下略

そして、ふつーに:

# sh program_and_start.sh
で、あっさり 2.5MB/s でた。ex2 のままでしっかり HS 動作してるし、造りもなんか素直だ。

ちなみにパケットが 64 バイトだとこんなもんだが、 512 バイトに伸ばすくらいで over 20MB/s いくらしい。 ... らしいってのは、パケットサイズのベタ指定があっちこっちにあって書き換えるのが ちと恐くてやってないって意味だが、結果だけは先に分かる。 256 バイト/パケット以下で 2.5MB/s くらいに落ち込んでるからアルゴリズム的には似たようなもんだろう。

いちお PC 側テスト環境を明記すると:

PC 側 CPU Athlon XP 1700+
Linux kernel 2.4.22 + rmap15k
USB2 I/F SiS 962
USB2 driver ehci-hcd
トポロジ PC とカード直結
SiS でも ehci のままで動くんね。


[日記へ] [目次へ]