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);

И тогава "bar" може да се използва нормално за четене/запис.

И така до VME и с чип Tundra Universe II PCI-VME Bridge :-

Трябва ли да отворя "/dev/vme_m0" Откъде да картографирам своя BAR? lspci -vv : "Регион 1: Памет при 80020000"

Също така адресите в рамките на VME BUS са компенсирани с 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

Изберете всички клетки и след това щракнете върху Условно форматиране > Ново правило. Изберете „Използване на формула, за да определите кои клетки да форматирате“. В типа описание на правилото:

=$F1="Value to check" (or if it's numeric, =$F1=12345)

Щракнете върху бутона за форматиране и задайте запълването на червено. Натиснете OK

- person Ian Vaughan; 07.12.2009