Linux 是否将多个SPI端口(设备)注册到单个SPI平台驱动程序?
我正在开发一个LinuxSPI驱动程序来处理通过spi端口的通信。 我的SoC提供三个spi模块(我理解为端口),称为ecspi1/ecspi2/ecspi3。 我需要使用ecspi1和ecspi2发送两种数据 我已经实现了一个已注册到spi驱动程序的驱动程序,并已通过向dts和驱动程序添加以下内容成功处理了ecspi1: [dts]Linux 是否将多个SPI端口(设备)注册到单个SPI平台驱动程序?,linux,linux-kernel,linux-device-driver,embedded-linux,spi,Linux,Linux Kernel,Linux Device Driver,Embedded Linux,Spi,我正在开发一个LinuxSPI驱动程序来处理通过spi端口的通信。 我的SoC提供三个spi模块(我理解为端口),称为ecspi1/ecspi2/ecspi3。 我需要使用ecspi1和ecspi2发送两种数据 我已经实现了一个已注册到spi驱动程序的驱动程序,并已通过向dts和驱动程序添加以下内容成功处理了ecspi1: [dts] &ecspi1 { status = "okay"; fpga1: lfe5u12f6bg256i@0 { reg =
&ecspi1 {
status = "okay";
fpga1: lfe5u12f6bg256i@0 {
reg = <0>;
compatible = "lattice,lfe5u12f6bg256i";
spi-max-frequency = <10000000>;
};
};
&ecspi1 {
status = "okay";
fpga1: lfe5u12f6bg256i@0 {
reg = <0>;
compatible = "lattice,lfe5u12f6bg256i";
spi-max-frequency = <10000000>;
};
};
+&ecspi2 {
+ status = "okay";
+
+ fpga0: fpga_fw@0 {
+ reg = <0>;
+ compatible = "fpga_fw,lfe5u12f6bg256i";
+ spi-max-frequency = <10000000>;
+ };
+};
我已经尝试通过以下修改将ecspi2添加到驱动程序中。
然而,驱动程序在引导时探测了两次,在第二次探测期间失败
[dts]
&ecspi1 {
status = "okay";
fpga1: lfe5u12f6bg256i@0 {
reg = <0>;
compatible = "lattice,lfe5u12f6bg256i";
spi-max-frequency = <10000000>;
};
};
&ecspi1 {
status = "okay";
fpga1: lfe5u12f6bg256i@0 {
reg = <0>;
compatible = "lattice,lfe5u12f6bg256i";
spi-max-frequency = <10000000>;
};
};
+&ecspi2 {
+ status = "okay";
+
+ fpga0: fpga_fw@0 {
+ reg = <0>;
+ compatible = "fpga_fw,lfe5u12f6bg256i";
+ spi-max-frequency = <10000000>;
+ };
+};
有人知道如何在单个驱动程序中处理多个SPI端口(设备)吗?要使用同一个驱动程序处理两个相同的SPI设备,驱动程序不需要修改,只需要一个兼容字符串: 数据传输系统:
驱动程序将被实例化两次,每个设备一次,每次它将接收不同的
struct spi_device
能否显示模块初始化函数和探测函数?如果需要多个,则需要在->init()
回调中注册它们。在这种情况下,驱动程序将是平台(作为SPI从设备的多实例)。我想您可能会在内核中找到示例。@0andriy谢谢您的建议。我意识到应该修改它以适应多实例化。看起来您不需要它。答案中描述了一个标准的枚举机制。你的建议对我很有用,非常感谢。但是,您对DTS的回答有一个错误。标签名称(fpga1:lfe5u12f6bg256i@0)虽然它们具有相同的兼容字符串,但不应相同。这将导致“重复标签”错误。因此,只需修改兼容字符串就足够了。毕竟,谢谢你的帮助。感谢。很高兴知道这是有帮助的,谢谢你报告错误,我刚刚修复了回复。
static const struct of_device_id fpga_spi_of_match[] = {
{ .compatible = "lattice,lfe5u12f6bg256i", },
{},
};