summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaofeng <[email protected]>2020-11-15 18:46:28 +0800
committerMaofeng <[email protected]>2020-11-15 18:46:28 +0800
commitffd34fd369f06880c0f585e922f09adb3d4d2f8d (patch)
tree582b99b773a9130e30c8a5a27faddf27a6acb0cc
parent065488e74652806a9f58055d5fbb644fda338ae5 (diff)
[bsp/nrf5x]support for uarte1
-rw-r--r--bsp/nrf5x/libraries/drivers/SConscript6
-rw-r--r--bsp/nrf5x/libraries/drivers/drv_uarte.c281
-rw-r--r--bsp/nrf5x/libraries/drivers/drv_uarte.h33
-rw-r--r--bsp/nrf5x/nrf52832/board/Kconfig45
-rw-r--r--bsp/nrf5x/nrf52840/board/Kconfig59
5 files changed, 409 insertions, 15 deletions
diff --git a/bsp/nrf5x/libraries/drivers/SConscript b/bsp/nrf5x/libraries/drivers/SConscript
index f8629162f2..611b52d993 100644
--- a/bsp/nrf5x/libraries/drivers/SConscript
+++ b/bsp/nrf5x/libraries/drivers/SConscript
@@ -9,8 +9,10 @@ src = Split("""
""")
if GetDepend(['BSP_USING_UART']):
- src += ['drv_uart.c']
-
+ if GetDepend(['NRFX_USING_UART']):
+ src += ['drv_uart.c']
+ else:
+ src += ['drv_uarte.c']
if GetDepend(['BSP_USING_ON_CHIP_FLASH']):
src += ['drv_flash.c']
diff --git a/bsp/nrf5x/libraries/drivers/drv_uarte.c b/bsp/nrf5x/libraries/drivers/drv_uarte.c
new file mode 100644
index 0000000000..680ae599f3
--- /dev/null
+++ b/bsp/nrf5x/libraries/drivers/drv_uarte.c
@@ -0,0 +1,281 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-04-28 xckhmf Modify for <nrfx>
+ * 2020-10-31 xckhmf Support for UART1
+ *
+ */
+#include <rtdevice.h>
+#include <nrfx_uarte.h>
+#include "drv_uart.h"
+
+#ifdef BSP_USING_UART
+#if defined(BSP_USING_UART0) || defined(BSP_USING_UART1)
+typedef struct
+{
+ struct rt_serial_device *serial;
+ nrfx_uarte_t uarte_instance;
+ uint8_t rx_length;
+ uint8_t tx_buffer[1];
+ uint8_t rx_buffer[1];
+ bool isInit;
+ uint32_t rx_pin;
+ uint32_t tx_pin;
+} drv_uart_cb_t;
+
+#ifdef BSP_USING_UART0
+static struct rt_serial_device m_serial_0;
+drv_uart_cb_t m_uarte0_cb = {
+ .uarte_instance = NRFX_UARTE_INSTANCE(0),
+ .rx_length = 0,
+ .rx_pin = BSP_UART0_RX_PIN,
+ .tx_pin = BSP_UART0_TX_PIN,
+ .isInit = false
+};
+#endif /* BSP_USING_UART0 */
+
+#ifdef BSP_USING_UART1
+static struct rt_serial_device m_serial_1;
+drv_uart_cb_t m_uarte1_cb = {
+ .uarte_instance = NRFX_UARTE_INSTANCE(1),
+ .rx_length = 0,
+ .rx_pin = BSP_UART1_RX_PIN,
+ .tx_pin = BSP_UART1_TX_PIN,
+ .isInit = false
+};
+#endif /* BSP_USING_UART1 */
+
+static void uarte_evt_handler(nrfx_uarte_event_t const * p_event,
+ void * p_context)
+{
+ drv_uart_cb_t *p_cb = RT_NULL;
+ p_cb = (drv_uart_cb_t*)p_context;
+ switch (p_event->type)
+ {
+ case NRFX_UARTE_EVT_RX_DONE:
+ p_cb->rx_length = p_event->data.rxtx.bytes;
+ if(p_cb->serial->parent.open_flag&RT_DEVICE_FLAG_INT_RX)
+ {
+ rt_hw_serial_isr(p_cb->serial, RT_SERIAL_EVENT_RX_IND);
+ }
+ (void)nrfx_uarte_rx(&(p_cb->uarte_instance), p_cb->rx_buffer, 1);
+ break;
+
+ case NRFX_UARTE_EVT_ERROR:
+ (void)nrfx_uarte_rx(&(p_cb->uarte_instance), p_cb->rx_buffer, 1);
+ break;
+
+ case NRFX_UARTE_EVT_TX_DONE:
+ if(p_cb->serial->parent.open_flag&RT_DEVICE_FLAG_INT_TX)
+ {
+ rt_hw_serial_isr(p_cb->serial, RT_SERIAL_EVENT_TX_DONE);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+static rt_err_t _uart_cfg(struct rt_serial_device *serial, struct serial_configure *cfg)
+{
+ nrfx_uarte_config_t config = NRFX_UARTE_DEFAULT_CONFIG(NRF_UARTE_PSEL_DISCONNECTED,\
+ NRF_UARTE_PSEL_DISCONNECTED);
+
+ drv_uart_cb_t *p_cb = RT_NULL;
+
+ RT_ASSERT(serial != RT_NULL);
+ RT_ASSERT(cfg != RT_NULL);
+
+ if (serial->parent.user_data == RT_NULL)
+ {
+ return -RT_ERROR;
+ }
+ p_cb = (drv_uart_cb_t*)serial->parent.user_data;
+ if(p_cb->isInit)
+ {
+ nrfx_uarte_uninit(&(p_cb->uarte_instance));
+ p_cb->isInit = false;
+ }
+
+ switch (cfg->baud_rate)
+ {
+ case BAUD_RATE_2400:
+ config.baudrate = NRF_UARTE_BAUDRATE_2400;
+ break;
+ case BAUD_RATE_4800:
+ config.baudrate = NRF_UARTE_BAUDRATE_4800;
+ break;
+ case BAUD_RATE_9600:
+ config.baudrate = NRF_UARTE_BAUDRATE_9600;
+ break;
+ case BAUD_RATE_19200:
+ config.baudrate = NRF_UARTE_BAUDRATE_19200;
+ break;
+ case BAUD_RATE_38400:
+ config.baudrate = NRF_UARTE_BAUDRATE_38400;
+ break;
+ case BAUD_RATE_57600:
+ config.baudrate = NRF_UARTE_BAUDRATE_57600;
+ break;
+ case BAUD_RATE_115200:
+ config.baudrate = NRF_UARTE_BAUDRATE_115200;
+ break;
+ case BAUD_RATE_230400:
+ config.baudrate = NRF_UARTE_BAUDRATE_230400;
+ break;
+ case BAUD_RATE_460800:
+ config.baudrate = NRF_UARTE_BAUDRATE_460800;
+ break;
+ case BAUD_RATE_921600:
+ config.baudrate = NRF_UARTE_BAUDRATE_921600;
+ break;
+ case BAUD_RATE_2000000:
+ case BAUD_RATE_3000000:
+ return -RT_EINVAL;
+ default:
+ config.baudrate = NRF_UARTE_BAUDRATE_115200;
+ break;
+ }
+ config.hal_cfg.parity = (cfg->parity == PARITY_NONE)?\
+ NRF_UARTE_PARITY_EXCLUDED:NRF_UARTE_PARITY_INCLUDED;
+ config.hal_cfg.hwfc = NRF_UARTE_HWFC_DISABLED;
+ config.pselrxd = p_cb->rx_pin;
+ config.pseltxd = p_cb->tx_pin;
+ config.p_context = (void *)p_cb;
+
+ nrfx_uarte_init(&(p_cb->uarte_instance),(nrfx_uarte_config_t const *)&config,uarte_evt_handler);
+ nrfx_uarte_rx(&(p_cb->uarte_instance),p_cb->rx_buffer,1);
+ p_cb->isInit = true;
+ return RT_EOK;
+}
+
+static rt_err_t _uart_ctrl(struct rt_serial_device *serial, int cmd, void *arg)
+{
+ drv_uart_cb_t *p_cb = RT_NULL;
+ RT_ASSERT(serial != RT_NULL);
+
+ if (serial->parent.user_data == RT_NULL)
+ {
+ return -RT_ERROR;
+ }
+ p_cb = (drv_uart_cb_t*)serial->parent.user_data;
+
+ switch (cmd)
+ {
+ /* disable interrupt */
+ case RT_DEVICE_CTRL_CLR_INT:
+ break;
+
+ /* enable interrupt */
+ case RT_DEVICE_CTRL_SET_INT:
+ break;
+
+ case RT_DEVICE_CTRL_CUSTOM:
+ if ((rt_uint32_t)(arg) == UART_CONFIG_BAUD_RATE_9600)
+ {
+ p_cb->serial->config.baud_rate = 9600;
+ }
+ else if ((rt_uint32_t)(arg) == UART_CONFIG_BAUD_RATE_115200)
+ {
+ p_cb->serial->config.baud_rate = 115200;
+ }
+ _uart_cfg(serial, &(serial->config));
+ break;
+
+ case RT_DEVICE_CTRL_PIN:
+ _uart_cfg(serial, &(serial->config));
+ break;
+
+ case RT_DEVICE_POWERSAVE:
+ if(p_cb->isInit)
+ {
+ nrfx_uarte_uninit(&(p_cb->uarte_instance));
+ p_cb->isInit = false;
+ }
+ break;
+
+ case RT_DEVICE_WAKEUP:
+ _uart_cfg(serial, &(serial->config));
+ break;
+
+ default:
+ return -RT_ERROR;
+ }
+
+ return RT_EOK;
+}
+
+static int _uart_putc(struct rt_serial_device *serial, char c)
+{
+ drv_uart_cb_t *p_cb = RT_NULL;
+ int rtn = -1;
+ RT_ASSERT(serial != RT_NULL);
+
+ if (serial->parent.user_data != RT_NULL)
+ {
+ p_cb = (drv_uart_cb_t*)serial->parent.user_data;
+ }
+ p_cb->tx_buffer[0] = c;
+ nrfx_uarte_tx(&(p_cb->uarte_instance),p_cb->tx_buffer,1);
+ if(!(serial->parent.open_flag&RT_DEVICE_FLAG_INT_TX))
+ {
+ while(nrfx_uarte_tx_in_progress(&(p_cb->uarte_instance)))
+ {
+ }
+ }
+ return rtn;
+}
+
+static int _uart_getc(struct rt_serial_device *serial)
+{
+ int ch = -1;
+ drv_uart_cb_t *p_cb = RT_NULL;
+ RT_ASSERT(serial != RT_NULL);
+
+ if (serial->parent.user_data != RT_NULL)
+ {
+ p_cb = (drv_uart_cb_t*)serial->parent.user_data;
+ }
+ if(p_cb->rx_length)
+ {
+ ch = p_cb->rx_buffer[0];
+ p_cb->rx_length--;
+ }
+ return ch;
+}
+
+static struct rt_uart_ops _uart_ops = {
+ _uart_cfg,
+ _uart_ctrl,
+ _uart_putc,
+ _uart_getc
+};
+
+void rt_hw_uart_init(void)
+{
+ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
+
+#ifdef BSP_USING_UART0
+ m_serial_0.config = config;
+ m_serial_0.ops = &_uart_ops;
+ m_uarte0_cb.serial = &m_serial_0;
+ rt_hw_serial_register(&m_serial_0, "uart0", \
+ RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX , &m_uarte0_cb);
+#endif /* BSP_USING_UART0 */
+
+#ifdef BSP_USING_UART1
+ m_serial_1.config = config;
+ m_serial_1.ops = &_uart_ops;
+ m_uarte1_cb.serial = &m_serial_1;
+ rt_hw_serial_register(&m_serial_1, "uart1", \
+ RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX |RT_DEVICE_FLAG_INT_TX, &m_uarte1_cb);
+#endif /* BSP_USING_UART1 */
+
+}
+#endif /* defined(BSP_USING_UART0) || defined(BSP_USING_UART1) */
+#endif /* BSP_USING_UART */
diff --git a/bsp/nrf5x/libraries/drivers/drv_uarte.h b/bsp/nrf5x/libraries/drivers/drv_uarte.h
new file mode 100644
index 0000000000..f07ddafd79
--- /dev/null
+++ b/bsp/nrf5x/libraries/drivers/drv_uarte.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-04-28 xckhmf Modify for <nrfx>
+ * 2020-10-31 xckhmf Support for UART1
+ *
+ */
+#ifndef __DRV_UART_H__
+#define __DRV_UART_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define RT_DEVICE_CTRL_CUSTOM 0x20
+#define RT_DEVICE_CTRL_PIN 0x21
+#define RT_DEVICE_POWERSAVE 0x22
+#define RT_DEVICE_WAKEUP 0x23
+
+#define UART_CONFIG_BAUD_RATE_9600 1
+#define UART_CONFIG_BAUD_RATE_115200 2
+
+void rt_hw_uart_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __DRV_UART_H__ */
diff --git a/bsp/nrf5x/nrf52832/board/Kconfig b/bsp/nrf5x/nrf52832/board/Kconfig
index 2750ceacc2..9f7b1e89d7 100644
--- a/bsp/nrf5x/nrf52832/board/Kconfig
+++ b/bsp/nrf5x/nrf52832/board/Kconfig
@@ -157,12 +157,24 @@ menu "On-chip Peripheral Drivers"
endif
- menuconfig BSP_USING_UART
- bool "Enable UART"
+ config BSP_USING_UART
+ bool "Enable UART"
default y
select RT_USING_SERIAL
-
- if BSP_USING_UART
+ if BSP_USING_UART
+ choice
+ prompt "UART or UARTE"
+ default NRFX_USING_UART
+ help
+ Select the UART or UARTE
+ config NRFX_USING_UART
+ bool "UART"
+
+ config NRFX_USING_UARTE
+ bool "UARTE"
+ endchoice
+ endif
+ if BSP_USING_UART&&NRFX_USING_UART
config NRFX_UART_ENABLED
int
default 1
@@ -183,9 +195,28 @@ menu "On-chip Peripheral Drivers"
range 0 31
default 6
endif
- config BSP_USING_UART1
- bool "Enable UART1"
- default n
+ endif
+ if BSP_USING_UART&&NRFX_USING_UARTE
+ config NRFX_UARTE_ENABLED
+ int
+ default 1
+
+ config BSP_USING_UART0
+ bool "Enable UARTE0"
+ default n
+ if BSP_USING_UART0
+ config NRFX_UARTE0_ENABLED
+ int
+ default 1
+ config BSP_UART0_RX_PIN
+ int "uarte0 rx pin number"
+ range 0 31
+ default 8
+ config BSP_UART0_TX_PIN
+ int "uarte0 tx pin number"
+ range 0 31
+ default 6
+ endif
endif
config BSP_USING_SPI
diff --git a/bsp/nrf5x/nrf52840/board/Kconfig b/bsp/nrf5x/nrf52840/board/Kconfig
index 9ec3b5c71f..4015c3fa95 100644
--- a/bsp/nrf5x/nrf52840/board/Kconfig
+++ b/bsp/nrf5x/nrf52840/board/Kconfig
@@ -194,12 +194,24 @@ menu "On-chip Peripheral Drivers"
endif
- menuconfig BSP_USING_UART
- bool "Enable UART"
+ config BSP_USING_UART
+ bool "Enable UART"
default y
select RT_USING_SERIAL
-
- if BSP_USING_UART
+ if BSP_USING_UART
+ choice
+ prompt "UART or UARTE"
+ default NRFX_USING_UART
+ help
+ Select the UART or UARTE
+ config NRFX_USING_UART
+ bool "UART"
+
+ config NRFX_USING_UARTE
+ bool "UARTE"
+ endchoice
+ endif
+ if BSP_USING_UART&&NRFX_USING_UART
config NRFX_UART_ENABLED
int
default 1
@@ -220,9 +232,44 @@ menu "On-chip Peripheral Drivers"
range 0 31
default 6
endif
+ endif
+ if BSP_USING_UART&&NRFX_USING_UARTE
+ config NRFX_UARTE_ENABLED
+ int
+ default 1
+
+ config BSP_USING_UART0
+ bool "Enable UARTE0"
+ default n
+ if BSP_USING_UART0
+ config NRFX_UARTE0_ENABLED
+ int
+ default 1
+ config BSP_UART0_RX_PIN
+ int "uarte0 rx pin number"
+ range 0 31
+ default 8
+ config BSP_UART0_TX_PIN
+ int "uarte0 tx pin number"
+ range 0 31
+ default 6
+ endif
config BSP_USING_UART1
- bool "Enable UART1"
- default n
+ bool "Enable UARTE1"
+ default n
+ if BSP_USING_UART1
+ config NRFX_UARTE1_ENABLED
+ int
+ default 1
+ config BSP_UART1_RX_PIN
+ int "uarte1 rx pin number"
+ range 0 31
+ default 7
+ config BSP_UART1_TX_PIN
+ int "uarte1 tx pin number"
+ range 0 31
+ default 5
+ endif
endif
config BSP_USING_SPI