These are the examples provided for [[/users/frank26080115/libraries/LPC1700CMSIS_Lib/]] Note, the entire "program" is not compilable!
EMAC/uIP/lpc17xx_port/emac.c@0:bf7b9fba3924, 2011-03-20 (annotated)
- Committer:
- frank26080115
- Date:
- Sun Mar 20 05:38:56 2011 +0000
- Revision:
- 0:bf7b9fba3924
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
frank26080115 | 0:bf7b9fba3924 | 1 | #include "emac.h" |
frank26080115 | 0:bf7b9fba3924 | 2 | #include "lpc17xx_emac.h" |
frank26080115 | 0:bf7b9fba3924 | 3 | #include "lpc17xx_pinsel.h" |
frank26080115 | 0:bf7b9fba3924 | 4 | #include <string.h> |
frank26080115 | 0:bf7b9fba3924 | 5 | #include <stdio.h> |
frank26080115 | 0:bf7b9fba3924 | 6 | |
frank26080115 | 0:bf7b9fba3924 | 7 | |
frank26080115 | 0:bf7b9fba3924 | 8 | /* For debugging... */ |
frank26080115 | 0:bf7b9fba3924 | 9 | #include "debug_frmwrk.h" |
frank26080115 | 0:bf7b9fba3924 | 10 | #include <stdio.h> |
frank26080115 | 0:bf7b9fba3924 | 11 | |
frank26080115 | 0:bf7b9fba3924 | 12 | /* Example group ----------------------------------------------------------- */ |
frank26080115 | 0:bf7b9fba3924 | 13 | /** @defgroup EMAC_uIP uIP |
frank26080115 | 0:bf7b9fba3924 | 14 | * @ingroup EMAC_Examples |
frank26080115 | 0:bf7b9fba3924 | 15 | * @{ |
frank26080115 | 0:bf7b9fba3924 | 16 | */ |
frank26080115 | 0:bf7b9fba3924 | 17 | |
frank26080115 | 0:bf7b9fba3924 | 18 | #define DB _DBG((uint8_t *)db) |
frank26080115 | 0:bf7b9fba3924 | 19 | char db[64]; |
frank26080115 | 0:bf7b9fba3924 | 20 | |
frank26080115 | 0:bf7b9fba3924 | 21 | /* Init the LPC17xx ethernet */ |
frank26080115 | 0:bf7b9fba3924 | 22 | BOOL_8 tapdev_init(void) |
frank26080115 | 0:bf7b9fba3924 | 23 | { |
frank26080115 | 0:bf7b9fba3924 | 24 | /* EMAC configuration type */ |
frank26080115 | 0:bf7b9fba3924 | 25 | EMAC_CFG_Type Emac_Config; |
frank26080115 | 0:bf7b9fba3924 | 26 | /* pin configuration */ |
frank26080115 | 0:bf7b9fba3924 | 27 | PINSEL_CFG_Type PinCfg; |
frank26080115 | 0:bf7b9fba3924 | 28 | /* EMAC address */ |
frank26080115 | 0:bf7b9fba3924 | 29 | uint8_t EMACAddr[] = {EMAC_ADDR0, EMAC_ADDR1, EMAC_ADDR2, \ |
frank26080115 | 0:bf7b9fba3924 | 30 | EMAC_ADDR3, EMAC_ADDR4, EMAC_ADDR5}; |
frank26080115 | 0:bf7b9fba3924 | 31 | |
frank26080115 | 0:bf7b9fba3924 | 32 | #if AUTO_NEGOTIATION_ENA != 0 |
frank26080115 | 0:bf7b9fba3924 | 33 | Emac_Config.Mode = EMAC_MODE_AUTO; |
frank26080115 | 0:bf7b9fba3924 | 34 | #else |
frank26080115 | 0:bf7b9fba3924 | 35 | #if (FIX_SPEED == SPEED_100) |
frank26080115 | 0:bf7b9fba3924 | 36 | #if (FIX_DUPLEX == FULL_DUPLEX) |
frank26080115 | 0:bf7b9fba3924 | 37 | Emac_Config.Mode = EMAC_MODE_100M_FULL; |
frank26080115 | 0:bf7b9fba3924 | 38 | #elif (FIX_DUPLEX == HALF_DUPLEX) |
frank26080115 | 0:bf7b9fba3924 | 39 | Emac_Config.Mode = EMAC_MODE_100M_HALF; |
frank26080115 | 0:bf7b9fba3924 | 40 | #else |
frank26080115 | 0:bf7b9fba3924 | 41 | #error Does not support this duplex option |
frank26080115 | 0:bf7b9fba3924 | 42 | #endif |
frank26080115 | 0:bf7b9fba3924 | 43 | #elif (FIX_SPEED == SPEED_10) |
frank26080115 | 0:bf7b9fba3924 | 44 | #if (FIX_DUPLEX == FULL_DUPLEX) |
frank26080115 | 0:bf7b9fba3924 | 45 | Emac_Config.Mode = EMAC_MODE_10M_FULL; |
frank26080115 | 0:bf7b9fba3924 | 46 | #elif (FIX_DUPLEX == HALF_DUPLEX) |
frank26080115 | 0:bf7b9fba3924 | 47 | Emac_Config.Mode = EMAC_MODE_10M_HALF; |
frank26080115 | 0:bf7b9fba3924 | 48 | #else |
frank26080115 | 0:bf7b9fba3924 | 49 | #error Does not support this duplex option |
frank26080115 | 0:bf7b9fba3924 | 50 | #endif |
frank26080115 | 0:bf7b9fba3924 | 51 | #else |
frank26080115 | 0:bf7b9fba3924 | 52 | #error Does not support this speed option |
frank26080115 | 0:bf7b9fba3924 | 53 | #endif |
frank26080115 | 0:bf7b9fba3924 | 54 | #endif |
frank26080115 | 0:bf7b9fba3924 | 55 | |
frank26080115 | 0:bf7b9fba3924 | 56 | /* |
frank26080115 | 0:bf7b9fba3924 | 57 | * Enable P1 Ethernet Pins: |
frank26080115 | 0:bf7b9fba3924 | 58 | * P1.0 - ENET_TXD0 |
frank26080115 | 0:bf7b9fba3924 | 59 | * P1.1 - ENET_TXD1 |
frank26080115 | 0:bf7b9fba3924 | 60 | * P1.4 - ENET_TX_EN |
frank26080115 | 0:bf7b9fba3924 | 61 | * P1.8 - ENET_CRS |
frank26080115 | 0:bf7b9fba3924 | 62 | * P1.9 - ENET_RXD0 |
frank26080115 | 0:bf7b9fba3924 | 63 | * P1.10 - ENET_RXD1 |
frank26080115 | 0:bf7b9fba3924 | 64 | * P1.14 - ENET_RX_ER |
frank26080115 | 0:bf7b9fba3924 | 65 | * P1.15 - ENET_REF_CLK |
frank26080115 | 0:bf7b9fba3924 | 66 | * P1.16 - ENET_MDC |
frank26080115 | 0:bf7b9fba3924 | 67 | * P1.17 - ENET_MDIO |
frank26080115 | 0:bf7b9fba3924 | 68 | */ |
frank26080115 | 0:bf7b9fba3924 | 69 | PinCfg.Funcnum = 1; |
frank26080115 | 0:bf7b9fba3924 | 70 | PinCfg.OpenDrain = 0; |
frank26080115 | 0:bf7b9fba3924 | 71 | PinCfg.Pinmode = 0; |
frank26080115 | 0:bf7b9fba3924 | 72 | PinCfg.Portnum = 1; |
frank26080115 | 0:bf7b9fba3924 | 73 | |
frank26080115 | 0:bf7b9fba3924 | 74 | PinCfg.Pinnum = 0; |
frank26080115 | 0:bf7b9fba3924 | 75 | PINSEL_ConfigPin(&PinCfg); |
frank26080115 | 0:bf7b9fba3924 | 76 | PinCfg.Pinnum = 1; |
frank26080115 | 0:bf7b9fba3924 | 77 | PINSEL_ConfigPin(&PinCfg); |
frank26080115 | 0:bf7b9fba3924 | 78 | PinCfg.Pinnum = 4; |
frank26080115 | 0:bf7b9fba3924 | 79 | PINSEL_ConfigPin(&PinCfg); |
frank26080115 | 0:bf7b9fba3924 | 80 | PinCfg.Pinnum = 8; |
frank26080115 | 0:bf7b9fba3924 | 81 | PINSEL_ConfigPin(&PinCfg); |
frank26080115 | 0:bf7b9fba3924 | 82 | PinCfg.Pinnum = 9; |
frank26080115 | 0:bf7b9fba3924 | 83 | PINSEL_ConfigPin(&PinCfg); |
frank26080115 | 0:bf7b9fba3924 | 84 | PinCfg.Pinnum = 10; |
frank26080115 | 0:bf7b9fba3924 | 85 | PINSEL_ConfigPin(&PinCfg); |
frank26080115 | 0:bf7b9fba3924 | 86 | PinCfg.Pinnum = 14; |
frank26080115 | 0:bf7b9fba3924 | 87 | PINSEL_ConfigPin(&PinCfg); |
frank26080115 | 0:bf7b9fba3924 | 88 | PinCfg.Pinnum = 15; |
frank26080115 | 0:bf7b9fba3924 | 89 | PINSEL_ConfigPin(&PinCfg); |
frank26080115 | 0:bf7b9fba3924 | 90 | PinCfg.Pinnum = 16; |
frank26080115 | 0:bf7b9fba3924 | 91 | PINSEL_ConfigPin(&PinCfg); |
frank26080115 | 0:bf7b9fba3924 | 92 | PinCfg.Pinnum = 17; |
frank26080115 | 0:bf7b9fba3924 | 93 | PINSEL_ConfigPin(&PinCfg); |
frank26080115 | 0:bf7b9fba3924 | 94 | |
frank26080115 | 0:bf7b9fba3924 | 95 | _DBG_("Init EMAC module"); |
frank26080115 | 0:bf7b9fba3924 | 96 | sprintf(db,"MAC addr: %X-%X-%X-%X-%X-%X \n\r", \ |
frank26080115 | 0:bf7b9fba3924 | 97 | EMACAddr[0], EMACAddr[1], EMACAddr[2], \ |
frank26080115 | 0:bf7b9fba3924 | 98 | EMACAddr[3], EMACAddr[4], EMACAddr[5]); |
frank26080115 | 0:bf7b9fba3924 | 99 | DB; |
frank26080115 | 0:bf7b9fba3924 | 100 | |
frank26080115 | 0:bf7b9fba3924 | 101 | Emac_Config.Mode = EMAC_MODE_AUTO; |
frank26080115 | 0:bf7b9fba3924 | 102 | Emac_Config.pbEMAC_Addr = EMACAddr; |
frank26080115 | 0:bf7b9fba3924 | 103 | // Initialize EMAC module with given parameter |
frank26080115 | 0:bf7b9fba3924 | 104 | if (EMAC_Init(&Emac_Config) == ERROR){ |
frank26080115 | 0:bf7b9fba3924 | 105 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 106 | } |
frank26080115 | 0:bf7b9fba3924 | 107 | |
frank26080115 | 0:bf7b9fba3924 | 108 | _DBG_("Init EMAC complete"); |
frank26080115 | 0:bf7b9fba3924 | 109 | |
frank26080115 | 0:bf7b9fba3924 | 110 | return (TRUE); |
frank26080115 | 0:bf7b9fba3924 | 111 | } |
frank26080115 | 0:bf7b9fba3924 | 112 | |
frank26080115 | 0:bf7b9fba3924 | 113 | /* receive an Ethernet frame from MAC/DMA controller */ |
frank26080115 | 0:bf7b9fba3924 | 114 | UNS_32 tapdev_read(void * pPacket) |
frank26080115 | 0:bf7b9fba3924 | 115 | { |
frank26080115 | 0:bf7b9fba3924 | 116 | UNS_32 Size = EMAC_MAX_PACKET_SIZE; |
frank26080115 | 0:bf7b9fba3924 | 117 | UNS_32 in_size; |
frank26080115 | 0:bf7b9fba3924 | 118 | EMAC_PACKETBUF_Type RxPack; |
frank26080115 | 0:bf7b9fba3924 | 119 | |
frank26080115 | 0:bf7b9fba3924 | 120 | // Check Receive status |
frank26080115 | 0:bf7b9fba3924 | 121 | if (EMAC_CheckReceiveIndex() == FALSE){ |
frank26080115 | 0:bf7b9fba3924 | 122 | return (0); |
frank26080115 | 0:bf7b9fba3924 | 123 | } |
frank26080115 | 0:bf7b9fba3924 | 124 | |
frank26080115 | 0:bf7b9fba3924 | 125 | // Get size of receive data |
frank26080115 | 0:bf7b9fba3924 | 126 | in_size = EMAC_GetReceiveDataSize() + 1; |
frank26080115 | 0:bf7b9fba3924 | 127 | |
frank26080115 | 0:bf7b9fba3924 | 128 | Size = MIN(Size,in_size); |
frank26080115 | 0:bf7b9fba3924 | 129 | |
frank26080115 | 0:bf7b9fba3924 | 130 | // Setup Rx packet |
frank26080115 | 0:bf7b9fba3924 | 131 | RxPack.pbDataBuf = (uint32_t *)pPacket; |
frank26080115 | 0:bf7b9fba3924 | 132 | RxPack.ulDataLen = Size; |
frank26080115 | 0:bf7b9fba3924 | 133 | EMAC_ReadPacketBuffer(&RxPack); |
frank26080115 | 0:bf7b9fba3924 | 134 | |
frank26080115 | 0:bf7b9fba3924 | 135 | // update receive status |
frank26080115 | 0:bf7b9fba3924 | 136 | EMAC_UpdateRxConsumeIndex(); |
frank26080115 | 0:bf7b9fba3924 | 137 | return(Size); |
frank26080115 | 0:bf7b9fba3924 | 138 | } |
frank26080115 | 0:bf7b9fba3924 | 139 | |
frank26080115 | 0:bf7b9fba3924 | 140 | /* transmit an Ethernet frame to MAC/DMA controller */ |
frank26080115 | 0:bf7b9fba3924 | 141 | BOOL_8 tapdev_send(void *pPacket, UNS_32 size) |
frank26080115 | 0:bf7b9fba3924 | 142 | { |
frank26080115 | 0:bf7b9fba3924 | 143 | EMAC_PACKETBUF_Type TxPack; |
frank26080115 | 0:bf7b9fba3924 | 144 | |
frank26080115 | 0:bf7b9fba3924 | 145 | // Check size |
frank26080115 | 0:bf7b9fba3924 | 146 | if(size == 0){ |
frank26080115 | 0:bf7b9fba3924 | 147 | return(TRUE); |
frank26080115 | 0:bf7b9fba3924 | 148 | } |
frank26080115 | 0:bf7b9fba3924 | 149 | |
frank26080115 | 0:bf7b9fba3924 | 150 | // check Tx Slot is available |
frank26080115 | 0:bf7b9fba3924 | 151 | if (EMAC_CheckTransmitIndex() == FALSE){ |
frank26080115 | 0:bf7b9fba3924 | 152 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 153 | } |
frank26080115 | 0:bf7b9fba3924 | 154 | |
frank26080115 | 0:bf7b9fba3924 | 155 | size = MIN(size,EMAC_MAX_PACKET_SIZE); |
frank26080115 | 0:bf7b9fba3924 | 156 | |
frank26080115 | 0:bf7b9fba3924 | 157 | // Setup Tx Packet buffer |
frank26080115 | 0:bf7b9fba3924 | 158 | TxPack.ulDataLen = size; |
frank26080115 | 0:bf7b9fba3924 | 159 | TxPack.pbDataBuf = (uint32_t *)pPacket; |
frank26080115 | 0:bf7b9fba3924 | 160 | EMAC_WritePacketBuffer(&TxPack); |
frank26080115 | 0:bf7b9fba3924 | 161 | EMAC_UpdateTxProduceIndex(); |
frank26080115 | 0:bf7b9fba3924 | 162 | |
frank26080115 | 0:bf7b9fba3924 | 163 | return(TRUE); |
frank26080115 | 0:bf7b9fba3924 | 164 | } |
frank26080115 | 0:bf7b9fba3924 | 165 | |
frank26080115 | 0:bf7b9fba3924 | 166 | /* |
frank26080115 | 0:bf7b9fba3924 | 167 | * @} |
frank26080115 | 0:bf7b9fba3924 | 168 | */ |