Skip to content

Commit a8e8723

Browse files
authored
Merge pull request ARMmbed#12368 from mprse/NRF_Serial_Fpga_fix
Fix NRF52840_DK UART driver and adapt FPGA test
2 parents 563c116 + 8fda5a4 commit a8e8723

File tree

3 files changed

+35
-18
lines changed

3 files changed

+35
-18
lines changed

TESTS/mbed_hal_fpga_ci_test_shield/uart/main.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,9 @@ Case cases[] = {
338338
Case("38400, 8N1, FC off", one_peripheral<UARTNoFCPort, DefaultFormFactor, fpga_uart_test_common_no_fc<38400, 8, ParityNone, 1, false> >),
339339
Case("115200, 8N1, FC off", one_peripheral<UARTNoFCPort, DefaultFormFactor, fpga_uart_test_common_no_fc<115200, 8, ParityNone, 1, false> >),
340340
// stop bits
341+
#if !defined(UART_TWO_STOP_BITS_NOT_SUPPORTED)
341342
Case("9600, 8N2, FC off", one_peripheral<UARTNoFCPort, DefaultFormFactor, fpga_uart_test_common_no_fc<9600, 8, ParityNone, 2, false> >),
343+
#endif
342344

343345
#if DEVICE_SERIAL_FC
344346
// Every set of pins from every peripheral.
@@ -355,11 +357,16 @@ Case cases[] = {
355357
Case("115200, 8N1, FC on", one_peripheral<UARTPort, DefaultFormFactor, fpga_uart_test_common<115200, 8, ParityNone, 1, false> >),
356358
// data bits: not tested (some platforms support 8 bits only)
357359
// parity
360+
#if !defined(UART_ODD_PARITY_NOT_SUPPORTED)
358361
Case("9600, 8O1, FC on", one_peripheral<UARTPort, DefaultFormFactor, fpga_uart_test_common<9600, 8, ParityOdd, 1, false> >),
362+
#endif
359363
Case("9600, 8E1, FC on", one_peripheral<UARTPort, DefaultFormFactor, fpga_uart_test_common<9600, 8, ParityEven, 1, false> >),
360364
// stop bits
365+
#if !defined(UART_TWO_STOP_BITS_NOT_SUPPORTED)
361366
Case("9600, 8N2, FC on", one_peripheral<UARTPort, DefaultFormFactor, fpga_uart_test_common<9600, 8, ParityNone, 2, false> >),
362367
#endif
368+
#endif
369+
363370
};
364371

365372
utest::v1::status_t greentea_test_setup(const size_t number_of_cases)

targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/serial_api.c

+25-17
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,7 @@
105105
/**
106106
* Missing event typedefs.
107107
*/
108-
typedef enum
109-
{
108+
typedef enum {
110109
NRF_UARTE_EVENT_TXDRDY = offsetof(NRF_UARTE_Type, EVENTS_TXDRDY),
111110
} nrf_uarte_event_extra_t;
112111

@@ -505,8 +504,7 @@ static void nordic_nrf5_uart_event_handler_endrx_asynch(int instance)
505504
static void nordic_nrf5_uart_event_handler(int instance)
506505
{
507506
/* DMA buffer is full or has been swapped out by idle timeout. */
508-
if (nrf_uarte_event_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_ENDRX))
509-
{
507+
if (nrf_uarte_event_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_ENDRX)) {
510508
nrf_uarte_event_clear(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_ENDRX);
511509

512510
#if DEVICE_SERIAL_ASYNCH
@@ -528,16 +526,14 @@ static void nordic_nrf5_uart_event_handler(int instance)
528526
* will setup the wrong DMA buffer and cause data to be lost.
529527
*/
530528
if (nrf_uarte_event_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_RXSTARTED) &&
531-
!nrf_uarte_event_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_ENDRX))
532-
{
529+
!nrf_uarte_event_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_ENDRX)) {
533530
nrf_uarte_event_clear(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_RXSTARTED);
534531

535532
nordic_nrf5_uart_event_handler_rxstarted(instance);
536533
}
537534

538535
/* Tx DMA buffer has been sent. */
539-
if (nrf_uarte_event_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_ENDTX))
540-
{
536+
if (nrf_uarte_event_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_ENDTX)) {
541537
nrf_uarte_event_clear(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_ENDTX);
542538

543539
/* Use SWI to de-prioritize callback. */
@@ -691,7 +687,7 @@ static void nordic_nrf5_uart_configure_rx(int instance)
691687
{
692688
/* Disable interrupts during confiration. */
693689
nrf_uarte_int_disable(nordic_nrf5_uart_register[instance], NRF_UARTE_INT_RXSTARTED_MASK |
694-
NRF_UARTE_INT_ENDRX_MASK);
690+
NRF_UARTE_INT_ENDRX_MASK);
695691

696692
/* Clear FIFO buffer. */
697693
nrf_atfifo_clear(nordic_nrf5_uart_state[instance].fifo);
@@ -720,7 +716,7 @@ static void nordic_nrf5_uart_configure_rx(int instance)
720716

721717
/* Enable interrupts again. */
722718
nrf_uarte_int_enable(nordic_nrf5_uart_register[instance], NRF_UARTE_INT_RXSTARTED_MASK |
723-
NRF_UARTE_INT_ENDRX_MASK);
719+
NRF_UARTE_INT_ENDRX_MASK);
724720
}
725721

