?? w3100a.c
字號:
{
INTC.ISR.BIT.IRQ1F=0; //清空標志位
INTC.IER.BIT.IRQ1E = 0x00; // disable Interrupt IRQ1
if(virtual_com == 1)
{
if(P1.PORT.BIT.B6 == 0)
{
VtulCom_PreComConfig.THIRDBYTE.BIT.CTS = 0x01; //CTS有效
}
else
{
VtulCom_PreComConfig.THIRDBYTE.BIT.CTS = 0x00; //CTS無效
}
tcp_write(VTL_TCP_CONTROL_CHANNEL,(unsigned char *)&VtulCom_PreComConfig,5);
INTC.IER.BIT.IRQ1E = 0x01; // Eable Interrupt IRQ1
//set_imask_ccr(0);
return;
}
INTC.IER.BIT.IRQ1E = 0x01; // Eable Interrupt IRQ1
return;
}
//先讀一下CD狀態(tài),以判斷上、下跳變?
void irq7_DCD(void)
{
INTC.ISR.BYTE = INTC.ISR.BYTE & ~0x80;
INTC.IER.BIT.IRQ7E = 0x00;
//if cd==mm,and the mm is connect,then cut the connect
//sci0_print("irq7,DCD and CTS interrupt\r\n");
///////////////////for virtual comm//////////////////////////
///////////////////add by brucelyang 2005.7.12///////////////
if(virtual_com == 1)
{
//DCD和CTS狀態(tài)線變化
if(PG.PORT.BIT.B1 == 0)
{
VtulCom_PreComConfig.THIRDBYTE.BIT.CD = 0x01; //CD有效
//VtulCom_PreComConfig.THIRDBYTE.BIT.CTS = 0x01; //CTS有效
}
else
{
VtulCom_PreComConfig.THIRDBYTE.BIT.CD = 0x00; //CD無效
//VtulCom_PreComConfig.THIRDBYTE.BIT.CTS = 0x00; //CTS無效
}
tcp_write(VTL_TCP_CONTROL_CHANNEL,(unsigned char *)&VtulCom_PreComConfig,5);
INTC.IER.BIT.IRQ7E = 0x01;
//set_imask_ccr(0);
return;
}
if(((tt_page1.Tcd > 0) && (tt_page1.Tcd < 11))&&(PG.PORT.BIT.B1 == 1)&&(ethernet_status & TCP_CLIENT_CHANNEL_ON))
{
//sci0_print("CD=nn and CD is busy,close TCP\r\n");
close(TCP_CLIENT_CHANNEL);
ethernet_status &= ~TCP_CLIENT_CHANNEL_ON;
Ch_connect =ETH_OFF;
//add by wqf 2005.6.8
Sel_prtmsg(0,"TIME WAIT\r\n");
//下一次允許連接計時開始 add by wqf 2005.05.30
wait_flag = 1;
wait_connect_flag = 1;
//清除wtm的計時標志以及計數(shù)器 add by wqf 2005.05.31
wtm_flag =0;
wtm_time = 0;
//end of add by wqf
//熄滅LED,add by wqf 2005.06.03
PF.DR.BIT.B0 = 0x01;
PF.DR.BIT.B1 = 0x01;
}
//CD輸入為有效時,與指定的IP建立TCP連接,add by wqf 2005.6.7
if((tt_page1.Tcd > 0) && (tt_page1.Tcd < 11)&&(PG.PORT.BIT.B1 == 0)&& (Ch_connect == ETH_OFF) &&(Prog_Mode == 0))
{
//sci0_print("CD is ready,TCP handle\r\n");
if(cd_ready_flag == 0)
{
//sci0_print("1st time CD is ready\r\n");
cd_ready_flag = 1;
//return;
}
else
{
//sci0_print("in else CD\r\n");
cd_connect_flag = 1;
}
}
INTC.IER.BIT.IRQ7E = 0x01;
}
/*
********************************************************************************
* Copies the system buffer data to the transmit buffer of the W3100A.
*
* Description : Copies the system buffer data to the transmit buffer of the W3100A.
* It is called from the send_in()or sendto_in() function.
* Arguments : s - channel number
* src - system buffer pointer
* dst - send buffer pointer of W3100A
* len - data size to copy
* Returns : copied data size
* Note : Internal Function
********************************************************************************
*/
static unsigned int write_data(SOCKET s, unsigned char *src, unsigned char *dst, int len)
{
unsigned int i, size, size1;
if (len == 0) return 0;
if ( (((unsigned int)dst & SMASK[s]) + len) > SSIZE[s] )
{
size = SSIZE[s] - ((unsigned int)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++;
return len;
}
void often_tsk(void)
{
if(SOCK_STATUS(TCP_SERVER_CHANNEL) == SOCK_CLOSED)
{
socket(TCP_SERVER_CHANNEL,SOCK_STREAM,tt_page2.Tsport,0);
NBlisten(TCP_SERVER_CHANNEL);
}
//sci0_reg_print((unsigned long )SOCK_STATUS(TELNET_SERVER_CHANNEL));
if ((telnet_close_flag == 0) && (SOCK_STATUS(TELNET_SERVER_CHANNEL) == SOCK_CLOSED))
{
//sci0_print("telnet socket task ofter\r\n");
socket(TELNET_SERVER_CHANNEL, SOCK_STREAM,23,0);
//sci0_print("telnet listen task ofter\r\n");
NBlisten(TELNET_SERVER_CHANNEL);
}
if ((telnet_close_flag == 1) && (SOCK_STATUS(TELNET_SERVER_CHANNEL) != SOCK_CLOSED))
{
//sci0_print("closing telnet channel\r\n");
close(TELNET_SERVER_CHANNEL);
}
else if ((telnet_close_flag == 1) && (SOCK_STATUS(TELNET_SERVER_CHANNEL) == SOCK_CLOSED))
{
telnet_close_flag = 0;
//DTR有效時,與指定IP建立TCP連接 add by wqf 2005.6.8
if(dtr_connect_flag == 1)
{
sprintf(dtr_cmd,"OPEN%d",tt_page1.Tdtr);
dtr_argv[0]= dtr_cmd;
opencmd(1,dtr_argv,0);
dtr_connect_flag = 0;
//sci0_print("I'm return dtr\r\n");
}
//CD有效時,與指定IP建立TCP連接 add by wqf 2005.6.8
if(cd_connect_flag == 1)
{
//sci0_print("in cd_connect_flag=1\r\n");
sprintf(cd_cmd,"OPEN%d",tt_page1.Tcd);
cd_argv[0]= cd_cmd;
//sci0_print("before opencmd\r\n");
opencmd(1,cd_argv,0);
cd_connect_flag = 0;
//sci0_print("I'm return cd\r\n");
}
if(KWT_flag == 1)
{
//sci0_print("I'll quit\r\n");
quitcmd(1,"QUIT",0);
KWT_flag = 0;
}
//add for flow control --- add by brucelyang 2005.8.3
if(sendpause_flag == 2)
{
if(Ch_connect == ETH_TCP_ON) //just for tcp --- add by brucelyang 2005.8.3
{
if(ethernet_status & TCP_SERVER_CHANNEL_ON)
{
INTC.IER.BIT.IRQ0E = 0x00;
ISR_RX(0);
INTC.IER.BIT.IRQ0E = 0x01;
}
else
{
INTC.IER.BIT.IRQ0E = 0x00;
ISR_RX(1);
INTC.IER.BIT.IRQ0E = 0x01;
}
}
sendpause_flag = 0;
}
}
/*
********************************************************************************
* Connection establishing function to designated peer.
*
* Description : This function establish a connection to the peer by designated channel,
* and wait until the connection is established successfully. (TCP client mode)
* Arguments : s - channel number
* addr - destination IP Address
* port - destination Port Number
* Returns : when succeeded : 1, failed : -1
* Note : API Function
********************************************************************************
*/
char connect(SOCKET s, unsigned char * addr, unsigned short port)
{
if (port != 0)
{ // designate destination port
*DST_PORT_PTR(s) = (unsigned char)((port & 0xff00) >> 8);
*(DST_PORT_PTR(s) + 1) = (unsigned char)(port & 0x00ff);
}
else return (-1);
*DST_IP_PTR(s) = addr[0]; // designate destination IP address
*(DST_IP_PTR(s) + 1) = addr[1];
*(DST_IP_PTR(s) + 2) = addr[2];
*(DST_IP_PTR(s) + 3) = addr[3];
I_STATUS[s] = 0;
COMMAND(s) = CCONNECT; // CONNECT
// Connecting_flag = 1;
while (I_STATUS[s] == 0)
{ // Wait until connection is established successfully
if (select(s, SEL_CONTROL) == SOCK_CLOSED)
{
return -1;
}
sci0_read();
WATCH_DOG;
if (telnet_read_flag == 1)
{
telnet_read();
}
often_tsk();
//設定pw時,如果已經(jīng)建立的連接斷開時,重試連接的處理
if(pw_connect==2)
{
disconnect_retry();
}
} // When failed, appropriate channel will be closed and return an error
// Connecting_flag = 0;
//if (!(I_STATUS[s] & SESTABLISHED)) return (-1); // Error
//return (1);
if(I_STATUS[s] & SESTABLISHED) return 1;
else if(I_STATUS[s] & STIMEOUT) return (-1);
else return (-2);
}
////////////////////////////////////////for Virtual Comm///////////////
///////////////////////////////////////////////////////////////////////
static void VTUL_ESTABLISHED(SOCKET s)
{
unsigned char dest_ip[4];
unsigned char flag;
int i;
struct _VtulComControlHeader VtulCom_control;
// sci0_print("I'm in VTUL_ESTABLISHED,socket is ");
// sci0_reg_print((unsigned long)s);
// sci0_print("\r\n");
flag = 0;
switch(s)
{
case VTL_TCP_DATA_CHANNEL:
Ch_connect = ETH_TCP_ON;
ethernet_status = ethernet_status | TCP_SERVER_CHANNEL_ON;
//LED為綠色,add by brucelyang 2005.07.14
PF.DR.BIT.B0 = 0x01;
PF.DR.BIT.B1 = 0x00;
break;
case VTL_TCP_CONTROL_CHANNEL:
flag = 1;
if(flag == 1)
{
//return control_packet and start timer for it
feed_control_packet(&VtulCom_control);
//the initial value of VtulCom_PreComConfig
memcpy(&VtulCom_PreComConfig,&VtulCom_control,sizeof(struct _VtulComControlHeader));
tcp_write(VTL_TCP_CONTROL_CHANNEL,(unsigned char *)&VtulCom_control,5);
VtulComTimer_flag = 1;
}
else
{
sci0_print("close 1531\r\n");
close(VTL_TCP_CONTROL_CHANNEL);
VtulComTimer_flag = 0;
VtulComTimer = 0;
VtulComTimerReset = 0;
VtulComSendCon_flag = 0;
VtulComRecvTimeout_flag = 0;
}
break;
case VTL_TCP_CONFIG_CHANNEL:
if(Ch_connect == ETH_TCP_ON)
{
sci0_print("Ch_connect is ETH_TCP_ON,so close it\r\n");
close(VTL_TCP_CONFIG_CHANNEL); //在通信狀態(tài)下不接受管理工具配置 by brucelyang 2005.7.15
}
break;
case VTL_UDP_BROADCAST_CHANNEL:
break;
}
return;
}
static void VTUL_CLOSED(SOCKET s)
{
switch(s)
{
case VTL_TCP_DATA_CHANNEL:
//passive close
if(SOCK_STATUS(VTL_TCP_DATA_CHANNEL) == SOCK_CLOSE_WAIT)
{
sci0_print("passive close\r\n");
close(VTL_TCP_DATA_CHANNEL);
}
Ch_connect = ETH_OFF;
ethernet_status = ethernet_status & ~TCP_SERVER_CHANNEL_ON;
//LED熄滅,add by brucelyang 2005.07.14
PF.DR.BIT.B0 = 0x01;
PF.DR.BIT.B1 = 0x01;
break;
case VTL_TCP_CONTROL_CHANNEL:
//passive close
if(SOCK_STATUS(VTL_TCP_CONTROL_CHANNEL) == SOCK_CLOSE_WAIT)
{
sci0_print("passive close\r\n");
close(VTL_TCP_CONTROL_CHANNEL);
}
VtulComTimer_flag = 0;
VtulComTimer = 0;
VtulComTimerReset = 0;
VtulComSendCon_flag = 0;
VtulComRecvTimeout_flag = 0;
break;
case VTL_TCP_CONFIG_CHANNEL:
//passive close
if(SOCK_STATUS(VTL_TCP_CONFIG_CHANNEL) == SOCK_CLOSE_WAIT)
{
sci0_print("passive close\r\n");
close(VTL_TCP_CONFIG_CHANNEL);
}
break;
case VTL_UDP_BROADCAST_CHANNEL:
break;
}
return;
}
static void VTUL_TIMEOUT(SOCKET s)
{
// sci0_print("I'm in VTUL_TIMEOUT,socket is ");
// sci0_reg_print((unsigned long)s);
// sci0_print("\r\n");
switch(s)
{
case VTL_TCP_DATA_CHANNEL:
break;
case VTL_TCP_CONTROL_CHANNEL:
break;
case VTL_TCP_CONFIG_CHANNEL:
break;
case VTL_UDP_BROADCAST_CHANNEL:
break;
}
return;
}
extern unsigned long debug_cnt1;
static void VTUL_RX(SOCKET s)
{
struct _UDPHeader UDPHeader;
struct _VtulComControlHeader VtlConHeader;
unsigned char ip_addr[4];
unsigned short port;
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 string_flag;
unsigned char ConfigTools_packet[20];
unsigned char answer_configstr[51];
const unsigned char configstr1[18] = {0,'E','N','E','T','V','T','L',0,0,0,0,0,0,0,0,0,0};
const unsigned char configstr2[10] = {0,0,0,0,0,0,0,0,0,0};
#if 0
unsigned short ly_counter;
#endif
// sci0_print("I'm in VTUL_RX,socket is ");
// sci0_reg_print((unsigned long)s);
// sci0_print("\r\n");
string_flag = 0;
switch(s)
{
case VTL_TCP_DATA_CHANNEL:
set_imask_ccr(1);
#if 0
/*get the counter*/
TPU.TSTR.BYTE &= ~0x01;
ly_counter = TPU0.TCNT;
sci0_write('s');
sci0_reg_print((unsigned long)ly_counter);
TPU.TSTR.BYTE |= 0x01;/*start count*/
#endif
k = *SHADOW_RXWR_PTR(s); // Must read the shadow register for reading 4byte pointer registers
#if 0
/*get the counter*/
TPU.TSTR.BYTE &= ~0x01;
ly_counter = TPU0.TCNT;
sci0_write('e');
sci0_reg_print((unsigned long)ly_counter);
TPU.TSTR.BYTE |= 0x01;/*start count*/
#endif
wait_1us(1); // wait for reading 4byte pointer registers safely
#if 0
/*get the counter
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -