Прежде всего, я новичок в программировании на 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
, как указано выше, но передайте начальный адрес в качестве смещения (последний
аргумент) и использовать начальный и конечный адрес, чтобы получить сопоставленные регионы
размер (второй аргумент).