mmap для наложения шины VME в память пространства пользователя через PCI?

StackOverflow https://stackoverflow.com/questions/1212874

  •  06-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь отобразить адресное пространство 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 "!)

Это было полезно?

Решение

Откуда / dev / vme_m0 и что он представляет? Трудно сказать, что будет делать открытие и доступ к нему, не зная больше.

Вам нужно взглянуть на руководство по микросхеме моста, чтобы выяснить, как чтение / запись в область 1 преобразуется в чтение / запись на шине VME. Мостовая микросхема должна иметь набор регистров, которые определяют PCI - > Переводы адресов VME. Адрес VME, сгенерированный путем доступа к 0x80020000, будет зависеть от адреса VME, указанного в одном из этих регистров.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top