📄 seeddm642_emac.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 + -