?? 8019driver.c
字號:
/*********************************************************************************
* 8019driver.C v1.00 8019驅動程序 *
* 版權(c) 2004- 北京百科融創科技有限公司 *
* 設計者: 趙治心 *
* 郵箱: ourui.wl@263.net *
**********************************************************************************/
//#include "tcp_ip.h"
#include <stdio.h>
#include "DataType.h"
#include "y13.h"
#include "8019head.h"
//#include "global.h"
extern unsigned int RevBuffer[500];
extern unsigned int RevLength;
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
/*
對網卡的復位端口的讀或寫將復位網卡,網卡內部將執行復位過程。讀寫是隨意的,
寫入任意的數都將復位網卡。
*/
void Reset8019()
{
int i;
i=ResetPort;//讀網卡的復位端口
ResetPort=i; //寫網卡的復位端口
for(i=0;i<3000;i++);
}
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
/*
從實驗當中也發現,只要再置位TXP位就可以重發該數據包(重發數據包時,不需要
設置TPSTART,TBCR0,TBCR1).
CR,command register:
位 7 6 5 4 3 2 1 0
名字 PS1 PS0 RD2 RD1 RD0 TXP STA STP
---PS1和PS0這兩個位用來選擇寄存器頁,PS1 PS0=00時選擇寄存器頁0,
=01時選擇寄存器頁1, =10時選擇寄存器頁2,=11時選擇寄存器頁3.
--RD2,RD1,RD0這3個位代表要執行的功能。
=001 讀網卡內存
=010 寫網卡內存
=011 發送網卡數據包
=1** 完成或結束DMA的讀寫操作
---TXP這個位寫入1時發送數據包,發完自動清零
---STA,STP這兩個位用來啟動命令或停止命令
=10 啟動命令
=01 停止命令
*/
void SetPage(int pagenumber)
{
int temp;
temp=CR;
temp=temp&0x003B; //注意不是0x3F ,TXP位在平時一定要置為0.
pagenumber=pagenumber<<6;
temp=temp|pagenumber;
CR=temp;
}
////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
int Test8019()
{
int ID,ID1;
// SetPage(0);
ID=(RTL8019ID0)&0x00ff;
ID1=(RTL8019ID1)&0x00ff;
ID=(RTL8019ID1<<8) | ID;
return ID;
}
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/*
PAR0,PAR1, PAR2, PAR3,PAR4,PAR5
這幾個寄存器是網卡的工作時候用的地址,只有符合這個地址的數據包才接收,
這個地址是可以設置為其他的值,不一定設置為網卡的物理地址,為了不跟別的
網卡地址沖突,最好設置為網卡的地址,(如果用戶需要設置為其他的值,也是可以的).
*/
void SetMACAdd()
{
SetPage(1);
PAR0=MAC_Addr[0];//sed_lclEthAddr[0]; //PAR0
PAR1=MAC_Addr[0];//sed_lclEthAddr[1]; //PAR1
PAR2=MAC_Addr[0];//sed_lclEthAddr[2]; //PAR2
PAR3=MAC_Addr[0];//sed_lclEthAddr[3]; //PAR3
PAR4=MAC_Addr[0];//sed_lclEthAddr[4]; //PAR4
PAR5=MAC_Addr[0];//sed_lclEthAddr[5]; //PAR5
SetPage(0);
}
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
/*
PSTART 接收緩沖區的起始頁的地址。
PSTOP 接收緩沖區的結束頁地址。(該頁不用于接收)
BNRY 指向最后一個已經讀取的頁(讀指針)
CURR 當前的接收結束頁地址。(寫指針)
--網卡含有16K字節的RAM,地址為0x4000-0x7fff(指的是網卡上的存儲地址,
而不是ISA總線的地址,是網卡工作用的存儲器),每256個字節稱為一頁,共有64頁。
頁的地址就是地址的高8位,頁地址為0x40--0x7f 。這16k的ram的一部分用來存放接收
的數據包,一部分用來存儲待發送的數據包。當然也可以給用戶使用。(例如把網卡
設置成使用8K的ram,另外8K的ram就可以用來給單片機作為存儲器,但我沒有這樣做,
原因是操作網卡上的ram比較復雜)
---在我的程序中使用0x40-0x4B為網卡的發送緩沖區,共12頁,剛好可以存儲2個
最大的以太網包。使用0x4c-0x7f為網卡的接收緩沖區,共52頁。因此PSTART=0x4c,
PSTOP=0x80(0x80為停止頁,就是直到0x7f,是接收緩沖區,不包括0x80) 剛開始,
網卡沒有接收到任何數據包,所以,BNRY設置為指向第一個接收緩沖區的頁0x4c)
這四個寄存器用于接收的設置。
--CURR是網卡寫內存的指針。它指向當前正在寫的頁的下一頁。那么初始化它就應
該指向0x4c+1=0x4d 。網卡寫完接收緩沖區一頁,就將這個頁地址加一,CURR=CURR+1。
這是網卡自動加的。當加到最后的空頁(這里是0x80,PSTOP)時,將CURR置為接收緩沖
區的第一頁(這里是0x4c,PSTART),也是網卡自動完成的。當CURR=BNRY時,表示緩沖
區全部被存滿,數據沒有被用戶讀走,這時網卡將停止往內存寫數據,新收到的數據包
將被丟棄不要,而不覆蓋舊的數據。此時實際上出現了內存溢出。
---而BNRR要由用戶來操作。用戶從網卡讀走一頁數據,要將BNRY加一,然后再寫
到BNRY寄存器。 當BNRY加到最后的空頁(0x80,PSTOP)時,同樣要將BNRY變成第一
個接收頁(PSTART,0x4c)BNRY=0x4c;
---CURR和BNRY主要用來控制緩沖區的存取過程,保證能順次寫入和讀出)。
當CURR=BNRY+1(或當BNRY=0x7f ,CURR=0x4c)時,網卡的接收緩沖區里沒有數據,
表示沒有收到數據包。 用戶通過這個判斷知道沒有包可以讀。當上述條件不成立時,
表示接收到新的數據包。然后用戶應該讀取數據包,直到上述條件成立時,表示所以
數據包已經讀完,此時停止讀取數據包。
--TPSR 為發送頁的起始頁地址。初始化為指向第一個發送緩沖區的頁,0x40。
--RCR 接收配置寄存器,設置為使用接收緩沖區,僅接收自己的地址的數據包
(以及廣播地址數據包)和多點播送地址包,小于64字節的包丟棄(這是協議的規定,
設置成接收是用于網絡分析),校驗錯的數據包不接收。
--TCR 發送配置寄存器,啟用crc自動生成和自動校驗,工作在正常模式。
--DCR 數據配置寄存器,設置為使用FIFO緩存,普通模式,16位數據傳輸模式,
字節順序為高位字節在前,低位字節在后(符合我們的習慣)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -