Skip to content

Commit 9de84c3

Browse files
masz-nordicjaz1-nordic
authored andcommitted
platform: nrf: driver: usart: align to nrfx 4.0 and refactor
Align with changes needed for nrfx 4.0. Refactor to use nrfx layer instead of HAL. Signed-off-by: Marcin Szymczyk <marcin.szymczyk@nordicsemi.no>
1 parent 41d156a commit 9de84c3

File tree

1 file changed

+66
-66
lines changed
  • platform/ext/target/nordic_nrf/common/core/cmsis_drivers

1 file changed

+66
-66
lines changed

platform/ext/target/nordic_nrf/common/core/cmsis_drivers/Driver_USART.c

Lines changed: 66 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -42,23 +42,6 @@
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-
6245
void 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

9174
typedef 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

10283
static 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

144121
static 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,
181156
static 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,
214189
static 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)
253257
static 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

Comments
 (0)