S32 SDK
enet_driver.h
Go to the documentation of this file.
1 /*
2  * Copyright 2017 NXP
3  * All rights reserved.
4  *
5  * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
6  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
7  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
8  * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
9  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
10  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
11  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
12  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
13  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
14  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
15  * THE POSSIBILITY OF SUCH DAMAGE.
16  */
17 
18 #ifndef ENET_H
19 #define ENET_H
20 
21 #include "device_registers.h"
22 #include "status.h"
23 #include "osif.h"
24 #include <stdlib.h>
25 
35 /*******************************************************************************
36  * Definitions
37  ******************************************************************************/
38 
40 #define ENET_FRAME_MAX_FRAMELEN 1518U
41 
42 #define ENET_MIN_BUFFERSIZE 64U
43 
45 #define ENET_BUFF_ALIGN(x) (((uint32_t)(x) + (FEATURE_ENET_BUFF_ALIGNMENT - 1)) & ~(FEATURE_ENET_BUFF_ALIGNMENT - 1))
46 #define ENET_BUFF_IS_ALIGNED(x) (((uint32_t)(x) & ~(FEATURE_ENET_BUFF_ALIGNMENT - 1)) != 0)
47 
49 #define ENET_BUFFDESCR_ALIGN(x) (((uint32_t)(x) + (FEATURE_ENET_BUFFDESCR_ALIGNMENT - 1)) & ~(FEATURE_ENET_BUFFDESCR_ALIGNMENT - 1))
50 #define ENET_BUFFDESCR_IS_ALIGNED(x) (((uint32_t)(x) & ~(FEATURE_ENET_BUFFDESCR_ALIGNMENT - 1)) != 0)
51 
56 typedef enum
57 {
61 
66 typedef enum
67 {
71 
76 typedef enum
77 {
81 
86 typedef enum
87 {
97 
102 typedef enum
103 {
107 
112 typedef enum
113 {
130 #if FEATURE_ENET_HAS_AVB
131  ENET_RX_FLUSH_2_INTERRUPT = ENET_EIR_RXFLUSH_2_MASK,
132  ENET_RX_FLUSH_1_INTERRUPT = ENET_EIR_RXFLUSH_1_MASK,
133  ENET_RX_FLUSH_0_INTERRUPT = ENET_EIR_RXFLUSH_0_MASK,
134  ENET_TX_FRAME_1_INTERRUPT = ENET_EIR_TXF1_MASK,
135  ENET_TX_BUFFER_1_INTERRUPT = ENET_EIR_TXB1_MASK,
136  ENET_RX_FRAME_1_INTERRUPT = ENET_EIR_RXF1_MASK,
137  ENET_RX_BUFFER_1_INTERRUPT = ENET_EIR_RXB1_MASK,
138  ENET_TX_FRAME_2_INTERRUPT = ENET_EIR_TXF2_MASK,
139  ENET_TX_BUFFER_2_INTERRUPT = ENET_EIR_TXB2_MASK,
140  ENET_RX_FRAME_2_INTERRUPT = ENET_EIR_RXF2_MASK,
141  ENET_RX_BUFFER_2_INTERRUPT = ENET_EIR_RXB2_MASK,
142 #endif /* FEATURE_ENET_HAS_AVB */
143 #if FEATURE_ENET_HAS_RECEIVE_PARSER
144  ENET_PARSERERR_INTERRUPT = ENET_EIR_PARSERR_MASK,
145  ENET_PARSRF_INTERRUPT = ENET_EIR_PARSRF_MASK,
146 #endif /* FEATURE_ENET_HAS_RECEIVE_PARSER */
148 
153 typedef enum
154 {
159 
164 typedef enum
165 {
172 
177 typedef struct
178 {
179  uint8_t *data;
180  uint16_t length;
181 } enet_buffer_t;
182 
187 #if (defined(CORE_BIG_ENDIAN))
188 typedef struct
189 {
190  uint16_t control;
191  uint16_t length;
192  uint8_t *buffer;
193 } enet_buffer_descriptor_t;
194 #elif (defined(CORE_LITTLE_ENDIAN))
195 typedef struct
196 {
197  uint16_t length;
198  uint16_t control;
199  uint8_t *buffer;
200 } enet_buffer_descriptor_t;
201 #else
202  #error "Endianness not defined!"
203 #endif
204 
209 typedef enum
210 {
215 } enet_event_t;
216 
221 typedef void (*enet_callback_t)(uint8_t instance, enet_event_t event);
222 
227 typedef struct
228 {
229  uint16_t rxRingSize;
230  uint16_t txRingSize;
231  enet_buffer_descriptor_t *rxRingAligned;
232  enet_buffer_descriptor_t *txRingAligned;
233  uint8_t *rxBufferAligned;
235 
240 typedef struct
241 {
242  /* Accelerator configuration */
243  uint8_t rxAccelerConfig;
244  uint8_t txAccelerConfig;
245  /* Basic configuration */
246  uint16_t maxFrameLen;
247  uint32_t interrupt;
248  /* MII configuration */
252  /* Receive and transmit special configurations */
253  uint32_t rxConfig;
254  uint32_t txConfig;
255  /* Callback function */
257 } enet_config_t;
258 
263 typedef struct
264 {
265  enet_buffer_descriptor_t *rxBdBase;
266  enet_buffer_descriptor_t *rxBdCurrent;
267  enet_buffer_descriptor_t *rxBdAlloc;
268  enet_buffer_descriptor_t *txBdBase;
269  enet_buffer_descriptor_t *txBdCurrent;
271 } enet_state_t;
272 
277 typedef enum
278 {
334 
335 /*******************************************************************************
336  * API
337  ******************************************************************************/
338 
339 #if defined(__cplusplus)
340 extern "C" {
341 #endif
342 
362 
376 void ENET_DRV_Init(uint8_t instance,
377  enet_state_t *state,
378  const enet_config_t *config,
379  const enet_buffer_config_t *bufferConfig,
380  uint8_t *macAddr);
381 
389 void ENET_DRV_Deinit(uint8_t instance);
390 
417 status_t ENET_DRV_ReadFrame(uint8_t instance,
418  enet_buffer_t * buff);
419 
454 void ENET_DRV_ProvideRxBuff(uint8_t instance,
455  enet_buffer_t * buff);
456 
475 status_t ENET_DRV_SendFrame(uint8_t instance,
476  enet_buffer_t * buff);
477 
488 status_t ENET_DRV_GetTransmitStatus(uint8_t instance,
489  enet_buffer_t * buff);
490 
504 void ENET_DRV_EnableMDIO(uint8_t instance,
505  bool miiPreambleDisabled);
506 
516 status_t ENET_DRV_MDIORead(uint8_t instance,
517  uint8_t phyAddr,
518  uint8_t phyReg,
519  uint16_t *data,
520  uint32_t timeoutMs);
521 
531 status_t ENET_DRV_MDIOWrite(uint8_t instance,
532  uint8_t phyAddr,
533  uint8_t phyReg,
534  uint16_t data,
535  uint32_t timeoutMs);
536 
550 void ENET_DRV_SetMacAddr(uint8_t instance,
551  uint8_t *macAddr);
552 
559 void ENET_DRV_GetMacAddr(uint8_t instance,
560  uint8_t *macAddr);
561 
572 void ENET_DRV_SetUnicastForward(uint8_t instance,
573  uint8_t *macAddr,
574  bool enable);
575 
586 void ENET_DRV_SetMulticastForward(uint8_t instance,
587  uint8_t *macAddr,
588  bool enable);
589 
598 void ENET_DRV_SetMulticastForwardAll(uint8_t instance,
599  bool enable);
600 
614 void ENET_DRV_SetSleepMode(uint8_t instance,
615  bool enable);
616 
625 void ENET_DRV_ConfigCounters(uint8_t instance,
626  bool enable);
627 
635 uint32_t ENET_DRV_GetCounter(uint8_t instance,
636  enet_counter_t counter);
637 
640 #if defined(__cplusplus)
641 }
642 #endif
643 
646 #endif /* ENET_H */
647 
648 
649 /*******************************************************************************
650  * EOF
651  ******************************************************************************/
652 
#define ENET_EIR_BABR_MASK
Definition: S32K148.h:3466
void ENET_DRV_GetMacAddr(uint8_t instance, uint8_t *macAddr)
Gets the physical address of the MAC.
Definition: enet_driver.c:589
#define ENET_EIR_GRA_MASK
Definition: S32K148.h:3458
Internal driver state structure Implements : enet_state_t_Class.
Definition: enet_driver.h:263
enet_event_t
Send/Receive internal buffer descriptor Implements : enet_buffer_descriptor_t_Class.
Definition: enet_driver.h:209
enet_mii_mode_t
Media Independent Interface mode selection Implements : enet_mii_mode_t_Class.
Definition: enet_driver.h:56
void ENET_DRV_SetUnicastForward(uint8_t instance, uint8_t *macAddr, bool enable)
Enables/Disables forwarding of unicast traffic having a specific MAC address as destination.
Definition: enet_driver.c:621
Send/Receive buffer information for the user Implements : enet_buffer_t_Class.
Definition: enet_driver.h:177
#define ENET_EIR_RXF_MASK
Definition: S32K148.h:3446
void ENET_DRV_GetDefaultConfig(enet_config_t *config)
Gets the default configuration structure.
Definition: enet_driver.c:113
void ENET_DRV_ConfigCounters(uint8_t instance, bool enable)
Enables/Disables the MIB counters.
Definition: enet_driver.c:737
uint16_t maxFrameLen
Definition: enet_driver.h:246
status_t ENET_DRV_GetTransmitStatus(uint8_t instance, enet_buffer_t *buff)
Checks if the transmission of a buffer is complete.
Definition: enet_driver.c:358
#define ENET_TACC_IPCHK_MASK
Definition: S32K148.h:3836
#define ENET_EIR_UN_MASK
Definition: S32K148.h:3422
#define ENET_EIR_RL_MASK
Definition: S32K148.h:3426
#define ENET_EIR_LC_MASK
Definition: S32K148.h:3430
Defines the ENET module configuration structure Implements : enet_config_t_Class. ...
Definition: enet_driver.h:240
#define ENET_EIR_PLR_MASK
Definition: S32K148.h:3418
#define ENET_EIR_TXF_MASK
Definition: S32K148.h:3454
enet_callback_t callback
Definition: enet_driver.h:256
#define ENET_EIR_BABT_MASK
Definition: S32K148.h:3462
enet_rx_special_config_t
Special receive control configurations Implements : enet_rx_special_config_t_Class.
Definition: enet_driver.h:86
enet_rx_accelerator_t
Receive accelerator configurations Implements : enet_rx_accelerator_t_Class.
Definition: enet_driver.h:164
#define ENET_EIR_TS_TIMER_MASK
Definition: S32K148.h:3406
void ENET_DRV_EnableMDIO(uint8_t instance, bool miiPreambleDisabled)
Enables the MDIO interface.
Definition: enet_driver.c:444
#define ENET_RACC_LINEDIS_MASK
Definition: S32K148.h:3857
uint32_t rxConfig
Definition: enet_driver.h:253
void ENET_DRV_Deinit(uint8_t instance)
Deinitializes the ENET module.
Definition: enet_driver.c:225
enet_buffer_descriptor_t * rxBdCurrent
Definition: enet_driver.h:266
void ENET_DRV_ProvideRxBuff(uint8_t instance, enet_buffer_t *buff)
Provides a receive buffer to be used by the driver for reception.
Definition: enet_driver.c:400
enet_buffer_descriptor_t * rxBdAlloc
Definition: enet_driver.h:267
#define ENET_EIR_MII_MASK
Definition: S32K148.h:3438
void ENET_DRV_SetMacAddr(uint8_t instance, uint8_t *macAddr)
Configures the physical address of the MAC.
Definition: enet_driver.c:558
enet_mii_speed_t
Media Independent Interface speed selection Implements : enet_mii_speed_t_Class.
Definition: enet_driver.h:66
#define ENET_RACC_PRODIS_MASK
Definition: S32K148.h:3853
enet_counter_t
Statistics counters enumeration Implements : enet_counter_t_Class.
Definition: enet_driver.h:277
void ENET_DRV_SetMulticastForwardAll(uint8_t instance, bool enable)
Enables/Disables forwarding of the multicast traffic, irrespective of the destination MAC address...
Definition: enet_driver.c:683
status_t ENET_DRV_MDIOWrite(uint8_t instance, uint8_t phyAddr, uint8_t phyReg, uint16_t data, uint32_t timeoutMs)
Writes the selected register of the PHY.
Definition: enet_driver.c:473
#define ENET_TACC_SHIFT16_MASK
Definition: S32K148.h:3832
enet_callback_t callback
Definition: enet_driver.h:270
enet_mii_mode_t miiMode
Definition: enet_driver.h:249
#define ENET_EIR_TS_AVAIL_MASK
Definition: S32K148.h:3410
enet_mii_duplex_t miiDuplex
Definition: enet_driver.h:251
uint32_t interrupt
Definition: enet_driver.h:247
#define ENET_RACC_SHIFT16_MASK
Definition: S32K148.h:3861
Defines the ENET buffer descriptors ring configuration structure Implements : enet_buffer_config_t_Cl...
Definition: enet_driver.h:227
status_t
Status return codes. Common error codes will be a unified enumeration (C enum) that will contain all ...
Definition: status.h:44
uint8_t rxAccelerConfig
Definition: enet_driver.h:243
status_t ENET_DRV_SendFrame(uint8_t instance, enet_buffer_t *buff)
Sends an Ethernet frame.
Definition: enet_driver.c:306
#define ENET_EIR_TXB_MASK
Definition: S32K148.h:3450
enet_buffer_descriptor_t * rxRingAligned
Definition: enet_driver.h:231
enet_buffer_descriptor_t * txBdBase
Definition: enet_driver.h:268
enet_mii_speed_t miiSpeed
Definition: enet_driver.h:250
uint8_t * rxBufferAligned
Definition: enet_driver.h:233
enet_interrupt_enable_t
Interrupt sources Implements : enet_interrupt_enable_t_Class.
Definition: enet_driver.h:112
#define ENET_EIR_WAKEUP_MASK
Definition: S32K148.h:3414
enet_buffer_descriptor_t * txRingAligned
Definition: enet_driver.h:232
enet_buffer_descriptor_t * rxBdBase
Definition: enet_driver.h:265
#define ENET_TACC_PROCHK_MASK
Definition: S32K148.h:3840
void ENET_DRV_SetMulticastForward(uint8_t instance, uint8_t *macAddr, bool enable)
Enables/Disables forwarding of multicast traffic having a specific MAC address as destination...
Definition: enet_driver.c:652
enet_buffer_descriptor_t * txBdCurrent
Definition: enet_driver.h:269
#define ENET_EIR_EBERR_MASK
Definition: S32K148.h:3434
void(* enet_callback_t)(uint8_t instance, enet_event_t event)
Callback function invoked when one of the events in "enet_event_t" is encountered Implements : enet_c...
Definition: enet_driver.h:221
uint8_t txAccelerConfig
Definition: enet_driver.h:244
enet_tx_special_config_t
Special transmit control configurations Implements : enet_tx_special_config_t_Class.
Definition: enet_driver.h:102
uint32_t ENET_DRV_GetCounter(uint8_t instance, enet_counter_t counter)
Gets statistics from the specified counter.
Definition: enet_driver.c:768
#define ENET_EIR_RXB_MASK
Definition: S32K148.h:3442
enet_mii_duplex_t
Media Independent Interface full-/half-duplex selection Implements : enet_mii_duplex_t_Class.
Definition: enet_driver.h:76
enet_tx_accelerator_t
Transmit accelerator configurations Implements : enet_tx_accelerator_t_Class.
Definition: enet_driver.h:153
#define ENET_RACC_PADREM_MASK
Definition: S32K148.h:3845
uint8_t * data
Definition: enet_driver.h:179
void ENET_DRV_SetSleepMode(uint8_t instance, bool enable)
Sets the MAC in sleep mode or normal mode.
Definition: enet_driver.c:711
uint16_t length
Definition: enet_driver.h:180
#define ENET_RACC_IPDIS_MASK
Definition: S32K148.h:3849
status_t ENET_DRV_ReadFrame(uint8_t instance, enet_buffer_t *buff)
Reads a received Ethernet frame.
Definition: enet_driver.c:261
status_t ENET_DRV_MDIORead(uint8_t instance, uint8_t phyAddr, uint8_t phyReg, uint16_t *data, uint32_t timeoutMs)
Reads the selected register of the PHY.
Definition: enet_driver.c:515
uint32_t txConfig
Definition: enet_driver.h:254
void ENET_DRV_Init(uint8_t instance, enet_state_t *state, const enet_config_t *config, const enet_buffer_config_t *bufferConfig, uint8_t *macAddr)
Initializes the ENET module.
Definition: enet_driver.c:147