宇诚
以太网络(Ethernet)控制芯片在电子设备日趋网络化的背景下,被广泛应用于各种嵌入式设备中。本文介绍以太网络控制器的结构,并结合嵌入式MPU或MCU,分析的其硬件和软件的设计。
嵌入式系统是网络控制芯片的新舞台
Internet硬件、软件的迅速发展,使得网络用户呈倍数增加。在使用通用处理器(GPU)进行上网的同时,各种家电设备、PDA、仪器仪表、工业生产中的数据采集与控制等设备正在逐渐地走向网络化,以便共享Internet中庞大的资源。而以太网络经过20年的发展,成为当今Internet中底层链接不可缺少的部分。 嵌入式设备的价格、体积及实时性等方面,在某些应用领域,尤其是网络化开发上有着标准处理器无法比拟的优点。在网络化开发的过程中,首先要解决的就是与以太网络的连接问题,亦即如何将通用处理器的网络连接装置(以太网络控制器)应用于嵌入式网络的开发。目前市面上有许多厂牌的以太网络控制芯片,可是其中大多耗电量高、功能复杂,不适用于价格低廉的嵌入式系统之中。因此,有必要在选择之前,仔细思考。
以太网络控制器简介
适用于嵌入式系统的以太网络控制器之性能,大致如下所述:
一、主要性能
● 适应于Ethernet II 、IEEE 802.3 、10Base5、10Base2、10BaseT;
● 支持8位、16位数据线;
● 全双工,收发可同时达到10Mbps的速率,具有休眠模式,以降低功耗;
● 内建16KB的SRAM,用于收发缓冲,降低对主处理器的速度要求;
● 可连接同轴电缆(BNC)和双绞线,并可自动检测所连接的媒介类型;
● 脚数少、封装简单,且可以缩小主机板尺寸。
二、内部架构
按数据链路的不同,可以将以太网络控制器内部划分为远程DMA(remote DMA)信道和本地DMA(local DMA)信道两个部分。本地DMA完成控制器与网络线的数据交换,主处理器(Host)收发数据只需对远程DMA操作。当主处理器要向以太网络发送数据时,先将一帧(frame)数据经过远程DMA信道,送到以太网络控制器中的发送缓存内存(Ring Buffer),然后发出传送命令。以太网络控制器在送出前一帧的数据后,继而完成此帧的发送。以太网络控制器接收到的数据通过MAC比较、CRC校验后,由FIFO存到接收缓冲区,收满一帧后,以中断或缓存器标志的方式通知主处理器。原理如(图一)所示。
图一 以太网络控制器的原理图
在图一中,接收逻辑在接收时脉的控制下,将串行数据组成字节送到FIFO和CRC;发送逻辑将FIFO送来的字节在发送时脉的控制下逐步按位移出,并送到CRC;CRC逻辑在接收时对输入的数据进行CRC校验,将结果与帧尾的CRC比较,如不同,该帧数据将被拒收,在发送时CRC对帧数据产生CRC,并附加在数据尾传送;地址识别逻辑对接收帧的目的地址与预先设置的本地实体地址进行比较,如不同且不满足广播地址(broadcast address)的设定要求,该帧数据将被拒收;FIFO逻辑对收发的数据作16个字节的缓冲,以减少对本地DMA请求的频率。
三、数据帧的组成
标准的IEEE 802.3数据帧由以下几个部分组成︰前导位(preamble)、帧起始位(SFD)、目的地地址(destination)、来源地址(source)、数据长度(length)、数据(data)、帧校验字(FCS)。如(图二)所示,数据字段的大小可从46B(Byte)到1,500B(Byte),如一组要传送的数据为46Byte,就用零补足;超过1500Byte时,需要拆成多个帧传送。 前导位、帧起始位和帧校验字仅供控制器本身用,主处理器收到的数据帧的组成依次包括︰接收状态(1Byte )、下一帧的页地址指针(1Byte)、目的地地址(6Byte)、来源地址(6Byte)、数据长度/帧类型(2Byte)、数据。数据长度/帧类型的值小于或等于1500Byte时,表示数据字段的长度;反之,表示数据帧的类型。如值依次为 0x08,0x00,表示数据为IP帧;值依次为0x08,0x06 ,表示数据为ARP帧。
图二 EEE802.3帧的组成
四、以太网络控制器的DMA操作
大多数传统的以太网络控制器是针对PC的总线线路设计的。如要将它们应用在嵌入式设备中,则需考虑其硬件和软件设计上的特殊性。嵌入式设备的主处理器可利用内存映像方法,将以太网络控制器内16个I/O地址上的缓存器映像到嵌入式操作系统来,这样就可以用程序来操控以太网络控制器。以太网络控制器的缓存器地址如(表一)所列。
表一 以太网络控制器之核心缓存器地址
以太网络控制器的DMA有两种:本地(local)DMA和远程(remote)DMA。本地DMA负责执行以太网络控制器内FIFO到SRAM缓冲存储器的数据收发;远程DMA与平时所说的DMA有点不同。
以太网络控制器的本地DMA操作是由控制器本身完成的,而其远程(remote)DMA并不是在无主处理器的参与下,数据能自动从缓冲存储器移到主处理器的内存中,它的操作机制是这样的︰主处理器先将适当值赋与romote DMA的起始地址缓存器RSAR0、RSAR1和字节计数器RBCR0、RBCR1,然后在以太网络控制器的DMA I/O地址上读写指定地址上的数据。local DMA则由TPSR、TBCR0、TBCR1三个缓存器来完成发送工作。
以太网络控制器内建的16KB SRAM可划分为接收缓冲和发送缓冲两个部分。缓冲以页(page)为单位,每页256个字节,16KB的SRAM的页范围规定在0x40~0x80,由PSTART 和PSTOP缓存器来设定接收缓冲页的范围。CURR指向接收到的帧的起始页,Boundary指向还未读取的帧之起始页(亦即下一帧的页地址)。当CURR到达了接收缓冲页的底部,即与PSTOP相等时,CURR又会自动指到PSTART处。因此,这16KB SRAM是设计成环状缓冲区,以达到可再使用的目的。与DMA有关的缓存器可区分成三大类,如(图三)所示,分别是:本地DMA发送缓存器、本地DMA接收缓存器、远程(收发)缓存器。图三对设计以太网络驱动程序者而言,是非常重要的,设计者必须先了解这些缓存器的功能,才能正确地对以太网络控制器编程。
图三 与DMA有关的缓存器
以太网络控制器的硬件电路设计
目前局域网络大多采用双绞线(UTP)为通信媒介。(图四)为MOTOROLA的龙珠(Dragonball)处理器MC68VZ328(以下简称VZ328)和RTL8019AS以太网络控制器的连接电路。RTL8019AS的工作电压为5V,而VZ328的工作电压为3.3V,所以RTL8019AS的输出需要电平的转换。 在图四中,此电压的转换由U2 74F163245 完成。读数据时,D[0:15]数据经U2 送到VZ328;写数据时,D[0:15]送到RTL8019AS。RTL8019AS在重置(reset)的上升沿锁定(latch)IOCS16脚的电平,其值决定数据总线的大小︰高电平时为16位,低电平时为8位。由于此RTL8019AS没有外接初始化的EPROM,所以在重置时,命令缓存器(CR)的I/O地址为内定(default)值0X300,所以,为满足RTL8019AS的ISA时序,A5~A19的连接必须使其地址锁定在0X300,否则,就无法撷取到RTL8019AS的缓存器。INT0中断脚经电平转换U4接到VZ328的IRQ6。VZ328以I/O方式撷取RTL8019AS,所以仅需要A[0:4]地址线、接高电平关闭其MEMORY方式。
图四 RTL8019AS与68VZ328连接电路
以太网络控制器的软件编程
对以太网络控制器的软件操作,是由查询(polling)和中断(interrupt)两种方式完成的。
在查询方式下,主程序通过CURR和Boundary两个缓存器的值来判断是否收到一个帧数据。当Boundary与CURR不等时,说明接收缓冲区接收到了新的帧,主程序从数据端口(data port)读取数据后,以读取帧的第二个字节(下一帧的页地址)更新Boundary,主程序循环跟踪CURR和Boundary直到数据被完全读取。
主程序在发送一个帧数据时,先要查看CR缓存器里面的TXP位是否为1,以判断上一个帧是否正在被发送;亦即,若发射机(transmitter)正在忙碌中,就不可发送下一个帧。如果TXP位为0,就依次向数据端口写入一个字节。
数据端口就是以太网络控制器里面的输出入通讯端口(I/O Port),要传到主机或来自主机的系统数据全部都在此数据埠里(在NE2000缓存器0x18~0x1F地址上)。亦即,此数据端口是内部系统收发数据的枢纽,而硬件收发器则是将以太网络数据传到FIFO中或将FIFO中的数据传到以太网络上,两者的功能不同,传输方向也不同,千万不可混淆。
在实时多任务的环境下,一般采用中断方式来处理以太网络控制器的收发,而中断方式又可区分成硬件和软件中断两种。当中断处理程序(ISR)响应以太网络控制器的中断时,在ISR的入口,根据读取到的中断状态缓存器(ISR)之值来确定程序的走向。
1.初始化
开机重置(power-on reset)信号接在以太网络控制器的重置接脚上,因此当开机后,以太网络控制器一直会处于重置状态,直到驱动程序发出开始命令(Start Command)为止。这可确保在初始化时,以太网络控制器不会收发任何封包,并顺利完成所有缓存器的初次设定。初始化完成后,在CR缓存器里的STA位会被设为1,促使以太网络控制器能够开始收发封包。本地DMA缓存器的初始化步骤如下所述:
(1) 硬件重置(hardware reset)。
(2) 进入第0页的CR(写入21h),此为软件重置。
(3) 对DCR初始化。
(4) 对RBCR初始化。
(5) 对RCR初始化。
(6) 将以太网络控制器置于回环模式(loopback mode),TCR=02h或04h。
(7) 接收缓冲区(receive buffer ring)初始化。包含BNDRY、PSTRAT、PSTOP、TPSR的初始化。
(8) 清除ISR的值(写入FFh)。
(9) 对IMR初始化。
(10) 进入第1页的CR(写入61h)。对PAR0~5、MAR0~7、CURR初始化。
(11) 将以太网络控制器置于开始模式(CR=22h)。
(12) 对TCR初始化(写入00h)。
(13) 将以太网络控制器置于第0页。
2.建立缓冲区(buffer ring)
缓冲存储器的基本单元是「页」(page),每页大小为256Bytes。目前最通用的网络卡驱动程序都是源自于Novell NE2000驱动程序,其作法是将接收缓冲区(Rx buffer ring)置于发送缓冲区(Tx buffer ring)之后,如(图五)所示。而且为了提高发送效率,特别使用两个发送缓冲区,每个发送缓冲区具有6页(1536Bytes),用以暂存一个完整的以太封包(ethernet packet)。TPSR指向发送缓冲区的起始页地址,这两个发送缓冲区里的数据是轮流被传送的;当一个发送页正在传送数据时,另一个发送页可以加载数据,等待下次发送。
图五
3. 驱动程序
从NE2000驱动程序(driver)的执行逻辑,就可以清楚了解以太网络控制器的运作原理。从软件设计的观点而言,因为以太网络控制器需处理主机系统数据和网络数据,所以,需要一个唯一且重要的主数据结构(data structure)来虚拟以太网络控制器,在此称之为snic,每个使用NE2000模式的以太网络控制器都需要此数据结构。这里所谓的「虚拟」(virtual),其实就是「编程」(programming),是由电子数字化后,所带来的好处。藉由数字化电路,就可以将任何硬件,当然包含以太网络控制器,虚拟为软件;也就是,能将大自然的物理性质或现象(硬件)比拟为人们可以操控的软件。snic应有的内部元素如下所示:
struct snic {
int iobase;
int pstart, pstop, wordlength, current_page;
nic_stat stat;
void (*notify)(packet_buffer *newpacket);
packet_buffer tx_packet[MAX_TX], *last_tx;
char busy, send, sending;
};
snic能够支持多个网络卡共同使用一个NE2000驱动程序,这只要对snic赋予不同的元素值即可。这也是因为「数字虚拟化」后,所带来的好处。在snic中,iobase是非常重要的,因为它是NE2000缓存器的基准地址(base address),NE2000全部的缓存器地址都是由它得出来的。在初始化时,必须赋予它正确的基准地址值,此值是由主机上的CPU和操作系统对周边装置所规划的,但是,在驱动程序中,必须以程序代码方式(hard code),明确地赋予,否则将无法正确地操控以太网络控制器。sinc的全部元素分别叙述如下:
● iobase - 网络控制器的基准地址。
● pstart - 循环缓冲区中的第一页地址。
● pstop - 循环缓冲区中的最后一页地址。
● wordlength - 若主系统总线为8位,则填入1,若为16位,则填入2。
● current_page - 在循环缓冲区中,目前接收页的地址。
● stat - 统计数据,唯一个次数据结构。
● notify - 是一个地址指针,指向「接收事件子程序」(receive event routine)。此子程序必须预先在主程序中注册,例如:使用nic_register_notify()来注册。当在循环缓冲区中的已接收数据被送到主机内存后,就可呼叫此「接收事件子程序」,通知上层软件立即处理这些数据。
● tx_packet[] - 是一个封包缓冲数组(array of packet buffers),用来传送封包。
● last_tx - 是一个指针,指向传送封包的缓冲地址。
● busy - 传送封包用的旗标(flag),若为1,表示目前正在传送中。
● send - 是传送封包缓冲数组(tx_packet[])里的索引值,用来表示目前的传送封包在缓冲数组里的排序。
● sending - 传送封包时,此值为1;反则为0。
在NE2000驱动程序之上,为具有拆解(segment)与组合(assemble)IP封包功能之程序,凡设计NE2000驱动程序的厂商都必须另设计一个IP层以上的简易测试程序,用来分析和检验其所开发出来的软硬件是否正确无误。一般的嵌入式操作系统虽然都具有完整的TCP/IP软件堆栈,但是若拿它来做测试,则移植(port)的工作量将会大增。所以,一般的以太网络卡、芯片设计业者大都只提供简单的IP层测试程序而已,移植到嵌入式操作系统的工作则交由他们的客户--最终产品(end product)开发商自行负责。
4. 接收流程
当中断服务程序发觉ISR缓存器之PRX或RXE值变为1时,表示已接收到一笔网络封包。此时,它会立即呼叫接收子程序,此子程序查询缓冲区地址,并确定RSR缓存器之PRX值为1,表示在接收封包时,并没有产生错误后,会在数据通讯端口处读出封包来,并将封包置于新建立的次数据结构packet_data中,最后,通知并交由上层IP软件来处理此封包。中断服务程序(Interrupt Service Routine;ISR)必须常驻于操作系统中。此外,因接收溢流(overflow)会将缓冲区中已接收的数据覆盖掉,所以,必须另设计一个子程序,它能在溢流发生时,可完善保护位于循环缓冲区中已被接收之数据。
5. 传送流程
传送流程比较复杂,简言之,有几个重要步骤: (1) IP层软件已准备好封包,并通知NE2000驱动程序。 (2) 将封包写入数据通讯端口处。 (3) 判断CR缓存器的TXP值是否为1,若为1,表示上一笔封包尚未传完,暂时不能传送此笔封包。若为0,则可以传送此笔封包。 (4) 在传送第一封包时,第二封包也会被准备好(步骤(1)),并写入数据通讯端口处(步骤(3))。一旦写入,就重复步骤(3)。 (5) 当中断服务程序发觉ISR缓存器之PTX值变为1时,表示第一封包已传送完毕,此时必须检查是否尚有第二笔封包要传送,若发现有封包需传送,则重复步骤(3)~ 步骤(5),直到全部封包都传完为止。 (6) 若中断服务程序发觉ISR缓存器之TXE值变为1时,表示传送时产生错误,此时呼叫重传子程序来判断错误状态,并决定是否要重传。
结语
以目前的技术市场而言,以太网络控制芯片的设计门槛已经不高,因为有许多辅助工具可资利用,可是适用于嵌入式系统、而且又整合目前常用的总线(PCI)和周边输出入接口(USB、PC Card)的以太网络控制芯片其实并不多,这正是国内厂商可以发挥的地方。
摘自 光纤新闻网
|