⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 w3100a.c

📁 hew编译环境
💻 C
📖 第 1 页 / 共 5 页
字号:
{
	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状态,以判断上、下跳变?
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状态线变化
		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的计时标志以及计数器 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时,如果已经建立的连接断开时,重试连接的处理
		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);	//在通信状态下不接受管理工具配置 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 + -