LAN9118が搭載されたボードとして、
を使います。このボードをAKI-H8/3069F LANボードと接続します。なお、AKI-H8/3069F LANボードのRTL 8019ASと、 Easy-NICボードのSMSC LAN9118の、 どちらをMONIXでネットワークI/Fとして使うかは、 コンパイル時に決めるようにしています。・・・※
※ ハード的には両方生かすことができる(IRQ, エリア等ぶつかってない)ので、 ソフト的に複数ネットワークI/Fに対応すれば、 ルータ等を作ることもできると思います。(誰もやらないか・・・。)
バスコントローラ設定としては、エリア5について、
割り込みは
※ ソフトからは、8bit幅でもアクセスできるように見えますが、 例えば、 0xa00000番地を8bit幅でアクセスし、 続いて0xa00001番地を8bit幅でアクセスした場合、 それは0xa00000番地を16bit幅で2回アクセスすることになります。
結論として、 ENDIANレジスタを0x00000000(デフォルトのまま)にして、 データバスをバイトスワップする(D[15:8]とD[7:0]を入れ替える)ことにしました。 (D32/nD16はEasy-NICボード上でプルダウンされていて、 データバス幅は16bitになっています。) こうすることにより、16bit幅で、(ソフトでは)バイトスワップせずに、 ビッグエンディアンでアクセスできるようになります。
補足:
↑上ではさらっと書いてますが、実は結構悩みました・・・。
当初は、AKI-H8/3096 LANボード上のH8とEasy-NIC上のLAN9118とを データバスD[15:0]をバイトスワップせずにそのまま接続して試していました。
その場合に、ネットワーク上を0xde0dc6baと流れている (ネットワークバイトオーダーで 0xde0dc6baとなっている) データをLAN9118のRX_DATA_FIFOレジスタから32ビットでリード したときに、 その値がENDIANレジスタへの設定値によりどう変わるのかを 見てみると:
ENDIANの値 RX_DATA_FIFOからリードできる値 0x00000000 (デフォルトのまま) 0xbac60dde 0xffffffff (ビッグエンディアン?) 0x0ddebac6 となります。 H8(ビッグエンディアン)からは、0xde0dc6baと見えてくれれば 都合がよい(バイトオーダーの変換なく読める)のですが、 残念ながらそうなりません・・・。 データバスの配線自体もスワップする必要がありということに気づきました。
※
LAN9118の電源は3.3V (I/Oは5V tolerant)です。
私は、AKI-H8/3069F LANボード付属の5VのACアダプタの代わりに
3.3VのACアダプタ
を挿して動かしましたが・・・(・∀・ ;)
本来は、H8/3069側電源は5Vのまま、LAN9118への電源を3.3V変換するべきだと思います。
(たとえば、以下の表の★で5V→3.3VのレギュレータをはさんでEasy-NIC側のVccは3.3Vにする等すればよいと思います。)
Easy-NICボード | AKI-H8/3069FフラッシュマイコンLANボード | 補足 | ||
---|---|---|---|---|
端子名 | コネクタ番号 | 端子名 | コネクタ番号 | |
Vcc | 1 | Vcc | CH2-2 | ★ |
A1 | 3 | A1 | CH2-22 | |
A2 | 4 | A2 | CH2-23 | |
A3 | 5 | A3 | CH2-24 | |
A4 | 6 | A4 | CH2-25 | |
A5 | 7 | A5 | CH2-26 | |
A6 | 8 | A6 | CH2-27 | |
A7 | 9 | A7 | CH2-28 | |
nCS | 10 | /CS5 | CH1-35 | |
nRD | 11 | /RD | CH1-7 | |
nWR | 12 | /HWR | CH1-8 | |
nRESET | 13 | PA2 | CH1-27 | lan9118.c のLanReset関数で(1→)0→1とする |
IRQ | 14 | /IRQ4 | CH2-3 | |
SPEED_SEL | 15 | PA3 | CH1-28 | lan9118.c のLanReset関数で1とする(100Mbps, Full Duplex, Auto Negotiation) |
GND | 40 | GND | CH2-1 | |
D0 | 38 | D8 | CH2-13 | |
D1 | 37 | D9 | CH2-14 | |
D2 | 36 | D10 | CH2-15 | |
D3 | 35 | D11 | CH2-16 | |
D4 | 34 | D12 | CH2-17 | |
D5 | 33 | D13 | CH2-18 | |
D6 | 32 | D14 | CH2-19 | |
D7 | 31 | D15 | CH2-20 | |
D8 | 30 | D0 | CH2-5 | |
D9 | 29 | D1 | CH2-6 | |
D10 | 28 | D2 | CH2-7 | |
D11 | 27 | D3 | CH2-8 | |
D12 | 26 | D4 | CH2-9 | |
D13 | 25 | D5 | CH2-10 | |
D14 | 24 | D6 | CH2-11 | |
D15 | 23 | D7 | CH2-12 |
データレジスタは32bit幅で16個同じものが並んでメモリマップされていて、 そのどれかにアクセスすればいいことになっています。 例えば、32bit幅で、16個のレジスタの内のどれかに連続してアクセスしたり、 16個のレジスタに順々にアクセスすることができます。
一方、 H8のDMAコントローラからは16bit幅でアクセスすることになりますが、 データレジスタに正しくアクセスするためには 隣り合う16bit幅に連続してアクセスする必要があります。 例えば、16bit幅で同じ番地からリードしても正しいデータがリードできないので、 DMAコントローラを使う際には、アドレスをインクリメントしていくモードを 使う必要があります。 (16bit幅だと、データレジスタが32個並んでいるように見えるので、 一回のDMA転送設定では最大32個の16bit幅アクセスをすることになります。)
LAN9118にEEPROMを接続してLAN9118経由でアクセスできるようになっていますが、 私の持っているEasy-NICボードにはEEPROM(93LC66)が実装されていませんでした。 そこで、93LC66を載せてみました・・・が、どうもうまく動かせません・・・。(・∀・?)
その代わりといってはなんですが、
AKI-H8/3069F LANボードの IC4 に24C256
(シリアルI2C EEPROM AT24C256 (2.7〜5.5V))
を載せて使うことにしました。
まず、 Makefileの
#DEFS+=-DEASYNIC -DUSE_ALT_EEPROMの行を
DEFS+=-DEASYNIC -DUSE_ALT_EEPROMとします。
次にmakeします。
$ makeこれにより、Motorola S-recordのファイル monix.mot ができます。 これをH8内蔵フラッシュに書き込みます。
MONIX Ver.0.1 (May 1 2007, 13:37:08) BootMode: 0x00 1:
1:mac 00:02:cb:02:46:c5 Auto Negotiation...100Base-TX Full-duplex DONE. Link up. Ethernet Address : 00:02:cb:02:46:c5 1:もちろん、MACアドレスは他とぶつからないものを設定する必要があります。・・・※
※ 私の場合は、使ってない MAC書き込み済みの93C46 があったので、その中に入ってるアドレスを流用しています。設定できたか確認してみます。なお、適当なアドレスをつける場合に、特別なMACアドレスをつけると、 MONIXのネットワーク周り(たとえば、TFTP)がうまく動きません。 私の場合、01:23:45:67:89:ab というMACアドレスをつけてはまりました。(→マルチキャストアドレスなのでルータがICMP redirectを出しはじめたりします。)
1:dhcpc Auto Negotiation...100Base-TX Full-duplex DONE. Link up. EtherInit DONE. Ethernet Address : 00:02:cb:02:46:c5 BOOTP DONE. my_ip=192.168.0.4, bootfile=, server_ip(BOOTP)=192.168.0.1 1: