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

📄 w3100a.c

📁 hew编译环境
💻 C
📖 第 1 页 / 共 5 页
字号:
#include <machine.h>
#include "global.h"
#include "2239s.h"
#include "w3100a.h"
#include <string.h>
#include "sci.h"
#include <stdio.h>
#include "vtul_com.h"


/*
###############################################################################
Define Part
###############################################################################
*/
//#define DEBUG                        // Add debugging code

/*
###############################################################################
Local Variable Declaration Section
###############################################################################
*/
unsigned char I_STATUS[4];              // Store Interrupt Status according to channels
unsigned int Local_Port;                // Designate Local Port
un_l2cval SEQ_NUM;               // Set initial sequence number
                                                
unsigned long SMASK[MAX_SOCK_NUM];      // Variable to store MASK of Tx in each channel, on setting dynamic memory size.
unsigned long RMASK[MAX_SOCK_NUM];      // Variable to store MASK of Rx in each channel, on setting dynamic memory size.
int SSIZE[MAX_SOCK_NUM];         // Maximun Tx memory size by each channel
int RSIZE[MAX_SOCK_NUM];         // Maximun Rx memory size by each channel
unsigned char *SBUFBASEADDRESS[MAX_SOCK_NUM];     // Maximun Tx memory base address by each channel
unsigned char *RBUFBASEADDRESS[MAX_SOCK_NUM];     // Maximun Rx memory base address by each channel

/******************************defined by brucelyang**********************/
unsigned char ethernet_status;
/*******************************end of brucelyang*************************/

/*
###############################################################################
Extern Variable Declaration Section
###############################################################################
*/
extern T_PAGE1 tt_page1;
extern T_PAGE2 tt_page2;
extern T_PAGE3 tt_page3;
extern T_PAGE4 tt_page4;
extern unsigned char enettors232_buf[ENETTORS232_BUFSIZE];  //串口发送缓存
extern unsigned char *enettors232_rdptr,*enettors232_wrptr; //串口发送缓存读写指针
extern unsigned short Prog_Mode;
extern short Ch_connect;

///////////////////////////////added by ggd///////////////////////////////////
unsigned char * telnet_wrptr;				//telnet 接受缓冲区写指针
unsigned char * telnet_rdptr;				//telnet 接受缓冲区读指针
unsigned char telnet_recv_buf[TEL_BUF];		//telnet 接受缓冲区
extern int telnet_close_flag;
extern int telnet_read_flag;
extern volatile int tx_cnt;
///////////////////////////////end of ggd/////////////////////////////////////

//add by wqf
extern unsigned long wtm_time;				//wtm设定时,断开连接计时的时间,add by wqf 2005.5.31
extern char wtm_flag;						//wtm设定时,开始计数的标志,add by wqf 2005.5.31
extern char wait_flag;						//wait设定时,开始计数的标志,add by wqf 2005.5.30
extern char wait_connect_flag;				//wait设定时,重试标志,add by wqf 2005.05.30
extern char dtr_ready_flag;//DTR输入有效的标志,add by wqf 2005.6.8
extern char cd_ready_flag;//CD输入有效的标志,add by wqf 2005.6.8
extern char dtr_connect_flag;//DTR输入有效引起的建立TCP连接的标志,add by wqf 2005.6.8
extern char cd_connect_flag;//CD输入有效引起的建立TCP连接的标志,add by wqf 2005.6.8

extern char rj45led_flag;						//add by wqf 2005.6.14
extern unsigned long rj45led_time;				//add by wqf 2005.6.14

static char cd_cmd[10];
static char *cd_argv[2];
static char dtr_cmd[10];
static char *dtr_argv[2];
//end of add by wqf



extern char pw_connect;					//pw设定时,连接成功的标志 add by wqf 2005.05.27
//added by brucelyang
unsigned long overlay_counter;
extern unsigned char KWT_flag;
//extern unsigned char Connecting_flag;
//extern char dtm_flag;						//dct设定时,开始计数的标志,add by wqf 2005.5.27
//extern char dtm_connect_flag;				//dct设定时,重试标志,add by wqf 2005.5.27
//extern SIOCH_LINE      siochline;

//add by brucelyang 2005.8.12
extern _PRGPAGE PRGPAGE; 					//存储PROGMODE中的状态信息
//static char *ly_arg[32];

//for virtual COMM
extern unsigned char virtual_com;
extern T_PAGE4 page4_temp;
extern unsigned char VtulComTimerReset;		// 2005.7.26 add by brucelyang
unsigned char sendpause_flag;				//网络暂停发送标志
unsigned char VtulComTimer_flag;			//虚拟串口控制信息发送定时开始标志
unsigned long VtulComTimer;					//虚拟串口控制信息发送定时器
unsigned char VtulComSendCon_flag;      	//虚拟串口控制信息发送标志
unsigned char VtulComRecvTimeout_flag; 		//vtulCom控制信息接收超时标志
struct _VtulComControlHeader VtulCom_PreComConfig;	//存储前一次SCI0的配置
static void VTUL_ESTABLISHED(SOCKET s);
static void VTUL_CLOSED(SOCKET s);
static void VTUL_TIMEOUT(SOCKET s);
static void VTUL_RX(SOCKET s);
void feed_control_packet(struct _VtulComControlHeader *control_packet);
void deal_control_packet(struct _VtulComControlHeader *control_packet);

