//****************************************************************************** // //****************************************************************************** #include "..\Headers\socket.h" #include "..\Headers\W5300.h" #include "..\Headers\avrdata.h" #include "..\Headers\dpram_api.h" #include "..\Headers\hardware.h" #include "..\Headers\lvSend_aux.h" //****************************************************************************** // //****************************************************************************** #define ENTER_CRITICAL asm cli #define LEAVE_CRITICAL asm sti #define DO_NOTHING asm nop #define W5300_EC_SOCKET_NO_MEMORY (-110) #define W5300_EC_SOCKETCLOSED (-111) SnStatus Sockets[8]; _UINT16 W5300EventID; static const _SINT8 W5300EventName[] = {'W','N','E','T'}; //****************************************************************************** // //****************************************************************************** _SINT16 W5300_recv(_UINT16 SocketNumber, _UINT16 *ptrDataBuf, _UINT16 *ptrDataLen, _SINT32 timeout) { _SINT16 EventError; _UINT16 k = 0, j = 0, i = 1; if((Sn_SSR(SocketNumber) & 0x00FF) != SOCK_ESTABLESHED) return W5300_EC_SOCKETCLOSED; // Waite signal from IRQ EventError = RTX_Wait_For_EventP(W5300EventID, (1 << SocketNumber), 0xFFFF, 0, timeout); if(EventError != 0) return EventError; // timeout - RTX_EC_TIMED_OUT if((Sn_SSR(SocketNumber) & 0x00FF) != SOCK_ESTABLESHED) return W5300_EC_SOCKETCLOSED; if((Sn_MR(SocketNumber) & 0x0100) == 0) { k = Sn_RX_FIFOR(SocketNumber); k = swap16(k); } else { while(TRUE) { k = Sn_RX_RSR2(SocketNumber); if(i == k) break; i = k; } } if(*ptrDataLen < k) k = *ptrDataLen; j = (k + (k & 0x0001)) >> 1; for(i = 0;i < j; ++i) { EventError = Sn_MR(SocketNumber); DO_NOTHING ptrDataBuf[i] = Sn_RX_FIFOR(SocketNumber); DO_NOTHING } *ptrDataLen = k; EventError = Sn_MR(SocketNumber); //Sn_CR(SocketNumber) = RECV; ENTER_CRITICAL //*(_UINT16 far*)Sn_IMR(SocketNumber) &= ~Sn_IR_RECV; --Sockets[SocketNumber].cntRecvData; // If we did not recive anything reset event if(Sockets[SocketNumber].cntRecvData == 0) { RTX_Signal_Events(W5300EventID, (1 << SocketNumber), 0); Sn_CR(SocketNumber) = RECV; } //*(_UINT16 far*)Sn_IMR(SocketNumber) |= Sn_IR_RECV; LEAVE_CRITICAL return 0; } _SINT16 W5300_send(_UINT16 SocketNumber, _UINT16 *ptrDataBuf, _UINT16 DataLen, _SINT32 timeout) { _SINT16 EventError; _UINT16 k, i; if((Sn_SSR(SocketNumber) & 0x00FF) == SOCK_CLOSED) return W5300_EC_SOCKETCLOSED; k = (DataLen + (DataLen & 0x0001)) >> 1; // if(Sn_TX_FSR2(SocketNumber) <= DataLen) return W5300_EC_SOCKET_NO_MEMORY; for(i = 0;i < k; ++i) { DO_NOTHING Sn_TX_FIFOR(SocketNumber) = ((_UINT16*)ptrDataBuf)[i]; DO_NOTHING } EventError = RTX_Wait_For_EventP(W5300EventID, (256 << SocketNumber), 0xFFFF, 0, timeout); if(EventError != 0) return EventError; // timeout - RTX_EC_TIMED_OUT RTX_Signal_Events(W5300EventID, (256 << SocketNumber), 0); if((Sn_SSR(SocketNumber) & 0x00FF) == SOCK_CLOSED) return W5300_EC_SOCKETCLOSED; Sn_WRSR(SocketNumber) = 0; Sn_WRSR2(SocketNumber) = DataLen; DO_NOTHING Sn_CR(SocketNumber) = SEND; return 0; } _SINT16 W5300_OpenSocket(_UINT16 SocketNumber, _UINT16 ProtType, _UINT16 sPort) { RTX_Signal_Events(W5300EventID, (1 << SocketNumber), 0); RTX_Signal_Events(W5300EventID, (256 << SocketNumber), 0xFFFF); // Sn_MR(SocketNumber) = (Sn_MR(SocketNumber) & 0xFED0) | ProtType | MAC_FILTER | NO_ACK_DELEY | 0x0100; //0x0100 0xFED0 // Порт Sn_PORTR(SocketNumber) = sPort; Sn_DPORTR(SocketNumber) = 0; // Keep Alive //*(_UINT16 far*)Sn_PORTOR(SocketNumber) = 0x200; Sn_IMR(SocketNumber) = 0x0000; IMR &= ~(1 << SocketNumber); // И очистить старые Sn_IR(SocketNumber) = 0xFFFF; IR &= (1 << SocketNumber); // Sn_IMR(SocketNumber) = Sn_IR_CON | Sn_IR_DISCON | Sn_IR_RECV | Sn_IR_SENDOK| Sn_IR_TIMEOUT; // IMR |= 1 << SocketNumber; // Sn_CR(SocketNumber) = OPEN; Sockets[SocketNumber].cntRecvData = 0; // RTX_Sleep_Time(10); if((Sn_SSR(SocketNumber) & 0x00FF) != SOCK_INIT) return W5300_EC_SOCKETCLOSED; return 0; } _SINT16 W5300_CloseSocket(_UINT16 SocketNumber) { Sn_IMR(SocketNumber) = 0x0000; Sn_IR(SocketNumber) = 0xFFFF; IMR &= ~(1 << SocketNumber); if((Sn_SSR(SocketNumber) & 0x00FF) != SOCK_CLOSED) { // //***************************************************** Sn_MR(SocketNumber) = Sn_MR_UDP; Sn_PORTR(SocketNumber) = 5000; Sn_CR(SocketNumber) = OPEN; Sn_DIPR(SocketNumber) = 0; Sn_DIPR2(SocketNumber) = 1; Sn_DPORTR(SocketNumber) = 5000; Sn_TX_FIFOR(SocketNumber) = 0xFFFF; Sn_WRSR(SocketNumber) = 0; Sn_WRSR2(SocketNumber) = 1; // Маска подсети SUBR0 = (255U << 8) | 255; SUBR2 = (255U << 8) | 0; Sn_CR(SocketNumber) = SEND; RTX_Sleep_Time(100); // Маска подсети SUBR0 = 0; SUBR2 = 0; } //***************************************************** if((Sn_SSR(SocketNumber) & 0x00FF) != SOCK_CLOSED) Sn_CR(SocketNumber) = DISCON; RTX_Sleep_Time(5); Sn_CR(SocketNumber) = CLOSE; RTX_Sleep_Time(5); return 0; } _SINT16 W5300_Listen(_UINT16 SocketNumber, _SINT32 timeout) { _SINT16 EventError; Sn_CR(SocketNumber) = LISTEN; RTX_Sleep_Time(5); if((Sn_SSR(SocketNumber) & 0x00FF) != SOCK_LISTEN) return W5300_EC_SOCKETCLOSED; EventError = RTX_Wait_For_EventP(W5300EventID, (1 << SocketNumber), 0xFFFF, 0, timeout); if(EventError != 0) return EventError; // timeout - RTX_EC_TIMED_OUT ENTER_CRITICAL if(Sockets[SocketNumber].cntRecvData == 0) RTX_Signal_Events(W5300EventID, (1 << SocketNumber), 0); LEAVE_CRITICAL return 0; } void InitSocket(void) { _UINT16 i; RTX_Create_EventGroup(&W5300EventID, W5300EventName, 0xFF00); for(i = 0; i < 8; ++i) { Sockets[i].SocetState = sClosed; Sn_IR(i) = 0xFFFF; Sockets[i].wN = Sockets[i].rN = 0; Sockets[i].cntRecvData = Sockets[i].cntTxData = 0; Sockets[i].rTx = Sockets[i].wTx = 0; Sockets[i].fisRing = Sockets[i].fisRingTx = 0; Sockets[i].indxW = Sockets[i].indxR = 0; } }