You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在设备树中配置带GPIO多路复用器的SC18IS602B I2C转SPI桥?

解决方案:设备树配置结合轻量驱动适配实现该硬件布局

核心思路:跨节点引用绕开子节点归属限制

不需要将SPI设备从I2C转SPI桥的子节点移至GPIO多路复用器下,而是通过设备树phandle引用机制,让SPI设备节点关联GPIO多路复用器的对应通道,同时在SPI桥驱动中补充MISO引脚的切换逻辑即可。

具体设备树配置示例

1. 定义GPIO多路复用器节点(以通用gpio-mux驱动为例)

gpio_mux: gpio-mux@0 {
    compatible = "gpio-mux";
    pinctrl-names = "default";
    pinctrl-0 = <&gpio_mux_pins>;
    #mux-control-cells = <1>;
    // 对应3个SPI设备的MISO通道选择GPIO
    mux-gpios = <&gpio 10 0>, <&gpio 11 0>, <&gpio 12 0>;
};

2. 定义I2C转SPI桥及子SPI设备节点,通过phandle关联多路复用器

sc18is602b: spi-bridge@28 {
    compatible = "nxp,sc18is602b";
    reg = <0x28>;
    spi-max-frequency = <1000000>;
    #address-cells = <1>;
    #size-cells = <0>;

    spi_device_0: spi-device@0 {
        compatible = "vendor,spi-device-0";
        reg = <0>;
        spi-max-frequency = <500000>;
        // 引用多路复用器的第0通道
        mux-control = <&gpio_mux 0>;
    };

    spi_device_1: spi-device@1 {
        compatible = "vendor,spi-device-1";
        reg = <1>;
        spi-max-frequency = <500000>;
        // 引用多路复用器的第1通道
        mux-control = <&gpio_mux 1>;
    };

    spi_device_2: spi-device@2 {
        compatible = "vendor,spi-device-2";
        reg = <2>;
        spi-max-frequency = <500000>;
        // 引用多路复用器的第2通道
        mux-control = <&gpio_mux 2>;
    };
};

驱动层面的轻量适配

  1. 对SC18IS602B的SPI桥驱动做少量修改:

    • 在设备probe阶段,解析每个子SPI设备节点的mux-control属性,获取对应多路复用器句柄
    • 在SPI传输的prepare回调中,调用内核mux_control_select()API切换到当前SPI设备对应的MISO通道
    • 在unprepare回调中,可选择切换回默认通道或保持当前状态
  2. 若使用的GPIO多路复用器已有成熟驱动(如内核自带的gpio-mux),无需额外编写多路复用器驱动,仅需复用现有API即可。

替代方案:基于pinctrl的动态引脚切换

如果GPIO多路复用是通过引脚复用功能实现(而非独立选通芯片),可为每个SPI设备定义独立pinctrl状态,在传输前后切换:

sc18is602b: spi-bridge@28 {
    compatible = "nxp,sc18is602b";
    reg = <0x28>;
    spi-max-frequency = <1000000>;
    #address-cells = <1>;
    #size-cells = <0>;

    spi_device_0: spi-device@0 {
        compatible = "vendor,spi-device-0";
        reg = <0>;
        spi-max-frequency = <500000>;
        pinctrl-names = "active", "idle";
        pinctrl-0 = <&miso_device0_pin>;
        pinctrl-1 = <&miso_idle_pin>;
    };

    // 其余SPI设备节点配置类似
};

// pinctrl状态定义
&pinctrl {
    miso_mux: miso-mux {
        miso_device0_pin: miso-device0 {
            pins = "GPIO_A0";
            function = "MISO_DEVICE0";
        };
        miso_device1_pin: miso-device1 {
            pins = "GPIO_A0";
            function = "MISO_DEVICE1";
        };
        miso_idle_pin: miso-idle {
            pins = "GPIO_A0";
            function = "GPIO";
        };
    };
};

该方案需SPI桥驱动支持pinctrl状态切换,内核SPI子系统框架已有现成接口可复用。

结论

无需完全定制驱动,通过设备树phandle引用+SPI桥驱动的轻量适配即可实现该硬件配置;若基于pinctrl实现多路复用,也可直接利用内核pinctrl框架完成引脚切换。

内容的提问来源于stack exchange,提问作者Schottky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 09:48:10