volatile unsigned int timeout_cnt_w3100;			//modified in 20060320 by ggd

/*
###############################################################################
static Function Declaration Section
###############################################################################
*/

static void sysinit(unsigned char sbufsize, unsigned char rbufsize);
static void initseqnum(SOCKET s);
static void wait_1us(int cnt);
//static void initseqnum(SOCKET s);
static void ISR_ESTABLISHED(SOCKET s);
static void ISR_CLOSED(SOCKET s);
static void ISR_TIMEOUT(SOCKET s);
static void ISR_SEND_OK(SOCKET s);
static void ISR_RECV_OK(SOCKET s);
static void ISR_RX(SOCKET s);
static int select(SOCKET s, unsigned char func);
static int send_in(SOCKET s, unsigned char *buf, int len);
static unsigned int write_data(SOCKET s, unsigned char *src, unsigned char *dst, int len);

/*
###############################################################################
Function Implementation Section
###############################################################################
*/

void irq0_init(void)
{
	INTC.ISCR.BYTE.L = 0x01;	/*IRQ0 interrupt request at level low*/
	INTC.ISR.BYTE = 0x00;		/*clear interrupt flag*/
	INTC.IER.BIT.IRQ0E = 0x01;
}


void irq0(void)
{
	unsigned char status;

	INTC.ISR.BYTE = INTC.ISR.BYTE & ~0x01;
	INTC.IER.BIT.IRQ0E = 0x00;
	status = INT_REG;

	while (status) {
		if (status & 0x01) {      // channel 0 interrupt(sysinit, sockinit, established, closed, timeout, send_ok, recv_ok)
			I_STATUS[0] = INT_STATUS(0);
			if(I_STATUS[0] & SESTABLISHED) 
			{
				if(virtual_com == 1)
				{
					VTUL_ESTABLISHED(0);
				}
				else
				{
					ISR_ESTABLISHED(0);
				}
			}
			if(I_STATUS[0] & STIMEOUT) 
			{
				if(virtual_com == 1)
				{
					VTUL_TIMEOUT(0);
				}
				else
				{
					ISR_TIMEOUT(0);
				}
			}
			if(I_STATUS[0] & SCLOSED) 
			{
				if(virtual_com == 1)
				{
					VTUL_CLOSED(0);
				}
				else
				{
					ISR_CLOSED(0);
				}
			}
			//if(I_STATUS[0] & SSEND_OK) ISR_SEND_OK(0);
			//if(I_STATUS[0] & SRECV_OK) ISR_RECV_OK(0);
			INT_REG = 0x01;
		}

		if (status & 0x02) {      // channel 1 interrupt(sysinit, sockinit, established, closed, timeout, send_ok, recv_ok)
			I_STATUS[1] = INT_STATUS(1);
			if(I_STATUS[1] & SESTABLISHED) 
			{
				if(virtual_com == 1)
				{
					VTUL_ESTABLISHED(1);
				}
				else
				{
					ISR_ESTABLISHED(1);
				}
			}
			if(I_STATUS[1] & STIMEOUT) 
			{
				if(virtual_com == 1)
				{
					VTUL_TIMEOUT(1);
				}
				else
				{
					ISR_TIMEOUT(1);
				}
			}
			if(I_STATUS[1] & SCLOSED) 
			{
				if(virtual_com == 1)
				{
					VTUL_CLOSED(1);
				}
				else
				{
					ISR_CLOSED(1);
				}
			}
			//if(I_STATUS[1] & SSEND_OK) ISR_SEND_OK(1);
			//if(I_STATUS[1] & SRECV_OK) ISR_RECV_OK(1);
			INT_REG = 0x02;
		}

		if (status & 0x04) {      // channel 2 interrupt(sysinit, sockinit, established, closed, timeout, send_ok, recv_ok)
			I_STATUS[2] = INT_STATUS(2);
			if(I_STATUS[2] & SESTABLISHED) 
			{
				if(virtual_com == 1)
				{
					VTUL_ESTABLISHED(2);
				}
				else
				{
					ISR_ESTABLISHED(2);
				}
			}
			if(I_STATUS[2] & STIMEOUT) 
			{
				if(virtual_com == 1)
				{
					VTUL_TIMEOUT(2);
				}
				else
				{
					ISR_TIMEOUT(2);
				}
			}
			if(I_STATUS[2] & SCLOSED) 
			{
				if(virtual_com == 1)
				{
					VTUL_CLOSED(2);
				}
				else
				{
					ISR_CLOSED(2);
				}
			}
			//if(I_STATUS[2] & SSEND_OK) ISR_SEND_OK(2);
			//if(I_STATUS[2] & SRECV_OK) ISR_RECV_OK(2);
			INT_REG = 0x04;
		}

		if (status & 0x08) {      // channel 3 interrupt(sysinit, sockinit, established, closed, timeout, send_ok, recv_ok)
			I_STATUS[3] = INT_STATUS(3);
			if(I_STATUS[3] & SESTABLISHED) 
			{
				if(virtual_com == 1)
				{
					VTUL_ESTABLISHED(3);
				}
				else
				{
					ISR_ESTABLISHED(3);
				}
			}
			if(I_STATUS[3] & STIMEOUT) 
			{
				if(virtual_com == 1)
				{
					VTUL_TIMEOUT(3);
				}
				else
				{
					ISR_TIMEOUT(3);
				}
			}
			if(I_STATUS[3] & SCLOSED) 
			{
				if(virtual_com == 1)
				{
					VTUL_CLOSED(3);
				}
				else
				{
					ISR_CLOSED(3);
				}
			}
			//if(I_STATUS[3] & SSEND_OK) ISR_SEND_OK(3);
			//if(I_STATUS[3] & SRECV_OK) ISR_RECV_OK(3);
			INT_REG = 0x08;
		}

		if (status & 0x10)       // channel 0 receive interrupt
		{
			if(virtual_com == 1)
			{
				VTUL_RX(0);
			}
			else
			{
				ISR_RX(0);
			}
			INT_REG = 0x10;
		}

		if (status & 0x20)       // channel 1 receive interrupt
		{
			if(virtual_com == 1)
			{
				VTUL_RX(1);
			}
			else
			{
				ISR_RX(1);
			}
			INT_REG = 0x20;
		}

		if (status & 0x40)       // channel 2 receive interrupt
		{
			if(virtual_com == 1)
			{
				VTUL_RX(2);
			}
			else
			{
				ISR_RX(2);
			}
			INT_REG = 0x40;
		}

		if (status & 0x80)       // channel 3 receive interrupt
		{
			if(virtual_com == 1)
			{
				VTUL_RX(3);
			}
			else
			{
				ISR_RX(3);
			}
			INT_REG = 0x80;
		}

		status = INT_REG;
	}

	INT_REG = 0xFF;
	/*IRQ0 enable*/
	INTC.IER.BIT.IRQ0E = 0x01;
}

