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

📄 main.c

📁 8019测试源码for arm s3c44b0
💻 C
字号:
/****************************************************************************
【文  件  名  称】main.c
【功  能  描  述】三星S3C44B0X板demo程序代码
【程  序  版  本】4.0
【创建人及创建日期】hugnag//2002年11月19日19:26
【修改人及修改日期】hugnag//2003年4月26日20:24
****************************************************************************/

//***************************************************************************
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include "..\inc\option.h"
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\def.h"

#include "..\inc\cache.h"
#include "..\inc\rtc.h"
#include "..\inc\lcd.h"
#include "..\inc\adc.h"
#include "..\inc\timer.h"
#include "..\inc\LCD_Bmp.h"
#include "..\net\necfg.h"
#include "..\net\ne2000.h"
#include "..\net\ip.h"
#include "..\net\udp.h"

extern unsigned char mymac[MACLEN];
volatile char which_int=0;
unsigned char arp_received=0;
unsigned char icmp_received=0;
unsigned char tftp_start;

unsigned char default_mac[MACLEN] = {0x12,0x34,0x56,0x78,0x90,0xab};
unsigned char rem_mac[MACLEN] = {0x00,0x50,0xba,0x74,0x21,0x28};

NODE locnode;
NODE remnode;
ETHERFRAME etherframe;


//***************************************************************************

