Как перенести данные через DMA из оперативной памяти в оперативную память?
Я хочу написать модуль ядра, который может передавать данные через DMA из ОЗУ в ОЗУ. Есть несколько постов, которые обсуждают это,но я действительно не понимаю. Некоторые говорят, что это возможно, другие говорят, что это не так.
Если я правильно понял ldd3, копирование RAM в RAM невозможно с помощью DMA API linux, но драйвер /dma/dmaengine.c предоставляет флаг DMA_MEMCPY для "типа передачи DMA", поэтому должен быть способ.
Правильно ли это, могу ли я использовать движок dma для передачи данных из один адрес оперативной памяти другому?
Если это зависит от оборудования, как я могу определить, поддерживает ли моя система DMA memcpy?
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