📄 net.c
字号:
#include <iom128v.h>
#include <net.h>
#include <control.h>
#include <macros.h>
//3100 address port
#define iDM_OR *(char*)(0x1140)
#define iDM_AR0 *(char*)(0x1144)
#define iDM_AR1 *(char*)(0x1148)
#define iDM_DR *(char*)(0x114C)
//3100 register
#define C0_TA_PR 0x18 // Channel 0 Tx ACK Pointer Register
#define C0_TW_PR 0x40 // Channel 0 Tx Write Pointer Register
#define C0_TR_PR 0x44 // Channel 0 Tx Read Pointer Register
#define C0_RR_PR 0x14 // Channel 0 Rx Read Pointer Register
#define C0_RW_PR 0x10 // Channel 0 Rx Write Pointer Register
#define NET_GATE 0x0070 //0x0054-0x0057
#define NET_SUB 0x0080 //0x0058-0x0061
#define NET_LIP 0x0090 //0x0062-0x0065
#define NET_DIP 0x00a0 //0x0066-0x0069
#define PASSWORD_ADD 0X0060 //0X0054-0X0059
#define COM_ADDR_H 0x0054
#define COM_ADDR_L 0x0055
const unsigned char pre_C0_TW_PR[4]={0x00,0x00,0x40,0x00};
const unsigned char pre_C0_TA_PR[4]={0x00,0x00,0x40,0x00};
const unsigned char pre_C0_TR_PR[4]={0x00,0x00,0x40,0x00};
const unsigned char pre_C0_RW_PR[4]={0x00,0x00,0x65,0x00};
const unsigned char pre_C0_RR_PR[4]={0x00,0x00,0x65,0x00};
const unsigned char C0SPR[2]={0x02,0xbc}; //source socket 700
const unsigned char C0DPR[2]={0x02,0xbc}; //destination scoket 700
extern unsigned char net_gatway[4],net_sub[4],net_lip[4],net_dip[4];
extern unsigned char w3100_shar[6];
extern const unsigned char net_password[6];
extern const unsigned char com_baud[8];
extern unsigned char net_password_ok;
extern unsigned char menu_password[6];
extern unsigned char time[7];
extern unsigned char restart;
extern unsigned int com_set;
extern unsigned char net_have_conect;
extern unsigned char have_connect;
extern unsigned char password_check_count;
extern unsigned char send_data[100];
extern unsigned char sound_type_saved;
extern unsigned char sound_swtich[4],sound_swtich_saved[4];
unsigned char TIME_DELAY_OK;
unsigned char TIME_1S_COUNTER;
unsigned char C0RR_PR[4],C0RW_PR[4];
unsigned int SDRAM_read_number;
unsigned char start;
unsigned char buffer_in_data[32]; // 输入缓冲
unsigned char have_get2[4];
unsigned char r_addr_h;
unsigned char r_addr_l;
unsigned int W3100A_M;
unsigned int receive_size;
unsigned int length;
extern unsigned char power_on;
extern unsigned char qam_ch_position;
extern unsigned char qam_ch,center_frequency,qammode;
extern unsigned int iSmbRatSaved[8],iSmbRat;
extern unsigned char ucMenuQModSubPosition[8],ucMenuIFSubPosition[8];
extern unsigned char temperature_h[2],temperature_l[2];
extern unsigned char password_saved[6],sound_swtich_saved[4];
extern unsigned char net_send_data[256];
extern unsigned char net_rx_buf[256],net_tx_buf[256];
extern unsigned char net_Rxin,net_Txin,net_Txout,net_Rxout,net_tx_empty;
extern unsigned char com_Rxin,com_Txin,com_Txout,com_Rxout,com_tx_empty;
extern unsigned char com_tx_buf[256],com_rx_buf[256];
//---------------------------------------------------------
// NAME: ini_indirect_mood()
// ENTRY: mode
// RETURN: void
// FUNCTION:use indirect_mood1 or mode2
// MODIFY: 2004.2.3
//--------------------------------------------------------
void ini_indirect_mood(unsigned char mode)
{
DDRA=0XFF;
iDM_OR=mode;
}
//---------------------------------------------------------
// NAME: W3100A_write_reg()
// ENTRY: addr_h,addr_l
// RETURN: void
// FUNCTION:write data to register
// MODIFY: 2004.2.3
//---------------------------------------------------------
void W3100A_write_reg(unsigned char addr_h, unsigned char addr_l,unsigned char w_data)
{
DDRA=0XFF;
delayus(50);
iDM_AR0 = addr_h; //H_address_dat
iDM_AR1 = addr_l; //L_address_dat
iDM_DR =w_data; //reg_dat
}
//---------------------------------------------------------
// NAME: read_reg()
// ENTRY: addr_h,addr_l
// RETURN: void
// FUNCTION:read data from register
// MODIFY: 2004.2.3
//---------------------------------------------------------
unsigned char read_reg(unsigned char addr_h,unsigned char addr_l)
{
unsigned char r_data;
DDRA=0Xff;
delayus(50);
iDM_AR0=addr_h; //H_address_dat
iDM_AR1=addr_l; //L_address_dat
DDRA=0X00;
delayus(50);
r_data=iDM_DR; //dat
return r_data;
}
//---------------------------------------------------------
// NAME: W3100A_head_get()
// ENTRY: void
// RETURN: void
// FUNCTION:get the head length
// MODIFY: 2004.2.3
//---------------------------------------------------------
void W3100A_head_get(void)
{
unsigned int a;
DDRA=0XFF;
a=have_get2[2];
a <<= 0x08;
a=(a+have_get2[3]+W3100A_M)&0x07ff;
length=0x800-a;
iDM_AR0=0x40+a/256; //addr_h;
iDM_AR1=a%256; //addr_l;
ini_indirect_mood(MODE2);
}
//---------------------------------------------------------
// NAME: W3100A_address_init()
// ENTRY: void
// RETURN: void
// FUNCTION:init the address at the begin position
// MODIFY: 2004.2.3
//---------------------------------------------------------
void W3100A_address_init(void)
{
iDM_AR0=0x40;
iDM_AR1=0x00;
}
//---------------------------------------------------------
// NAME: W3100A_write_data()
// ENTRY: w_data1,w_data2
// RETURN: void
// FUNCTION:write data to w3100a
// MODIFY: 2004.2.3
//---------------------------------------------------------
void W3100A_write_data(unsigned char w_data1 ,unsigned char w_data2)
{
DDRA=0XFF;
//ini_indirect_mood2();
delayus(50);
iDM_DR=w_data1;
iDM_DR=w_data2;
W3100A_M+=2;
//ini_indirect_mood1();
}
//---------------------------------------------------------
// NAME: TCP_IP_Write_Data()
// ENTRY: leng,*p
// RETURN: void
// FUNCTION:write data to w3100a in the transmit buffer
// MODIFY: 2004.2.3
//---------------------------------------------------------
void TCP_IP_Write_Data(unsigned char leng,unsigned char*p)
{
unsigned char i,j;
unsigned char temp;
temp=0;
W3100A_head_get();
DDRA=0XFF;
WDR();
if(length<leng)
{
for(i=0;i<length;i++)
{
WDR();
temp=net_Txout+i;
iDM_DR=*(p+temp);
}
W3100A_address_init();
j = leng-length;
for(i=0;i<j;i++)
{
WDR();
temp=net_Txout+i;
iDM_DR=*(p+temp);
W3100A_M+=1;
}
}
else
{
for(i=0;i<leng;i++)
{
WDR();
temp=net_Txout+i;
iDM_DR=*(p+temp);
}
W3100A_M+=leng;
}
ini_indirect_mood(MODE1);
W3100A_data_trans();
}
//---------------------------------------------------------
// NAME: ini_T_ptr()
// ENTRY: void
// RETURN: void
// FUNCTION:preset transfer_pointer to 0x4000
// MODIFY: 2004.2.3
//---------------------------------------------------------
void ini_T_ptr(void)
{
unsigned char k;
for(k=0;k<4;k++)
{
W3100A_write_reg(0x00,C0_TW_PR+k,pre_C0_TW_PR[k]); //preset transfer_pointer
W3100A_write_reg(0x00,C0_TA_PR+k,pre_C0_TA_PR[k]);
W3100A_write_reg(0x00,C0_TR_PR+k,pre_C0_TR_PR[k]);
}
}
//---------------------------------------------------------
// NAME: W3100A_socket_init()
// ENTRY: void
// RETURN: void
// FUNCTION:init the chip w3100a socket
// MODIFY: 2004.2.3
//---------------------------------------------------------
void W3100A_socket_init(void)
{
unsigned char i;
i=0;
do
{
i++;
if(i==20) break;
W3100A_write_reg(0x00,C0_CR,0x01); //system_ini
WDR();
}
while(read_reg(0x00,C0_SSR)!=0x00);
i=0;
do
{
i++;
if(i==20) break;
W3100A_write_reg(0x00,C0_CR,0x02); //socket_ini
WDR();
}
while( read_reg(0x00,C0_SSR)!=0x0E);
ini_T_ptr();
//W3100A_write_reg(0x00,C0_CR,0x04); //connect command
W3100A_write_reg(0x00,C0_CR,0x08); //listen command
//while(read_reg(0x00,C0_SSR)!=0x06);
delayus(5000);
}
//---------------------------------------------------------
// NAME: W3100A_data_trans()
// ENTRY: void
// RETURN: void
// FUNCTION:transmit the data
// MODIFY: 2004.2.3
//---------------------------------------------------------
void W3100A_data_trans(void)
{
unsigned int ptr_temp=0;
unsigned char a;
if( read_reg(0x00,C0_SSR)==0x06)
{
read_reg(0x01,0xe2);
have_get2[2]=read_reg(0x00,C0_TA_PR + 2);
have_get2[3]=read_reg(0x00,C0_TA_PR + 3);
a=read_reg(0x00,C0_CR)&0x20;
while(a!=0x00)
{
a=read_reg(0x00,C0_CR)&0x20;
if(TIME_DELAY_OK==1)
{
TIME_DELAY_OK=0;
goto wait;
}
WDR();
}
ptr_temp=W3100A_M+have_get2[2]*256+have_get2[3];
W3100A_write_reg(0x00,C0_TW_PR+0,0x00);
W3100A_write_reg(0x00,C0_TW_PR+1,0x00);
W3100A_write_reg(0x00,C0_TW_PR+2,ptr_temp/256);
W3100A_write_reg(0x00,C0_TW_PR+3,ptr_temp%256);
W3100A_write_reg(0x00,C0_CR,0x20); //send command
W3100A_M=0;
read_reg(0x01,0xe2);
have_get2[0]=read_reg(0x00,C0_TA_PR);
have_get2[1]=read_reg(0x00,C0_TA_PR + 1);
have_get2[2]=read_reg(0x00,C0_TA_PR + 2);
have_get2[3]=read_reg(0x00,C0_TA_PR + 3);
while((have_get2[2]!=ptr_temp/256)||(have_get2[3]!=ptr_temp%256))
{
read_reg(0x01,0xe2);
have_get2[0]=read_reg(0x00,C0_TA_PR);
have_get2[1]=read_reg(0x00,C0_TA_PR + 1);
have_get2[2]=read_reg(0x00,C0_TA_PR + 2);
have_get2[3]=read_reg(0x00,C0_TA_PR + 3);
//system_dog();
}
}
else
{
wait: w3100a_open();
SDRAM_read_number=0;
W3100A_M=1;
}
}
//---------------------------------------------------------
// NAME: W3100A_pre_receive()
// ENTRY: void
// RETURN: void
// FUNCTION:receiver buffer pointer count
// MODIFY: 2004.2.3
//---------------------------------------------------------
unsigned int W3100A_pre_receive(void)
{
unsigned char shadow;
unsigned char k;
unsigned int rrptr;
unsigned int rwptr;
unsigned int size;
shadow=read_reg(0x01,0xe1); //access shadow
for(k=0;k<4;k++) //access C0_RR_PR
{
C0RR_PR[k]=read_reg(0x00,C0_RR_PR+k);
}
rrptr=(C0RR_PR[3])+( (C0RR_PR[2])*256 ); // low 16 bits
shadow=read_reg(0x01,0xe0); //access shadow
for(k=0;k<4;k++) //access C0_RW_PR
{
C0RW_PR[k]=read_reg(0x00,C0_RW_PR+k);
}
rwptr=(C0RW_PR[3])+( C0RW_PR[2]*256 ); //low 16 bits
if(rrptr!=rwptr)
{
if(rwptr>rrptr)
{
size=rwptr-rrptr;
}
else
{
size=2048-(rrptr-rwptr);
}
rrptr=rrptr&0x07ff;
rrptr+=0x6000;
r_addr_h=rrptr/256;
r_addr_l=rrptr%256;
//state_3100a=0xff;
}
else
{
//state_3100a=0x00;
size=0;
}
receive_size=size;
return receive_size;
}
unsigned char dat_net[10];
//---------------------------------------------------------
// NAME: W3100A_data_receive()
// ENTRY: void
// RETURN: void
// FUNCTION:read the data from the receive buffer
// MODIFY: 2004.2.3
//---------------------------------------------------------
void W3100A_data_receive(void)
{
unsigned char shadow;
unsigned int k;
//ENABLE_XM( );
if(receive_size>50)
receive_size=50; //the number of received data if no more than 16.
ini_indirect_mood(MODE2);//ini_indirect_mood2();
iDM_AR0=r_addr_h;
iDM_AR1=r_addr_l;
for(k=0;k<receive_size;k++)
{
//dat_net[k]=iDM_DR;
net_rx_buf[net_Rxin]=iDM_DR;
net_Rxin++;
com_Rxin &= DATA_LEN;
}
ini_indirect_mood(MODE1);//ini_indirect_mood1();
shadow=read_reg(0x01,0xe0); //access shadow
for(k=0;k<4;k++) //access C0_RW_PR
{
C0RW_PR[k]=read_reg(0x00,C0_RW_PR+k);
}
for(k=0;k<4;k++)
{
W3100A_write_reg(0x00,C0_RR_PR+k,C0RW_PR[k]);
}
do
{
W3100A_write_reg(0x00,C0_CR,0x40); //commond receive
WDR();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -