summaryrefslogtreecommitdiff
path: root/bsp/nuclei/libraries
diff options
context:
space:
mode:
authorHuaqi Fang <[email protected]>2020-09-01 08:47:21 +0800
committerHuaqi Fang <[email protected]>2020-09-01 08:47:21 +0800
commit25709dca1ca64e611a062b6d2f8393464e36b246 (patch)
treefa790d348d7b6aef68003e12a71b12efe6bc728b /bsp/nuclei/libraries
parentd272c9aaf71746708d0da9cf202c0b0995a24c3d (diff)
bsp/nuclei: Add initial bsp support for Nuclei HummingBird SoC
Signed-off-by: Huaqi Fang <[email protected]>
Diffstat (limited to 'bsp/nuclei/libraries')
-rw-r--r--bsp/nuclei/libraries/hbird/HAL_Drivers/SConscript18
-rw-r--r--bsp/nuclei/libraries/hbird/HAL_Drivers/drv_config.h26
-rw-r--r--bsp/nuclei/libraries/hbird/HAL_Drivers/drv_uart.c245
-rw-r--r--bsp/nuclei/libraries/hbird/HAL_Drivers/drv_uart.h36
4 files changed, 325 insertions, 0 deletions
diff --git a/bsp/nuclei/libraries/hbird/HAL_Drivers/SConscript b/bsp/nuclei/libraries/hbird/HAL_Drivers/SConscript
new file mode 100644
index 0000000000..b78b343751
--- /dev/null
+++ b/bsp/nuclei/libraries/hbird/HAL_Drivers/SConscript
@@ -0,0 +1,18 @@
+Import('RTT_ROOT')
+Import('rtconfig')
+from building import *
+
+cwd = GetCurrentDir()
+
+# add the general drivers.
+src = Split("""
+""")
+
+if GetDepend(['RT_USING_SERIAL']):
+ src += ['drv_uart.c']
+
+path = [cwd]
+
+group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path)
+
+Return('group')
diff --git a/bsp/nuclei/libraries/hbird/HAL_Drivers/drv_config.h b/bsp/nuclei/libraries/hbird/HAL_Drivers/drv_config.h
new file mode 100644
index 0000000000..2c85a4eca0
--- /dev/null
+++ b/bsp/nuclei/libraries/hbird/HAL_Drivers/drv_config.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-04-22 hqfang first version
+ */
+
+#ifndef __DRV_CONFIG_H__
+#define __DRV_CONFIG_H__
+
+#include <board.h>
+#include <rtthread.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/bsp/nuclei/libraries/hbird/HAL_Drivers/drv_uart.c b/bsp/nuclei/libraries/hbird/HAL_Drivers/drv_uart.c
new file mode 100644
index 0000000000..ea01d03c9b
--- /dev/null
+++ b/bsp/nuclei/libraries/hbird/HAL_Drivers/drv_uart.c
@@ -0,0 +1,245 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-04-22 hqfang First version
+ */
+
+#include <drv_uart.h>
+
+#ifdef RT_USING_SERIAL
+
+#if !defined(BSP_USING_UART0) && !defined(BSP_USING_UART1)
+ #error "Please define at least one BSP_USING_UARTx"
+ /* this driver can be enabled at menuconfig ->
+ Hardware Drivers Config -> On-chip Peripheral Drivers -> Enable UART */
+#endif
+
+enum
+{
+#ifdef BSP_USING_UART0
+ UART0_INDEX,
+#endif
+#ifdef BSP_USING_UART1
+ UART1_INDEX,
+#endif
+};
+
+static struct hbird_uart_config uart_config[] =
+{
+#ifdef BSP_USING_UART0
+ {
+ "uart0",
+ UART0,
+ SOC_INT19_IRQn,
+ },
+#endif
+#ifdef BSP_USING_UART1
+ {
+ "uart1",
+ UART1,
+ SOC_INT20_IRQn,
+ },
+#endif
+};
+
+static struct hbird_uart uart_obj[sizeof(uart_config) / sizeof(uart_config[0])] = {0};
+
+static rt_err_t hbird_configure(struct rt_serial_device *serial,
+ struct serial_configure *cfg)
+{
+ struct hbird_uart *uart_obj;
+ struct hbird_uart_config *uart_cfg;
+ RT_ASSERT(serial != RT_NULL);
+ RT_ASSERT(cfg != RT_NULL);
+
+ uart_obj = (struct hbird_uart *) serial->parent.user_data;
+ uart_cfg = uart_obj->config;
+ RT_ASSERT(uart_cfg != RT_NULL);
+
+ uart_init(uart_cfg->uart, cfg->baud_rate);
+
+ switch (cfg->stop_bits)
+ {
+ case STOP_BITS_1:
+ uart_config_stopbit(uart_cfg->uart, UART_STOP_BIT_1);
+ break;
+ case STOP_BITS_2:
+ uart_config_stopbit(uart_cfg->uart, UART_STOP_BIT_2);
+ break;
+ default:
+ uart_config_stopbit(uart_cfg->uart, UART_STOP_BIT_1);
+ break;
+ }
+
+ return RT_EOK;
+}
+
+static rt_err_t hbird_control(struct rt_serial_device *serial, int cmd,
+ void *arg)
+{
+ struct hbird_uart *uart_obj;
+ struct hbird_uart_config *uart_cfg;
+
+ RT_ASSERT(serial != RT_NULL);
+ uart_obj = (struct hbird_uart *) serial->parent.user_data;
+ uart_cfg = uart_obj->config;
+ RT_ASSERT(uart_cfg != RT_NULL);
+
+ switch (cmd)
+ {
+ case RT_DEVICE_CTRL_CLR_INT:
+ ECLIC_DisableIRQ(uart_cfg->irqn);
+ uart_disable_rxint(uart_cfg->uart);
+ break;
+ case RT_DEVICE_CTRL_SET_INT:
+ ECLIC_EnableIRQ(uart_cfg->irqn);
+ ECLIC_SetShvIRQ(uart_cfg->irqn, ECLIC_NON_VECTOR_INTERRUPT);
+ ECLIC_SetLevelIRQ(uart_cfg->irqn, 1);
+ uart_enable_rxint(uart_cfg->uart);
+ break;
+ }
+
+ return RT_EOK;
+}
+
+static int hbird_putc(struct rt_serial_device *serial, char ch)
+{
+ struct hbird_uart *uart_obj;
+ struct hbird_uart_config *uart_cfg;
+
+ RT_ASSERT(serial != RT_NULL);
+ uart_obj = (struct hbird_uart *) serial->parent.user_data;
+ uart_cfg = uart_obj->config;
+ RT_ASSERT(uart_cfg != RT_NULL);
+
+ uart_write(uart_cfg->uart, ch);
+
+ return 1;
+}
+
+static int hbird_getc(struct rt_serial_device *serial)
+{
+ int ch;
+ uint32_t rxfifo;
+ struct hbird_uart *uart_obj;
+ struct hbird_uart_config *uart_cfg;
+
+ RT_ASSERT(serial != RT_NULL);
+ uart_obj = (struct hbird_uart *) serial->parent.user_data;
+ uart_cfg = uart_obj->config;
+ RT_ASSERT(uart_cfg != RT_NULL);
+
+ ch = -1;
+ rxfifo = uart_cfg->uart->RXFIFO;
+ if ((rxfifo & UART_RXFIFO_EMPTY) != UART_RXFIFO_EMPTY) {
+ ch = (int)(uint8_t)(rxfifo);
+ }
+ return ch;
+}
+
+static const struct rt_uart_ops hbird_uart_ops = { hbird_configure, hbird_control,
+ hbird_putc, hbird_getc,
+ RT_NULL
+};
+
+static void gd32_uart_isr(struct rt_serial_device *serial)
+{
+ struct hbird_uart *uart_obj;
+ struct hbird_uart_config *uart_cfg;
+
+ RT_ASSERT(serial != RT_NULL);
+ uart_obj = (struct hbird_uart *) serial->parent.user_data;
+ uart_cfg = uart_obj->config;
+ RT_ASSERT(uart_cfg != RT_NULL);
+
+ if (uart_cfg->uart->IP & UART_IP_RXIP_MASK) {
+ rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
+ }
+}
+
+#ifdef BSP_USING_UART0
+
+void eclic_irq19_handler(void)
+{
+ rt_interrupt_enter();
+
+ gd32_uart_isr(&uart_obj[UART0_INDEX].serial);
+
+ rt_interrupt_leave();
+}
+
+#endif
+
+#ifdef BSP_USING_UART1
+
+void eclic_irq20_handler(void)
+{
+ rt_interrupt_enter();
+
+ gd32_uart_isr(&uart_obj[UART1_INDEX].serial);
+
+ rt_interrupt_leave();
+}
+
+#endif
+
+/* For HBird Uart, when CPU freq is lower than 8M
+ The uart read will only work on baudrate <= 57600 */
+#define DRV_UART_BAUDRATE BAUD_RATE_57600
+
+int rt_hw_uart_init(void)
+{
+ rt_size_t obj_num;
+ int index;
+
+ obj_num = sizeof(uart_obj) / sizeof(struct hbird_uart);
+ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
+ config.baud_rate = DRV_UART_BAUDRATE;
+ rt_err_t result = 0;
+
+ for (index = 0; index < obj_num; index++)
+ {
+ /* init UART object */
+ uart_obj[index].config = &uart_config[index];
+ uart_obj[index].serial.ops = &hbird_uart_ops;
+ uart_obj[index].serial.config = config;
+
+ /* register UART device */
+ result = rt_hw_serial_register(&uart_obj[index].serial,
+ uart_obj[index].config->name,
+ RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
+ &uart_obj[index]);
+ RT_ASSERT(result == RT_EOK);
+ }
+
+ return result;
+}
+
+void rt_hw_serial_thread_entry(void *parameter)
+{
+ struct hbird_uart_config *uart_cfg;
+
+ while (1) {
+#ifdef BSP_USING_UART0
+ uart_cfg = uart_obj[UART0_INDEX].config;
+ if (uart_cfg->uart->IP & UART_IP_RXIP_MASK) {
+ gd32_uart_isr(&uart_obj[UART0_INDEX].serial);
+ }
+#endif
+#ifdef BSP_USING_UART1
+ uart_cfg = uart_obj[UART1_INDEX].config;
+ if (uart_cfg->uart->IP & UART_IP_RXIP_MASK) {
+ gd32_uart_isr(&uart_obj[UART1_INDEX].serial);
+ }
+#endif
+ rt_thread_mdelay(50);
+ }
+}
+
+#endif /* RT_USING_SERIAL */
+
+/******************** end of file *******************/
diff --git a/bsp/nuclei/libraries/hbird/HAL_Drivers/drv_uart.h b/bsp/nuclei/libraries/hbird/HAL_Drivers/drv_uart.h
new file mode 100644
index 0000000000..c7d635758c
--- /dev/null
+++ b/bsp/nuclei/libraries/hbird/HAL_Drivers/drv_uart.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-04-15 hqfang first version
+ */
+#ifndef __DRV_UART_H__
+#define __DRV_UART_H__
+
+#include <rtthread.h>
+#include <rtdevice.h>
+#include <drv_config.h>
+
+/* config class */
+struct hbird_uart_config
+{
+ const char *name;
+ UART_TypeDef *uart;
+ IRQn_Type irqn;
+};
+
+/* hbird uart dirver class */
+struct hbird_uart
+{
+ struct hbird_uart_config *config;
+ struct rt_serial_device serial;
+};
+
+extern int rt_hw_uart_init(void);
+
+#endif /* __DRV_USART_H__ */
+
+/******************* end of file *******************/