home > MONIX > SMSC LAN9118 Support

SMSC LAN9118 Support


履歴


はじめに

MONIX でSMSC LAN9118を使えるようにします。

LAN9118が搭載されたボードとして、

を使います。このボードをAKI-H8/3069F LANボードと接続します。

なお、AKI-H8/3069F LANボードのRTL 8019ASと、 Easy-NICボードのSMSC LAN9118の、 どちらをMONIXでネットワークI/Fとして使うかは、 コンパイル時に決めるようにしています。・・・※

※ ハード的には両方生かすことができる(IRQ, エリア等ぶつかってない)ので、 ソフト的に複数ネットワークI/Fに対応すれば、 ルータ等を作ることもできると思います。(誰もやらないか・・・。)


AKI-H8/3069 LANとEasy-NIC(LAN9118)の接続

仕様

H8ソフトから見て、 にLAN9118のI/Fレジスタをマップします。

バスコントローラ設定としては、エリア5について、

とします。

割り込みは

を使います。
※ ソフトからは、8bit幅でもアクセスできるように見えますが、 例えば、 0xa00000番地を8bit幅でアクセスし、 続いて0xa00001番地を8bit幅でアクセスした場合、 それは0xa00000番地を16bit幅で2回アクセスすることになります。

データバスのスワップ

LAN9118のデータシート 3.7 によれば、 LAN9118は、 16あるいは32bit幅のビッグエンディアンとリトルエンディアン をサポートしており、 と書いてあります。 データシートTable 3.7によれば、 ENDIANレジスタの設定により、 A1=0, A1=1とした際に32bitダブルワード中のどちらの16bitワードにアクセス するかを変えることができるようです。 ただし、この16bitワード中のバイト並びはリトルエンディアンのままなので、 データバス自体をひっくり返す(D[15:8], D[7:0]を入れ替える) 必要があるということのようです。

結論として、 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と見えてくれれば 都合がよい(バイトオーダーの変換なく読める)のですが、 残念ながらそうなりません・・・。 データバスの配線自体もスワップする必要がありということに気づきました。

配線

AKI-H8/3069F LAN + DDK Easy-NIC 以下の表のように接続します。 私は、ユニバーサル基板の プルアップ/ダウンが必要な線はEasy-NICボード上でなされているようなので、 そのまま単純につなぎました。・・・※

※ 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ボード 補足
端子名コネクタ番号 端子名コネクタ番号
Vcc1VccCH2-2
A13A1CH2-22
A24A2CH2-23
A35A3CH2-24
A46A4CH2-25
A57A5CH2-26
A68A6CH2-27
A79A7CH2-28
nCS10/CS5CH1-35
nRD11/RDCH1-7
nWR12/HWRCH1-8
nRESET13PA2CH1-27lan9118.c のLanReset関数で(1→)0→1とする
IRQ14/IRQ4CH2-3
SPEED_SEL15PA3CH1-28lan9118.c のLanReset関数で1とする(100Mbps, Full Duplex, Auto Negotiation)
GND40GNDCH2-1
D038D8CH2-13
D137D9CH2-14
D236D10CH2-15
D335D11CH2-16
D434D12CH2-17
D533D13CH2-18
D632D14CH2-19
D731D15CH2-20
D830D0CH2-5
D929D1CH2-6
D1028D2CH2-7
D1127D3CH2-8
D1226D4CH2-9
D1325D5CH2-10
D1424D6CH2-11
D1523D7CH2-12

H8のDMAの使用

バイトスワップする必要がなくなったので、 H8のDMAコントローラを使ってデータレジスタ (TX_DATA_FIFO, RX_DATA_FIFO) にアクセスすることにします。

データレジスタは32bit幅で16個同じものが並んでメモリマップされていて、 そのどれかにアクセスすればいいことになっています。 例えば、32bit幅で、16個のレジスタの内のどれかに連続してアクセスしたり、 16個のレジスタに順々にアクセスすることができます。

一方、 H8のDMAコントローラからは16bit幅でアクセスすることになりますが、 データレジスタに正しくアクセスするためには 隣り合う16bit幅に連続してアクセスする必要があります。 例えば、16bit幅で同じ番地からリードしても正しいデータがリードできないので、 DMAコントローラを使う際には、アドレスをインクリメントしていくモードを 使う必要があります。 (16bit幅だと、データレジスタが32個並んでいるように見えるので、 一回のDMA転送設定では最大32個の16bit幅アクセスをすることになります。)


24C256

EEPROM

MACアドレス格納用のEEPROMについて。

LAN9118にEEPROMを接続してLAN9118経由でアクセスできるようになっていますが、 私の持っているEasy-NICボードにはEEPROM(93LC66)が実装されていませんでした。 そこで、93LC66を載せてみました・・・が、どうもうまく動かせません・・・。(・∀・?)

その代わりといってはなんですが、 AKI-H8/3069F LANボードの IC4 に24C256 (シリアルI2C EEPROM AT24C256 (2.7〜5.5V)) を載せて使うことにしました。


ビルド

ここ からMONIXのソースコードアーカイブをダウンロードして、展開します。

まず、 Makefileの

#DEFS+=-DEASYNIC -DUSE_ALT_EEPROM
の行を
DEFS+=-DEASYNIC -DUSE_ALT_EEPROM
とします。

次にmakeします。

$ make
これにより、Motorola S-recordのファイル monix.mot ができます。 これをH8内蔵フラッシュに書き込みます。

使用例

ターゲット電源オン

シリアルポート(SCI1)にシリアルケーブル(ストレート)を接続して、電源を入れます。
MONIX Ver.0.1 (May  1 2007, 13:37:08)
BootMode: 0x00
1:

MACアドレス設定

MACアドレス保持用のEEPROMは空(のはず)ですので、 最初に使うときには、MACアドレスを書き込む必要があります。 (すなわち、最初に使うとき一回行う必要があります。)
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:

その他

MONIXのその他の使い方については、 こちらをご覧ください。

追記

SMSCによる回路チェックリストがありました。(2007/05/05) http://smsc.jp/ether/download/datasheet/check118c.pdf
ちゃんと見なくちゃね>自分
Shuji KUWAHARA
$Id: lan911x.html 248 2007-12-14 20:22:52Z kuwa $