Toradex Verdin iMX8M Plus平台多SPI设备节点配置问题咨询
你好!看到你在Toradex Verdin iMX8M Plus平台上配置多SPI设备节点时碰了壁,目前只有spidev0.0能正常出现,想要的spidev0.1、spidev1.0、spidev1.1、spidev2.0、spidev2.1都没出来,我来帮你梳理下问题点和解决思路:
一、当前配置里的几个关键问题
兼容属性不匹配
你在imx8mp-verdin-yavia.dtsi里给spidev节点用了compatible = "toradex,evalspi",但实际上Toradex官方的SPI overlay里用的是"rohm,dh2228fv"来绑定spidev驱动(部分内核版本也支持直接用"spidev"),这个属性不对会导致内核无法识别并加载spidev驱动,自然不会生成对应的设备节点。SPI片选引脚被复用为GPIO
看imx8mp-verdin.dtsi里的pinctrl_ecspi1配置,MX8MP_IOMUXC_ECSPI1_SS0被设置成了GPIO5_IO09,如果要使用多个片选(比如@0、@1、@2),需要把对应的SS引脚都配置为SPI片选功能,而不是GPIO。而且你还需要确认硬件上ecspi1是否支持多个片选,并找到对应的引脚定义来配置。ecspi2/ecspi3未配置spidev节点
你需要的spidev1.x、spidev2.x对应ecspi2和ecspi3控制器,但目前你只给ecspi1添加了spidev子节点,ecspi2和ecspi3完全没配置,自然不会生成对应的设备文件。另外还要注意:你的pinctrl_bt_uart里把ecspi2的所有引脚都复用成了UART4的引脚,这会直接导致ecspi2无法使用,必须先解决这个引脚冲突问题。overlay与板级dtsi的配置冲突
你提到有一个未修改的官方overlay,里面已经配置了ecspi1的spidev@0,如果同时加载overlay和板级dtsi的配置,很可能会出现冲突,导致配置不生效。
二、具体修改步骤
1. 修正spidev节点的兼容属性
把所有spidev子节点的compatible字段改成和官方overlay一致的"rohm,dh2228fv",比如:
spidev@0 { compatible = "rohm,dh2228fv"; reg = <0>; spi-max-frequency = <10000000>; status = "okay"; };
2. 修复SPI引脚配置
- ecspi1的片选引脚:修改
pinctrl_ecspi1,把SS0/SS1/SS2配置为SPI片选功能,而不是GPIO。比如:
pinctrl_ecspi1: ecspi1grp { fsl,pins = < MX8MP_IOMUXC_ECSPI1_SCLK__ECSPI1_SCLK 0x4 /* SODIMM 196 */ MX8MP_IOMUXC_ECSPI1_MOSI__ECSPI1_MOSI 0x4 /* SODIMM 200 */ MX8MP_IOMUXC_ECSPI1_MISO__ECSPI1_MISO 0x1c4 /* SODIMM 198 */ MX8MP_IOMUXC_ECSPI1_SS0__ECSPI1_SS0 0x1c4 /* 恢复为SPI片选功能 */ MX8MP_IOMUXC_ECSPI1_SS1__ECSPI1_SS1 0x1c4 /* 配置SS1引脚,需对应硬件手册的SODIMM编号 */ MX8MP_IOMUXC_ECSPI1_SS2__ECSPI1_SS2 0x1c4 /* 配置SS2引脚,需对应硬件手册的SODIMM编号 */ >; };
- ecspi2的引脚冲突:修改
pinctrl_bt_uart,把UART4的引脚换成其他未被占用的引脚,或者放弃蓝牙UART功能,释放ecspi2的引脚,同时配置pinctrl_ecspi2为SPI功能。
3. 给ecspi2/ecspi3添加spidev节点
在imx8mp-verdin-yavia.dtsi里补充ecspi2和ecspi3的配置,比如:
/* Verdin SPI_2 */ &ecspi2 { status = "okay"; spidev@0 { compatible = "rohm,dh2228fv"; reg = <0>; spi-max-frequency = <10000000>; status = "okay"; }; spidev@1 { compatible = "rohm,dh2228fv"; reg = <1>; spi-max-frequency = <10000000>; status = "okay"; }; }; /* Verdin SPI_3 */ &ecspi3 { status = "okay"; spidev@0 { compatible = "rohm,dh2228fv"; reg = <0>; spi-max-frequency = <10000000>; status = "okay"; }; spidev@1 { compatible = "rohm,dh2228fv"; reg = <1>; spi-max-frequency = <10000000>; status = "okay"; }; };
4. 处理overlay冲突
要么修改官方overlay,把所有需要的spidev节点都加进去,然后只加载这个overlay;要么禁用这个overlay,直接在板级dtsi里完成所有SPI配置,避免冲突。
三、验证配置
修改完成后重新编译设备树,烧写到板子上,重启后查看/dev目录下的spidev节点,确认是否都正常生成。如果还是有问题,可以通过dmesg | grep spi查看内核日志,排查驱动加载和设备节点创建的错误信息。
备注:内容来源于stack exchange,提问作者Nahel VERDIER

