www.pudn.com > EBD9200EMAC.rar > main.c
//*---------------------------------------------------------------------------- //* ATMEL Microcontroller Software Support - ROUSSET - //*---------------------------------------------------------------------------- //* The software is delivered "AS IS" without warranty or condition of any //* kind, either express, implied or statutory. This includes without //* limitation any warranty or condition with respect to merchantability or //* fitness for any particular purpose, or against the infringements of //* intellectual property rights of others. //*---------------------------------------------------------------------------- //* File Name : main.c //* Object : main application written in C //* Creation : Hi 11/18/2002 //* //*---------------------------------------------------------------------------- #include "AT91RM9200.h" #include "lib_AT91RM9200.h" #include "Emac.h" #include#include //* Interrupt Handlers extern void AT91F_ST_ASM_HANDLER(void); //* function in init.c extern void AT91F_DBGU_Printk(char *buffer); //* functions in Emac.c extern int AT91F_EmacEntry(void); extern int AT91F_ProcessEmacPacket(AT91PS_IPheader pHeader); //* Message buffer char MsgBuffer[256]; //* system timer counter unsigned int StTick = 0; //*---------------------------------------------------------------------------- //* \fn AT91F_GetTickCount //* \brief This function returns the value of the system timer //* This function is for demonstration purpose only //*---------------------------------------------------------------------------- unsigned int AT91F_GetTickCount(void) { return(StTick); } //*---------------------------------------------------------------------------- //* \fn AT91F_ST_HANDLER //* \brief This function is invoked by main //* This function is for demonstration purpose only //*---------------------------------------------------------------------------- void AT91F_ST_HANDLER(void) { volatile int StStatus; // Read the system timer status register StStatus = *(AT91C_ST_SR); StTick++; } //*---------------------------------------------------------------------------- //* \fn AT91F_DisplayIpPacket //* \brief This function is invoked by main //* This function is for demonstration purpose only //*---------------------------------------------------------------------------- void AT91F_DisplayIpPacket(AT91PS_IPheader pIpHeader) { char address[6]; AT91F_DBGU_Printk("\n\n\r-I- ================ IP HEADER ======================\n\r"); sprintf(MsgBuffer, "\n\r IP Version = v.%d",pIpHeader->ip_hl_v & 0x0F); AT91F_DBGU_Printk(MsgBuffer); sprintf(MsgBuffer, "\n\r Header Length = %d",(pIpHeader->ip_hl_v & 0xF0) >> 2); AT91F_DBGU_Printk(MsgBuffer); sprintf(MsgBuffer, "\n\r Type of service = 0x%x",pIpHeader->ip_tos); AT91F_DBGU_Printk(MsgBuffer); sprintf(MsgBuffer, "\n\r Total IP Length = %d",(pIpHeader->ip_len) >> 8); AT91F_DBGU_Printk(MsgBuffer); sprintf(MsgBuffer, "\n\r ID = 0x%X",(pIpHeader->ip_id)); AT91F_DBGU_Printk(MsgBuffer); sprintf(MsgBuffer, "\n\r Header Checksum = 0x%X",(pIpHeader->ip_sum)); AT91F_DBGU_Printk(MsgBuffer); switch(pIpHeader->ip_p) { case PROT_IP: sprintf(MsgBuffer, "\n\r Protocol = %s","IP"); break; case PROT_ICMP: sprintf(MsgBuffer, "\n\r Protocol = %s","ICMP"); break; default: sprintf(MsgBuffer, "\n\r Protocol = 0x%X",pIpHeader->ip_p); break; } AT91F_DBGU_Printk(MsgBuffer); strncpy((char *)address, (const char *)(pIpHeader->ip_src), 4); address[4] = 0; sprintf(MsgBuffer, "\n\r IP Src Address = %d:%d:%d:%d", pIpHeader->ip_src[0], pIpHeader->ip_src[1], pIpHeader->ip_src[2], pIpHeader->ip_src[3] ); AT91F_DBGU_Printk(MsgBuffer); strncpy((char *)address, (const char *)pIpHeader->ip_dst, 4); address[4] = 0; sprintf(MsgBuffer, "\n\r IP Dest Address = %d:%d:%d:%d", pIpHeader->ip_dst[0], pIpHeader->ip_dst[1], pIpHeader->ip_dst[2], pIpHeader->ip_dst[3] ); AT91F_DBGU_Printk(MsgBuffer); } //*---------------------------------------------------------------------------- //* \fn main //* \brief //* //*---------------------------------------------------------------------------- int main() { AT91S_IPheader IpHeader; int status; AT91F_DBGU_Printk("\n\n\r-I- ======================================\n\r"); AT91F_DBGU_Printk("-I- AT91RM9200 EMAC Test\n\r"); AT91F_DBGU_Printk("-I- --------------------------------------\n\r"); //* System Timer initialization AT91F_ST_SetPeriodInterval(AT91C_BASE_ST, AT91C_ST_PITS); AT91F_ST_EnableIt(AT91C_BASE_ST, AT91C_ST_PITS); AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, // AIC base address AT91C_ID_SYS, // System peripheral ID AT91C_AIC_PRIOR_HIGHEST, // Max priority AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, // Level sensitive AT91F_ST_ASM_HANDLER ); //* Enable ST interrupt AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_SYS); //* Initialize AT91RM9200 EMAC status = AT91F_EmacEntry(); if (status) { sprintf(MsgBuffer, "Error EMAC init: 0x%x", status); AT91F_DBGU_Printk(MsgBuffer); while(1); } while(1) if (AT91F_ProcessEmacPacket(&IpHeader) == AT91C_IPPACKET) AT91F_DisplayIpPacket(&IpHeader); }