Skip to content

Commit

Permalink
platform: nordic_nrf: Set UART pins using pinctrl method
Browse files Browse the repository at this point in the history
Use the pinctrl method to define the UART pins for the nordic platform
UART driver.
This makes it easier to assign the UART pins from devicetree information
which is used in out-of-tree board support.

Change-Id: I8f18b730d705214670438b85c58032c6f32fff1c
Signed-off-by: Joakim Andersson <joakim.andersson@nordicsemi.no>
  • Loading branch information
joerchan authored and David Hu committed Oct 10, 2023
1 parent 10becb8 commit 70abd66
Show file tree
Hide file tree
Showing 6 changed files with 240 additions and 273 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,70 +16,31 @@
* limitations under the License.
*/

//-------- <<< Use Configuration Wizard in Context Menu >>> --------------------

#ifndef __RTE_DEVICE_H
#define __RTE_DEVICE_H

// <e> USART (Universal synchronous - asynchronous receiver transmitter) [Driver_USART0]
// <i> Configuration settings for Driver_USART0 in component ::Drivers:USART
#define RTE_USART0 1
// <h> Pin Selection (0xFFFFFFFF means Disconnected)
// <o> TXD
#define RTE_USART0_TXD_PIN 20
// <o> RXD
#define RTE_USART0_RXD_PIN 22
// <o> RTS
#define RTE_USART0_RTS_PIN 19
// <o> CTS
#define RTE_USART0_CTS_PIN 21
// </h> Pin Configuration
// </e> USART (Universal synchronous - asynchronous receiver transmitter) [Driver_USART0]
#include <nrf-pinctrl.h>

// <e> USART (Universal synchronous - asynchronous receiver transmitter) [Driver_USART1]
// <i> Configuration settings for Driver_USART1 in component ::Drivers:USART
#define RTE_USART1 1
// <h> Pin Selection (0xFFFFFFFF means Disconnected)
// <o> TXD
#define RTE_USART1_TXD_PIN 40
// <o> RXD
#define RTE_USART1_RXD_PIN 42
// <o> RTS
#define RTE_USART1_RTS_PIN 39
// <o> CTS
#define RTE_USART1_CTS_PIN 41
// </h> Pin Configuration
// </e> USART (Universal synchronous - asynchronous receiver transmitter) [Driver_USART1]
#define RTE_USART0 1

// <e> USART (Universal synchronous - asynchronous receiver transmitter) [Driver_USART2]
// <i> Configuration settings for Driver_USART2 in component ::Drivers:USART
#define RTE_USART2 0
// <h> Pin Selection (0xFFFFFFFF means Disconnected)
// <o> TXD
#define RTE_USART2_TXD_PIN 0xFFFFFFFF
// <o> RXD
#define RTE_USART2_RXD_PIN 0xFFFFFFFF
// <o> RTS
#define RTE_USART2_RTS_PIN 0xFFFFFFFF
// <o> CTS
#define RTE_USART2_CTS_PIN 0xFFFFFFFF
// </h> Pin Configuration
// </e> USART (Universal synchronous - asynchronous receiver transmitter) [Driver_USART2]
#define RTE_USART0_PINS \
{ \
NRF_PSEL(UART_TX, 0, 20), \
NRF_PSEL(UART_RX, 0, 22), \
NRF_PSEL(UART_RTS, 0, 19), \
NRF_PSEL(UART_CTS, 0, 21), \
}

// <e> USART (Universal synchronous - asynchronous receiver transmitter) [Driver_USART3]
// <i> Configuration settings for Driver_USART3 in component ::Drivers:USART
#define RTE_USART3 0
// <h> Pin Selection (0xFFFFFFFF means Disconnected)
// <o> TXD
#define RTE_USART3_TXD_PIN 0xFFFFFFFF
// <o> RXD
#define RTE_USART3_RXD_PIN 0xFFFFFFFF
// <o> RTS
#define RTE_USART3_RTS_PIN 0xFFFFFFFF
// <o> CTS
#define RTE_USART3_RTS_PIN 0xFFFFFFFF
// </h> Pin Configuration
// </e> USART (Universal synchronous - asynchronous receiver transmitter) [Driver_USART3]

#define RTE_USART1 1

#define RTE_USART1_PINS \
{ \
NRF_PSEL(UART_TX, 1, 8), \
NRF_PSEL(UART_RX, 1, 10), \
NRF_PSEL(UART_RTS, 1, 7), \
NRF_PSEL(UART_CTS, 1, 9), \
}

