我的问题是如何从内核驱动程序访问SPI从设备,如果该设备已被" spidev"驱动程序。
在HW级别,我们在SOC端(Marvell Cetus)上有一个SPI主控制器,一个SPI从器件(FPGA器件)连接到4线SPI总线顶部的主控制器。 所以系统中只使用了一条SS线。
在SW级别,我们有Linux内核3.10.104,根据设备树源模型探测设备驱动程序。
在我们的DTS文件中,我们在CS(ChipSelect)上定义了一个SPI主设备(" marvell,orion-spi")和一个SPI从设备(" spidev")# 0。 尝试在同一个CS#0上的同一SPI主设备下添加另一个SPI从设备会失败 - 抱怨只有一个从设备可以在同一个CS上注册到主设备。
(dmesg:" orion_spi f1010600.spi:chipselect 0已在使用")
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>;
};
};
&#34; spidev&#34;我们的用户空间流程经常使用它,我们无法将其删除。 此外,确实需要为该从FPGA添加新的内核驱动程序,以便处理一些问题,包括内核空间中的中断。
我们如何添加另一个处理相同SPI从设备的内核驱动程序,假设该设备已由&#34; spidev&#34;处理。 ?
谢谢!
答案 0 :(得分:1)
强烈建议不要在设备树中使用“ compatible = "spidev"
”,因为它没有描述真正的硬件设备。
spidev 只是一个通用内核驱动程序,可将低级API导出到用户空间
形式/dev
界面。
您不能为一个硬件设备注册两个驱动程序。您的替代方法是根据Linux SPI驱动程序模型编写自己的SPI芯片(客户端)驱动程序。
答案 1 :(得分:0)
其他答案都提到,这是不允许的。
您说您无法删除spidev设备,但是您的新驱动程序是否有任何原因不能提供与spidev通用驱动程序相同的功能,然后替换设备树中的spidev条目?它创建sysFS条目,并允许使用命令行,ioctl和读/写功能进行基本传输。我假设您已经具有传输数据的方法,因此您已经掌握了spidev驱动程序的大部分工作。