URL
https://opencores.org/ocsvn/plasma/plasma/trunk
Subversion Repositories plasma
Compare Revisions
- This comparison shows the changes necessary to convert path
/plasma/trunk
- from Rev 417 to Rev 418
- ↔ Reverse comparison
Rev 417 → Rev 418
/kernel/ethernet.c
33,7 → 33,7
static unsigned char reflectNibble[256]; |
static OS_Semaphore_t *SemEthernet, *SemEthTransmit; |
static int gIndex; //byte index into 0x13ff0000 receive buffer |
static int gCheckedBefore; |
static int gCrcChecked; |
|
|
//Read received data from 0x13ff0000. Data starts with 0x5d+MACaddress. |
43,7 → 43,7
int EthernetReceive(unsigned char *buffer, int length) |
{ |
int count; |
int start, i, j, shift, offset, index; |
int start, i, j, shift, offset, index, emptyCount; |
int byte, byteNext; |
unsigned long crc; |
int byteCrc; |
53,6 → 53,7
//Find the start of a frame |
packetExpected = MemoryRead(IRQ_STATUS) & IRQ_ETHERNET_RECEIVE; |
MemoryRead(ETHERNET_REG); //clear receive interrupt |
emptyCount = 0; |
|
//Find dest MAC address |
for(offset = 0; offset <= INDEX_MASK; ++offset) |
70,9 → 71,15
} |
if(i == sizeof(gDestMac)) |
break; //found dest MAC |
emptyCount = 0; |
} |
else if(byte == BYTE_EMPTY && packetExpected == 0) |
return 0; |
else if(byte == BYTE_EMPTY) |
{ |
if(packetExpected == 0 && ++emptyCount >= 4) |
return 0; |
} |
else |
emptyCount = 0; |
} |
if(offset > INDEX_MASK) |
return 0; |
125,7 → 132,7
buf[gIndex] = BYTE_EMPTY; |
gIndex = (gIndex + 1) & INDEX_MASK; |
} |
gCheckedBefore = 0; |
gCrcChecked = 0; |
return count; |
} |
} |
132,12 → 139,12
} |
} |
gIndex = start; |
if(gCheckedBefore++ > 1) |
if(++gCrcChecked > 0) //if the CPU speed is > 25MHz, change to 1 |
{ |
buf[gIndex] = BYTE_EMPTY; |
gIndex = (gIndex + 1) & INDEX_MASK; |
} |
return 0; //wait for more data |
return -1; |
} |
|
|
200,18 → 207,14
int length; |
int rc; |
unsigned int ticks, ticksLast=0; |
int ticksWait=50; |
IPFrame *ethFrame=NULL; |
(void)arg; |
|
for(;;) |
{ |
OS_InterruptMaskSet(IRQ_ETHERNET_RECEIVE); //enable interrupt |
rc = OS_SemaphorePend(SemEthernet, ticksWait); //wait for interrupt |
if(rc) |
ticksWait = 50; |
else |
ticksWait = 2; |
OS_ThreadSleep(1); //give TCP/IP stack CPU time |
OS_InterruptMaskSet(IRQ_ETHERNET_RECEIVE); //enable interrupt |
OS_SemaphorePend(SemEthernet, 50); //wait for interrupt |
|
//Process all received packets |
for(;;) |
222,7 → 225,9
break; |
length = EthernetReceive(ethFrame->packet, PACKET_SIZE); |
if(length == 0) |
break; |
break; //no packet found |
if(length < 0) |
continue; //CRC didn't match; process next packet |
Led(1, 1); |
rc = IPProcessEthernetPacket(ethFrame, length); |
Led(1, 0); |
/kernel/tcpip.c
873,16 → 873,13
FrameInsert(&socket->frameReadHead, &socket->frameReadTail, frameIn); |
socket->ack += bytes; |
|
//Ack data |
window = RECEIVE_WINDOW - (socket->ack - socket->ackProcessed); |
if(window >= 536) |
frameOut = IPFrameGet(FRAME_COUNT_SEND); |
if(frameOut) |
{ |
//Ack data |
frameOut = IPFrameGet(FRAME_COUNT_SEND); |
if(frameOut) |
{ |
frameOut->packet[TCP_FLAGS] = TCP_FLAGS_ACK; |
TCPSendPacket(socket, frameOut, TCP_DATA); |
} |
frameOut->packet[TCP_FLAGS] = TCP_FLAGS_ACK; |
TCPSendPacket(socket, frameOut, TCP_DATA); |
} |
|
//Using frame |
/kernel/tcpip.h
19,7 → 19,7
#define RETRANSMIT_TIME 110 |
#define SOCKET_TIMEOUT 10 |
#define SEND_WINDOW 7000 |
#define RECEIVE_WINDOW (536*FRAME_COUNT/4) |
#define RECEIVE_WINDOW (536*2) |
|
typedef enum IPMode_e { |
IP_MODE_UDP, |