?? w3100a.c
字號:
if(ssum < 8192)
{
switch((sbufsize >> i*2) & 0x03) // Set maximum Tx memory size
{
case 0:
SSIZE[i] = 1024;
SMASK[i] = 0x000003FF;
break;
case 1:
SSIZE[i] = 2048;
SMASK[i] = 0x000007FF;
break;
case 2:
SSIZE[i] = 4096;
SMASK[i] = 0x00000FFF;
break;
case 3:
SSIZE[i] = 8192;
SMASK[i] = 0x00001FFF;
break;
}
}
if( rsum < 8192)
{
switch((rbufsize>> i*2) & 0x03) // Set maximum Rx memory size
{
case 0:
RSIZE[i] = 1024;
RMASK[i] = 0x000003FF;
break;
case 1:
RSIZE[i] = 2048;
RMASK[i] = 0x000007FF;
break;
case 2:
RSIZE[i] = 4096;
RMASK[i] = 0x00000FFF;
break;
case 3:
RSIZE[i] = 8192;
RMASK[i] = 0x00001FFF;
break;
}
}
ssum += SSIZE[i];
rsum += RSIZE[i];
if(i != 0) // Set base address of Tx and Rx memory for channel #1,#2,#3
{
SBUFBASEADDRESS[i] = SBUFBASEADDRESS[i-1] + SSIZE[i-1];
RBUFBASEADDRESS[i] = RBUFBASEADDRESS[i-1] + RSIZE[i-1];
}
#ifdef DEBUG
PutHTOA(i); PutString(" : 0x");PutITOA(SSIZE[i]); PutString(" : 0x");PutITOA(RSIZE[i]);PutStringLn("");
#endif
}
I_STATUS[0] = 0;
PF.DR.BIT.B0 = 0x00; //Red LED on; add by brucelyang 2005.8.30
COMMAND(0) = CSYS_INIT;
//while(!(I_STATUS[0] & SSYS_INIT_OK));
//add by brucelyang 2005.8.18
while(!(I_STATUS[0] & SSYS_INIT_OK))
{
// m ++;
WATCH_DOG;
}
PF.DR.BIT.B0 = 0x01; //Red LED off; add by brucelyang 2005.8.30
///////////end of brucelyang//////
}
/*
********************************************************************************
* Initialization function to appropriate channel
*
* Description : Initialize designated channel and wait until W3100 has done.
* Arguments : s - channel number
* protocol - designate protocol for channel
* SOCK_STREAM(0x01) -> TCP.
* SOCK_DGRAM(0x02) -> UDP.
* SOCK_IPL_RAW(0x03) -> IP LAYER RAW.
* SOCK_MACL_RAW(0x04) -> MAC LAYER RAW.
* port - designate source port for appropriate channel
* flag - designate option to be used in appropriate.
* SOCKOPT_BROADCAST(0x80) -> Send/receive broadcast message in UDP
* SOCKOPT_NDTIMEOUT(0x40) -> Use register value which designated TIMEOUT value
* SOCKOPT_NDACK(0x20) -> When not using no delayed ack
* SOCKOPT_SWS(0x10) -> When not using silly window syndrome
* Returns : When succeeded : Channel number, failed :1
* Note : API Function
********************************************************************************
*/
char socket(SOCKET s, unsigned char protocol, unsigned int port, unsigned char flag)
{
unsigned char k;
OPT_PROTOCOL(s) = protocol | flag; // Designate socket protocol and option
if (port != 0) // setup designated port number
{
k = (unsigned char)((port & 0xff00) >> 8);
*(SRC_PORT_PTR(s)) = k;
k = (unsigned char)(port & 0x00ff);
*(SRC_PORT_PTR(s) + 1) = k;
}
else // Designate random port number which is managed by local when you didn't designate source port
{
Local_Port++;
*SRC_PORT_PTR(s) = (unsigned char)((Local_Port & 0xff00) >> 8);
*(SRC_PORT_PTR(s) + 1) = (unsigned char)(Local_Port & 0x00ff);
}
I_STATUS[s] = 0;
COMMAND(s) = CSOCK_INIT; // SOCK_INIT
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);
}
/*
********************************************************************************
* Waits for connection request from a peer (Non-blocking Mode)
*
* Description : Wait for connection request from a peer through designated channel (TCP Server mode)
* Arguments : s - channel number
* Returns : None
* Note : API Function
********************************************************************************
*/
void NBlisten(SOCKET s)
{
I_STATUS[s] = 0;
COMMAND(s) = CLISTEN; // LISTEN
}
/*
********************************************************************************
* Create random value for initial Seq# when establishing TCP connection
*
* Description : In this function, you can add some source codes to create random number for initial Seq#
* In real, TCP initial SEQ# should be random value.
* (Currently, we're using static value in EVB/DK.)
* Arguments : s - channel number
* Returns : None
* Note : API Function
********************************************************************************
*/
static void initseqnum(SOCKET s)
{
int 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) = SEQ_NUM.cVal[0];
*(TX_WR_PTR(s) + 1) = SEQ_NUM.cVal[1];
*(TX_WR_PTR(s) + 2) = SEQ_NUM.cVal[2];
*(TX_WR_PTR(s) + 3) = SEQ_NUM.cVal[3];
wait_1us(2); // 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) = SEQ_NUM.cVal[0];
*(TX_RD_PTR(s) + 1) = SEQ_NUM.cVal[1];
*(TX_RD_PTR(s) + 2) = SEQ_NUM.cVal[2];
*(TX_RD_PTR(s) + 3) = SEQ_NUM.cVal[3];
wait_1us(2); // Wait until TX_RD_PRT has been written safely.
*TX_ACK_PTR(s) = SEQ_NUM.cVal[0];
*(TX_ACK_PTR(s) + 1) = SEQ_NUM.cVal[1];
*(TX_ACK_PTR(s) + 2) = SEQ_NUM.cVal[2];
*(TX_ACK_PTR(s) + 3) = SEQ_NUM.cVal[3];
}
static void wait_1us(int cnt)
{
int i;
for(i=0;i<cnt;i++)
{
}
}
static void ISR_ESTABLISHED(SOCKET s)
{
unsigned char dest_ip[4];
int i;
unsigned char flag;
char tmp[100];
unsigned short dst_port;
flag = 0;
//sci0_print("I'm in ISR_ESTABLISHED,socket is ");
//sci0_reg_print((unsigned long)s);
//sci0_print("\r\n");
switch(s)
{
case TCP_SERVER_CHANNEL:
//(tt_page1.Tdtr == 'H') and DSR BUSY
if((wait_connect_flag == 1) || (Prog_Mode == 1)||(ethernet_status & UDP_CHANNEL_ON)
||(ethernet_status & TCP_CLIENT_CHANNEL_ON)
||(((tt_page1.Tdtr == 'H') || (tt_page1.Tdtr == 'h'))&&(PG.PORT.BIT.B0 == 1)))
{
//sci0_print("DTR=H and DSR=BUSY,close TCP\r\n");
close(TCP_SERVER_CHANNEL);
return;
}
Ch_connect = ETH_TCP_ON;
ethernet_status = ethernet_status | TCP_SERVER_CHANNEL_ON;
//點亮綠燈 ,add by wqf 2005.06.03
PF.DR.BIT.B0 = 0x01;
PF.DR.BIT.B1 = 0x00;
//add by wqf 2005.5.25,當有網絡連接時,輸出DTR有效通知終終端
if((tt_page1.Tdtr == 'S') ||(tt_page1.Tdtr == 's'))
{
P7.DR.BIT.B6 = 0;
}
if((tt_page1.Rmsg == 'E') || (tt_page1.Rmsg == 'e') )
{
//取得對方IP地址并顯示,add by wqf 2005.6.6
dest_ip[0] = *DST_IP_PTR(s);
dest_ip[1] = *(DST_IP_PTR(s)+1);
dest_ip[2] = *(DST_IP_PTR(s)+2);
dest_ip[3] = *(DST_IP_PTR(s)+3);
dst_port = ((*(DST_PORT_PTR(s)+1))&0xFF) | (*DST_PORT_PTR(s) <<8);
for(i=0;i<MAX_DST_TBL;i++)
{
if((memcmp(tt_page3.Youip[i],dest_ip,4) != 0) || (tt_page3.Youport[i] != dst_port))
{
continue;
}
else
{
break;
}
}
if(i < MAX_DST_TBL)
{
sprintf(tmp,"ESTABLISHED%02d\r\n",i+1);
Sel_prtmsg(0,tmp);
}
if(i == MAX_DST_TBL)
{
sprintf(tmp,"ESTABLISHED %d.%d.%d.%d:%d\r\n",dest_ip[0],dest_ip[1],dest_ip[2],dest_ip[3],dst_port);
Sel_prtmsg(0,tmp);
}
}
//開始計算沒有通信的空閑時間 add by wqf 2005.05.31
if(tt_page2.Keeptim !=0)
{
wtm_flag = 1;
}
//}
//else
//{
// close(TCP_SERVER_CHANNEL);
// Ch_connect = ETH_OFF;
// return;
//}
break;
case TCP_CLIENT_CHANNEL:
//sci0_print("in ISR_ES,TCP_CLIENT_CHANNEL\r\n");
break;
case UDP_CHANNEL:
break;
case TELNET_SERVER_CHANNEL:
//if(prog_mode == 1) close(TELNET_SERVER_CHANNEL);
//else progcmd(99); ---->telnet_ch==99
telnet_init();
break;
default:
break;
}
}
static void ISR_CLOSED(SOCKET s)
{
unsigned int val;
//sci0_print("I'm in ISR_CLOSED,socket is ");
sci0_print("I'm in ISR_CLOSED\r\n");
val = SOCK_STATUS(s);
sci0_reg_print((unsigned long)val);
sci0_print("\r\n");
switch(s)
{
case TCP_SERVER_CHANNEL:
//sci0_print("Server\r\n");
//passive close
if(SOCK_STATUS(TCP_SERVER_CHANNEL) == SOCK_CLOSE_WAIT)
{
//sci0_print("passive close\r\n");
close(TCP_SERVER_CHANNEL);
}
//如果是從通信狀態斷開的TCP server(還有從listen態斷開的)
if((Ch_connect == ETH_TCP_ON) && (ethernet_status & TCP_SERVER_CHANNEL_ON))
{
ethernet_status = ethernet_status & ~TCP_SERVER_CHANNEL_ON;
Ch_connect = ETH_OFF;
//熄滅LED,add by wqf 2005.06.03
PF.DR.BIT.B0 = 0x01;
PF.DR.BIT.B1 = 0x01;
//打印提示信息,add by wqf 2005.6.7
Sel_prtmsg(0,"CLOSE COMPLETED\r\n");
//if((PRGPAGE.progmode != 4) ||(PRGPAGE.progmode != 3))Sel_prtmsg(0,"CLOSE COMPLETED\r\n");
//清除wtm的計時標志以及計數器 add by wqf 2005.05.31
wtm_flag =0;
wtm_time = 0;
//add by wqf 2005.5.25,當網絡連接斷開時,輸出DTR無效通知終終端
if((tt_page1.Tdtr == 'S') ||(tt_page1.Tdtr == 's'))
{
P7.DR.BIT.B6 = 1;
}
}
break;
case TCP_CLIENT_CHANNEL:
//sci0_print("Client\r\n");
//2005.4.29 add by wqf
//passive close
if(SOCK_STATUS(TCP_CLIENT_CHANNEL) == SOCK_CLOSE_WAIT)
{
close(TCP_CLIENT_CHANNEL);
}
//如果是從通信狀態斷開的TCP server(還有從listen態斷開的)
if((Ch_connect == ETH_TCP_ON) && (ethernet_status & TCP_CLIENT_CHANNEL_ON))
{
ethernet_status = ethernet_status & ~TCP_CLIENT_CHANNEL_ON;
Ch_connect = ETH_OFF;
//打印提示信息,add by wqf 2005.6.6
Sel_prtmsg(0,"CLOSE COMPLETED\r\n");
//if((PRGPAGE.progmode != 4) ||(PRGPAGE.progmode != 3))Sel_prtmsg(0,"CLOSE COMPLETED\r\n");
//清除wtm的計時標志以及計數器 add by wqf 2005.05.31
wtm_flag =0;
wtm_time = 0;
//熄滅LED,add by wqf 2005.06.03
PF.DR.BIT.B0 = 0x01;
PF.DR.BIT.B1 = 0x01;
//add by wqf 2005.5.25,當網絡連接斷開時,輸出DTR無效通知終終端
if((tt_page1.Tdtr == 'S') ||(tt_page1.Tdtr == 's'))
{
P7.DR.BIT.B6 = 1;
}
}
//pw設定時,如果已建立的連接斷開時,重新連接的處理 add by wqf 2005.05.27
if((pw_connect ==1 )&& (tt_page2.Dcct !=0))
{
pw_connect =2;
}
break;
case UDP_CHANNEL:
break;
case TELNET_SERVER_CHANNEL:
if(SOCK_STATUS(TELNET_SERVER_CHANNEL) == SOCK_CLOSE_WAIT)
{
telnet_close();
}
break;
default:
break;
}
return;
}
static void ISR_TIMEOUT(SOCKET s)
{
unsigned int val;
sci0_print("I'm in ISR_TIMEOUT\r\n");
val = SOCK_STATUS(s);
//sci0_print("I'm in ISR_TIMEOUT,socket is ");
sci0_reg_print((unsigned long)val);
sci0_print("\r\n");
}
static void ISR_SEND_OK(SOCKET s)
{
//sci0_print("I'm in ISR_SEND_OK,socket is ");
//sci0_reg_print((unsigned long)s);
//sci0_print("\r\n");
}
static void ISR_RECV_OK(SOCKET s)
{
//sci0_print("I'm in ISR_RECV_OK,socket is ");
//sci0_reg_print((unsigned long)s);
//sci0_print("\r\n");
}
static void ISR_RX(SOCKET s)
{
struct _UDPHeader UDPHeader;
un_l2cval wr_ptr, rd_ptr;
unsigned char k;
unsigned long size,receive_size;
unsigned int i,size1,size2;
unsigned char * dst,*dst1,*recv_ptr;
unsigned char ip_addr[4];
unsigned short udp_port;
char tmp[100];
char *data_tmp;
//sci0_print("~");
//sci0_print("I'm in ISR_RX,socket is ");
//sci0_reg_print((unsigned long)s);
//sci0_print("\r\n");
switch(s)
{
case TCP_SERVER_CHANNEL:
case TCP_CLIENT_CHANNEL:
//sci0_reg_print((unsigned long)SOCK_STATUS(s));
//add the flow control --- add by brucelyang 2005.8.2
if(sendpause_flag == 1) return;
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;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -