?? w3100a.c
字號(hào):
//for TCP half-open ------>add by brucelyang 2005.8.30
if(size > 2048)
{
close(s);
return;
}
/////////////////end of brucelyang///////////////
//sci0_reg_print((unsigned long)size);
//add the flow control --- add by brucelyang 2005.8.2
if((tx_cnt + size) > TXBUF_SIZE)
{
sendpause_flag = 1; //send pause
timeout_cnt_w3100 = 0;
return;
}
if(size == 0) return;
// Calulate received data pointer
recv_ptr = (unsigned char *)(RBUFBASEADDRESS[s] + (unsigned int)(rd_ptr.lVal & RMASK[s]));
if((((unsigned int)rd_ptr.lVal & RMASK[s])+size) > RSIZE[s])
{
size1 = RSIZE[s] - ((unsigned int)rd_ptr.lVal & RMASK[s]);
for(i=0;i<size1;i++)
{
set_imask_ccr(1);
*enettors232_wrptr++ = *recv_ptr++;
tx_cnt ++;
//if(enettors232_wrptr == (enettors232_buf + ENETTORS232_BUFSIZE))
if(enettors232_wrptr == (unsigned char *)0x224000)
{
enettors232_wrptr = enettors232_buf;
}
set_imask_ccr(0);
}//end for(i=0;i<size1;i++)
size2 = size - size1;
recv_ptr = RBUFBASEADDRESS[s];
for(i=0;i<size2;i++)
{
set_imask_ccr(1);
*enettors232_wrptr++ = *recv_ptr++;
tx_cnt ++;
//if(enettors232_wrptr == (enettors232_buf + ENETTORS232_BUFSIZE))
if(enettors232_wrptr == (unsigned char *)0x224000)
{
enettors232_wrptr = enettors232_buf;
}
set_imask_ccr(0);
}//end for(i=0;i<size2;i++)
}
else
{
for(i=0;i<size;i++)
{
set_imask_ccr(1);
*enettors232_wrptr++ = *recv_ptr++;
tx_cnt ++;
//if(enettors232_wrptr == (enettors232_buf + ENETTORS232_BUFSIZE))
if(enettors232_wrptr == (unsigned char *)0x224000)
{
enettors232_wrptr = enettors232_buf;
}
set_imask_ccr(0);
}//end for(i=0;i<size;i++)
}
rd_ptr.lVal += size;
// Update rx_rd_ptr
*RX_RD_PTR(s) = 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];
// RECV
COMMAND(s) = CRECV;
//點(diǎn)亮RJ-45 LED add by wqf 2005.06.14
PF.DR.BIT.B2 = 0x00;
//初始化100ms計(jì)數(shù)器,開始計(jì)時(shí)
rj45led_flag = 1;
//清除計(jì)數(shù)個(gè)數(shù)
rj45led_time = 0;
//*(unsigned short *)0xFFFF74 = 0xA53D;
//I have just recv a data,donn't close me -add by wqf 2005.05.31
wtm_time =0 ;//清除通信空閑時(shí)間計(jì)數(shù)
/*TIE0 enable*/
SCI0.SCR.BYTE = SCI0.SCR.BYTE | 0x80;
break;
case UDP_CHANNEL:
if(select(s,SEL_CONTROL)==SOCK_CLOSED) return;
// || ((ethernet_status & UDP_CHANNEL_ON) == 0)
//如果沒有輸入命令UDPnn,不處理接收的UDP數(shù)據(jù),add by wqf 2005.05.31
//if((ethernet_status & TCP_SERVER_CHANNEL_ON)||(ethernet_status & TCP_CLIENT_CHANNEL_ON)
// ||(Prog_Mode == 1) || ((ethernet_status & UDP_CHANNEL_ON) == 0))
if(Ch_connect != 2)
{
//for test
//sci0_reg_print((unsigned long)ethernet_status);
//sci0_reg_print((unsigned long)Prog_Mode);
set_imask_ccr(1);
k = *SHADOW_RXWR_PTR(s);
wait_1us(2);
wr_ptr.cVal[0] = *RX_WR_PTR(s);
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);
wait_1us(2);
rd_ptr.cVal[0] = *RX_RD_PTR(s);
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);
set_imask_ccr(0);
//discard all received data
rd_ptr.cVal[0] = wr_ptr.cVal[0];
rd_ptr.cVal[1] = wr_ptr.cVal[1];
rd_ptr.cVal[2] = wr_ptr.cVal[2];
rd_ptr.cVal[3] = wr_ptr.cVal[3];
// Update rx_rd_ptr
*RX_RD_PTR(s) = 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];
// RECV
COMMAND(s) = CRECV;
}
else
{
set_imask_ccr(1);
k = *SHADOW_RXWR_PTR(s);
wait_1us(2);
wr_ptr.cVal[0] = *RX_WR_PTR(s);
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);
wait_1us(2);
rd_ptr.cVal[0] = *RX_RD_PTR(s);
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);
set_imask_ccr(0);
if (wr_ptr.lVal >= rd_ptr.lVal) receive_size = wr_ptr.lVal - rd_ptr.lVal;
else receive_size = 0 - rd_ptr.lVal + wr_ptr.lVal;
while(receive_size != 0)
{
dst = UDPHeader.u.stream;
recv_ptr = (unsigned char *)(RBUFBASEADDRESS[s] + (unsigned int)(rd_ptr.lVal & RMASK[s])); // Calulate received data pointer
if((((unsigned int)rd_ptr.lVal & RMASK[s])+8) > RSIZE[s])
{
size1 = RSIZE[s] - ((unsigned int)rd_ptr.lVal & RMASK[s]);
for(i=0;i<size1;i++)
{
*dst++ = *recv_ptr++;
}
size2 = 8 - size1;
recv_ptr = RBUFBASEADDRESS[s];
for(i=0;i<size2;i++)
{
*dst++ = *recv_ptr++;
}
}
else
{
for(i=0;i<8;i++)
{
*dst++ = *recv_ptr++;
}
}
size = UDPHeader.u.header.size - 8;
ip_addr[0] = UDPHeader.u.header.addr[0];
ip_addr[1] = UDPHeader.u.header.addr[1];
ip_addr[2] = UDPHeader.u.header.addr[2];
ip_addr[3] = UDPHeader.u.header.addr[3];
udp_port = UDPHeader.u.stream[6];
udp_port = (udp_port << 8) + UDPHeader.u.stream[7];
receive_size -= 8;
rd_ptr.lVal += 8;
//UDP head output,如果UDP HEAD=E,將UDP數(shù)據(jù)的發(fā)送者的IP附加在UDP數(shù)據(jù)之前 add by wqf 2005.05.31
if((tt_page2.Udphead == 'E') || (tt_page2.Udphead == 'e'))
{
for(i=0;i<MAX_DST_TBL;i++)
{
if((memcmp(tt_page3.Youip[i],ip_addr,4) != 0) || (tt_page3.Youport[i] != udp_port))
{
continue;
}
else
{
break;
}
}
if(i < MAX_DST_TBL)
{
sprintf(tmp,"%02d:",i+1);
//Sel_prtmsg(0,tmp);
}
if(i == MAX_DST_TBL)
{
sprintf(tmp,"%d.%d.%d.%d:%d:",ip_addr[0],ip_addr[1],ip_addr[2],ip_addr[3],udp_port);
//Sel_prtmsg(0,tmp);
}
data_tmp = tmp;
while((*data_tmp) != '\0')
{
set_imask_ccr(1);
*enettors232_wrptr++ = *data_tmp++;
tx_cnt ++;
if(enettors232_wrptr == (enettors232_buf + ENETTORS232_BUFSIZE))
{
enettors232_wrptr = enettors232_buf;
}
if (tx_cnt > TXBUF_SIZE)
{
tx_cnt = TXBUF_SIZE;
enettors232_rdptr = enettors232_wrptr;
}
set_imask_ccr(0);
}
}
recv_ptr = (unsigned char *)(RBUFBASEADDRESS[s] + (unsigned int)(rd_ptr.lVal & RMASK[s])); // Calulate received data pointer
if((((unsigned int)rd_ptr.lVal & RMASK[s])+size) > RSIZE[s])
{
size1 = RSIZE[s] - ((unsigned int)rd_ptr.lVal & RMASK[s]);
for(i=0;i<size1;i++)
{
set_imask_ccr(1);
*enettors232_wrptr++ = *recv_ptr++;
tx_cnt ++;
//if(enettors232_wrptr == (enettors232_buf + ENETTORS232_BUFSIZE))
if(enettors232_wrptr == (unsigned char *)0x224000)
{
enettors232_wrptr = enettors232_buf;
}
if (tx_cnt > TXBUF_SIZE)
{
tx_cnt = TXBUF_SIZE;
enettors232_rdptr = enettors232_wrptr;
}
set_imask_ccr(0);
}//end for(i=0;i<size1;i++)
size2 = size - size1;
recv_ptr = RBUFBASEADDRESS[s];
for(i=0;i<size2;i++)
{
set_imask_ccr(1);
*enettors232_wrptr++ = *recv_ptr++;
tx_cnt ++;
//if(enettors232_wrptr == (enettors232_buf + ENETTORS232_BUFSIZE))
if(enettors232_wrptr == (unsigned char *)0x224000)
{
enettors232_wrptr = enettors232_buf;
}
if (tx_cnt > TXBUF_SIZE)
{
tx_cnt = TXBUF_SIZE;
enettors232_rdptr = enettors232_wrptr;
}
set_imask_ccr(0);
}//end for(i=0;i<size2;i++)
}
else
{
for(i=0;i<size;i++)
{
set_imask_ccr(1);
*enettors232_wrptr++ = *recv_ptr++;
tx_cnt ++;
//if(enettors232_wrptr == (enettors232_buf + ENETTORS232_BUFSIZE))
if(enettors232_wrptr == (unsigned char *)0x224000)
{
enettors232_wrptr = enettors232_buf;
}
if (tx_cnt > TXBUF_SIZE)
{
tx_cnt = TXBUF_SIZE;
enettors232_rdptr = enettors232_wrptr;
}
set_imask_ccr(0);
}//end for(i=0;i<size;i++)
}//end if((((unsigned int)rd_ptr.lVal &
rd_ptr.lVal += size;
receive_size -= size;
}//end while(receive_size != 0)
// Update rx_rd_ptr
*RX_RD_PTR(s) = 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];
// RECV
COMMAND(s) = CRECV;
//點(diǎn)亮RJ-45 LED add by wqf 2005.06.14
PF.DR.BIT.B2 = 0x00;
//初始化100ms計(jì)數(shù)器,開始計(jì)時(shí)
rj45led_flag = 1;
//清除計(jì)數(shù)個(gè)數(shù)
rj45led_time = 0;
/*TIE0 enable*/
SCI0.SCR.BYTE = SCI0.SCR.BYTE | 0x80;
}
break;
case TELNET_SERVER_CHANNEL:
//if(prog_mode == 1) close(TELNET_SERVER_CHANNEL);
//else progcmd(99); ---->telnet_ch==99
set_imask_ccr(1);
k = *SHADOW_RXWR_PTR(s); // Must read the shadow register for reading 4byte pointer registers
wait_1us(2); // wait for reading 4byte pointer registers safely
wr_ptr.cVal[0] = *RX_WR_PTR(s);
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); // Must read the shadow register for reading 4byte pointer registers
wait_1us(2); // wait for reading 4byte pointer registers safely
rd_ptr.cVal[0] = *RX_RD_PTR(s);
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);
set_imask_ccr(0);
// calculate received data size
if (wr_ptr.lVal >= rd_ptr.lVal) size = wr_ptr.lVal - rd_ptr.lVal;
else size = 0 - rd_ptr.lVal + wr_ptr.lVal;
// Calulate received data pointer
recv_ptr = (unsigned char *)(RBUFBASEADDRESS[s] + (unsigned int)(rd_ptr.lVal & RMASK[s]));
if((((unsigned int)rd_ptr.lVal & RMASK[s])+size) > RSIZE[s])
{
size1 = RSIZE[s] - ((unsigned int)rd_ptr.lVal & RMASK[s]);
for(i=0;i<size1;i++)
{
set_imask_ccr(1);
*telnet_wrptr = *recv_ptr++;
telnet_wrptr ++;
if (telnet_wrptr == telnet_recv_buf + TEL_BUF)
{
telnet_wrptr = telnet_recv_buf;
}
if (telnet_wrptr == telnet_rdptr)
{
telnet_rdptr ++;
if (telnet_rdptr == telnet_recv_buf + TEL_BUF)
{
telnet_rdptr = telnet_recv_buf;
}
}
set_imask_ccr(0);
}//end for(i=0;i<size1;i++)
size2 = size - size1;
recv_ptr = RBUFBASEADDRESS[s];
for(i=0;i<size2;i++)
{
set_imask_ccr(1);
*telnet_wrptr = *recv_ptr++;
telnet_wrptr ++;
if (telnet_wrptr == telnet_recv_buf + TEL_BUF)
{
telnet_wrptr = telnet_recv_buf;
}
if (telnet_wrptr == telnet_rdptr)
{
telnet_rdptr ++;
if (telnet_rdptr == telnet_recv_buf + TEL_BUF)
{
telnet_rdptr = telnet_recv_buf;
}
}
set_imask_ccr(0);
}//end for(i=0;i<size2;i++)
}
else
{
for(i=0;i<size;i++)
{
set_imask_ccr(1);
*telnet_wrptr = *recv_ptr++;
telnet_wrptr ++;
if (telnet_wrptr == telnet_recv_buf + TEL_BUF)
{
telnet_wrptr = telnet_recv_buf;
}
if (telnet_wrptr == telnet_rdptr)
{
telnet_rdptr ++;
if (telnet_rdptr == telnet_recv_buf + TEL_BUF)
{
telnet_rdptr = telnet_recv_buf;
}
}
set_imask_ccr(0);
}//end for(i=0;i<size;i++)
}
rd_ptr.lVal += size;
// Update rx_rd_ptr
*RX_RD_PTR(s) = 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];
// RECV
COMMAND(s) = CRECV;
//點(diǎn)亮RJ-45 LED add by wqf 2005.06.14
PF.DR.BIT.B2 = 0x00;
//初始化100ms計(jì)數(shù)器,開始計(jì)時(shí)
rj45led_flag = 1;
//清除計(jì)數(shù)個(gè)數(shù)
rj45led_time = 0;
break;
default:
break;
}
return;
}
/*
********************************************************************************
* Function handling the channel socket information.
*
* Description : Return socket information of designated channel
* Arguments : s - channel number
* func - SEL_CONTROL(0x00) -> return socket status
* SEL_SEND(0x01) -> return free transmit buffer size
* SEL_RECV(0x02) -> return received data size
* Returns : socket status or free transmit buffer size or received data size
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -