(5)RTL8019AS,RTL8029AS网卡的ram结构

日期 2001-11-08
作者 老古 http://www.laogu.com Email:zhangshenggu@vip.163.com
内容

  RTL8029AS和RTL8019AS的内核其实是一样的,都是Ne2000兼容的寄存器结构,都有一样大小的ram,读取和操作的方法都是一样的.事实上对RTL8029AS的驱动是跟RTL8019AS一样的.没有很大的差别,因此很多关于RTL8029AS的论述也适用于RTL8019AS,同样对于RTL8019AS的论述,也适用于RTL8029AS.用户最好将我的关于RTL8019AS,RTL8029AS的文章都看一遍.
  RTL8019AS或RTL8029AS(简称为RTL8*19AS),RTL8*19AS有两块ram,一块16k字节的ram的地址为0x4000-0x7fff,一块32字节的ram的地址为0x0000-0x001f.存储是分页的,每256个字节称为一页.
  RAM地址:

0x4000-0x40ff是一页,我们称该页为第0x40页(或页0x40),页码也就是16位地址的高8位.
0x4100-0x41ff 是一页,称为第0x41页.
0x0000-0x00ff 是一页,称为第0页.
......

  页码 地址范围 附注
  第0页 0x0000-0x00ff 可以使用
  第1页--第0x3F页 0x0100-0x3fff 空,不能使用
  第0x40页--第0x7F页 0x4000-0x7fff 可以使用
  第0x80页--第0xFF页 0x8000-0xffff 跟0x0000-0x7fff的内容是一样的.(不要使用它)

  第0页的内存又叫Prom.是Ne2000兼容的网卡都有的.Prom实际上只有32字节,从地址
0x0000-0x0001F,其他地址0x0020-0x00ff存储的内容跟0x0000-0x001f是一样的,是重复的.
  地址0x0000-0x001f存储的内容:

地址 内容 地址 内容
0x0000 以太网地址第1个字节 0x0001 以太网地址第1个字节
0x0002 以太网地址第2个字节 0x0003 以太网地址第2个字节
0x0004 以太网地址第3个字节 0x0005 以太网地址第3个字节
0x0006 以太网地址第4个字节 0x0007 以太网地址第4个字节
0x0008 以太网地址第5个字节 0x0009 以太网地址第5个字节
0x000A 以太网地址第6个字节 0x000B 以太网地址第6个字节
0x000C-0x001F 其他内容(各公司的定义可能不同)    

  我们可以发现以太网地址被重复存储.主要是为了适应8位和16位的dma.(在16位的dma传输方式时,地址跟上面的定义不同.),我们一般使用8位的dma,一次传输一个字节,使用8条数据线.(而16位的dma是一次传输2个字节,需要16条数据线,适合使用16位的单片机或dsp).
  作为一个例子,在一块RTL8029AS网卡里读出的内容如下:
0x0000-0x001f:52525454ABAB3D3D8E8E2C2C545446464C4C49494E4E40402222202057575757
0x0020-0x003f:52525454ABAB3D3D8E8E2C2C545446464C4C49494E4E40402222202057575757
0x0040-0x005f:52525454ABAB3D3D8E8E2C2C545446464C4C49494E4E40402222202057575757
0x0060-0x007f:52525454ABAB3D3D8E8E2C2C545446464C4C49494E4E40402222202057575757
0x0080-0x009f:52525454ABAB3D3D8E8E2C2C545446464C4C49494E4E40402222202057575757
0x00a0-0x00bf:52525454ABAB3D3D8E8E2C2C545446464C4C49494E4E40402222202057575757
0x00c0-0x00df:52525454ABAB3D3D8E8E2C2C545446464C4C49494E4E40402222202057575757
0x00e0-0x00ff:52525454ABAB3D3D8E8E2C2C545446464C4C49494E4E40402222202057575757
  那么该网卡的地址是:5254AB3D8E2C,单地址和双地址的内容是重复的.一般使用偶数地址的内容.
  Prom是网卡在复位的时候从93C46里读出来的.如果你没有使用93C46,那么就不要使用Prom.
那么如何获得网卡的地址,有两种方法,一是直接读93C46,二是读Prom.
  网卡在工作的时候的网卡地址是由寄存器MAR0,MAR1,MAR2,MAR3,MAR4,MAR5决定,而不是93C46,也不是Prom. 而这几个寄存器的内容需要用户自己编写程序写入.一般可以读出Prom里的网卡地址,然后写入到这6个寄存器里.如果你没有使用93C46,那么Prom也是不可以使用的,这时要由你的程序自己指定一个网卡地址, 网卡地址不能跟别的网卡地址相同,写入到MAR0-MAR5里.
  例如使
MAR0=00
MAR1=00
MAR2=00
MAR3=00
MAR4=00
MAR5=08
  那么网卡的地址就是:
00:00:00:00:00:08
  所有发给00:00:00:00:00:08地址的数据包就可以被网卡收到.
发送数据包的时候你的程序也要使用MAR0-MAR5的值作为发送的源地址.

  0x4000-0x7fff共16k字节的ram是网卡接收和发送数据包用的.该16k字节的ram实际上是双端口的ram,可以同时被网卡读/写和用户读/写,相互之间不影响,网卡读/写比用户读写的优先级高,
  举个例子:
  假如网卡收到一个数据包,需要放到0x5000开始的缓冲区,那么需要写入第0x50页.
这时用户同时读取旧的数据包,该数据包放在0x4000开始的一段缓冲区,那么需要读第0x40页.
网卡优先,它先写入一个字节,然后才读取一个字节到ISA总线上.内部总线的速度很快,是20Mhz,
而ISA总线只有8Mhz, 网卡足够快进行同时读写数据,互不影响.


来源
老古网

欢迎技术探讨和发表评论