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 將被讀取(如果是輸出緩衝區)或寫入(如果是輸入緩衝區)。