从另一个驱动程序检测 spi 设备

Detect spi device from another driver

我有一个基于 Freescale imx.6q (arm) 的主板。 硬件配置有devicetree。

它对板载 fpga 的时序和电压进行了重大不兼容更改,但这些更改对内核是不可见的。 EE 告诉我们不应该加载旧的 fpga 固件,以免损坏它。我想用相同的代码支持两种硬件(这已经造成混淆)

我想到的解决办法是这样的: 板上有几个新的spi温度传感器。如果我可以从这些设备之一读取,我可以推断我需要新固件。

我如何(在一个驱动程序中)获取一个 spi 设备然后释放它? 我怀疑我可以用设备树做这样的事情, 但是我不想让设备不可用。

有任何类似的想法或例子吗?

阅读问题后,我认为您关心的是如何为多个硬件添加软件支持。 如果是这种情况,我认为我们可以编写两个驱动程序来支持两种具有不同配置(如 irq、电压、寄存器组等)的硬件。 所以我将在 Makefile 和配置文件中启用这两个驱动程序。 因此,在启动时调用驱动程序探测时,我们可以使用驱动程序中的 spi_read 命令检查硬件 ID。

如果硬件 ID 匹配,则驱动程序探测成功,驱动程序可用于与硬件交互。 如果 spi_read 失败,则驱动程序探测本身也会失败。 我认为这会成功。

编辑(回答问题) 要检测使用来自另一个 driver 的 SPI 设备,请在设备树结构中使用对设备的引用。

简答:在您的设备 dts 条目中添加对 spi 设备的引用。

稍微长一点的答案: 将 spi 添加到另一个设备 driver 时,您实际上是在添加一个子设备,它可能需要自己的 driver。我有一个 FPGA,它通过(足够接近可以考虑的东西)SPI 加载它的固件。我开始的想法是将 spi 设备作为更大的 driver 的一部分,但是投入的工作越多,它就越明显是它自己的设备,具有独特的目的和功能来自 driver 的其余部分。我将该代码分成了自己的 driver。 现在,我的 driver 没有引用 SPI 设备,而是引用了 FPGA 管理器设备。

参见 https://github.com/d4ddi0/linux/blob/v4.12evi/arch/arm/boot/dts/imx6q-evi.dts

的第 98、370 行

和 确保在 driver 完成加载

之前加载 spi driver

我对问题的原始回答(出于历史目的):

我最后做的是使用不同的设备树文件。差异在初始安装时就知道了(基于序列号)。引导加载程序知道要加载哪个 dts 文件名。

FPGA固件版本有多个,根据dts中的描述选择合适的

这样,我仍然可以更新 driver and/or dts 而不会损坏。

尽管它在运行时没有检测到任何东西,但在实践中效果很好。

还有一个问题,如果我把新版本的SD卡换成旧的,会加载不正确的固件。为了真正解决最后一个问题,我们讨论了添加 EEPROM 以唯一标识未来板上的硬件版本。