Повторная отправка транзакций DMA Engine - PullRequest
0 голосов
/ 06 марта 2019

Я пишу пользовательский высокоскоростной драйвер SPI для Linux для встроенного SoC. Для отправки данных на периферийное устройство SPI (DMA_MEM_TO_DEV) я использую Linux DMA Engine API.

https://www.kernel.org/doc/Documentation/dmaengine/client.txt

На основе документации, шаги для настройки и выполнения транзакции DMA:

  1. Выделите подчиненный канал DMA: dma_request_channel
  2. Установить конкретные параметры ведомого и контроллера: dmaengine_slave_config
  3. Получить дескриптор транзакции: dmaengine_prep_slave_single
  4. Отправить транзакцию: dmaengine_submit
  5. Выпуск отложенных запросов и ожидание уведомления об обратном вызове: 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 в документации ядра.

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Шаги 1 и 2 не нужно повторять.Шаги с 3 по 5 можно повторить для нескольких транзакций.Например, смотрите патч здесь . dspi_dma_xfer функция может вызывать dspi_next_xfer_dma_submit несколько раз, а шаги с 3 по 5 повторяются.Поскольку вы хотите, чтобы dma_addr_t buf был таким же, насколько я понимаю, это то, что вы хотите.

1 голос
/ 06 марта 2019

Необходимо по крайней мере повторно инициировать регистры адреса памяти, адреса назначения и длины, поскольку они будут меняться в течение транзакции DMA. Я думаю, что было бы так же быстро просто переделывать все каждый раз - это не очень много для настройки и, следовательно, затраченное время крошечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...