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

引自:http://blog.ednchina.com/gurongjiang/245620/message.aspx

今天我又看了一些文章,想看看具体DM9000和CS8900A有什么区别?在KITL移植的时候,怎么样才能才能把CS8900A换成 DM9000,因为我的KITL移植就卡在这里了,我的板子是DM9000驱动,我当然想在5.0到6.0的移植一步到位,可是在移植过程中由于是基于模 拟器进行移植的,默认的是CS8900A网卡驱动,导致KITL出错,具体怎么改呢?这是一个问题,先留在这里。先把我今天看的一篇文章留在这里!

 

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 );        /*  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). 接线最为简单只要一个地址线 + 一个片选线 .

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值