网卡驱动 (CS8900A,RTL8019,DM9000)

更新时间:2024-06-02 13:03:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1. CS8900A

CS8900芯片是Cirrus Logic公司生产的一种局域网处理芯片,在嵌入式领域中使用非常常见。它的封装是100-pin TQFP,内部集成了在片RAM、10BASE-T收发滤波器,并且提供8位和16位两种接口。CS8900与ARM芯片按照16位方式连接,网卡芯片复位后默认工作方式为I/O连接,基址是300H。

CS8900A还提供其它性能和配置选择.它独特的Packet Page结构可自动适应网络通信量模式的改变和现有系统资源,从而提高系统效率。 MCU与CS8900A的数据传输有三种模式:I/O模式,存储器模式和DMA模式.本设计采用CS8900A默认的I/O模式,因为I/O模式简单易用. 在I/O模式下,通过访问8个16位的寄存器来访问PacketPage结构,这8个寄存器被映射到2410地址空间的16个连续地址。当CS8900A上电后,寄存器默认的基址为0x300h。 电路连接如下:

CS8900A的IO模式特点就是这个PacketPage结构,使用PacketPagePointer和PacketPageData Port这两个寄存器对CS8900A的内部寄存器进行配置,非常方便。

#define CS8900_PPTR *(volatileCS8900_REG*) (CS8900_BASE+0x05*CS8900_OFF) //PacketPagePointer的定义

#define CS8900_PDATA *(volatile CS8900_REG *)(CS8900_BASE+0x06*CS8900_OFF) //PacketPageData Port

通过如下函数对cs8900a设置

get_reg(int regno) //32位模式,读寄存器的数据 {

CS8900_PPTR = regno; // regno为要读的寄存器偏移地址 return (unsigned short) CS8900_PDATA; //返回要读寄存器的数据

}

static void put_reg(int regno, unsigned short val) //写寄存器 {

CS8900_PPTR = regno;

CS8900_PDATA = val; //写寄存器 }

其中CS8900_BASE为基址与硬件连接有关。硬件原理图决定在S3C2410的地址空间中,CS8900A的基地址为x19000000。那么在I/O模式下,CS8900A的内部寄存器默认基地址为0x300h,在S3C2410的地址空间中的地址为0x19000300。

#define CS8900_BASE 0x19000300

完成以上,下面的驱动就非常好写了,用网卡挂起函数示例:

void eth_halt( void ) {

/* disable transmitter/receiver mode */

put_reg(PP_LineCTL, 0); //禁止网卡

/* \shutdown\to show ChipID or kernel wouldn't find he cs8900 ... */ get_reg_init_bus(PP_ChipID); }

2. rtl8019

RTL8019AS 是高度集成以太网控制器,为了提供完全解决即插即用方案,RTL8019AS 在集成10BASET 收发器,BNC,和AUI 接口之间的自动检测功能。此外,8 条IRQ 总线和16 条基本地址总线为大资源情况下提供了宽松的环境。

RTL8019AS 支持16k,32k,和64k 字节BROM 和闪存接口。它仍然提供页面模式功能,这种功能能支持在仅16k 字节内存系统空间下的4M 字节的BROM.

此外,BROM 的无用命令被用来释放BROM 内存空间。RTL8019AS 用16k 字节SRAM 设计在单片芯片上,它的设计不仅提供了更多友好的功能,而且节省了SRAM 存储资源。

RTL8019选择的端口I/O基地址为300H。它的地址偏移量共32个,用到的地址空间为300H-31FH,将地址线SA0-SA4与CPU的A0-A4连接,SA8-SA9接高电平,其余地址线接低。ARM的A22和nGCS3信号的连接,确定地址映射在系统的哪个Bank上,从而确定基地址。如若A22接SA8,nGCS3接SA5,那么寻址范围就是0x8340001F~0x83400000。

驱动特点是,对其寄存器的访问与CPU对自己内对存访问几乎一样。寄存器采用了分页技术,每页寄存器的便宜都是00~1F。这样使硬件连接简单。另外RTL8019有BROM接口,可以接非易失存储器,复位时可以读取其内部数据,十分方便。

由于类似同意编址,而不像CS8900A那样采用PacketPage结构,因此驱动写起来更加容易,但是多一个页确定函数: 寄存器配置函数:

static unsigned char get_reg (unsigned int regno) //得到寄存器的值 {

return (*(unsigned char *) regno); }

static void put_reg (unsigned int regno, unsigned char val) //给寄存器赋值 {

*(volatile unsigned char *) regno = val; }

页面切换方法:

put_reg (RTL8019_COMMAND, RTL8019_PAGE0);

网卡挂起函数示例:

