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

📄 w3100a.c

📁 hew编译环境
💻 C
📖 第 1 页 / 共 5 页
字号:
		//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; 
		
		//点亮RJ-45 LED add by wqf 2005.06.14
		PF.DR.BIT.B2 = 0x00;
		//初始化100ms计数器,开始计时
		rj45led_flag = 1;
		//清除计数个数
		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 ;//清除通信空闲时间计数

		/*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数据,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数据的发送者的IP附加在UDP数据之前 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; 
	
			//点亮RJ-45 LED add by wqf 2005.06.14
			PF.DR.BIT.B2 = 0x00;
			//初始化100ms计数器,开始计时
			rj45led_flag = 1;
			//清除计数个数
			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;   
		
		//点亮RJ-45 LED add by wqf 2005.06.14
		PF.DR.BIT.B2 = 0x00;
		//初始化100ms计数器,开始计时
		rj45led_flag = 1;
		//清除计数个数
		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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -