OpenCores
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,

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.