分享
 
 
 

SkyEye硬件模拟平台,硬件仿真实现之三

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

1. RTL8019AS网络芯片模拟的构思和设计概述

目前网络在嵌入式系统中应用越来越广泛,通过为SkyEye增加虚拟以太网芯片设备,使SkyEye支持ethernet网络接口模拟。这样在SkyEye硬件模拟平台上运行的操作系统能够与本地Linux主机进行网络通信,当然通过ipchains/iptables等包转发机制可以进一步支持直接跟Internet通信。

鉴于目前嵌入式设备中广泛使用了NE2K 10Base-T兼容网络芯片,其中RTL8019AS又是比较有代表性的一种,购买也比较方便,我们就决定模拟它。设计方案完全基于真实的RTL8019AS(NE2000兼容,简称8019AS),但做了部份简化。简化掉的部分主要包括:

一部分状态寄存器。主要是收发数据包的状态信息,一般在嵌入式系统中用的比较少,因此暂时没有加入模拟。

16位模式DMA。对NE2K的芯片,8位DMA和16位DMA模式仅在收发数据效率上不同,但这对SkyEye来说效率并不是很重要,所以仅模拟了8位DMA模式。

CPU从网络芯片收数据包的Remote DMA Read模式。由于8019AS提供了另一种更高效的Send Command方式来收数据包,所以为简化起见,没有模拟Remote DMA Read。

目前设计虚拟以太网芯片设备对简化的原则是:把虚拟网络芯片的驱动放到真实8019AS网络芯片上去,直接能用就可以了,目前还不能保证其它系统上的NE2K驱动能直接在SkyEye上用。

2. 虚拟8019AS网络芯片原理

SkyEye本身是一个硬件开发板的模拟器。虚拟8019AS网络芯片是虚拟开发板上一个相对独立的外部设备,这个设备有自己的内部数据结构和操作函数,完成相应的功能。但虚拟8019AS网络芯片对外的接口只是几个提供给SkyEye的API函数和它所占用的系统资源,如Memory map Io和IRQ等。网络芯片驱动程序看到的只是8019AS的寄存器和它占用的系统中断号,这些寄存器地址位于SkyEye模拟的开发板中某一段IO地址空间内,而SkyEye看到的是寄存器地址和虚拟8019AS网络芯片提供给SkyEye的API函数。假如运行在虚拟开发板上的网络芯片驱动程序读写这些寄存器地址,那么SkyEye会截获这些读写操作,并把它们转换成对虚拟8019AS网络芯片API接口nic_read和nic_write函数的调用,从而操作虚拟8019AS网络芯片,并收发数据。这个过程跟真实的硬件系统的逻辑操作是一致的。

那么SkyEye跟虚拟8019AS网络芯片交换数据包的同时,8019AS是如何跟主机进行通讯的呢?这是通过Host主机的Linux上安装的tun/tap或vnet虚拟网络接口来实现的。tun/tap和vnet是Linux内核中的一个内核模块,它们模拟了一个简单的点对点网络环境,后文会有进一步的说明。虚拟8019AS网络芯片的整体结构如图 0-1所示:

[[The No.1 Picture.]]

3. 虚拟8019AS网络芯片的内存结构

SkyEye模拟的虚拟8019AS网络芯片工作在8位模式下,网络芯片含有8K字节的RAM,地址为0x4000-0x5fff(指的是网络芯片上的存储地址,而不是ISA总线的地址,是网络芯片工作用的存储器),每256个字节称为一页,共有64页。页的地址就是地址的高8位,页地址为0x00--0xff 。

首先看一下0x40-0x5f页,这8k的ram的一部分用来存放接收的数据包,一部分用来存储待发送的数据包,具体由驱动编写者自己决定。(一般发包只要能容纳一个最大的以太网包就可以了,所以定义为0x40-0x45页,即0x4000-0x45ff,约1.5k。剩下的都用来收包)。按照8019AS硬件规范手册上的规定,8位工作模式下只能使用4000-5fff,16位模式才能用到6000-7fff的RAM,所以我们还是以手册为准。

[[The No.2 Picture.]]

再看一下第0页,也就是图 0 6中的PROM,PROM的内容是网络芯片在上电复位的时候从93C46里读出来的,其中0x00-0x0B(工作于8位DMA模式)用于存放本节点MAC地址,奇偶地址内容是重复放置的。如:MAC地址00 00 12 34 56 78存放在0x00-0x0B中为00 00 00 00 12 12 34 34 56 56 78 78,单地址和双地址的内容是重复的,一般使用偶数地址的内容,这主要是为了同时适应8位和16位的DMA。8019芯片外接一块93c46 eeprom,上电时自动从93c46里把MAC地址读入到PROM中,所以为虚拟网络芯片写驱动,只要在init函数中读PROM中的MAC地址,并写入工作寄存器PAR0-PAR5就可以了。网络芯片工作时的地址判定依据就是这几个寄存器,与PROM及93c46无关。PROM的其它地址不能使用。值得一提的是,虽然一般来说mac地址随便取一个就可以了,但要注重其最高字节不能是奇数,否则就是一个multicast mac地址,以后的应用中会有问题。

根据以上的分析,虚拟8019AS网络芯片要模拟的网络芯片内部RAM共两块:

0x0000-0x000B,12字节,页号为0x00。存放MAC地址

