如何在设备树中配置带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>; }; };
驱动层面的轻量适配
对SC18IS602B的SPI桥驱动做少量修改:
- 在设备probe阶段,解析每个子SPI设备节点的
mux-control属性,获取对应多路复用器句柄 - 在SPI传输的
prepare回调中,调用内核mux_control_select()API切换到当前SPI设备对应的MISO通道 - 在
unprepare回调中,可选择切换回默认通道或保持当前状态
- 在设备probe阶段,解析每个子SPI设备节点的
若使用的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
相关产品推荐
相关产品推荐

