Gumstix升级内核后设备树配置SPI无时钟片选信号求助
问题描述
- 设备升级新版本内核,基于Gumstix提供的Yocto构建工程完成编译,生成镜像可正常启动,内核SPIDEV驱动配置已验证生效
- 硬件基于Gumstix Tobi板卡设计,U-Boot启动时加载对应板卡设备树,但SPI功能始终无法正常工作
- 已在
omap3-overo-storm-tobi.dts文件中添加如下配置:
&omap3_pmx_core { mcspi1_pins: pinmux_mcspi1_pins { pinctrl-single,pins = < OMAP3_CORE1_IOPAD(0x21c8, PIN_INPUT | MUX_MODE0) /* mcspi1_clk.mcspi1_clk */ OMAP3_CORE1_IOPAD(0x21ca, PIN_INPUT | MUX_MODE0) /* mcspi1_simo.mcspi1_simo */ OMAP3_CORE1_IOPAD(0x21cc, PIN_INPUT | MUX_MODE0) /* mcspi1_somi.mcspi1_somi */ OMAP3_CORE1_IOPAD(0x21ce, PIN_INPUT | MUX_MODE0) /* mcspi1_cs0.mcspi1_cs0 */ OMAP3_CORE1_IOPAD(0x21d0, PIN_INPUT | MUX_MODE0) /* mcspi1_cs1.mcspi1_cs1 */ >; }; }; &mcspi1 { pinctrl-names = "default"; pinctrl-0 = <&mcspi1_pins>; spidev@0 { compatible = "spidev"; spi-max-frequency = <48000000>; reg = <1>; spi-cpha; }; };
- 系统重启后已成功生成
/dev/spidev1.1设备节点,但向该节点传输数据时,无法观测到SPI时钟线、CS1片选线激活,需要排查配置遗漏。
排查修复步骤
1. 修正设备树基础配置错误
当前设备树存在3个直接影响SPI运行的问题:
- McSPI1控制器节点没有添加
status = "okay"属性。OMAP平台的外设控制器默认状态都是disabled,不显式使能的话,即使子节点匹配生成了设备节点,控制器硬件也不会完成初始化,时钟、电源域都不会开启。 - 没有显式声明片选数量和片选GPIO。OMAP3 McSPI驱动部分版本存在内置片选逻辑失效的问题,需要手动指定
cs-gpios属性,同时声明num-cs,否则CS1不会被正确驱动。 - spidev节点命名不规范。
spidev@0的后缀值和reg = <1>不匹配,不符合设备树规范,虽然不一定直接导致功能失效,但会触发内核解析告警,也可能导致部分驱动逻辑匹配异常。
修正后的&mcspi1节点参考配置如下:
&mcspi1 { pinctrl-names = "default"; pinctrl-0 = <&mcspi1_pins>; status = "okay"; num-cs = <2>; /* McSPI1 CS0对应GPIO3_0,CS1对应GPIO3_1,根据实际硬件调整极性 */ cs-gpios = <&gpio3 0 GPIO_ACTIVE_LOW>, <&gpio3 1 GPIO_ACTIVE_LOW>; spidev@1 { compatible = "spidev"; spi-max-frequency = <48000000>; reg = <1>; spi-cpha; status = "okay"; }; };
2. 排查PinMux冲突
- 检查当前dts以及所有引用的dtsi文件,确认0x21c8~0x21d0这几个McSPI1引脚没有被其他外设节点(比如NAND Flash、额外串口、GPIO按键)复用,如果存在重复配置,后加载的节点会覆盖PinMux设置,导致SPI引脚被切到其他功能模式。
- 系统启动后进入debugfs查看引脚状态,执行
cat /sys/kernel/debug/pinctrl/*/pins | grep -E '0x21c8|0x21ca|0x21cc|0x21ce|0x21d0',核对这几个引脚的mux模式是否为MUX_MODE0,输入输出配置是否正确。
3. 校验驱动运行状态
- 启动后执行
dmesg | grep -E 'spi|mcspi',查看控制器初始化日志,正常情况应该能看到McSPI控制器初始化成功、spidev1.1注册成功的日志,如果存在时钟获取失败、资源申请失败、IRQ申请失败的报错,根据报错信息对应排查即可。 - 执行
cat /sys/kernel/debug/clk/clk_summary | grep mcspi1,查看McSPI1的时钟使能计数,如果计数为0说明控制器时钟没开,硬件根本没有工作。
4. 用标准工具验证功能
不要直接用自定义应用测试,先用内核自带的spidev_test工具验证:
- 在内核源码的
tools/spi/目录下找到spidev_test.c,用对应平台的交叉编译工具编译后传到设备 - 执行
./spidev_test -D /dev/spidev1.1 -v -m 1,参数-m 1对应你开启spi-cpha的SPI模式1配置 - 此时用示波器测量对应引脚,正常情况下CS1会先拉低,然后持续输出时钟信号,SIMO引脚会输出测试数据。
5. 硬件排查
如果以上软件配置都修正后还是没有信号,检查硬件:
- 确认Tobi板卡上的SPI引脚没有被板载外设占用,相关跳线帽配置正确
- 测量引脚电平,确认没有短路、虚焊问题,引脚没有被外部电路钳死在固定电平
内容的提问来源于stack exchange,提问作者Jon Mandrell
相关产品推荐
相关产品推荐