// <e> TWIM (Two-wire interface master) [Driver_TWIM2]
// <i> Configuration settings for Driver_TWIM2 in component ::Drivers:TWIM
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@
#include <RTE_Device.h>
#include <nrfx_uarte.h>
#include <string.h>
#include <stdint.h>
#include <nrf-pinctrl.h>
#include <array.h>

#ifndef ARG_UNUSED
#define ARG_UNUSED(arg) (void)arg
Expand All @@ -30,6 +33,43 @@

#if RTE_USART0 || RTE_USART1 || RTE_USART2 || RTE_USART3

#define PSEL_DISCONNECTED 0xFFFFFFFFUL

#define UART_CONFIG_INITIALIZER() \
{ \
.txd_pin = PSEL_DISCONNECTED, \
.rxd_pin = PSEL_DISCONNECTED, \
.rts_pin = PSEL_DISCONNECTED, \
.cts_pin = PSEL_DISCONNECTED, \
.baudrate = NRF_UARTE_BAUDRATE_115200, \
.interrupt_priority = NRFX_UARTE_DEFAULT_CONFIG_IRQ_PRIORITY, \
.config = { \
.hwfc = NRF_UARTE_HWFC_DISABLED, \
.parity = NRF_UARTE_PARITY_EXCLUDED, \
.stop = NRF_UARTE_STOP_ONE, \
}, \
}

void uart_config_set_uart_pins(nrfx_uarte_config_t *uart_config,
const uint32_t uart_pins[],
size_t uart_pins_count)
{
for (size_t i = 0; i < uart_pins_count; i++) {
uint32_t psel = NRF_GET_PIN(uart_pins[i]);

if (psel == NRF_PIN_DISCONNECTED) {
psel = PSEL_DISCONNECTED;
}

switch (NRF_GET_FUN(uart_pins[i])) {
case NRF_FUN_UART_TX: uart_config->txd_pin = psel; break;
case NRF_FUN_UART_RX: uart_config->rxd_pin = psel; break;
case NRF_FUN_UART_RTS: uart_config->rts_pin = psel; break;
case NRF_FUN_UART_CTS: uart_config->cts_pin = psel; break;
}
}
}

