Я пытаюсь сопоставить адресное пространство VME через шину PCI в пространстве пользователя, чтобы я мог выполнять регулярное чтение/запись в памяти. Я сделал это с другим устройством PCI, как это: -mmap для наложения шины VME в память пользовательского пространства через PCI?
unsigned long *mapArea(unsigned int barAddr, unsigned int mapSize, int *fd)
{
unsigned long *mem;
*fd = open("/dev/mem", O_RDWR);
if (*fd<0) {
printf("Cannot open /dev/vme_mem\n");
exit(-1);
}
unsigned long *mem = (unsigned long*) mmap (0, mapSize, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, *fd, barAddr);
if ((mem == NULL) || (mem == (unsigned long*)-1)) {
printf ("Cannot map memory, error is %s\n", strerror(errno));
exit(-1);
}
return mem;
}
volatile unsigned long *bar = (volatile unsigned long *)mapArea(barAddr, mapSize, &fd);
А затем «бар» может быть использован в обычном режиме для чтения/записи.
Так VME, и с чипом Tundra Universe II PCI-VME Bridge: -
Должен ли я открыть "/ DEV/vme_m0" Где карта мой BAR от? lspci -vv: «Область 1: Память при 80020000»
Также адреса в шине VME смещены на 0x20000000, так как это работает с доступом или отображением?
(Использование Linux 2.6.18-128.el5 # 1 SMP) (нужно новый тэг "VME"!)
"/ dev/vme_m0" происходит от "mknod vme_m0 c 221 0". –
Ответ исходит из библиотеки, поставляемой для упаковки модуля ядра! "int map = vme_mmap (DeviceHandle, mmap_offset, length, UserAddress);" –