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

相关推荐
chase。1 小时前
Ubuntu 22.04 解决 nvblox 编译依赖冲突:libgoogle-glog-dev 安装问题全记录
linux·运维·ubuntu
123过去3 小时前
wordlists使用教程
linux·网络·测试工具·安全
有毒的教程10 小时前
Ubuntu 虚拟机磁盘空间不足完整解决教程
linux·运维·ubuntu
Suifqwu12 小时前
rk3576(6)之设备树下GPIO驱动
单片机·嵌入式硬件
小樱花的樱花12 小时前
C++ new和delete用法详解
linux·开发语言·c++
APIshop12 小时前
Java获取京东商品详情接口(item_get)实战指南
java·linux·数据库
forestsea12 小时前
Elasticsearch 集群、Kibana和IK分词器:最新版 9.3.2 手动安装教程
大数据·elasticsearch·搜索引擎
Cx330❀12 小时前
一文吃透Linux System V共享内存:原理+实操+避坑指南
大数据·linux·运维·服务器·人工智能
薛定谔的悦12 小时前
储能系统(EMS)核心架构解析:充放电控制、防逆流、防过载与 PID 调节
linux·运维·架构