LINUX.ORG.RU

PCI-DMA срочно!


0

0

Пишу драйвер для передачи данных с памяти на плате через шину PCI express и запись в файл, Стандартное считывание было с медленной скоростью, поэтому решил делать через DMA-функции, Нашел в интернете следующий текст: ----------------------------- Dynamic DMA Mapping

Direct memory access in Linux for AMD64 technology requires the use of the dynamic DMA mapping API. This API provides a way to efficiently map 64-bit physical addresses to 32-bit Single Address Cycle PCI addresses, so that hardware that only supports 32-bit accesses can be used in 64-bit systems. A full description of the dynamic DMA mapping API is beyond the scope of this document. Device driver developers who need to use DMA should read DMA-mapping.txt in the /usr/src/linux/Documentation directory. ------------------------------ Нашел у себя эту документацию и прочитал. Там было написано что главным является добавление #include <linux/pci.h>

Код программы: ---------------------------- #include <linux/pci.h> #include <pci/pci.h> #include <stdio.h> #include <sys/mman.h> int main (int argc, char *argv[]) { struct pci_dev *dev; u64 device_mask; struct pci_dev *pdev; int pci_dma; int pci_consistent; pci_dma = pci_set_dma_mask(*pdev, device_mask); pci_consistent = pci_set_consistent_dma_mask(*pdev, device_mask);

return 0;

} ------------------------------ # gcc -o beta beta.c -lpci -lz beta.c:(.text+0xa4): undefined reference to `pci_set_dma_mask' beta.c:(.text+0xec): undefined reference to `pci_set_consistent_dma_mask' collect2: ld returned 1 exit status ------------------------------- Вот что выдал компилятор, Тоесть эти функции в pci.h не определены, Поискал на компьютере заголовочные файлы содержащие эти функции; >> Выяснилось что функции DMA описаны в следующих файлах: /usr/src/linux-source-2.6.22/include/linux/PCI.h /usr/src/linux-headers-2.6.22-14-generic/include/linux/PCI.h /usr/src/linux-headers-2.6.22-14/include/asm-generic/pci-dma-compat.h /usr/src/linux-headers-2.6.22-14/include/asm-generic/dma-mapping.h /usr/src/linux-source-2.6.22/include/asm-i386/dma-mapping.h /usr/src/linux-source-2.6.22/include/asm-i386/pci.h -------------------------------- Теперь суть проблемы: стандарно #include </usr/src/linux-source-2.6.22/include/asm-i386/dma-mapping.h> dma-mapping.h добавить нельзя, потамучто внутри него прописаны другие заголовки типа такого:

dma-mapping.h source: ................................. #include <asm/cache.h> #include <asm/io.h> #include <asm/scatterlist.h> #include <asm/bug.h> .................................

которые компилятор уже не найдет, а внутри этих прописаны следющие и так до бесконечности, ------------------------------------------------------------------------------- ------------------------------

Вопросы:

1) Есть ли какой-то способ добавить эти заголовки внутри кода программы или при компиляции? 2) Если нужно для этого написать специальный Makefile какой может быть простой пример для компиляции программы и автоматического добавления заголовочных файлов?

Старался изложить как можно подробнее суть проблемы, Жду ответов, заранее благодарен за помощь спецам!

AFAIK, нельзя использовать DMA из user-space программы. Поэтому надо писать модуль для ядра. Компилируется он, естественно, по-другому.

eXire ★★
()
Ответ на: комментарий от eXire

дополню обобщенно... из юзерспейса ни с одной железкой напрямую работать нельзя. только через сист.вызовы.

Deleted
()
Ответ на: комментарий от maniac85

...Стандартное считывание было с медленной скоростью, поэтому решил делать через DMA-функции ...

Можно код в студию этого варианта? В юсерспасе. DMA или Bus Master PCI - может кто-нибудь объяснить разницу?

DMA в юсерспасе не представляю...

anonymous
()
Ответ на: комментарий от maniac85

Те функции можно использовать в модуле ядра (или в статически слинкованой с ядром секции), но никак не в юзерспейс приложении.

bon
()
Ответ на: комментарий от anonymous

------------Можно код в студию этого варианта? В юсерспасе. DMA или Bus Master PCI - может кто-нибудь объяснить разницу?-----------

Там через функцию mmap() было.

DMA и Bus Master PCI по сути одно и тоже. DMA - более общая формулировка (Direct Memory Access) тобишь к любому устройству, будь то CD-ROM, HDD итд. Просто для PCI устройств режим передачи данных напрямую возможен только при включенном Bus Master.

Поправьте если я неправ.

Вопрос: А есть ли готовые модули для PCI/PCIe ? Просто неохота разбираться с написанием Makefile.

maniac85
() автор топика
Ответ на: комментарий от maniac85

Хотя DMA и можно сделать в userspace, не делай этого. Напиши нормальный ядерный драйвер.

> Вопрос: А есть ли готовые модули для PCI/PCIe ? Просто неохота разбираться с написанием Makefile.

в каталоге drivers ты найдешь мегабайты примеров. В LDD3 есть все необходимые разъяснения.

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.