📄 rtl8019.c
字号:
/* wait for last time trasmition to complete */
while((ReadReg(CR) & CR_TXP) == CR_TXP);
/* write trasmit start page and size */
RTLPage(0);
WriteReg(TPSR_WPAGE0,StartPage); /* TPSR */
WriteReg(TBCRL_WPAGE0,(unsigned char)size);/*low */
WriteReg(TBCRH_WPAGE0,(unsigned char)((size>>8)&0x00ff)); /*high*/
WriteReg(CR,((PrePage&0xC0) | CR_ABORT_COMPLETE_DMA | CR_TXP | CR_START_COMMAND));
InSending = FALSE;
return TRUE;
}
/* call this function to receive a ethernet packet from RTL8019.
return value:
NULL: no packet can receive yet.
not NULL:
a address point to MemHead. This Head contain merory
Imformation(memory start address, memory end address ...) of
received packet. Memory is allocated by function 'MemAllocate(unsigned int size)'.
a example of struct SMemHead is:
struct SMemHead
{
unsigned char used; // if in using
unsigned char xdata *pStart; // the start address of memory
unsigned char xdata *pEnd;
};
You can use your own struct SMemHead and MemAllocat function in your project.
*/
struct SMemHead xdata * RTLReceivePacket() reentrant
{
unsigned char curr,bnry;
unsigned int address;
unsigned int PacketSize;
struct SMemHead xdata *MemHead;
/* if send is running don't crrupt RTL register*/
if(InSending == TRUE)
return NULL;
MemHead = NULL;
RTLPage(1);
curr = ReadReg(CURR_RPAGE1);
RTLPage(0);
/* check if startpage exceed range becasue of unknow error */
if(StartPageOfPacket >= RECEIVE_STOP_PAGE || StartPageOfPacket < RECEIVE_START_PAGE)
{
/* use curr as the StartPageOfPacket in this case */
StartPageOfPacket = curr;
return NULL;
}
/* check if there is packets to read */
if(StartPageOfPacket == curr)
return NULL;
/*
* read a packet
*/
/* read packet head imformation */
address = ((unsigned int)StartPageOfPacket)<<8;
RTLReadRam(address,4,Head);
/* check rsr, if isn't a good packet no read */
if(Head[0] & RSR_RECEIVE_NO_ERROR)
{
/* this is a good packet */
/* packet size, sub 4 bytes, this 4 byte is MAC checksum */
PacketSize = ((unsigned int)Head[3])*256 + Head[2] - 4;
/* allocate buffer and read packet into buffer */
if((MemHead = MemAllocate(PacketSize)) != NULL)
{
/* if packet is put from bnry+1 to receive_stop_page and receive
start page to next packet startpage, that is if bnry+1 > next
packet start page and next start page != receive_start_page,
we need read by two times. the first time from bnry+1 to receive
_stop_page, the second time from receive start page to next packet
startpage.
*/
address += 4;
if(StartPageOfPacket > Head[1] && Head[1] != RECEIVE_START_PAGE)
{
RTLReadRam(address,(unsigned int)((((unsigned int)RECEIVE_STOP_PAGE)<<8) - address),MemHead->pStart); /* read from rtl */
RTLReadRam((unsigned int)(((unsigned int)RECEIVE_START_PAGE)<<8),(unsigned int)(PacketSize - ((((unsigned int)RECEIVE_STOP_PAGE)<<8) - address)),
MemHead->pStart + ((((unsigned int)RECEIVE_STOP_PAGE)<<8) - address)); /* read from rtl */
}
else
{
RTLReadRam(address,PacketSize,MemHead->pStart); /* read from rtl */
}
}
}
/* get next packet start page */
StartPageOfPacket = Head[1];
/* reset bnry */
bnry = StartPageOfPacket - 1;
if(bnry < RECEIVE_START_PAGE)
bnry = RECEIVE_STOP_PAGE - 1;
WriteReg(BNRY_WPAGE0,bnry);
return MemHead;
}
//ARP Test
unsigned char xdata TestPacket[42];
void RTL8019SendPacketTest()
{
/* send a arp request packet, src ip = 192.168.2.13, dest ip = 192.168.2.14,
if you config your computer's ip as 192.168.2.14, then after run this function,
your computer will receive the packet, and when you type "arp -a" in windows
command window(dos window) you will see a arp entry of 52 54 4c 30 2e 2f.
this indicate a packet has been successful sent
*/
/* this is a arp broad cast packet */
//Dest MAC
TestPacket[0] = 0xff;
TestPacket[1] = 0xff;
TestPacket[2] = 0xff;
TestPacket[3] = 0xff;
TestPacket[4] = 0xff;
TestPacket[5] = 0xff;
//Scr MAC
TestPacket[6] = 0x52;
TestPacket[7] = 0x54;
TestPacket[8] = 0x4c;
TestPacket[9] = 0x30;
TestPacket[10] = 0x2e;
TestPacket[11] = 0x2f;
//Type:arp
TestPacket[12] = 0x08;
TestPacket[13] = 0x06;
TestPacket[14] = 0x00;
TestPacket[15] = 0x01;
TestPacket[16] = 0x08;
TestPacket[17] = 0x00;
TestPacket[18] = 0x06;
TestPacket[19] = 0x04;
TestPacket[20] = 0x00;
TestPacket[21] = 0x01;
/* ARPPacket->IPDestAddr = DestIP:192.168.1.62;*/
TestPacket[22] = 0xc0;
TestPacket[23] = 0xa8;
TestPacket[24] = 0x01;
TestPacket[25] = 0x3d;
/* ARPPacket->IPScrAddr = NetIf->IPAddr:192.168.1.3; */
TestPacket[26] = 0xc0;
TestPacket[27] = 0xa8;
TestPacket[28] = 0x01;
TestPacket[29] = 0x03;
/* MemCopy(ARPPacket->EtherDestAddr,EtherAddrAny,ETHER_ADDR_LEN); */
TestPacket[30] = 0xFF;
TestPacket[31] = 0xFF;
TestPacket[32] = 0xFF;
TestPacket[33] = 0xFF;
TestPacket[34] = 0xFF;
TestPacket[35] = 0xFF;
TestPacket[36] = 0x52;
TestPacket[37] = 0x54;
TestPacket[38] = 0x4c;
TestPacket[39] = 0x30;
TestPacket[40] = 0x2e;
TestPacket[41] = 0x2f;
RTLSendPacket(TestPacket, 64);
}
void RTL8019RegTest()
{
//unsigned char tmp;
unsigned char i = 0;
unsigned char chTmp = 0;
//unsigned char xdata buff1[20] = "abcdefghijklmnopqrs";
//xdata unsigned char buff2[20];
//测试对RTL8019内部RAM读写是否正常
//RTLWriteRam((unsigned int)(((unsigned int)SEND_START_PAGE0)<<8),20,buff1);
//RTLReadRam(SEND_START_PAGE0 ,20,buff2);
P35 = 1;
//for(i = 0;i < 40000;i++);
P35 = 0;
delay(100);//for(i = 0;i < 4000;i++);
/* reset: write to reset prot */
WriteReg(0x1f,0xdd);
//chRTLInitTmp = ReadReg(0x1f);
delay(100);//for(i = 0;i < 2000;i++);
/* init RTL registers*/
WriteReg(0x00,0x21);
//chRTLInitTmp = ReadReg(0x00);
//测试对RTL8019内部寄存器的读写是否正常
while(chTmp <= 0xff)
{
//1
for(i = 0;i < 6;i ++)
{
XBYTE[0x7a00 + chTmp + i] = 0;
XBYTE[0x7a00 + chTmp + i + 1] = 0;
XBYTE[0x7a00 + chTmp + i + 2] = 0;
XBYTE[0x7a00 + chTmp + i + 3] = 0;
XBYTE[0x7a00 + chTmp + i + 4] = 0;
XBYTE[0x7a00 + chTmp + i + 5] = 0;
RTLPage(1);
WriteReg(0x01,0x4c);
WriteReg(0x02,0x54);
WriteReg(0x03,0x52);
WriteReg(0x04,0x4c);
WriteReg(0x05,0x54);
WriteReg(0x06,0x52);
XBYTE[0x7a00 + chTmp + i] = ReadReg(0x01);
XBYTE[0x7a00 + chTmp + i + 1] = ReadReg(0x02);
XBYTE[0x7a00 + chTmp + i + 2] = ReadReg(0x03);
XBYTE[0x7a00 + chTmp + i + 3] = ReadReg(0x04);
XBYTE[0x7a00 + chTmp + i + 4] = ReadReg(0x05);
XBYTE[0x7a00 + chTmp + i + 5] = ReadReg(0x06);
chTmp ++;
}
//2
for(i = 0;i < 6;i ++)
{
XBYTE[0x7a00 + chTmp + i] = 0;
XBYTE[0x7a00 + chTmp + i + 1] = 0;
XBYTE[0x7a00 + chTmp + i + 2] = 0;
XBYTE[0x7a00 + chTmp + i + 3] = 0;
XBYTE[0x7a00 + chTmp + i + 4] = 0;
XBYTE[0x7a00 + chTmp + i + 5] = 0;
RTLPage(1);
WriteReg(0x01,0x4c);
WriteReg(0x02,0x54);
WriteReg(0x03,0x52);
WriteReg(0x04,0x4c);
WriteReg(0x05,0x54);
WriteReg(0x06,0x52);
XBYTE[0x7a00 + chTmp + i] = ReadReg(0x01);
XBYTE[0x7a00 + chTmp + i + 1] = ReadReg(0x02);
XBYTE[0x7a00 + chTmp + i + 2] = ReadReg(0x03);
XBYTE[0x7a00 + chTmp + i + 3] = ReadReg(0x04);
XBYTE[0x7a00 + chTmp + i + 4] = ReadReg(0x05);
XBYTE[0x7a00 + chTmp + i + 5] = ReadReg(0x06);
chTmp ++;
}
//3
for(i = 0;i < 6;i ++)
{
XBYTE[0x7a00 + chTmp + i] = 0;
XBYTE[0x7a00 + chTmp + i + 1] = 0;
XBYTE[0x7a00 + chTmp + i + 2] = 0;
XBYTE[0x7a00 + chTmp + i + 3] = 0;
XBYTE[0x7a00 + chTmp + i + 4] = 0;
XBYTE[0x7a00 + chTmp + i + 5] = 0;
RTLPage(1);
WriteReg(0x01,0x4c);
WriteReg(0x02,0x54);
WriteReg(0x03,0x52);
WriteReg(0x04,0x4c);
WriteReg(0x05,0x54);
WriteReg(0x06,0x52);
XBYTE[0x7a00 + chTmp + i] = ReadReg(0x01);
XBYTE[0x7a00 + chTmp + i + 1] = ReadReg(0x02);
XBYTE[0x7a00 + chTmp + i + 2] = ReadReg(0x03);
XBYTE[0x7a00 + chTmp + i + 3] = ReadReg(0x04);
XBYTE[0x7a00 + chTmp + i + 4] = ReadReg(0x05);
XBYTE[0x7a00 + chTmp + i + 5] = ReadReg(0x06);
chTmp ++;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -