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)
将由其文件描述符标识的给定 DMABUF 对象从 IIO 缓冲区分离。成功返回零,错误返回负的 errno 值。
请注意,关闭 IIO 缓冲区的文件描述符将自动分离所有先前附加的 DMABUF 对象。
IIO_BUFFER_DMABUF_ENQUEUE_IOCTL(struct iio_dmabuf *iio_dmabuf)
将先前附加的 DMABUF 对象加入缓冲区队列。只要缓冲区启用,排队的 DMABUF 将被读取(如果是输出缓冲区)或写入(如果是输入缓冲区)。