1 /*
2  * Copyright (c) 2013-2024, Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Licensed under the Apache License, Version 2.0 (the License); you may
7  * not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 
19 #include "Driver_USART.h"
20 
21 #include "tfm_hal_device_header.h"
22 #include "cmsis_driver_config.h"
23 #include "RTE_Device.h"
24 
25 #ifndef ARG_UNUSED
26 #define ARG_UNUSED(arg)  (void)arg
27 #endif
28 
29 /* Driver version */
30 #define ARM_USART_DRV_VERSION  ARM_DRIVER_VERSION_MAJOR_MINOR(2, 2)
31 
32 /* Driver Version */
33 static const ARM_DRIVER_VERSION DriverVersion = {
34     ARM_USART_API_VERSION,
35     ARM_USART_DRV_VERSION
36 };
37 
38 /* Driver Capabilities */
39 static const ARM_USART_CAPABILITIES DriverCapabilities = {
40     1, /* supports UART (Asynchronous) mode */
41     0, /* supports Synchronous Master mode */
42     0, /* supports Synchronous Slave mode */
43     0, /* supports UART Single-wire mode */
44     0, /* supports UART IrDA mode */
45     0, /* supports UART Smart Card mode */
46     0, /* Smart Card Clock generator available */
47     0, /* RTS Flow Control available */
48     0, /* CTS Flow Control available */
49     0, /* Transmit completed event: \ref ARM_USARTx_EVENT_TX_COMPLETE */
50     0, /* Signal receive character timeout event: \ref ARM_USARTx_EVENT_RX_TIMEOUT */
51     0, /* RTS Line: 0=not available, 1=available */
52     0, /* CTS Line: 0=not available, 1=available */
53     0, /* DTR Line: 0=not available, 1=available */
54     0, /* DSR Line: 0=not available, 1=available */
55     0, /* DCD Line: 0=not available, 1=available */
56     0, /* RI Line: 0=not available, 1=available */
57     0, /* Signal CTS change event: \ref ARM_USARTx_EVENT_CTS */
58     0, /* Signal DSR change event: \ref ARM_USARTx_EVENT_DSR */
59     0, /* Signal DCD change event: \ref ARM_USARTx_EVENT_DCD */
60     0, /* Signal RI change event: \ref ARM_USARTx_EVENT_RI */
61     0  /* Reserved */
62 };
63 
ARM_USART_GetVersion(void)64 static ARM_DRIVER_VERSION ARM_USART_GetVersion(void)
65 {
66     return DriverVersion;
67 }
68 
ARM_USART_GetCapabilities(void)69 static ARM_USART_CAPABILITIES ARM_USART_GetCapabilities(void)
70 {
71     return DriverCapabilities;
72 }
73 
74 typedef struct {
75     struct arm_uart_dev_t* dev;        /* UART device structure */
76     uint32_t tx_nbr_bytes;             /* Number of bytes transfered */
77     uint32_t rx_nbr_bytes;             /* Number of bytes recevied */
78     ARM_USART_SignalEvent_t cb_event;  /* Callback function for events */
79 } UARTx_Resources;
80 
ARM_USARTx_Initialize(UARTx_Resources * uart_dev)81 static int32_t ARM_USARTx_Initialize(UARTx_Resources* uart_dev)
82 {
83     /* Initializes generic UART driver */
84     arm_uart_init(uart_dev->dev, PeripheralClock);
85 
86     return ARM_DRIVER_OK;
87 }
88 
ARM_USARTx_PowerControl(UARTx_Resources * uart_dev,ARM_POWER_STATE state)89 static int32_t ARM_USARTx_PowerControl(UARTx_Resources* uart_dev,
90                                        ARM_POWER_STATE state)
91 {
92     ARG_UNUSED(uart_dev);
93 
94     switch (state) {
95     case ARM_POWER_OFF:
96     case ARM_POWER_LOW:
97         return ARM_DRIVER_ERROR_UNSUPPORTED;
98     case ARM_POWER_FULL:
99         /* Nothing to be done */
100         return ARM_DRIVER_OK;
101     /* default:  The default is not defined intentionally to force the
102      *           compiler to check that all the enumeration values are
103      *           covered in the switch.*/
104     }
105 }
106 
ARM_USARTx_Send(UARTx_Resources * uart_dev,const void * data,uint32_t num)107 static int32_t ARM_USARTx_Send(UARTx_Resources* uart_dev, const void *data,
108                                uint32_t num)
109 {
110     const uint8_t* p_data = (const uint8_t*)data;
111 
112     if ((data == NULL) || (num == 0U)) {
113         /* Invalid parameters */
114         return ARM_DRIVER_ERROR_PARAMETER;
115     }
116 
117     /* Resets previous TX counter */
118     uart_dev->tx_nbr_bytes = 0;
119 
120     while(uart_dev->tx_nbr_bytes != num) {
121         /* Waits until UART is ready to transmit */
122         while(!arm_uart_tx_ready(uart_dev->dev)) {};
123 
124         /* As UART is ready to transmit at this point, the write function can
125          * not return any transmit error */
126         (void)arm_uart_write(uart_dev->dev, *p_data);
127 
128         uart_dev->tx_nbr_bytes++;
129         p_data++;
130     }
131 
132     if (uart_dev->cb_event != NULL) {
133         uart_dev->cb_event(ARM_USART_EVENT_SEND_COMPLETE);
134     }
135 
136     /* Waits until character is transmited */
137     while (!arm_uart_tx_ready(uart_dev->dev)){};
138 
139     return ARM_DRIVER_OK;
140 }
141 
ARM_USARTx_Receive(UARTx_Resources * uart_dev,void * data,uint32_t num)142 static int32_t ARM_USARTx_Receive(UARTx_Resources* uart_dev,
143                                   void *data, uint32_t num)
144 {
145     uint8_t* p_data = (uint8_t*)data;
146 
147     if ((data == NULL) || (num == 0U)) {
148         // Invalid parameters
149         return ARM_DRIVER_ERROR_PARAMETER;
150     }
151 
152     /* Resets previous RX counter */
153     uart_dev->rx_nbr_bytes = 0;
154 
155     while(uart_dev->rx_nbr_bytes != num) {
156         /* Waits until one character is received */
157         while (!arm_uart_rx_ready(uart_dev->dev)){};
158 
159         /* As UART has received one byte, the read can not
160          * return any receive error at this point */
161         (void)arm_uart_read(uart_dev->dev, p_data);
162 
163         uart_dev->rx_nbr_bytes++;
164         p_data++;
165     }
166 
167     if (uart_dev->cb_event != NULL) {
168         uart_dev->cb_event(ARM_USART_EVENT_RECEIVE_COMPLETE);
169     }
170 
171     return ARM_DRIVER_OK;
172 }
173 
ARM_USARTx_GetTxCount(UARTx_Resources * uart_dev)174 static uint32_t ARM_USARTx_GetTxCount(UARTx_Resources* uart_dev)
175 {
176     return uart_dev->tx_nbr_bytes;
177 }
178 
ARM_USARTx_GetRxCount(UARTx_Resources * uart_dev)179 static uint32_t ARM_USARTx_GetRxCount(UARTx_Resources* uart_dev)
180 {
181     return uart_dev->rx_nbr_bytes;
182 }
183 
ARM_USARTx_Control(UARTx_Resources * uart_dev,uint32_t control,uint32_t arg)184 static int32_t ARM_USARTx_Control(UARTx_Resources* uart_dev, uint32_t control,
185                                   uint32_t arg)
186 {
187     switch (control & ARM_USART_CONTROL_Msk) {
188 #ifdef UART_TX_RX_CONTROL_ENABLED
189         case ARM_USART_CONTROL_TX:
190             if (arg == 0) {
191                 arm_uart_tx_disable(uart_dev->dev);
192             } else if (arg == 1) {
193                 if (arm_uart_tx_enable(uart_dev->dev) != ARM_UART_ERR_NONE) {
194                     return ARM_DRIVER_ERROR;
195                 }
196             } else {
197                 return ARM_DRIVER_ERROR_PARAMETER;
198             }
199             break;
200         case ARM_USART_CONTROL_RX:
201             if (arg == 0) {
202                 arm_uart_rx_disable(uart_dev->dev);
203             } else if (arg == 1) {
204                 if (arm_uart_rx_enable(uart_dev->dev) != ARM_UART_ERR_NONE) {
205                     return ARM_DRIVER_ERROR;
206                 }
207             } else {
208                 return ARM_DRIVER_ERROR_PARAMETER;
209             }
210             break;
211 #endif
212         case ARM_USART_MODE_ASYNCHRONOUS:
213             if(arm_uart_set_baudrate(uart_dev->dev, arg) != ARM_UART_ERR_NONE) {
214                 return ARM_USART_ERROR_BAUDRATE;
215             }
216             break;
217         /* Unsupported command */
218         default:
219             return ARM_DRIVER_ERROR_UNSUPPORTED;
220     }
221 
222     /* UART Data bits */
223     if(control & ARM_USART_DATA_BITS_Msk) {
224         /* Data bit is not configurable */
225         return ARM_DRIVER_ERROR_UNSUPPORTED;
226     }
227 
228     /* UART Parity */
229     if(control & ARM_USART_PARITY_Msk) {
230         /* Parity is not configurable */
231         return ARM_USART_ERROR_PARITY;
232     }
233 
234     /* USART Stop bits */
235     if(control & ARM_USART_STOP_BITS_Msk) {
236         /* Stop bit is not configurable */
237         return ARM_USART_ERROR_STOP_BITS;
238     }
239 
240     return ARM_DRIVER_OK;
241 }
242 
243 #if (RTE_USART0)
244 /* USART0 Driver wrapper functions */
245 static UARTx_Resources USART0_DEV = {
246     .dev = &UART0_DEV,
247     .tx_nbr_bytes = 0,
248     .rx_nbr_bytes = 0,
249     .cb_event = NULL,
250 };
251 
ARM_USART0_Initialize(ARM_USART_SignalEvent_t cb_event)252 static int32_t ARM_USART0_Initialize(ARM_USART_SignalEvent_t cb_event)
253 {
254     USART0_DEV.cb_event = cb_event;
255 
256     return ARM_USARTx_Initialize(&USART0_DEV);
257 }
258 
ARM_USART0_Uninitialize(void)259 static int32_t ARM_USART0_Uninitialize(void)
260 {
261     /* Nothing to be done */
262     return ARM_DRIVER_OK;
263 }
264 
ARM_USART0_PowerControl(ARM_POWER_STATE state)265 static int32_t ARM_USART0_PowerControl(ARM_POWER_STATE state)
266 {
267     return ARM_USARTx_PowerControl(&USART0_DEV, state);
268 }
269 
ARM_USART0_Send(const void * data,uint32_t num)270 static int32_t ARM_USART0_Send(const void *data, uint32_t num)
271 {
272     return ARM_USARTx_Send(&USART0_DEV, data, num);
273 }
274 
ARM_USART0_Receive(void * data,uint32_t num)275 static int32_t ARM_USART0_Receive(void *data, uint32_t num)
276 {
277     return ARM_USARTx_Receive(&USART0_DEV, data, num);
278 }
279 
ARM_USART0_Transfer(const void * data_out,void * data_in,uint32_t num)280 static int32_t ARM_USART0_Transfer(const void *data_out, void *data_in,
281                                    uint32_t num)
282 {
283     ARG_UNUSED(data_out);
284     ARG_UNUSED(data_in);
285     ARG_UNUSED(num);
286 
287     return ARM_DRIVER_ERROR_UNSUPPORTED;
288 }
289 
ARM_USART0_GetTxCount(void)290 static uint32_t ARM_USART0_GetTxCount(void)
291 {
292     return ARM_USARTx_GetTxCount(&USART0_DEV);
293 }
294 
ARM_USART0_GetRxCount(void)295 static uint32_t ARM_USART0_GetRxCount(void)
296 {
297     return ARM_USARTx_GetRxCount(&USART0_DEV);
298 }
ARM_USART0_Control(uint32_t control,uint32_t arg)299 static int32_t ARM_USART0_Control(uint32_t control, uint32_t arg)
300 {
301     return ARM_USARTx_Control(&USART0_DEV, control, arg);
302 }
303 
ARM_USART0_GetStatus(void)304 static ARM_USART_STATUS ARM_USART0_GetStatus(void)
305 {
306     ARM_USART_STATUS status = {0, 0, 0, 0, 0, 0, 0, 0};
307     return status;
308 }
309 
ARM_USART0_SetModemControl(ARM_USART_MODEM_CONTROL control)310 static int32_t ARM_USART0_SetModemControl(ARM_USART_MODEM_CONTROL control)
311 {
312     ARG_UNUSED(control);
313     return ARM_DRIVER_ERROR_UNSUPPORTED;
314 }
315 
ARM_USART0_GetModemStatus(void)316 static ARM_USART_MODEM_STATUS ARM_USART0_GetModemStatus(void)
317 {
318     ARM_USART_MODEM_STATUS modem_status = {0, 0, 0, 0, 0};
319     return modem_status;
320 }
321 
322 extern ARM_DRIVER_USART Driver_USART0;
323 ARM_DRIVER_USART Driver_USART0 = {
324     ARM_USART_GetVersion,
325     ARM_USART_GetCapabilities,
326     ARM_USART0_Initialize,
327     ARM_USART0_Uninitialize,
328     ARM_USART0_PowerControl,
329     ARM_USART0_Send,
330     ARM_USART0_Receive,
331     ARM_USART0_Transfer,
332     ARM_USART0_GetTxCount,
333     ARM_USART0_GetRxCount,
334     ARM_USART0_Control,
335     ARM_USART0_GetStatus,
336     ARM_USART0_SetModemControl,
337     ARM_USART0_GetModemStatus
338 };
339 #endif /* RTE_USART0 */
340 
341 #if (RTE_USART1)
342 /* USART1 Driver wrapper functions */
343 static UARTx_Resources USART1_DEV = {
344     .dev = &UART1_DEV,
345     .tx_nbr_bytes = 0,
346     .rx_nbr_bytes = 0,
347     .cb_event = NULL,
348 };
349 
ARM_USART1_Initialize(ARM_USART_SignalEvent_t cb_event)350 static int32_t ARM_USART1_Initialize(ARM_USART_SignalEvent_t cb_event)
351 {
352     USART1_DEV.cb_event = cb_event;
353 
354     return ARM_USARTx_Initialize(&USART1_DEV);
355 }
356 
ARM_USART1_Uninitialize(void)357 static int32_t ARM_USART1_Uninitialize(void)
358 {
359     /* Nothing to be done */
360     return ARM_DRIVER_OK;
361 }
362 
ARM_USART1_PowerControl(ARM_POWER_STATE state)363 static int32_t ARM_USART1_PowerControl(ARM_POWER_STATE state)
364 {
365     return ARM_USARTx_PowerControl(&USART1_DEV, state);
366 }
367 
ARM_USART1_Send(const void * data,uint32_t num)368 static int32_t ARM_USART1_Send(const void *data, uint32_t num)
369 {
370     return ARM_USARTx_Send(&USART1_DEV, data, num);
371 }
372 
ARM_USART1_Receive(void * data,uint32_t num)373 static int32_t ARM_USART1_Receive(void *data, uint32_t num)
374 {
375     return ARM_USARTx_Receive(&USART1_DEV, data, num);
376 }
377 
ARM_USART1_Transfer(const void * data_out,void * data_in,uint32_t num)378 static int32_t ARM_USART1_Transfer(const void *data_out, void *data_in,
379                                    uint32_t num)
380 {
381     ARG_UNUSED(data_out);
382     ARG_UNUSED(data_in);
383     ARG_UNUSED(num);
384 
385     return ARM_DRIVER_ERROR_UNSUPPORTED;
386 }
387 
ARM_USART1_GetTxCount(void)388 static uint32_t ARM_USART1_GetTxCount(void)
389 {
390     return ARM_USARTx_GetTxCount(&USART1_DEV);
391 }
392 
ARM_USART1_GetRxCount(void)393 static uint32_t ARM_USART1_GetRxCount(void)
394 {
395     return ARM_USARTx_GetRxCount(&USART1_DEV);
396 }
ARM_USART1_Control(uint32_t control,uint32_t arg)397 static int32_t ARM_USART1_Control(uint32_t control, uint32_t arg)
398 {
399     return ARM_USARTx_Control(&USART1_DEV, control, arg);
400 }
401 
ARM_USART1_GetStatus(void)402 static ARM_USART_STATUS ARM_USART1_GetStatus(void)
403 {
404     ARM_USART_STATUS status = {0, 0, 0, 0, 0, 0, 0, 0};
405     return status;
406 }
407 
ARM_USART1_SetModemControl(ARM_USART_MODEM_CONTROL control)408 static int32_t ARM_USART1_SetModemControl(ARM_USART_MODEM_CONTROL control)
409 {
410     ARG_UNUSED(control);
411     return ARM_DRIVER_ERROR_UNSUPPORTED;
412 }
413 
ARM_USART1_GetModemStatus(void)414 static ARM_USART_MODEM_STATUS ARM_USART1_GetModemStatus(void)
415 {
416     ARM_USART_MODEM_STATUS modem_status = {0, 0, 0, 0, 0};
417     return modem_status;
418 }
419 
420 extern ARM_DRIVER_USART Driver_USART1;
421 ARM_DRIVER_USART Driver_USART1 = {
422     ARM_USART_GetVersion,
423     ARM_USART_GetCapabilities,
424     ARM_USART1_Initialize,
425     ARM_USART1_Uninitialize,
426     ARM_USART1_PowerControl,
427     ARM_USART1_Send,
428     ARM_USART1_Receive,
429     ARM_USART1_Transfer,
430     ARM_USART1_GetTxCount,
431     ARM_USART1_GetRxCount,
432     ARM_USART1_Control,
433     ARM_USART1_GetStatus,
434     ARM_USART1_SetModemControl,
435     ARM_USART1_GetModemStatus
436 };
437 #endif /* RTE_USART1 */
438 
439 #if (RTE_USART2)
440 /* USART2 Driver wrapper functions */
441 static UARTx_Resources USART2_DEV = {
442     .dev = &UART2_DEV,
443     .tx_nbr_bytes = 0,
444     .rx_nbr_bytes = 0,
445     .cb_event = NULL,
446 };
447 
ARM_USART2_Initialize(ARM_USART_SignalEvent_t cb_event)448 static int32_t ARM_USART2_Initialize(ARM_USART_SignalEvent_t cb_event)
449 {
450     USART2_DEV.cb_event = cb_event;
451 
452     return ARM_USARTx_Initialize(&USART2_DEV);
453 }
454 
ARM_USART2_Uninitialize(void)455 static int32_t ARM_USART2_Uninitialize(void)
456 {
457     /* Nothing to be done */
458     return ARM_DRIVER_OK;
459 }
460 
ARM_USART2_PowerControl(ARM_POWER_STATE state)461 static int32_t ARM_USART2_PowerControl(ARM_POWER_STATE state)
462 {
463     return ARM_USARTx_PowerControl(&USART2_DEV, state);
464 }
465 
ARM_USART2_Send(const void * data,uint32_t num)466 static int32_t ARM_USART2_Send(const void *data, uint32_t num)
467 {
468     return ARM_USARTx_Send(&USART2_DEV, data, num);
469 }
470 
ARM_USART2_Receive(void * data,uint32_t num)471 static int32_t ARM_USART2_Receive(void *data, uint32_t num)
472 {
473     return ARM_USARTx_Receive(&USART2_DEV, data, num);
474 }
475 
ARM_USART2_Transfer(const void * data_out,void * data_in,uint32_t num)476 static int32_t ARM_USART2_Transfer(const void *data_out, void *data_in,
477                                    uint32_t num)
478 {
479     ARG_UNUSED(data_out);
480     ARG_UNUSED(data_in);
481     ARG_UNUSED(num);
482 
483     return ARM_DRIVER_ERROR_UNSUPPORTED;
484 }
485 
ARM_USART2_GetTxCount(void)486 static uint32_t ARM_USART2_GetTxCount(void)
487 {
488     return ARM_USARTx_GetTxCount(&USART2_DEV);
489 }
490 
ARM_USART2_GetRxCount(void)491 static uint32_t ARM_USART2_GetRxCount(void)
492 {
493     return ARM_USARTx_GetRxCount(&USART2_DEV);
494 }
ARM_USART2_Control(uint32_t control,uint32_t arg)495 static int32_t ARM_USART2_Control(uint32_t control, uint32_t arg)
496 {
497     return ARM_USARTx_Control(&USART2_DEV, control, arg);
498 }
499 
ARM_USART2_GetStatus(void)500 static ARM_USART_STATUS ARM_USART2_GetStatus(void)
501 {
502     ARM_USART_STATUS status = {0, 0, 0, 0, 0, 0, 0, 0};
503     return status;
504 }
505 
ARM_USART2_SetModemControl(ARM_USART_MODEM_CONTROL control)506 static int32_t ARM_USART2_SetModemControl(ARM_USART_MODEM_CONTROL control)
507 {
508     ARG_UNUSED(control);
509     return ARM_DRIVER_ERROR_UNSUPPORTED;
510 }
511 
ARM_USART2_GetModemStatus(void)512 static ARM_USART_MODEM_STATUS ARM_USART2_GetModemStatus(void)
513 {
514     ARM_USART_MODEM_STATUS modem_status = {0, 0, 0, 0, 0};
515     return modem_status;
516 }
517 
518 extern ARM_DRIVER_USART Driver_USART2;
519 ARM_DRIVER_USART Driver_USART2 = {
520     ARM_USART_GetVersion,
521     ARM_USART_GetCapabilities,
522     ARM_USART2_Initialize,
523     ARM_USART2_Uninitialize,
524     ARM_USART2_PowerControl,
525     ARM_USART2_Send,
526     ARM_USART2_Receive,
527     ARM_USART2_Transfer,
528     ARM_USART2_GetTxCount,
529     ARM_USART2_GetRxCount,
530     ARM_USART2_Control,
531     ARM_USART2_GetStatus,
532     ARM_USART2_SetModemControl,
533     ARM_USART2_GetModemStatus
534 };
535 #endif /* RTE_USART2 */
536 
537 #if (RTE_USART3)
538 /* USART3 Driver wrapper functions */
539 static UARTx_Resources USART3_DEV = {
540     .dev = &UART3_DEV,
541     .tx_nbr_bytes = 0,
542     .rx_nbr_bytes = 0,
543     .cb_event = NULL,
544 };
545 
ARM_USART3_Initialize(ARM_USART_SignalEvent_t cb_event)546 static int32_t ARM_USART3_Initialize(ARM_USART_SignalEvent_t cb_event)
547 {
548     USART3_DEV.cb_event = cb_event;
549 
550     return ARM_USARTx_Initialize(&USART3_DEV);
551 }
552 
ARM_USART3_Uninitialize(void)553 static int32_t ARM_USART3_Uninitialize(void)
554 {
555     /* Nothing to be done */
556     return ARM_DRIVER_OK;
557 }
558 
ARM_USART3_PowerControl(ARM_POWER_STATE state)559 static int32_t ARM_USART3_PowerControl(ARM_POWER_STATE state)
560 {
561     return ARM_USARTx_PowerControl(&USART3_DEV, state);
562 }
563 
ARM_USART3_Send(const void * data,uint32_t num)564 static int32_t ARM_USART3_Send(const void *data, uint32_t num)
565 {
566     return ARM_USARTx_Send(&USART3_DEV, data, num);
567 }
568 
ARM_USART3_Receive(void * data,uint32_t num)569 static int32_t ARM_USART3_Receive(void *data, uint32_t num)
570 {
571     return ARM_USARTx_Receive(&USART3_DEV, data, num);
572 }
573 
ARM_USART3_Transfer(const void * data_out,void * data_in,uint32_t num)574 static int32_t ARM_USART3_Transfer(const void *data_out, void *data_in,
575                                    uint32_t num)
576 {
577     ARG_UNUSED(data_out);
578     ARG_UNUSED(data_in);
579     ARG_UNUSED(num);
580 
581     return ARM_DRIVER_ERROR_UNSUPPORTED;
582 }
583 
ARM_USART3_GetTxCount(void)584 static uint32_t ARM_USART3_GetTxCount(void)
585 {
586     return ARM_USARTx_GetTxCount(&USART3_DEV);
587 }
588 
ARM_USART3_GetRxCount(void)589 static uint32_t ARM_USART3_GetRxCount(void)
590 {
591     return ARM_USARTx_GetRxCount(&USART3_DEV);
592 }
ARM_USART3_Control(uint32_t control,uint32_t arg)593 static int32_t ARM_USART3_Control(uint32_t control, uint32_t arg)
594 {
595     return ARM_USARTx_Control(&USART3_DEV, control, arg);
596 }
597 
ARM_USART3_GetStatus(void)598 static ARM_USART_STATUS ARM_USART3_GetStatus(void)
599 {
600     ARM_USART_STATUS status = {0, 0, 0, 0, 0, 0, 0, 0};
601     return status;
602 }
603 
ARM_USART3_SetModemControl(ARM_USART_MODEM_CONTROL control)604 static int32_t ARM_USART3_SetModemControl(ARM_USART_MODEM_CONTROL control)
605 {
606     ARG_UNUSED(control);
607     return ARM_DRIVER_ERROR_UNSUPPORTED;
608 }
609 
ARM_USART3_GetModemStatus(void)610 static ARM_USART_MODEM_STATUS ARM_USART3_GetModemStatus(void)
611 {
612     ARM_USART_MODEM_STATUS modem_status = {0, 0, 0, 0, 0};
613     return modem_status;
614 }
615 
616 extern ARM_DRIVER_USART Driver_USART3;
617 ARM_DRIVER_USART Driver_USART3 = {
618     ARM_USART_GetVersion,
619     ARM_USART_GetCapabilities,
620     ARM_USART3_Initialize,
621     ARM_USART3_Uninitialize,
622     ARM_USART3_PowerControl,
623     ARM_USART3_Send,
624     ARM_USART3_Receive,
625     ARM_USART3_Transfer,
626     ARM_USART3_GetTxCount,
627     ARM_USART3_GetRxCount,
628     ARM_USART3_Control,
629     ARM_USART3_GetStatus,
630     ARM_USART3_SetModemControl,
631     ARM_USART3_GetModemStatus
632 };
633 #endif /* RTE_USART3 */
634 
635 #if (RTE_USART4)
636 /* USART4 Driver wrapper functions */
637 static UARTx_Resources USART4_DEV = {
638     .dev = &UART4_DEV,
639     .tx_nbr_bytes = 0,
640     .rx_nbr_bytes = 0,
641     .cb_event = NULL,
642 };
643 
ARM_USART4_Initialize(ARM_USART_SignalEvent_t cb_event)644 static int32_t ARM_USART4_Initialize(ARM_USART_SignalEvent_t cb_event)
645 {
646     USART4_DEV.cb_event = cb_event;
647 
648     return ARM_USARTx_Initialize(&USART4_DEV);
649 }
650 
ARM_USART4_Uninitialize(void)651 static int32_t ARM_USART4_Uninitialize(void)
652 {
653     /* Nothing to be done */
654     return ARM_DRIVER_OK;
655 }
656 
ARM_USART4_PowerControl(ARM_POWER_STATE state)657 static int32_t ARM_USART4_PowerControl(ARM_POWER_STATE state)
658 {
659     return ARM_USARTx_PowerControl(&USART4_DEV, state);
660 }
661 
ARM_USART4_Send(const void * data,uint32_t num)662 static int32_t ARM_USART4_Send(const void *data, uint32_t num)
663 {
664     return ARM_USARTx_Send(&USART4_DEV, data, num);
665 }
666 
ARM_USART4_Receive(void * data,uint32_t num)667 static int32_t ARM_USART4_Receive(void *data, uint32_t num)
668 {
669     return ARM_USARTx_Receive(&USART4_DEV, data, num);
670 }
671 
ARM_USART4_Transfer(const void * data_out,void * data_in,uint32_t num)672 static int32_t ARM_USART4_Transfer(const void *data_out, void *data_in,
673                                    uint32_t num)
674 {
675     ARG_UNUSED(data_out);
676     ARG_UNUSED(data_in);
677     ARG_UNUSED(num);
678 
679     return ARM_DRIVER_ERROR_UNSUPPORTED;
680 }
681 
ARM_USART4_GetTxCount(void)682 static uint32_t ARM_USART4_GetTxCount(void)
683 {
684     return ARM_USARTx_GetTxCount(&USART4_DEV);
685 }
686 
ARM_USART4_GetRxCount(void)687 static uint32_t ARM_USART4_GetRxCount(void)
688 {
689     return ARM_USARTx_GetRxCount(&USART4_DEV);
690 }
ARM_USART4_Control(uint32_t control,uint32_t arg)691 static int32_t ARM_USART4_Control(uint32_t control, uint32_t arg)
692 {
693     return ARM_USARTx_Control(&USART4_DEV, control, arg);
694 }
695 
ARM_USART4_GetStatus(void)696 static ARM_USART_STATUS ARM_USART4_GetStatus(void)
697 {
698     ARM_USART_STATUS status = {0, 0, 0, 0, 0, 0, 0, 0};
699     return status;
700 }
701 
ARM_USART4_SetModemControl(ARM_USART_MODEM_CONTROL control)702 static int32_t ARM_USART4_SetModemControl(ARM_USART_MODEM_CONTROL control)
703 {
704     ARG_UNUSED(control);
705     return ARM_DRIVER_ERROR_UNSUPPORTED;
706 }
707 
ARM_USART4_GetModemStatus(void)708 static ARM_USART_MODEM_STATUS ARM_USART4_GetModemStatus(void)
709 {
710     ARM_USART_MODEM_STATUS modem_status = {0, 0, 0, 0, 0};
711     return modem_status;
712 }
713 
714 extern ARM_DRIVER_USART Driver_USART4;
715 ARM_DRIVER_USART Driver_USART4 = {
716     ARM_USART_GetVersion,
717     ARM_USART_GetCapabilities,
718     ARM_USART4_Initialize,
719     ARM_USART4_Uninitialize,
720     ARM_USART4_PowerControl,
721     ARM_USART4_Send,
722     ARM_USART4_Receive,
723     ARM_USART4_Transfer,
724     ARM_USART4_GetTxCount,
725     ARM_USART4_GetRxCount,
726     ARM_USART4_Control,
727     ARM_USART4_GetStatus,
728     ARM_USART4_SetModemControl,
729     ARM_USART4_GetModemStatus
730 };
731 #endif /* RTE_USART4 */
732