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

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


person Ian Vaughan    schedule 31.07.2009    source источник


Ответы (1)


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

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

person sigjuice    schedule 31.07.2009
comment
/ dev / vme_m0 исходит из mknod vme_m0 c 221 0. - person Ian Vaughan; 07.12.2009
comment
Ответ приходит из библиотеки, поставляемой для оболочки модуля ядра! int map = vme_mmap (DeviceHandle, mmap_offset, длина и адрес пользователя); - person Ian Vaughan; 07.12.2009