Linux基础 -- 设备树引脚复用之`/omit-if-no-ref/` 用法解析

RK3588 设备树中 UART 引脚复用定义与 /omit-if-no-ref/ 用法解析

在进行 RK3588 嵌入式平台开发时,串口(UART)调试是 Bring-up 阶段的核心手段。而 RK3588 SoC 支持多个引脚复用配置(pinmux),通过设备树灵活选择,合理配置对于调试成功至关重要。

本文以 UART2 为例,讲解其设备树引脚配置方式、复用模式选择机制、以及 /omit-if-no-ref/ 的作用与使用方法。


一、设备树引脚复用定义示例

设备树(通常为 rk3588s-pinctrl.dtsi)中,对 UART2 的多个引脚复用模式进行预定义:

uart2 {
    /omit-if-no-ref/
    uart2m0_xfer: uart2m0-xfer {
        rockchip,pins =
            /* uart2_rx_m0 */
            <0 RK_PB6 10 &pcfg_pull_up>,
            /* uart2_tx_m0 */
            <0 RK_PB5 10 &pcfg_pull_up>;
    };

    /omit-if-no-ref/
    uart2m1_xfer: uart2m1-xfer {
        rockchip,pins =
            /* uart2_rx_m1 */
            <4 RK_PD1 10 &pcfg_pull_up>,
            /* uart2_tx_m1 */
            <4 RK_PD0 10 &pcfg_pull_up>;
    };

    /omit-if-no-ref/
    uart2m2_xfer: uart2m2-xfer {
        rockchip,pins =
            /* uart2_rx_m2 */
            <3 RK_PB2 10 &pcfg_pull_up>,
            /* uart2_tx_m2 */
            <3 RK_PB1 10 &pcfg_pull_up>;
    };

    /omit-if-no-ref/
    uart2_ctsn: uart2-ctsn {
        rockchip,pins =
            /* uart2_ctsn */
            <3 RK_PB4 10 &pcfg_pull_none>;
    };

    /omit-if-no-ref/
    uart2_rtsn: uart2-rtsn {
        rockchip,pins =
            /* uart2_rtsn */
            <3 RK_PB3 10 &pcfg_pull_none>;
    };
};

二、关键概念解释

1. 多个复用模式(如 uart2m0、m1、m2)

RK3588 中每个 UART 支持多个 引脚复用配置(不同 GPIO 管脚连接),例如:

名称 GPIO Bank GPIO Pin 模式编号 对应功能
uart2m0_xfer GPIO0_B6 PB6 10 uart2_rx_m0
uart2m0_xfer GPIO0_B5 PB5 10 uart2_tx_m0
uart2m1_xfer GPIO4_D1 PD1 10 uart2_rx_m1
uart2m1_xfer GPIO4_D0 PD0 10 uart2_tx_m1
uart2m2_xfer GPIO3_B2 PB2 10 uart2_rx_m2
uart2m2_xfer GPIO3_B1 PB1 10 uart2_tx_m2

这些 uart2mX_xfer 节点是为不同硬件连线方案预先定义的 pinmux 配置,供开发者按实际布线选择使用。


2. /omit-if-no-ref/ 的含义

设备树编译器(DTC)的指令,含义如下:

如果该节点没有被设备树的其它部分引用,在编译 .dtb 时将自动省略该节点。

它的作用是:

  • 提高设备树精简度;
  • 避免生成不必要的 pinctrl 配置;
  • 防止未使用的 pinmux 造成冲突。

三、如何在设备树中选择 UART2 引脚

要启用 UART2 并绑定某一组引脚,需要在设备树主文件中这样写:

&uart2 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&uart2m1_xfer>;  // 选择 uart2 使用 mode1 对应的引脚
};

注意:

  • 如果不写 pinctrl-0 或引用了不存在的节点,UART2 将无法工作;
  • 仅被引用的 uart2mX_xfer 才会在最终 .dtb 中生成;
  • 没被引用的节点因 /omit-if-no-ref/ 会自动剔除。

四、常见问题与排查建议

问题 原因 解决方法
UART 无法打印调试信息 未配置 pinctrl-0,或引用错误的 uart2mX_xfer 检查是否引用了实际布线所用引脚定义
编译后的 dtb 文件缺少 uart2mX_xfer 节点 未被引用 + 使用了 /omit-if-no-ref/ 添加有效引用(如 pinctrl-0 = <&uart2m1_xfer>
引脚功能冲突 多个设备使用相同 GPIO 确保 pinctrl 定义中引脚唯一性

五、小结

  • RK3588 支持多种引脚复用方案;
  • uart2mX_xfer 定义了不同 pinmux 模式;
  • /omit-if-no-ref/ 是设备树中用来精简未使用节点的常用指令;
  • 开发者应根据实际硬件选择一组引脚,并通过 pinctrl-0 显式指定;
  • 正确的引脚选择是串口调试输出的关键保障。

你可能感兴趣的:(linux)