2009-07-31 3 views
4

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

ответ

1

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

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

+0

"/ dev/vme_m0" происходит от "mknod vme_m0 c 221 0". –

+0

Ответ исходит из библиотеки, поставляемой для упаковки модуля ядра! "int map = vme_mmap (DeviceHandle, mmap_offset, length, UserAddress);" –

Смежные вопросы