Fork of Smoothie to port to mbed non-LPC targets.
Fork of Smoothie by
libs/LPC17xx/LPC17xxLib/src/lpc17xx_emac.c@2:1df0b61d3b5a, 2014-02-28 (annotated)
- Committer:
- Michael J. Spencer
- Date:
- Fri Feb 28 18:52:52 2014 -0800
- Revision:
- 2:1df0b61d3b5a
Update to latest Smoothie.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Michael J. Spencer |
2:1df0b61d3b5a | 1 | #ifdef __LPC17XX__ |
Michael J. Spencer |
2:1df0b61d3b5a | 2 | |
Michael J. Spencer |
2:1df0b61d3b5a | 3 | /********************************************************************** |
Michael J. Spencer |
2:1df0b61d3b5a | 4 | * $Id$ lpc17xx_dac.c 2010-05-21 |
Michael J. Spencer |
2:1df0b61d3b5a | 5 | *//** |
Michael J. Spencer |
2:1df0b61d3b5a | 6 | * @file lpc17xx_dac.c |
Michael J. Spencer |
2:1df0b61d3b5a | 7 | * @brief Contains all functions support for Ethernet MAC firmware |
Michael J. Spencer |
2:1df0b61d3b5a | 8 | * library on LPC17xx |
Michael J. Spencer |
2:1df0b61d3b5a | 9 | * @version 2.0 |
Michael J. Spencer |
2:1df0b61d3b5a | 10 | * @date 21. May. 2010 |
Michael J. Spencer |
2:1df0b61d3b5a | 11 | * @author NXP MCU SW Application Team |
Michael J. Spencer |
2:1df0b61d3b5a | 12 | * |
Michael J. Spencer |
2:1df0b61d3b5a | 13 | * Copyright(C) 2010, NXP Semiconductor |
Michael J. Spencer |
2:1df0b61d3b5a | 14 | * All rights reserved. |
Michael J. Spencer |
2:1df0b61d3b5a | 15 | * |
Michael J. Spencer |
2:1df0b61d3b5a | 16 | *********************************************************************** |
Michael J. Spencer |
2:1df0b61d3b5a | 17 | * Software that is described herein is for illustrative purposes only |
Michael J. Spencer |
2:1df0b61d3b5a | 18 | * which provides customers with programming information regarding the |
Michael J. Spencer |
2:1df0b61d3b5a | 19 | * products. This software is supplied "AS IS" without any warranties. |
Michael J. Spencer |
2:1df0b61d3b5a | 20 | * NXP Semiconductors assumes no responsibility or liability for the |
Michael J. Spencer |
2:1df0b61d3b5a | 21 | * use of the software, conveys no license or title under any patent, |
Michael J. Spencer |
2:1df0b61d3b5a | 22 | * copyright, or mask work right to the product. NXP Semiconductors |
Michael J. Spencer |
2:1df0b61d3b5a | 23 | * reserves the right to make changes in the software without |
Michael J. Spencer |
2:1df0b61d3b5a | 24 | * notification. NXP Semiconductors also make no representation or |
Michael J. Spencer |
2:1df0b61d3b5a | 25 | * warranty that such application will be suitable for the specified |
Michael J. Spencer |
2:1df0b61d3b5a | 26 | * use without further testing or modification. |
Michael J. Spencer |
2:1df0b61d3b5a | 27 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 28 | |
Michael J. Spencer |
2:1df0b61d3b5a | 29 | /* Peripheral group ----------------------------------------------------------- */ |
Michael J. Spencer |
2:1df0b61d3b5a | 30 | /** @addtogroup EMAC |
Michael J. Spencer |
2:1df0b61d3b5a | 31 | * @{ |
Michael J. Spencer |
2:1df0b61d3b5a | 32 | */ |
Michael J. Spencer |
2:1df0b61d3b5a | 33 | |
Michael J. Spencer |
2:1df0b61d3b5a | 34 | /* Includes ------------------------------------------------------------------- */ |
Michael J. Spencer |
2:1df0b61d3b5a | 35 | #include "lpc17xx_emac.h" |
Michael J. Spencer |
2:1df0b61d3b5a | 36 | #include "lpc17xx_clkpwr.h" |
Michael J. Spencer |
2:1df0b61d3b5a | 37 | |
Michael J. Spencer |
2:1df0b61d3b5a | 38 | /* If this source file built with example, the LPC17xx FW library configuration |
Michael J. Spencer |
2:1df0b61d3b5a | 39 | * file in each example directory ("lpc17xx_libcfg.h") must be included, |
Michael J. Spencer |
2:1df0b61d3b5a | 40 | * otherwise the default FW library configuration file must be included instead |
Michael J. Spencer |
2:1df0b61d3b5a | 41 | */ |
Michael J. Spencer |
2:1df0b61d3b5a | 42 | #ifdef __BUILD_WITH_EXAMPLE__ |
Michael J. Spencer |
2:1df0b61d3b5a | 43 | #include "lpc17xx_libcfg.h" |
Michael J. Spencer |
2:1df0b61d3b5a | 44 | #else |
Michael J. Spencer |
2:1df0b61d3b5a | 45 | #include "lpc17xx_libcfg_default.h" |
Michael J. Spencer |
2:1df0b61d3b5a | 46 | #endif /* __BUILD_WITH_EXAMPLE__ */ |
Michael J. Spencer |
2:1df0b61d3b5a | 47 | |
Michael J. Spencer |
2:1df0b61d3b5a | 48 | |
Michael J. Spencer |
2:1df0b61d3b5a | 49 | #ifdef _EMAC |
Michael J. Spencer |
2:1df0b61d3b5a | 50 | |
Michael J. Spencer |
2:1df0b61d3b5a | 51 | /* Private Variables ---------------------------------------------------------- */ |
Michael J. Spencer |
2:1df0b61d3b5a | 52 | /** @defgroup EMAC_Private_Variables EMAC Private Variables |
Michael J. Spencer |
2:1df0b61d3b5a | 53 | * @{ |
Michael J. Spencer |
2:1df0b61d3b5a | 54 | */ |
Michael J. Spencer |
2:1df0b61d3b5a | 55 | |
Michael J. Spencer |
2:1df0b61d3b5a | 56 | /* MII Mgmt Configuration register - Clock divider setting */ |
Michael J. Spencer |
2:1df0b61d3b5a | 57 | const uint8_t EMAC_clkdiv[] = { 4, 6, 8, 10, 14, 20, 28 }; |
Michael J. Spencer |
2:1df0b61d3b5a | 58 | |
Michael J. Spencer |
2:1df0b61d3b5a | 59 | /* EMAC local DMA Descriptors */ |
Michael J. Spencer |
2:1df0b61d3b5a | 60 | |
Michael J. Spencer |
2:1df0b61d3b5a | 61 | /** Rx Descriptor data array */ |
Michael J. Spencer |
2:1df0b61d3b5a | 62 | static RX_Desc Rx_Desc[EMAC_NUM_RX_FRAG]; |
Michael J. Spencer |
2:1df0b61d3b5a | 63 | |
Michael J. Spencer |
2:1df0b61d3b5a | 64 | /** Rx Status data array - Must be 8-Byte aligned */ |
Michael J. Spencer |
2:1df0b61d3b5a | 65 | #if defined ( __CC_ARM ) |
Michael J. Spencer |
2:1df0b61d3b5a | 66 | static __align(8) RX_Stat Rx_Stat[EMAC_NUM_RX_FRAG]; |
Michael J. Spencer |
2:1df0b61d3b5a | 67 | #elif defined ( __ICCARM__ ) |
Michael J. Spencer |
2:1df0b61d3b5a | 68 | #pragma data_alignment=8 |
Michael J. Spencer |
2:1df0b61d3b5a | 69 | static RX_Stat Rx_Stat[EMAC_NUM_RX_FRAG]; |
Michael J. Spencer |
2:1df0b61d3b5a | 70 | #elif defined ( __GNUC__ ) |
Michael J. Spencer |
2:1df0b61d3b5a | 71 | static __attribute__ ((aligned (8))) RX_Stat Rx_Stat[EMAC_NUM_RX_FRAG]; |
Michael J. Spencer |
2:1df0b61d3b5a | 72 | #endif |
Michael J. Spencer |
2:1df0b61d3b5a | 73 | |
Michael J. Spencer |
2:1df0b61d3b5a | 74 | /** Tx Descriptor data array */ |
Michael J. Spencer |
2:1df0b61d3b5a | 75 | static TX_Desc Tx_Desc[EMAC_NUM_TX_FRAG]; |
Michael J. Spencer |
2:1df0b61d3b5a | 76 | /** Tx Status data array */ |
Michael J. Spencer |
2:1df0b61d3b5a | 77 | static TX_Stat Tx_Stat[EMAC_NUM_TX_FRAG]; |
Michael J. Spencer |
2:1df0b61d3b5a | 78 | |
Michael J. Spencer |
2:1df0b61d3b5a | 79 | /* EMAC local DMA buffers */ |
Michael J. Spencer |
2:1df0b61d3b5a | 80 | /** Rx buffer data */ |
Michael J. Spencer |
2:1df0b61d3b5a | 81 | static uint32_t rx_buf[EMAC_NUM_RX_FRAG][EMAC_ETH_MAX_FLEN>>2]; |
Michael J. Spencer |
2:1df0b61d3b5a | 82 | /** Tx buffer data */ |
Michael J. Spencer |
2:1df0b61d3b5a | 83 | static uint32_t tx_buf[EMAC_NUM_TX_FRAG][EMAC_ETH_MAX_FLEN>>2]; |
Michael J. Spencer |
2:1df0b61d3b5a | 84 | |
Michael J. Spencer |
2:1df0b61d3b5a | 85 | /** |
Michael J. Spencer |
2:1df0b61d3b5a | 86 | * @} |
Michael J. Spencer |
2:1df0b61d3b5a | 87 | */ |
Michael J. Spencer |
2:1df0b61d3b5a | 88 | |
Michael J. Spencer |
2:1df0b61d3b5a | 89 | /* Private Functions ---------------------------------------------------------- */ |
Michael J. Spencer |
2:1df0b61d3b5a | 90 | static void rx_descr_init (void); |
Michael J. Spencer |
2:1df0b61d3b5a | 91 | static void tx_descr_init (void); |
Michael J. Spencer |
2:1df0b61d3b5a | 92 | static int32_t write_PHY (uint32_t PhyReg, uint16_t Value); |
Michael J. Spencer |
2:1df0b61d3b5a | 93 | static int32_t read_PHY (uint32_t PhyReg); |
Michael J. Spencer |
2:1df0b61d3b5a | 94 | |
Michael J. Spencer |
2:1df0b61d3b5a | 95 | static void setEmacAddr(uint8_t abStationAddr[]); |
Michael J. Spencer |
2:1df0b61d3b5a | 96 | static int32_t emac_CRCCalc(uint8_t frame_no_fcs[], int32_t frame_len); |
Michael J. Spencer |
2:1df0b61d3b5a | 97 | |
Michael J. Spencer |
2:1df0b61d3b5a | 98 | |
Michael J. Spencer |
2:1df0b61d3b5a | 99 | /*--------------------------- rx_descr_init ---------------------------------*/ |
Michael J. Spencer |
2:1df0b61d3b5a | 100 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 101 | * @brief Initializes RX Descriptor |
Michael J. Spencer |
2:1df0b61d3b5a | 102 | * @param[in] None |
Michael J. Spencer |
2:1df0b61d3b5a | 103 | * @return None |
Michael J. Spencer |
2:1df0b61d3b5a | 104 | ***********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 105 | static void rx_descr_init (void) |
Michael J. Spencer |
2:1df0b61d3b5a | 106 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 107 | /* Initialize Receive Descriptor and Status array. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 108 | uint32_t i; |
Michael J. Spencer |
2:1df0b61d3b5a | 109 | |
Michael J. Spencer |
2:1df0b61d3b5a | 110 | for (i = 0; i < EMAC_NUM_RX_FRAG; i++) { |
Michael J. Spencer |
2:1df0b61d3b5a | 111 | Rx_Desc[i].Packet = (uint32_t)&rx_buf[i]; |
Michael J. Spencer |
2:1df0b61d3b5a | 112 | Rx_Desc[i].Ctrl = EMAC_RCTRL_INT | (EMAC_ETH_MAX_FLEN - 1); |
Michael J. Spencer |
2:1df0b61d3b5a | 113 | Rx_Stat[i].Info = 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 114 | Rx_Stat[i].HashCRC = 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 115 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 116 | |
Michael J. Spencer |
2:1df0b61d3b5a | 117 | /* Set EMAC Receive Descriptor Registers. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 118 | LPC_EMAC->RxDescriptor = (uint32_t)&Rx_Desc[0]; |
Michael J. Spencer |
2:1df0b61d3b5a | 119 | LPC_EMAC->RxStatus = (uint32_t)&Rx_Stat[0]; |
Michael J. Spencer |
2:1df0b61d3b5a | 120 | LPC_EMAC->RxDescriptorNumber = EMAC_NUM_RX_FRAG - 1; |
Michael J. Spencer |
2:1df0b61d3b5a | 121 | |
Michael J. Spencer |
2:1df0b61d3b5a | 122 | /* Rx Descriptors Point to 0 */ |
Michael J. Spencer |
2:1df0b61d3b5a | 123 | LPC_EMAC->RxConsumeIndex = 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 124 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 125 | |
Michael J. Spencer |
2:1df0b61d3b5a | 126 | |
Michael J. Spencer |
2:1df0b61d3b5a | 127 | /*--------------------------- tx_descr_init ---- ----------------------------*/ |
Michael J. Spencer |
2:1df0b61d3b5a | 128 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 129 | * @brief Initializes TX Descriptor |
Michael J. Spencer |
2:1df0b61d3b5a | 130 | * @param[in] None |
Michael J. Spencer |
2:1df0b61d3b5a | 131 | * @return None |
Michael J. Spencer |
2:1df0b61d3b5a | 132 | ***********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 133 | static void tx_descr_init (void) { |
Michael J. Spencer |
2:1df0b61d3b5a | 134 | /* Initialize Transmit Descriptor and Status array. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 135 | uint32_t i; |
Michael J. Spencer |
2:1df0b61d3b5a | 136 | |
Michael J. Spencer |
2:1df0b61d3b5a | 137 | for (i = 0; i < EMAC_NUM_TX_FRAG; i++) { |
Michael J. Spencer |
2:1df0b61d3b5a | 138 | Tx_Desc[i].Packet = (uint32_t)&tx_buf[i]; |
Michael J. Spencer |
2:1df0b61d3b5a | 139 | Tx_Desc[i].Ctrl = 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 140 | Tx_Stat[i].Info = 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 141 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 142 | |
Michael J. Spencer |
2:1df0b61d3b5a | 143 | /* Set EMAC Transmit Descriptor Registers. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 144 | LPC_EMAC->TxDescriptor = (uint32_t)&Tx_Desc[0]; |
Michael J. Spencer |
2:1df0b61d3b5a | 145 | LPC_EMAC->TxStatus = (uint32_t)&Tx_Stat[0]; |
Michael J. Spencer |
2:1df0b61d3b5a | 146 | LPC_EMAC->TxDescriptorNumber = EMAC_NUM_TX_FRAG - 1; |
Michael J. Spencer |
2:1df0b61d3b5a | 147 | |
Michael J. Spencer |
2:1df0b61d3b5a | 148 | /* Tx Descriptors Point to 0 */ |
Michael J. Spencer |
2:1df0b61d3b5a | 149 | LPC_EMAC->TxProduceIndex = 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 150 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 151 | |
Michael J. Spencer |
2:1df0b61d3b5a | 152 | |
Michael J. Spencer |
2:1df0b61d3b5a | 153 | /*--------------------------- write_PHY -------------------------------------*/ |
Michael J. Spencer |
2:1df0b61d3b5a | 154 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 155 | * @brief Write value to PHY device |
Michael J. Spencer |
2:1df0b61d3b5a | 156 | * @param[in] PhyReg: PHY Register address |
Michael J. Spencer |
2:1df0b61d3b5a | 157 | * @param[in] Value: Value to write |
Michael J. Spencer |
2:1df0b61d3b5a | 158 | * @return 0 - if success |
Michael J. Spencer |
2:1df0b61d3b5a | 159 | * 1 - if fail |
Michael J. Spencer |
2:1df0b61d3b5a | 160 | ***********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 161 | static int32_t write_PHY (uint32_t PhyReg, uint16_t Value) |
Michael J. Spencer |
2:1df0b61d3b5a | 162 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 163 | /* Write a data 'Value' to PHY register 'PhyReg'. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 164 | uint32_t tout; |
Michael J. Spencer |
2:1df0b61d3b5a | 165 | |
Michael J. Spencer |
2:1df0b61d3b5a | 166 | LPC_EMAC->MADR = EMAC_DEF_ADR | PhyReg; |
Michael J. Spencer |
2:1df0b61d3b5a | 167 | LPC_EMAC->MWTD = Value; |
Michael J. Spencer |
2:1df0b61d3b5a | 168 | |
Michael J. Spencer |
2:1df0b61d3b5a | 169 | /* Wait until operation completed */ |
Michael J. Spencer |
2:1df0b61d3b5a | 170 | tout = 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 171 | for (tout = 0; tout < EMAC_MII_WR_TOUT; tout++) { |
Michael J. Spencer |
2:1df0b61d3b5a | 172 | if ((LPC_EMAC->MIND & EMAC_MIND_BUSY) == 0) { |
Michael J. Spencer |
2:1df0b61d3b5a | 173 | return (0); |
Michael J. Spencer |
2:1df0b61d3b5a | 174 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 175 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 176 | // Time out! |
Michael J. Spencer |
2:1df0b61d3b5a | 177 | return (-1); |
Michael J. Spencer |
2:1df0b61d3b5a | 178 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 179 | |
Michael J. Spencer |
2:1df0b61d3b5a | 180 | |
Michael J. Spencer |
2:1df0b61d3b5a | 181 | /*--------------------------- read_PHY --------------------------------------*/ |
Michael J. Spencer |
2:1df0b61d3b5a | 182 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 183 | * @brief Read value from PHY device |
Michael J. Spencer |
2:1df0b61d3b5a | 184 | * @param[in] PhyReg: PHY Register address |
Michael J. Spencer |
2:1df0b61d3b5a | 185 | * @return 0 - if success |
Michael J. Spencer |
2:1df0b61d3b5a | 186 | * 1 - if fail |
Michael J. Spencer |
2:1df0b61d3b5a | 187 | ***********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 188 | static int32_t read_PHY (uint32_t PhyReg) |
Michael J. Spencer |
2:1df0b61d3b5a | 189 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 190 | /* Read a PHY register 'PhyReg'. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 191 | uint32_t tout; |
Michael J. Spencer |
2:1df0b61d3b5a | 192 | |
Michael J. Spencer |
2:1df0b61d3b5a | 193 | LPC_EMAC->MADR = EMAC_DEF_ADR | PhyReg; |
Michael J. Spencer |
2:1df0b61d3b5a | 194 | LPC_EMAC->MCMD = EMAC_MCMD_READ; |
Michael J. Spencer |
2:1df0b61d3b5a | 195 | |
Michael J. Spencer |
2:1df0b61d3b5a | 196 | /* Wait until operation completed */ |
Michael J. Spencer |
2:1df0b61d3b5a | 197 | tout = 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 198 | for (tout = 0; tout < EMAC_MII_RD_TOUT; tout++) { |
Michael J. Spencer |
2:1df0b61d3b5a | 199 | if ((LPC_EMAC->MIND & EMAC_MIND_BUSY) == 0) { |
Michael J. Spencer |
2:1df0b61d3b5a | 200 | LPC_EMAC->MCMD = 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 201 | return (LPC_EMAC->MRDD); |
Michael J. Spencer |
2:1df0b61d3b5a | 202 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 203 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 204 | // Time out! |
Michael J. Spencer |
2:1df0b61d3b5a | 205 | return (-1); |
Michael J. Spencer |
2:1df0b61d3b5a | 206 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 207 | |
Michael J. Spencer |
2:1df0b61d3b5a | 208 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 209 | * @brief Set Station MAC address for EMAC module |
Michael J. Spencer |
2:1df0b61d3b5a | 210 | * @param[in] abStationAddr Pointer to Station address that contains 6-bytes |
Michael J. Spencer |
2:1df0b61d3b5a | 211 | * of MAC address (should be in order from MAC Address 1 to MAC Address 6) |
Michael J. Spencer |
2:1df0b61d3b5a | 212 | * @return None |
Michael J. Spencer |
2:1df0b61d3b5a | 213 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 214 | static void setEmacAddr(uint8_t abStationAddr[]) |
Michael J. Spencer |
2:1df0b61d3b5a | 215 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 216 | /* Set the Ethernet MAC Address registers */ |
Michael J. Spencer |
2:1df0b61d3b5a | 217 | LPC_EMAC->SA0 = ((uint32_t)abStationAddr[5] << 8) | (uint32_t)abStationAddr[4]; |
Michael J. Spencer |
2:1df0b61d3b5a | 218 | LPC_EMAC->SA1 = ((uint32_t)abStationAddr[3] << 8) | (uint32_t)abStationAddr[2]; |
Michael J. Spencer |
2:1df0b61d3b5a | 219 | LPC_EMAC->SA2 = ((uint32_t)abStationAddr[1] << 8) | (uint32_t)abStationAddr[0]; |
Michael J. Spencer |
2:1df0b61d3b5a | 220 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 221 | |
Michael J. Spencer |
2:1df0b61d3b5a | 222 | |
Michael J. Spencer |
2:1df0b61d3b5a | 223 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 224 | * @brief Calculates CRC code for number of bytes in the frame |
Michael J. Spencer |
2:1df0b61d3b5a | 225 | * @param[in] frame_no_fcs Pointer to the first byte of the frame |
Michael J. Spencer |
2:1df0b61d3b5a | 226 | * @param[in] frame_len length of the frame without the FCS |
Michael J. Spencer |
2:1df0b61d3b5a | 227 | * @return the CRC as a 32 bit integer |
Michael J. Spencer |
2:1df0b61d3b5a | 228 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 229 | static int32_t emac_CRCCalc(uint8_t frame_no_fcs[], int32_t frame_len) |
Michael J. Spencer |
2:1df0b61d3b5a | 230 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 231 | int i; // iterator |
Michael J. Spencer |
2:1df0b61d3b5a | 232 | int j; // another iterator |
Michael J. Spencer |
2:1df0b61d3b5a | 233 | char byte; // current byte |
Michael J. Spencer |
2:1df0b61d3b5a | 234 | int crc; // CRC result |
Michael J. Spencer |
2:1df0b61d3b5a | 235 | int q0, q1, q2, q3; // temporary variables |
Michael J. Spencer |
2:1df0b61d3b5a | 236 | crc = 0xFFFFFFFF; |
Michael J. Spencer |
2:1df0b61d3b5a | 237 | for (i = 0; i < frame_len; i++) { |
Michael J. Spencer |
2:1df0b61d3b5a | 238 | byte = *frame_no_fcs++; |
Michael J. Spencer |
2:1df0b61d3b5a | 239 | for (j = 0; j < 2; j++) { |
Michael J. Spencer |
2:1df0b61d3b5a | 240 | if (((crc >> 28) ^ (byte >> 3)) & 0x00000001) { |
Michael J. Spencer |
2:1df0b61d3b5a | 241 | q3 = 0x04C11DB7; |
Michael J. Spencer |
2:1df0b61d3b5a | 242 | } else { |
Michael J. Spencer |
2:1df0b61d3b5a | 243 | q3 = 0x00000000; |
Michael J. Spencer |
2:1df0b61d3b5a | 244 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 245 | if (((crc >> 29) ^ (byte >> 2)) & 0x00000001) { |
Michael J. Spencer |
2:1df0b61d3b5a | 246 | q2 = 0x09823B6E; |
Michael J. Spencer |
2:1df0b61d3b5a | 247 | } else { |
Michael J. Spencer |
2:1df0b61d3b5a | 248 | q2 = 0x00000000; |
Michael J. Spencer |
2:1df0b61d3b5a | 249 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 250 | if (((crc >> 30) ^ (byte >> 1)) & 0x00000001) { |
Michael J. Spencer |
2:1df0b61d3b5a | 251 | q1 = 0x130476DC; |
Michael J. Spencer |
2:1df0b61d3b5a | 252 | } else { |
Michael J. Spencer |
2:1df0b61d3b5a | 253 | q1 = 0x00000000; |
Michael J. Spencer |
2:1df0b61d3b5a | 254 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 255 | if (((crc >> 31) ^ (byte >> 0)) & 0x00000001) { |
Michael J. Spencer |
2:1df0b61d3b5a | 256 | q0 = 0x2608EDB8; |
Michael J. Spencer |
2:1df0b61d3b5a | 257 | } else { |
Michael J. Spencer |
2:1df0b61d3b5a | 258 | q0 = 0x00000000; |
Michael J. Spencer |
2:1df0b61d3b5a | 259 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 260 | crc = (crc << 4) ^ q3 ^ q2 ^ q1 ^ q0; |
Michael J. Spencer |
2:1df0b61d3b5a | 261 | byte >>= 4; |
Michael J. Spencer |
2:1df0b61d3b5a | 262 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 263 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 264 | return crc; |
Michael J. Spencer |
2:1df0b61d3b5a | 265 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 266 | /* End of Private Functions --------------------------------------------------- */ |
Michael J. Spencer |
2:1df0b61d3b5a | 267 | |
Michael J. Spencer |
2:1df0b61d3b5a | 268 | |
Michael J. Spencer |
2:1df0b61d3b5a | 269 | /* Public Functions ----------------------------------------------------------- */ |
Michael J. Spencer |
2:1df0b61d3b5a | 270 | /** @addtogroup EMAC_Public_Functions |
Michael J. Spencer |
2:1df0b61d3b5a | 271 | * @{ |
Michael J. Spencer |
2:1df0b61d3b5a | 272 | */ |
Michael J. Spencer |
2:1df0b61d3b5a | 273 | |
Michael J. Spencer |
2:1df0b61d3b5a | 274 | |
Michael J. Spencer |
2:1df0b61d3b5a | 275 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 276 | * @brief Initializes the EMAC peripheral according to the specified |
Michael J. Spencer |
2:1df0b61d3b5a | 277 | * parameters in the EMAC_ConfigStruct. |
Michael J. Spencer |
2:1df0b61d3b5a | 278 | * @param[in] EMAC_ConfigStruct Pointer to a EMAC_CFG_Type structure |
Michael J. Spencer |
2:1df0b61d3b5a | 279 | * that contains the configuration information for the |
Michael J. Spencer |
2:1df0b61d3b5a | 280 | * specified EMAC peripheral. |
Michael J. Spencer |
2:1df0b61d3b5a | 281 | * @return None |
Michael J. Spencer |
2:1df0b61d3b5a | 282 | * |
Michael J. Spencer |
2:1df0b61d3b5a | 283 | * Note: This function will initialize EMAC module according to procedure below: |
Michael J. Spencer |
2:1df0b61d3b5a | 284 | * - Remove the soft reset condition from the MAC |
Michael J. Spencer |
2:1df0b61d3b5a | 285 | * - Configure the PHY via the MIIM interface of the MAC |
Michael J. Spencer |
2:1df0b61d3b5a | 286 | * - Select RMII mode |
Michael J. Spencer |
2:1df0b61d3b5a | 287 | * - Configure the transmit and receive DMA engines, including the descriptor arrays |
Michael J. Spencer |
2:1df0b61d3b5a | 288 | * - Configure the host registers (MAC1,MAC2 etc.) in the MAC |
Michael J. Spencer |
2:1df0b61d3b5a | 289 | * - Enable the receive and transmit data paths |
Michael J. Spencer |
2:1df0b61d3b5a | 290 | * In default state after initializing, only Rx Done and Tx Done interrupt are enabled, |
Michael J. Spencer |
2:1df0b61d3b5a | 291 | * all remain interrupts are disabled |
Michael J. Spencer |
2:1df0b61d3b5a | 292 | * (Ref. from LPC17xx UM) |
Michael J. Spencer |
2:1df0b61d3b5a | 293 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 294 | Status EMAC_Init(EMAC_CFG_Type *EMAC_ConfigStruct) |
Michael J. Spencer |
2:1df0b61d3b5a | 295 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 296 | /* Initialize the EMAC Ethernet controller. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 297 | int32_t regv,tout, tmp; |
Michael J. Spencer |
2:1df0b61d3b5a | 298 | |
Michael J. Spencer |
2:1df0b61d3b5a | 299 | /* Set up clock and power for Ethernet module */ |
Michael J. Spencer |
2:1df0b61d3b5a | 300 | CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCENET, ENABLE); |
Michael J. Spencer |
2:1df0b61d3b5a | 301 | |
Michael J. Spencer |
2:1df0b61d3b5a | 302 | /* Reset all EMAC internal modules */ |
Michael J. Spencer |
2:1df0b61d3b5a | 303 | LPC_EMAC->MAC1 = EMAC_MAC1_RES_TX | EMAC_MAC1_RES_MCS_TX | EMAC_MAC1_RES_RX | |
Michael J. Spencer |
2:1df0b61d3b5a | 304 | EMAC_MAC1_RES_MCS_RX | EMAC_MAC1_SIM_RES | EMAC_MAC1_SOFT_RES; |
Michael J. Spencer |
2:1df0b61d3b5a | 305 | |
Michael J. Spencer |
2:1df0b61d3b5a | 306 | LPC_EMAC->Command = EMAC_CR_REG_RES | EMAC_CR_TX_RES | EMAC_CR_RX_RES | EMAC_CR_PASS_RUNT_FRM; |
Michael J. Spencer |
2:1df0b61d3b5a | 307 | |
Michael J. Spencer |
2:1df0b61d3b5a | 308 | /* A short delay after reset. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 309 | for (tout = 100; tout; tout--); |
Michael J. Spencer |
2:1df0b61d3b5a | 310 | |
Michael J. Spencer |
2:1df0b61d3b5a | 311 | /* Initialize MAC control registers. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 312 | LPC_EMAC->MAC1 = EMAC_MAC1_PASS_ALL; |
Michael J. Spencer |
2:1df0b61d3b5a | 313 | LPC_EMAC->MAC2 = EMAC_MAC2_CRC_EN | EMAC_MAC2_PAD_EN; |
Michael J. Spencer |
2:1df0b61d3b5a | 314 | LPC_EMAC->MAXF = EMAC_ETH_MAX_FLEN; |
Michael J. Spencer |
2:1df0b61d3b5a | 315 | /* |
Michael J. Spencer |
2:1df0b61d3b5a | 316 | * Find the clock that close to desired target clock |
Michael J. Spencer |
2:1df0b61d3b5a | 317 | */ |
Michael J. Spencer |
2:1df0b61d3b5a | 318 | tmp = SystemCoreClock / EMAC_MCFG_MII_MAXCLK; |
Michael J. Spencer |
2:1df0b61d3b5a | 319 | for (tout = 0; tout < (int32_t) sizeof (EMAC_clkdiv); tout++){ |
Michael J. Spencer |
2:1df0b61d3b5a | 320 | if (EMAC_clkdiv[tout] >= tmp) break; |
Michael J. Spencer |
2:1df0b61d3b5a | 321 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 322 | tout++; |
Michael J. Spencer |
2:1df0b61d3b5a | 323 | // Write to MAC configuration register and reset |
Michael J. Spencer |
2:1df0b61d3b5a | 324 | LPC_EMAC->MCFG = EMAC_MCFG_CLK_SEL(tout) | EMAC_MCFG_RES_MII; |
Michael J. Spencer |
2:1df0b61d3b5a | 325 | // release reset |
Michael J. Spencer |
2:1df0b61d3b5a | 326 | LPC_EMAC->MCFG &= ~(EMAC_MCFG_RES_MII); |
Michael J. Spencer |
2:1df0b61d3b5a | 327 | LPC_EMAC->CLRT = EMAC_CLRT_DEF; |
Michael J. Spencer |
2:1df0b61d3b5a | 328 | LPC_EMAC->IPGR = EMAC_IPGR_P2_DEF; |
Michael J. Spencer |
2:1df0b61d3b5a | 329 | |
Michael J. Spencer |
2:1df0b61d3b5a | 330 | /* Enable Reduced MII interface. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 331 | LPC_EMAC->Command = EMAC_CR_RMII | EMAC_CR_PASS_RUNT_FRM; |
Michael J. Spencer |
2:1df0b61d3b5a | 332 | |
Michael J. Spencer |
2:1df0b61d3b5a | 333 | /* Reset Reduced MII Logic. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 334 | LPC_EMAC->SUPP = EMAC_SUPP_RES_RMII; |
Michael J. Spencer |
2:1df0b61d3b5a | 335 | |
Michael J. Spencer |
2:1df0b61d3b5a | 336 | for (tout = 100; tout; tout--); |
Michael J. Spencer |
2:1df0b61d3b5a | 337 | LPC_EMAC->SUPP = 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 338 | |
Michael J. Spencer |
2:1df0b61d3b5a | 339 | /* Put the DP83848C in reset mode */ |
Michael J. Spencer |
2:1df0b61d3b5a | 340 | write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_BMCR_RESET); |
Michael J. Spencer |
2:1df0b61d3b5a | 341 | |
Michael J. Spencer |
2:1df0b61d3b5a | 342 | /* Wait for hardware reset to end. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 343 | for (tout = EMAC_PHY_RESP_TOUT; tout; tout--) { |
Michael J. Spencer |
2:1df0b61d3b5a | 344 | regv = read_PHY (EMAC_PHY_REG_BMCR); |
Michael J. Spencer |
2:1df0b61d3b5a | 345 | if (!(regv & (EMAC_PHY_BMCR_RESET | EMAC_PHY_BMCR_POWERDOWN))) { |
Michael J. Spencer |
2:1df0b61d3b5a | 346 | /* Reset complete, device not Power Down. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 347 | break; |
Michael J. Spencer |
2:1df0b61d3b5a | 348 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 349 | if (tout == 0){ |
Michael J. Spencer |
2:1df0b61d3b5a | 350 | // Time out, return ERROR |
Michael J. Spencer |
2:1df0b61d3b5a | 351 | return (ERROR); |
Michael J. Spencer |
2:1df0b61d3b5a | 352 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 353 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 354 | |
Michael J. Spencer |
2:1df0b61d3b5a | 355 | // Set PHY mode |
Michael J. Spencer |
2:1df0b61d3b5a | 356 | if (EMAC_SetPHYMode(EMAC_ConfigStruct->Mode) < 0){ |
Michael J. Spencer |
2:1df0b61d3b5a | 357 | return (ERROR); |
Michael J. Spencer |
2:1df0b61d3b5a | 358 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 359 | |
Michael J. Spencer |
2:1df0b61d3b5a | 360 | // Set EMAC address |
Michael J. Spencer |
2:1df0b61d3b5a | 361 | setEmacAddr(EMAC_ConfigStruct->pbEMAC_Addr); |
Michael J. Spencer |
2:1df0b61d3b5a | 362 | |
Michael J. Spencer |
2:1df0b61d3b5a | 363 | /* Initialize Tx and Rx DMA Descriptors */ |
Michael J. Spencer |
2:1df0b61d3b5a | 364 | rx_descr_init (); |
Michael J. Spencer |
2:1df0b61d3b5a | 365 | tx_descr_init (); |
Michael J. Spencer |
2:1df0b61d3b5a | 366 | |
Michael J. Spencer |
2:1df0b61d3b5a | 367 | // Set Receive Filter register: enable broadcast and multicast |
Michael J. Spencer |
2:1df0b61d3b5a | 368 | LPC_EMAC->RxFilterCtrl = EMAC_RFC_MCAST_EN | EMAC_RFC_BCAST_EN | EMAC_RFC_PERFECT_EN; |
Michael J. Spencer |
2:1df0b61d3b5a | 369 | |
Michael J. Spencer |
2:1df0b61d3b5a | 370 | /* Enable Rx Done and Tx Done interrupt for EMAC */ |
Michael J. Spencer |
2:1df0b61d3b5a | 371 | LPC_EMAC->IntEnable = EMAC_INT_RX_DONE | EMAC_INT_TX_DONE; |
Michael J. Spencer |
2:1df0b61d3b5a | 372 | |
Michael J. Spencer |
2:1df0b61d3b5a | 373 | /* Reset all interrupts */ |
Michael J. Spencer |
2:1df0b61d3b5a | 374 | LPC_EMAC->IntClear = 0xFFFF; |
Michael J. Spencer |
2:1df0b61d3b5a | 375 | |
Michael J. Spencer |
2:1df0b61d3b5a | 376 | /* Enable receive and transmit mode of MAC Ethernet core */ |
Michael J. Spencer |
2:1df0b61d3b5a | 377 | LPC_EMAC->Command |= (EMAC_CR_RX_EN | EMAC_CR_TX_EN); |
Michael J. Spencer |
2:1df0b61d3b5a | 378 | LPC_EMAC->MAC1 |= EMAC_MAC1_REC_EN; |
Michael J. Spencer |
2:1df0b61d3b5a | 379 | |
Michael J. Spencer |
2:1df0b61d3b5a | 380 | return SUCCESS; |
Michael J. Spencer |
2:1df0b61d3b5a | 381 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 382 | |
Michael J. Spencer |
2:1df0b61d3b5a | 383 | |
Michael J. Spencer |
2:1df0b61d3b5a | 384 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 385 | * @brief De-initializes the EMAC peripheral registers to their |
Michael J. Spencer |
2:1df0b61d3b5a | 386 | * default reset values. |
Michael J. Spencer |
2:1df0b61d3b5a | 387 | * @param[in] None |
Michael J. Spencer |
2:1df0b61d3b5a | 388 | * @return None |
Michael J. Spencer |
2:1df0b61d3b5a | 389 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 390 | void EMAC_DeInit(void) |
Michael J. Spencer |
2:1df0b61d3b5a | 391 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 392 | // Disable all interrupt |
Michael J. Spencer |
2:1df0b61d3b5a | 393 | LPC_EMAC->IntEnable = 0x00; |
Michael J. Spencer |
2:1df0b61d3b5a | 394 | // Clear all pending interrupt |
Michael J. Spencer |
2:1df0b61d3b5a | 395 | LPC_EMAC->IntClear = (0xFF) | (EMAC_INT_SOFT_INT | EMAC_INT_WAKEUP); |
Michael J. Spencer |
2:1df0b61d3b5a | 396 | |
Michael J. Spencer |
2:1df0b61d3b5a | 397 | /* TurnOff clock and power for Ethernet module */ |
Michael J. Spencer |
2:1df0b61d3b5a | 398 | CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCENET, DISABLE); |
Michael J. Spencer |
2:1df0b61d3b5a | 399 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 400 | |
Michael J. Spencer |
2:1df0b61d3b5a | 401 | |
Michael J. Spencer |
2:1df0b61d3b5a | 402 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 403 | * @brief Check specified PHY status in EMAC peripheral |
Michael J. Spencer |
2:1df0b61d3b5a | 404 | * @param[in] ulPHYState Specified PHY Status Type, should be: |
Michael J. Spencer |
2:1df0b61d3b5a | 405 | * - EMAC_PHY_STAT_LINK: Link Status |
Michael J. Spencer |
2:1df0b61d3b5a | 406 | * - EMAC_PHY_STAT_SPEED: Speed Status |
Michael J. Spencer |
2:1df0b61d3b5a | 407 | * - EMAC_PHY_STAT_DUP: Duplex Status |
Michael J. Spencer |
2:1df0b61d3b5a | 408 | * @return Status of specified PHY status (0 or 1). |
Michael J. Spencer |
2:1df0b61d3b5a | 409 | * (-1) if error. |
Michael J. Spencer |
2:1df0b61d3b5a | 410 | * |
Michael J. Spencer |
2:1df0b61d3b5a | 411 | * Note: |
Michael J. Spencer |
2:1df0b61d3b5a | 412 | * For EMAC_PHY_STAT_LINK, return value: |
Michael J. Spencer |
2:1df0b61d3b5a | 413 | * - 0: Link Down |
Michael J. Spencer |
2:1df0b61d3b5a | 414 | * - 1: Link Up |
Michael J. Spencer |
2:1df0b61d3b5a | 415 | * For EMAC_PHY_STAT_SPEED, return value: |
Michael J. Spencer |
2:1df0b61d3b5a | 416 | * - 0: 10Mbps |
Michael J. Spencer |
2:1df0b61d3b5a | 417 | * - 1: 100Mbps |
Michael J. Spencer |
2:1df0b61d3b5a | 418 | * For EMAC_PHY_STAT_DUP, return value: |
Michael J. Spencer |
2:1df0b61d3b5a | 419 | * - 0: Half-Duplex |
Michael J. Spencer |
2:1df0b61d3b5a | 420 | * - 1: Full-Duplex |
Michael J. Spencer |
2:1df0b61d3b5a | 421 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 422 | int32_t EMAC_CheckPHYStatus(uint32_t ulPHYState) |
Michael J. Spencer |
2:1df0b61d3b5a | 423 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 424 | int32_t regv, tmp; |
Michael J. Spencer |
2:1df0b61d3b5a | 425 | #ifdef MCB_LPC_1768 |
Michael J. Spencer |
2:1df0b61d3b5a | 426 | regv = read_PHY (EMAC_PHY_REG_STS); |
Michael J. Spencer |
2:1df0b61d3b5a | 427 | switch(ulPHYState){ |
Michael J. Spencer |
2:1df0b61d3b5a | 428 | case EMAC_PHY_STAT_LINK: |
Michael J. Spencer |
2:1df0b61d3b5a | 429 | tmp = (regv & EMAC_PHY_SR_LINK) ? 1 : 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 430 | break; |
Michael J. Spencer |
2:1df0b61d3b5a | 431 | case EMAC_PHY_STAT_SPEED: |
Michael J. Spencer |
2:1df0b61d3b5a | 432 | tmp = (regv & EMAC_PHY_SR_SPEED) ? 0 : 1; |
Michael J. Spencer |
2:1df0b61d3b5a | 433 | break; |
Michael J. Spencer |
2:1df0b61d3b5a | 434 | case EMAC_PHY_STAT_DUP: |
Michael J. Spencer |
2:1df0b61d3b5a | 435 | tmp = (regv & EMAC_PHY_SR_FULL_DUP) ? 1 : 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 436 | break; |
Michael J. Spencer |
2:1df0b61d3b5a | 437 | #elif defined(IAR_LPC_1768) |
Michael J. Spencer |
2:1df0b61d3b5a | 438 | /* Use IAR_LPC_1768 board: |
Michael J. Spencer |
2:1df0b61d3b5a | 439 | * FSZ8721BL doesn't have Status Register |
Michael J. Spencer |
2:1df0b61d3b5a | 440 | * so we read Basic Mode Status Register (0x01h) instead |
Michael J. Spencer |
2:1df0b61d3b5a | 441 | */ |
Michael J. Spencer |
2:1df0b61d3b5a | 442 | regv = read_PHY (EMAC_PHY_REG_BMSR); |
Michael J. Spencer |
2:1df0b61d3b5a | 443 | switch(ulPHYState){ |
Michael J. Spencer |
2:1df0b61d3b5a | 444 | case EMAC_PHY_STAT_LINK: |
Michael J. Spencer |
2:1df0b61d3b5a | 445 | tmp = (regv & EMAC_PHY_BMSR_LINK_STATUS) ? 1 : 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 446 | break; |
Michael J. Spencer |
2:1df0b61d3b5a | 447 | case EMAC_PHY_STAT_SPEED: |
Michael J. Spencer |
2:1df0b61d3b5a | 448 | tmp = (regv & EMAC_PHY_SR_100_SPEED) ? 1 : 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 449 | break; |
Michael J. Spencer |
2:1df0b61d3b5a | 450 | case EMAC_PHY_STAT_DUP: |
Michael J. Spencer |
2:1df0b61d3b5a | 451 | tmp = (regv & EMAC_PHY_SR_FULL_DUP) ? 1 : 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 452 | break; |
Michael J. Spencer |
2:1df0b61d3b5a | 453 | #endif |
Michael J. Spencer |
2:1df0b61d3b5a | 454 | default: |
Michael J. Spencer |
2:1df0b61d3b5a | 455 | tmp = -1; |
Michael J. Spencer |
2:1df0b61d3b5a | 456 | break; |
Michael J. Spencer |
2:1df0b61d3b5a | 457 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 458 | return (tmp); |
Michael J. Spencer |
2:1df0b61d3b5a | 459 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 460 | |
Michael J. Spencer |
2:1df0b61d3b5a | 461 | |
Michael J. Spencer |
2:1df0b61d3b5a | 462 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 463 | * @brief Set specified PHY mode in EMAC peripheral |
Michael J. Spencer |
2:1df0b61d3b5a | 464 | * @param[in] ulPHYMode Specified PHY mode, should be: |
Michael J. Spencer |
2:1df0b61d3b5a | 465 | * - EMAC_MODE_AUTO |
Michael J. Spencer |
2:1df0b61d3b5a | 466 | * - EMAC_MODE_10M_FULL |
Michael J. Spencer |
2:1df0b61d3b5a | 467 | * - EMAC_MODE_10M_HALF |
Michael J. Spencer |
2:1df0b61d3b5a | 468 | * - EMAC_MODE_100M_FULL |
Michael J. Spencer |
2:1df0b61d3b5a | 469 | * - EMAC_MODE_100M_HALF |
Michael J. Spencer |
2:1df0b61d3b5a | 470 | * @return Return (0) if no error, otherwise return (-1) |
Michael J. Spencer |
2:1df0b61d3b5a | 471 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 472 | int32_t EMAC_SetPHYMode(uint32_t ulPHYMode) |
Michael J. Spencer |
2:1df0b61d3b5a | 473 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 474 | int32_t id1, id2, tout, regv; |
Michael J. Spencer |
2:1df0b61d3b5a | 475 | |
Michael J. Spencer |
2:1df0b61d3b5a | 476 | /* Check if this is a DP83848C PHY. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 477 | id1 = read_PHY (EMAC_PHY_REG_IDR1); |
Michael J. Spencer |
2:1df0b61d3b5a | 478 | id2 = read_PHY (EMAC_PHY_REG_IDR2); |
Michael J. Spencer |
2:1df0b61d3b5a | 479 | |
Michael J. Spencer |
2:1df0b61d3b5a | 480 | #ifdef MCB_LPC_1768 |
Michael J. Spencer |
2:1df0b61d3b5a | 481 | if (((id1 << 16) | (id2 & 0xFFF0)) == EMAC_DP83848C_ID) { |
Michael J. Spencer |
2:1df0b61d3b5a | 482 | switch(ulPHYMode){ |
Michael J. Spencer |
2:1df0b61d3b5a | 483 | case EMAC_MODE_AUTO: |
Michael J. Spencer |
2:1df0b61d3b5a | 484 | write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_AUTO_NEG); |
Michael J. Spencer |
2:1df0b61d3b5a | 485 | #elif defined(IAR_LPC_1768) /* Use IAR LPC1768 KickStart board */ |
Michael J. Spencer |
2:1df0b61d3b5a | 486 | if (((id1 << 16) | id2) == EMAC_KSZ8721BL_ID) { |
Michael J. Spencer |
2:1df0b61d3b5a | 487 | /* Configure the PHY device */ |
Michael J. Spencer |
2:1df0b61d3b5a | 488 | switch(ulPHYMode){ |
Michael J. Spencer |
2:1df0b61d3b5a | 489 | case EMAC_MODE_AUTO: |
Michael J. Spencer |
2:1df0b61d3b5a | 490 | /* Use auto-negotiation about the link speed. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 491 | write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_AUTO_NEG); |
Michael J. Spencer |
2:1df0b61d3b5a | 492 | // write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_BMCR_AN); |
Michael J. Spencer |
2:1df0b61d3b5a | 493 | #endif |
Michael J. Spencer |
2:1df0b61d3b5a | 494 | /* Wait to complete Auto_Negotiation */ |
Michael J. Spencer |
2:1df0b61d3b5a | 495 | for (tout = EMAC_PHY_RESP_TOUT; tout; tout--) { |
Michael J. Spencer |
2:1df0b61d3b5a | 496 | regv = read_PHY (EMAC_PHY_REG_BMSR); |
Michael J. Spencer |
2:1df0b61d3b5a | 497 | if (regv & EMAC_PHY_BMSR_AUTO_DONE) { |
Michael J. Spencer |
2:1df0b61d3b5a | 498 | /* Auto-negotiation Complete. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 499 | break; |
Michael J. Spencer |
2:1df0b61d3b5a | 500 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 501 | if (tout == 0){ |
Michael J. Spencer |
2:1df0b61d3b5a | 502 | // Time out, return error |
Michael J. Spencer |
2:1df0b61d3b5a | 503 | return (-1); |
Michael J. Spencer |
2:1df0b61d3b5a | 504 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 505 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 506 | break; |
Michael J. Spencer |
2:1df0b61d3b5a | 507 | case EMAC_MODE_10M_FULL: |
Michael J. Spencer |
2:1df0b61d3b5a | 508 | /* Connect at 10MBit full-duplex */ |
Michael J. Spencer |
2:1df0b61d3b5a | 509 | write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_FULLD_10M); |
Michael J. Spencer |
2:1df0b61d3b5a | 510 | break; |
Michael J. Spencer |
2:1df0b61d3b5a | 511 | case EMAC_MODE_10M_HALF: |
Michael J. Spencer |
2:1df0b61d3b5a | 512 | /* Connect at 10MBit half-duplex */ |
Michael J. Spencer |
2:1df0b61d3b5a | 513 | write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_HALFD_10M); |
Michael J. Spencer |
2:1df0b61d3b5a | 514 | break; |
Michael J. Spencer |
2:1df0b61d3b5a | 515 | case EMAC_MODE_100M_FULL: |
Michael J. Spencer |
2:1df0b61d3b5a | 516 | /* Connect at 100MBit full-duplex */ |
Michael J. Spencer |
2:1df0b61d3b5a | 517 | write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_FULLD_100M); |
Michael J. Spencer |
2:1df0b61d3b5a | 518 | break; |
Michael J. Spencer |
2:1df0b61d3b5a | 519 | case EMAC_MODE_100M_HALF: |
Michael J. Spencer |
2:1df0b61d3b5a | 520 | /* Connect at 100MBit half-duplex */ |
Michael J. Spencer |
2:1df0b61d3b5a | 521 | write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_HALFD_100M); |
Michael J. Spencer |
2:1df0b61d3b5a | 522 | break; |
Michael J. Spencer |
2:1df0b61d3b5a | 523 | default: |
Michael J. Spencer |
2:1df0b61d3b5a | 524 | // un-supported |
Michael J. Spencer |
2:1df0b61d3b5a | 525 | return (-1); |
Michael J. Spencer |
2:1df0b61d3b5a | 526 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 527 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 528 | // It's not correct module ID |
Michael J. Spencer |
2:1df0b61d3b5a | 529 | else { |
Michael J. Spencer |
2:1df0b61d3b5a | 530 | return (-1); |
Michael J. Spencer |
2:1df0b61d3b5a | 531 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 532 | |
Michael J. Spencer |
2:1df0b61d3b5a | 533 | // Update EMAC configuration with current PHY status |
Michael J. Spencer |
2:1df0b61d3b5a | 534 | if (EMAC_UpdatePHYStatus() < 0){ |
Michael J. Spencer |
2:1df0b61d3b5a | 535 | return (-1); |
Michael J. Spencer |
2:1df0b61d3b5a | 536 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 537 | |
Michael J. Spencer |
2:1df0b61d3b5a | 538 | // Complete |
Michael J. Spencer |
2:1df0b61d3b5a | 539 | return (0); |
Michael J. Spencer |
2:1df0b61d3b5a | 540 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 541 | |
Michael J. Spencer |
2:1df0b61d3b5a | 542 | |
Michael J. Spencer |
2:1df0b61d3b5a | 543 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 544 | * @brief Auto-Configures value for the EMAC configuration register to |
Michael J. Spencer |
2:1df0b61d3b5a | 545 | * match with current PHY mode |
Michael J. Spencer |
2:1df0b61d3b5a | 546 | * @param[in] None |
Michael J. Spencer |
2:1df0b61d3b5a | 547 | * @return Return (0) if no error, otherwise return (-1) |
Michael J. Spencer |
2:1df0b61d3b5a | 548 | * |
Michael J. Spencer |
2:1df0b61d3b5a | 549 | * Note: The EMAC configuration will be auto-configured: |
Michael J. Spencer |
2:1df0b61d3b5a | 550 | * - Speed mode. |
Michael J. Spencer |
2:1df0b61d3b5a | 551 | * - Half/Full duplex mode |
Michael J. Spencer |
2:1df0b61d3b5a | 552 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 553 | int32_t EMAC_UpdatePHYStatus(void) |
Michael J. Spencer |
2:1df0b61d3b5a | 554 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 555 | int32_t regv, tout; |
Michael J. Spencer |
2:1df0b61d3b5a | 556 | |
Michael J. Spencer |
2:1df0b61d3b5a | 557 | /* Check the link status. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 558 | #ifdef MCB_LPC_1768 |
Michael J. Spencer |
2:1df0b61d3b5a | 559 | for (tout = EMAC_PHY_RESP_TOUT; tout; tout--) { |
Michael J. Spencer |
2:1df0b61d3b5a | 560 | regv = read_PHY (EMAC_PHY_REG_STS); |
Michael J. Spencer |
2:1df0b61d3b5a | 561 | if (regv & EMAC_PHY_SR_LINK) { |
Michael J. Spencer |
2:1df0b61d3b5a | 562 | /* Link is on. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 563 | break; |
Michael J. Spencer |
2:1df0b61d3b5a | 564 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 565 | if (tout == 0){ |
Michael J. Spencer |
2:1df0b61d3b5a | 566 | // time out |
Michael J. Spencer |
2:1df0b61d3b5a | 567 | return (-1); |
Michael J. Spencer |
2:1df0b61d3b5a | 568 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 569 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 570 | /* Configure Full/Half Duplex mode. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 571 | if (regv & EMAC_PHY_SR_DUP) { |
Michael J. Spencer |
2:1df0b61d3b5a | 572 | /* Full duplex is enabled. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 573 | LPC_EMAC->MAC2 |= EMAC_MAC2_FULL_DUP; |
Michael J. Spencer |
2:1df0b61d3b5a | 574 | LPC_EMAC->Command |= EMAC_CR_FULL_DUP; |
Michael J. Spencer |
2:1df0b61d3b5a | 575 | LPC_EMAC->IPGT = EMAC_IPGT_FULL_DUP; |
Michael J. Spencer |
2:1df0b61d3b5a | 576 | } else { |
Michael J. Spencer |
2:1df0b61d3b5a | 577 | /* Half duplex mode. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 578 | LPC_EMAC->IPGT = EMAC_IPGT_HALF_DUP; |
Michael J. Spencer |
2:1df0b61d3b5a | 579 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 580 | if (regv & EMAC_PHY_SR_SPEED) { |
Michael J. Spencer |
2:1df0b61d3b5a | 581 | /* 10MBit mode. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 582 | LPC_EMAC->SUPP = 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 583 | } else { |
Michael J. Spencer |
2:1df0b61d3b5a | 584 | /* 100MBit mode. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 585 | LPC_EMAC->SUPP = EMAC_SUPP_SPEED; |
Michael J. Spencer |
2:1df0b61d3b5a | 586 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 587 | #elif defined(IAR_LPC_1768) |
Michael J. Spencer |
2:1df0b61d3b5a | 588 | for (tout = EMAC_PHY_RESP_TOUT; tout; tout--) { |
Michael J. Spencer |
2:1df0b61d3b5a | 589 | regv = read_PHY (EMAC_PHY_REG_BMSR); |
Michael J. Spencer |
2:1df0b61d3b5a | 590 | if (regv & EMAC_PHY_BMSR_LINK_STATUS) { |
Michael J. Spencer |
2:1df0b61d3b5a | 591 | /* Link is on. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 592 | break; |
Michael J. Spencer |
2:1df0b61d3b5a | 593 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 594 | if (tout == 0){ |
Michael J. Spencer |
2:1df0b61d3b5a | 595 | // time out |
Michael J. Spencer |
2:1df0b61d3b5a | 596 | return (-1); |
Michael J. Spencer |
2:1df0b61d3b5a | 597 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 598 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 599 | |
Michael J. Spencer |
2:1df0b61d3b5a | 600 | /* Configure Full/Half Duplex mode. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 601 | if (regv & EMAC_PHY_SR_FULL_DUP) { |
Michael J. Spencer |
2:1df0b61d3b5a | 602 | /* Full duplex is enabled. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 603 | LPC_EMAC->MAC2 |= EMAC_MAC2_FULL_DUP; |
Michael J. Spencer |
2:1df0b61d3b5a | 604 | LPC_EMAC->Command |= EMAC_CR_FULL_DUP; |
Michael J. Spencer |
2:1df0b61d3b5a | 605 | LPC_EMAC->IPGT = EMAC_IPGT_FULL_DUP; |
Michael J. Spencer |
2:1df0b61d3b5a | 606 | } else { |
Michael J. Spencer |
2:1df0b61d3b5a | 607 | /* Half duplex mode. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 608 | LPC_EMAC->IPGT = EMAC_IPGT_HALF_DUP; |
Michael J. Spencer |
2:1df0b61d3b5a | 609 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 610 | |
Michael J. Spencer |
2:1df0b61d3b5a | 611 | /* Configure 100MBit/10MBit mode. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 612 | if (!(regv & EMAC_PHY_SR_100_SPEED)) { |
Michael J. Spencer |
2:1df0b61d3b5a | 613 | /* 10MBit mode. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 614 | LPC_EMAC->SUPP = 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 615 | } else { |
Michael J. Spencer |
2:1df0b61d3b5a | 616 | /* 100MBit mode. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 617 | LPC_EMAC->SUPP = EMAC_SUPP_SPEED; |
Michael J. Spencer |
2:1df0b61d3b5a | 618 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 619 | #endif |
Michael J. Spencer |
2:1df0b61d3b5a | 620 | // Complete |
Michael J. Spencer |
2:1df0b61d3b5a | 621 | return (0); |
Michael J. Spencer |
2:1df0b61d3b5a | 622 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 623 | |
Michael J. Spencer |
2:1df0b61d3b5a | 624 | |
Michael J. Spencer |
2:1df0b61d3b5a | 625 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 626 | * @brief Enable/Disable hash filter functionality for specified destination |
Michael J. Spencer |
2:1df0b61d3b5a | 627 | * MAC address in EMAC module |
Michael J. Spencer |
2:1df0b61d3b5a | 628 | * @param[in] dstMAC_addr Pointer to the first MAC destination address, should |
Michael J. Spencer |
2:1df0b61d3b5a | 629 | * be 6-bytes length, in order LSB to the MSB |
Michael J. Spencer |
2:1df0b61d3b5a | 630 | * @param[in] NewState New State of this command, should be: |
Michael J. Spencer |
2:1df0b61d3b5a | 631 | * - ENABLE. |
Michael J. Spencer |
2:1df0b61d3b5a | 632 | * - DISABLE. |
Michael J. Spencer |
2:1df0b61d3b5a | 633 | * @return None |
Michael J. Spencer |
2:1df0b61d3b5a | 634 | * |
Michael J. Spencer |
2:1df0b61d3b5a | 635 | * Note: |
Michael J. Spencer |
2:1df0b61d3b5a | 636 | * The standard Ethernet cyclic redundancy check (CRC) function is calculated from |
Michael J. Spencer |
2:1df0b61d3b5a | 637 | * the 6 byte destination address in the Ethernet frame (this CRC is calculated |
Michael J. Spencer |
2:1df0b61d3b5a | 638 | * anyway as part of calculating the CRC of the whole frame), then bits [28:23] out of |
Michael J. Spencer |
2:1df0b61d3b5a | 639 | * the 32 bits CRC result are taken to form the hash. The 6 bit hash is used to access |
Michael J. Spencer |
2:1df0b61d3b5a | 640 | * the hash table: it is used as an index in the 64 bit HashFilter register that has been |
Michael J. Spencer |
2:1df0b61d3b5a | 641 | * programmed with accept values. If the selected accept value is 1, the frame is |
Michael J. Spencer |
2:1df0b61d3b5a | 642 | * accepted. |
Michael J. Spencer |
2:1df0b61d3b5a | 643 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 644 | void EMAC_SetHashFilter(uint8_t dstMAC_addr[], FunctionalState NewState) |
Michael J. Spencer |
2:1df0b61d3b5a | 645 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 646 | volatile uint32_t *pReg; |
Michael J. Spencer |
2:1df0b61d3b5a | 647 | uint32_t tmp; |
Michael J. Spencer |
2:1df0b61d3b5a | 648 | int32_t crc; |
Michael J. Spencer |
2:1df0b61d3b5a | 649 | |
Michael J. Spencer |
2:1df0b61d3b5a | 650 | // Calculate the CRC from the destination MAC address |
Michael J. Spencer |
2:1df0b61d3b5a | 651 | crc = emac_CRCCalc(dstMAC_addr, 6); |
Michael J. Spencer |
2:1df0b61d3b5a | 652 | // Extract the value from CRC to get index value for hash filter table |
Michael J. Spencer |
2:1df0b61d3b5a | 653 | crc = (crc >> 23) & 0x3F; |
Michael J. Spencer |
2:1df0b61d3b5a | 654 | |
Michael J. Spencer |
2:1df0b61d3b5a | 655 | pReg = (crc > 31) ? ((volatile uint32_t *)&LPC_EMAC->HashFilterH) \ |
Michael J. Spencer |
2:1df0b61d3b5a | 656 | : ((volatile uint32_t *)&LPC_EMAC->HashFilterL); |
Michael J. Spencer |
2:1df0b61d3b5a | 657 | tmp = (crc > 31) ? (crc - 32) : crc; |
Michael J. Spencer |
2:1df0b61d3b5a | 658 | if (NewState == ENABLE) { |
Michael J. Spencer |
2:1df0b61d3b5a | 659 | (*pReg) |= (1UL << tmp); |
Michael J. Spencer |
2:1df0b61d3b5a | 660 | } else { |
Michael J. Spencer |
2:1df0b61d3b5a | 661 | (*pReg) &= ~(1UL << tmp); |
Michael J. Spencer |
2:1df0b61d3b5a | 662 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 663 | // Enable Rx Filter |
Michael J. Spencer |
2:1df0b61d3b5a | 664 | LPC_EMAC->Command &= ~EMAC_CR_PASS_RX_FILT; |
Michael J. Spencer |
2:1df0b61d3b5a | 665 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 666 | |
Michael J. Spencer |
2:1df0b61d3b5a | 667 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 668 | * @brief Enable/Disable Filter mode for each specified type EMAC peripheral |
Michael J. Spencer |
2:1df0b61d3b5a | 669 | * @param[in] ulFilterMode Filter mode, should be: |
Michael J. Spencer |
2:1df0b61d3b5a | 670 | * - EMAC_RFC_UCAST_EN: all frames of unicast types |
Michael J. Spencer |
2:1df0b61d3b5a | 671 | * will be accepted |
Michael J. Spencer |
2:1df0b61d3b5a | 672 | * - EMAC_RFC_BCAST_EN: broadcast frame will be |
Michael J. Spencer |
2:1df0b61d3b5a | 673 | * accepted |
Michael J. Spencer |
2:1df0b61d3b5a | 674 | * - EMAC_RFC_MCAST_EN: all frames of multicast |
Michael J. Spencer |
2:1df0b61d3b5a | 675 | * types will be accepted |
Michael J. Spencer |
2:1df0b61d3b5a | 676 | * - EMAC_RFC_UCAST_HASH_EN: The imperfect hash |
Michael J. Spencer |
2:1df0b61d3b5a | 677 | * filter will be applied to unicast addresses |
Michael J. Spencer |
2:1df0b61d3b5a | 678 | * - EMAC_RFC_MCAST_HASH_EN: The imperfect hash |
Michael J. Spencer |
2:1df0b61d3b5a | 679 | * filter will be applied to multicast addresses |
Michael J. Spencer |
2:1df0b61d3b5a | 680 | * - EMAC_RFC_PERFECT_EN: the destination address |
Michael J. Spencer |
2:1df0b61d3b5a | 681 | * will be compared with the 6 byte station address |
Michael J. Spencer |
2:1df0b61d3b5a | 682 | * programmed in the station address by the filter |
Michael J. Spencer |
2:1df0b61d3b5a | 683 | * - EMAC_RFC_MAGP_WOL_EN: the result of the magic |
Michael J. Spencer |
2:1df0b61d3b5a | 684 | * packet filter will generate a WoL interrupt when |
Michael J. Spencer |
2:1df0b61d3b5a | 685 | * there is a match |
Michael J. Spencer |
2:1df0b61d3b5a | 686 | * - EMAC_RFC_PFILT_WOL_EN: the result of the perfect address |
Michael J. Spencer |
2:1df0b61d3b5a | 687 | * matching filter and the imperfect hash filter will |
Michael J. Spencer |
2:1df0b61d3b5a | 688 | * generate a WoL interrupt when there is a match |
Michael J. Spencer |
2:1df0b61d3b5a | 689 | * @param[in] NewState New State of this command, should be: |
Michael J. Spencer |
2:1df0b61d3b5a | 690 | * - ENABLE |
Michael J. Spencer |
2:1df0b61d3b5a | 691 | * - DISABLE |
Michael J. Spencer |
2:1df0b61d3b5a | 692 | * @return None |
Michael J. Spencer |
2:1df0b61d3b5a | 693 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 694 | void EMAC_SetFilterMode(uint32_t ulFilterMode, FunctionalState NewState) |
Michael J. Spencer |
2:1df0b61d3b5a | 695 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 696 | if (NewState == ENABLE){ |
Michael J. Spencer |
2:1df0b61d3b5a | 697 | LPC_EMAC->RxFilterCtrl |= ulFilterMode; |
Michael J. Spencer |
2:1df0b61d3b5a | 698 | } else { |
Michael J. Spencer |
2:1df0b61d3b5a | 699 | LPC_EMAC->RxFilterCtrl &= ~ulFilterMode; |
Michael J. Spencer |
2:1df0b61d3b5a | 700 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 701 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 702 | |
Michael J. Spencer |
2:1df0b61d3b5a | 703 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 704 | * @brief Get status of Wake On LAN Filter for each specified |
Michael J. Spencer |
2:1df0b61d3b5a | 705 | * type in EMAC peripheral, clear this status if it is set |
Michael J. Spencer |
2:1df0b61d3b5a | 706 | * @param[in] ulWoLMode WoL Filter mode, should be: |
Michael J. Spencer |
2:1df0b61d3b5a | 707 | * - EMAC_WOL_UCAST: unicast frames caused WoL |
Michael J. Spencer |
2:1df0b61d3b5a | 708 | * - EMAC_WOL_UCAST: broadcast frame caused WoL |
Michael J. Spencer |
2:1df0b61d3b5a | 709 | * - EMAC_WOL_MCAST: multicast frame caused WoL |
Michael J. Spencer |
2:1df0b61d3b5a | 710 | * - EMAC_WOL_UCAST_HASH: unicast frame that passes the |
Michael J. Spencer |
2:1df0b61d3b5a | 711 | * imperfect hash filter caused WoL |
Michael J. Spencer |
2:1df0b61d3b5a | 712 | * - EMAC_WOL_MCAST_HASH: multicast frame that passes the |
Michael J. Spencer |
2:1df0b61d3b5a | 713 | * imperfect hash filter caused WoL |
Michael J. Spencer |
2:1df0b61d3b5a | 714 | * - EMAC_WOL_PERFECT:perfect address matching filter |
Michael J. Spencer |
2:1df0b61d3b5a | 715 | * caused WoL |
Michael J. Spencer |
2:1df0b61d3b5a | 716 | * - EMAC_WOL_RX_FILTER: the receive filter caused WoL |
Michael J. Spencer |
2:1df0b61d3b5a | 717 | * - EMAC_WOL_MAG_PACKET: the magic packet filter caused WoL |
Michael J. Spencer |
2:1df0b61d3b5a | 718 | * @return SET/RESET |
Michael J. Spencer |
2:1df0b61d3b5a | 719 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 720 | FlagStatus EMAC_GetWoLStatus(uint32_t ulWoLMode) |
Michael J. Spencer |
2:1df0b61d3b5a | 721 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 722 | if (LPC_EMAC->RxFilterWoLStatus & ulWoLMode) { |
Michael J. Spencer |
2:1df0b61d3b5a | 723 | LPC_EMAC->RxFilterWoLClear = ulWoLMode; |
Michael J. Spencer |
2:1df0b61d3b5a | 724 | return SET; |
Michael J. Spencer |
2:1df0b61d3b5a | 725 | } else { |
Michael J. Spencer |
2:1df0b61d3b5a | 726 | return RESET; |
Michael J. Spencer |
2:1df0b61d3b5a | 727 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 728 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 729 | |
Michael J. Spencer |
2:1df0b61d3b5a | 730 | |
Michael J. Spencer |
2:1df0b61d3b5a | 731 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 732 | * @brief Write data to Tx packet data buffer at current index due to |
Michael J. Spencer |
2:1df0b61d3b5a | 733 | * TxProduceIndex |
Michael J. Spencer |
2:1df0b61d3b5a | 734 | * @param[in] pDataStruct Pointer to a EMAC_PACKETBUF_Type structure |
Michael J. Spencer |
2:1df0b61d3b5a | 735 | * data that contain specified information about |
Michael J. Spencer |
2:1df0b61d3b5a | 736 | * Packet data buffer. |
Michael J. Spencer |
2:1df0b61d3b5a | 737 | * @return None |
Michael J. Spencer |
2:1df0b61d3b5a | 738 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 739 | void EMAC_WritePacketBuffer(EMAC_PACKETBUF_Type *pDataStruct) |
Michael J. Spencer |
2:1df0b61d3b5a | 740 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 741 | uint32_t idx,len; |
Michael J. Spencer |
2:1df0b61d3b5a | 742 | uint32_t *sp,*dp; |
Michael J. Spencer |
2:1df0b61d3b5a | 743 | |
Michael J. Spencer |
2:1df0b61d3b5a | 744 | idx = LPC_EMAC->TxProduceIndex; |
Michael J. Spencer |
2:1df0b61d3b5a | 745 | sp = (uint32_t *)pDataStruct->pbDataBuf; |
Michael J. Spencer |
2:1df0b61d3b5a | 746 | dp = (uint32_t *)Tx_Desc[idx].Packet; |
Michael J. Spencer |
2:1df0b61d3b5a | 747 | /* Copy frame data to EMAC packet buffers. */ |
Michael J. Spencer |
2:1df0b61d3b5a | 748 | for (len = (pDataStruct->ulDataLen + 3) >> 2; len; len--) { |
Michael J. Spencer |
2:1df0b61d3b5a | 749 | *dp++ = *sp++; |
Michael J. Spencer |
2:1df0b61d3b5a | 750 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 751 | Tx_Desc[idx].Ctrl = (pDataStruct->ulDataLen - 1) | (EMAC_TCTRL_INT | EMAC_TCTRL_LAST); |
Michael J. Spencer |
2:1df0b61d3b5a | 752 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 753 | |
Michael J. Spencer |
2:1df0b61d3b5a | 754 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 755 | * @brief Read data from Rx packet data buffer at current index due |
Michael J. Spencer |
2:1df0b61d3b5a | 756 | * to RxConsumeIndex |
Michael J. Spencer |
2:1df0b61d3b5a | 757 | * @param[in] pDataStruct Pointer to a EMAC_PACKETBUF_Type structure |
Michael J. Spencer |
2:1df0b61d3b5a | 758 | * data that contain specified information about |
Michael J. Spencer |
2:1df0b61d3b5a | 759 | * Packet data buffer. |
Michael J. Spencer |
2:1df0b61d3b5a | 760 | * @return None |
Michael J. Spencer |
2:1df0b61d3b5a | 761 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 762 | void EMAC_ReadPacketBuffer(EMAC_PACKETBUF_Type *pDataStruct) |
Michael J. Spencer |
2:1df0b61d3b5a | 763 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 764 | uint32_t idx, len; |
Michael J. Spencer |
2:1df0b61d3b5a | 765 | uint32_t *dp, *sp; |
Michael J. Spencer |
2:1df0b61d3b5a | 766 | |
Michael J. Spencer |
2:1df0b61d3b5a | 767 | idx = LPC_EMAC->RxConsumeIndex; |
Michael J. Spencer |
2:1df0b61d3b5a | 768 | dp = (uint32_t *)pDataStruct->pbDataBuf; |
Michael J. Spencer |
2:1df0b61d3b5a | 769 | sp = (uint32_t *)Rx_Desc[idx].Packet; |
Michael J. Spencer |
2:1df0b61d3b5a | 770 | |
Michael J. Spencer |
2:1df0b61d3b5a | 771 | if (pDataStruct->pbDataBuf != NULL) { |
Michael J. Spencer |
2:1df0b61d3b5a | 772 | for (len = (pDataStruct->ulDataLen + 3) >> 2; len; len--) { |
Michael J. Spencer |
2:1df0b61d3b5a | 773 | *dp++ = *sp++; |
Michael J. Spencer |
2:1df0b61d3b5a | 774 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 775 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 776 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 777 | |
Michael J. Spencer |
2:1df0b61d3b5a | 778 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 779 | * @brief Enable/Disable interrupt for each type in EMAC |
Michael J. Spencer |
2:1df0b61d3b5a | 780 | * @param[in] ulIntType Interrupt Type, should be: |
Michael J. Spencer |
2:1df0b61d3b5a | 781 | * - EMAC_INT_RX_OVERRUN: Receive Overrun |
Michael J. Spencer |
2:1df0b61d3b5a | 782 | * - EMAC_INT_RX_ERR: Receive Error |
Michael J. Spencer |
2:1df0b61d3b5a | 783 | * - EMAC_INT_RX_FIN: Receive Descriptor Finish |
Michael J. Spencer |
2:1df0b61d3b5a | 784 | * - EMAC_INT_RX_DONE: Receive Done |
Michael J. Spencer |
2:1df0b61d3b5a | 785 | * - EMAC_INT_TX_UNDERRUN: Transmit Under-run |
Michael J. Spencer |
2:1df0b61d3b5a | 786 | * - EMAC_INT_TX_ERR: Transmit Error |
Michael J. Spencer |
2:1df0b61d3b5a | 787 | * - EMAC_INT_TX_FIN: Transmit descriptor finish |
Michael J. Spencer |
2:1df0b61d3b5a | 788 | * - EMAC_INT_TX_DONE: Transmit Done |
Michael J. Spencer |
2:1df0b61d3b5a | 789 | * - EMAC_INT_SOFT_INT: Software interrupt |
Michael J. Spencer |
2:1df0b61d3b5a | 790 | * - EMAC_INT_WAKEUP: Wakeup interrupt |
Michael J. Spencer |
2:1df0b61d3b5a | 791 | * @param[in] NewState New State of this function, should be: |
Michael J. Spencer |
2:1df0b61d3b5a | 792 | * - ENABLE. |
Michael J. Spencer |
2:1df0b61d3b5a | 793 | * - DISABLE. |
Michael J. Spencer |
2:1df0b61d3b5a | 794 | * @return None |
Michael J. Spencer |
2:1df0b61d3b5a | 795 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 796 | void EMAC_IntCmd(uint32_t ulIntType, FunctionalState NewState) |
Michael J. Spencer |
2:1df0b61d3b5a | 797 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 798 | if (NewState == ENABLE) { |
Michael J. Spencer |
2:1df0b61d3b5a | 799 | LPC_EMAC->IntEnable |= ulIntType; |
Michael J. Spencer |
2:1df0b61d3b5a | 800 | } else { |
Michael J. Spencer |
2:1df0b61d3b5a | 801 | LPC_EMAC->IntEnable &= ~(ulIntType); |
Michael J. Spencer |
2:1df0b61d3b5a | 802 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 803 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 804 | |
Michael J. Spencer |
2:1df0b61d3b5a | 805 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 806 | * @brief Check whether if specified interrupt flag is set or not |
Michael J. Spencer |
2:1df0b61d3b5a | 807 | * for each interrupt type in EMAC and clear interrupt pending |
Michael J. Spencer |
2:1df0b61d3b5a | 808 | * if it is set. |
Michael J. Spencer |
2:1df0b61d3b5a | 809 | * @param[in] ulIntType Interrupt Type, should be: |
Michael J. Spencer |
2:1df0b61d3b5a | 810 | * - EMAC_INT_RX_OVERRUN: Receive Overrun |
Michael J. Spencer |
2:1df0b61d3b5a | 811 | * - EMAC_INT_RX_ERR: Receive Error |
Michael J. Spencer |
2:1df0b61d3b5a | 812 | * - EMAC_INT_RX_FIN: Receive Descriptor Finish |
Michael J. Spencer |
2:1df0b61d3b5a | 813 | * - EMAC_INT_RX_DONE: Receive Done |
Michael J. Spencer |
2:1df0b61d3b5a | 814 | * - EMAC_INT_TX_UNDERRUN: Transmit Under-run |
Michael J. Spencer |
2:1df0b61d3b5a | 815 | * - EMAC_INT_TX_ERR: Transmit Error |
Michael J. Spencer |
2:1df0b61d3b5a | 816 | * - EMAC_INT_TX_FIN: Transmit descriptor finish |
Michael J. Spencer |
2:1df0b61d3b5a | 817 | * - EMAC_INT_TX_DONE: Transmit Done |
Michael J. Spencer |
2:1df0b61d3b5a | 818 | * - EMAC_INT_SOFT_INT: Software interrupt |
Michael J. Spencer |
2:1df0b61d3b5a | 819 | * - EMAC_INT_WAKEUP: Wakeup interrupt |
Michael J. Spencer |
2:1df0b61d3b5a | 820 | * @return New state of specified interrupt (SET or RESET) |
Michael J. Spencer |
2:1df0b61d3b5a | 821 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 822 | IntStatus EMAC_IntGetStatus(uint32_t ulIntType) |
Michael J. Spencer |
2:1df0b61d3b5a | 823 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 824 | if (LPC_EMAC->IntStatus & ulIntType) { |
Michael J. Spencer |
2:1df0b61d3b5a | 825 | LPC_EMAC->IntClear = ulIntType; |
Michael J. Spencer |
2:1df0b61d3b5a | 826 | return SET; |
Michael J. Spencer |
2:1df0b61d3b5a | 827 | } else { |
Michael J. Spencer |
2:1df0b61d3b5a | 828 | return RESET; |
Michael J. Spencer |
2:1df0b61d3b5a | 829 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 830 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 831 | |
Michael J. Spencer |
2:1df0b61d3b5a | 832 | |
Michael J. Spencer |
2:1df0b61d3b5a | 833 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 834 | * @brief Check whether if the current RxConsumeIndex is not equal to the |
Michael J. Spencer |
2:1df0b61d3b5a | 835 | * current RxProduceIndex. |
Michael J. Spencer |
2:1df0b61d3b5a | 836 | * @param[in] None |
Michael J. Spencer |
2:1df0b61d3b5a | 837 | * @return TRUE if they're not equal, otherwise return FALSE |
Michael J. Spencer |
2:1df0b61d3b5a | 838 | * |
Michael J. Spencer |
2:1df0b61d3b5a | 839 | * Note: In case the RxConsumeIndex is not equal to the RxProduceIndex, |
Michael J. Spencer |
2:1df0b61d3b5a | 840 | * it means there're available data has been received. They should be read |
Michael J. Spencer |
2:1df0b61d3b5a | 841 | * out and released the Receive Data Buffer by updating the RxConsumeIndex value. |
Michael J. Spencer |
2:1df0b61d3b5a | 842 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 843 | Bool EMAC_CheckReceiveIndex(void) |
Michael J. Spencer |
2:1df0b61d3b5a | 844 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 845 | if (LPC_EMAC->RxConsumeIndex != LPC_EMAC->RxProduceIndex) { |
Michael J. Spencer |
2:1df0b61d3b5a | 846 | return TRUE; |
Michael J. Spencer |
2:1df0b61d3b5a | 847 | } else { |
Michael J. Spencer |
2:1df0b61d3b5a | 848 | return FALSE; |
Michael J. Spencer |
2:1df0b61d3b5a | 849 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 850 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 851 | |
Michael J. Spencer |
2:1df0b61d3b5a | 852 | |
Michael J. Spencer |
2:1df0b61d3b5a | 853 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 854 | * @brief Check whether if the current TxProduceIndex is not equal to the |
Michael J. Spencer |
2:1df0b61d3b5a | 855 | * current RxProduceIndex - 1. |
Michael J. Spencer |
2:1df0b61d3b5a | 856 | * @param[in] None |
Michael J. Spencer |
2:1df0b61d3b5a | 857 | * @return TRUE if they're not equal, otherwise return FALSE |
Michael J. Spencer |
2:1df0b61d3b5a | 858 | * |
Michael J. Spencer |
2:1df0b61d3b5a | 859 | * Note: In case the RxConsumeIndex is equal to the RxProduceIndex - 1, |
Michael J. Spencer |
2:1df0b61d3b5a | 860 | * it means the transmit buffer is available and data can be written to transmit |
Michael J. Spencer |
2:1df0b61d3b5a | 861 | * buffer to be sent. |
Michael J. Spencer |
2:1df0b61d3b5a | 862 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 863 | Bool EMAC_CheckTransmitIndex(void) |
Michael J. Spencer |
2:1df0b61d3b5a | 864 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 865 | uint32_t tmp = LPC_EMAC->TxConsumeIndex -1; |
Michael J. Spencer |
2:1df0b61d3b5a | 866 | if (LPC_EMAC->TxProduceIndex == tmp) { |
Michael J. Spencer |
2:1df0b61d3b5a | 867 | return FALSE; |
Michael J. Spencer |
2:1df0b61d3b5a | 868 | } else { |
Michael J. Spencer |
2:1df0b61d3b5a | 869 | return TRUE; |
Michael J. Spencer |
2:1df0b61d3b5a | 870 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 871 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 872 | |
Michael J. Spencer |
2:1df0b61d3b5a | 873 | |
Michael J. Spencer |
2:1df0b61d3b5a | 874 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 875 | * @brief Get current status value of receive data (due to RxConsumeIndex) |
Michael J. Spencer |
2:1df0b61d3b5a | 876 | * @param[in] ulRxStatType Received Status type, should be one of following: |
Michael J. Spencer |
2:1df0b61d3b5a | 877 | * - EMAC_RINFO_CTRL_FRAME: Control Frame |
Michael J. Spencer |
2:1df0b61d3b5a | 878 | * - EMAC_RINFO_VLAN: VLAN Frame |
Michael J. Spencer |
2:1df0b61d3b5a | 879 | * - EMAC_RINFO_FAIL_FILT: RX Filter Failed |
Michael J. Spencer |
2:1df0b61d3b5a | 880 | * - EMAC_RINFO_MCAST: Multicast Frame |
Michael J. Spencer |
2:1df0b61d3b5a | 881 | * - EMAC_RINFO_BCAST: Broadcast Frame |
Michael J. Spencer |
2:1df0b61d3b5a | 882 | * - EMAC_RINFO_CRC_ERR: CRC Error in Frame |
Michael J. Spencer |
2:1df0b61d3b5a | 883 | * - EMAC_RINFO_SYM_ERR: Symbol Error from PHY |
Michael J. Spencer |
2:1df0b61d3b5a | 884 | * - EMAC_RINFO_LEN_ERR: Length Error |
Michael J. Spencer |
2:1df0b61d3b5a | 885 | * - EMAC_RINFO_RANGE_ERR: Range error(exceeded max size) |
Michael J. Spencer |
2:1df0b61d3b5a | 886 | * - EMAC_RINFO_ALIGN_ERR: Alignment error |
Michael J. Spencer |
2:1df0b61d3b5a | 887 | * - EMAC_RINFO_OVERRUN: Receive overrun |
Michael J. Spencer |
2:1df0b61d3b5a | 888 | * - EMAC_RINFO_NO_DESCR: No new Descriptor available |
Michael J. Spencer |
2:1df0b61d3b5a | 889 | * - EMAC_RINFO_LAST_FLAG: last Fragment in Frame |
Michael J. Spencer |
2:1df0b61d3b5a | 890 | * - EMAC_RINFO_ERR: Error Occurred (OR of all error) |
Michael J. Spencer |
2:1df0b61d3b5a | 891 | * @return Current value of receive data (due to RxConsumeIndex) |
Michael J. Spencer |
2:1df0b61d3b5a | 892 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 893 | FlagStatus EMAC_CheckReceiveDataStatus(uint32_t ulRxStatType) |
Michael J. Spencer |
2:1df0b61d3b5a | 894 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 895 | uint32_t idx; |
Michael J. Spencer |
2:1df0b61d3b5a | 896 | idx = LPC_EMAC->RxConsumeIndex; |
Michael J. Spencer |
2:1df0b61d3b5a | 897 | return (((Rx_Stat[idx].Info) & ulRxStatType) ? SET : RESET); |
Michael J. Spencer |
2:1df0b61d3b5a | 898 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 899 | |
Michael J. Spencer |
2:1df0b61d3b5a | 900 | |
Michael J. Spencer |
2:1df0b61d3b5a | 901 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 902 | * @brief Get size of current Received data in received buffer (due to |
Michael J. Spencer |
2:1df0b61d3b5a | 903 | * RxConsumeIndex) |
Michael J. Spencer |
2:1df0b61d3b5a | 904 | * @param[in] None |
Michael J. Spencer |
2:1df0b61d3b5a | 905 | * @return Size of received data |
Michael J. Spencer |
2:1df0b61d3b5a | 906 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 907 | uint32_t EMAC_GetReceiveDataSize(void) |
Michael J. Spencer |
2:1df0b61d3b5a | 908 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 909 | uint32_t idx; |
Michael J. Spencer |
2:1df0b61d3b5a | 910 | idx =LPC_EMAC->RxConsumeIndex; |
Michael J. Spencer |
2:1df0b61d3b5a | 911 | return ((Rx_Stat[idx].Info) & EMAC_RINFO_SIZE); |
Michael J. Spencer |
2:1df0b61d3b5a | 912 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 913 | |
Michael J. Spencer |
2:1df0b61d3b5a | 914 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 915 | * @brief Increase the RxConsumeIndex (after reading the Receive buffer |
Michael J. Spencer |
2:1df0b61d3b5a | 916 | * to release the Receive buffer) and wrap-around the index if |
Michael J. Spencer |
2:1df0b61d3b5a | 917 | * it reaches the maximum Receive Number |
Michael J. Spencer |
2:1df0b61d3b5a | 918 | * @param[in] None |
Michael J. Spencer |
2:1df0b61d3b5a | 919 | * @return None |
Michael J. Spencer |
2:1df0b61d3b5a | 920 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 921 | void EMAC_UpdateRxConsumeIndex(void) |
Michael J. Spencer |
2:1df0b61d3b5a | 922 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 923 | // Get current Rx consume index |
Michael J. Spencer |
2:1df0b61d3b5a | 924 | uint32_t idx = LPC_EMAC->RxConsumeIndex; |
Michael J. Spencer |
2:1df0b61d3b5a | 925 | |
Michael J. Spencer |
2:1df0b61d3b5a | 926 | /* Release frame from EMAC buffer */ |
Michael J. Spencer |
2:1df0b61d3b5a | 927 | if (++idx == EMAC_NUM_RX_FRAG) idx = 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 928 | LPC_EMAC->RxConsumeIndex = idx; |
Michael J. Spencer |
2:1df0b61d3b5a | 929 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 930 | |
Michael J. Spencer |
2:1df0b61d3b5a | 931 | /*********************************************************************//** |
Michael J. Spencer |
2:1df0b61d3b5a | 932 | * @brief Increase the TxProduceIndex (after writting to the Transmit buffer |
Michael J. Spencer |
2:1df0b61d3b5a | 933 | * to enable the Transmit buffer) and wrap-around the index if |
Michael J. Spencer |
2:1df0b61d3b5a | 934 | * it reaches the maximum Transmit Number |
Michael J. Spencer |
2:1df0b61d3b5a | 935 | * @param[in] None |
Michael J. Spencer |
2:1df0b61d3b5a | 936 | * @return None |
Michael J. Spencer |
2:1df0b61d3b5a | 937 | **********************************************************************/ |
Michael J. Spencer |
2:1df0b61d3b5a | 938 | void EMAC_UpdateTxProduceIndex(void) |
Michael J. Spencer |
2:1df0b61d3b5a | 939 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 940 | // Get current Tx produce index |
Michael J. Spencer |
2:1df0b61d3b5a | 941 | uint32_t idx = LPC_EMAC->TxProduceIndex; |
Michael J. Spencer |
2:1df0b61d3b5a | 942 | |
Michael J. Spencer |
2:1df0b61d3b5a | 943 | /* Start frame transmission */ |
Michael J. Spencer |
2:1df0b61d3b5a | 944 | if (++idx == EMAC_NUM_TX_FRAG) idx = 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 945 | LPC_EMAC->TxProduceIndex = idx; |
Michael J. Spencer |
2:1df0b61d3b5a | 946 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 947 | |
Michael J. Spencer |
2:1df0b61d3b5a | 948 | |
Michael J. Spencer |
2:1df0b61d3b5a | 949 | /** |
Michael J. Spencer |
2:1df0b61d3b5a | 950 | * @} |
Michael J. Spencer |
2:1df0b61d3b5a | 951 | */ |
Michael J. Spencer |
2:1df0b61d3b5a | 952 | |
Michael J. Spencer |
2:1df0b61d3b5a | 953 | #endif /* _EMAC */ |
Michael J. Spencer |
2:1df0b61d3b5a | 954 | |
Michael J. Spencer |
2:1df0b61d3b5a | 955 | /** |
Michael J. Spencer |
2:1df0b61d3b5a | 956 | * @} |
Michael J. Spencer |
2:1df0b61d3b5a | 957 | */ |
Michael J. Spencer |
2:1df0b61d3b5a | 958 | |
Michael J. Spencer |
2:1df0b61d3b5a | 959 | /* --------------------------------- End Of File ------------------------------ */ |
Michael J. Spencer |
2:1df0b61d3b5a | 960 | #endif /* __LPC17XX__ */ |