RK3588 linux+rtos(mcu)串口适配

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"中找到对应的串口进行修改。

相关推荐
|_⊙16 小时前
Linux 进程地址空间
linux·运维·服务器
RisunJan16 小时前
Linux命令-nm(列出目标文件(可执行文件、对象文件、库文件)中的符号)
linux·运维
c++逐梦人16 小时前
⽹络基础概念
linux·网络
杨云龙UP16 小时前
Oracle / ODA环境TRACE、alert日志定位与ADRCI清理 SOP_20260423
linux·运维·服务器·数据库·oracle
REDcker16 小时前
跨平台编译详解 工具链配置与工程化实践
linux·c++·windows·macos·c·跨平台·编译
Sapphire~16 小时前
Linux-15 ubuntu 和 windows 双系统,更新系统导致丢失ubuntu 入口
linux·运维·ubuntu
2201_7562063416 小时前
STM32L431 下载调试问题排查与解决
stm32·单片机·嵌入式硬件
xw-busy-code16 小时前
文档协同设计
大数据·elasticsearch·搜索引擎
zzzsde16 小时前
【Linux】线程概念与控制(1)线程基础与分页式存储管理
linux·运维·服务器·开发语言·算法
小樱花的樱花16 小时前
Linux进程管理相关命令
linux·运维·服务器