/****************************************************************************
【功能说明】中断响应函数
****************************************************************************/
void __irq Eint4567Isr(void)
{
	unsigned char 	c_cr;
	unsigned int i;
	unsigned char *data;
	short txlen;
	unsigned short rxlen;
	char *filename;
	char *mode;
	
    which_int = rEXTINTPND;
    rEXTINTPND = 0xf;		//clear EXTINTPND reg.		
    rI_ISPC = BIT_EINT4567;	//clear pending_bit

	Delay(500);		//延时若干个100us,消除抖动
	rPCONG &= 0x00ff;
	if( (rPDATG&0xf0) != 0xf0)
	{
	    switch(which_int)
	    {
			case 1:
			{
/*				
				EN_CR = ENCR_PAGE0 + ENCR_NODMA + ENCR_STOP;
				c_cr = EN_CR;
				Uart_Printf("en_cr= %x\n",c_cr);
				c_cr = EN_CLDA0;
				Uart_Printf("en_clda0= %x\n",c_cr);				
				c_cr = EN_CLDA1;
				Uart_Printf("en_clda1= %x\n",c_cr);
				c_cr = EN_BNRY;
				Uart_Printf("en_bnry= %x\n",c_cr);
				c_cr = EN_TSR;
				Uart_Printf("en_tsr= %x\n",c_cr);
				c_cr = EN_NCR;
				Uart_Printf("en_ncr= %x\n",c_cr);
				c_cr = EN_FIFO;
				Uart_Printf("en_fifo= %x\n",c_cr);
				c_cr = EN_ISR;
				Uart_Printf("en_isr= %x\n",c_cr);
				c_cr = EN_CRDA0;
				Uart_Printf("en_crda0= %x\n",c_cr);
				c_cr = EN_CRDA1;
				Uart_Printf("en_crda1= %x\n",c_cr);
				c_cr = EN_8019ID0;
				Uart_Printf("en_8019id0= %x\n",c_cr);
				c_cr = EN_8019ID1;
				Uart_Printf("en_8019id1= %x\n",c_cr);
				c_cr = EN_RSR;
				Uart_Printf("en_rsr= %x\n",c_cr);
				c_cr = EN_CNTR0;
				Uart_Printf("en_cntr0= %x\n",c_cr);
				c_cr = EN_CNTR1;
				Uart_Printf("en_cntr1= %x\n",c_cr);
				c_cr = EN_CNTR2;
				Uart_Printf("en_cntr2= %x\n\n",c_cr);
				
				EN_CR = ENCR_PAGE1 + ENCR_NODMA + ENCR_STOP;
				c_cr = EN_CR;
				Uart_Printf("en_cr= %x\n",c_cr);				
				c_cr = EN_PAR0;
				Uart_Printf("en_par0= %x\n",c_cr);
				c_cr = EN_PAR1;
				Uart_Printf("en_par1= %x\n",c_cr);
				c_cr = EN_PAR2;
				Uart_Printf("en_par2= %x\n",c_cr);
				c_cr = EN_PAR3;
				Uart_Printf("en_par3= %x\n",c_cr);
				c_cr = EN_PAR4;
				Uart_Printf("en_par4= %x\n",c_cr);
				c_cr = EN_PAR5;
				Uart_Printf("en_par5= %x\n",c_cr);
				c_cr = EN_CURR;
				Uart_Printf("en_curr= %x\n",c_cr);
				c_cr = EN_MAR0;
				Uart_Printf("en_mar0= %x\n",c_cr);
				c_cr = EN_MAR1;
				Uart_Printf("en_mar1= %x\n",c_cr);		
				c_cr = EN_MAR2;
				Uart_Printf("en_mar2= %x\n",c_cr);		
				c_cr = EN_MAR3;
				Uart_Printf("en_mar3= %x\n",c_cr);		
				c_cr = EN_MAR4;
				Uart_Printf("en_mar4= %x\n",c_cr);		
				c_cr = EN_MAR5;
				Uart_Printf("en_mar5= %x\n",c_cr);		
				c_cr = EN_MAR6;
				Uart_Printf("en_mar6= %x\n",c_cr);		
				c_cr = EN_MAR7;
				Uart_Printf("en_mar7= %x\n\n",c_cr);	

				EN_CR = ENCR_PAGE2 + ENCR_NODMA + ENCR_STOP;
				c_cr = EN_CR;
				Uart_Printf("en_cr= %x\n",c_cr);
				c_cr = EN_PSTART;
				Uart_Printf("en_pstart= %x\n",c_cr);
				c_cr = EN_PSTOP;
				Uart_Printf("en_pstop= %x\n",c_cr);
				c_cr = EN_TPSR;
				Uart_Printf("en_tpsr= %x\n",c_cr);
				c_cr = EN_RCR;
				Uart_Printf("en_rcr= %x\n",c_cr);
				c_cr = EN_TCR;
				Uart_Printf("en_tcr= %x\n",c_cr);
				c_cr = EN_DCR;
				Uart_Printf("en_dcr= %x\n",c_cr);
				c_cr = EN_IMR;
				Uart_Printf("en_imr= %x\n\n",c_cr);
													
				EN_CR = ENCR_PAGE3 + ENCR_NODMA + ENCR_STOP;
				c_cr = EN_CR;
				Uart_Printf("en_cr= %x\n",c_cr);
				c_cr = EN_9346CR;
				Uart_Printf("en_9346cr = %x\n",c_cr);
				c_cr = EN_BPAGE;
				Uart_Printf("en_bpage = %x\n",c_cr);
				c_cr = EN_CONFIG0;
				Uart_Printf("en_config0 = %x\n",c_cr);
				c_cr = EN_CONFIG1;
				Uart_Printf("en_config1 = %x\n",c_cr);
				c_cr = EN_CONFIG2;
				Uart_Printf("en_config2 = %x\n",c_cr);
				c_cr = EN_CONFIG3;
				Uart_Printf("en_config3 = %x\n",c_cr);
				c_cr = EN_INTR;
				Uart_Printf("en_intr = %x\n",c_cr);
				c_cr = EN_CONFIG4;
				Uart_Printf("en_config4 = %x\n\n\n",c_cr);
*/				
				Uart_Printf("\nGet_Etherner\n");
				rxlen = Get_Ethernet(&etherframe);
				data = (unsigned char *)&etherframe;
				for(i=0;i<rxlen;i++)
				{
					Uart_Printf("%2.2x ", data[i]);
				}
			
			}
			    break;
			case 2:
			{
			    Uart_Printf("\nUDP test\n");
              	txlen = Make_UDP(&etherframe, &locnode, &remnode, 10);
                Put_Ethernet(&etherframe, txlen);              /* Send packet */
                data = (unsigned char *)&etherframe;
                for(i=0;i<txlen;i++)
                {
                	Uart_Printf("%2.2x ",data[i]);
                } 
                	
			}
			    break;
			case 4:
			{
			    Uart_Printf("\n\n regsier\n");
				EN_CR = ENCR_PAGE0 + ENCR_NODMA + ENCR_START;
				c_cr = EN_CLDA0;
				Uart_Printf("en_clda0= %x\n",c_cr);				
				c_cr = EN_CLDA1;
				Uart_Printf("en_clda1= %x\n",c_cr);	
				c_cr = EN_CRDA0;
				Uart_Printf("en_crda0= %x\n",c_cr);
				c_cr = EN_CRDA1;
				Uart_Printf("en_crda1= %x\n",c_cr);
				c_cr = EN_BNRY;
				Uart_Printf("en_bnry= %x\n",c_cr);
				c_cr = EN_ISR;
				Uart_Printf("en_isr= %x\n",c_cr);
				
    			EN_CR = ENCR_PAGE1 + ENCR_NODMA + ENCR_START;
				c_cr = EN_CURR;
				Uart_Printf("en_curr= %x\n",c_cr);
				
				EN_CR = ENCR_PAGE2 + ENCR_NODMA + ENCR_START;
				c_cr = EN_DCR;
				Uart_Printf("en_dcr= %x\n",c_cr);    			
      			    
			}
			    break;
			case 8:
			{
				Uart_Printf("\n\nMake TFTP Test\n");
				locnode.port = 1069;
				remnode.port = 69;
				filename = "model.txt";
				mode = "octet";
				memset((unsigned char *)&etherframe, 0, 100);
				txlen = Make_TFTP_Req(&etherframe, &locnode, &remnode, TFTP_OP_WRITE, filename, mode);
                Put_Ethernet(&etherframe, txlen);              /* Send packet */
                data = (unsigned char *)&etherframe;
                for(i=0;i<txlen;i++)
                {
                	Uart_Printf("%2.2x ",data[i]);
                }
                Uart_Printf("\n");
				
			}
			    break;
			default :
				break;
	    }
	Beep(1800);		//蜂鸣器鸣叫若干个100us
	}

	while((rPDATG&0xf0) != 0xf0);		//按键没有松开就一直等待
    rPCONG = rPCONG | 0xff00;		//GPG4、5、6、7设为中断引脚
}

