1. RK3588串口适配背景与需求分析
RK3588作为一款高性能处理器,内置了多达10个串口控制器(UART0~UART9)。在实际嵌入式开发中,我们经常需要同时运行Linux和实时操作系统(RTOS),通过AMP(Asymmetric Multiprocessing)架构实现两者的协同工作。在这种架构下,部分串口可能默认分配给Linux系统使用,而RTOS(如RT-Thread)需要访问特定串口时,就需要进行专门的适配配置。
以UART7为例,当开发者需要在RTOS中使用该串口时,会遇到以下几个典型问题:
- Linux设备树中默认使能了该串口,导致资源冲突
- RTOS侧缺乏对应的驱动支持和配置选项
- 中断路由和时钟配置需要跨系统协调
- 引脚复用功能需要正确设置
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Linux设备树关键配置解析
2.1 基础设备树修改
首先需要在Linux设备树中释放UART7资源,避免Linux内核占用该串口。关键配置如下:
dts复制&uart7 {
status = "disabled"; // 禁用Linux侧的UART7驱动
};
这一操作相当于告诉Linux内核:"不要初始化和管理这个串口,将其留给其他系统使用"。在AMP架构中,这种资源划分必须明确,否则会导致硬件访问冲突。
2.2 AMP配置详解
接下来需要在rockchip-amp节点中添加UART7的相关配置:
dts复制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>, // 新增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>; // 新增UART7引脚配置
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)) // 新增UART7中断
/* MAILBOX */
GIC_AMP_IRQ_CFG_ROUTE(100,
