(toppers-users 2321) ARMでのTINETについて (Was: Re: TINETのWindows上でのシミュレートについて)
Ohno
tohno @ sirius.ocn.ne.jp
2006年 2月 26日 (日) 12:05:48 JST
はじめまして、大野と申します。
Suikan wrote:
>> 口止めされているので詳細は言えませんが,今回のARMボードと
>> 同じようなネタでTINETまでフォローアップできるようなものが,
>> 夏頃までに入手可能になると思います.
> おお、またいい情報が。TINETをADuC7026に移植しようかと思っていたのです
> が、これもしばらく待っていれば敷居が下がりそうです。ARMだといいのですが。
ARM7 (Optimize)で TINET 1.3をIPV4で動かしたことがあるので、
簡単に報告させていただきます。NICとしてはH8と同じ入手が容易な
RTL8019を8ビットモードで使いました。以下のような修正が必要でしたが、
比較的すんなり動きました。
o TINETではイーサネットのフレームとIPパケットとを
連続したメモリ内に配置したまま、処理しようとする。
しかし、イーサのヘッダは14バイトであるため
IPパケットのsrc と dst が4バイト境界に載らなくなる。
その結果 ARMでは正しく unsigned longの値として
処理できない。
--> tinet_nic_defs.h にて
#define IF_ETHER_NIC_HDR_ALIGN 2
とすることで、4バイト境界にIPアドレスが載るように調整。
--> 上記、変更の結果 NICの送受信するフレームの開始アドレスが
2バイトずれてしまうので、if_ed.c の ed_get_frame() ならびに
ed_stat() にてバッファのアドレスを再調整。
o Ethernetの割り込みをクリアするシステム依存部の新設
if_ed.c の if_ed_handler() の最後で 新設した ed_clear_inter()
を呼び出すようにした。
o TCP_CFG_NON_BLOCKING を使わない場合に、
tcp_cls_cep() で例外が発生する。
--> tcp_user_closed()の結果が NULLであった場合にも
ヌルポインタとなった cep を使ってしまうため。
return error; の行を追加。
o put_ipv4addr() でアドレスが正しく表示されない
--> TINET 1.2.xでは LITTLE ENDIANの場合の処理が間違っていましたが、
TINET 1.3では修正されていました。
ここまでの作業で nserv のwwws が動きました。UDPの動作確認と
ethernetドライバの16ビット化をしてみるつもりでしたが、
誤ってCPUを壊してしまい、作業休止状態です。
#ユニバーサル基板に手ハンダで組んだ趣味の電子工作のため、
#再挑戦するなら、すべて組み直すことも検討中です。
tinet.pdf によるとドキュメントとして tinet_ether.pdfが
存在することになっていますが、配布には含まれていないようです。
しかしながら、ちょうどトランジスタ技術でRTLの解説記事が出ていますので、
ドライバの動作は簡単に理解できると思います。
DWMに付録基板がついたこともあり(わたしも2冊買いましたが。。)、
同様の挑戦をする方もいらっしゃるだろうと思います。
参考になれば幸いです。
大野