726722
#if DEVICE_SERIAL_ASYNCH
@@ -733,7 +729,7 @@ static void nordic_nrf5_uart_configure_rx_asynch(int instance)
733729
{
734730
/* Disable Rx related interrupts. */
735731
nrf_uarte_int_disable(nordic_nrf5_uart_register[instance], NRF_UARTE_INT_RXSTARTED_MASK |
736-
NRF_UARTE_INT_ENDRX_MASK);
732+
NRF_UARTE_INT_ENDRX_MASK);
737733

738734
/* Clear Rx related events. */
739735
nrf_uarte_event_clear(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_RXSTARTED);
@@ -803,7 +799,7 @@ static void nordic_nrf5_serial_configure(serial_t *obj)
803799
nrf_uarte_task_trigger(nordic_nrf5_uart_register[instance],
804800
NRF_UARTE_TASK_STARTRX);
805801

806-
/* Owner hasn't changed but mode has. Reconfigure. */
802+
/* Owner hasn't changed but mode has. Reconfigure. */
807803
} else if ((uart_object->rx_asynch == true) && (nordic_nrf5_uart_state[instance].rx_asynch == false)) {
808804

809805
nordic_nrf5_uart_configure_rx_asynch(instance);
@@ -942,8 +938,8 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
942938
bool done = false;
943939
do {
944940
done = nrf_uarte_event_check(nordic_nrf5_uart_register[instance],
945-
(nrf_uarte_event_t) NRF_UARTE_EVENT_TXDRDY);
946-
} while(done == false);
941+
(nrf_uarte_event_t) NRF_UARTE_EVENT_TXDRDY);
942+
} while (done == false);
947943
}
948944

949945
/* Store pins in serial object. */
@@ -1008,7 +1004,7 @@ void serial_free(serial_t *obj)
10081004
if (nordic_nrf5_uart_state[instance].usage_counter == 0) {
10091005

10101006
nrf_uarte_disable(nordic_nrf5_uart_register[instance]);
1011-
1007+
10121008
/* Turn NRF_UARTE0_BASE or NRF_UARTE1_BASE power off and on to reset peripheral. */
10131009
if (instance == 0) {
10141010
*(volatile uint32_t *)0x40002FFC = 0;
@@ -1022,7 +1018,7 @@ void serial_free(serial_t *obj)
10221018
*(volatile uint32_t *)0x40028FFC = 1;
10231019
}
10241020
#endif
1025-
1021+
10261022
}
10271023
}
10281024
}
@@ -1273,6 +1269,8 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
12731269
struct serial_s *uart_object = obj;
12741270
#endif
12751271

1272+
int instance = uart_object->instance;
1273+
12761274
/* Convert Mbed type to Nordic IRQ mask. */
12771275
uint32_t type = (irq == TxIrq) ? NORDIC_TX_IRQ : NORDIC_RX_IRQ;
12781276

@@ -1282,10 +1280,20 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
12821280
uart_object->mask |= type;
12831281
nordic_nrf5_serial_configure(obj);
12841282

1283+
/* It is required by Mbed HAL API to generate TxIrq interrupt when TXD register is empty (also after enabling TxIrq interrupt).
1284+
Driver uses DMA to perform uart transfer and TxIrq is generated after the transfer is finished.
1285+
Trigger TxIrq interrupt manually on enabling the TxIrq. */
1286+
if (irq == TxIrq) {
1287+
if (nrf_uarte_event_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_TXDRDY)) {
1288+
nordic_swi_tx_trigger(instance);
1289+
}
1290+
}
12851291
} else {
12861292

12871293
uart_object->mask &= ~type;
12881294
}
1295+
1296+
12891297
}
12901298

12911299
/** Get character. This is a blocking call, waiting for a character
@@ -1358,7 +1366,7 @@ void serial_putc(serial_t *obj, int character)
13581366
/* Wait until UART is ready to send next character. */
13591367
do {
13601368
done = nrf_uarte_event_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_TXDRDY);
1361-
} while(done == false);
1369+
} while (done == false);
13621370

13631371
nrf_uarte_event_clear(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_TXDRDY);
13641372

targets/targets.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -11484,7 +11484,9 @@
1148411484
"WSF_MAX_HANDLERS=10",
1148511485
"MBED_MPU_CUSTOM",
1148611486
"SWI_DISABLE0",
11487-
"NRF52_PAN_20"
11487+
"NRF52_PAN_20",
11488+
"UART_TWO_STOP_BITS_NOT_SUPPORTED",
11489+
"UART_ODD_PARITY_NOT_SUPPORTED"
1148811490
],
1148911491
"features": [
1149011492
"CRYPTOCELL310",

0 commit comments

Comments
 (0)