原创 嵌入式系统中常见的网卡驱动比较(CS8900A,RTL8019,DM9000)

2009-7-23 13:06 6113 9 13 分类: MCU/ 嵌入式

非常奇怪  我的这个文章没有了 重新补上。。。。


 


1.     CS<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />8900A<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


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


CS8900A还提供其它性能和配置选择.它独特的Packet Page结构可自动适应网络通信量模式的改变和现有系统资源,从而提高系统效率。


MCUCS8900A的数据传输有三种模式:I/O模式,存储器模式和DMA模式.本设计采用CS8900A默认的I/O模式,因为I/O模式简单易用. I/O模式下,通过访问816位的寄存器来访问PacketPage结构,8个寄存器被映射到2410地址空间的16个连续地址。当CS8900A上电后,寄存器默认的基址为0x300h


    电路连接如下:


  2e400932-8af4-4ce5-9f2d-a002cf9b28c5.JPG<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


CS8900AIO模式特点就是这个PacketPage结构,使用PacketPagePointerPacketPageData 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 支持16k32k,和64k 字节BROM 和闪存接口。它仍然提供页面模式功能,这种功能能支持在仅16k 字节内存系统空间下的4M 字节的BROM.


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


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



点击看大图


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


由于类似同意编址,而不像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自适应的PHY4K DWORD值的SRAM 。它的目的是在低功耗和高性能进程的3.3V5V的支持宽容。


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


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


DM9000读写操作,首先对DM9000正确寻址。AEN(地址允许)是输入引脚片选信号。SA4SA9是地址总线49,AEN低且SA9SA8,SA7SA6SA5SA4为低时,DM9000被选中。DM9000默认I/0基地址为300H


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


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


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


其中,高位片选地址由S3C2410NGCS3提供,即为:0X100000000H



3a1d5990-fa60-4559-b33e-ef3516559460.jpg


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


驱动关键如下:


读端口与写端口的宏


#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);       /* Power-Down PHY */


DM9000_iow(DM9000_IMR, 0x80); /* Disable all interrupt */


DM9000_iow(DM9000_RCR, 0x00);       /* Disable RX */


}


 


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


 


 

PARTNER CONTENT

文章评论4条评论)

登录后参与讨论

yupin1ger_144042119 2012-10-28 22:05

好文章

用户1166935 2011-8-26 11:52

我这儿有相关的资料,如有需要请联系我,nico721@21cn.com

用户795576 2011-4-2 11:08

NO.1 问:当包损失发生的问题,首先检查吗?    答:1。首先,请检查封包遗失,如果它是来自FIFO溢出 a、设置REG_05H。[4]= 0    b、REG_FFH 。[2]= 1    c、检查REG_FEH之REG_07H。[2]或[6:0]。  2。如果封包遗失,请从FIFO发生溢流量控制功能(环节实行合伙人也需要支持和执行流程控制功能)。   a、设置PHY_REG_04。[10]= 1    b、REG_09H = 0x38(请参阅数据)。   c、REG_0AH = 0x29     NO.2  问:当我们使用DM9000A,我们需要增加一个外部2.5V为CT pin 的磁场(变压器)吗    答:不,还有一个稳压电源,2.5V DM9000A 3.3V中,你可以使用这个AVDD25(Pin2和pin9直接连接的DM9000A)和CT销的Megnetic(变压器)。    NO.3 问:DM9000A使用8位模式是正常的,但一些错误的发生with16位模式。    答:请检查CMD pin的DM9000A连接到A2单片机一. 然后检查A0单片机是否适用于16位方式。如果A0是无济于事的16位模式、I / O基地的地址需要修改,2位.Show从4bit像下面的例子    0X0300/0X0304(使用A0)————————————————> 0x0300/0x0302(不使用A0)。    NO.4 问:ISR(FEH)Bit0将成为1(活跃/公关)吗?     答:是的    NO.5 问:将智力销活跃吗?     答:是的    NO.6 问:将所有的数据保存在RX缓存?     答:是的    NO.7 问:13Kbyte(RX缓存的大小是13312byte).如果用户需要接受超过2048byte包,Bit6:TJDIS ofTCR(02H)必须设置为1。    答:请把软(05H)bit6 = 1能收到超过2048字节(2k)数据的包。    NO.8 问:TX 缓存的大小是3Kbyte(3072byte).如果用户需要发送多于有2048字节(2K字节)包,Bit6:WTDIS软(06H),必须设置为1。   答:请把TCR设为(02H)Bit6 = 1,它能传递更多比有2048字节(2K字节)式的我公司有USB 2.0转网口芯片··DM9620/9621 `9685 HUB方案,提供完整底层驱动以及LAYOUT线路图资料,以及LAN DM9000 PHY DM9161等完整资料。如有任何问题可以探讨,QQ 1052710806```15814419344 黄先生··

用户1156376 2009-7-24 10:08

收一个,回头看看! 谢谢楼主
相关推荐阅读
用户539229 2010-01-23 22:52
vmware下debian5的安装配置以及vmtools的安装使用
一.安装vmware6.5.21.下载vmware6.5.2http://4.scdx3.crsky.com/software/vmware_652.rar2.下载vmware6.5.2汉化包http...
用户539229 2009-12-29 12:57
最新诺基亚Qt4.6的上下位机移植手记,触摸屏支持
一.PC for Winxp下的开发环境的搭建诺基亚收购Qt以后,开发了自己的集成开发环境Qt Creater。这是一个非常强大的工具,上手也很快。登陆:http://qt.nokia.com/dow...
用户539229 2009-12-11 20:14
Omap3evm下android开发第一例hello下位机运行实践
1.       驱动的安装<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 1.1...
用户539229 2009-12-09 19:01
android的windows下开发环境的搭建与hello第一例
Android的SDK的官方网址如下官方网址:http://androidappdocs.appspot.com/sdk/index.html<?xml:namespace prefix = o...
用户539229 2009-11-28 13:21
Omap3下Goole的Android操作系统的实现 相当于山寨智能机啦
首先要有一个:OMAP3EVM平台的开发板 我用的是OMAP35x的TI的评估板还要有一个SD卡 TI花了很大的功夫打造了OMAP3智能手机开发平台,给用户提供了SDK包,GDK包,以及双核的Davi...
用户539229 2009-11-08 19:50
OMAP35x下OneNand的分析以及x-loader的介绍
OMAP35x下OneNand的分析以及x-loader的介绍<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:...
EE直播间
更多
我要评论
4
9
关闭 站长推荐上一条 /3 下一条