Skip to content

Commit

Permalink
cpu/nrf5x_common: fix uart_poweroff()
Browse files Browse the repository at this point in the history
Previously, uart_poweroff() and uart_poweron() were no-ops. This
replaces them with the logic to indeed power on and power off the UART
device.

Co-authored-by: crasbe <[email protected]>
  • Loading branch information
maribu and crasbe committed May 6, 2024
1 parent a5996e2 commit 65a0aa1
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 6 deletions.
36 changes: 30 additions & 6 deletions cpu/nrf5x_common/periph/uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
* @}
*/

#include <assert.h>
#include <stdint.h>
#include <string.h>

Expand Down Expand Up @@ -99,6 +100,28 @@ enum {
UART_ISR_NUMOF,
};

static inline void set_power(uart_t uart, bool value)
{
UART_TYPE *dev = uart_config[uart].dev;

if (value) {
dev->ENABLE = ENABLE_ON;
}
else {
dev->ENABLE = ENABLE_OFF;
}

#ifndef UARTE_PRESENT
dev->POWER = value;
#endif
}

static inline bool get_power(uart_t uart)
{
UART_TYPE *dev = uart_config[uart].dev;
return dev->ENABLE != ENABLE_OFF;
}

int uart_init(uart_t uart, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg)
{
/* ensure the ISR names have been defined as needed */
Expand All @@ -115,11 +138,6 @@ int uart_init(uart_t uart, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg)
isr_ctx[uart].rx_cb = rx_cb;
isr_ctx[uart].arg = arg;

#ifndef UARTE_PRESENT
/* only the legacy non-EasyDMA UART needs to be powered on explicitly */
dev->POWER = 1;
#endif

/* reset configuration registers */
dev->CONFIG = 0;

Expand Down Expand Up @@ -206,7 +224,7 @@ int uart_init(uart_t uart, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg)
}

/* enable the UART device */
dev->ENABLE = ENABLE_ON;
set_power(uart, true);

#ifdef MODULE_PERIPH_UART_NONBLOCKING
/* set up the TX buffer */
Expand Down Expand Up @@ -242,6 +260,7 @@ void uart_poweron(uart_t uart)

if (isr_ctx[uart].rx_cb) {
uart_config[uart].dev->TASKS_STARTRX = 1;
set_power(uart, true);
}
}

Expand All @@ -250,6 +269,7 @@ void uart_poweroff(uart_t uart)
assume((unsigned)uart < UART_NUMOF);

uart_config[uart].dev->TASKS_STOPRX = 1;
set_power(uart, false);
}

/* Unify macro names across nRF51 (UART) and nRF52 and newer (UARTE) */
Expand Down Expand Up @@ -335,6 +355,10 @@ static void _write_buf(uart_t uart, const uint8_t *data, size_t len)
void uart_write(uart_t uart, const uint8_t *data, size_t len)
{
assume((unsigned)uart < UART_NUMOF);
if (!get_power(uart)) {
/* Device is powered down. Writing anyway would deadlock */
return;
}
#ifdef MODULE_PERIPH_UART_NONBLOCKING
for (size_t i = 0; i < len; i++) {
/* in IRQ or interrupts disabled */
Expand Down
2 changes: 2 additions & 0 deletions dist/tools/bmp/bmp.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,9 @@ def connect_to_target(port):
else:
print("scanning using JTAG...")
res = gdbmi.write('monitor jtag_scan', timeout_sec=TIMEOUT)
print(res)
targets = detect_targets(gdbmi, res)
print(targets)
assert len(targets) > 0, "no targets found"
print("found following targets:")
for t in targets:
Expand Down

0 comments on commit 65a0aa1

Please sign in to comment.