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:为什么它不应该直接在设备树中? 的相关文章

  • 如何在Android 5内核设备树中正确配置Atmel MXT641T触摸芯片的INT线中断?

    我在 Android 5 平台上使用 Atmel MXT641T 驱动的触摸屏时遇到问题 我的设置如下 硬件 Inforce 6309 SBC 配备 Qualcomm Snapdragon 410 msm8916 ARM64 处理器 采用
  • 在 Linux 中获取指向结构设备的指针哪种更干净?

    我需要获得一个指向在linux 中注册的特定设备的指针 简而言之 该设备代表了mii bus目的 问题是这个设备似乎不属于总线 它的dev gt bus is NULL 所以我不能使用这个函数bus for each dev 然而 该设备是
  • UIO 设备上的 mmap EINVAL 错误

    在尝试使用 UIO 而不是直接映射后 我在 Xilinx Zynq 上映射物理内存时遇到问题 dev mem 虽然计划是以普通用户身份运行应用程序 而不是root这仍在运行root 显然 第一个映射成功 其余映射到同一个文件描述符12 de
  • Spidev 不使用 ioctl 同时写入/读取

    我希望找到一些帮助 即使这个问题可能更多地与硬件相关而不是与软件相关 我们将会看到 我正在开发基于 Freescales P1021 处理器 ppc e500v2 内核 的定制板 将连接外部 PCB 并可通过 SPI 进行配置 该外部 PC
  • Raspberry Pi 3 上通用时钟框架驱动程序的 Hello World

    我正在尝试为通过 I2C 连接到 Raspberry PI 3 的时钟编写一个通用时钟框架驱动程序 注意 我对 Linux 和内核编程都很陌生 更新 成功 下面的代码适用于 Hello World 驱动程序 为了加载驱动程序 我必须对设备树
  • 在用户空间中启用写组合 IO 访问

    我有一个带有用户空间驱动程序的 PCIe 设备 我通过 BAR 向设备写入命令 这些命令对延迟敏感并且数据量很小 64 字节 因此我不想使用 DMA 如果我使用以下命令重新映射内核中 BAR 的物理地址ioremap wc然后将64字节写入
  • 从内核模块向用户空间通知 GPIO 中断[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有一段代码可以检测内核模块中的 GPIO 中断 现在 我正在寻找一种机制 在检测到来自内核模块的 gpio 中断时通知用户空间 任何与不同选项
  • 添加条目到task_struct并初始化为默认值

    我想添加一个条目到进程控制块结构 task struct 让我们说一种标记某些进程的方法 我想将除 一些特殊进程 之外的所有进程的该字段初始化为 0 稍后通过调用sched setscheduler 我将为 特殊进程 设置此标志 有谁知道如
  • 对 -finstrument-functions 的未定义引用

    我正在尝试跟踪内核函数并且我正在使用 finstrument functions这样做 但我收到未定义的参考错误 如下所示 arch arm kernel elf c 9 undefined reference to cyg profile
  • 使用时间戳计数器获取时间戳

    我使用下面的代码来获取处理器的时钟周期 unsigned long long rdtsc void unsigned hi lo asm volatile rdtsc a lo d hi return unsigned long long
  • 如何在设备树源文件中添加注释

    如何在设备树源文件中添加多行或单行注释 我到处都找不到它 使用注释的默认 c 方式是否有效 使用注释的默认 c 方式是否有效 是的 使用 comment ADDENDUM 我还使用过 C 预处理器 if 0 and endif在测试期间快速
  • 添加 request_mem_region 后,我的驱动程序每次第一次访问都会失败,并显示“忙”消息

    好吧 这对我来说真的很奇怪 我有一个模拟的 CAN 总线驱动程序 它是一个 Linux 内核模块 然后我有一个在用户空间中运行的测试应用程序 它通过打开文件描述符并发送来访问驱动程序ioctl 消息 现在 CAN 总线驱动程序只是我一直采用
  • 如何编写 Linux .dts 设备树文件?

    我要在我的开发板上启动Linux 我需要一个dts文件 设备树文件 来描述整个硬件 但我对这个文件的语法知之甚少 不足以在板上正确运行Linux 我现在所知道的只是如何描述一个单元的中断号 频率 地址 父单元及其兼容的驱动程序类型 如下所述
  • Linux 内核中的 DMA 映射和 DMA 引擎是什么?

    Linux 内核中的 DMA 映射和 DMA 引擎是什么 DMA映射API和DMA引擎API何时可以在Linux设备驱动程序中使用 任何真正的 Linux 设备驱动程序示例作为参考都会很棒 Linux 内核中的 DMA 映射和 DMA 引擎
  • ARM架构中不同处理器模式下如何使用内核堆栈?

    据我了解 每个进程都有一个用户堆栈和内核堆栈 除此之外 ARM 架构中的每种模式都有一个堆栈 所以我想知道不同的堆栈和堆栈指针在 ARM 模式下如何工作 另外 何时会使用与进程关联的内核堆栈 何时会使用与进程关联的内核堆栈 当您进行系统调用
  • 开放固件设备树概述/参考手册

    我正在尝试为嵌入式 PowerPC 板设置驱动程序 今天执行此操作的正确方法是使用 OpenFirmware 设备树数据结构 dtb 文件 从 dts 文件编译 创建树非常简单 但是如何让我的设备驱动程序找到它的节点和其中的数据 我还没有找
  • I2C 驱动程序应如何在 ACPI 中与 HID PRP0001 匹配

    我正在尝试实例化这个传感器 https elixir bootlin com linux v5 2 source drivers iio proximity vl53l0x i2c c在 ACPI 中使用设备特定数据 即Name DSD 并
  • 无法在 BeagleBone Green Wireless 上配置 SPI0

    注 所选答案为解决该问题的原始答案 更多详细信息请参阅下面的补充答案 我无法在 BeagleBone Green Wireless BBGW 上配置 SPI0 我试图在不使用覆盖层的情况下实现这一目标 仅使用纯 DeviceTree dev
  • 我的属性太活泼了,我该怎么办?

    在 Linux 设备驱动程序中 创建 sysfs 属性probe太活泼了 具体来说 它经历了与用户空间的竞争条件 http kroah com log blog 2013 06 26 how to create a sysfs file c
  • 我们可以使用 x86_64 CPU 原子在 PCI Express 上生成复合原子操作吗?

    如您所知 从2 0版本开始 PCI Express支持复合原子操作 FetchAdd Swap CAS https pcisig com sites default files specification documents ECN Ato

随机推荐

  • 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