Я пытаюсь отобразить адресное пространство VME через шину PCI в пространство пользователя, чтобы я мог выполнять регулярные операции чтения / записи в память.
Я сделал это с другим устройством 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"!)