📄 rtl8019.c
字号:
i = 2;
data -= 2;
RxLen=(RxLength+1)/2;
for(; RxLen--;)
{
if(!(i&0x7F)) //if i = 0x80.
{
RxPageBeg++;
if(RxPageBeg>=RPSTOP) RxPageBeg = RPSTART;
}
data[i++] = inportw(RWPORT); //读入8019接收到的数据
}
outportb(BNRY, RxPageBeg);
//下1包指针
if( ETH_Rx_Receivex != ETH_Rx_Readx )
{
ETH_Rx_Receivex++;
if( ETH_Rx_Receivex >= ETH_BUFRX ) ETH_Rx_Receivex = 0;
}
//统计接收包数
ETH_ReceivePackets++; //接收数据包计数
ETH_EVENT |= ETH_NEWPACKET; //标志ETH_EVENT接收了一个数据包。
}
}else
{
if( irqs & 0x02 )
{
ETH_SendPackets++; //发送数据包计数
ETH_EVENT |= ETH_SENDPACKET;
txp = ETH_Tx_Sendx + 1;
if( txp >= ETH_BUFTX ) txp = 0;
if( txp != ETH_Tx_Addx )
{
Rlt8019_Tx( &TXBuf[txp] );
ETH_Tx_Sendx = txp;
ETH_isTXing = 1;
}else
{
ETH_isTXing = 0;
}
}
outportb(ISR, 0xFE);
}
}
/** 以太网操作函数 **/
#define IRQ_NET_ENABLE() EnableInt()
#define IRQ_NET_DISABLE() DisableInt()
#define ETH_P_REG_ARP 0x00000001
#define ETH_P_REG_IP 0x00000002
#define ETH_P_REG_ONEPACKETSEND 0x80000000
static unsigned int ETH_Protocol_REG;
unsigned char hwaddr_copy[6];
void ETH_StartSend();
void ETH_getHader(void *inbuf,void *h);
void ETH_setHader(void *inbuf,void *h);
void (*ETH_Arp_Receive)(unsigned char *pEth_Data); //定义了函数指针ETH_Arp_Receive
void (*ETH_IP_Receive)(unsigned char *pEth_Data);
void (*ETH_OnePacketSend)();
void (*my_ttsend)();
void ETH_getHader(void *inbuf,void *h)
{
unsigned char *pinbuf = (unsigned char*)inbuf;
unsigned char *ph = (unsigned char*)h;
memcpy(ph,pinbuf,6);
memcpy(ph+6,pinbuf+6,6);
ph[13] = pinbuf[12];
ph[12] = pinbuf[13];
}
void ETH_setHader(void *inbuf,void *h)
{
unsigned char *pinbuf = (unsigned char*)inbuf;
unsigned char *ph = (unsigned char*)h;
memcpy( pinbuf,ph,12);
pinbuf[13] = ph[12];
pinbuf[12] = ph[13];
}
void ETH_Init()
{
unsigned int i;
IRQ_NET_DISABLE();
ETH_SendPackets = 0;
ETH_ReceivePackets = 0;
ETH_EVENT = 0;
ETH_Protocol_REG = 0;
//初始化接收缓冲
for( i = 0 ; i < ETH_BUFRX ; i++ )
{
memset( &RXBuf[i],0,sizeof(Ethernet));
RXBuf[i].pPacket = (unsigned char*)&RXBuf[i].Packet;
RXBuf[i].pDestnodeid = &RXBuf[i].Packet[0];
RXBuf[i].pSourcenodeid = &RXBuf[i].Packet[3];
RXBuf[i].pProtocol = &RXBuf[i].Packet[6];
}
ETH_Rx_Readx = 0;
ETH_Rx_Receivex = 1;
//初始化发送缓冲
for( i = 0 ; i < ETH_BUFTX ; i++ )
{
memset( &TXBuf[i],0,sizeof(Ethernet));
TXBuf[i].pPacket = (unsigned char*)&TXBuf[i].Packet;
TXBuf[i].pDestnodeid = &TXBuf[i].Packet[0];
TXBuf[i].pSourcenodeid = &TXBuf[i].Packet[3];
TXBuf[i].pProtocol = &TXBuf[i].Packet[6];
}
ETH_Tx_Sendx = 0;
ETH_Tx_Addx = 1;
//初始化8019
i = 400000;
while(i--);
Rlt8019_Init();
IRQ_NET_ENABLE();
}
unsigned int ETH_Send(unsigned char *OutBuf, unsigned char *HW_Addr, unsigned short int P_Type , unsigned short int Len)
{
unsigned short int t;
unsigned char buf;
memcpy(OutBuf ,HW_Addr , 6);
memcpy(OutBuf + 6 , my_hwaddr , 6);
memcpy(OutBuf + 12 , (unsigned char*)&P_Type , 2 );
buf = OutBuf[12];
OutBuf[12] = OutBuf[13];
OutBuf[13] = buf;
IRQ_NET_DISABLE();
t = ETH_Tx_Sendx;
IRQ_NET_ENABLE();
if( t != ETH_Tx_Addx )
{
memcpy( TXBuf[ETH_Tx_Addx].pPacket, OutBuf , Len + 14 );
TXBuf[ETH_Tx_Addx].Length = Len + 14;
IRQ_NET_DISABLE();
ETH_Tx_Addx++;
if( ETH_Tx_Addx >= ETH_BUFTX ) ETH_Tx_Addx = 0;
IRQ_NET_ENABLE();
ETH_StartSend();
return 1;
}else
{
return 0;
}
}
void ETH_StartSend()
{
unsigned short int t;
IRQ_NET_DISABLE();
if( ETH_isTXing )
{
IRQ_NET_ENABLE();
return;
}
t = ETH_Tx_Sendx + 1;
if( t >= ETH_BUFTX ) t = 0;
if( t != ETH_Tx_Addx )
{
Rlt8019_Tx( &TXBuf[t] );
ETH_Tx_Sendx = t;
ETH_TX_TimeOut = 0;
ETH_isTXing = 1;
}
IRQ_NET_ENABLE();
}
//以太网接收
void ETH_Receive()
{
unsigned short readx,receivex;
ETH_HEADER eth;
unsigned int i;
/* 处理新的以太网数据包 */
if( ETH_EVENT & ETH_NEWPACKET ) //ETH_EVENT |= ETH_NEWPACKET;
{
IRQ_NET_DISABLE(); //EnableInt()
readx = ETH_Rx_Readx + 1;
if( readx >= ETH_BUFRX ) readx = 0;
receivex = ETH_Rx_Receivex;
IRQ_NET_ENABLE(); //DisableInt()
while( readx != receivex )
{
IRQ_NET_DISABLE();
readx = ETH_Rx_Readx + 1;
if( readx >= ETH_BUFRX ) readx = 0;
receivex = ETH_Rx_Receivex;
IRQ_NET_ENABLE();
if( readx == receivex ) break;
/* 数据包分类 */
ETH_getHader( RXBuf[readx].pPacket, ð);
switch( eth.frame_type )
{
case ARP_PACKET: //ARP
{
if( ETH_Protocol_REG & ETH_P_REG_ARP )
{
(*ETH_Arp_Receive)( RXBuf[readx].pPacket );
}
break;
}
case IP_PACKET: //IP
{
if( ETH_Protocol_REG & ETH_P_REG_IP )
{
(*ETH_IP_Receive)( RXBuf[readx].pPacket );
}
break;
}
}
IRQ_NET_DISABLE();
ETH_Rx_Readx = readx;
IRQ_NET_ENABLE();
}
IRQ_NET_DISABLE();
ETH_EVENT = ETH_EVENT & (~ETH_NEWPACKET);
IRQ_NET_ENABLE();
}
if( ETH_EVENT & ETH_SENDPACKET )
{
//数据包发送后处理
if( ETH_Protocol_REG & ETH_P_REG_ONEPACKETSEND )
{
(*ETH_OnePacketSend)();
}
//================
IRQ_NET_DISABLE();
ETH_EVENT = ETH_EVENT & (~ETH_SENDPACKET);
IRQ_NET_ENABLE();
}
}
//void ok_send()
//{
//(*my_ttsend)();
// (*ETH_Arp_Receive)( RXBuf[readx].pPacket );
//}
/* 协议处理函数注册 */
void ETH_Reg_ArpReceive( void (*Arp_Receive)(unsigned char *pEth_Data) )
{
ETH_Arp_Receive = Arp_Receive; //ETH_Arp_Receive是函数指针
ETH_Protocol_REG |= ETH_P_REG_ARP;
}
void ETH_Reg_IPReceive( void (*IP_Receive)(unsigned char *pEth_Data) )
{
ETH_IP_Receive = IP_Receive;
ETH_Protocol_REG |= ETH_P_REG_IP;
}
void ETH_Reg_OnePacketSend( void (*ETH_OnePacketSend)() )
{
ETH_OnePacketSend = ETH_OnePacketSend;
ETH_Protocol_REG |= ETH_P_REG_ONEPACKETSEND;
}
//void tt_send( void (*mytt)())
//{
// my_ttsend = mytt;
//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -