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

这篇具有很好参考价值的文章主要介绍了嵌入式Linux驱动开发——解决/sys/bus/spi/devices下没有对应的spi设备文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

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

spi-max-frequency,驱动开发,linux,经验分享
无spi设备

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

spi-max-frequency,驱动开发,linux,经验分享
/proc/device-tree下有对应的节点信息

 

spi-max-frequency,驱动开发,linux,经验分享
设备树.dts对应的spi设备节点信息

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

spi-max-frequency,驱动开发,linux,经验分享
.probe函数
spi-max-frequency,驱动开发,linux,经验分享
.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-max-frequency,驱动开发,linux,经验分享
出现spi设备文件

 

spi-max-frequency,驱动开发,linux,经验分享
probe正常执行

 

spi-max-frequency,驱动开发,linux,经验分享
remove正常执行

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

spi-max-frequency,驱动开发,linux,经验分享

spi-max-frequency,驱动开发,linux,经验分享

总结

写代码的时候还是仔细一些,可以减少一些奇奇怪怪的bug。不仅仅是spi设备,我猜想其他设备的节点属性信息写错,在对应的总线下可能也不会出现相应的设备文件。(未证实)文章来源地址https://www.toymoban.com/news/detail-570264.html

到了这里,关于嵌入式Linux驱动开发——解决/sys/bus/spi/devices下没有对应的spi设备文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式Linux驱动开发——常见框架梳理

    本文主要介绍了Linux驱动开发中一些常用的驱动框架,platform、input、iic、spi等,硬件平台使用的是正点原子的imx6ull开发板。 不管什么框架最后都是要追溯到配置IO的电气属性和复用功能 如果要使用外部中断,设备树节点中还需添加相关信息,什么边沿触发 1:module_init和mod

    2024年02月15日
    浏览(67)
  • 嵌入式Linux驱动开发 04:基于设备树的驱动开发

    前面文章 《嵌入式Linux驱动开发 03:平台(platform)总线驱动模型》 引入了资源和驱动分离的概念,这篇文章将在前面基础上更进一步,引入设备树的概念。 在平台总线驱动模型中资源和驱动已经从逻辑上和代码组织上进行了分离,但每次调整资源还是会涉及到内核,所以现

    2024年02月16日
    浏览(69)
  • 正点原子嵌入式linux驱动开发——Linux 网络设备驱动

    网络驱动是linux里面驱动三巨头之一 ,linux下的网络功能非常强大,嵌入式linux中也常常用到网络功能。前面已经讲过了字符设备驱动和块设备驱动,本章就来学习一下linux里面的 网络设备驱动 。 本次笔记中讨论的都是有线网络! 提起网络,一般想到的硬件就是“网卡”。在

    2024年01月17日
    浏览(71)
  • 【嵌入式Linux驱动】驱动开发调试相关的关系记录

    https://www.processon.com/mindmap/64537772b546c76a2f37bd2f

    2024年02月02日
    浏览(56)
  • 嵌入式Linux驱动开发系列六:Makefile

    Makefile是什么? gcc hello.c -o hello gcc aa.c bb.c cc.c dd.c ... make工具和Makefile make和Makefile是什么关系? make工具:找出修改过的文件,根据依赖关系,找出受影响的相关文件,最后按照规则单独编译这些文件。 Makefile文件:记录依赖关系和编译规则。 必须要学精Makefile吗? 怎么学习Makefi

    2024年02月13日
    浏览(59)
  • 嵌入式Linux驱动开发(LCD屏幕专题)(三)

    1. 硬件相关的操作 LCD驱动程序的核心就是: 分配fb_info 设置fb_info 注册fb_info 硬件相关的设置 硬件相关的设置又可以分为3部分: 引脚设置 时钟设置 LCD控制器设置 2. 在设备树里指定LCD参数 3. 编程 3.1 从设备树获得参数 时序参数、引脚极性等信息,都被保存在一个display_timi

    2024年02月09日
    浏览(62)
  • 嵌入式Linux驱动开发(LCD屏幕专题)(一)

    总的分辨率是 yres*xres。 以下三种方式表示颜色 每个屏幕都有一个内存(framebuffer)如下图,内存中每块数据对用屏幕上的一个像素点,设置好LCD后,只需把颜色数据写入framebuffer即可。 Framebuffer驱动属于字符设备驱动,我们先说字符设备驱动框架如下图: 驱动主设备号 构造

    2024年02月09日
    浏览(61)
  • 嵌入式linux驱动开发篇之设备树

    设备树(Device Tree)是一种用于描述嵌入式系统硬件组件及其连接关系的数据结构。它被广泛用于嵌入式 Linux 系统,尤其是针对使用多种不同架构和平台的嵌入式系统。它是一种与硬件描述相关的中间表示形式,将硬件信息抽象成一种可移植的格式,使得操作系统和引导加载

    2024年02月22日
    浏览(69)
  • 嵌入式Linux驱动开发 02:将驱动程序添加到内核中

    在上一篇文章 《嵌入式Linux驱动开发 01:基础开发与使用》 中我们已经实现了最基础的驱动功能。在那篇文章中我们的驱动代码是独立于内核代码存放的,并且我们的驱动编译后也是一个独立的模块。在实际使用中将驱动代码放在内核代码中,并将驱动编译到内核中也是比较

    2023年04月09日
    浏览(74)
  • 嵌入式Linux驱动开发系列五:Linux系统和HelloWorld

    三个问题 了解Hello World程序的执行过程有什么用? 编译和执行:Hello World程序的执行分为两个主要步骤:编译和执行。编译器将源代码转换为可执行文件,然后计算机执行该文件并输出相应的结果。了解这个过程可以帮助我们理解如何将代码转化为可运行的程序。 语法和语义

    2024年02月13日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包