void __irq Eint3Isr(void)
{	
	unsigned char *data;
	unsigned short rxlen,ip_len,icmp_len,udp_len;
	unsigned int i;
	ARPKT *arp;
	ETHERFRAME *efp;
	IPKT *ip;
	ICMPKT *icmp;
	efp = &etherframe;


	rI_ISPC = BIT_EINT3;
	rINTMSK = rINTMSK | BIT_EINT3;
	
	EN_CR = ENCR_PAGE0 + ENCR_NODMA + ENCR_STOP;
	Delay(100);
	
	if(EN_ISR & ENISR_RX)
	{
		Uart_Printf("\n\nRtl8019 Interrupted RX\n");
		EN_ISR |= ENISR_RX;
		
		rxlen = Get_Ethernet(efp);
		data = (unsigned char *)efp;
		for(i=0;i<rxlen;i++)
		{
			Uart_Printf("%2.2x ", data[i]);
		}
		Uart_Printf("\n");
		Swap_Ether(efp);
		if(Is_ARP(efp, rxlen))
		{
			arp = (ARPKT *)(efp->edata);
			if(arp->op==ARPREQ && Get_ARP_Destip(arp)==locnode.ip)
			{
				Uart_Printf("Get ARP REQUEST\n");
				arp_received = 1;
			}
		}
		
		ip_len = Is_IP(efp, rxlen);
		if(ip_len)
		{
			ip = (IPKT *)(efp->edata);
			Uart_Printf("Get IP\n");
			icmp_len = Is_ICMP(ip, ip_len);
			if(icmp_len)
			{
				Uart_Printf("Get ICMP\n");
				icmp = (ICMPKT *)(efp->edata);
				if(icmp->c.type == ICREQ)
				{
					Uart_Printf("Get ICMP ECHO_REQUEST\n");
					icmp_received = 1;
				}
			}
			
			udp_len = Is_UDP(ip, ip_len);
			if(udp_len)
			{
				Uart_Printf("Get UDP\n");
				Get_UDP_Dest(efp, &locnode);
				Get_UDP_Srce(efp, &remnode);
				if(locnode.port == TFTPORT)
				{
					Uart_Printf("Get TFPT\n");
					tftp_start ++;
				}
			}
		}
	}
	
	if(EN_ISR & ENISR_RX_ERR)
	{
		Uart_Printf("\nRtl8019 Interrupted RX_ERR\n");
		EN_ISR |= ENISR_RX_ERR;
	}
	
	if(EN_ISR & ENISR_TX)
	{
		Uart_Printf("\nRtl8019 Interrupted TX\n");
		EN_ISR |= ENISR_TX;
	}
	
	if(EN_ISR & ENISR_TX_ERR)
	{
		Uart_Printf("\nRtl8019 Interrupted TX_ERR\n");
		EN_ISR |= ENISR_TX_ERR;
	}		
	
	EN_CR = ENCR_PAGE0 + ENCR_NODMA + ENCR_START;
	rINTMSK = rINTMSK & (~BIT_EINT3);
}
//***************************************************************************

