嵌入式Linux驱动开发——解决/sys/bus/spi/devices下没有对应的spi设备文件

问题描述

最近在学习Linux驱动开发中SPI总线的驱动框架,但在修改完设备树添加完对应的spi设备节点后,理应在/sys/bus/spi下会有对应的spi设备,我的目录下面没有。

无spi设备

然后我查看了/proc/device-tree,发现有对应的spi设备节点,我就先没有过多理会这个问题。

/proc/device-tree下有对应的节点信息

 

设备树.dts对应的spi设备节点信息

但在写完对应的驱动后加载spi对应的.ko文件,.probe函数没有执行;卸载对应的驱动文件后.remove也没有执行(在终端没有打印对应的语句)。

.probe函数
.remove函数

原因分析:

这时我知道spi驱动和spi设备没有匹配,驱动应该没有什么问题,问题大概率出现在.dts文件中对应的spi设备节点。

解决方案:

我总看我的spi节点中的信息发现不出什么问题,然后我实在没办法,将正点官方的设备树对应的spi节点信息复制到我的设备树下,用修改过后的设备树启动,重新查看/sys/bus/spi/devices,发现出现了一个设备文件,然后重新加载驱动、卸载驱动对应的.probe和.remove都会正常执行了。

正点原子正常节点信息

&ecspi3 {
        fsl,spi-num-chipselects = <1>;
        cs-gpio = <&gpio1 20 GPIO_ACTIVE_LOW>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_ecspi3>;
        status = "okay";

	spidev: icm20608@0 {
	compatible = "alientek,icm20608";
        spi-max-frequency = <8000000>;
        reg = <0>;
    };
};

我的有错误的节点信息

&ecspi3 {
	fsl,spi-num-chipselects = <1>;
	cs-gpio = <&gpio1 20 GPIO_ACTIVE_LOW>;			//不能定义成cs-gpios
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_ecspi3>;
	status = "okay";

	spidev: icm20608@0 {
		reg = <0>;
		compatible = "alientek,icm20608";
		spi_max_frequency = <8000000>;
	};
};
出现spi设备文件

 

probe正常执行

 

remove正常执行

我还是没有发现到底是什么问题,期间我还尝试调整了一下每个属性的顺序,但还是不行。最后我在word中一句一句比较,最终发现了问题。我的是spi_max_frequency,正点原子正常的是spi-max-frequency,然后查看绑定文档确实不是''_''而是''-''。这个不会影响设备树,但可能就会导致内核无法识别到是不是具体的spi设备。

总结

写代码的时候还是仔细一些,可以减少一些奇奇怪怪的bug。不仅仅是spi设备,我猜想其他设备的节点属性信息写错,在对应的总线下可能也不会出现相应的设备文件。(未证实)

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

门牙会稍息

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值