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

📄 seeddm642_emac.c

📁 dsp642 for easm based on BIOS
💻 C
字号:
/**************************************************************************/
/*  Copyright 2003 by SEED.                                               */
/*  All rights reserved. Property of SEED.                                */
/**************************************************************************/
 
/*
 *  ======== seeddm642_cpld.c ========
 *  EMAC module for the SEEDDM642
 */
/*-----------------------------------------------------------------------*/

#include "seeddm642_emac.h"

//Maximum count value
#define TIMER_CNT  20

//Timer control register (CTL)
Uint32 TimerControl = 
			
	TIMER_CTL_RMK
	(
		TIMER_CTL_SPND_EMUSTOP,
  		TIMER_CTL_INVINP_NO, 		// TINP inverter control(INVINP)
  		TIMER_CTL_CLKSRC_CPUOVR8,	// Timer input clock source (CLKSRC)
		TIMER_CTL_CP_PULSE, 		// Clock/pulse mode(CP)
		TIMER_CTL_HLD_YES, 			// Hold(HLD)
		TIMER_CTL_GO_NO, 			// Go bit(GO)-
									//   resets & starts timer counter
		TIMER_CTL_PWID_ONE, 		// Pulse width(PWID)-
									//   used only in pulse mode
		TIMER_CTL_DATOUT_0, 		// Data output (DATOUT)
		TIMER_CTL_INVOUT_NO, 		// TOUT inverter control (INVOUT) 
		TIMER_CTL_FUNC_GPIO 		// Function of TOUT pin(FUNC)
	);
	
//---------Function prototypes---------
void TimerEventHandler(void);


//---------Global data definition---------
TIMER_Handle hTimer1;
TIMER_Config myTimConfig;
Uint32 TimerEventId;


extern Handle hApplication;

uint retVal;
Handle phEMAC;
/*mac的地址*/
Uint8 MacAddr[6] = {0x08,0x00,0x28,0x32,0x17,0x42};
/*EMAC的配置*/
EMAC_Config SEEDDM642emaccfg,*pEMACConfig;
/*return interrupt flag*/
uint Emac_Flag = 0;

extern Uint8 TxBuffer[1024];
Uint32 Newdataflag = 0;
EMAC_RxBuffer RxBuffer[4];
EMAC_RxBuffFlag RxBuffFlag[4];
EMAC_Pkt NetPacket[4];

