RK3588共有10个串口uart0~uart9,部分串口在rtos中已经添加支持,如遇未添加的串口可参考下面方法实现,以uart7为例。
&uart7 {
status = "disabled"; // disabled掉要用的串口
};
rockchip_amp: rockchip-amp {
compatible = "rockchip,amp";
clocks = <&cru HCLK_PMU_CM0_ROOT>, <&cru FCLK_PMU_CM0_CORE>,
<&cru CLK_PMU_CM0_RTC>, <&cru PCLK_PMUCM0_INTMUX>,
<&cru SCLK_UART5>, <&cru PCLK_UART5>,
<&cru SCLK_UART7>, <&cru PCLK_UART7>, //修改位置
<&cru PCLK_BUSTIMER0>, <&cru CLK_BUSTIMER4>, <&cru CLK_BUSTIMER5>,
<&cru PCLK_BUSTIMER1>, <&cru CLK_BUSTIMER10>, <&cru CLK_BUSTIMER11>;
pinctrl-names = "default";
pinctrl-0 = <&uart5m0_xfer &uart7m0_xfer>; //修改位置
amp-irqs = /bits/ 64 <
/* GPIO EXT */
GIC_AMP_IRQ_CFG_ROUTE(314, 0xd0, CPU_GET_AFFINITY(3, 0))
GIC_AMP_IRQ_CFG_ROUTE(315, 0xd0, CPU_GET_AFFINITY(3, 0))
GIC_AMP_IRQ_CFG_ROUTE(316, 0xd0, CPU_GET_AFFINITY(3, 0))
GIC_AMP_IRQ_CFG_ROUTE(317, 0xd0, CPU_GET_AFFINITY(3, 0))
GIC_AMP_IRQ_CFG_ROUTE(318, 0xd0, CPU_GET_AFFINITY(3, 0))
/* UART5 */
GIC_AMP_IRQ_CFG_ROUTE(368, 0xd0, CPU_GET_AFFINITY(3, 0))
/* UART7 */
GIC_AMP_IRQ_CFG_ROUTE(370, 0xd0, CPU_GET_AFFINITY(3, 0)) //修改位置
/* MAILBOX */
GIC_AMP_IRQ_CFG_ROUTE(100, 0xd0, CPU_GET_AFFINITY(3, 0))>;
status = "okay";
};
GIC_AMP_IRQ_CFG_ROUTE(irqNum, Priority, CPU_GET_AFFINITY(cpuID, cpuCluster))参数说明:
| 参数 | 说明 |
|---|---|
| irqNum | 中断号 |
| Priority | 优先级(使用默认值0xd0,不需要修改) |
| cpuID | 响应中断的CPU号 |
| cpuCluster | cpu集群,多见于大小核系统中。 |
注意:模块中断号,和 amp-irqs 引用中断号差一个固定偏移32。
例如uart7的中断号是338,amp-irqs 引用中断号是370。

