ARM 学习 DM9000 网卡原理与基地址设置

一、

网卡也是属于类内存总线的设备,类内存总线的设备有地址总线和数据总线,先来看下DM9000的管脚:

ARM 学习 DM9000 网卡原理与基地址设置_第1张图片

从上面可以看出,DM9000 的地址总线就一根,它不像 CS8900 那样,地址总线和数据总线都齐全。而这里只有一根地址线(CMD),16 根数据线,所以可以确定位宽为 16 位,而地址线为什么只有一根,这是 DM9000 决定的。

看手册可以知道,CPU 总线只访问它的两个地址:CMD 管脚为 0 时,数据线送的是 DM9000 的寄存器地址,CMD 管脚为 1 时,数据线上送的是 16 位的寄存器数据,所以对 DM9000 的操作至少需要两步:先写地址,再写(读)数据。它不像其他类内存总线那样,直接把数据写到地址,传输一次就可以了,而它要传输两次,因为它的总线地址 退化成了类似于 NAND 的 ALE 信号,就是地址和数据的区分信号了,而不是 DM9000 里面操作的寄存器地址。

ARM 学习 DM9000 网卡原理与基地址设置_第2张图片


上面的片选信号为:nLAN_CS,链接到 S3C2440 的 CS4,对应 BANK4,所以基地址为 0X20000000。网上很多人讨论,为什么有的开发板基地址设置为 0X20000300,这个是没有任何作用的

之前分析了,DM9000 对于 CPU 的地址线只认识一根线,只要这根线对应的 CPU 传送的地址的对应位匹配就可以了,上面接到 LADDR2,也就是说:

传寄存器地址的时候,操作的总线地址满足:

以基地址起头(0x20000000),偏移基地址 LADDR2 为 0(低四位:0000,bit 2 为 0),也就是写的时候总线地址为:0x20000000。

传寄存器数据的时候,操作的总线地址满足:

以基地址起头(0x20000000),偏移基地址 LADDR2 为 1 (低四位:0100,bit 2 为 1),也就是写的时候总线地址为:0x20000004。

参考 uboot 中,DM9000 的驱动代码:

ARM 学习 DM9000 网卡原理与基地址设置_第3张图片


所以首先满足总线地址在 BANK4 里面(这样 CS4 才能自动选中),其次满足最后四位为 0(传送寄存器地址)或 4(传送数据)就可以了,满足这两个条件地址随便设。
所以上面 0x20000300 这个多出的 300H 没任何意义,他满足上面条件,你设置为 0x20000400,0x20000320,0x23456780这些地址都没任何影响。


上面分析知道了基地址,位宽,再简要说下中断引脚:

这里的 IRQ_LAN, 接的是 S3C2440 的 ENT7,用的外部中断 7,这个中断用于接收数据时触发的,中断服务函数处理接收数据,向协议层上报接收数据。这个中断号要和驱动里面的对应起来。

DM9000 移植的要点:

  1. 基地址(看 CS 接口)

  2. CPU 的寄存器设置:位宽,时序等设置

  3. 设置中断号(看中断接口)


二、

基地址的设置并不一定要 0x2000_0000,只要满足在一定范围内,让片选使能;然后 LADDR2 为 0 ,则表示 data 线上传输的是地址,LADDR2 为 1,表示 data 线上传输的是数据。

主控芯片上面发出的地址,只不过决定了 DM9000 是否被片选,且 ADDR2 决定了,是传输地址还是数据,仅此而已,而访问 DM9000 上某个寄存器所需的地址,是在数据线上传输的!!!!!!

		outb(DM9KS_VID_L, iobase); /* DM9000C的索引寄存器(cmd引脚为0) */		这里其实就是写 DM9KS_VID_L (0x28)这个值给DM9000,告诉他是地址(通过把ADDR2拉低的方式)
		id_val = inb(iobase + 4);  /* 读DM9000C的数据寄存器(cmd引脚为1) */	这里就是读取数据了(iobase + 4 表示传输的是数据),读出来到 id_val		这在第二个视频第二分钟的时候有讲到
		outb(DM9KS_VID_H, iobase);
		id_val |= inb(iobase + 4) << 8;
		outb(DM9KS_PID_L, iobase);
		id_val |= inb(iobase + 4) << 16;
		outb(DM9KS_PID_H, iobase);
		id_val |= inb(iobase + 4) << 24;

读 DM9000上的寄存器的步骤如下:

把要读取的寄存器地址写到“索引寄存器”里面,然后再读数据寄存器。(怎么分辨操作的是索引寄存器还是数据寄存器呢?通过 ADDR2 的状态来决定)

CMD 引脚一般都是接到主控的 ADDR2 引脚,包括 DM9000 的厂家程序也是默认如此,所以我们才不用改。如果我们不是把CMD 接到 ADDR2,而是 ADDR1,那 iobase +4 就得改成 iobase + 2 了,但一般没有硬件工程师这么干,而是参照芯片厂家给出的参考电路图去设计的,所以大多数的开发板也都把主控的 ADDR2 接到 DM9000 的 CMD 引脚。


参考链接

参考链接

你可能感兴趣的:(ARM,S5PV210,朱有鹏,ARM,linux,DM9000,单片机,uboot)