Как перенести данные через DMA из оперативной памяти в оперативную память?



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



Если я правильно понял ldd3, копирование RAM в RAM невозможно с помощью DMA API linux, но драйвер /dma/dmaengine.c предоставляет флаг DMA_MEMCPY для "типа передачи DMA", поэтому должен быть способ.



Правильно ли это, могу ли я использовать движок dma для передачи данных из один адрес оперативной памяти другому?



Если это зависит от оборудования, как я могу определить, поддерживает ли моя система DMA memcpy?

558   1  

1 ответ:

Как вы правильно указали, DMA_MEMCPY следует использовать для выполнения копирования RAM-to-RAM. Это описано в Documentation/dmaengine/provider.txt . Вот только соответствующий отрывок, пожалуйста, смотрите весь файл для получения более подробной информации:

Поддерживаемые типы транзакций

Следующее, что вам нужно, это установить, какие типы транзакций ваше устройство (и драйвер) поддерживает.

Наша dma_device структура имеет поле под названием cap_mask, которое содержит различные типы транзакция поддерживается, и вам нужно изменить это маска с использованием функции dma_cap_set, с различными флагами в зависимости от типы транзакций, которые вы поддерживаете в качестве аргумента.

Все эти возможности определены в перечислении dma_transaction_type , в include/linux/dmaengine.h

В настоящее время доступны следующие типы:

  • DMA_MEMCPY
    • устройство способно делать копии из памяти в память

Просто резюмируем:

  • Это зависит от того, на вашем контроллере DMA. Некоторые способны выполнять транзакцию RAM-to-RAM, некоторые нет.

  • Например, для сок на основе OMAP контроллер DMA делает это (drivers/dma/omap-dma.c файл, в функции omap_dma_probe()):

    dma_cap_set(DMA_MEMCPY, od->ddev.cap_mask);
    
  • Таким образом, вы можете позже проверить его (если ваш контроллер DMA способен выполнять транзакции RAM-to-RAM) в вашем драйвере. Смотрите, как это делается в drivers/dma/dmatest.c, в dmatest_add_channel() функции:

    if (dma_has_cap(DMA_MEMCPY, dma_dev->cap_mask)) {
    

Если вам нужен пример использования DMA API для выполнения RAM-to-RAM транзакция, пожалуйста, смотрите drivers/dma/dmatest.c .

Comments

    Ничего не найдено.