国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 網(wǎng)絡(luò)通信 > 正文

SkyEye硬件模擬平臺,硬件仿真實(shí)現(xiàn)之三

2019-11-04 12:29:18
字體:
供稿:網(wǎng)友

  1. RTL8019AS網(wǎng)絡(luò)芯片模擬的構(gòu)思和設(shè)計(jì)概述
  目前網(wǎng)絡(luò)在嵌入式系統(tǒng)中應(yīng)用越來越廣泛,通過為SkyEye增加虛擬以太網(wǎng)芯片設(shè)備,使SkyEye支持ethernet網(wǎng)絡(luò)接口模擬。這樣在SkyEye硬件模擬平臺上運(yùn)行的操作系統(tǒng)能夠與本地linux主機(jī)進(jìn)行網(wǎng)絡(luò)通信,當(dāng)然通過ipchains/iptables等包轉(zhuǎn)發(fā)機(jī)制可以進(jìn)一步支持直接跟Internet通信。
  
  鑒于目前嵌入式設(shè)備中廣泛使用了NE2K 10Base-T兼容網(wǎng)絡(luò)芯片,其中RTL8019AS又是比較有代表性的一種,購買也比較方便,我們就決定模擬它。設(shè)計(jì)方案完全基于真實(shí)的RTL8019AS(NE2000兼容,簡稱8019AS),但做了部份簡化。簡化掉的部分主要包括:
  
  一部分狀態(tài)寄存器。主要是收發(fā)數(shù)據(jù)包的狀態(tài)信息,一般在嵌入式系統(tǒng)中用的比較少,因此暫時沒有加入模擬。
  16位模式DMA。對NE2K的芯片,8位DMA和16位DMA模式僅在收發(fā)數(shù)據(jù)效率上不同,但這對SkyEye來說效率并不是很重要,所以僅模擬了8位DMA模式。
  CPU從網(wǎng)絡(luò)芯片收數(shù)據(jù)包的Remote DMA Read模式。由于8019AS提供了另一種更高效的Send Command方式來收數(shù)據(jù)包,所以為簡化起見,沒有模擬Remote DMA Read。
  目前設(shè)計(jì)虛擬以太網(wǎng)芯片設(shè)備對簡化的原則是:把虛擬網(wǎng)絡(luò)芯片的驅(qū)動放到真實(shí)8019AS網(wǎng)絡(luò)芯片上去,直接能用就可以了,目前還不能保證其它系統(tǒng)上的NE2K驅(qū)動能直接在SkyEye上用。
  
  2. 虛擬8019AS網(wǎng)絡(luò)芯片原理
  SkyEye本身是一個硬件開發(fā)板的模擬器。虛擬8019AS網(wǎng)絡(luò)芯片是虛擬開發(fā)板上一個相對獨(dú)立的外部設(shè)備,這個設(shè)備有自己的內(nèi)部數(shù)據(jù)結(jié)構(gòu)和操作函數(shù),完成相應(yīng)的功能。但虛擬8019AS網(wǎng)絡(luò)芯片對外的接口只是幾個提供給SkyEye的API函數(shù)和它所占用的系統(tǒng)資源,如Memory map Io和IRQ等。網(wǎng)絡(luò)芯片驅(qū)動程序看到的只是8019AS的寄存器和它占用的系統(tǒng)中斷號,這些寄存器地址位于SkyEye模擬的開發(fā)板中某一段IO地址空間內(nèi),而SkyEye看到的是寄存器地址和虛擬8019AS網(wǎng)絡(luò)芯片提供給SkyEye的API函數(shù)。假如運(yùn)行在虛擬開發(fā)板上的網(wǎng)絡(luò)芯片驅(qū)動程序讀寫這些寄存器地址,那么SkyEye會截獲這些讀寫操作,并把它們轉(zhuǎn)換成對虛擬8019AS網(wǎng)絡(luò)芯片API接口nic_read和nic_write函數(shù)的調(diào)用,從而操作虛擬8019AS網(wǎng)絡(luò)芯片,并收發(fā)數(shù)據(jù)。這個過程跟真實(shí)的硬件系統(tǒng)的邏輯操作是一致的。
  
  那么SkyEye跟虛擬8019AS網(wǎng)絡(luò)芯片交換數(shù)據(jù)包的同時,8019AS是如何跟主機(jī)進(jìn)行通訊的呢?這是通過Host主機(jī)的Linux上安裝的tun/tap或vnet虛擬網(wǎng)絡(luò)接口來實(shí)現(xiàn)的。tun/tap和vnet是Linux內(nèi)核中的一個內(nèi)核模塊,它們模擬了一個簡單的點(diǎn)對點(diǎn)網(wǎng)絡(luò)環(huán)境,后文會有進(jìn)一步的說明。虛擬8019AS網(wǎng)絡(luò)芯片的整體結(jié)構(gòu)如圖 0-1所示:
  
  