2.rtos添加串口
diff --git a/bsp/rockchip/rk3588-mcu/drivers/Kconfig b/bsp/rockchip/rk3588-mcu/drivers/Kconfig
index ebcadbbef..e92940415 100644
--- a/bsp/rockchip/rk3588-mcu/drivers/Kconfig
+++ b/bsp/rockchip/rk3588-mcu/drivers/Kconfig
@@ -21,6 +21,9 @@ menu "Enable UART"
config RT_USING_UART5
bool "Enable UART5"
default n
+ config RT_USING_UART7
+ bool "Enable UART7"
+ default n
endif
endmenu
diff --git a/bsp/rockchip/rk3588-mcu/board/evb/defconfig b/bsp/rockchip/rk3588-mcu/board/evb/defconfig
index 53a030b08..eefc77c6a 100644
--- a/bsp/rockchip/rk3588-mcu/board/evb/defconfig
+++ b/bsp/rockchip/rk3588-mcu/board/evb/defconfig
@@ -400,7 +400,8 @@ CONFIG_RT_USING_CACHE=y
CONFIG_RT_USING_UART=y
# CONFIG_RT_USING_UART0 is not set
# CONFIG_RT_USING_UART2 is not set
CONFIG_RT_USING_UART5=y
+CONFIG_RT_USING_UART7=y
diff --git a/bsp/rockchip/rk3588-mcu/board/evb/iomux.c b/bsp/rockchip/rk3588-mcu/board/evb/iomux.c
index 41fc11592..e57eb8a7c 100644
--- a/bsp/rockchip/rk3588-mcu/board/evb/iomux.c
+++ b/bsp/rockchip/rk3588-mcu/board/evb/iomux.c
@@ -83,6 +83,12 @@ void uart_iomux_config(void)
GPIO_PIN_D4 | GPIO_PIN_D5,
PIN_CONFIG_MUX_FUNC10);
#endif
+#ifdef RT_USING_UART7
+ /* uart7_m0 */
+ HAL_PINCTRL_SetIOMUX(GPIO_BANK2,
+ GPIO_PIN_B4 | GPIO_PIN_B5,
+ PIN_CONFIG_MUX_FUNC10);
+#endif
}
diff --git a/bsp/rockchip/rk3588-mcu/board/evb/board.c b/bsp/rockchip/rk3588-mcu/board/evb/board.c
index b5862feb6..97d169f25 100644
--- a/bsp/rockchip/rk3588-mcu/board/evb/board.c
+++ b/bsp/rockchip/rk3588-mcu/board/evb/board.c
@@ -73,6 +73,15 @@ RT_WEAK const struct uart_board g_uart5_board =
.name = "uart5",
};
#endif /* RT_USING_UART5 */
+#if defined(RT_USING_UART7)
+RT_WEAK const struct uart_board g_uart7_board =
+{
+ .baud_rate = UART_BR_115200,
+ .dev_flag = ROCKCHIP_UART_SUPPORT_FLAG_DEFAULT,
+ .bufer_size = RT_SERIAL_RB_BUFSZ,
+ .name = "uart7",
+};
+#endif /* RT_USING_UART7 */
extern void SysTick_Handler(void);
RT_WEAK void tick_isr(int vector, void *param)
3.配置串口为sonsole
diff --git a/bsp/rockchip/rk3588-mcu/board/evb/defconfig b/bsp/rockchip/rk3588-mcu/board/evb/defconfig
index 53a030b08..eefc77c6a 100644
--- a/bsp/rockchip/rk3588-mcu/board/evb/defconfig
+++ b/bsp/rockchip/rk3588-mcu/board/evb/defconfig
@@ -85,7 +85,7 @@ CONFIG_RT_USING_DEVICE=y
# CONFIG_RT_USING_INTERRUPT_INFO is not set
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
-CONFIG_RT_CONSOLE_DEVICE_NAME="uart5"
+CONFIG_RT_CONSOLE_DEVICE_NAME="uart7"
CONFIG_RT_VER_NUM=0x40101
CONFIG_ARCH_ARM=y
4.串口收发demo
demo实现将收到的数据在转发出去。代码如下:
#include <stdio.h>
#include <string.h>
#include <rtthread.h>
#include <rthw.h>
#include <hal_base.h>
#define UART_DEVICE_NAME "uart7"
static rt_device_t uart_dev;
rt_err_t uart_rx_callback(rt_device_t dev, rt_size_t size)
{
int len = 0;
uint8_t buff[128]={0};
for (;;) {
len = rt_device_read(dev, 0, buff, sizeof(buff));
if(len > 0) {
rt_device_write(dev, 0, buff, len);
} else {
break;
}
}
return RT_EOK;
}
static void uart_test_thread_entry(void *arg)
{
uart_dev = rt_device_find(UART_DEVICE_NAME);
if (uart_dev == RT_NULL) {
rt_kprintf("%s find failed!\n", UART_DEVICE_NAME);
return;
}
rt_device_open(uart_dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
rt_device_set_rx_indicate(uart_dev, uart_rx_callback);
for(;;){
rt_thread_mdelay(1000);
}
}
static int uart_test_init(void)
{
rt_thread_t tid = rt_thread_create("uart test", uart_test_thread_entry,
RT_NULL, 2048, 14, 20);
if (tid != RT_NULL)
rt_thread_startup(tid);
return 0;
}
INIT_APP_EXPORT(uart_test_init);
注:SDK默认的波特率是1.5MHz,如需修改在"board/evb/board.c"中找到对应的串口进行修改。