These are the examples provided for [[/users/frank26080115/libraries/LPC1700CMSIS_Lib/]] Note, the entire "program" is not compilable!
Diff: EMAC/Easy_Web/EMAC.c
- Revision:
- 0:bf7b9fba3924
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/EMAC/Easy_Web/EMAC.c Sun Mar 20 05:38:56 2011 +0000 @@ -0,0 +1,230 @@ +/****************************************************************** + ***** ***** + ***** Name: cs8900.c ***** + ***** Ver.: 1.0 ***** + ***** Date: 07/05/2001 ***** + ***** Auth: Andreas Dannenberg ***** + ***** HTWK Leipzig ***** + ***** university of applied sciences ***** + ***** Germany ***** + ***** Func: ethernet packet-driver for use with LAN- ***** + ***** controller CS8900 from Crystal/Cirrus Logic ***** + ***** ***** + ***** NXP: Module modified for use with NXP ***** + ***** LPC1768 EMAC Ethernet controller ***** + ***** ***** + ******************************************************************/ + +#include "EMAC.h" +#include "tcpip.h" +#include "lpc17xx_emac.h" +#include "lpc17xx_pinsel.h" + +/* For debugging... */ +#include "debug_frmwrk.h" +#include <stdio.h> +#define DB _DBG((uint8_t *)db) +char db[64]; + +static unsigned short *rptr; +static unsigned short *tptr; + +/* + * NXP: Here AHBRAM1 section still not be used, so a mount of this section + * will be used to store buffer data get from receive packet buffer of EMAC + */ +static unsigned short *pgBuf = (unsigned short *)LPC_AHBRAM1_BASE; + +// configure port-pins for use with LAN-controller, +// reset it and send the configuration-sequence +void Init_EMAC(void) +{ + uint32_t delay; + + /* EMAC configuration type */ + EMAC_CFG_Type Emac_Config; + /* pin configuration */ + PINSEL_CFG_Type PinCfg; + + /* EMAC address */ + uint8_t EMACAddr[] = {MYMAC_1, MYMAC_2, MYMAC_3, MYMAC_4, MYMAC_5, MYMAC_6}; + + /* + * Enable P1 Ethernet Pins: + * P1.0 - ENET_TXD0 + * P1.1 - ENET_TXD1 + * P1.4 - ENET_TX_EN + * P1.8 - ENET_CRS + * P1.9 - ENET_RXD0 + * P1.10 - ENET_RXD1 + * P1.14 - ENET_RX_ER + * P1.15 - ENET_REF_CLK + * P1.16 - ENET_MDC + * P1.17 - ENET_MDIO + */ + PinCfg.Funcnum = 1; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Portnum = 1; + + PinCfg.Pinnum = 0; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 1; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 4; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 8; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 9; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 10; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 14; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 15; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 16; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 17; + PINSEL_ConfigPin(&PinCfg); + + _DBG_("Init EMAC module"); + sprintf(db,"MAC addr: %X-%X-%X-%X-%X-%X \n\r", \ + EMACAddr[0], EMACAddr[1], EMACAddr[2], \ + EMACAddr[3], EMACAddr[4], EMACAddr[5]); + DB; + + Emac_Config.Mode = EMAC_MODE_AUTO; + Emac_Config.pbEMAC_Addr = EMACAddr; + // Initialize EMAC module with given parameter + while (EMAC_Init(&Emac_Config) == ERROR){ + // Delay for a while then continue initializing EMAC module + _DBG_("Error during initializing EMAC, restart after a while"); + for (delay = 0x100000; delay; delay--); + } + _DBG_("Init EMAC complete"); +} + + +// reads a word in little-endian byte order from RX_BUFFER + +unsigned short ReadFrame_EMAC(void) +{ + return (*rptr++); +} + +// reads a word in big-endian byte order from RX_FRAME_PORT +// (useful to avoid permanent byte-swapping while reading +// TCP/IP-data) + +unsigned short ReadFrameBE_EMAC(void) +{ + unsigned short ReturnValue; + + ReturnValue = SwapBytes (*rptr++); + return (ReturnValue); +} + + +// copies bytes from frame port to MCU-memory +// NOTES: * an odd number of byte may only be transfered +// if the frame is read to the end! +// * MCU-memory MUST start at word-boundary + +void CopyFromFrame_EMAC(void *Dest, unsigned short Size) +{ + unsigned short * piDest; // Keil: Pointer added to correct expression + + piDest = Dest; // Keil: Line added + while (Size > 1) { + *piDest++ = ReadFrame_EMAC(); + Size -= 2; + } + + if (Size) { // check for leftover byte... + *(unsigned char *)piDest = (char)ReadFrame_EMAC();// the LAN-Controller will return 0 + } // for the highbyte +} + +// does a dummy read on frame-I/O-port +// NOTE: only an even number of bytes is read! + +void DummyReadFrame_EMAC(unsigned short Size) // discards an EVEN number of bytes +{ // from RX-fifo + while (Size > 1) { + ReadFrame_EMAC(); + Size -= 2; + } +} + +// Reads the length of the received ethernet frame and checks if the +// destination address is a broadcast message or not +// returns the frame length +unsigned short StartReadFrame(void) { + unsigned short RxLen; + EMAC_PACKETBUF_Type RxPack; + + RxLen = EMAC_GetReceiveDataSize() - 3; + // Copy packet to data buffer + RxPack.pbDataBuf = (uint32_t *)pgBuf; + RxPack.ulDataLen = RxLen; + EMAC_ReadPacketBuffer(&RxPack); + // Point to the data buffer + rptr = (unsigned short *)pgBuf; + return(RxLen); +} + +// Release the buffer after reading all the content inside +void EndReadFrame(void) { + // just call EMAC_UpdateConsumeIndex() in EMAC driver + EMAC_UpdateRxConsumeIndex(); +} + +// Check whether if there is a receive packet coming +unsigned int CheckFrameReceived(void) { // Packet received ? + // Just call EMAC_CheckReceiveIndex() in EMAC driver + if (EMAC_CheckReceiveIndex() == TRUE){ + return (1); + } else { + return (0); + } +} + +// requests space in EMAC memory for storing an outgoing frame +void RequestSend(unsigned short FrameSize) +{ + // Nothing to do here, just implemented in CopyToFrame_EMAC() +} + +// check if ethernet controller is ready to accept the +// frame we want to send + +unsigned int Rdy4Tx(void) +{ + return (1); // the ethernet controller transmits much faster +} // than the CPU can load its buffers + + +// writes a word in little-endian byte order to TX_BUFFER +void WriteFrame_EMAC(unsigned short Data) +{ + *tptr++ = Data; +} + +// copies bytes from MCU-memory to frame port +// NOTES: * an odd number of byte may only be transfered +// if the frame is written to the end! +// * MCU-memory MUST start at word-boundary + +void CopyToFrame_EMAC(void *Source, unsigned int Size) +{ + EMAC_PACKETBUF_Type TxPack; + + // Setup Tx Packet buffer + // NXP: Added for compatibility with old style + TxPack.ulDataLen = Size; + TxPack.pbDataBuf = (uint32_t *)Source; + EMAC_WritePacketBuffer(&TxPack); + EMAC_UpdateTxProduceIndex(); +} +