ウォンツテック

そでやまのーと

OS作成 - NIC編

 さて、いよいよNIC編をスタートさせました。TCP/IPの実装(または移殖)はsodex開発当初からの最上位課題で、その土台であるNICドライバの開発に取り掛かります。対象のNICは有名なNE2000とします。
NE2000ではDP8390という制御コントローラを使用しており、40個の制御レジスタがあるのですが、CPU側からは1度に16個のレジスタしか見れません。どうやって見れるようにするかというとアドレス0(ベースアドレス+0のアドレス)に配置されるコマンドレジスタのビット6,7によりページを切り替え(4ページまで)て選択します。コマンドレジスタはどのページにも存在するので、いつでもページの切り替えが可能です。ベースアドレスはNICを挿して起動した時に決まるらしいですが、BIOSやらのハードよりの部分が自動的にやってくれるのか、自分で書かなきゃいけないのかは調べてないのでまだよくわかりません。

ではまず初期化に必要な要素を列挙します。

  • コントローラのリセット
    • ベース+(0x18〜0x1f)のどこかのポートに何でもいいので書き込みを行う。
    • 書き込み直後にリセットされるが、数msec待つ。
    • コマンドレジスタ(CR)に強制停止命令を送る。
      • CRのビット0(DP8390の機能をすべて停止)とビット5(リモートDMAの強制停止)を1にする。
    • 割り込みマスクのクリア
      • ページ0, ベース+0x0fの割り込みマスクレジスタ(IMR)に対して0を書き込む。
    • 割り込み要求のクリア
      • ページ0, ベース+0x07の割り込みステータスレジスタ(ISR)に対して全てをリセットする0xffを書き込む。
    • リモートバイトカウントのクリア
      • ページ0、ベース+0x07,0x08のリモートDMAの転送バイト数を指定するレジスタで0にしておく。
  • MACアドレスの取得
    • リモートDMA経由で取得(当面は取得せずに決め打ちでMACアドレスを設定する予定)
  • MACアドレスの設定
    • ページ1, ベース+0x01〜0x06のフィジカルアドレスレジスタ(PAR0〜PAR5)にバイト単位で書き込む