[[The No.1 Picture.]]

  3. 虛擬8019AS網(wǎng)絡(luò)芯片的內(nèi)存結(jié)構(gòu)
  SkyEye模擬的虛擬8019AS網(wǎng)絡(luò)芯片工作在8位模式下,網(wǎng)絡(luò)芯片含有8K字節(jié)的RAM,地址為0x4000-0x5fff(指的是網(wǎng)絡(luò)芯片上的存儲地址,而不是ISA總線的地址,是網(wǎng)絡(luò)芯片工作用的存儲器),每256個字節(jié)稱為一頁,共有64頁。頁的地址就是地址的高8位,頁地址為0x00--0xff 。
  
  首先看一下0x40-0x5f頁,這8k的ram的一部分用來存放接收的數(shù)據(jù)包,一部分用來存儲待發(fā)送的數(shù)據(jù)包,具體由驅(qū)動編寫者自己決定。(一般發(fā)包只要能容納一個最大的以太網(wǎng)包就可以了,所以定義為0x40-0x45頁,即0x4000-0x45ff,約1.5k。剩下的都用來收包)。按照8019AS硬件規(guī)范手冊上的規(guī)定,8位工作模式下只能使用4000-5fff,16位模式才能用到6000-7fff的RAM,所以我們還是以手冊為準(zhǔn)。
  
  
