(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冊買いましたが。。)、
同様の挑戦をする方もいらっしゃるだろうと思います。
参考になれば幸いです。

大野