Linux,spidev:为什么它不应该直接在设备树中?

2023-11-23

我想定义一个具有用户模式访问权限的 SPI 设备,如中所述http://linux-sunxi.org/SPIdev

按照这些示例,我在设备树中添加了以下内容:

&ecspi1 {
     .... other stuff ...
    mydev@0 {
       compatible = "spidev";
       spi-max-frequency = <5000000>;
       reg = <2>; /*chipselect*/
    };
};

该平台是i.MX6。 ecspi1 似乎是他们的 SPI 控制器。 然后我确实得到了 /dev/spi0.2 和 /sys/class/spidev/spidev0.2

但在内核跟踪中有一个警告说:

spidev spi0.2:有缺陷的 DT:spidev 直接在 DT 中列出

那么还应该如何描述 spidev 呢?什么是正确的语法?


spidev:为什么它不应该直接在设备树中?

设备树应该描述主板的硬件,但是spidev不描述/识别任何硬件。

马克·布朗写道:

由于 spidev 是 Linux 如何控制设备而不是 系统中硬件的描述我们不应该有节点 在 DT 中被描述为“spidev”,任何 SPI 设备都可以是 spidev,所以这 只是没有有用的描述。

此内核补丁的基本原理和解决方法是https://patchwork.kernel.org/patch/6113191/


那么还应该如何描述 spidev 呢?什么是正确的语法?

