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

📄 w3100a.c

📁 hew编译环境
💻 C
📖 第 1 页 / 共 5 页
字号:
		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 + -