树莓派 3 上的 SPI_IOC_MESSAGE(N)

has*_*cak 3 linux ioctl spi embedded-linux raspberry-pi3

我正在 Raspberry Pi 3 上开展一个项目,我看到了以下代码行:

ioctl(sSpiObj.spiFd, SPI_IOC_MESSAGE(1), &sSpiTransfer);        
Run Code Online (Sandbox Code Playgroud)

我不知道是什么SPI_IOC_MESSAGE(1),我试图在互联网上找到它的解释,但我找不到。有没有人可以解释一下它的作用?

R.k*_*ana 6

请参阅此处的 ioctl 声明:link 您看到您必须在第二个参数中传递请求类型才能告诉驱动程序您想要什么。您的第二个参数是 SPI_IOC_MESSAGE,它是在 Linux 代码中定义的宏链接。它创建一个请求类型编号,其中包含您要发送的消息数量,然后将其传递给驱动程序,然后驱动程序解码请求类型和消息数量,并将第三个参数作为要发送的消息进行处理,最后发送消息。

来自linux内核文档:

 * SPI_IOC_MESSAGE gives userspace the equivalent of kernel spi_sync().
 * Pass it an array of related transfers, they'll execute together.
 * Each transfer may be half duplex (either direction) or full duplex.
 *
 *  struct spi_ioc_transfer mesg[4];
 *  ...
 *  status = ioctl(fd, SPI_IOC_MESSAGE(4), mesg);
 *
 * So for example one transfer might send a nine bit command (right aligned
 * in a 16-bit word), the next could read a block of 8-bit data before
 * terminating that command by temporarily deselecting the chip; the next
 * could send a different nine bit command (re-selecting the chip), and the
 * last transfer might write some register values.
Run Code Online (Sandbox Code Playgroud)