/****************************************************************************
【功能说明】中断初始化
****************************************************************************/
void Isr_Init(void)
{
    rINTCON = 0x1;		//中断控制寄存器设置

    rINTMOD=0x0;	  // All=IRQ mode

    pISR_EINT4567 = (int)Eint4567Isr;

    rPCONG = rPCONG | 0xff00;		//GPG4、5、6、7设为中断引脚
    rPUPG = rPUPG & 0x0f;		//GPG4、5、6、7上拉电阻有效
	rEXTINT=0x0;	//低电平触发
 
    rINTMSK=~(BIT_GLOBAL|BIT_EINT4567);		//中断有效
}

void Isr_RTL8019_Init(void)
{
	pISR_EINT3 = (int)Eint3Isr;
	
	rPCONG = rPCONG | 0x00c0;
	rPUPG = rPUPG & 0xf7;
	
	rEXTINT |= 0x4000;
	
	rINTMSK = rINTMSK & (~BIT_EINT3);
}
//***************************************************************************
void Node_Init(void)
{
	locnode.ip = 0xc0a86f08;
	locnode.mask = 0xffffff00;
	locnode.gate = 0xc0a86f01;
	memcpy(locnode.mac,default_mac,6);
	memcpy(mymac,default_mac,6);
	locnode.port = 9000;
	
	remnode.ip = 0xc0a86fbc;
	remnode.mask = 0xffffff00;
	remnode.gate = 0xc0a86f01;
	memcpy(remnode.mac,rem_mac,6);
	remnode.port = 8000;
}

/****************************************************************************
【功能说明】系统主函数
****************************************************************************/
void Main(void)
{	
	unsigned char *data;
	unsigned short txlen;
	unsigned int i;
	ARPKT *arp;
	ETHERFRAME *efp;
	ICMPKT *icmp;
	TFTP_DATA *tftpd;
	efp = &etherframe;
	
    rSYSCFG=SYSCFG_8KB;		//使用8K字节的指令缓存
	rNCACHBE0=((Non_Cache_End>>12)<<16)|(Non_Cache_Start>>12); 
    //在上面的数据区域不使用高速缓存

	Port_Init();		//IO端口功能、方向设定

	Led_Disp();		//LED来回闪烁显示 

	ChangePllValue(56,2,1);		//修改系统主频为8倍频

	Uart_Init(0,115200);		//异步串行口初始化,设置波特率为115200
	
	Delay(0);
	
	Isr_Init();		//中断初始化


	Node_Init();

	Reset_NIC();
	
	Isr_RTL8019_Init();
	
	while(1){
		if(arp_received == 1)
		{
			arp = (ARPKT *)(efp->edata);
			
			remnode.ip = Get_ARP_Srceip(arp);                 /* Make ARP response */
            memcpy(remnode.mac, (unsigned char *)arp->smac, MACLEN);
            txlen = Make_ARP(efp, &locnode, &remnode, ARPRESP);
            Uart_Printf("Put ARP REPLY\n");
            data = (unsigned char*)efp;
            for(i=0;i<txlen;i++)
            {
              	Uart_Printf("%2.2x ",data[i]);
            } 
            Uart_Printf("\n");
            Put_Ethernet(efp, txlen);              /* Send packet */
            arp_received = 0;
    	}
    	
    	if(icmp_received == 1)
    	{
    		icmp = (ICMPKT *)(efp->edata);
      		
    		Uart_Printf("Put ICMP ECHO_REPLY\n");
    		txlen = Make_ICMP(efp, &locnode, &remnode, ICREP, 0, icmp->c.ident, icmp->c.seq, 0);
            data = (unsigned char*)efp;
            for(i=0;i<txlen;i++)
            {
              	Uart_Printf("%2.2x ",data[i]);
            }
            Uart_Printf("\n");
            Put_Ethernet(&etherframe, txlen);              /* Send packet */
            icmp_received = 0;
    	}
    	
    	if(tftp_start == 1)
    	{
    		tftpd = (TFTP_DATA *)(efp->edata);
    		
    		Uart_Printf("Put TFTP ACK\n");
    		locnode.port = 1077;
    		memset((unsigned char *)efp, 0, 100);
    		txlen = Make_TFTP_Ack(efp, &locnode, &remnode, TFTP_OP_ACK, 0);
    		data = (unsigned char*)efp;
    		for(i=0;i<txlen;i++)
            {
              	Uart_Printf("%2.2x ",data[i]);
            }
            Uart_Printf("\n");
            Put_Ethernet(&etherframe, txlen);              /* Send packet */
            tftp_start = 0;
		}
            
	}
}
//***************************************************************************

⌨️ 快捷键说明

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