Приложение C ++ для общения с FPGA через PCI в пользовательском пространстве с использованием mmap - PullRequest
4 голосов
/ 29 июля 2011

Прежде всего, я новичок в программировании на Linux, поэтому извинения, если это не имеет смысла, или я лаю не на том дереве, укажи мне правильное направление.

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

Код, который я написал до сих пор, перечисляет каталоги в /sys/bus/pci/devices, проверяя файлы устройства и поставщика, чтобы найти правильный.

Как только я нашел устройство, я знаю, что отображенные области, в которые мне нужно записать, каким-то образом представлены файлами ресурсов [n], но я не уверен, как их использовать для чтения / записи некоторых значений.

Из кода, написанного для другой ОС, я знаю, что хочу поговорить с BAR1 устройства PCI, способ, которым я (пытался) сделать это, с помощью mmap (это правильный путь?). Сначала я получаю дескриптор файла на /sys/bus/pci/devices/[device_addr]/resource1 с помощью O_RDWR, затем вызываю mmap, например, так:

char *map = (char*)mmap(NULL, FPGA_MEM_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

Где fd - дескриптор файла из открытого.

Правильно ли я поступаю так или лучше использовать функции / вызовы? Я понимаю, что мог бы написать для этого модуль ядра, но я бы предпочел пока не заниматься программированием модулей ядра.

Если это поможет, я могу ненадолго вставить код, но я не особо критиковал код, просто несколько указателей на лучший способ сделать это.

Если есть какие-то подробности, которые мне не хватает, просто спросите.

Я использую ядро ​​Linux 2.6, основанное на Ubuntu 11.04 (работающее на живом usb), аппаратное обеспечение на базе x86.

Спасибо

UPDATE: После еще большего количества поисков и проб и ошибок с кодом, я получил его работать.

Шаги, которым я следовал, где:

  • Определить устройство с помощью /sys/bus/pci/devices/[device]/[vendor|device]
  • Разбор /sys/bus/pci/devices/[device]/resource, для каждой строки первая столбец - начальный адрес, а второй - конечный адрес сопоставленный регион. Я хотел BAR1, поэтому во второй строке были значения, которые я необходимо.
  • open("/dev/mem", O_RDWR) чтобы получить дескриптор файла fd
  • вызовите mmap, как указано выше, но передайте начальный адрес в качестве смещения (последний аргумент) и использовать начальный и конечный адрес, чтобы получить сопоставленные регионы размер (второй аргумент).

1 Ответ

3 голосов
/ 29 июля 2011

Это вполне приемлемый вызов mmap и должен работать правильно.

...