[[The No.2 Picture.]]

  再看一下第0頁,也就是圖 0 6中的PROM,PROM的內(nèi)容是網(wǎng)絡(luò)芯片在上電復(fù)位的時候從93C46里讀出來的,其中0x00-0x0B(工作于8位DMA模式)用于存放本節(jié)點(diǎn)MAC地址,奇偶地址內(nèi)容是重復(fù)放置的。如:MAC地址00 00 12 34 56 78存放在0x00-0x0B中為00 00 00 00 12 12 34 34 56 56 78 78,單地址和雙地址的內(nèi)容是重復(fù)的,一般使用偶數(shù)地址的內(nèi)容,這主要是為了同時適應(yīng)8位和16位的DMA。8019芯片外接一塊93c46 eeprom,上電時自動從93c46里把MAC地址讀入到PROM中,所以為虛擬網(wǎng)絡(luò)芯片寫驅(qū)動,只要在init函數(shù)中讀PROM中的MAC地址,并寫入工作寄存器PAR0-PAR5就可以了。網(wǎng)絡(luò)芯片工作時的地址判定依據(jù)就是這幾個寄存器,與PROM及93c46無關(guān)。PROM的其它地址不能使用。值得一提的是,雖然一般來說mac地址隨便取一個就可以了,但要注重其最高字節(jié)不能是奇數(shù),否則就是一個multicast mac地址,以后的應(yīng)用中會有問題。
  
  根據(jù)以上的分析,虛擬8019AS網(wǎng)絡(luò)芯片要模擬的網(wǎng)絡(luò)芯片內(nèi)部RAM共兩塊:
  
  0x0000-0x000B,12字節(jié),頁號為0x00。存放MAC地址
  
  0x4000-0x5FFF,8192字節(jié),頁號為0x40-0x60(只用到0x5f,0x60為結(jié)束邊界),用于存放收發(fā)的數(shù)據(jù)包緩沖,具體收發(fā)多少由驅(qū)動程序初始化決定。
  
  以上兩塊內(nèi)存都是網(wǎng)絡(luò)芯片的內(nèi)部數(shù)據(jù),不在系統(tǒng)的地址空間內(nèi),實(shí)際上SkyEye模擬的CPU是看不到這兩塊內(nèi)存的,只能通過讀寫寄存器間接訪問。
  
  4. 虛擬8019AS網(wǎng)絡(luò)芯片的寄存器結(jié)構(gòu)
  在RTL8019AS或其它NE2k兼容的網(wǎng)絡(luò)芯片中,軟件對網(wǎng)絡(luò)芯片內(nèi)存的讀寫是通過一個數(shù)據(jù)寄存器(地址偏移0x10)進(jìn)行的,方式是DMA,DMA的長度、起始地址等由控制寄存器決定。而DMA又分為Remote DMA和Local DMA,首先解釋一下這兩種DMA:
  
  Local DMA
  以太網(wǎng)網(wǎng)絡(luò)芯片 RAM Remote DMA
  網(wǎng)絡(luò)芯片 RAMhost主機(jī)
  
  Local DMA是網(wǎng)絡(luò)芯片自動收發(fā)數(shù)據(jù)到/從網(wǎng)絡(luò)芯片的RAM,而Remote DMA是CPU主動從網(wǎng)絡(luò)芯片的RAM讀寫數(shù)據(jù)到/從CPU的RAM。具體的讀寫其實(shí)可以分為三種:
  
  CPU讀/寫數(shù)據(jù)到網(wǎng)絡(luò)芯片
  控制方式是設(shè)置如下控制寄存器,它們分別為:
  RBCR0,RBCR1:存放要讀寫數(shù)據(jù)的長度
  RSAR0,RSAR1:存放數(shù)據(jù)在網(wǎng)絡(luò)芯片RAM中存放的起始地址(而不是頁號,但通常還是以某頁的00為起始,如0x4000)
  CR:向命令寄存器發(fā)出Remote DMA開始指令
  
  然后就可以通過數(shù)據(jù)寄存器去讀寫數(shù)據(jù)了,寬度為8位。
  網(wǎng)絡(luò)芯片發(fā)數(shù)據(jù)到以太網(wǎng)
  CPU把數(shù)據(jù)用Remote DMA 發(fā)到網(wǎng)絡(luò)芯片后,就可以讓網(wǎng)絡(luò)芯片用Local DMA向外發(fā)數(shù)據(jù)了。
  需要設(shè)置如下的控制寄存器,它們分別為:
  
  TPSR :網(wǎng)絡(luò)芯片要發(fā)送的數(shù)據(jù)在網(wǎng)絡(luò)芯片RAM中的起始頁號。所以發(fā)送的數(shù)據(jù)只能從某頁的開頭存放。
  TBCR0,TBCR1:要發(fā)送的數(shù)據(jù)總長度
  CR:向命令寄存器發(fā)出發(fā)送數(shù)據(jù)包的指令CMD_XMIT。
  
  然后程序就可以返回了,網(wǎng)絡(luò)芯片會自動用Local DMA發(fā)送數(shù)據(jù)包。
  網(wǎng)絡(luò)芯片從以太網(wǎng)讀數(shù)據(jù)
  網(wǎng)絡(luò)芯片在從以太網(wǎng)讀取數(shù)據(jù)過程中,會用到的寄存器如下:
  
  PSTART,PSTOP:網(wǎng)絡(luò)芯片接收數(shù)據(jù)緩沖區(qū)的起始和終止頁號。形成一個接收緩沖環(huán)。每頁256字節(jié)
  CURR:接收緩沖環(huán)寫頁指針,初始化=PSTART
  BNRY:接收緩沖環(huán)讀頁指針,初始化=PSTART
  這四個寄存器在init函數(shù)里初始化,以后有數(shù)據(jù)包到來時,網(wǎng)絡(luò)芯片自動判定是否發(fā)給本機(jī),是則用Local DMA存入數(shù)據(jù),并自動修改讀寫指針。
  
  