static const ARM_DRIVER_VERSION DriverVersion = {
ARM_USART_API_VERSION,
ARM_USART_DRV_VERSION
Expand All @@ -41,7 +81,8 @@ static const ARM_USART_CAPABILITIES DriverCapabilities = {

typedef struct {
const nrfx_uarte_t uarte;
const nrfx_uarte_config_t *initial_config;
const uint32_t *uart_pins;
size_t uart_pins_count;
size_t tx_count;
size_t rx_count;
nrf_uarte_config_t hal_cfg;
Expand All @@ -64,17 +105,23 @@ static int32_t ARM_USARTx_Initialize(ARM_USART_SignalEvent_t cb_event,
{
ARG_UNUSED(cb_event);

nrfx_uarte_config_t uart_config = UART_CONFIG_INITIALIZER();

uart_config_set_uart_pins(&uart_config,
uart_resources->uart_pins,
uart_resources->uart_pins_count);

nrfx_err_t err_code = nrfx_uarte_init(&uart_resources->uarte,
uart_resources->initial_config,
&uart_config,
NULL);
if (err_code != NRFX_SUCCESS) {
return ARM_DRIVER_ERROR_BUSY;
}

uart_resources->tx_count = 0;
uart_resources->rx_count = 0;
uart_resources->hal_cfg = uart_resources->initial_config->config;
uart_resources->baudrate = uart_resources->initial_config->baudrate;
uart_resources->hal_cfg = uart_config.config;
uart_resources->baudrate = uart_config.baudrate;

uart_resources->initialized = true;
return ARM_DRIVER_OK;
Expand Down Expand Up @@ -299,22 +346,11 @@ static ARM_USART_MODEM_STATUS ARM_USART_GetModemStatus(void)
}

#define DRIVER_USART(idx) \
static nrfx_uarte_config_t UART##idx##_initial_config = { \
.txd_pin = RTE_USART##idx##_TXD_PIN, \
.rxd_pin = RTE_USART##idx##_RXD_PIN, \
.rts_pin = RTE_USART##idx##_RTS_PIN, \
.cts_pin = RTE_USART##idx##_CTS_PIN, \
.baudrate = NRF_UARTE_BAUDRATE_115200, \
.interrupt_priority = NRFX_UARTE_DEFAULT_CONFIG_IRQ_PRIORITY, \
.config = { \
.hwfc = RTE_USART##idx##_HWFC, \
.parity = NRF_UARTE_PARITY_EXCLUDED, \
.stop = NRF_UARTE_STOP_ONE, \
}, \
}; \
static const uint32_t UART##idx##_pins[] = RTE_USART##idx##_PINS; \
static UARTx_Resources UART##idx##_Resources = { \
.uarte = NRFX_UARTE_INSTANCE(idx), \
.initial_config = &UART##idx##_initial_config, \
.uart_pins = UART##idx##_pins, \
.uart_pins_count = ARRAY_SIZE(UART##idx##_pins) \
}; \
static int32_t ARM_USART##idx##_Initialize( \
ARM_USART_SignalEvent_t cb_event) \
Expand Down
111 changes: 111 additions & 0 deletions platform/ext/target/nordic_nrf/common/core/common/nrf-pinctrl.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
/*
* Copyright (c) 2021 Nordic Semiconductor ASA
* SPDX-License-Identifier: Apache-2.0
*/

#ifndef NRF_INCLUDE_NRF_PINCTRL_H
#define NRF_INCLUDE_NRF_PINCTRL_H

/*
* The whole nRF pin configuration information is encoded in a 32-bit bitfield
* organized as follows:
*
* - 31..16: Pin function.
* - 15: Reserved.
* - 14: Pin inversion mode.
* - 13: Pin low power mode.
* - 12..9: Pin output drive configuration.
* - 8..7: Pin pull configuration.
* - 6..0: Pin number (combination of port and pin).
*/

/**
* @name nRF pin configuration bit field positions and masks.
* @{
*/

/** Position of the function field. */
#define NRF_FUN_POS 16U
/** Mask for the function field. */
#define NRF_FUN_MSK 0xFFFFU
/** Position of the invert field. */
#define NRF_INVERT_POS 14U
/** Mask for the invert field. */
#define NRF_INVERT_MSK 0x1U
/** Position of the low power field. */
#define NRF_LP_POS 13U
/** Mask for the low power field. */
#define NRF_LP_MSK 0x1U
/** Position of the drive configuration field. */
#define NRF_DRIVE_POS 9U
/** Mask for the drive configuration field. */
#define NRF_DRIVE_MSK 0xFU
/** Position of the pull configuration field. */
#define NRF_PULL_POS 7U
/** Mask for the pull configuration field. */
#define NRF_PULL_MSK 0x3U
/** Position of the pin field. */
#define NRF_PIN_POS 0U
/** Mask for the pin field. */
#define NRF_PIN_MSK 0x7FU

/** @} */

/**
* @name nRF pinctrl pin functions.
* @{
*/

/** UART TX */
#define NRF_FUN_UART_TX 0U
/** UART RX */
#define NRF_FUN_UART_RX 1U
/** UART RTS */
#define NRF_FUN_UART_RTS 2U
/** UART CTS */
#define NRF_FUN_UART_CTS 3U

/** Indicates that a pin is disconnected */
#define NRF_PIN_DISCONNECTED NRF_PIN_MSK

/** @} */

/**
* @brief Utility macro to build nRF psels property entry.
*
* @param fun Pin function configuration (see NRF_FUNC_{name} macros).
* @param port Port (0 or 1).
* @param pin Pin (0..31).
*/
#define NRF_PSEL(fun, port, pin) \
((((((port) * 32U) + (pin)) & NRF_PIN_MSK) << NRF_PIN_POS) | \
((NRF_FUN_ ## fun & NRF_FUN_MSK) << NRF_FUN_POS))

/**
* @brief Utility macro to build nRF psels property entry when a pin is disconnected.
*
* This can be useful in situations where code running before Zephyr, e.g. a bootloader
* configures pins that later needs to be disconnected.
*
* @param fun Pin function configuration (see NRF_FUN_{name} macros).
*/
#define NRF_PSEL_DISCONNECTED(fun) \
(NRF_PIN_DISCONNECTED | \
((NRF_FUN_ ## fun & NRF_FUN_MSK) << NRF_FUN_POS))

/**
* @brief Utility macro to obtain pin function.
*
* @param pincfg Pin configuration bit field.
*/
#define NRF_GET_FUN(pincfg) (((pincfg) >> NRF_FUN_POS) & NRF_FUN_MSK)


/**
* @brief Utility macro to obtain port and pin combination.
*
* @param pincfg Pin configuration bit field.
*/
#define NRF_GET_PIN(pincfg) (((pincfg) >> NRF_PIN_POS) & NRF_PIN_MSK)

#endif /* NRF_INCLUDE_NRF_PINCTRL_H */
Loading

0 comments on commit 70abd66

Please sign in to comment.