void init_w3100a(void)
{
	unsigned char i;
	//added by brucelyang 
	overlay_counter = 0;

	Local_Port = 5000;
	ethernet_status = ETHERNET_DEFAULT;
	//SEQ_NUM.lVal = 0x12233445;
	SEQ_NUM.lVal = 0x00000000;
	/*software reset command*/
	COMMAND(0) = CSW_RESET;
	/*setup gateway address:192.168.0.1*/
	for(i = 0; i < 4; i++)
	{
		*(GATEWAY_PTR + i) = tt_page2.Defg[i];
	}
	/*setup subnet mask:255.255.255.0*/
	for (i = 0; i < 4; i++) 
	{
		*(SUBNET_MASK_PTR + i) = tt_page2.Netm[i];
	}
	/*setup MAC address*/	
	for (i = 0; i < 6; i++) 
	{
		*(SRC_HA_PTR + i) = tt_page2.Mac[i];
	}
	/*setup IP address:192.168.0.51*/
	for (i = 0; i < 4; i++) 
	{
		*(SRC_IP_PTR + i) = tt_page2.Myip[i];
	}
	/*open interrupt for channel 0、1、2、3 both socket and receive data*/
	INTMASK = 0xff;

	set_imask_ccr(0);
	sysinit(0x55,0x55);
}

static void sysinit(unsigned char sbufsize, unsigned char rbufsize)
{
	char i;
	int ssum,rsum;
	//add by brucelyang 2005.8.18
	unsigned long m,n;
	m = 0;
	///////////end of brucelyang//////

	ssum = 0;
	rsum = 0;
	
	TX_DMEM_SIZE = sbufsize;                 // Set Tx memory size for each channel
	RX_DMEM_SIZE = rbufsize;                 // Set Rx memory size for each channel
	
	SBUFBASEADDRESS[0] = (unsigned char *)SEND_DATA_BUF;      // Set Base Address of Tx memory for channel #0
	RBUFBASEADDRESS[0] = (unsigned char *)RECV_DATA_BUF;      // Set Base Address of Rx memory for channel #0

#ifdef DEBUG
		PutStringLn("Channel : SEND MEM SIZE : RECV MEM SIZE");
#endif

	for(i = 0 ; i < MAX_SOCK_NUM; i++)               // Set maximum memory size for Tx and Rx, mask, base address of memory by each channel
	{
		SSIZE[i] = 0;
		RSIZE[i] = 0;

⌨️ 快捷键说明

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