mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-09-23 12:15:32 +08:00
[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: commitb7368bc2edAuthor: 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> commit2c42a997f7Author: 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> commit915ad4c076Author: 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> commitfe43869c79Author: 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> commit8fd31727bcAuthor: 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> commitb432308b20Author: 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> commit7366173d74Author: 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> commit8c2cd4745bAuthor: 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> commitfa8a2f24eaAuthor: 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> commit1be40bc50bAuthor: 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> commit4c8beb204bAuthor: 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> commitda2bcf5c56Author: 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> commit0b932c677aAuthor: 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> commit0431f6f01fAuthor: 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> commit0e1f502edfAuthor: 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> commit1131f6e648Author: 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> commitad81c1d3bfAuthor: 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> commitd780138a1aAuthor: 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> commit60320d34b1Author: 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> commita042b806efAuthor: 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> commit2a9603adcbAuthor: 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> commit34aaf6aebaAuthor: 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> commit3451466e9dAuthor: 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:
@@ -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 *******************/
|
||||
Reference in New Issue
Block a user