基于51單片機RTL8019AS的網卡驅動程序
SNMP網管板使用了RTL8019AS 10M ISA網卡芯片接入以太網。選它的好處是:NE2000兼容,軟件移植性好;接口簡單不用轉換芯片如PCI-ISA橋;價格便宜2.1$/片(我的購入價為22元RMB/片);帶寬充裕(針對51);較長一段時間內不會停產。8019有3種配置模式:跳線方式、即插即用PP方式、串行Flash配置方式。為了節省成本,我去掉了9346而使用X5045作為閃盤存儲MAC地址和其他可配置信息。PP模式用在PC機中,這里用不上。只剩下跳線配置模式可用,它的電路設計參考REALTEK提供的DEMO板圖紙。一天時間就可以完成,相對來說硬件設計比較簡單。
本文引用地址:http://www.j9360.com/article/172229.htm與這部分硬件相對應的軟件是網卡驅動。所謂驅動程序是指一組子程序,它們屏蔽了底層硬件處理細節,同時向上層軟件提供硬件無關接口。驅動程序可以寫成子程序嵌入到應用程序里(如DOS下的I/O端口操作和ISR),也可以放在動態鏈接庫里,用到的時候再動態調入以便節省內存。在WIN98中,為了使V86、WIN16、WIN32三種模式的應用程序共存,提出了虛擬機的概念,在CPU的配合下,系統工作在保護模式,OS接管了I/O、中斷、內存訪問,應用程序不能直接訪問硬件。這樣提高了系統可靠性和兼容性,也帶來了軟件編程復雜的問題。任何網卡驅動都要按VXD或WDM模式編寫,對于硬件一側要處理虛擬機操作、總線協議(如ISA、PCI)、即插即用、電源管理;上層軟件一側要實現NDIS規范。因此在WIN98下實現網卡驅動是一件相當復雜的事情。
我這里說的驅動程序特指實模式下的一組硬件芯片驅動子程序。從程序員的角度看,8019工作流程非常簡單,驅動程序將要發送的數據包按指定格式寫入芯片并啟動發送命令,8019會自動把數據包轉換成物理幀格式在物理信道上傳輸。反之,8019收到物理信號后將其還原成數據,按指定格式存放在芯片RAM中以便主機程序取用。簡言之就是8019完成數據包和電信號之間的相互轉換:數據包===>電信號。以太網協議由芯片硬件自動完成,對程序員透明。驅動程序有3種功能:芯片初始化、收包、發包。
以太網協議不止一種,我用的是802.3。它的幀結構如圖1所示。物理信道上的收發操作均使用這個幀格式。其中,前導序列、幀起始位、CRC校驗由硬件自動添加/刪除,與上層軟件無關。值得注意的是,收到的數據包格式并不是802.3幀的真子集,而是如圖2所示。明顯地,8019自動添加了“接收狀態、下一頁指針、以太網幀長度(以字節為單位)”三個數據成員(共4字節)。這些數據成員的引入方便了驅動程序的設計,體現了軟硬件互相配合協同工作的設計思路。當然,發送數據包的格式是802.3幀的真子集,如圖3所示。

有了收發包的格式,如何發送和接收數據包呢?如圖4所示,先將待發送的數據包存入芯片RAM,給出發送緩沖區首地址和數據包長度(寫入TPSR、TBCR0,1),啟動發送命令(CR=0x3E)即可實現8019發送功能。8019會自動按以太網協議完成發送并將結果寫入狀態寄存器。如圖5所示,接收緩沖區構成一個循環FIFO隊列,PSTART、PSTOP兩個寄存器限定了循環隊列的開始和結束頁,CURR為寫入指針,受芯片控制,BNRY為讀出指針,由主機程序控制。根據CURR==BNRY+1?可以判斷是否收到新的數據包,新收到的數據包按圖2格式存于以CURR指出的地址為首址的RAM中。當CURR==BNRY時芯片停止接收數據包。如果做過FPGA設計,用過VHDL,可以想象到硬件芯片的工作原理。此處,設計2個8bit寄存器和一個2輸入比較器,當收到數據包時,接收狀態機根據當前狀態和比較器結果決定下一個狀態,如果CURR=BNRY,進入停收狀態;反之,CURR按模增1。8019數據手冊沒有給出硬件狀態機實現方法,說明也很簡略,往往要通過作實驗的方法推理出工作過程。比如,ISR寄存器不只和中斷有關,當接收緩沖溢出時,如果不清ISR(寫入FFH),芯片將一直停止接收。在流量較大時溢出經常發生,此時不清ISR,就會導致網卡芯片死機。

明白了發送和接收數據包的原理,那么數據包又是怎樣被主機寫入芯片RAM和從芯片RAM讀出的呢?如圖6所示,主機設置好遠端DMA開始地址(RSAR0,1)和遠端DMA數據字節數(RBCR0,1),并在CR中設置讀/寫,就可以從遠端DMA口寄存器里讀出芯片RAM里的數據/把數據寫入芯片RAM。
何謂本地/遠端DMA呢?如圖7所示,“遠端”指CPU接口側;“本地”指8019的硬件收發電路側。沒有更深的意思,與遠近無關,僅僅為了區分主機和芯片硬件兩個接口端。這里的DMA與平時所說的DMA有點不同。RTL8019AS的local DMA操作是由控制器本身完成的,而其remote DMA并不是在無主處理器的參與下,數據能自動移到主處理器的內存中。remote DMA指主機CPU給出起址和長度就可以讀寫芯片RAM,每操作一次RAM地址自動加1。而普通RAM操作每次要先發地址再處理數據,速度較慢。
在一些高檔通信控制器上自帶有MAC控制器,工作原理與8019的差不多,比如:Motorola 68360/MPC860T內部的CPM帶有以太網處理器,通過設置BD表,使軟件和硬件協同工作,它的緩沖區更大且可靈活配置。這些通信控制器的設計,體現了軟硬件互相融合協同工作的趨勢:軟件硬化(VHDL),硬件軟化(DSP),希望大家關注!

如圖7所示,8019以太網控制器以存儲器(16K雙口RAM)為核心,本地和遠端控制器并發操作。這種體系結構滿足了數據帶寬的需要。8019擁有控制、狀態、數據寄存器,通過它們,51單片機可以與8019通信。由于51資源緊張,在實現TCPIP協議棧時不要進行內存塊拷貝,建議(1)使用全局結構體變量,在內存中只保存一個數據包拷貝,其他沒有來得及處理的包保存在8019的16K RAM里;(2)使用查詢方式而不用中斷;(3)客戶服務器模型中服務器工作于串行方式,并發模式不適合51單片機。
芯片內部地址空間的分配如圖8所示,其中0x00-0x0B(工作于8位DMA模式)用于存放本節點MAC地址,奇偶地址內容是重復放置的。如:MAC地址0000 1234 5678存放在0x00-0x0B中為000000001212343456567878,單地址和雙地址的內容是重復的.一般使用偶數地址的內容,這主要是為了同時適應8位和16位的dma。Prom內容是網卡在上電復位的時候從93C46里讀出來的。如果你沒有使用93C46,就不要使用Prom,那么使用了93C46后如何獲得網卡的地址呢?有兩種方法,一是直接讀93C46,二是讀Prom。網卡MAC地址既不由93C46也不由Prom決定,而是由PAR0-PAR5寄存器決定。Prom只保存上電時從9346中讀出的MAC地址(如果有93C46的話),僅此而矣。


評論