您不需要在设备树源中显式使用 spidev,而是需要识别您正在控制的实际设备,例如

     mydev@0 {
-       compatible = "spidev";
+       compatible = "my_spi_device"; 
        spi-max-frequency = <5000000>;

然后(正如 Geert Uytterhoeven 所解释的),修改驱动程序/spi/spidev.c在内核源代码中,将您设备的兼容值添加到spidev_dt_ids[] array

 static const struct of_device_id spidev_dt_ids[] = {
     { .compatible = "rohm,dh2228fv" },
     { .compatible = "lineartechnology,ltc2488" },
     { .compatible = "ge,achc" },
     { .compatible = "semtech,sx1301" },
+    { .compatible = "my_spi_device" },
     {},
 }

建议采用一种替代解决方案,其中涉及对设备树进行快速的更改本文.
只需将“spidev”兼容字符串替换为已经存在的正确字符串即可:

     mydev@0 {
-       compatible = "spidev";
+       compatible = "rohm,dh2228fv";  /* actually spidev for my_spi_dev */
        spi-max-frequency = <5000000>;

由于“rohm,dh2228fv”已经在spidev_dt_ids[]列表,无需编辑驱动程序/spi/spidev.c是需要的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux,spidev:为什么它不应该直接在设备树中? 的相关文章

  • 访问模块内的 IRQ 描述数组并显示操作名称

    我正在用 C 语言编写一个内核模块 该模块正在努力访问 IRQ 描述数组元素并显示这些元素的所有操作名称 一开始 我认为这个 irq desc 数组就像一个宏 但编译后我明白它不是 然后我使用了 for each irq desc irq
  • 在内核模式下读取/写入 Linux 上的 EFI 变量

    我正在研究 Linux UEFI 我想通过我的驱动程序代码访问 efi 变量 目前我正在寻找像 efi get variable 这样的 linux efi h API 但我不知道如何从我的驱动程序代码中调用这些 API struct ef
  • 在 Linux 内核中分配超过 4 MB 的固定连续内存

    为了与正在构建的 PCI 设备进行一些交互 我们希望创建主板可以访问的大块连续内存 就目前情况而言 我能够分配的最大内存大小为 4 MB 我想知道是否有任何方法可以创建更大的区域 我知道我可以使用启动选项mem 这样做 但出于 numa 的
  • 我们可以在 c++ 中使用 POSIX C 库吗?

    我是 Linux 系统编程领域的新手 我目前使用 C 编程 想切换到 C 我们可以在 c 中使用 POSIX C 库中定义的所有函数而不进行任何更改吗 原则您应该能够使用 C 中的任何 C API 该语言包含有利于它的功能 大多数 C 库作
  • Linux内核:从内核空间调用用户空间的回调函数

    我正在编写 Linux 用户空间应用程序 我想从内核空间调用用户空间区域中注册的回调函数 即中断到达 GPIO 引脚 开关按下事件 并在用户空间中调用注册函数 有没有什么方法可以做到这一点 Thanks 经过大量挖掘后 我发现了下面的代码
  • 在 Linux 中获取指向结构设备的指针哪种更干净?

    我需要获得一个指向在linux 中注册的特定设备的指针 简而言之 该设备代表了mii bus目的 问题是这个设备似乎不属于总线 它的dev gt bus is NULL 所以我不能使用这个函数bus for each dev 然而 该设备是
  • 低延迟模式与 Linux 串行端口一起使用是否安全?

    在 Linux 串行端口上使用 low latency tty 模式是否安全 这tty flip buffer push https github com torvalds linux blob master drivers tty tty
  • 抢占的中断处理程序会发生什么?

    即使在一些写得很好的内核书籍中 我也找不到以下问题的正确答案 他们说 ISR 无法休眠 因为它无法重新调度 ISR 因为它没有与任何进程连接 那么当更高优先级的中断抢占正在执行的中断时会发生什么 中断的 ISR 不会再次重新调度 执行 如果
  • request_threaded_irq 的“处理函数”中的 I2c 读取和写入操作如何影响整个驱动程序?

    我有一个带有 request threaded irq 的处理函数和线程函数的驱动程序代码 与此类似 irq handler fn disable device interrupt i2c read from register set di
  • sys_open 是如何工作的?

    我编写了一个简单的字符设备驱动程序 mydev 其中包含 打开 文件操作 在用户空间应用程序中 我打开这个驱动程序节点 使用 open dev mydev O RDONLY open 系统调用内部调用sys open 我只想知道 sys o
  • 类似于 ftrace 打印 CPU 编号

    我想打印当前进程或函数正在执行的 CPU 编号 类似于 ftrace 如下所示 TASK PID CPU TIMESTAMP FUNCTION
  • 对 -finstrument-functions 的未定义引用

    我正在尝试跟踪内核函数并且我正在使用 finstrument functions这样做 但我收到未定义的参考错误 如下所示 arch arm kernel elf c 9 undefined reference to cyg profile
  • 如何在设备树源文件中添加注释

    如何在设备树源文件中添加多行或单行注释 我到处都找不到它 使用注释的默认 c 方式是否有效 使用注释的默认 c 方式是否有效 是的 使用 comment ADDENDUM 我还使用过 C 预处理器 if 0 and endif在测试期间快速
  • 我的驱动程序模块的内核输出奇怪的 dmesg

    从我之前的问题为什么模块加载失败 dev scull0 没有这样的设备或地址 https stackoverflow com questions 62019834 why does module failed to load dev scu
  • 将内核内置模块替换为可加载模块

    我开发了一个内核模块来管理 nf4 标签作为字符设备 我在内核之外开发了这个模块 并在开发阶段将其编译为可加载内核模块 即 ko 进行了测试 一旦驱动程序功能正常且足够稳定 我就使用补丁将其插入 Linux 内核源代码 v4 9 30 以便
  • 为什么在数据包输入时 skb_buffer 需要跳过 20 个字节才能读取传输缓冲区?

    我正在 Linux 中编写一个网络模块 我发现只有在从 skb 缓冲区跳过 20 个字节后才能提取 tcp 标头 即使 API 是 skb transport header 其背后的原因是什么 有人可以详细解释一下吗 传出数据包不需要同样的
  • 在 ARM 处理器上执行存储在外部 SPI 闪存中的程序

    我有一个 ARM 处理器 能够与外部闪存芯片连接 写入芯片的是为 ARM 架构编译的程序 可供执行 我需要知道如何将这些数据从外部闪存获取到 ARM 处理器上以供执行 我可以提前运行某种复制例程 将数据复制到可执行内存空间吗 我想我可以 但
  • 自动持有自旋锁时返回是否不安全?

    受人尊敬的书说 The flags参数传递给spin unlock irqrestore必须与传递给的变量相同spin lock irqsave 您还必须致电spin lock irqsave and spin unlock irqrest
  • Linux 中热插拔设备时检测设备是否存在

    我正在运行 SPIcode http lxr free electrons com source drivers spi spi omap2 mcspi c在熊猫板上 我想知道其中的哪个功能code http lxr free electr
  • 在Linux中断上下文中运行用户线程

    我正在编写一些定制的应用程序 并允许更改 Linux 内核中的中断处理程序代码 我有一个用户线程正在等待中断发生 如果发生中断 那么我要做的第一件事就是执行该用户线程 有什么办法让它发挥作用吗 Thanks 创建一个字符设备 这就是内核所做

随机推荐

  • Java中的声明和定义有什么区别?

    我对这两个术语感到非常困惑 我查了一下 stackoverflow 发现 C 有类似的问题 但 java 没有 有人能解释一下java这两个术语之间的区别吗 概念上的区别很简单 宣言 你是宣告某些东西存在 例如类 函数或变量 你什么也没说w
  • 如何从 Rails 中的 Warden/Devise after_authentication 回调访问会话

    我正在尝试从 Warden 访问当前会话验证后Rails 3 中的回调 在 Devise 下运行 在我的应用程序控制器的顶部我想做一些类似的事情 Warden Manager after authentication do user aut
  • 带有 ng-repeat 的 bootstrap-label 之间没有间距

    当我使用 angular js 中的 ng repeat 添加标签时 它们显示时没有间距 这里有一个Plunker这证明了这一点 但是如果我手动添加标签 只是复制了 html 那么它们就会显示为空白 有没有一种方法可以在标签之间添加空白而不
  • Ruby 相当于 Python 的 for / else

    我一直在寻找 Ruby 中类似 Python 的 while else 结构的东西来改进我的代码 这意味着执行循环 如果循环中的条件任何时候都不为真 则返回 else 语句中的值 在红宝石中 我可以这样做 if items empty Em
  • 获取Qt 4.8 SDK

    我已经有一段时间没有在 Windows 上使用 Qt 了 我知道现在我们应该从 Qt 项目网站下载开源版本 但页面位于http qt project org downloads具有指向 Qt 库和 Qt Creator 的安装程序的单独链接
  • Perl:将 Unicode 字符串打印到 Windows 控制台

    我在将 Unicode 字符串打印到 Windows 控制台 时遇到一个奇怪的问题 考虑这段文字 Intermediary Bye Hello world test 假设它位于名为 file txt 的文件中 当我 go type file
  • 带有字符串参数的主方法入口点给出“不包含...合适的...入口点”错误

    为什么下面的代码块会给出 不包含适合入口点的静态 Main 方法 的编译错误 namespace MyConApp class Program static void Main string args string tmpString tm
  • 动态添加到 DOM 的元素的单击事件

    在 jQuery 1 8 之前 我能够使用 live 在单击由 jquery 动态插入的按钮时触发 现在 on 和 bind 都不适用于页面加载后添加到 DOM 的元素 现在有哪些选择 parent element on click chi
  • 如何启动kubelet服务?

    我运行命令systemctl 停止 kubelet然后尝试启动它systemctl 启动 kubelet 但无法启动它 这是输出systemctl 状态 kubelet kubelet service kubelet The Kuberne
  • 不区分大小写的 str_replace

    我该如何使用str replace但在搜索字符串时不区分大小写 例如 假设我想替换ABcD with a 结果命令将是 string str replace ABcD a string 但是如果有一些像 abCD 这样的字符串 那么我必须再
  • 如何编辑外部 web.config 文件?

    我正在尝试编写一个 winform 应用程序 该应用程序能够编辑已安装的 Web 应用程序的 web config 文件 我已经通读了 ConfigurationManager 和 WebConfigurationManager 类方法 但
  • Python函数无法访问类变量

    我试图访问外部函数中的类变量 但是我收到 AttributeError 类没有属性 我的代码如下所示 class example def init self somevariable raw input Input something de
  • 从 MySQL 数据库读取 BLOB 图像

    我在从 MySQL 数据库读回 blob 时遇到一些问题 我已将其成功插入数据库 但似乎无法将其读回 我知道你们中的一些人可能会想 为什么他使用数据库来存储图像的 blob 而不仅仅是文件路径 文件名 但我希望具有灵活性 因为许多图像将存储
  • 从选择器 SwiftUI 中取消选择项目

    我使用带有选择器的表单 一切正常 我可以从选择器中选择一个元素 但我无法取消选择它 是否存在从选择器中取消选择项目的方法 谢谢你 Picker selection model countries label Text country For
  • 如何说服詹金斯共享多个作业的内部版本号?

    开发团队确实要求设置构建系统 因此每个构建都将为所有分支提供唯一的构建号 构建是由詹金斯使用每个分支的作业进行的 有一个 jenkins 插件可以为作业设置下一个版本号 但这有点无用 至少有两个原因 它将设置单个作业的内部版本号 您无法知道
  • 执行 SQL Server 脚本

    如何自动运行给定文件夹中的所有 SQL 脚本 编写 Windows 脚本 使用FOR构建循环遍历您的文件并使用SQLCMD执行每个文件的实用程序 for f in c MySQLScripts sql do sqlcmd i f
  • 在 Android 中从文件读取/写入字符串

    我想通过从 EditText 输入的文本将文件保存到内部存储 然后我希望同一个文件以字符串形式返回输入的文本并将其保存到另一个字符串以便稍后使用 这是代码 package com omm easybalancerecharge import
  • 在gradle中重命名apk

    我想从 gradle 重命名我的 apk 我在构建中有以下几行 applicationVariants all variant gt def file variant outputFile def filename file name re
  • shared_ptr会自动释放内存吗?

    我需要在这里使用shared ptr 因为我无法更改API Foo1 foo1 new Foo1 shared ptr
  • Linux,spidev:为什么它不应该直接在设备树中?

    我想定义一个具有用户模式访问权限的 SPI 设备 如中所述http linux sunxi org SPIdev 按照这些示例 我在设备树中添加了以下内容 ecspi1 other stuff mydev 0 compatible spid