?? rtl8019.c
字號:
#include "GloblDef.h"
#include "MMenage.h"
#include "RTL8019.h"
extern BYTE MemAllocation(WORD size);
extern void FreePage(BYTE page);
extern BYTE xdata *MemPageToPoint(BYTE page);
extern BYTE WriteQueue(BYTE page,struct Queue xdata * pQueue);
BYTE xdata LocalMACAddr[6]={0x52,0x54,0x4c,0x30,0x2e,0x2f};
struct Queue xdata QueueNetPacketIn;
BYTE StartPageOfPacket;
/* 接收頭文件信息 */
struct RTLReceiveHeader
{
BYTE ReceiveStatus;
BYTE NextPacketStartPage;
BYTE PacketSizeLow;
BYTE PacketSizeHigh;
}Head; Head 須為全局變量.
BYTE xdata Head[4];
/* 上一次傳輸起始頁*/
BYTE LastSendStartPage;
sbit RTLResetPin = RTL_RESET_PIN;
/* 讀rtl8019 寄存器端口*/
BYTE ReadReg(WORD port)
{
BYTE xdata * p;
p = (BYTE xdata *)port;
return *p;
}
/* 寫寄存器*/
void WriteReg(WORD port,BYTE value)
{
BYTE xdata * p;
p = (BYTE xdata *)port;
*p = value;
}
/* 選擇寄存器頁使用*/
void RTLPage(BYTE Index)
{
/* 設置 CR, CR_TXP 7-6位為 0(為 1 ,包重傳) */
BYTE temp;
temp = ReadReg(CR);
temp = temp & 0x3B; /*set 7-6 and 3 bit to 0*/
Index = Index<<6;
temp = temp | Index;
WriteReg(CR,temp);
}
/* PRA 為物理地址 */
void RTLInitial()
{
BYTE temp;
int i;
/* 硬件重啟 */
RTLResetPin = 1;
for(i = 0;i<255;i++);
RTLResetPin = 0;
/* 如果硬件重啟時延很大, rtl自我初始化 */
for(i=0;i<DELAY_AFTER_HARDWARE_RESET;i++);
/* 寫重啟口 */
temp = ReadReg(RESET_PORT);
WriteReg(RESET_PORT,temp);
/* 初始化RTL 寄存器*/
WriteReg(CR,(CR_PAGE0 | CR_ABORT_COMPLETE_DMA | CR_STOP_COMMAND));
/* 設置page0, stop command */
WriteReg(PSTART_WPAGE0, RECEIVE_START_PAGE); /* Pstart */
WriteReg(PSTOP_WPAGE0, RECEIVE_STOP_PAGE); /* Pstop */
WriteReg(BNRY_WPAGE0, RECEIVE_START_PAGE); /* BNRY */
WriteReg(TPSR_WPAGE0, SEND_START_PAGE0); /* TPSR */
WriteReg(RCR_WPAGE0, 0xCE); /*RCR: 在Rtl8019as.h定義 */
WriteReg(TCR_WPAGE0, 0xE0); /* TCR: 在Rtl8019as.h定義*/
WriteReg(DCR_WPAGE0, 0xC8); /* DCR: 在Rtl8019as.h定義*/
WriteReg(IMR_WPAGE0,0); /* RTL 接收中斷使能 */
WriteReg(ISR_WPAGE0, 0xFF); /* 寫FF 清除所有中斷標志*/
RTLPage(1);
WriteReg(CURR_WPAGE1,RECEIVE_START_PAGE + 1);
/* MAR0 */
WriteReg(0x08,0x00);
WriteReg(0x09,0x41);
WriteReg(0x0a,0x00);
WriteReg(0x0b,0x80);
WriteReg(0x0c,0x00);
WriteReg(0x0d,0x00);
WriteReg(0x0e,0x00);
WriteReg(0x0f,0x00)
/* 設置物理地址*/
WriteReg(PRA0_WPAGE1,LocalMACAddr[0]);
WriteReg(PRA1_WPAGE1,LocalMACAddr[1]);
WriteReg(PRA2_WPAGE1,LocalMACAddr[2]);
WriteReg(PRA3_WPAGE1,LocalMACAddr[3]);
WriteReg(PRA4_WPAGE1,LocalMACAddr[4]);
WriteReg(PRA5_WPAGE1,LocalMACAddr[5]);
/* 傳輸起始頁*/
LastSendStartPage = SEND_START_PAGE0;
StartPageOfPacket = RECEIVE_START_PAGE + 1;
/* 初始化結束 */
WriteReg(CR,(CR_PAGE0 | CR_ABORT_COMPLETE_DMA | CR_STOP_COMMAND));
}
/* 寫 buffer 到 rlt ram */
void RTLWriteRam(WORD address, WORD size, BYTE xdata * buff)
{
WORD i;
BYTE PrePage; /* store page */
PrePage = ReadReg(CR);
RTLPage(0);
WriteReg(RSARH_WPAGE0,(BYTE)((address>>8)&0x00ff));
WriteReg(RSARL_WPAGE0,(BYTE)address);
WriteReg(RBCRH_WPAGE0,(BYTE)((size>>8)&0x00ff));
WriteReg(RBCRL_WPAGE0,(BYTE)size);
WriteReg(CR,(0x00 | CR_REMOTE_WRITE | CR_START_COMMAND));
for(i=0;i<size;i++)
{
WriteReg(REMOTE_DMA_PORT,buff[i]);
}
/* 完成dma */
WriteReg(RBCRH_WPAGE0,0);
WriteReg(RBCRL_WPAGE0,0);
WriteReg(CR,((PrePage&0xC0) | CR_ABORT_COMPLETE_DMA | CR_START_COMMAND));
}
/* 讀rlt ram 數據到 buffer */
void RTLReadRam(WORD address,WORD size,BYTE xdata * buff)
{
WORD i;
BYTE PrePage; /* 存儲頁 */
PrePage = ReadReg(CR);
RTLPage(0);
WriteReg(RSARH_WPAGE0,(BYTE)((address>>8)&0x00ff));
WriteReg(RSARL_WPAGE0,(BYTE)address);
WriteReg(RBCRH_WPAGE0,(BYTE)((size>>8)&0x00ff));
WriteReg(RBCRL_WPAGE0,(BYTE)size);
WriteReg(CR,(0x00 | CR_REMOTE_READ | CR_START_COMMAND));
for(i=0;i<size;i++)
{
buff[i] = ReadReg(REMOTE_DMA_PORT);
}
/* 完成dma */ WriteReg(RBCRH_WPAGE0,0);
WriteReg(RBCRL_WPAGE0,0);
WriteReg(CR,((PrePage&0xC0) | CR_ABORT_COMPLETE_DMA | CR_START_COMMAND));
}
BYTE RTLSendPacket(BYTE xdata * buffer,WORD size)
{
BYTE StartPage;
/* 存儲頁 */
BYTE PrePage;
PrePage = ReadReg(CR);
/* 檢查包大小*/
if(size < MIN_PACKET_SIZE || size > MAX_PACKET_SIZE)
return FALSE;
/* 寫包到ram */
if(LastSendStartPage == SEND_START_PAGE0)
{
StartPage = SEND_START_PAGE1;
LastSendStartPage = SEND_START_PAGE1;
}
else
{
StartPage = SEND_START_PAGE0;
LastSendStartPage = SEND_START_PAGE0;
}
RTLWriteRam(((WORD)StartPage)<<8,size,buffer);
/* 等待上一次傳輸結束*/
while((ReadReg(CR) & CR_TXP) == CR_TXP);
/* 寫傳輸起始頁和大小*/
RTLPage(0);
WriteReg(TPSR_WPAGE0,StartPage); /* TPSR */
WriteReg(TBCRL_WPAGE0,(BYTE)size); /*low */
WriteReg(TBCRH_WPAGE0,(BYTE)((size>>8)&0x00ff)); /*high*/
WriteReg(CR,((PrePage&0xC0) | CR_ABORT_COMPLETE_DMA | CR_TXP | CR_START_COMMAND));
return TRUE;
}
void RTLReceivePacket()
{
BYTE curr,bnry;
WORD address;
WORD PacketSize;
BYTE MemPage;
struct MemHeader xdata *pMemHead;
RTLPage(1);
curr = ReadReg(CURR_RPAGE1);
RTLPage(0);
/*在接收緩存中讀所有包*/
while(TRUE)
{
/* 檢驗起始頁是否未知錯誤*/
if(StartPageOfPacket >= RECEIVE_STOP_PAGE || StartPageOfPacket < RECEIVE_START_PAGE)
{
/* 用curr作為 StartPageOfPacket */
StartPageOfPacket = curr;
break;
}
/*檢查是否有包讀到 */
if(StartPageOfPacket == curr)
break;
/*讀一個包 */
/* 讀包頭信息 */
address = ((WORD)StartPageOfPacket)<<8;
RTLReadRam(address,4,Head);
/* 校驗rsr */
if(Head[0] & RSR_RECEIVE_NO_ERROR)
{
/*好包 */
/* 得到MAC校驗和*/
PacketSize = ((WORD)Head[3])*256 + Head[2] - 4;
/* 分配 buffer , 讀包到 buffer */
MemPage = MemAllocation(PacketSize);
if(MemPage != PAGE_NOT_FOUND)
{
pMemHead = (struct MemHeader xdata *)MemPageToPoint(MemPage);
pMemHead->StartPos = (BYTE xdata *)pMemHead + sizeof(struct MemHeader);
/* pos起始有效地址 */
pMemHead->StopPos = pMemHead->StopPos + PacketSize;
/* 停止pos */
address += 4;
if(StartPageOfPacket > Head[1] && Head[1] != RECEIVE_START_PAGE)
{
RTLReadRam(address,(((WORD)RECEIVE_STOP_PAGE)<<8) - address,pMemHead->StartPos); /* 讀rtl */
RTLReadRam(((WORD)RECEIVE_START_PAGE)<<8,PacketSize - ((((WORD)RECEIVE_STOP_PAGE)<<8) - address),
pMemHead->StartPos + ((((WORD)RECEIVE_STOP_PAGE)<<8) - address)); /* 讀rtl */
}
else
{
RTLReadRam(address,PacketSize,pMemHead->StartPos);
/ * 讀rtl */
}
if(WriteQueue(MemPage,&QueueNetPacketIn) == PAGE_NOT_FOUND) /* 寫到對列 */
{
/* 對列滿 */
#ifdef DEBUG
printf("\n-------queue full-------");
#endif
FreePage(MemPage);
break;
}
}
else
{
/* 結束 */
#ifdef DEBUG
printf("\n-------mem over-------");
#endif
break;
}
}
/* 得到下一包的起始頁 */
StartPageOfPacket = Head[1];
}
/* 重置 bnry */
bnry = StartPageOfPacket - 1;
if(bnry < RECEIVE_START_PAGE)
bnry = RECEIVE_STOP_PAGE - 1;
WriteReg(BNRY_WPAGE0,bnry);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -