Commit Graph

42 Commits (feature-chip)

Author SHA1 Message Date
Mark Lamb 9ffd462a28 Support 31250 baud rate 2020-09-09 20:13:11 +01:00
Hugues Kamba f6d6d44346 NRF serial: Use nrf_uarte_event_t enum to avoid implicit conversion 2020-05-29 20:20:12 +01:00
Przemyslaw Stekiel 6a9b4bb64f TARGET_NRF52/serial_api.c: Fix style 2020-02-05 08:47:09 +01:00
Przemyslaw Stekiel fbe8a8e327 NRF52 serial: Trigger TxIrq interrupt manually on enabling
It is required by Mbed HAL API to generate TxIrq interrupt when TXD register is empty (also after enabling TxIrq interrupt):
f73a62afbf/hal/serial_api.h (L144-L147)

The driver uses DMA to perform uart transfer and TxIrq is generated after the transfer is finished.
While enabling TxIrq we will check if TXD reg is empty and manually trigger the interrupt.
2020-02-05 08:47:09 +01:00
George Beckstein d8fbfbfeb4 Replace macro "UART1_ENABLED" with corresponding "NRFX_UARTE1_ENABLED". 2020-01-10 11:33:11 -05:00
aglass0fmilk dc19460fa3 Remove use of deprecated UART driver (as opposed to UARTE). Disable unused TWIM peripheral (deprecated TWI peripheral is currently used for I2C master mode operation). 2020-01-09 16:35:06 -05:00
Rob Vlaar 6f31229f48 Workaround to reset UARTE peripheral to be able to go into deep sleep 2019-10-31 15:29:30 +00:00
desmond.chen d5624b6ec6 Fix nrf52 enabled uart count and enable uart0/1 2019-06-12 15:36:09 +08:00
RFulchiero 3343022f70 Remove redundant legacy files and definition of PACKED
* The following v14.2 files are removed from nrfx/legacy:
  nrf_drv_clock.h
  nrf_drv_common.h
  nrf_drv_gpiote.h
  nrf_drv_spi.h
  nrf_drv_twi.h
  nrf_drv_uarth.h
* Remove unneeded references to "nrfx_glue.h" and "nrf_drv_common.h"
* Remove the definition of PACKED from app_util_platform.h (already defined
  in mbed_toolchain.h)
2019-05-23 11:31:40 +08:00
RFulchiero 8237229530 Rebase to master in preparation for v5.12.0 2019-05-23 11:31:35 +08:00
Naveen Kaje b17601ef43 NRF52: Cleanup unused code 2019-05-23 11:31:29 +08:00
Naveen Kaje 8eaf87cd50 NRF52: serial: fix build warnings 2019-05-23 11:31:29 +08:00
RFulchiero 501000e6a2 Changes required for rebase:
- Brought in new nrfx APIs
 - Brought in PPI additions
 - Removed dead code for RTC
2019-05-23 11:31:28 +08:00
Naveen Kaje 8123b5128d serial_api: Fix the interrupt registration for Nordic Serial Device
Using the nrfx_get_irq_number only works with the handle. Since we
know the IRQ numbers for UART0, RTC2 and EGU0, use them directly.
2019-05-23 11:31:19 +08:00
Naveen Kaje 3ee440c9db serial_api: add changes to port from Softdevice 14.2 to 15.0 2019-05-23 11:31:18 +08:00
Naveen Kaje af8d171a73 serial_api: Fixes to compile with SDK15.0 2019-05-23 11:31:18 +08:00
RFulchiero 9ac7fe7ac9 First porting effort covered by JIRA IOTDEV-1572:
- top level files ported from TARGET_NORDIC/TARGET_NRF5x/

Also addressed:
- fixed linking issue for gcc
- added support for nRF52-DK builds, but reverted to using nRF52840 sdk_config.h (must be updated)
- introduced "RTC" to targets.json (might need to be removed eventually)
2019-05-23 11:31:17 +08:00
RFulchiero 511f8ebbd7 Mods for baseline 15.0 support 2019-05-23 11:31:13 +08:00
Kevin Bracey 87396e0bf6 Assembler atomics
Reimplement atomic code in inline assembly. This can improve
optimisation, and avoids potential architectural problems with using
LDREX/STREX intrinsics.

API further extended:
* Bitwise operations (fetch_and/fetch_or/fetch_xor)
* fetch_add and fetch_sub (like incr/decr, but returning old value -
  aligning with C++11)
* compare_exchange_weak
* Explicit memory order specification
* Basic freestanding template overloads for C++

This gives our existing C implementation essentially all the functionality
needed by C++11.

