[BSP][Nuclei] Add Nuclei RISC-V Processor support

* Nuclei RISC-V Processor support is added both RV32 and RV64
* Nuclei RVSTAR BSP is added, UART driver is added
* MSH works well in RVSTAR board

---------------------------

Squashed commit of the following:

commit b7368bc2ed
Author: Huaqi Fang <578567190@qq.com>
Date:   Fri Apr 17 14:38:54 2020 +0800

    [BSP][Nuclei] Pretty source code

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit 2c42a997f7
Author: Huaqi Fang <578567190@qq.com>
Date:   Thu Apr 16 15:51:03 2020 +0800

    [libcpu] Remove ARCH_NUCLEI in libcpu kconfig

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit 915ad4c076
Author: Huaqi Fang <578567190@qq.com>
Date:   Thu Apr 16 15:50:00 2020 +0800

    [BSP][Nuclei] Remove ARCH_NUCLEI in bsp KConfig

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit fe43869c79
Author: Huaqi Fang <578567190@qq.com>
Date:   Wed Apr 15 12:43:20 2020 +0800

    [BSP][NUCLEI] Simply application main.c

    Remove previous complicated application of gd32vf103_rvstar

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit 8fd31727bc
Author: Huaqi Fang <578567190@qq.com>
Date:   Wed Apr 15 12:38:04 2020 +0800

    [BSP][NUCLEI] Format application and board source code

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit b432308b20
Author: Huaqi Fang <578567190@qq.com>
Date:   Wed Apr 15 11:58:28 2020 +0800

    [BSP][Nuclei] Format source code of drivers of gd32vf103

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit 7366173d74
Author: Huaqi Fang <578567190@qq.com>
Date:   Wed Apr 15 11:54:02 2020 +0800

    [LIBCPU][NUCLEI] Optimize nuclei cpu portable code

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit 8c2cd4745b
Author: Huaqi Fang <578567190@qq.com>
Date:   Tue Apr 14 15:45:42 2020 +0800

    nuclei: Update README.md

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit fa8a2f24ea
Author: Huaqi Fang <578567190@qq.com>
Date:   Tue Apr 14 14:06:54 2020 +0800

    nuclei: Add gpio driver not tested

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit 1be40bc50b
Author: Huaqi Fang <578567190@qq.com>
Date:   Thu Apr 9 14:55:22 2020 +0800

    Nuclei: Update README.md

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit 4c8beb204b
Author: Huaqi Fang <578567190@qq.com>
Date:   Thu Apr 9 10:20:25 2020 +0800

    Nuclei: Change idle stack size from 256 to 396 bytes

    If changed to 396 bytes, then debug optimization level changed
    from O2 to O0, and the application can run successfully without
    stack overflow issue of tidle0 task
    warning: tidle0 stack is close to end of stack address.

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit da2bcf5c56
Author: Huaqi Fang <578567190@qq.com>
Date:   Thu Apr 9 10:11:40 2020 +0800

    nuclei: Remove unused kconfig

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit 0b932c677a
Author: Huaqi Fang <578567190@qq.com>
Date:   Thu Apr 9 09:32:22 2020 +0800

    nuclei: optimize drivers support

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit 0431f6f01f
Author: Huaqi Fang <578567190@qq.com>
Date:   Wed Apr 8 19:28:02 2020 +0800

    tools: Update mkdist.py for nuclei bsp

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit 0e1f502edf
Author: Huaqi Fang <578567190@qq.com>
Date:   Wed Apr 8 18:46:58 2020 +0800

    nuclei: optimize rvstar support directory

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit 1131f6e648
Author: Huaqi Fang <578567190@qq.com>
Date:   Wed Apr 8 18:37:24 2020 +0800

    nuclei: update kconfig

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit ad81c1d3bf
Author: Huaqi Fang <578567190@qq.com>
Date:   Wed Apr 8 15:43:00 2020 +0800

    nuclei: Rename board name

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit d780138a1a
Author: Huaqi Fang <578567190@qq.com>
Date:   Tue Apr 7 09:36:19 2020 +0800

    libcpu: Add Nuclei arch option in KConfig

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit 60320d34b1
Author: Huaqi Fang <578567190@qq.com>
Date:   Fri Apr 3 16:51:01 2020 +0800

    nuclei: Update nuclei sdk of rt-thread support

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit a042b806ef
Author: Huaqi Fang <578567190@qq.com>
Date:   Fri Apr 3 11:34:09 2020 +0800

    nuclei: modify application for not print anything

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit 2a9603adcb
Author: Huaqi Fang <578567190@qq.com>
Date:   Fri Apr 3 11:31:01 2020 +0800

    nuclei: Add .gitignore for nuclei bsp

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit 34aaf6aeba
Author: Huaqi Fang <578567190@qq.com>
Date:   Fri Apr 3 11:28:06 2020 +0800

    nuclei_sdk: update link script of rvstar to contain rt-thread needed sections

            /* section information for finsh shell */
            . = ALIGN(4);
            __fsymtab_start = .;
            KEEP(*(FSymTab))
            __fsymtab_end = .;

            . = ALIGN(4);
            __vsymtab_start = .;
            KEEP(*(VSymTab))
            __vsymtab_end = .;

            /* section information for initial. */
            . = ALIGN(4);
            __rt_init_start = .;
            KEEP(*(SORT(.rti_fn*)))
            __rt_init_end = .;

    The above code placed in rodata section

    Signed-off-by: Huaqi Fang <578567190@qq.com>

