Я пишу пользовательский высокоскоростной драйвер SPI для Linux для встроенного SoC. Для отправки данных на периферийное устройство SPI (DMA_MEM_TO_DEV
) я использую Linux DMA Engine API.
https://www.kernel.org/doc/Documentation/dmaengine/client.txt
На основе документации, шаги для настройки и выполнения транзакции DMA:
- Выделите подчиненный канал DMA:
dma_request_channel
- Установить конкретные параметры ведомого и контроллера:
dmaengine_slave_config
- Получить дескриптор транзакции:
dmaengine_prep_slave_single
- Отправить транзакцию:
dmaengine_submit
- Выпуск отложенных запросов и ожидание уведомления об обратном вызове:
dma_async_issue_pending
У меня это работает для одиночных транзакций DMA. Но мне нужно отправить несколько транзакций DMA из одной и той же области памяти (dma_addr_t buf
) одного размера (size_t len
) на основе некоторого аппаратного управления потоком (GPIO).
Для начала я попытался повторить шаги 1-5 для каждой транзакции DMA. Поэтому каждый раз, когда запускается управление потоком GPIO IRQ, я перераспределяю подчиненный канал DMA, переустанавливаю специфические параметры ведомого устройства и контроллера, ...
Кажется, это тоже работает, но я не уверен, что это самый эффективный способ.
Мне интересно, могу ли я просто повторно отправить транзакцию снова (dmaengine_submit
) и выполнить снова (dma_async_issue_pending
)? Будет ли это более эффективным?
Кажется, я не могу найти какую-либо информацию о том, как повторно отправить точно такой же запрос DMA в документации ядра.