Я работаю над подпрограммой DMA для передачи данных с ПК на FPGA на PCIe-карте. Я читаю DMA-API.txt и LDD3 ch. 15 для деталей. Однако я не мог понять, как сделать передачу DMA с ПК на последовательный блок iomem на плате PCIe. Образец папы для PCI в LDD3 отображает буфер, а затем сообщает карточке для передачи DMA, но для этого мне нужен ПК.Драйвер Linux DMA на карту PCIe с ПК как ведущий
То, что я уже узнал:
Запрос шины мастер
pci_set_master(pdev);
Установите DMA маскировать
if (dma_set_mask(&(pdev->dev), DMA_BIT_MASK(32))) { dev_err(&pdev->dev,"No suitable DMA available.\n"); goto cleanup; }
запрос канала DMA
if (request_dma(dmachannel, DRIVER_NAME)) { dev_err(&pdev->dev,"Could not reserve DMA channel %d.\n", dmachannel); goto cleanup; }
Карта буфер для передачи DMA
dma_handle = pci_map_single(pci_dev, buffer, count, DMA_TO_DEVICE);
Вопрос:
Что я должен сделать для того, чтобы позволить ПК выполнять передачу DMA вместо карта?
Благодарим за помощь!
Прежде всего, спасибо за ваши ответы. Может быть, я поставил бы свои вопросы более точно:
- В моем понимании ПК должен иметь контроллер DMA. Как мне получить доступ к этому контроллеру DMA, чтобы начать передачу в область IO с отображением карты памяти на плате PCIe?
- В нашей спецификации требуется, чтобы контроллер DMA ПК начал передачу. Тем не менее, я мог найти примеры, когда устройство будет выполнять задание DMA (DMA_mapping.txt, LDD3 ch.15). Есть ли причина, почему никто не использует контроллер DMA ПК (у него все еще есть каналы DMA)? Было бы лучше запросить изменение спецификации для нашего проекта?
Благодарим за ваше терпение.
* «Передача данных с ПК» * имеет значение для внешних периферийных устройств, например. «от ПК к принтеру». Для внутренних передач это бессмысленно. Вероятно, вы имеете в виду ** основную память **. * «пусть ПК выполняет передачу DMA» * также не имеет смысла. Вероятно, вы имеете в виду контроллер ** DMA. Ответ: установите DMAC вместо мастера шины PCI. – sawdust