An actual Atomic<T> template based upon these C functions could follow.
2019-04-26 13:12:35 +03:00
Cruz Monrreal 59549b8eb4
Merge pull request #9616 from kjbracey-arm/nrf52_atomics
nRF52 serial: Tighten/simplify atomics
2019-02-20 11:58:34 -06:00
Russ Butler 8d205ab430 Add testing pinmaps to NRF5X devices
Add pinmap tables to the NRF5X families to allow testing.
2019-02-08 09:10:46 -06:00
Russ Butler 34c176654d Add HAL API for serial pinmap
Add the functions serial_tx_pinmap, serial_rx_pinmap, serial_cts_pinmap
and serial_rts_pinmap to all targets.
2019-02-08 09:10:28 -06:00
Kevin Bracey 5ed7e372db nRF52 serial: Tighten/simplify atomics
Use new atomics (exchange, load, store and bool types) to simplify
and improve the atomics in the nRF52 serial HAL.

* Ensure mutexes are released last and atomically when done
  done inside a critical section.
* Compare-and-swap is not required for the spinlock - exchange is
  sufficient. (Not clear a spinlock is needed anyway, but left in).
* Remove unneeded volatile, and make mutexes bool.
2019-02-05 15:44:04 +02:00
Russ Butler 131eed9b4f Fix rare NRF52 serial TX lockup
When using UARTSerial sending data over the uart follows the sequence
below:
<-TX done ISR runs and sets a software interrupt to pending
<-Software interrupt fires:
    -disables TX done interrupt
    -calls UARTSerial TX handler which sends bytes until the uart
     buffer filled (writeable returns false). Sending a byte
     re-enables the TX done interrupt continuing the cycle

Due to this sequence, if the UARTSerial TX handler does not send a byte
then the transmit state machine mentioned above will get stuck with
the TX done interrupt disabled. The events causing this failure:
<-TX done ISR runs and sets a software interrupt to pending
<-Software interrupt fires:
    -disables TX done interrupt
    -calls UARTSerial TX handler:
        -checks writeable which is true and sends a byte
            <- interrupted by a higher priority interrrupt
            <- TX done ISR runs, setting software interrupt to
               pending again
        -checks writeable which is true and sends a second byte
    -Software interrupt finishes
<-Software interrupt fires:
    -disables TX done interrupt
    -calls UARTSerial TX handler:
        -checks writeable which is false and DOES NOT SEND A BYTE
    -Software interrupt finishes, the TX interrupt is still disabled
*-Byte gets sent but TX done ISR does not fire

This patch prevents the TX lockup by removing the code in the
software interrupt which disables the TX done interrupt. Disabling the
TX done interrupt at this point is not necessary so this code is safe
to remove.
2018-11-29 19:09:04 -06:00
Russ Butler 4acdf7012c Disable all NRF52 serial interrupts on init
When initializing serial disable all interrupts as some of these may
have been enabled by a bootloader. This ensures that the NRF52
serial driver remains compatible with any bootloader version.
2018-11-21 14:37:20 -06:00
Russ Butler 9ce3965ae2 Add flow control for RX FIFO filling
When the RX FIFO is nearly full use flow control to stop receiving
data.
2018-11-19 19:21:46 -06:00
Russ Butler 59bb79b05b NRF52 Serial overhaul
Make the following enhancement:
-Support serial port use without flow control
-Prevent dropped bytes by updating flow control handling
-Remove dead code

Serial port use without flow control:
In the prior implementation there was a window of time between
reloading DMA buffers after a timeout where bytes could be dropped.
This is because the uart needed to be turned off in order to flush the
bytes in the DMA buffer.

This change configures the DMA buffer to only receive one byte at a
time so there is no need to disable the uart to flush it. After each
byte is received the DMA transfer will be over so the transfer will
never be partially complete and need flushing. Since the uart is
always on it is safe to use it even without flow control.

Prevent dropped bytes by updating flow control handling:
To prevent dropped bytes due to high latency the flow control handling
of the RTS line was configured to be asserted automatically by
hardware after each byte. Once the CPU has read the byte and setup
the next receive buffer the RTS line is deasserted to the transfer can
continue. This ensure that when flow control is enabled data won't be
lost due to interrupt latency.

Remove dead code:
With the above changes there is a lot of dead code, such as the timer
handling code. This patch removes the code that is no longer used.
2018-11-19 19:21:45 -06:00
Russ Butler 21dd8e40ab Configure NRF52 uart on interrupt attach
When attaching an irq to serial call nordic_nrf5_serial_configure.
This ensures the serial is ready to receive data at the correct
baudrate.
2018-11-16 17:35:54 -06:00
Marcus Chang bb98ce082e Make serial_putc for NRF52 non-blocking
Busy-wait before sending a charecter instead of after. If
serial_writeable has been called first, the busy-wait loop will
be skipped.

Added initialization code to ensure NRF_UARTE_EVENT_TXDRDY is
armed correctly.
2018-11-16 17:32:53 -06:00
Russ Butler 4cda158e55 Fix uart race condition dropping bytes on NRF52
In nordic_nrf5_uart_event_handler if the events NRF_UARTE_EVENT_ENDRX
and NRF_UARTE_EVENT_RXSTARTED become pending after the check for
NRF_UARTE_EVENT_ENDRX but before the check for
NRF_UARTE_EVENT_RXSTARTED the RX DMA buffers will be setup incorrectly
by nordic_nrf5_uart_event_handler_rxstarted because active_bank hasn't
been updated. This cause dropped and incorrect data.

This patch fixes that problem by adding a second check for
NRF_UARTE_EVENT_ENDRX after checking for NRF_UARTE_EVENT_RXSTARTED
and skipping processing if NRF_UARTE_EVENT_ENDRX is set. The
subsequent interrupt will process both in the correct order. This
ensures that these events cannot be handled out of order and thus fixes
the corruption.
2018-11-16 17:30:31 -06:00
Marcus Chang 1ad3b49599 Fix hardware flow control on NRF52 series
Due to buggy flow control logic in the UARTE, the stop signal
is not being set as it is supposed to when the the module is
not ready to receive data.

This commit signals the sender to halt transmitting when a DMA
buffer is full and only continue again when the atomic FIFO
buffer has been emptied. This allows platforms with hardware
flow control to minimize all buffers and rely on flow control
instead.
2018-10-24 13:11:12 -07:00
Cruz Monrreal 2b3f5bd486
Merge pull request #8061 from naveenkaje/push_uart_flow_control_fix
NRF52: Ensure that we configure hardware after flow control changes
2018-10-08 10:08:03 -05:00
Naveen Kaje 9e175db443 NRF52: Ensure that we configure hardware after flow control changes
Call the routines to program the hardware to reflect the updates made to
flow control so that the object and hardware are in synch.
2018-09-10 10:47:28 -05:00
Naveen Kaje 28c63ec0f3 NRF52: serial_api: Use polling for putc
There are scenarios where putc is called within a critical section, e.g
to log ASSERTs in early initialization code. The interrupts being
disabled here prevents the handlers for the UARTE from executing.
This breaks the tx_in_progress flag based approach. The tx_in_progress
never gets reset. Poll on the TXDRDY instead.

It can be recreated with a simple program as shown here:

*************** Current Behavior ****************
++ MbedOS Error Info ++
Error Status: 0x80FF0100 Code: 256 Module: 255
Error Message: F

************** With Fix *************************

++ MbedOS Error Info ++
Error Status: 0x80FF0100 Code: 256 Module: 255
Error Message: Fatal Run-time error
Location: 0x2C0A9
Error Value: 0x0
Current Thread: Id: 0x20005520 Entry: 0x30EBF StackSize: 0x1000 StackMem: 0x20004520 SP: 0x20005490
For more info, visit: https://armmbed.github.io/mbedos-error/?error=0x80FF0100
-- MbedOS Error Info --
nrf failure at .\main.cpp:22
***************************************************
2018-09-09 16:33:30 -05:00
Marcus Chang fd088d2c4e Allow STDIO pins to be NC in NRF52 series
Prevent ASSERT from triggering when one of the STDIO pins is not
connected.
2018-07-11 17:19:18 -07:00
Marcus Chang 4bb84fdb71 Change NRF52 series UART to only use one SWI channel
This fixes conflicts with the SoftDevice.
2018-07-09 12:54:09 -07:00
Marcus Chang a0224ed794 Fix interrupt initialization for NRF52 series
In some cases the UARTE interrupt would be enabled with pending
interrupts. This commit ensures that interrupts are only enabled
from a known state.
2018-07-02 11:13:50 -07:00
Marcus Chang fc087ab32c Fix race condition in serial_api.c for NRF52 series
* Elevate RTC2 interrupt priority to same level as UARTE to prevent
race condition on shared variables.
* Remove unused TXDRDY event code.
* Fix typo in macro.
2018-06-28 16:36:16 -07:00
Marcus Chang 6346ba87c0 Improve serial performance for NRF52 series
Time sensitive user callbacks are called through lowest priority
SWI handlers instead of the highest priority UART handler.
2018-06-25 17:15:40 -07:00
Marcus Chang ddc709acec Make serial_putc non-blocking for the NRF52 series
Previous implementation would block until character had been
completely sent, which is not what the API specifies.
2018-06-25 13:19:15 -07:00
Marcus Chang a42f1d7a81 Remove whitespace from NRF52 serial_api.c 2018-06-25 13:16:11 -07:00
Marcus Chang 1aebdcbee5 Reorganize TARGET_MCU_NRF51822_UNIFIED directories
The unified NRF51 target and feature BLE directories have been
reorganized to follow the naming and directory structure of the
NRF52 implementation.

This reorganization does not include TARGET_MCU_NRF51822 and
derived targets.
2018-05-08 10:10:01 -07:00