【问题标题】:How to add an SPI device driver, if a device is already accessed by the "spidev" driver?如果设备已被“spidev”驱动程序访问,如何添加 SPI 设备驱动程序?
【发布时间】:2016-11-14 11:03:48
【问题描述】:

Linux 内核:

我的问题是如何从内核驱动程序访问 SPI 从设备,如果该设备已被“spidev”驱动程序访问。

在硬件层面,我们在 SOC 端(Marvell Cetus)有一个 SPI 主设备,一个 SPI 从设备(FPGA 设备)连接到 4 线 SPI 总线顶部的主设备。 所以系统中只使用了一条SS线

在软件层面,我们有 linux 内核 3.10.104,基于设备树源模型探测设备驱动程序。

在我们的 DTS 文件中,我们在 CS (ChipSelect) #0 上定义了一个 SPI 主机(“marvell,orion-spi”)和一个 SPI 从机(“spidev”)。 尝试在同一 CS #0 上的同一 SPI 主机下添加另一个 SPI 从机失败 - 抱怨只能将一个从机注册到同一 CS 上的主机。

(dmesg: "orion_spi f1010600.spi: 芯片选择 0 已经在使用")

这是我们 DTS 文件中的相关部分:

spi0: spi@10600 {

    status = "okay";

    spifpga@0 {
     #address-cells = <1>;
     #size-cells = <1>;
     compatible = "spidev";
     reg = <0>;
     spi-max-frequency = <25000000>;
    };

    lattice {
     #address-cells = <1>;
     #size-cells = <1>;
     compatible = "msys_lattice_drv";
     reg = <0>;
     spi-max-frequency = <25000000>;

    };
};

“spidev”经常被我们的用户空间进程使用,我们不能删除它。 此外,确实需要为从属 FPGA 添加新的内核驱动程序,以处理一些问题,包括内核空间中的中断。

假设这个设备已经由“spidev”处理,我们如何添加另一个内核驱动来处理同一个 SPI 从设备?

谢谢!

【问题讨论】:

  • 您根本不能为一台设备安装两个驱动程序。这是不合逻辑的。你可能有一个XY问题。为从设备编写一个真正的SPI协议驱动,并消除spidev实例。
  • 您以后必须删除spidev。这是一个hack,很久以前就进入内核了。

标签: linux linux-kernel


【解决方案1】:

强烈建议不要在设备树中首先使用compatible = "spidev",因为它没有描述真正的硬件设备。

spidev 只是一个通用内核驱动程序,将低级 API 导出到用户空间 形成/dev接口。

您不能为一个硬件设备注册两个驱动程序。您的替代方法是根据 Linux SPI 驱动模型编写自己的 SPI 芯片(客户端)驱动程序。

LINUX documentation

【讨论】:

    【解决方案2】:

    正如其他答案所暗示的那样,这是不允许的。

    你说你不能删除 spidev 设备,但是有什么理由你的新驱动程序不能提供与现在 spidev 通用驱动程序相同的功能,然后替换设备树中的 spidev 条目?它创建 sysFS 条目,并允许使用命令行、ioctl 和读/写函数进行基本传输。我假设您已经有了传输数据的方法,所以您已经掌握了 spidev 驱动程序所做的大部分工作。

    The documentation for the spidev device can be found here.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      相关资源
      最近更新 更多