4242#if RTE_USART0 || RTE_USART1 || RTE_USART2 || RTE_USART3 || \
4343 RTE_UART00 || RTE_USART20 || RTE_UART21 || RTE_UART22 || RTE_USART30
4444
45- #define PSEL_DISCONNECTED 0xFFFFFFFFUL
46-
47- #define UART_CONFIG_INITIALIZER () \
48- { \
49- .txd_pin = PSEL_DISCONNECTED, \
50- .rxd_pin = PSEL_DISCONNECTED, \
51- .rts_pin = PSEL_DISCONNECTED, \
52- .cts_pin = PSEL_DISCONNECTED, \
53- .baudrate = NRF_UARTE_BAUDRATE_115200, \
54- .interrupt_priority = NRFX_UARTE_DEFAULT_CONFIG_IRQ_PRIORITY, \
55- .config = { \
56- .hwfc = NRF_UARTE_HWFC_DISABLED, \
57- .parity = NRF_UARTE_PARITY_EXCLUDED, \
58- .stop = NRF_UARTE_STOP_ONE, \
59- }, \
60- }
61-
6245void uart_config_set_uart_pins (nrfx_uarte_config_t * uart_config ,
6346 const uint32_t uart_pins [],
6447 size_t uart_pins_count )
@@ -67,7 +50,7 @@ void uart_config_set_uart_pins(nrfx_uarte_config_t *uart_config,
6750 uint32_t psel = NRF_GET_PIN (uart_pins [i ]);
6851
6952 if (psel == NRF_PIN_DISCONNECTED ) {
70- psel = PSEL_DISCONNECTED ;
53+ psel = NRF_UARTE_PSEL_DISCONNECTED ;
7154 }
7255
7356 switch (NRF_GET_FUN (uart_pins [i ])) {
@@ -89,14 +72,12 @@ static const ARM_USART_CAPABILITIES DriverCapabilities = {
8972};
9073
9174typedef struct {
92- const nrfx_uarte_t uarte ;
75+ nrfx_uarte_t uarte ;
9376 const uint32_t * uart_pins ;
9477 size_t uart_pins_count ;
9578 size_t tx_count ;
9679 size_t rx_count ;
97- nrf_uarte_config_t hal_cfg ;
98- nrf_uarte_baudrate_t baudrate ;
99- bool initialized ;
80+ nrfx_uarte_config_t cfg ;
10081} UARTx_Resources ;
10182
10283static ARM_DRIVER_VERSION ARM_USART_GetVersion (void )
@@ -119,34 +100,28 @@ static int32_t ARM_USARTx_Initialize(ARM_USART_SignalEvent_t cb_event,
119100 NVIC_ClearTargetState (NRFX_IRQ_NUMBER_GET ((uint32_t )uart_resources -> uarte .p_reg ));
120101#endif
121102
122- nrfx_uarte_config_t uart_config = UART_CONFIG_INITIALIZER ();
123103
124- uart_config_set_uart_pins (& uart_config ,
104+ uart_config_set_uart_pins (& uart_resources -> cfg ,
125105 uart_resources -> uart_pins ,
126106 uart_resources -> uart_pins_count );
127107
128- nrfx_err_t err_code = nrfx_uarte_init (& uart_resources -> uarte ,
129- & uart_config ,
130- NULL );
131- if (err_code != NRFX_SUCCESS ) {
108+ int err_code = nrfx_uarte_init (& uart_resources -> uarte ,
109+ & uart_resources -> cfg ,
110+ NULL );
111+ if (err_code < 0 ) {
132112 return ARM_DRIVER_ERROR_BUSY ;
133113 }
134114
135115 uart_resources -> tx_count = 0 ;
136116 uart_resources -> rx_count = 0 ;
137- uart_resources -> hal_cfg = uart_config .config ;
138- uart_resources -> baudrate = uart_config .baudrate ;
139117
140- uart_resources -> initialized = true;
141118 return ARM_DRIVER_OK ;
142119}
143120
144121static int32_t ARM_USARTx_Uninitialize (UARTx_Resources * uart_resources )
145122{
146123 nrfx_uarte_uninit (& uart_resources -> uarte );
147124
148- uart_resources -> initialized = false;
149-
150125#ifdef SPU_CONFIGURE_UART
151126 spu_peripheral_config_non_secure ((uint32_t )uart_resources -> uarte .p_reg , false);
152127 NVIC_SetTargetState (NRFX_IRQ_NUMBER_GET ((uint32_t )uart_resources -> uarte .p_reg ));
@@ -181,7 +156,7 @@ static int32_t ARM_USARTx_PowerControl(ARM_POWER_STATE state,
181156static int32_t ARM_USARTx_Send (const void * data , uint32_t num ,
182157 UARTx_Resources * uart_resources )
183158{
184- if (!uart_resources -> initialized ) {
159+ if (!nrfx_uarte_init_check ( & uart_resources -> uarte ) ) {
185160 return ARM_DRIVER_ERROR ;
186161 }
187162
@@ -198,10 +173,10 @@ static int32_t ARM_USARTx_Send(const void *data, uint32_t num,
198173 }
199174 }
200175 } else {
201- nrfx_err_t err_code = nrfx_uarte_tx (& uart_resources -> uarte , data , num , 0 );
202- if (err_code == NRFX_ERROR_BUSY ) {
176+ int err_code = nrfx_uarte_tx (& uart_resources -> uarte , data , num , 0 );
177+ if (err_code == - EBUSY ) {
203178 return ARM_DRIVER_ERROR_BUSY ;
204- } else if (err_code != NRFX_SUCCESS ) {
179+ } else if (err_code < 0 ) {
205180 return ARM_DRIVER_ERROR ;
206181 }
207182
@@ -214,14 +189,43 @@ static int32_t ARM_USARTx_Send(const void *data, uint32_t num,
214189static int32_t ARM_USARTx_Receive (void * data , uint32_t num ,
215190 UARTx_Resources * uart_resources )
216191{
217- if (!uart_resources -> initialized ) {
192+ if (!nrfx_uarte_init_check (& uart_resources -> uarte )) {
193+ return ARM_DRIVER_ERROR ;
194+ }
195+
196+ int err_code = nrfx_uarte_rx_buffer_set (& uart_resources -> uarte , data , num );
197+
198+ if (err_code == - EBUSY ) {
199+ return ARM_DRIVER_ERROR_BUSY ;
200+ } else if (err_code < 0 ) {
218201 return ARM_DRIVER_ERROR ;
219202 }
220203
221- nrfx_err_t err_code = nrfx_uarte_rx (& uart_resources -> uarte , data , num );
222- if (err_code == NRFX_ERROR_BUSY ) {
204+ uint32_t flags = NRFX_UARTE_RX_ENABLE_CONT | NRFX_UARTE_RX_ENABLE_STOP_ON_END ;
205+ err_code = nrfx_uarte_rx_enable (& uart_resources -> uarte , flags );
206+
207+ if (err_code == - EBUSY ) {
223208 return ARM_DRIVER_ERROR_BUSY ;
224- } else if (err_code != NRFX_SUCCESS ) {
209+ } else if (err_code < 0 ) {
210+ return ARM_DRIVER_ERROR ;
211+ }
212+
213+ size_t rx_amount = 0 ;
214+
215+ do
216+ {
217+ err_code = nrfx_uarte_rx_ready (& uart_resources -> uarte , & rx_amount );
218+ } while (err_code == - EBUSY );
219+
220+ if ((err_code == - EALREADY ) || (num > rx_amount ))
221+ {
222+ return ARM_DRIVER_ERROR ;
223+ }
224+
225+ err_code = nrfx_uarte_rx_abort (& uart_resources -> uarte , true, true);
226+
227+ if (err_code < 0 )
228+ {
225229 return ARM_DRIVER_ERROR ;
226230 }
227231
@@ -253,8 +257,8 @@ static uint32_t ARM_USARTx_GetRxCount(const UARTx_Resources *uart_resources)
253257static int32_t ARM_USART_Control_Mode (uint32_t control , uint32_t arg ,
254258 UARTx_Resources * uart_resources )
255259{
256- nrf_uarte_baudrate_t baudrate = uart_resources -> baudrate ;
257- nrf_uarte_config_t hal_cfg = uart_resources -> hal_cfg ;
260+ nrf_uarte_baudrate_t baudrate = uart_resources -> cfg . baudrate ;
261+ nrf_uarte_config_t hal_cfg = uart_resources -> cfg . config ;
258262 switch (arg ) {
259263 case 1200 :
260264 baudrate = NRF_UARTE_BAUDRATE_1200 ;
@@ -369,37 +373,25 @@ static int32_t ARM_USART_Control_Mode(uint32_t control, uint32_t arg,
369373 return ARM_USART_ERROR_FLOW_CONTROL ;
370374 }
371375
372- uart_resources -> baudrate = baudrate ;
373- uart_resources -> hal_cfg = hal_cfg ;
376+ uart_resources -> cfg . baudrate = baudrate ;
377+ uart_resources -> cfg . config = hal_cfg ;
374378
375- nrf_uarte_baudrate_set (uart_resources -> uarte .p_reg , uart_resources -> baudrate );
376- nrf_uarte_configure (uart_resources -> uarte .p_reg , & uart_resources -> hal_cfg );
379+ nrfx_uarte_reconfigure (& uart_resources -> uarte , & uart_resources -> cfg );
377380
378381 return ARM_DRIVER_OK ;
379382}
380383
381- static void disconnect_tx_rx_pin (uint32_t operation , UARTx_Resources * uart_resources )
384+ static int disconnect_tx_rx_pin (uint32_t operation , UARTx_Resources * uart_resources )
382385{
383- bool uart_enabled = nrf_uarte_enable_check (uart_resources -> uarte .p_reg );
384-
385- /* To update the PSEL register the UART needs to be disabled in case it is enabled */
386- if (uart_enabled ) {
387- nrf_uarte_disable (uart_resources -> uarte .p_reg );
388- }
389-
390386 switch (operation ) {
391387 case ARM_USART_CONTROL_RX :
392- nrf_uarte_rx_pin_set ( uart_resources -> uarte . p_reg , NRF_UARTE_PSEL_DISCONNECTED ) ;
393- break ;
388+ uart_resources -> cfg . rxd_pin = NRF_UARTE_PSEL_DISCONNECTED ;
389+ return nrfx_uarte_reconfigure ( & uart_resources -> uarte , & uart_resources -> cfg ) ;
394390 case ARM_USART_CONTROL_TX :
395- nrf_uarte_tx_pin_set ( uart_resources -> uarte . p_reg , NRF_UARTE_PSEL_DISCONNECTED ) ;
396- break ;
391+ uart_resources -> cfg . txd_pin = NRF_UARTE_PSEL_DISCONNECTED ;
392+ return nrfx_uarte_reconfigure ( & uart_resources -> uarte , & uart_resources -> cfg ) ;
397393 default :
398- break ;
399- }
400-
401- if (uart_enabled ) {
402- nrf_uarte_enable (uart_resources -> uarte .p_reg );
394+ return 0 ;
403395 }
404396}
405397
@@ -417,7 +409,13 @@ static int32_t ARM_USARTx_Control(uint32_t control, uint32_t arg, UARTx_Resource
417409 * which is used by the peripheral.
418410 */
419411 if (arg == 0 ) {
420- disconnect_tx_rx_pin (operation , uart_resources );
412+ int err_code = disconnect_tx_rx_pin (operation , uart_resources );
413+
414+ if (err_code == - EBUSY ) {
415+ return ARM_DRIVER_ERROR_BUSY ;
416+ } else if (err_code < 0 ) {
417+ return ARM_DRIVER_ERROR ;
418+ }
421419 }
422420 return ARM_DRIVER_OK ;
423421 default :
@@ -448,7 +446,9 @@ static ARM_USART_MODEM_STATUS ARM_USART_GetModemStatus(void)
448446 static UARTx_Resources UART##idx##_Resources = { \
449447 .uarte = NRFX_UARTE_INSTANCE(idx), \
450448 .uart_pins = UART##idx##_pins, \
451- .uart_pins_count = ARRAY_SIZE(UART##idx##_pins) \
449+ .uart_pins_count = ARRAY_SIZE(UART##idx##_pins), \
450+ .cfg = NRFX_UARTE_DEFAULT_CONFIG(NRF_UARTE_PSEL_DISCONNECTED, \
451+ NRF_UARTE_PSEL_DISCONNECTED), \
452452 }; \
453453 static int32_t ARM_USART##idx##_Initialize( \
454454 ARM_USART_SignalEvent_t cb_event) \
0 commit comments