我有一个基于飞思卡尔imx.6q(arm)的主板。 硬件配置了devicetree。
它改变了对板载fpga的时序和电压的主要不兼容的改变,但这些改变对于内核是不可见的。 EE告诉我们,我们不应该加载旧的fpga固件,以免损坏它。我想支持来自相同代码的两个硬件(它已经引起混淆)
我想到的解决方案是这样的: 电路板上有几个新的spi温度传感器。如果我可以从其中一个设备上读取,我可以推断出我需要新的固件。
我怎样(在一个驱动程序中)抓住spi设备然后释放它? 我怀疑我可以用设备树做这样的事情, 但我不想让设备不可用。
这样的事情有什么想法或例子吗?
答案 0 :(得分:1)
简答:在你的设备dts条目中添加对spi设备的引用。
答案稍长: 将spi添加到另一个设备驱动程序时,您实际上是在添加一个子设备,它可能需要自己的驱动程序。我有一个FPGA加载其固件(足够接近的东西)SPI。我开始的想法只是将spi设备视为更大驱动程序的一部分,但是进入它的工作越多,就越明显它是它自己的设备,其目的和功能与其他设备不同。司机。我将该代码分成了自己的驱动程序。 现在,我的驱动程序只是引用了一个FPGA管理器设备而不是对SPI设备的引用。
见https://github.com/d4ddi0/linux/blob/v4.12evi/arch/arm/boot/dts/imx6q-evi.dts
的第98,370行和 确保在驱动程序完成加载之前加载了spi驱动程序
我对问题的原始答案(出于历史目的):
我最终做的是使用不同的devicetree文件。在初始安装时间(基于序列号)知道差异。引导加载程序知道要加载哪个dts文件名。
有多个FPGA固件版本,根据dts中的描述选择正确的版本。
这样,我仍然可以在没有破损的情况下更新驱动程序和/或dts。
这在实践中运行良好,即使它在运行时没有检测到任何东西。
仍然存在一个问题,如果我从新版本中取出SD卡并将其放入旧版本中,则会加载不正确的固件。为了真正解决这个最后一个问题,我们已经讨论过添加一个EEPROM来唯一识别未来主板上的硬件版本。