📄 ethernet.c
字号:
#include "ethernet.h"
Net_inf_struc net_inf;
#define PSTART_data 0x46
#define PSTOP_data 0x60
#define TPSR_data 0x40
//define the register offset of the Ethernet chipset
#define CR_Add 0x0
#define REMOTE_DMA_PORT 0x10
#define RESET_PORT 0x18
//Page 0
#define CLDA0_Add 0x01
#define PSTART_Add 0x01
#define CLDA1_Add 0x02
#define PSTOP_Add 0x02
#define BNRY_Add 0x03
#define TSR_Add 0x04
#define TPSR_Add 0x04
#define NCR_Add 0x05
#define TBCR0_Add 0x05
#define FIFO_Add 0x06
#define TBCR1_Add 0x06
#define ISR_Add 0x07
#define CRDA0_Add 0x08
#define RSAR0_Add 0x08
#define CRDA1_Add 0x09
#define RSAR1_Add 0x09
#define ID0_Add 0x0a
#define RBCR0_Add 0x0a
#define ID1_Add 0x0b
#define RBCR1_Add 0x0b
#define RSR_Add 0x0c
#define RCR_Add 0x0c
#define CNTR0_Add 0x0d
#define TCR_Add 0x0d
#define CNTR1_Add 0x0e
#define DCR_Add 0x0e
#define CNTR2_Add 0x0f
#define IMR_Add 0x0f
//Page 1
#define PAR_Add 0x01
#define CURR_Add 0x07
#define MAR_Add 0x08
#define wrport(x,y) XBYTE[x] = (y)
#define rdport(x) XBYTE[x]
//-----------------------------------------------------------------
void ethernet_init(Uint16 base_addr, Uint8 *pMac)
{
Uint8 i;
net_inf.net_ifaddr = base_addr;
if(pMac != NULL)
memcpy(net_inf.mac,pMac,ETHER_ADDR_LEN);
//Page 0,Stop command
wrport(net_inf.net_ifaddr+CR_Add,0x21);
//Auto-initalize Remote,byte-wide DMA transmit
wrport(net_inf.net_ifaddr+DCR_Add,0x98);
//Clear Remote byte count register
wrport(net_inf.net_ifaddr+RBCR0_Add,0);
wrport(net_inf.net_ifaddr+RBCR1_Add,0);
//Config reveive mode
wrport(net_inf.net_ifaddr+RCR_Add,0xcc);
//Config transmit mode
wrport(net_inf.net_ifaddr+TCR_Add,0xe2);
//Config Receive ring
wrport(net_inf.net_ifaddr+PSTART_Add,PSTART_data);
wrport(net_inf.net_ifaddr+PSTOP_Add,PSTOP_data);
wrport(net_inf.net_ifaddr+BNRY_Add,PSTART_data);
//clear Isr and no interrupt
wrport(net_inf.net_ifaddr+ISR_Add,0xff);
wrport(net_inf.net_ifaddr+IMR_Add,0x0f);
//Config the transmit page address
wrport(net_inf.net_ifaddr+TPSR_Add,TPSR_data);
wrport(net_inf.net_ifaddr+TBCR0_Add,0);
wrport(net_inf.net_ifaddr+TBCR1_Add,0);
//Page 1,Stop command
wrport(net_inf.net_ifaddr+CR_Add,0x61);
//Config the first reveive buffer page
wrport(net_inf.net_ifaddr+CURR_Add,PSTART_data+1);
//Config MAC address
for(i=0;i<6;i++){
wrport(net_inf.net_ifaddr+1+i,net_inf.mac[i]);
}
//Config transmit mode
wrport(net_inf.net_ifaddr+CR_Add,0x21);
wrport(net_inf.net_ifaddr+TCR_Add,0xe0);
//Page 0,Begin command
wrport(net_inf.net_ifaddr+CR_Add,0x22);
}
//-----------------------------------------------------------------
Bool ethernet_send(Uint8 *pbuffer, Uint16 aLength)
{
Uint8 crda0;
Uint16 i;
if(rdport(net_inf.net_ifaddr+CR_Add)&0x4)
return FALSE;
aLength=Max(64,aLength);
aLength=Min(ETHER_BUFFER_LEN,aLength);
//dummy read
wrport(net_inf.net_ifaddr+RSAR1_Add,TPSR_data);
wrport(net_inf.net_ifaddr+RSAR0_Add,0);
wrport(net_inf.net_ifaddr+RBCR1_Add,0);
wrport(net_inf.net_ifaddr+RBCR0_Add,2);
crda0 = rdport(net_inf.net_ifaddr+CRDA0_Add);
wrport(net_inf.net_ifaddr+CR_Add,0x0a);
for(i=0;i<1000;i++){
if( crda0 != rdport(net_inf.net_ifaddr+CRDA0_Add))
break;
}
if(i==1000)
return FALSE;
//Ready the packet
wrport(net_inf.net_ifaddr+RSAR1_Add,TPSR_data);
wrport(net_inf.net_ifaddr+RSAR0_Add,0);
wrport(net_inf.net_ifaddr+RBCR1_Add,aLength>>8);
wrport(net_inf.net_ifaddr+RBCR0_Add,aLength);
wrport(net_inf.net_ifaddr+CR_Add,0x12);
for(i=0;i<aLength;i++){
wrport(net_inf.net_ifaddr+REMOTE_DMA_PORT,*pbuffer++);
}
//Transmit the packet
wrport(net_inf.net_ifaddr+RBCR1_Add,0x0f);
wrport(net_inf.net_ifaddr+TBCR1_Add,aLength>>8);
wrport(net_inf.net_ifaddr+TBCR0_Add,aLength);
wrport(net_inf.net_ifaddr+CR_Add,0x16);
return TRUE;
}
//-----------------------------------------------------------------
Uint16 ethernet_receive(Uint8 *pBuffer)
{
Uint16 i,length;
Uint8 next_pkt,curr,bnry;
// get packet
i = rdport(net_inf.net_ifaddr+ISR_Add);
i = rdport(net_inf.net_ifaddr+CR_Add);
next_pkt = rdport(net_inf.net_ifaddr+BNRY_Add);
next_pkt++;
if(next_pkt>=PSTOP_data)
next_pkt = PSTART_data;
//Get curr
wrport(net_inf.net_ifaddr+CR_Add,0x62);
curr = rdport(net_inf.net_ifaddr+CURR_Add);
wrport(net_inf.net_ifaddr+CR_Add,0x22);
//If has not new packet
if(next_pkt==curr){
wrport(net_inf.net_ifaddr+ISR_Add,0x10);
return 0;
}
//read header
wrport(net_inf.net_ifaddr+RSAR1_Add,next_pkt);
wrport(net_inf.net_ifaddr+RSAR0_Add,0);
wrport(net_inf.net_ifaddr+RBCR1_Add,0);
wrport(net_inf.net_ifaddr+RBCR0_Add,4);
wrport(net_inf.net_ifaddr+CR_Add,0x0a);
bnry = rdport(net_inf.net_ifaddr+REMOTE_DMA_PORT);
bnry = rdport(net_inf.net_ifaddr+REMOTE_DMA_PORT);
length = rdport(net_inf.net_ifaddr+REMOTE_DMA_PORT);
i = rdport(net_inf.net_ifaddr+REMOTE_DMA_PORT);
length |= i<<8;
length=Min(length,ETHER_BUFFER_LEN);
//read content
wrport(net_inf.net_ifaddr+RSAR0_Add,4);
wrport(net_inf.net_ifaddr+RBCR1_Add,length>>8);
wrport(net_inf.net_ifaddr+RBCR0_Add,length);
wrport(net_inf.net_ifaddr+CR_Add,0x0a);
for(i=0;i<length;i++){
*pBuffer++ = rdport(net_inf.net_ifaddr+REMOTE_DMA_PORT);
}
bnry--;
if(bnry<PSTART_data)
bnry=PSTOP_data;
if(bnry>PSTOP_data)
bnry=PSTOP_data;
wrport(net_inf.net_ifaddr+BNRY_Add,bnry);
// if(rdport(net_inf.net_ifaddr+ISR_Add)&0x10)
// wrport(net_inf.net_ifaddr+ISR_Add,0x10);
return length;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -