📄 rtl8019as.c
字号:
BYTE MACGet(void)
{
NICPut(RBCR0, 1);
NICPut(RBCR1, 0);
NICPut(CMDR, 0x0a);
return NICGet(NIC_DATAPORT);
}
WORD MACGetArray(BYTE *val, WORD len)
{
WORD_VAL t;
t.Val = len;
NICPut(ISR, 0x40);
NICPut(RBCR0, t.v[0]);
NICPut(RBCR1, t.v[1]);
NICPut(CMDR, 0x0a);
while( len-- > 0 )
{
*val++ = NICGet(NIC_DATAPORT);
}
return t.Val;
}
void MACReserveTxBuffer(BUFFER buffer)
{
TxBuffers[buffer].bFree = FALSE;
}
void MACDiscardTx(BUFFER buffer)
{
TxBuffers[buffer].bFree = TRUE;
NICCurrentTxBuffer = buffer;
}
void MACDiscardRx(void)
{
BYTE newBoundary;
newBoundary = NICReadPtr - 1;
if ( newBoundary < RXSTART )
newBoundary = RXSTOP - 1;
NICPut(CMDR, 0x20); // Select PAGE 0
NICPut(BNRY, newBoundary);
return;
}
WORD MACGetFreeRxSize(void)
{
BYTE NICWritePtr;
BYTE temp;
WORD_VAL tempVal;
NICPut(CMDR, 0x60);
NICWritePtr = NICGet(CURRP);
NICPut(CMDR, 0x20);
if ( NICWritePtr < NICCurrentRdPtr )
temp = (RXSTOP - NICCurrentRdPtr) + NICWritePtr;
else
temp = NICWritePtr - NICCurrentRdPtr;
temp = RXPAGES - temp;
tempVal.v[1] = temp;
tempVal.v[0] = 0;
return tempVal.Val;
}
BOOL MACIsLinked(void)
{
BYTE_VAL temp;
// Select Page 3
NICPut(CMDR, 0xe0);
// Read CONFIG0.
temp.Val = NICGet(0x03);
// Reset to page 0.
NICPut(CMDR, 0x20);
// Bit 2 "BNC" will be '0' if LINK is established.
return (temp.bits.b2 == 0);
}
BOOL MACGetHeader(MAC_ADDR *remote, BYTE* type)
{
NE_PREAMBLE header;
BYTE NICWritePtr;
WORD_VAL temp;
*type = MAC_UNKNOWN;
// Reset NIC if overrun has occured.
if ( NICGet(ISR) & 0x10 )
{
#if 1
NICPut(CMDR, 0x21);
{
BYTE i;
for(i = 0; i < 10; i++)
{
DelayMs(20);
}
}
NICPut(RBCR0, 0);
NICPut(RBCR1, 0);
NICPut(TCR, 0x02);
NICPut(CMDR, 0x20);
MACDiscardRx();
NICPut(ISR, 0xff);
NICPut(TCR, 0x00);
return FALSE;
#else
MACInit();
return FALSE;
#endif
}
NICPut(CMDR, 0x60);
NICWritePtr = NICGet(CURRP);
NICPut(CMDR, 0x20);
if ( NICWritePtr != NICReadPtr )
{
temp.v[1] = NICReadPtr;
temp.v[0] = 0;
NICSetAddr(temp.Val);
MACGetArray((BYTE*)&header, sizeof(header));
// Validate packet length and status.
if ( header.Status.PRX && (header.ReceivedBytes >= MINFRAMEC) && (header.ReceivedBytes <= MAXFRAMEC) )
{
header.Type.Val = swaps(header.Type.Val);
memcpy((void*)remote->v, (void*)header.SourceMACAddr.v, sizeof(*remote));
if ( (header.Type.v[1] == 0x08) && ((header.Type.v[0] == ETHER_IP) || (header.Type.v[0] == ETHER_ARP)) )
*type = header.Type.v[0];
}
NICCurrentRdPtr = NICReadPtr;
NICReadPtr = header.NextPacketPointer;
return TRUE;
}
return FALSE;
}
void MACPutHeader(MAC_ADDR *remote,
BYTE type,
WORD dataLen)
{
WORD_VAL mytemp;
BYTE etherType;
NICPut(ISR, 0x0a);
mytemp.v[1] = TxBuffers[NICCurrentTxBuffer].Index;
mytemp.v[0] = 0;
NICSetAddr(mytemp.Val);
MACPutArray((BYTE*)remote, sizeof(*remote));
MACPut(AppConfig.MyMACAddr.v[0]);
MACPut(AppConfig.MyMACAddr.v[1]);
MACPut(AppConfig.MyMACAddr.v[2]);
MACPut(AppConfig.MyMACAddr.v[3]);
MACPut(AppConfig.MyMACAddr.v[4]);
MACPut(AppConfig.MyMACAddr.v[5]);
if ( type == MAC_IP )
etherType = ETHER_IP;
else
etherType = ETHER_ARP;
MACPut(0x08);
MACPut(etherType);
dataLen += (WORD)sizeof(ETHER_HEADER);
if ( dataLen < MINFRAME ) // 64 ) // NKR 4/23/02
dataLen = 64; // MINFRAME;
mytemp.Val = dataLen;
NICPut(TBCR0, mytemp.v[0]);
NICPut(TBCR1, mytemp.v[1]);
}
void MACFlush(void)
{
BYTE i;
NICPut(TPSR, TxBuffers[NICCurrentTxBuffer].Index);
NICPut(CMDR, 0x24);
// After every transmission, adjust transmit pointer to
// next free transmit buffer.
for ( i = 0; i < MAX_DATA_BUFFERS; i++ )
{
if ( TxBuffers[i].bFree )
{
NICCurrentTxBuffer = i;
return;
}
}
}
static void NICReset(void)
{
SET_NIC_READ();
WRITE_NIC_ADDR(0);
// AGS
#if !defined(__PIC24F__)
INTCON2bits.RBPU = 0;
#endif
NIC_IOW_IO = 1;
NIC_IOR_IO = 1;
NIC_RESET_IO = 1;
NIC_CTRL_TRIS = 0x00;
// Reset pulse must be at least 800 ns.
Delay10us(1);
NIC_RESET_IO = 0;
}
static void NICPut(BYTE reg, BYTE val)
{
WRITE_NIC_ADDR(reg);
NIC_DATA_IO = val;
SET_NIC_WRITE();
NIC_IOW_IO = 0;
#if INSTR_FREQ > 5000000
Nop();
Nop();
#endif
NIC_IOW_IO = 1;
SET_NIC_READ();
}
static BYTE NICGet(BYTE reg)
{
BYTE val;
SET_NIC_READ();
WRITE_NIC_ADDR(reg);
NIC_IOR_IO = 0;
#if INSTR_FREQ > 5000000
Nop();
Nop();
#endif
val = NIC_DATA_IO;
NIC_IOR_IO = 1;
return val;
}
static void NICSetAddr(WORD addr)
{
WORD_VAL t;
t.Val = addr;
NICPut(ISR, 0x40);
NICPut(RSAR0, t.v[0]);
NICPut(RSAR1, t.v[1]);
}
void MACSetRxBuffer(WORD offset)
{
WORD_VAL t;
t.v[1] = NICCurrentRdPtr;
t.v[0] = sizeof(NE_PREAMBLE);
t.Val += offset;
NICSetAddr(t.Val);
}
void MACSetTxBuffer(BUFFER buffer, WORD offset)
{
WORD_VAL t;
NICCurrentTxBuffer = buffer;
t.v[1] = TxBuffers[NICCurrentTxBuffer].Index;
t.v[0] = sizeof(ETHER_HEADER);
t.Val += offset;
NICSetAddr(t.Val);
}
WORD MACGetOffset(void)
{
WORD_VAL t;
t.v[1] = NICGet(RSAR1);
t.v[0] = NICGet(RSAR0);
return t.Val;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -