Linux kernel 基于中断和基于轮询的SPI事务有什么区别

Linux kernel 基于中断和基于轮询的SPI事务有什么区别,linux-kernel,linux-device-driver,spi,Linux Kernel,Linux Device Driver,Spi,我对SPI通信协议有一些疑问。在我的体系结构中,处理器和CPLD设备之间有一个SPI通信链路。我想写一个CPLD寄存器 我计划编写CPLd LKM,它将使用spi_sync之类的调用将CPLd寄存器的地址和值传递给spi linux内核 P>我需要考虑处理器作为主设备和CPLD设备作为从属设备吗? 另外,您想知道基于中断和基于轮询的SPI事务是什么意思,以及为什么在启动时建议使用基于轮询的事务 P>我需要考虑处理器作为主设备和CPLD设备作为从属设备吗? 连接到CPU的SPI控制器可能是SP

我对SPI通信协议有一些疑问。在我的体系结构中,处理器和CPLD设备之间有一个SPI通信链路。我想写一个CPLD寄存器

我计划编写CPLd LKM,它将使用spi_sync之类的调用将CPLd寄存器的地址和值传递给spi linux内核

<> P>我需要考虑处理器作为主设备和CPLD设备作为从属设备吗? 另外,您想知道基于中断和基于轮询的SPI事务是什么意思,以及为什么在启动时建议使用基于轮询的事务

<> P>我需要考虑处理器作为主设备和CPLD设备作为从属设备吗? 连接到CPU的SPI控制器可能是SPI主机(尽管有些SOC带有SPI控制器,可以在主模式或从模式下运行)。
CPLD设备的SPI控制器可能是SPI从设备(尽管有CPLD设计,例如Xilinx,可以是SPI主设备)

注:
有时SPI控制器与其设备紧密耦合,因此被视为“SPI设备”,例如SPI串行闪存芯片(可能是从设备)

此外,您还想知道基于中断和基于轮询的SPI事务的含义

您正在询问如何向SPI驱动程序指示传输完成。这是SPI控制器与其处理器之间的交互。
在多处理操作系统(例如Linux)中,驱动程序可以在启动I/O(读或写)操作后挂起线程。SPI完成中断将触发SPI ISR的执行,然后将唤醒挂起的线程并允许驱动程序完成I/O操作。
如果在完成时未生成中断,则可以使用轮询方法。在某个时间间隔,SPI状态寄存器将被读取并检查I/O是否完成。如果未完成,则驾驶员必须继续等待。如果状态指示传输已完成,则驾驶员将完成操作

一些SPI从设备可能会请求或要求SPI主设备执行读取。
通常采用特定于SPI从设备的特殊机制。
该设备可能有一个输出信号(通常称为SPI_IRQ),可用于触发主机上的GPIO中断。我不知道有什么轮询方案可以取代这种中断机制

为什么在启动时建议使用基于轮询的事务

大多数(或全部?)启动程序没有多处理功能。它们通常在大小上受到限制,因此通常是单线程的。
启动阻塞I/O操作时,多处理(或多线程)操作系统可以安排另一个进程或线程执行,并允许中断指示I/O操作完成。
但在等待中断时,启动程序可能没有其他事情可做。
因此,无需设置中断,只需检查等待循环中的状态即可


顺便说一句,“多重处理”指不止一个过程。它与多处理器或多核CPU无关

感谢@sawdust,当你说“连接到CPU的SPI控制器”和CPLD上的SPI控制器时。这是否意味着每个设备都有单独的控制器?是的,SPI总线的每个节点都有一个SPI控制器。(只有一个节点可以是SPI主机。)在典型的SoC中,SPI控制器将是一个不同的外围设备,就像UART或USB控制器一样。但在封装芯片(如SPI串行闪存)中,我们通常不需要区分目标设备的内部组件。如果将CPLD视为具有SPI接口(CLK、CS、MOSI和MISO)的“块盒”,则CPLD可能属于这一类。