/*回调函数,用于返回一个空的接收数据缓冲区*/
EMAC_Pkt * EMAC_fcbGetPacket(Handle hApplication)
{
	Uint32 i = 0;
	for(i = 0;i<4;i++)
	{
		if(RxBuffFlag[i].RxBuff_used ==0)
		{
			return 	&NetPacket[i];
		}	
	}
	RxBuffFlag[0].RxBuff_used = 0;	
	RxBuffFlag[0].RxBuff_over = 1;
	return 	&NetPacket[0];
}
/*回调函数,用于Rx接收数据缓冲区*/
EMAC_Pkt * EMAC_fcbRxPacket(Handle hApplication,EMAC_Pkt *pPacket)
{
	Uint32 i;
	/*接收数据*/
	Newdataflag = 1;
	i = 0;
	while(pPacket != &NetPacket[i])
	{
		i++;
		if(i ==4)
		{
			return NULL;
		}
	}
	//标明返回的是第几个数据包
	RxBuffFlag[i-1].RxBuff_used = 0;
	return pPacket;
	
}
/*回调函数,用于清空接收数据缓冲区*/
void EMAC_fcbFreePacket(Handle hApplication,EMAC_Pkt *pPacket)
{
	Uint32 i ;
	for(i = 0; i<1024;i++)
	{
		TxBuffer[i] = 0;
	}
}
/*回调函数,用于状态返回与设置*/
void EMAC_fcbStatus(Handle hApplication)
{
}
/*回调函数,用于发送与缓冲的统计*/
void EMAC_fcbStatistics(Handle hApplication)
{
}
/*----------------------------------------------------------------------------*/
/***********************************************************************/
/*																	   */
/*	seeddm642_timer_open												   */
/*		描述:	初始化定时器,为读写ESAM进行初始化					   */
/*      参数:  无													   */
/*      返回:  无													   */
/*																	   */
/***********************************************************************/
void seeddm642_timer_open()
{ 
	//Open TIMER1 device, and reset it to power-on default state
	hTimer1 = TIMER_open(TIMER_DEV1, TIMER_OPEN_RESET);
	//Obtain the event ID for the timer device
	TimerEventId = TIMER_getEventId(hTimer1);
	//Map TIMER events to physical interrupt number
	IRQ_map(TimerEventId, 14);
	//Map External int4 to physical interrupt number
	IRQ_map(IRQ_EVT_EXTINT4,4);
	//Reset the timer events
	IRQ_reset(TimerEventId);
	//---------Configure the timer devices---------	
	//Start count value at zero
	myTimConfig.cnt = 0x0;
	//Use predefined control value  */
	myTimConfig.ctl = TimerControl;	
	//Set period,周期为(1/9600)/2
	myTimConfig.prd = 0x4785600;

	IRQ_globalEnable();
	//Enable the timer events(events are disabled while resetting)
	IRQ_enable(TimerEventId);
	//启动计数器
	TIMER_config(hTimer1, &myTimConfig);
	//Start the timers
	TIMER_start(hTimer1);
}
/*----------------------------------------------------------------------------*/
Handle seeddm642_EmacOpen()
{
	Uint32 i,j;
	/*初始化数据缓冲区*/
	for(i = 0;i<4;i++)
	{
		for(j = 0;j<1024;j++)
		{
			RxBuffer[i].RxBuffer[j] = 0;
		}			
	}
	/*初始化状态区*/
	for(i = 0;i<4;i++)
	{
		RxBuffFlag[i].RxBuff_used = 0;
		RxBuffFlag[i].RxBuff_over = 0;
	}
	/*初始化数据包*/
	for(i = 0;i<4;i++)
	{
		NetPacket[i].pDataBuffer = &(RxBuffer[i].RxBuffer[0]);
		NetPacket[i].BufferLen  = 1024;
		NetPacket[i].ValidLen   = 1024;
		NetPacket[i].DataOffset = 0;
		NetPacket[i].PktChannel = 0;
		NetPacket[i].PktLength  = 1024;
		NetPacket[i].PktFrags   = 1;
	}
	/*设置EMAC的配置结构*/
	pEMACConfig = &SEEDDM642emaccfg;//设指针指向配置结构;
	/* Configuation Mode Flags                */
	pEMACConfig->ModeFlags = EMAC_CONFIG_MODEFLG_MACLOOPBACK;
	/* CSL_MDIO Mode Flags (see CSL_MDIO.H)   */
	pEMACConfig->MdioModeFlags = MDIO_MODEFLG_AUTONEG;
	/* Number of Tx Channels to use (1-8)     */
	pEMACConfig->TxChannels = 8;
	/* Mac Address                            */
	for(i = 0;i<6;i++)
	{
		pEMACConfig->MacAddr[i] = MacAddr[i];
	}
	/* Max Rx packet buffers to get from pool */
	pEMACConfig->RxMaxPktPool = 64;
	/*设置回调函数pfcbGetPacket*/
	pEMACConfig->pfcbGetPacket = &EMAC_fcbGetPacket;
	/*设置回调函数pfcbGetPacket*/
	pEMACConfig->pfcbFreePacket = &EMAC_fcbFreePacket;
	/*设置回调函数pfcbGetPacket*/
	pEMACConfig->pfcbRxPacket = &EMAC_fcbRxPacket;
	/*设置回调函数pfcbStatus*/
	pEMACConfig->pfcbStatus = &EMAC_fcbStatus;
	/*设置回调函数pfcbStatistics*/
	pEMACConfig->pfcbStatistics = &EMAC_fcbStatistics;
	
	/*打开EMAC资源*/
	retVal = EMAC_open( 1,				/*DM642只有一个EMAC资源,故只能打开一个*/ 
						hApplication, 	/*应用程序的回调句柄*/
						pEMACConfig,    /*EMAC的配置*/
						&phEMAC);		/*EMAC的句柄*/
	if(retVal != 0)
	{
		/*初始未成功*/
		return NULL;
	}	
	/*打开定时器*/
	seeddm642_timer_open();
	IRQ_enable(IRQ_EVT_MACINT);
	return phEMAC;
}

/*----------------------------------------------------------------------------*/
interrupt void netISR()
{
	Emac_Flag = EMAC_serviceCheck(phEMAC);
	if(Emac_Flag == EMAC_ERROR_MACFATAL)
	{
		/*close the EMAC*/
		EMAC_close(phEMAC);
	}
}
/*-----------------------------------------------------------------------------*/
//---------Subroutine definition---------

//Function called from TIMER1 ISR. Just increments the count by
//  one each time it enters this function. Exit from the program
//  after certain count value is reached.
void TimerEventHandler(void)
{
	EMAC_timerTick(phEMAC);
}
//ISR to service TIMERINT1. 
//  vecs_dm642.asm must be modified to include c_int14 entry.
interrupt void c_int14(void)    
{
	TimerEventHandler();
	return;
}

⌨️ 快捷键说明

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