void eth_halt (void) {

put_reg (RTL8019_COMMAND, 0x01); //挂起网卡 }

3. DM9000

该DM9000是一款完全集成的和符合成本效益单芯片快速以太网MAC控制器与一般处理接口,一个10/100M自适应的PHY和4K DWORD值的SRAM 。它的目的是在低功耗和高性能进程的3.3V与5V的支持宽容。

DM9000还提供了介质无关的接口,来连接所有提供支持介质无关接口功能的家用电话线网络设备或其他收发器。该DM9000支持8位, 16位和32 -位接口访问内部存储器,以支持不同的处理器。

随着其成本的降低和功能的强大越来越被广泛使用。

对DM9000读写操作,首先对DM9000正确寻址。AEN(地址允许)是输入引脚片选信号。SA4~SA9是地址总线4~9位,当AEN低且SA9和SA8高,而SA7、SA6、SA5、SA4为低时,则DM9000被选中。DM9000默认I/0基地址为300H。

CMD引脚用于设置COMMAND模式,CMD为高时,选择数据端口。CMD为低时,选地址端口。数据端口和地址端口的地址码由下式决定:

DM9000地址端口=高位片选地址+300H+0H

DM9000数据端口=高位片选地址+300H+4H

其中,高位片选地址由S3C2410的NGCS3提供,即为:0X100000000H。

驱动编写特点: 采用一个CMD信号来控制是对DM9000读还是写,架构非常简单,容易理解.有点类似CS8900A的PacketPage结构.

驱动关键如下:

读端口与写端口的宏

#define DM9000_outb(d,r) ( *(volatile u8 *)r = d ) #define DM9000_outw(d,r) ( *(volatile u16 *)r = d ) #define DM9000_outl(d,r) ( *(volatile u32 *)r = d ) #define DM9000_inb(r) (*(volatile u8 *)r) #define DM9000_inw(r) (*(volatile u16 *)r) #define DM9000_inl(r) (*(volatile u32 *)r)

配置寄存器的函数:

static u8

DM9000_ior(int reg) //读寄存器的值

{

DM9000_outb(reg, DM9000_IO); //类似cs8900a 把寄存器索引写道DM9000_IO return DM9000_inb(DM9000_DATA); //读取DM9000_DATA即是寄存器的数值 }

static void

DM9000_iow(int reg, u8 value) {

DM9000_outb(reg, DM9000_IO);

DM9000_outb(value, DM9000_DATA); //给寄存器赋值 }

其中DM9000_IO就是DM9000的基地址,由高位片选地址+300H+0H,CMD接了A2,所以DM9000_DATA就是DM9000_IO+4,即是高位片选地址

+300H+4H.

挂起函数示例

void

eth_halt(void) {

DM9000_iow(DM9000_GPR, 0x01); DM9000_iow(DM9000_IMR, 0x80); DM9000_iow(DM9000_RCR, 0x00); }

/* Power-Down PHY */ /* Disable all interrupt */ /* Disable RX */

总结:可以看出CS8900A的接线最为复杂需要将地址线全部接上,CS8900A支持内存模式和IO模式; rtl8019功能较CS8900A强大,提供了BROM接口,采用寄存器统一编址,驱动简单.接线相对简单只要若干根地址线;DM9000,功能最强大,自适应以太网速度(10M/100M).接线最为简单只要一个地址线+一个片选线.

这3个多月事情总是不怎么顺,其中之一是mcf52277的项目,其dm9000总是不正常,第一版是因为没有注意coldfire是大端处理器,导致原理图上52277和dm9000之间的16位数据总线高8位和低8位颠倒了,这个错误我以为是可以用软件修正的,但修正后仍然不是很正常,ping还比较正常,但tftp不行。 于是重做了一板,修正了大小端问题,但发现还是老问题,dm9000驱动看了N遍,研究生搞的有些没有信心了,各种可能都试了,还是不行。看来还是板子布线的问题可能性比较大,原先以为dm9000这种东西布线没有太多讲究,以前用别的以太网片子也没特别注意,一直很正常,可能dm9000比较娇气。

52277这个项目在开始评估的时候犯了重大错误,本来用52277来做的最大原因是它集成了lcd controller,但在真正开发过程中发现52277的引脚复用太厉害,导致同时能使用的模块其实很有限。这样,就大大削弱了它的功能,coldfire的稳定性是没得说,比samsung的arm强多了,但52277的成本没有多少优势,国内小批量的价格比s3c2440还要贵点。

52277另外一个不足是没有集成以太网控制器,本来以为外扩一个dm9000之类的片子就解决问题了,但后来发现一个问题,现在市面上能买到的几乎所有以太网控制器+PHY的芯片,都是商业级的,没有工业级的。dm9000也不例外。这样就严重影响了工业环境下的52277使用,如果用52277搭配一个dm9000去做,受限于dm9000的质量,整个系统也只能在商业级使用,这样的话coldfire的稳定性就白白浪费了,还不如用samsung的2410之类的做,成本更低。 以前很是不理解飞思卡尔众多芯片为什么要集成以太网控制器,当时我的理解是,要集成就把控制器和PHY全集成,要不集成就全不集成,完全外扩。当时的一个依据是,如dm9000这类集成了控制器和收发器的芯片价格非常便宜,如果你的soc只集成了个控制器,那么再外面单独再加一个PHY的成本跟dm9000差不多少。那还不如干脆不集成控制器。 但现在发现飞思卡尔集成控制器是非常有道理的,原因是你买不到工业级的同时集成控制器和收发器的单芯片。只能买到工业级的收发器芯片。顺便说下,台湾产的几乎所有以太网芯片,都是商业级的。这就是为什么很多工业产品,人家宁愿用很贵的DP82838I,也不用几块钱的RTL8201,原因是DP93948I虽然贵了好几倍,但它是工业级的,台湾产的PHY没有找到有工业级的。

现在关于52277项目变成了鸡肋,我的打算是把这个项目变成单纯的学技术的项目,学点技术,不再把它做成个产品,因为已经投入了不少钱,初步的想法是能尽量收回一点开发的成本,此项目就close掉。后续考虑其他型号来做个真正的产品级的东西出来。

另外一个很不顺的问题是团队建设问题,现在外部的大环境发生了变化,我个人觉得前途渺茫,培养一支过硬的团队的愿望变的越发渺茫。而没有团队,那么我们永远都不会有机会,唉,有时候我真怀疑我走错了路。下面要调整,在这种恶劣的大环境下,如何变通的尽量挽回败势,是要思考的问题。整体上说,我觉得我们这个大的集体是走到顶了,没有什么希望更上一层楼,除非有奇迹发生。现在的希望是尽量把自己的事情做好,期望转机的出现。

本文来源:https://www.bwwdw.com/article/v0q6.html

Top