commit 3451466e9d
Author: Huaqi Fang <578567190@qq.com>
Date:   Fri Apr 3 10:04:42 2020 +0800

    bsp: Add initial commit of nuclei rvstar board bsp

    Signed-off-by: Huaqi Fang <578567190@qq.com>

Signed-off-by: Huaqi Fang <578567190@qq.com>
This commit is contained in:
Huaqi Fang
2020-04-17 21:07:29 +08:00
parent f406aab4d2
commit ee4cabe69f
27 changed files with 2962 additions and 1 deletions
@@ -0,0 +1,21 @@
Import('RTT_ROOT')
Import('rtconfig')
from building import *
cwd = GetCurrentDir()
# add the general drivers.
src = Split("""
""")
if GetDepend(['RT_USING_PIN']):
src += ['drv_gpio.c']
if GetDepend(['RT_USING_SERIAL']):
src += ['drv_usart.c']
path = [cwd]
group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path)
Return('group')
@@ -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-08 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
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,51 @@
/*
* Copyright (c) 2006-2020, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2018-11-06 balanceTWK first version
* 2020-04-15 hqfang Modify for gd32vf103
*/
#ifndef __DRV_GPIO_H__
#define __DRV_GPIO_H__
#include <rtthread.h>
#include <rtdevice.h>
#include <rthw.h>
#include <drv_config.h>
#define __GD32_PORT(port) GPIO##port
#define GET_PIN(PORTx,PIN) (rt_base_t)((16 * ( ((rt_base_t)__GD32_PORT(PORTx) - (rt_base_t)GPIOA)/(0x0400UL) )) + PIN)
#define __GD32_PIN(index, gpio, gpio_index) \
{ \
index, GPIO##gpio, GPIO_PIN_##gpio_index \
}
#define __GD32_PIN_RESERVE \
{ \
-1, 0, 0 \
}
/* GD32 GPIO driver */
struct pin_index
{
int index;
uint32_t gpio;
uint32_t pin;
};
struct pin_irq_map
{
rt_uint16_t pinbit;
IRQn_Type irqno;
};
int rt_hw_pin_init(void);
#endif /* __DRV_GPIO_H__ */
@@ -0,0 +1,347 @@
/*
* Copyright (c) 2006-2020, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2019-07-23 tyustli first version
* 2020-04-02 hqfang modified for Nuclei
*/
#include <drv_usart.h>
#ifdef RT_USING_SERIAL
#if !defined(BSP_USING_UART0) && !defined(BSP_USING_UART1) && !defined(BSP_USING_UART2) \
&& !defined(BSP_USING_UART3) && !defined(BSP_USING_UART4)
#error "Please define at least one BSP_USING_UARTx"
/* this driver can be disabled at menuconfig -> RT-Thread Components -> Device Drivers */
#endif
enum
{
#ifdef BSP_USING_UART0
GDUART0_INDEX,
#endif
#ifdef BSP_USING_UART1
GDUART1_INDEX,
#endif
#ifdef BSP_USING_UART2
GDUART2_INDEX,
#endif
#ifdef BSP_USING_UART3
GDUART3_INDEX,
#endif
#ifdef BSP_USING_UART4
GDUART4_INDEX,
#endif
};
static struct gd32_uart_config uart_config[] =
{
#ifdef BSP_USING_UART0
{
"uart0",
USART0,
USART0_IRQn,
},
#endif
#ifdef BSP_USING_UART1
{
"uart1",
USART1,
USART1_IRQn,
},
#endif
#ifdef BSP_USING_UART2
{
"uart2",
USART2,
USART2_IRQn,
},
#endif
#ifdef BSP_USING_UART3
{
"uart3",
USART3,
USART3_IRQn,
},
#endif
#ifdef BSP_USING_UART4
{
"uart4",
UART4,
UART4_IRQn,
},
#endif
};
static struct gd32_uart uart_obj[sizeof(uart_config) / sizeof(uart_config[0])] = {0};
static rt_err_t gd32_configure(struct rt_serial_device *serial,
struct serial_configure *cfg)
{
struct gd32_uart *usart_obj;
struct gd32_uart_config *usart;
RT_ASSERT(serial != RT_NULL);
RT_ASSERT(cfg != RT_NULL);
usart_obj = (struct gd32_uart *) serial->parent.user_data;
usart = usart_obj->config;
RT_ASSERT(usart != RT_NULL);
usart_deinit(usart->uart_base);
usart_baudrate_set(usart->uart_base, cfg->baud_rate);
switch (cfg->data_bits)
{
case DATA_BITS_8:
usart_word_length_set(usart->uart_base, USART_WL_8BIT);
break;
case DATA_BITS_9:
usart_word_length_set(usart->uart_base, USART_WL_9BIT);
break;
default:
usart_word_length_set(usart->uart_base, USART_WL_8BIT);
break;
}
switch (cfg->stop_bits)
{
case STOP_BITS_1:
usart_stop_bit_set(usart->uart_base, USART_STB_1BIT);
break;
case STOP_BITS_2:
usart_stop_bit_set(usart->uart_base, USART_STB_2BIT);
break;
default:
usart_stop_bit_set(usart->uart_base, USART_STB_1BIT);
break;
}
switch (cfg->parity)
{
case PARITY_NONE:
usart_parity_config(usart->uart_base, USART_PM_NONE);
break;
case PARITY_ODD:
usart_parity_config(usart->uart_base, USART_PM_ODD);
break;
case PARITY_EVEN:
usart_parity_config(usart->uart_base, USART_PM_EVEN);
break;
default:
usart_parity_config(usart->uart_base, USART_PM_NONE);
break;
}
usart_hardware_flow_rts_config(usart->uart_base, USART_RTS_DISABLE);
usart_hardware_flow_cts_config(usart->uart_base, USART_RTS_DISABLE);
usart_receive_config(usart->uart_base, USART_RECEIVE_ENABLE);
usart_transmit_config(usart->uart_base, USART_TRANSMIT_ENABLE);
usart_enable(usart->uart_base);
return RT_EOK;
}
static rt_err_t gd32_control(struct rt_serial_device *serial, int cmd,
void *arg)
{
struct gd32_uart *usart_obj;
struct gd32_uart_config *usart;
RT_ASSERT(serial != RT_NULL);
usart_obj = (struct gd32_uart *) serial->parent.user_data;
usart = usart_obj->config;
RT_ASSERT(usart != RT_NULL);
switch (cmd)
{
case RT_DEVICE_CTRL_CLR_INT:
ECLIC_DisableIRQ(usart->irqn);
usart_interrupt_disable(usart->uart_base, USART_INT_RBNE);
break;
case RT_DEVICE_CTRL_SET_INT:
ECLIC_EnableIRQ(usart->irqn);
/* enable USART0 receive interrupt */
usart_interrupt_enable(usart->uart_base, USART_INT_RBNE);
break;
}
return RT_EOK;
}
static int gd32_putc(struct rt_serial_device *serial, char ch)
{
struct gd32_uart *usart_obj;
struct gd32_uart_config *usart;
RT_ASSERT(serial != RT_NULL);
usart_obj = (struct gd32_uart *) serial->parent.user_data;
usart = usart_obj->config;
RT_ASSERT(usart != RT_NULL);
usart_data_transmit(usart->uart_base, (uint8_t) ch);
while (usart_flag_get(usart->uart_base, USART_FLAG_TBE) == RESET);
return 1;
}
static int gd32_getc(struct rt_serial_device *serial)
{
int ch;
struct gd32_uart *usart_obj;
struct gd32_uart_config *usart;
RT_ASSERT(serial != RT_NULL);
usart_obj = (struct gd32_uart *) serial->parent.user_data;
usart = usart_obj->config;
RT_ASSERT(usart != RT_NULL);
ch = -1;
if (RESET != usart_flag_get(usart->uart_base, USART_FLAG_RBNE))
{
ch = usart_data_receive(usart->uart_base) & 0xff;
}
return ch;
}
static const struct rt_uart_ops gd32_uart_ops = { gd32_configure, gd32_control,
gd32_putc, gd32_getc,
RT_NULL
};
static void usart_isr(struct rt_serial_device *serial)
{
struct gd32_uart *usart_obj;
struct gd32_uart_config *usart;
RT_ASSERT(serial != RT_NULL);
usart_obj = (struct gd32_uart *) serial->parent.user_data;
usart = usart_obj->config;
RT_ASSERT(usart != RT_NULL);
if ((usart_interrupt_flag_get(usart->uart_base, USART_INT_FLAG_RBNE)
!= RESET)
&& (RESET != usart_flag_get(usart->uart_base, USART_FLAG_RBNE)))
{
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
usart_interrupt_flag_clear(usart->uart_base, USART_INT_FLAG_RBNE);
usart_flag_clear(usart->uart_base, USART_FLAG_RBNE);
}
else
{
if (usart_flag_get(usart->uart_base, USART_FLAG_CTSF) != RESET)
{
usart_flag_clear(usart->uart_base, USART_FLAG_CTSF);
}
if (usart_flag_get(usart->uart_base, USART_FLAG_LBDF) != RESET)
{
usart_flag_clear(usart->uart_base, USART_FLAG_LBDF);
}
if (usart_flag_get(usart->uart_base, USART_FLAG_TC) != RESET)
{
usart_flag_clear(usart->uart_base, USART_FLAG_TC);
}
}
}
#ifdef BSP_USING_UART0
void USART0_IRQHandler(void)
{
rt_interrupt_enter();
usart_isr(&uart_obj[GDUART0_INDEX].serial);
rt_interrupt_leave();
}
#endif
#ifdef BSP_USING_UART1
void USART1_IRQHandler(void)
{
rt_interrupt_enter();
usart_isr(&uart_obj[GDUART1_INDEX].serial);
rt_interrupt_leave();
}
#endif
#ifdef BSP_USING_UART2
void USART2_IRQHandler(void)
{
rt_interrupt_enter();
usart_isr(&uart_obj[GDUART2_INDEX].serial);
rt_interrupt_leave();
}
#endif
#ifdef BSP_USING_UART3
void UART3_IRQHandler(void)
{
rt_interrupt_enter();
usart_isr(&uart_obj[GDUART3_INDEX].serial);
rt_interrupt_leave();
}
#endif
#ifdef BSP_USING_UART4
void UART4_IRQHandler(void)
{
rt_interrupt_enter();
usart_isr(&uart_obj[GDUART4_INDEX].serial);
rt_interrupt_leave();
}
#endif
int rt_hw_usart_init(void)
{
rt_size_t obj_num;
int index;
obj_num = sizeof(uart_obj) / sizeof(struct gd32_uart);
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
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 = &gd32_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
| RT_DEVICE_FLAG_INT_TX, &uart_obj[index]);
RT_ASSERT(result == RT_EOK);
}
return result;
}
#endif /* RT_USING_SERIAL */
/******************** end of file *******************/
@@ -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>
/* gd32 config class */
struct gd32_uart_config
{
const char *name;
uint32_t uart_base;
IRQn_Type irqn;
};
/* gd32 uart dirver class */
struct gd32_uart
{
struct gd32_uart_config *config;
struct rt_serial_device serial;
};
int rt_hw_usart_init(void);
#endif /* __DRV_USART_H__ */
/******************* end of file *******************/