?? w3100a.c
字號:
#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 + -