IIO 的高速 DMABUF 接口

1. 概述

工业 I/O 子系统支持通过基于文件的接口访问缓冲区,通过 IIO 设备的 dev 节点进行 read() 和 write() 访问调用。

它还支持基于 DMABUF 的接口,用户空间可以将 DMABUF 对象(外部创建的)附加到 IIO 缓冲区,然后将它们用于数据传输。

然后,用户空间应用程序可以使用此接口在多个接口之间共享 DMABUF 对象,从而允许它以零拷贝的方式传输数据,例如在 IIO 和 USB 堆栈之间。

用户空间应用程序还可以内存映射 DMABUF 对象,并直接访问采样数据。 与 read() 接口相比,这样做的优点是避免了内核和用户空间之间额外的数据复制。 这对于每秒产生数兆字节甚至千兆字节数据的高速设备特别有用。 然而,它确实增加了用户空间-内核空间同步开销,因为必须使用 DMA_BUF_SYNC_START 和 DMA_BUF_SYNC_END IOCTL 来保证数据完整性。

2. 用户 API

作为此接口的一部分,添加了三个新的 IOCTL。 这三个 IOCTL 必须在 IIO 缓冲区的 文件描述符上执行,可以使用 IIO_BUFFER_GET_FD_IOCTL() ioctl 获取该文件描述符。

IIO_BUFFER_DMABUF_ATTACH_IOCTL(int fd)

将由其文件描述符标识的 DMABUF 对象附加到 IIO 缓冲区。 成功时返回零,错误时返回负 errno 值。

IIO_BUFFER_DMABUF_DETACH_IOCTL(int fd)

从 IIO 缓冲区分离给定的 DMABUF 对象,该对象由其文件描述符标识。 成功时返回零,错误时返回负 errno 值。

请注意,关闭 IIO 缓冲区的文件描述符将自动分离所有先前附加的 DMABUF 对象。

IIO_BUFFER_DMABUF_ENQUEUE_IOCTL(struct iio_dmabuf *iio_dmabuf)

将先前附加的 DMABUF 对象排入缓冲区队列。 只要缓冲区启用,就会从排队的 DMABUF 读取(如果是输出缓冲区)或写入(如果是输入缓冲区)。