These are the examples provided for [[/users/frank26080115/libraries/LPC1700CMSIS_Lib/]] Note, the entire "program" is not compilable!
Diff: EMAC/uIP/lpc17xx_port/emac.c
- Revision:
- 0:bf7b9fba3924
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/EMAC/uIP/lpc17xx_port/emac.c Sun Mar 20 05:38:56 2011 +0000 @@ -0,0 +1,168 @@ +#include "emac.h" +#include "lpc17xx_emac.h" +#include "lpc17xx_pinsel.h" +#include <string.h> +#include <stdio.h> + + +/* For debugging... */ +#include "debug_frmwrk.h" +#include <stdio.h> + +/* Example group ----------------------------------------------------------- */ +/** @defgroup EMAC_uIP uIP + * @ingroup EMAC_Examples + * @{ + */ + +#define DB _DBG((uint8_t *)db) +char db[64]; + +/* Init the LPC17xx ethernet */ +BOOL_8 tapdev_init(void) +{ + /* EMAC configuration type */ + EMAC_CFG_Type Emac_Config; + /* pin configuration */ + PINSEL_CFG_Type PinCfg; + /* EMAC address */ + uint8_t EMACAddr[] = {EMAC_ADDR0, EMAC_ADDR1, EMAC_ADDR2, \ + EMAC_ADDR3, EMAC_ADDR4, EMAC_ADDR5}; + +#if AUTO_NEGOTIATION_ENA != 0 + Emac_Config.Mode = EMAC_MODE_AUTO; +#else + #if (FIX_SPEED == SPEED_100) + #if (FIX_DUPLEX == FULL_DUPLEX) + Emac_Config.Mode = EMAC_MODE_100M_FULL; + #elif (FIX_DUPLEX == HALF_DUPLEX) + Emac_Config.Mode = EMAC_MODE_100M_HALF; + #else + #error Does not support this duplex option + #endif + #elif (FIX_SPEED == SPEED_10) + #if (FIX_DUPLEX == FULL_DUPLEX) + Emac_Config.Mode = EMAC_MODE_10M_FULL; + #elif (FIX_DUPLEX == HALF_DUPLEX) + Emac_Config.Mode = EMAC_MODE_10M_HALF; + #else + #error Does not support this duplex option + #endif + #else + #error Does not support this speed option + #endif +#endif + + /* + * 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 + if (EMAC_Init(&Emac_Config) == ERROR){ + return (FALSE); + } + + _DBG_("Init EMAC complete"); + + return (TRUE); +} + +/* receive an Ethernet frame from MAC/DMA controller */ +UNS_32 tapdev_read(void * pPacket) +{ + UNS_32 Size = EMAC_MAX_PACKET_SIZE; + UNS_32 in_size; + EMAC_PACKETBUF_Type RxPack; + + // Check Receive status + if (EMAC_CheckReceiveIndex() == FALSE){ + return (0); + } + + // Get size of receive data + in_size = EMAC_GetReceiveDataSize() + 1; + + Size = MIN(Size,in_size); + + // Setup Rx packet + RxPack.pbDataBuf = (uint32_t *)pPacket; + RxPack.ulDataLen = Size; + EMAC_ReadPacketBuffer(&RxPack); + + // update receive status + EMAC_UpdateRxConsumeIndex(); + return(Size); +} + +/* transmit an Ethernet frame to MAC/DMA controller */ +BOOL_8 tapdev_send(void *pPacket, UNS_32 size) +{ + EMAC_PACKETBUF_Type TxPack; + + // Check size + if(size == 0){ + return(TRUE); + } + + // check Tx Slot is available + if (EMAC_CheckTransmitIndex() == FALSE){ + return (FALSE); + } + + size = MIN(size,EMAC_MAX_PACKET_SIZE); + + // Setup Tx Packet buffer + TxPack.ulDataLen = size; + TxPack.pbDataBuf = (uint32_t *)pPacket; + EMAC_WritePacketBuffer(&TxPack); + EMAC_UpdateTxProduceIndex(); + + return(TRUE); +} + +/* + * @} + */