账号:
密码:
最新动态
产业快讯
CTIMES / 文章 /
嵌入式乙太网路控制晶片技术介绍
 

【作者: 宇誠】2002年05月05日 星期日

浏览人次:【10674】

嵌入式系统是网路控制晶片的新舞台

Internet硬体、软体的迅速发展,使得网路用户呈倍数增加。在使用通用处理器(GPU)进行上网的同时,各种家电设备、PDA、仪器仪表、工业生产中的数据采集与控制等设备正在逐渐地走向网路化,以便共享Internet中庞大的资源。而乙太网路经过20年的发展,成为当今Internet中底层链接不可缺少的部分。


嵌入式设备的价格、体积及即时性等方面,在某些应用领域,尤其是网路化开发上有着标准处理器无法比拟的优点。在网路化开发的过程中,首先要解决的就是与乙太网路的连接问题,亦即如何将通用处理器的网路连接装置(乙太网路控制器)应用于嵌入式网路的开发。目前市面上有许多厂牌的乙太网路控制晶片,可是其中大多耗电量高、功能复杂,不适用于价格低廉的嵌入式系统之中。因此,有必要在选择之前,仔细思考。


乙太网路控制器简介

适用于嵌入式系统的乙太网路控制器之性能,大致如下所述:


一、主要性能

● 适应于Ethernet II 、IEEE 802.3 、10Base5、10Base2、10Base T;


● 支援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讯框的组成》
《图二 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有关的缓存器》
《图三 与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连接电路》
《图四 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页的C(写入61h)。对PAR0~5、MAR0~7、CURR初始化。


(11) 将乙太网路控制器置于开始模式(CR=22h)。


(12) 对TCR初始化(写入00h)。


(13) 将乙太网路控制器置于第0页。


建立缓冲区(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 - 循环缓冲区中的最后一页位址。


  • ● word length - 若主系统汇流排为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暂存器的TCP值是否为1,若为1,表示上一笔封包尚未传完,暂时不能传送此笔封包。若为0,则可以传送此笔封包。


(4) 在传送第一封包时,第二封包也会被准备好(步骤(1)),并写入数据通讯埠处(步骤(3))。一旦写入,就重覆步骤(3)。


(5) 当中断服务程式发觉ISR暂存器之PTX值变为1时,表示第一封包已传送完毕,此时必须检查是否尚有第二笔封包要传送,若发现有封包需传送,则重覆步骤(3)~ 步骤(5),直到全部封包都传完为止。


(6) 若中断服务程式发觉ISR暂存器之TXE值变为1时,表示传送时产生错误,此时呼叫重传子程式来判断错误状态,并决定是否要重传。


结语

以目前的技术市场而言,乙太网路控制晶片的设计门槛已经不高,因为有许多辅助工具可资利用,可是适用于嵌入式系统、而且又整合目前常用的汇流排(PCI)和周边输出入介面(USB、PC Card)的乙太网路控制晶片其实并不多,这正是国内业者可以发挥的地方。


相关文章
极速巅峰-Gigabit Ethernet
企业重生应回归核心商业机制
企业导入1Gbps乙太网路须知
新一代 DSL初探
实现超迷你型网路主机之梦想
comments powered by Disqus
相关讨论
  相关新闻
» 爱德万测试与东丽签订Micro LED显示屏制造战略夥伴关系
» 格斯科技携手生态系夥伴产学合作 推出油电转纯电示范车
» Arm:因应AI永无止尽的能源需求 推动AI资料中心工作负载
» 英特尔晶圆代工完成商用高数值孔径极紫外光微影设备组装
» 联发科技签署绿电合约 大步迈向净零里程碑


刊登廣告 新聞信箱 读者信箱 著作權聲明 隱私權聲明 本站介紹

Copyright ©1999-2024 远播信息股份有限公司版权所有 Powered by O3  v3.20.1.HK84P9BQCX4STACUKZ
地址:台北数位产业园区(digiBlock Taipei) 103台北市大同区承德路三段287-2号A栋204室
电话 (02)2585-5526 #0 转接至总机 /  E-Mail: webmaster@ctimes.com.tw