1 /*
2 * Copyright (c) 2013-2016 ARM Limited. All rights reserved.
3 * Copyright (c) 2016, Freescale Semiconductor, Inc. Not a Contribution.
4 * Copyright 2016-2021, 2023 NXP. Not a Contribution.
5 *
6 * SPDX-License-Identifier: Apache-2.0
7 *
8 * Licensed under the Apache License, Version 2.0 (the License); you may
9 * not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
16 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 */
20
21 #include "fsl_enet_cmsis.h"
22
23 /* Component ID definition, used by tools. */
24 #ifndef FSL_COMPONENT_ID
25 #define FSL_COMPONENT_ID "platform.drivers.enet_cmsis"
26 #endif
27
28 #define ARM_ETH_MAC_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 3)
29
30 /* Define the alignment macro. */
31 #if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL
32 #if defined(FSL_FEATURE_L2CACHE_LINESIZE_BYTE) && \
33 ((!defined(FSL_SDK_DISBLE_L2CACHE_PRESENT)) || (FSL_SDK_DISBLE_L2CACHE_PRESENT == 0))
34 #define CMSIS_CACHE_LINESIZE_MAX MAX(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE, FSL_FEATURE_L2CACHE_LINESIZE_BYTE)
35 #define CMSIS_ENET_BUFF_ALIGNMENT MAX(ENET_BUFF_ALIGNMENT, CMSIS_CACHE_LINESIZE_MAX)
36 #elif defined(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE)
37 #define CMSIS_ENET_BUFF_ALIGNMENT MAX(ENET_BUFF_ALIGNMENT, FSL_FEATURE_L1DCACHE_LINESIZE_BYTE)
38 #endif
39 #else
40 #define CMSIS_ENET_BUFF_ALIGNMENT ENET_BUFF_ALIGNMENT
41 #endif
42 /* Define the ENET buffer information. */
43 #define ENET_RXBD_NUM (4)
44 #define ENET_TXBD_NUM (4)
45 #define ENET_RXBUFF_SIZE (ENET_FRAME_MAX_FRAMELEN)
46 #define ENET_TXBUFF_SIZE (ENET_FRAME_MAX_FRAMELEN)
47 /* Define the timeout macro. */
48 #define ENET_SMI_TIMEOUT_COUNT 0xffff
49
50 typedef struct _cmsis_enet_mac_driver_state
51 {
52 cmsis_enet_mac_resource_t *resource; /*!< Basic enet resource. */
53 enet_handle_t *handle; /*!< ENET handler. */
54 enet_buffer_config_t *buffers; /*!< Buffers res*/
55 ARM_ETH_MAC_SignalEvent_t cb_event; /*!< Callback function. */
56 volatile enet_tx_bd_struct_t *txBdTs; /*!< Tx timestamp index. */
57 uint8_t flags; /*!< Control and state flags. */
58 } cmsis_enet_mac_driver_state_t;
59
60 static const ARM_DRIVER_VERSION s_enetDriverVersion = {ARM_ETH_MAC_API_VERSION, ARM_ETH_MAC_DRV_VERSION};
61
62 /* Driver Capabilities */
63 static const ARM_ETH_MAC_CAPABILITIES s_enetDriverCapabilities = {
64 0, /* checksum_offload_rx_ip4 */
65 0, /* checksum_offload_rx_ip6 */
66 0, /* checksum_offload_rx_udp */
67 0, /* checksum_offload_rx_tcp */
68 0, /* checksum_offload_rx_icmp */
69 0, /* checksum_offload_tx_ip4 */
70 0, /* checksum_offload_tx_ip6 */
71 0, /* checksum_offload_tx_udp */
72 0, /* checksum_offload_tx_tcp */
73 0, /* checksum_offload_tx_icmp */
74 (RTE_ENET_RMII) ? ARM_ETH_INTERFACE_RMII : ARM_ETH_INTERFACE_MII, /* media_interface */
75 0, /* mac_address */
76 1, /* event_rx_frame */
77 1, /* event_tx_frame */
78 1, /* event_wakeup */
79 0 /* precision_timer */
80 };
81
ENETx_GetVersion(void)82 static ARM_DRIVER_VERSION ENETx_GetVersion(void)
83 {
84 return s_enetDriverVersion;
85 }
86
ENETx_GetCapabilities(void)87 static ARM_ETH_MAC_CAPABILITIES ENETx_GetCapabilities(void)
88 {
89 return s_enetDriverCapabilities;
90 }
91
ENET_CommonInitialize(ARM_ETH_MAC_SignalEvent_t cb_event,cmsis_enet_mac_driver_state_t * enet)92 static int32_t ENET_CommonInitialize(ARM_ETH_MAC_SignalEvent_t cb_event, cmsis_enet_mac_driver_state_t *enet)
93 {
94 if ((enet->flags & ENET_FLAG_INIT) == 0U)
95 {
96 enet->cb_event = cb_event;
97 enet->flags = ENET_FLAG_INIT;
98 }
99
100 return ARM_DRIVER_OK;
101 }
102
ENET_SetInterruptCallback(ENET_Type * base,enet_handle_t * handle,uint32_t ringId,enet_event_t event,enet_frame_info_t * frameInfo,void * userData)103 static void ENET_SetInterruptCallback(ENET_Type *base,
104 enet_handle_t *handle,
105 #if FSL_FEATURE_ENET_QUEUE > 1
106 uint32_t ringId,
107 #endif
108 enet_event_t event,
109 enet_frame_info_t *frameInfo,
110 void *userData)
111 {
112 uint32_t newEvent;
113
114 switch (event)
115 {
116 case kENET_RxEvent:
117 newEvent = ARM_ETH_MAC_EVENT_RX_FRAME;
118 break;
119 case kENET_TxEvent:
120 newEvent = ARM_ETH_MAC_EVENT_TX_FRAME;
121 break;
122 case kENET_WakeUpEvent:
123 newEvent = ARM_ETH_MAC_EVENT_WAKEUP;
124 break;
125 case kENET_TimeStampEvent:
126 newEvent = ARM_ETH_MAC_EVENT_TIMER_ALARM;
127 break;
128 default:
129 newEvent = ETH_MAC_EVENT_OTHERS;
130 break;
131 }
132
133 /* User data is actually CMSIS driver callback. */
134 if (userData != NULL)
135 {
136 ((ARM_ETH_MAC_SignalEvent_t)userData)(newEvent);
137 }
138 }
139
ENET_CommonUninitialize(cmsis_enet_mac_driver_state_t * enet)140 static int32_t ENET_CommonUninitialize(cmsis_enet_mac_driver_state_t *enet)
141 {
142 enet->flags = ENET_FLAG_UNINIT;
143 return ARM_DRIVER_OK;
144 }
145
ENET_CommonControl(uint32_t control,uint32_t arg,cmsis_enet_mac_driver_state_t * enet)146 static int32_t ENET_CommonControl(uint32_t control, uint32_t arg, cmsis_enet_mac_driver_state_t *enet)
147 {
148 int32_t result = ARM_DRIVER_OK;
149
150 if (enet->flags == ENET_FLAG_UNINIT)
151 {
152 return ARM_DRIVER_ERROR;
153 }
154
155 switch (control)
156 {
157 case (uint32_t)ARM_ETH_MAC_CONFIGURE:
158 {
159 uint32_t rcr = enet->resource->base->RCR;
160 uint32_t tcr = enet->resource->base->TCR;
161 #if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB
162 uint32_t ecr = enet->resource->base->ECR;
163 if (FSL_FEATURE_ENET_INSTANCE_HAS_AVBn(enet->resource->base) > 0)
164 {
165 ecr &= ~ENET_ECR_SPEED_MASK;
166 }
167 #endif /* FSL_FEATURE_ENET_HAS_AVB */
168
169 switch (arg & (uint32_t)ARM_ETH_MAC_SPEED_Msk)
170 {
171 case (uint32_t)ARM_ETH_MAC_SPEED_10M:
172 rcr |= ENET_RCR_RMII_10T_MASK;
173 break;
174 case (uint32_t)ARM_ETH_MAC_SPEED_100M:
175 rcr &= ~ENET_RCR_RMII_10T_MASK;
176 break;
177 #if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB
178 case (uint32_t)ARM_ETH_MAC_SPEED_1G:
179 /* If the selected enet doesn't support 1G, return unsupported status */
180 if (FSL_FEATURE_ENET_INSTANCE_HAS_AVBn(enet->resource->base) > 0)
181 {
182 ecr |= ENET_ECR_SPEED_MASK;
183 rcr &= ~ENET_RCR_RMII_10T_MASK;
184 }
185 else
186 {
187 result = ARM_DRIVER_ERROR_UNSUPPORTED;
188 }
189 break;
190 #endif /* FSL_FEATURE_ENET_HAS_AVB */
191 default:
192 result = ARM_DRIVER_ERROR_UNSUPPORTED;
193 break;
194 }
195 if (result != ARM_DRIVER_OK)
196 {
197 return result;
198 }
199 switch (arg & ARM_ETH_MAC_DUPLEX_Msk)
200 {
201 case (uint32_t)ARM_ETH_MAC_DUPLEX_HALF:
202 rcr |= ENET_RCR_DRT_MASK;
203 tcr &= ~ENET_TCR_FDEN_MASK;
204 break;
205 case (uint32_t)ARM_ETH_MAC_DUPLEX_FULL:
206 rcr &= ~ENET_RCR_DRT_MASK;
207 tcr |= ENET_TCR_FDEN_MASK;
208 break;
209 default:
210 result = ARM_DRIVER_ERROR_UNSUPPORTED;
211 break;
212 }
213 if (result != ARM_DRIVER_OK)
214 {
215 return result;
216 }
217
218 if ((arg & (ARM_ETH_MAC_CHECKSUM_OFFLOAD_RX | ARM_ETH_MAC_CHECKSUM_OFFLOAD_TX)) != 0U)
219 {
220 return ARM_DRIVER_ERROR_UNSUPPORTED;
221 }
222
223 if ((arg & ARM_ETH_MAC_ADDRESS_BROADCAST) != 0U)
224 {
225 rcr &= ~ENET_RCR_BC_REJ_MASK;
226 }
227 else
228 {
229 rcr |= ENET_RCR_BC_REJ_MASK;
230 }
231
232 if ((arg & ARM_ETH_MAC_ADDRESS_MULTICAST) != 0U)
233 {
234 return ARM_DRIVER_ERROR_UNSUPPORTED;
235 }
236
237 if ((arg & ARM_ETH_MAC_ADDRESS_ALL) != 0U)
238 {
239 rcr |= ENET_RCR_PROM_MASK;
240 }
241
242 if ((arg & ARM_ETH_MAC_LOOPBACK) != 0U)
243 {
244 /* Loop back only supported on MII mode. */
245 if ((rcr & ENET_RCR_RMII_MODE_MASK) == 0U)
246 {
247 rcr |= ENET_RCR_LOOP_MASK;
248 rcr &= ~ENET_RCR_DRT_MASK;
249 }
250 }
251
252 enet->resource->base->RCR = rcr;
253 enet->resource->base->TCR = tcr;
254 #if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB
255 if (FSL_FEATURE_ENET_INSTANCE_HAS_AVBn(enet->resource->base) > 0)
256 {
257 enet->resource->base->ECR = ecr;
258 }
259 #endif /* FSL_FEATURE_ENET_HAS_AVB */
260 }
261 break;
262 case (uint32_t)ARM_ETH_MAC_CONTROL_TX:
263 if (arg != 0U)
264 {
265 enet->resource->base->TDAR = ENET_TDAR_TDAR_MASK;
266 }
267 else
268 {
269 enet->resource->base->TDAR &= ~ENET_TDAR_TDAR_MASK;
270 }
271 break;
272 case (uint32_t)ARM_ETH_MAC_CONTROL_RX:
273 if (arg != 0U)
274 {
275 ENET_ActiveRead(enet->resource->base);
276 }
277 else
278 {
279 enet->resource->base->RDAR &= ~ENET_RDAR_RDAR_MASK;
280 }
281 break;
282 case (uint32_t)ARM_ETH_MAC_SLEEP:
283 ENET_EnableSleepMode(enet->resource->base, (bool)arg);
284 break;
285 default:
286 result = ARM_DRIVER_ERROR_UNSUPPORTED;
287 break;
288 }
289 return result;
290 }
291
ENET_CommonPowerControl(ARM_POWER_STATE state,cmsis_enet_mac_driver_state_t * enet)292 static int32_t ENET_CommonPowerControl(ARM_POWER_STATE state, cmsis_enet_mac_driver_state_t *enet)
293 {
294 int32_t result = ARM_DRIVER_OK;
295 ARM_ETH_MAC_CAPABILITIES capabilities;
296
297 switch (state)
298 {
299 case ARM_POWER_OFF:
300 if ((enet->flags & ENET_FLAG_POWER) != 0U)
301 {
302 (void)ENET_CommonControl(ARM_ETH_MAC_CONTROL_TX, 0, enet);
303 (void)ENET_CommonControl(ARM_ETH_MAC_CONTROL_RX, 0, enet);
304 ENET_Reset(enet->resource->base);
305 ENET_Deinit(enet->resource->base);
306
307 enet->flags = ENET_FLAG_INIT;
308 }
309 break;
310 case ARM_POWER_LOW:
311 result = ARM_DRIVER_ERROR_UNSUPPORTED;
312 break;
313 case ARM_POWER_FULL:
314 {
315 if (enet->flags == ENET_FLAG_UNINIT)
316 {
317 return ARM_DRIVER_ERROR;
318 }
319
320 if ((enet->flags & ENET_FLAG_POWER) != 0U)
321 {
322 /* Driver already powered */
323 break;
324 }
325
326 enet_config_t config;
327 uint8_t macAddr[6] = {0};
328 uint32_t freq;
329
330 /* Get default configuration. */
331 ENET_GetDefaultConfig(&config);
332 /* Change the MII interface mode according to the MII interface macro. */
333 capabilities = ENETx_GetCapabilities();
334 if (capabilities.media_interface == (uint32_t)ARM_ETH_INTERFACE_MII)
335 {
336 config.miiMode = kENET_MiiMode;
337 }
338 else if (capabilities.media_interface == (uint32_t)ARM_ETH_INTERFACE_RMII)
339 {
340 #if defined(RTE_ENET_RGMII) && RTE_ENET_RGMII
341 #if defined(FSL_FEATURE_ENET_HAS_AVB) && FSL_FEATURE_ENET_HAS_AVB
342 if (FSL_FEATURE_ENET_INSTANCE_HAS_AVBn(enet->resource->base) > 0)
343 {
344 config.miiMode = kENET_RgmiiMode;
345 }
346 else
347 {
348 result = ARM_DRIVER_ERROR_UNSUPPORTED;
349 break;
350 }
351 #endif /* FSL_FEATURE_ENET_HAS_AVB */
352 #else
353 config.miiMode = kENET_RmiiMode;
354 #endif /* RTE_ENET_RGMII */
355 }
356 else
357 {
358 /* Intentional empty */
359 }
360
361 /* Enable the tx/rx interrupt mode. */
362 config.interrupt = (uint32_t)kENET_TxFrameInterrupt | (uint32_t)kENET_TxBufferInterrupt |
363 (uint32_t)kENET_RxFrameInterrupt | (uint32_t)kENET_TxBufferInterrupt;
364 /* Enable tx accelerate function. */
365 config.txAccelerConfig = (uint8_t)kENET_TxAccelIpCheckEnabled | (uint8_t)kENET_TxAccelProtoCheckEnabled;
366 /* Callback setup */
367 config.callback = ENET_SetInterruptCallback;
368 config.userData = (void *)enet->cb_event;
369 /* Initialize Ethernet Mac. */
370 freq = enet->resource->GetFreq();
371 (void)ENET_Init(enet->resource->base, enet->handle, &config, enet->buffers, &macAddr[0], freq);
372 enet->flags |= ENET_FLAG_POWER;
373 break;
374 }
375 default:
376 result = ARM_DRIVER_ERROR_UNSUPPORTED;
377 break;
378 }
379 return result;
380 }
381
ENET_Phy_Write(cmsis_enet_mac_resource_t * enet,uint8_t phy_addr,uint8_t reg_addr,uint16_t data)382 static int32_t ENET_Phy_Write(cmsis_enet_mac_resource_t *enet, uint8_t phy_addr, uint8_t reg_addr, uint16_t data)
383 {
384 uint32_t counter;
385
386 /* Clear the SMI interrupt event. */
387 ENET_ClearInterruptStatus(enet->base, ENET_EIR_MII_MASK);
388
389 /* Starts a SMI write command. */
390 ENET_StartSMIWrite(enet->base, phy_addr, reg_addr, kENET_MiiWriteValidFrame, data);
391
392 /* Wait for SMI complete. */
393 for (counter = ENET_SMI_TIMEOUT_COUNT; counter > 0U; counter--)
394 {
395 if ((ENET_GetInterruptStatus(enet->base) & ENET_EIR_MII_MASK) != 0U)
396 {
397 break;
398 }
399 }
400
401 /* Check for timeout. */
402 if (counter == 0U)
403 {
404 return ARM_DRIVER_ERROR;
405 }
406
407 /* Clear MII interrupt event. */
408 ENET_ClearInterruptStatus(enet->base, ENET_EIR_MII_MASK);
409
410 return ARM_DRIVER_OK;
411 }
412
ENET_Phy_Read(cmsis_enet_mac_resource_t * enet,uint8_t phy_addr,uint8_t reg_addr,uint16_t * data)413 static int32_t ENET_Phy_Read(cmsis_enet_mac_resource_t *enet, uint8_t phy_addr, uint8_t reg_addr, uint16_t *data)
414 {
415 assert(data);
416
417 uint32_t counter;
418
419 /* Clear the MII interrupt event. */
420 ENET_ClearInterruptStatus(enet->base, ENET_EIR_MII_MASK);
421
422 /* Starts a SMI read command operation. */
423 ENET_StartSMIRead(enet->base, phy_addr, reg_addr, kENET_MiiReadValidFrame);
424
425 /* Wait for MII complete. */
426 for (counter = ENET_SMI_TIMEOUT_COUNT; counter > 0U; counter--)
427 {
428 if ((ENET_GetInterruptStatus(enet->base) & ENET_EIR_MII_MASK) != 0U)
429 {
430 break;
431 }
432 }
433
434 /* Check for timeout. */
435 if (counter == 0U)
436 {
437 return ARM_DRIVER_ERROR;
438 }
439
440 /* Get data from MII register. */
441 *data = (uint16_t)ENET_ReadSMIData(enet->base);
442
443 /* Clear MII interrupt event. */
444 ENET_ClearInterruptStatus(enet->base, ENET_EIR_MII_MASK);
445
446 return ARM_DRIVER_OK;
447 }
448
ENET_CommonSendFrame(cmsis_enet_mac_driver_state_t * enet,const uint8_t * frame,uint32_t len,uint32_t flags)449 static int32_t ENET_CommonSendFrame(cmsis_enet_mac_driver_state_t *enet,
450 const uint8_t *frame,
451 uint32_t len,
452 uint32_t flags)
453 {
454 status_t status;
455
456 /* The SDK send frame driver is send with a whole frame and
457 * the timestamp will be enabled automatically when it is a PTP frame
458 * by parse the frame.
459 */
460 if ((flags & (ARM_ETH_MAC_TX_FRAME_FRAGMENT | ARM_ETH_MAC_TX_FRAME_TIMESTAMP)) != 0U)
461 {
462 return ARM_DRIVER_ERROR;
463 }
464
465 status = ENET_SendFrame(enet->resource->base, enet->handle, frame, len, 0, false, NULL);
466 if (status == kStatus_ENET_TxFrameOverLen)
467 {
468 return ARM_DRIVER_ERROR_PARAMETER;
469 }
470 else if (status == kStatus_ENET_TxFrameBusy)
471 {
472 return ARM_DRIVER_ERROR_BUSY;
473 }
474 else if (status == kStatus_ENET_TxFrameFail)
475 {
476 return ARM_DRIVER_ERROR;
477 }
478 else
479 {
480 return ARM_DRIVER_OK;
481 }
482 }
483
ENET_CommonGetFrameSize(cmsis_enet_mac_driver_state_t * enet)484 static uint32_t ENET_CommonGetFrameSize(cmsis_enet_mac_driver_state_t *enet)
485 {
486 status_t status;
487 uint32_t length = 0;
488
489 status = ENET_GetRxFrameSize(enet->handle, &length, 0);
490 if (status == kStatus_ENET_RxFrameError)
491 {
492 /* Should update the buffers. */
493 (void)ENET_ReadFrame(enet->resource->base, enet->handle, NULL, 0, 0, NULL);
494 }
495 return length;
496 }
497
ENET_CommonReadFrame(cmsis_enet_mac_driver_state_t * enet,uint8_t * frame,uint32_t len)498 static int32_t ENET_CommonReadFrame(cmsis_enet_mac_driver_state_t *enet, uint8_t *frame, uint32_t len)
499 {
500 status_t status;
501
502 status = ENET_ReadFrame(enet->resource->base, enet->handle, frame, len, 0, NULL);
503 if (status != kStatus_Success)
504 {
505 return ARM_DRIVER_ERROR;
506 }
507
508 return (int32_t)len;
509 }
510
511 #if RTE_ENET
512
513 /*! @brief Buffer descriptors should be in non-cacheable region and should be align to "ENET_BUFF_ALIGNMENT". */
514 AT_NONCACHEABLE_SECTION_ALIGN(static enet_rx_bd_struct_t g_rxBuffDescrip[ENET_RXBD_NUM], ENET_BUFF_ALIGNMENT);
515 AT_NONCACHEABLE_SECTION_ALIGN(static enet_tx_bd_struct_t g_txBuffDescrip[ENET_TXBD_NUM], ENET_BUFF_ALIGNMENT);
516 /*! @brief The data buffers can be in cacheable region or in non-cacheable region.
517 * If use cacheable region, the alignment size should be the maximum size of "CACHE LINE SIZE" and "ENET_BUFF_ALIGNMENT"
518 * If use non-cache region, the alignment size is the "ENET_BUFF_ALIGNMENT".
519 */
520 SDK_ALIGN(static uint8_t g_rxDataBuff[ENET_RXBD_NUM][SDK_SIZEALIGN(ENET_RXBUFF_SIZE, CMSIS_ENET_BUFF_ALIGNMENT)],
521 CMSIS_ENET_BUFF_ALIGNMENT);
522 SDK_ALIGN(static uint8_t g_txDataBuff[ENET_TXBD_NUM][SDK_SIZEALIGN(ENET_TXBUFF_SIZE, CMSIS_ENET_BUFF_ALIGNMENT)],
523 CMSIS_ENET_BUFF_ALIGNMENT);
524
525 extern cmsis_enet_mac_resource_t ENET0_Resource;
526
527 extern void ENET0_InitPins(void);
528 extern void ENET0_DeinitPins(void);
529
530 static enet_handle_t ENET0_Handle;
531 static enet_buffer_config_t ENET0_BuffConfig = {ENET_RXBD_NUM,
532 ENET_TXBD_NUM,
533 SDK_SIZEALIGN(ENET_RXBUFF_SIZE, CMSIS_ENET_BUFF_ALIGNMENT),
534 SDK_SIZEALIGN(ENET_TXBUFF_SIZE, CMSIS_ENET_BUFF_ALIGNMENT),
535 &g_rxBuffDescrip[0],
536 &g_txBuffDescrip[0],
537 &g_rxDataBuff[0][0],
538 &g_txDataBuff[0][0],
539 (bool)true,
540 (bool)true,
541 NULL};
542
543 static cmsis_enet_mac_driver_state_t ENET0_DriverState = {&ENET0_Resource, &ENET0_Handle, &ENET0_BuffConfig};
544
ENET0_Initialize(ARM_ETH_MAC_SignalEvent_t cb_event)545 static int32_t ENET0_Initialize(ARM_ETH_MAC_SignalEvent_t cb_event)
546 {
547 ENET0_InitPins();
548 return ENET_CommonInitialize(cb_event, &ENET0_DriverState);
549 }
550
ENET0_Uninitialize(void)551 static int32_t ENET0_Uninitialize(void)
552 {
553 ENET0_DeinitPins();
554 return ENET_CommonUninitialize(&ENET0_DriverState);
555 }
556
ENET0_PowerControl(ARM_POWER_STATE state)557 static int32_t ENET0_PowerControl(ARM_POWER_STATE state)
558 {
559 return ENET_CommonPowerControl(state, &ENET0_DriverState);
560 }
561
ENET0_GetMacAddress(ARM_ETH_MAC_ADDR * ptr_addr)562 static int32_t ENET0_GetMacAddress(ARM_ETH_MAC_ADDR *ptr_addr)
563 {
564 ENET_GetMacAddr(ENET0_Resource.base, &ptr_addr->b[0]);
565
566 return ARM_DRIVER_OK;
567 }
568
ENET0_SetMacAddress(const ARM_ETH_MAC_ADDR * ptr_addr)569 static int32_t ENET0_SetMacAddress(const ARM_ETH_MAC_ADDR *ptr_addr)
570 {
571 uint8_t mac[6];
572 (void)memcpy((void *)&mac[0], (const void *)ptr_addr, 6);
573 ENET_SetMacAddr(ENET0_Resource.base, &mac[0]);
574
575 return ARM_DRIVER_OK;
576 }
577
ENET0_TransmitFrame(const uint8_t * frame,uint32_t len,uint32_t flags)578 static int32_t ENET0_TransmitFrame(const uint8_t *frame, uint32_t len, uint32_t flags)
579 {
580 return ENET_CommonSendFrame(&ENET0_DriverState, frame, len, flags);
581 }
582
ENET0_GetReceiveFrameSize(void)583 static uint32_t ENET0_GetReceiveFrameSize(void)
584 {
585 return ENET_CommonGetFrameSize(&ENET0_DriverState);
586 }
587
ENET0_ReceiveFrame(uint8_t * frame,uint32_t len)588 static int32_t ENET0_ReceiveFrame(uint8_t *frame, uint32_t len)
589 {
590 return ENET_CommonReadFrame(&ENET0_DriverState, frame, len);
591 }
592
ENET0_Control(uint32_t control,uint32_t arg)593 static int32_t ENET0_Control(uint32_t control, uint32_t arg)
594 {
595 return ENET_CommonControl(control, arg, &ENET0_DriverState);
596 }
597
ENET0_PhyWrite(uint8_t phy_addr,uint8_t reg_addr,uint16_t data)598 static int32_t ENET0_PhyWrite(uint8_t phy_addr, uint8_t reg_addr, uint16_t data)
599 {
600 return ENET_Phy_Write(&ENET0_Resource, phy_addr, reg_addr, data);
601 }
602
ENET0_PhyRead(uint8_t phy_addr,uint8_t reg_addr,uint16_t * data)603 static int32_t ENET0_PhyRead(uint8_t phy_addr, uint8_t reg_addr, uint16_t *data)
604 {
605 return ENET_Phy_Read(&ENET0_Resource, phy_addr, reg_addr, data);
606 }
607
ENET0_SetAddressFilter(const ARM_ETH_MAC_ADDR * ptr_addr,uint32_t num_addr)608 static int32_t ENET0_SetAddressFilter(const ARM_ETH_MAC_ADDR *ptr_addr, uint32_t num_addr)
609 {
610 return ARM_DRIVER_ERROR_UNSUPPORTED;
611 }
612
ENET0_GetRxFrameTime(ARM_ETH_MAC_TIME * time)613 static int32_t ENET0_GetRxFrameTime(ARM_ETH_MAC_TIME *time)
614 {
615 return ARM_DRIVER_ERROR_UNSUPPORTED;
616 }
617
ENET0_GetTxFrameTime(ARM_ETH_MAC_TIME * time)618 static int32_t ENET0_GetTxFrameTime(ARM_ETH_MAC_TIME *time)
619 {
620 return ARM_DRIVER_ERROR_UNSUPPORTED;
621 }
622
ENET0_ControlTimer(uint32_t control,ARM_ETH_MAC_TIME * time)623 static int32_t ENET0_ControlTimer(uint32_t control, ARM_ETH_MAC_TIME *time)
624 {
625 return ARM_DRIVER_ERROR_UNSUPPORTED;
626 }
627
628 ARM_DRIVER_ETH_MAC Driver_ETH_MAC0 = {ENETx_GetVersion,
629 ENETx_GetCapabilities,
630 ENET0_Initialize,
631 ENET0_Uninitialize,
632 ENET0_PowerControl,
633 ENET0_GetMacAddress,
634 ENET0_SetMacAddress,
635 ENET0_SetAddressFilter,
636 ENET0_TransmitFrame,
637 ENET0_ReceiveFrame,
638 ENET0_GetReceiveFrameSize,
639 ENET0_GetRxFrameTime,
640 ENET0_GetTxFrameTime,
641 ENET0_ControlTimer,
642 ENET0_Control,
643 ENET0_PhyRead,
644 ENET0_PhyWrite};
645 #endif
646