📄 tcpip.c
字号:
k = (u_char)((port & 0xff00) >> 8);
*(SRC_PORT_PTR(s)) = k;
k = (u_char)(port & 0x00ff);
*(SRC_PORT_PTR(s) + 1) = k;
// k = (u_char)((port & 0xff00) >> 8);
*(DST_PORT_PTR(s)) = 0x03;
// k = (u_char)(port & 0x00ff);
*(DST_PORT_PTR(s) + 1) = 0xe8;
}
else // Designate random port number which is managed by local when you didn't designate source port
{
Local_Port;
*SRC_PORT_PTR(s) = (u_char)((Local_Port & 0xff00) >> 8);
*(SRC_PORT_PTR(s) + 1) = (u_char)(Local_Port & 0x00ff);
}
I_STATUS[s] = 0;
COMMAND(s) = CSOCK_INIT;
/////06-03-29
while(cc--)
{
// while (I_STATUS[s] != 0x02)
if(cc==2)
{tcpinitfg=1;
}
if(I_STATUS[s] != 0x02)
{
checkint1();
_nop_();
}
else
cc=0;
}
// while(cc--) //(cc--)
// { if(I_STATUS[s] != 0)
// break;
//while (I_STATUS[s] == 0); // Waiting Interrupt to CSOCK_INIT
// }
//
if (!(I_STATUS[s] & SSOCK_INIT_OK)) return (-1); // Error
initseqnum(s); // Use initial seq# with random number
return (s);
}
void NBlisten(SOCKET s) reentrant
{ // _nop_();
// _nop_();
I_STATUS[s] = 0;
// _nop_();
// _nop_();
COMMAND(s) = CLISTEN; // LISTEN
}
void initseqnum(SOCKET s) reentrant
{
int i;
i=i;
i = s;
SEQ_NUM.lVal++; // Designate initial seq#
// If you have random number generation function, assign random number instead of SEQ_NUM.lVal++.
*(TX_WR_PTR(s) + 0) = SEQ_NUM.cVal[3];
*(TX_WR_PTR(s) + 1) = SEQ_NUM.cVal[2];
_nop_();
*(TX_WR_PTR(s) + 2) = SEQ_NUM.cVal[1];
_nop_();
*(TX_WR_PTR(s) + 3) = SEQ_NUM.cVal[0];
delay(10);
// Wait until TX_WR_PRT has been written safely. ( Must have delay(1.6us) if next action is to write 4byte-pointer register )
*(TX_RD_PTR(s) + 0) = SEQ_NUM.cVal[3];
*(TX_RD_PTR(s) + 1) = SEQ_NUM.cVal[2];
*(TX_RD_PTR(s) + 2) = SEQ_NUM.cVal[1];
*(TX_RD_PTR(s) + 3) = SEQ_NUM.cVal[0];
delay(10);
*(TX_ACK_PTR(s) + 0) = SEQ_NUM.cVal[3];
*(TX_ACK_PTR(s) + 1) = SEQ_NUM.cVal[2];
*(TX_ACK_PTR(s) + 2) = SEQ_NUM.cVal[1];
*(TX_ACK_PTR(s) + 3) = SEQ_NUM.cVal[0];
delay(10);
}
int send(SOCKET s, u_char * buf, u_int len) reentrant
{
int ptr, size;
// len=100;
if (len <= 0) return (0);
else
{
ptr = 0;
do {
size = send_in(s, buf + ptr, len);
if (size == -1) return -1;
len = len - size;
ptr += size;
} while ( len > 0);
}
return ptr;
}
int send_in(SOCKET s, u_char * buf, u_int len) reentrant
{
u_char k;
int size;
un_l2cval wr_ptr, ack_ptr;
u_char * send_ptr;
k = k;
// size=len;
// goto okstart;
S_START:
Int7_Ds();
k = *SHADOW_TXWR_PTR(s);
delay(10) ;
wr_ptr.cVal[0] = *(TX_WR_PTR(s) + 0);
wr_ptr.cVal[1] = *(TX_WR_PTR(s) + 1);
wr_ptr.cVal[2] = *(TX_WR_PTR(s) + 2);
wr_ptr.cVal[3] = *(TX_WR_PTR(s) + 3);
k = *SHADOW_TXACK_PTR(s);
delay(10) ;
ack_ptr.cVal[0] = *(TX_ACK_PTR(s) + 0);
ack_ptr.cVal[1] = *(TX_ACK_PTR(s) + 1);
ack_ptr.cVal[2] = *(TX_ACK_PTR(s) + 2);
ack_ptr.cVal[3] = *(TX_ACK_PTR(s) + 3);
// Int7_En();
// Calculate send free buffer size
if (wr_ptr.lVal >= ack_ptr.lVal) size = SSIZE[s] - (wr_ptr.lVal - ack_ptr.lVal);
else size = SSIZE[s] - (0 - ack_ptr.lVal + wr_ptr.lVal);
if (size > SSIZE[s]) // Recalulate after some delay because of error in pointer caluation
{
if (select(s, SEL_CONTROL) != SOCK_ESTABLISHED) return -1; // Error
delay(200) ;
// goto S_START;
}
if (size == 0) // Wait when previous sending has not finished yet and there's no free buffer
{
if (select(s, SEL_CONTROL) != SOCK_ESTABLISHED) return -1; // Error
delay(200) ;
// goto S_START;
}
else if (size < len) len = size;
// okstart:
// if (size < len) len = size;
send_ptr = (u_char *)( SBUFBASEADDRESS[s] + (UINT)(wr_ptr.lVal & SMASK[s])); // Calculate pointer to data copy
write_data(s, buf, send_ptr, len); // data copy
while (COMMAND(s) & CSEND) // Confirm send command
if (select(s, SEL_CONTROL) != SOCK_ESTABLISHED) return -1; // Error
wr_ptr.lVal = wr_ptr.lVal + len; // tx_wr_ptr update
*(TX_WR_PTR(s) + 0) = wr_ptr.cVal[0];
*(TX_WR_PTR(s) + 1) = wr_ptr.cVal[1];
*(TX_WR_PTR(s) + 2) = wr_ptr.cVal[2];
*(TX_WR_PTR(s) + 3) = wr_ptr.cVal[3];
COMMAND(s) = CSEND; // SEND
return (len);
}
int recv(SOCKET s, u_char *buf, u_int len) reentrant
{
u_char k;
u_int size;
un_l2cval wr_ptr, rd_ptr;
u_char * recv_ptr;
R_START:
Int7_Ds();
k = *SHADOW_RXWR_PTR(s); // Must read the shadow register for reading 4byte pointer registers
// wait for reading 4byte pointer registers safely
delay(10);
wr_ptr.cVal[0] = *(RX_WR_PTR(s) + 0);
wr_ptr.cVal[1] = *(RX_WR_PTR(s) + 1);
wr_ptr.cVal[2] = *(RX_WR_PTR(s) + 2);
wr_ptr.cVal[3] = *(RX_WR_PTR(s) + 3);
k = k;
k = *SHADOW_RXRD_PTR(s); // Must read the shadow register for reading 4byte pointer registers
// // wait for reading 4byte pointer registers safely
delay(10);
rd_ptr.cVal[0] = *(RX_RD_PTR(s) + 0);
rd_ptr.cVal[1] = *(RX_RD_PTR(s) + 1);
rd_ptr.cVal[2] = *(RX_RD_PTR(s) + 2);
rd_ptr.cVal[3] = *(RX_RD_PTR(s) + 3);
// Int7_En();
// calculate received data size
if ( len <= 0 ) return (0);
else if (wr_ptr.lVal >= rd_ptr.lVal)
{
size = wr_ptr.lVal - rd_ptr.lVal;
}
else size = 0 - rd_ptr.lVal + wr_ptr.lVal;
if (size < len) // Wait until receiving is done when received data size is less then len
{
if (select(s, SEL_CONTROL) != SOCK_ESTABLISHED) return -1; // Error
delay(200) ;
// goto R_START;
}
recv_ptr = (u_char *) (RBUFBASEADDRESS[s] + (UINT)(rd_ptr.lVal & RMASK[s])); // Calculate pointer to be copied received data
s=0;
read_data(s, recv_ptr, buf, len); // Copy receibed data
rd_ptr.lVal += len; // Update rx_rd_ptr
*(RX_RD_PTR(s) + 0) = rd_ptr.cVal[0];
*(RX_RD_PTR(s) + 1) = rd_ptr.cVal[1];
*(RX_RD_PTR(s) + 2) = rd_ptr.cVal[2];
*(RX_RD_PTR(s) + 3) = rd_ptr.cVal[3];
COMMAND(s) = CRECV; // RECV
return (len);
}
void close(SOCKET s) reentrant
{
u_int len=0;
u_int cc;
cc=2000;
if (select(s, SEL_CONTROL) == SOCK_CLOSED) return; // Already closed
// When closing, if there's data which have not processed, Insert some source codes to handle this
// Or before application call close(), handle those data first and call close() later.
// len = select(s, SEL_SEND);
// if (len == SSIZE[s])
// {
I_STATUS[s] =0;
COMMAND(s) = CCLOSE;
// delay(10) ;
while(cc--)
{
if(cc==2)
{tcpinitfg=1;
}
if(I_STATUS[s] != 0x08)
{
checkint1();
_nop_();
}
else
cc=0;
}
}
int select(SOCKET s, u_char func) reentrant
{
int val;
un_l2cval rd_ptr, wr_ptr, ack_ptr;
u_char k;
k = k;
switch (func) {
case SEL_CONTROL : // socket status information
val = SOCK_STATUS(s);
break;
case SEL_SEND : // Calculate send free buffer size
Int7_Ds();
k = *SHADOW_TXWR_PTR(s);
delay(10) ;
wr_ptr.cVal[0] = *(TX_WR_PTR(s) + 0);
wr_ptr.cVal[1] = *(TX_WR_PTR(s) + 1);
wr_ptr.cVal[2] = *(TX_WR_PTR(s) + 2);
wr_ptr.cVal[3] = *(TX_WR_PTR(s) + 3);
if( (OPT_PROTOCOL(s)& 0x07) != SOCK_STREAM)
{
k = *SHADOW_TXRD_PTR(s);
delay(10) ;
ack_ptr.cVal[0] = *(TX_RD_PTR(s) + 0);
ack_ptr.cVal[1] = *(TX_RD_PTR(s) + 1);
ack_ptr.cVal[2] = *(TX_RD_PTR(s) + 2);
ack_ptr.cVal[3] = *(TX_RD_PTR(s) + 3);
}
else
{
k = *SHADOW_TXACK_PTR(s);
delay(10) ;
ack_ptr.cVal[0] = *(TX_ACK_PTR(s) + 0);
ack_ptr.cVal[1] = *(TX_ACK_PTR(s) + 1);
ack_ptr.cVal[2] = *(TX_ACK_PTR(s) + 2);
ack_ptr.cVal[3] = *(TX_ACK_PTR(s) + 3);
}
// Int7_En();
if (wr_ptr.lVal >= ack_ptr.lVal) val = SSIZE[s] - (wr_ptr.lVal - ack_ptr.lVal);
else val = SSIZE[s] - (0 - ack_ptr.lVal + wr_ptr.lVal);
break;
case SEL_RECV : // Calculate received data size
Int7_Ds();
k = *SHADOW_RXWR_PTR(s);
delay(20);
wr_ptr.cVal[0] = *(RX_WR_PTR(s) + 0);
wr_ptr.cVal[1] = *(RX_WR_PTR(s) + 1);
wr_ptr.cVal[2] = *(RX_WR_PTR(s) + 2);
wr_ptr.cVal[3] = *(RX_WR_PTR(s) + 3);
k = *SHADOW_RXRD_PTR(s);
delay(20);
rd_ptr.cVal[0] = *(RX_RD_PTR(s) + 0);
rd_ptr.cVal[1] = *(RX_RD_PTR(s) + 1);
rd_ptr.cVal[2] = *(RX_RD_PTR(s) + 2);
rd_ptr.cVal[3] = *(RX_RD_PTR(s) + 3);
// Int7_En();
if (wr_ptr.lVal == rd_ptr.lVal)
{ val = 0;
}
else if (wr_ptr.lVal > rd_ptr.lVal)
{
val = wr_ptr.lVal - rd_ptr.lVal;
}
else
val = 0 - rd_ptr.lVal + wr_ptr.lVal;
break;
default :
val = -1;
break;
}
return ( val );
}
u_int read_data(SOCKET s, u_char * src, u_char * dst, u_int len) reentrant
{
u_int i, size, size1;
// dst=0xc020;
if (len == 0) return 0;
s=0;
if( (((u_int)src & RMASK[0]) + len) > RSIZE[0] )
{
size = RSIZE[0] - ((u_int)src & RMASK[0]);
for (i = 0; i < size; i++) *dst++ = *src++;
size1 = len - size;
src = RBUFBASEADDRESS[0];
for (i = 0; i < size1; i++) *dst++ = *src++;
}
else
for (i = 0; i < (len&0x5ff); i++) //*dst++ = *src++;
*dst++ = *src++;
// dst_buf[i]= *src++;
return len;
}
u_int write_data(SOCKET s, u_char * src, u_char * dst, u_int len) reentrant
{
u_int i, size, size1;
if (len == 0) return 0;
if ( (((u_int)dst & SMASK[s]) + len) > SSIZE[s] )
{
size = SSIZE[s] - ((UINT)dst & SMASK[s]);
for (i = 0; i < size; i++) *dst++ = *src++;
size1 = len - size;
dst = (SBUFBASEADDRESS[s]);
for (i = 0; i < size1; i++) *dst++ = *src++;
}
else
for (i = 0; i < len; i++)
{
*dst++ = *src++; //dst_buf[i] //temp_buf[i]; //*src++;
// temp40[2]=0x33;
// temp60[2]=0x44;
}
return len;
}
void InitNetConfig(void)
{
//unsigned char U8_buf[2];
setMACAddr(RamMac_address); //MAC setting
setIP(RamSource_IP); // source IP setting
setgateway(RamGateway_IP); // gateway address setting
setsubmask(NetparameterRamSubnet_Mask_Value);
setdesAddr(Destination_IP);
INTMASK=0x11;
settimeout(timeout1); // subnet mask setting
sysinit(SBUFSIZE,RBUFSIZE);
}
*/
/////////***********************************************
void powerint(void) interrupt 0 //power down protect
{_nop_();
PCON=0x02; //power down
_nop_();
while(1)
{_nop_();
}
}
//////
void snd1char(uchar dats)
{uint data cout;
//SM2=0;
tiflag=0;
en489=1;
SBUF=dats;
//while(TI==0);
//TI=0;
for(cout=0;cout<15000;cout++)
{if(TI==1)
{tiflag=1;
TI=0;
break;
}
}
_nop_();
}
void get1char(void)
{uint data cout;
riflag=0;
for(cout=0;cout<10000;cout++)
{if(RI==1)
{riflag=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -