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

📄 ethmod.c.bak

📁 pic单片机实现的TCP/IP协议
💻 BAK
📖 第 1 页 / 共 3 页
字号:
/*/////////////////////////////////////////////////////////////////////
// REALTEK RTL8019AS DRIVER
// PACKET WHACKER
// Author: Fred Eady
// Version: 1.0
// Date: 10/13/01
// Description: ARP, PING, ECHO and Control, TCP
/////////////////////////////////////////////////////////////////////*/

/*#include <16f877.h>
#include <f877.h>*/
/*//#device PIC16F877 *=16*/
/*#include <string.h>

/*#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,WRT
#use delay(clock=20000000)
/*#use delay(clock=196620800)  /*PICDEM.net*
#use rs232(baud=2400,xmit=PIN_C6, rcv=PIN_C7)

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)*/

/*#define  esc   0x1B
/******************************************************************/
/*	FUNCTION PROTOTYPES*/
/******************************************************************/
 void show_aux_packet();
 void dump_header();
 void readwrite();
 void bin2hex(binchar);
 void show_regs();
 void show_packet();
 void cls();
 void application_code();
 void tcp();

void assemble_ack();
void write_creg(int regaddr, int regdata);
char read_creg(int regaddr);
void get_packet();
void setipaddrs();
void cksum();
void echo_packet();
void send_tcp_packet();
void arp();
void icmp();
void udp();
/******************************************************************
//*	IP ADDRESS DEFINITION
//*   This is the Ethernet Module IP address.
//*   You may change this to any valid address.
/******************************************************************/
const	unsigned	char MYIP[4] = { 192,168,254,100 };
/******************************************************************/
/*	HARDWARE (MAC) ADDRESS DEFINITION
//*   This is the Ethernet Module hardware address.
//*   You may change this to any valid address.
//******************************************************************/
const	unsigned	char MYMAC[6] = { 0,'V','O','L','T','S' };
const	unsigned	char EDTP[23]={"\r\nEDTP Telnet Server>"};
/******************************************************************/
/*	Receive Ring Buffer Header Layout
//*   This is the 4-byte header that resides infront of the
//*   data packet in the receive buffer.
/*****************************************************************/
sreg	unsigned	char  pageheader[4];
#define  enetpacketstatus     0x00
#define  nextblock_ptr        0x01
#define	enetpacketLenL			0x02
#define	enetpacketLenH			0x03
/******************************************************************
/*	Ethernet Header Layout
******************************************************************/
sreg	unsigned	char  packet[96];                   /*//50 bytes of UDP data available*/
#define	enetpacketDest0	   0x00  /*//destination mac address*/
#define	enetpacketDest1	   0x01
#define	enetpacketDest2	   0x02
#define	enetpacketDest3	   0x03
#define	enetpacketDest4	   0x04
#define	enetpacketDest5	   0x05
#define	enetpacketSrc0		   0x06  /*//source mac address*/
#define	enetpacketSrc1		   0x07
#define	enetpacketSrc2		   0x08
#define	enetpacketSrc3		   0x09
#define	enetpacketSrc4		   0x0A
#define	enetpacketSrc5		   0x0B
#define	enetpacketType0	   0x0C  /*type/length field*/
#define	enetpacketType1	   0x0D
#define  enetpacketData       0x0E  /*IP data area begins here*/
/******************************************************************
//*	ARP Layout
//******************************************************************/
#define	arp_hwtype			   0x0E
#define	arp_prtype			   0x10
#define	arp_hwlen			   0x12
#define	arp_prlen			   0x13
#define	arp_op				   0x14
#define	arp_shaddr			   0x16   /*arp source mac address*/
#define	arp_sipaddr			   0x1C   /*arp source ip address*/
#define	arp_thaddr			   0x20   /*arp target mac address*/
#define	arp_tipaddr			   0x26   /*arp target ip address*/
/******************************************************************
//*	IP Header Layout
//******************************************************************/
#define	ip_vers_len			   0x0E	/*/IP version and header length*/
#define	ip_tos				   0x0F	/*/IP type of service*/
#define	ip_pktlen			   0x10	/*/packet length*/
#define	ip_id				      0x12	/*/datagram id*/
#define	ip_frag_offset			0x14	/*/fragment offset*/
#define	ip_ttl				   0x16	/*/time to live*/
#define	ip_proto			      0x17	/*/protocol (ICMP=1, TCP=6, UDP=11)*/
#define	ip_hdr_cksum			0x18	/*/header checksum*/
#define	ip_srcaddr			   0x1A	/*/IP address of source*/
#define	ip_destaddr			   0x1E	/*/IP addess of destination*/
#define	ip_data				   0x22	/*/IP data area*/
/******************************************************************
//*	TCP Header Layout
//******************************************************************/
#define	TCP_srcport			   0x22	/*/TCP source port*/
#define	TCP_destport   	   0x24	/*/TCP destination port*/
#define	TCP_seqnum  	      0x26	/*/sequence number*/
#define	TCP_acknum	         0x2A	/*/acknowledgement number*/
#define	TCP_hdrflags			0x2E	/*/4-bit header len and flags*/
#define	TCP_window			   0x30	/*/window size*/
#define	TCP_cksum		      0x32	/*/TCP checksum*/
#define	TCP_urgentptr   		0x34	/*/urgent pointer*/
#define  TCP_data             0x36  /*option/data*/
/******************************************************************
//*	TCP Flags
//*   IN flags represent incoming bits
//*   OUT flags represent outgoing bits
//******************************************************************/
#define  FIN_IN               packet[TCP_hdrflags+1].0
#define  SYN_IN               packet[TCP_hdrflags+1].1
#define  RST_IN               packet[TCP_hdrflags+1].2
#define  PSH_IN               packet[TCP_hdrflags+1].3
#define  ACK_IN               packet[TCP_hdrflags+1].4
#define  URG_IN               packet[TCP_hdrflags+1].5
#define  FIN_OUT              packet[TCP_hdrflags+1].0=1;
#define  SYN_OUT              packet[TCP_hdrflags+1].1=1;
#define  RST_OUT              packet[TCP_hdrflags+1].2=1;
#define  PSH_OUT              packet[TCP_hdrflags+1].3=1;
#define  ACK_OUT              packet[TCP_hdrflags+1].4=1;
#define  URG_OUT              packet[TCP_hdrflags+1].5=1;
/******************************************************************
//*	Port Definitions
//*   This address is used by TCP and the Telnet function.
//*   This can be changed to any valid port number as long as
//*   you modify your code to recognize the new port number.
//******************************************************************/
#define  MY_PORT_ADDRESS      0x1F98  /* 8088 DECIMAL*/
/******************************************************************
//*	IP Protocol Types
//******************************************************************/
#define	PROT_ICMP			   0x01
#define	PROT_TCP			      0x06
#define	PROT_UDP			      0x11
/******************************************************************
//*	ICMP Header
//******************************************************************/
#define	ICMP_type			   ip_data
#define	ICMP_code			   ICMP_type+1
#define	ICMP_cksum			   ICMP_code+1
#define	ICMP_id				   ICMP_cksum+2
#define	ICMP_seqnum			   ICMP_id+2
#define  ICMP_data            ICMP_seqnum+2
/******************************************************************
//*	UDP Header
//;******************************************************************/
#define	UDP_srcport			   ip_data
#define	UDP_destport			UDP_srcport+2
#define	UDP_len				   UDP_destport+2
#define	UDP_cksum			   UDP_len+2
#define	UDP_data			      UDP_cksum+2
/******************************************************************
//*	REALTEK CONTROL REGISTER OFFSETS
//*   All offsets in Page 0 unless otherwise specified
//******************************************************************/
#define CR		 	0x00
#define PSTART		0x01
#define PAR0      0x01    /* Page 1*/
#define CR9346    0x01    /* Page 3*/
#define PSTOP		0x02
#define BNRY		0x03
#define TSR			0x04
#define TPSR		0x04
#define TBCR0		0x05
#define NCR			0x05
#define TBCR1		0x06
#define ISR			0x07
#define CURR		0x07   /* Page 1*/
#define RSAR0		0x08
#define CRDA0		0x08
#define RSAR1		0x09
#define CRDAL		0x09
#define RBCR0		0x0A
#define RBCR1		0x0B
#define RSR			0x0C
#define RCR			0x0C
#define TCR			0x0D
#define CNTR0		0x0D
#define DCR			0x0E
#define CNTR1		0x0E
#define IMR			0x0F
#define CNTR2		0x0F
#define RDMAPORT  0X10
#define RSTPORT   0x18
/******************************************************************
//*	RTL8019AS INITIAL REGISTER VALUES
//******************************************************************/
#define rcrval		0x04
#define tcrval		0x00
#define dcrval		0x58    /* was 0x48*/
#define imrval		0x11    /* PRX and OVW interrupt enabled*/
#define txstart   0x40
#define rxstart   0x46
#define rxstop    0x60
/******************************************************************
//*	RTL8019AS 9346 EEPROM PIN DEFINITIONS
//******************************************************************/
#define  cregaddr    p0
#define  cregdata    p2
#define  tocreg      pm2=0x00;
#define  fromcreg    pm2=0xFF;
/******************************************************************
//*	RTL8019AS 9346 EEPROM PIN DEFINITIONS
//******************************************************************/
/*#define  EESK        PORTB,5
#define  EEDI        PORTB,6
#define  EEDO        PORTA,0*/
/******************************************************************
//*	RTL8016AS PIN DEFINITIONS
//******************************************************************/
#define  INT0        p3.0
#define  ior_pin     p1.0
#define  iow_pin     p1.1
#define  rst_pin     p2.4
/******************************************************************
//*	RTL8016AS ISR REGISTER DEFINITIONS
//******************************************************************/
#define  RST         0x07
#define  RDC         0x06
#define  OVW         0x04
#define  PRX         0x00
/******************************************************************
//*	PIC16F87X RAM Definitions
//******************************************************************/
sreg	unsigned	char aux_data[16];            /*//received data area*/
sreg	unsigned	char *addr;
sreg	unsigned	char byte_read,data_H,data_L;
sreg	unsigned	char high_nibble, low_nibble, high_char, low_char,resend;
sreg	unsigned	int i,txlen,rxlen,chksum16,hdrlen,tcplen,tcpdatalen_in;
sreg	unsigned	int tcpdatalen_out,ISN,portaddr,ip_packet_len;
sreg	unsigned	long hdr_chksum,my_seqnum,client_seqnum,incoming_ack,expected_ack;
sreg	unsigned	short synflag,finflag;

#define  set_packet32(d,s) packet[d] = make8(s,3); \
                           packet[d+1] = make8(s,2); \
                           packet[d+2] = make8(s,1); \
                           packet[d+3]= make8(s,0); \
/******************************************************************
//*	Application Code
//*   Your application code goes here.
//*   This particular code toggles the LED on PORT A bit 4 using
//*   Telnet.
//******************************************************************/

void application_code()
{
   if(aux_data[0] != 0x0A)
      tcpdatalen_out = tcpdatalen_in;
   if(aux_data[0] == 0x0A)
      tcpdatalen_out = 0x00;

   if(aux_data[0] == '0')
      p3.0=1;/*bit_set(PORTA,4);*/
   if (aux_data[0] == '1')
      p3.0=0;/*bit_clear(PORTA,4);*/
   if (aux_data[0] == 0x0D)
      {
         /*strcpy(packet[TCP_data],"EDTP[0]\r\nEDTP Telnet Server>");/
         strcpy(packet[TCP_data],packet[4]);*/
         tcpdatalen_out = 21;
      }
 }
/******************************************************************
//*	Perform ARP Response
//*   This routine supplies a requesting computer with the
//*   Ethernet modules's MAC (hardware) address.
//******************************************************************/
void arp()
{
   /*start the NIC*/
   write_creg(CR,0x22);

   /*load beginning page for transmit buffer*/
   write_creg(TPSR,txstart);

   /*set start address for remote DMA operation*/
   write_creg(RSAR0,0x00);
   write_creg(RSAR1,0x40);

   /*clear the Interrupts*/
   write_creg(ISR,0xFF);

   /*load data byte count for remote DMA*/
   write_creg(RBCR0,0x3C);
   write_creg(RBCR1,0x00);

   /*do remote write operation*/
   write_creg(CR,0x12);

   /*write destination MAC address*/
   for(i=0;i<6;++i)
      write_creg(RDMAPORT,packet[enetpacketSrc0+i]);

   /*write source MAC address*/
   for(i=0;i<6;++i)
      write_creg(RDMAPORT,MYMAC[i]);

   /*write typelen hwtype prtype hwlen prlen op:*/
   addr = &packet[enetpacketType0];
   packet[arp_op+1] = 0x02;
   for(i=0;i<10;++i)
      write_creg(RDMAPORT,*addr++);

   /*write ethernet module MAC address*/
   for(i=0;i<6;++i)
      write_creg(RDMAPORT,MYMAC[i]);

   /*write ethernet module IP address*/
      for(i=0;i<4;++i)
      write_creg(RDMAPORT,MYIP[i]);

   /*write remote MAC address*/
   for(i=0;i<6;++i)
      write_creg(RDMAPORT,packet[enetpacketSrc0+i]);

   /*write remote IP address*/
   for(i=0;i<4;++i)
      write_creg(RDMAPORT,packet[arp_sipaddr+i]);

   /*write some pad characters to fill out the packet to*/
   /*the minimum length*/
   for(i=0;i<0x12;++i)
      write_creg(RDMAPORT,0x00);

   /*make sure the DMA operation has successfully completed*/
   byte_read = 0;
   while(!bit_test(byte_read,RDC))
      read_creg(ISR);

   /*load number of bytes to be transmitted*/
   write_creg(TBCR0,0x3C);
   write_creg(TBCR1,0x00);

   /*send the contents of the transmit buffer onto the network*/
   write_creg(CR,0x24);
 }
/******************************************************************
//*	Perform ICMP Function
//*   This routine responds to a ping.
//******************************************************************/
void icmp()
{
   /*set echo reply*/
   packet[ICMP_type]=0x00;
   packet[ICMP_code]=0x00;

   /*clear the ICMP checksum*/
   packet[ICMP_cksum ]=0x00;
   packet[ICMP_cksum+1]=0x00;

   /*setup the IP header*/
   setipaddrs();

   /*calculate the ICMP checksum*/
   hdr_chksum =0;
   hdrlen = (make16(packet[ip_pktlen],packet[ip_pktlen+1])) - ((packet[ip_vers_len] & 0x0F) * 4);
   addr = &packet[ICMP_type];
   cksum();
   chksum16= ~(hdr_chksum + ((hdr_chksum & 0xFFFF0000) >> 16));
   packet[ICMP_cksum] = make8(chksum16,1);
   packet[ICMP_cksum+1] = make8(chksum16,0);

   /*send the ICMP packet along on its way*/
   echo_packet();
}
/******************************************************************
//*	UDP Function
//*   This function uses a Visual Basic UDP program to echo the
//*   data back to the VB program and set or reset PORT A bit 4
//*   under control of the VB program.
//******************************************************************/
void udp()

⌨️ 快捷键说明

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