[[The No.3 Picture.]]

  8019AS的寄存器地址為0x00-0x1f,有page 0-3共4頁,每頁都以0x00-0x0f訪問,但實(shí)際訪問的是不同的寄存器。page 3里的寄存器屬于8019專用,不是NE2K標(biāo)準(zhǔn),并且不常用,所以不模擬了。我們的寄存器共3頁,頁號為0-2。此外還有兩個寄存器,不屬于任何頁:
  
  0x10為DMA讀寫地址,CPU和網(wǎng)絡(luò)芯片交換數(shù)據(jù)通過此地址
  0x1F為Reset地址,向該地址寫或讀任何數(shù)都引起網(wǎng)絡(luò)芯片復(fù)位,一般在初始化時將網(wǎng)絡(luò)芯片復(fù)位一次,注重復(fù)位后要等待幾十ms再進(jìn)行下一步操作。
  
  
[[The No.4 Picture.]]

  下面分別敘述虛擬8019AS網(wǎng)絡(luò)芯片所模擬的各頁中寄存器,如表 0 1所示。每個寄存器的各個bit位的具體含義可參考8019AS硬件規(guī)范手冊,下面寫出各寄存器的頁內(nèi)偏移地址,以及編寫驅(qū)動時讀寫的常用值表示什么意思,有助于理解。每個寄存器的各種寫入值可以以"或"的關(guān)系運(yùn)算后寫入,R表示只讀,W表示只寫,R/W表示可以讀也可以寫:
  
  PAGE 0
  CR控制命令寄存器:0x00,R/W。CR中各個bit位的含意如下:
  CMD_STOP 0x01 網(wǎng)絡(luò)芯片停止收發(fā)數(shù)據(jù)
  CMD_RUN 0x02 網(wǎng)絡(luò)芯片執(zhí)行命令并開始收發(fā)數(shù)據(jù)包(命令為下面四種)
  CMD_XMIT 0x04 Local DMA SEND(網(wǎng)絡(luò)芯片??>以太網(wǎng) )
  CMD_READ 0x08 Remote DMA READ,用于手動接收數(shù)據(jù)(網(wǎng)絡(luò)芯片?>CPU)
  CMD_WRITE 0x10 Remote DMA WRITE (網(wǎng)絡(luò)芯片  CMD_SEND 0x18 Send命令, 用于自動接收數(shù)據(jù)包(網(wǎng)絡(luò)芯片??>CPU)
  CMD_NODMA 0x20 停止DMA操作
  CMD_PAGE0 0x00 選擇第0頁(要先選頁,再讀寫該頁寄存器)
  CMD_PAGE1 0x40 選擇第1頁
  CMD_PAGE2 0x80 選擇第2頁
  PSTART:0x01,W,接收緩沖環(huán)起始頁
  RECV_START 0x4600 接收緩沖起始地址(寫入時要右移8位得到頁號)
  PSTOP:0x02,W,接收緩沖環(huán)終止頁(不包括此頁)
  RECV_STOP 0x6000 接收緩沖結(jié)束地址(寫入時要右移8位得到頁號)
  BNRY,0x03,R/W,接收緩沖環(huán)讀指針
  硬件初始化時,PSTART =CURR,以后用CMD_SEND 命令自動收數(shù)據(jù)包,網(wǎng)絡(luò)芯片會自動調(diào)整這個寄存器的值。若接收出錯,會重新調(diào)整成CURR的值。
  TPSR,0x04,W,Local DMA發(fā)送緩沖起始頁寄存器。
  XMIT_START 0x4000 發(fā)送緩沖起始地址(寫入時要右移8位得到頁號)
  TBCR0,0x05,W,Local DMA發(fā)送長度低位。
  TBCR1,0x06,W,Local


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 汕头市| 长垣县| 江山市| 周口市| 宿松县| 克什克腾旗| 元阳县| 宁蒗| 衡南县| 嘉定区| 锡林浩特市| 信宜市| 安阳县| 永平县| 怀仁县| 蒙阴县| 苏尼特右旗| 湘潭县| 威远县| 塔河县| 定襄县| 二连浩特市| 库伦旗| 清水县| 云南省| 嘉鱼县| 湘潭县| 札达县| 南靖县| 汉寿县| 溧水县| 平果县| 枞阳县| 阳江市| 高尔夫| 溧水县| 安康市| 唐山市| 兴仁县| 阿城市| 阿拉尔市|