0x4000-0x5FFF,8192字节,页号为0x40-0x60(只用到0x5f,0x60为结束边界),用于存放收发的数据包缓冲,具体收发多少由驱动程序初始化决定。

以上两块内存都是网络芯片的内部数据,不在系统的地址空间内,实际上SkyEye模拟的CPU是看不到这两块内存的,只能通过读写寄存器间接访问。

4. 虚拟8019AS网络芯片的寄存器结构

在RTL8019AS或其它NE2k兼容的网络芯片中,软件对网络芯片内存的读写是通过一个数据寄存器(地址偏移0x10)进行的,方式是DMA,DMA的长度、起始地址等由控制寄存器决定。而DMA又分为Remote DMA和Local DMA,首先解释一下这两种DMA:

Local DMA

以太网网络芯片 RAM Remote DMA

网络芯片 RAMhost主机

Local DMA是网络芯片自动收发数据到/从网络芯片的RAM,而Remote DMA是CPU主动从网络芯片的RAM读写数据到/从CPU的RAM。具体的读写其实可以分为三种:

CPU读/写数据到网络芯片

控制方式是设置如下控制寄存器,它们分别为:

RBCR0,RBCR1:存放要读写数据的长度

RSAR0,RSAR1:存放数据在网络芯片RAM中存放的起始地址(而不是页号,但通常还是以某页的00为起始,如0x4000)

CR:向命令寄存器发出Remote DMA开始指令

然后就可以通过数据寄存器去读写数据了,宽度为8位。

网络芯片发数据到以太网

CPU把数据用Remote DMA 发到网络芯片后,就可以让网络芯片用Local DMA向外发数据了。

需要设置如下的控制寄存器,它们分别为:

TPSR :网络芯片要发送的数据在网络芯片RAM中的起始页号。所以发送的数据只能从某页的开头存放。

TBCR0,TBCR1:要发送的数据总长度

CR:向命令寄存器发出发送数据包的指令CMD_XMIT。

然后程序就可以返回了,网络芯片会自动用Local DMA发送数据包。

网络芯片从以太网读数据

网络芯片在从以太网读取数据过程中,会用到的寄存器如下:

PSTART,PSTOP:网络芯片接收数据缓冲区的起始和终止页号。形成一个接收缓冲环。每页256字节

CURR:接收缓冲环写页指针,初始化=PSTART

BNRY:接收缓冲环读页指针,初始化=PSTART

这四个寄存器在init函数里初始化,以后有数据包到来时,网络芯片自动判定是否发给本机,是则用Local DMA存入数据,并自动修改读写指针。

[[The No.3 Picture.]]

8019AS的寄存器地址为0x00-0x1f,有page 0-3共4页,每页都以0x00-0x0f访问,但实际访问的是不同的寄存器。page 3里的寄存器属于8019专用,不是NE2K标准,并且不常用,所以不模拟了。我们的寄存器共3页,页号为0-2。此外还有两个寄存器,不属于任何页:

0x10为DMA读写地址,CPU和网络芯片交换数据通过此地址

0x1F为Reset地址,向该地址写或读任何数都引起网络芯片复位,一般在初始化时将网络芯片复位一次,注重复位后要等待几十ms再进行下一步操作。

[[The No.4 Picture.]]

下面分别叙述虚拟8019AS网络芯片所模拟的各页中寄存器,如表 0 1所示。每个寄存器的各个bit位的具体含义可参考8019AS硬件规范手册,下面写出各寄存器的页内偏移地址,以及编写驱动时读写的常用值表示什么意思,有助于理解。每个寄存器的各种写入值可以以"或"的关系运算后写入,R表示只读,W表示只写,R/W表示可以读也可以写:

PAGE 0

CR控制命令寄存器:0x00,R/W。CR中各个bit位的含意如下:

CMD_STOP 0x01 网络芯片停止收发数据

CMD_RUN 0x02 网络芯片执行命令并开始收发数据包(命令为下面四种)

CMD_XMIT 0x04 Local DMA SEND(网络芯片??以太网 )

CMD_READ 0x08 Remote DMA READ,用于手动接收数据(网络芯片?CPU)

CMD_WRITE 0x10 Remote DMA WRITE (网络芯片

CMD_SEND 0x18 Send命令, 用于自动接收数据包(网络芯片??CPU)

CMD_NODMA 0x20 停止DMA操作

CMD_PAGE0 0x00 选择第0页(要先选页,再读写该页寄存器)

CMD_PAGE1 0x40 选择第1页

CMD_PAGE2 0x80 选择第2页

PSTART:0x01,W,接收缓冲环起始页

RECV_START 0x4600 接收缓冲起始地址(写入时要右移8位得到页号)

PSTOP:0x02,W,接收缓冲环终止页(不包括此页)

RECV_STOP 0x6000 接收缓冲结束地址(写入时要右移8位得到页号)

BNRY,0x03,R/W,接收缓冲环读指针

硬件初始化时,PSTART =CURR,以后用CMD_SEND 命令自动收数据包,网络芯片会自动调整这个寄存器的值。若接收出错,会重新调整成CURR的值。

TPSR,0x04,W,Local DMA发送缓冲起始页寄存器。

XMIT_START 0x4000 发送缓冲起始地址(写入时要右移8位得到页号)

TBCR0,0x05,W,Local DMA发送长度低位。

TBCR1,0x06,W,Local

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有