NE2000


  • DP8390D/NS32490D NIC Network Interface Controller
データシート
NE1000/NE2000 are based on a National Semiconductor prototype design using their 8390 Ethernet chip.
発売元(NE2000の大元)のやつ
http://www.national.com/ds/DP/DP8390D.pdf

REALTEK 8029(QEMUにシミュレートされてるやつ)
http://pdf1.alldatasheet.com/datasheet-pdf/view/168683/ETC2/RTL8029AS.html

↓こっちは8019だから、ちょっと違う
http://realtek.info/pdf/rtl8019as.pdf

  • OS Dev.org
Ne2000の解説がある
http://wiki.osdev.org/Ne2000

  • Wikipedia

  • QEMU:ネットワークの使い方

  • 使えそうなリンク集

  • OSを作ってるっぽい人のブログ(ne2kのドライバ開発あり)

  • 上の人の作ってるっぽいOS(のドライバーのソース。参考資料と言うより、そのもの)
http://sourceforge.jp/projects/nchaos/svn/view/trunk/sodex/src/drivers/?root=nchaos
でも、なんか未完成っぽい。
↓のやつのほうが、きっちり完成して参考になりそう。

  • Micro Embeded System/OSというOSのne2000のドライバのソース!!!


  • Micro Embeded System/OSのメーリングリスト

  • ネットワークエンジニアとして(とても参考になる)


  • DP8390Dデータシートの日本語メモ

4.0「パケットの送信・受信 カプセル化・解除」
スタンダードなIEEE802.3のパケットではFIGURE2に示すような構造になっている。
送信時、PREAMBLE、SFD、FCSは、NICで生成してくれる。
受信時、PREAMBLE、SFDは、NIC側で削除されるが、FCSはデバイスドライバ側で受け取れる。→エラー処理もデバイスドライバがしなきゃいけない?
DESTINATIONとSOURCEとLENGTHとDATAは自分で指定しないといけない?

DESTINATION ADDRESS
NICでは、物理、マルチキャスト、ブロードキャストの3つのアドレスフォーマットをサポートしている

DATA FIELD
データフィールドは46から1500バイトの間で設定する。
これより短くても長くてもダメ。
短い場合は、パディングして、LENGTH FIELDで長さを指定すればいい。
NIC側では、短すぎる、長すぎることに対してエラー処理はしないので注意。

6.0 Direct Memory Access Control(DMA)
"local DMA"チャンネルは、FIFOとメモリーの間のデータの送信を行う。
(FIFOはNIC内のメモリ(キュー)のこと?)
送信では、コリジョンが発生した場合は、プロセッサを介することなしに再送信する。
受信では、FIFOからbuffer ringにデータを送る。
"remote DMA"チャンネルは、buffer memoryとsystem memoryの間の送信を行う。
(?DMAは32ビットアドレスだけど、そのなかに8か16ビットのデータを保持している?)

DUAL DMA CONFIGURATION
P.7の図を見て。
ネットワーク動作はlocal busから独立している。
localDMAはバッファメモリーとNICのFIFOの間でデータの送信をする。
remoteDMAはバッファメモリーとメインメモリの間で、I/Oポートを通してデータ送信する。

8.0 Packet Transmission
Local DMAはパケット送信時にも利用される。
NICが送信命令を受け取るとTPSR,TBCR0,1の3つのレジスタで指定されたバッファメモリのデータがNICのFIFOに送られる。
そして、NICがpreamble, synch and CRC fieldsを生成、付加する。

TRANSMIT PACKET ASSEMBLY
パケットはP.11右下の図で示すような構造になっている。

TRANSMISSION
送信する前に、
TPSR,TBCR0,1
の3つのレジスタが初期化されてなければならない。
送信するためには?Command RegisterのTXPビットをセットする。
TSRはクリアされる。
そして、NICはメモリから送信するデータを読み込む。

CONDITIONS REQUIRED TO BEGIN TRANSMISSION
パケットを送信するには、以下の3つの状態でなければならない。
~~




RemoteDMAとLocalDMAの違い

RemoteDMAはCPUを介しての読み書きに使う。
→例えば、バッファにたまっている受信データを読み込みたーい、とか、送信データを書き込みたい!とか
→書き込みたいときは、書き込む先のアドレスと元データのサイズ、を教えて、データポートに元データを投げ込んでいく。

LocalDMAはCPUを介さず、デバイスが勝手にメモリとやり取りしてくれる
→例えば、送信したいデータのアドレスはこれ、データのサイズはこれくらい、と教えて、あとは勝手にやっといて、よろしく!
→こっちが、「リング・バッファ」を管理しているっぽい?

という感じ??
違うかも。

あ、RemoteDMAは、LocalDMAを操作するための手段、という感じ?



  • レジスタ解説

P.28
Remote DMA は
RSAR0,1 : Remote Start Address register
RBCR0,1 : Remote Byte Count register
によって操作される。
RSARは送信されるデータブロックのスタート位置を指し示す
RBCRはそのブロックの長さを示す(in bytes)
→要は、10バイトのデータを送りたかったら、RSARにそのデータの先頭のアドレス、RBCRに10、と書きこめばいいのかな。

P.25
RCR : Receive Configuration Register
このレジスタは、パケット受信時のNICの動作を決定する。また、どんなタイプのパケット(ブロードキャストやマルチキャストなど)を受け入れるかを決定する。
MONを1にすると、パケットのチェックは行うがメモリーにはデータを送らないモードになる。データを普通に受け取りたいときは0にする。
#define
NE_RCR_SEP 0x01 /* accept error packet */
#define
NE_RCR_AR 0x02 /* accept tiny packet */
#define
NE_RCR_AB 0x04 /* accept broadcast */
#define
NE_RCR_MUL 0x08 /* accept multicast */
#define
NE_RCR_PRO 0x10 /* accept all */
#define
NE_RCR_MON 0x20 /* monitor mode */

P.27
Local DMA Receive Registers

BNRY : Boundary Register
受信バッファ・リングのオーバーフローを防止するために使う。
Boundary : 限界、境界
初期化時はPSTARTと同じ値にしておけばいいみたい。
データをメモリから読み込んだ時は、BNRYも再設定する必要があるみたい。
→BNRYはバッファ・リングの中のあるアドレスを指している。で、そのアドレスを超えて(またいで)バッファに書き込みが行われようとすると、エラーになる。

P.20
ISR : Interrupt Status Register


open_ne{

ne_attach{

ne_probe
  • ne_reset
  • ne_mem_probe
  • ne_readmem

ne_setup
  • ne_ring_init

}

alloc_irq

ne_start
ne_outb(num, NE_P0_ISR, 0xff);

}

最終更新:2012年01月19日 03:47
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。