MMAP는 VME 버스를 PCI를 통해 사용자 공간 메모리로 오버레이하기 위해?

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

  •  06-07-2019
  •  | 
  •  

문제

PCI 버스를 통해 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"을 열어야합니까? LSPCI -VV : "영역 1 : 80020000의 메모리"

또한 VME 버스 내의 주소는 0x20000000으로 오프셋되므로 어떻게 작동합니까?

(Linux 2.6.18-128.EL5 #1 SMP 사용) (새 태그 "VME"가 필요합니다!)

도움이 되었습니까?

해결책

/dev /vme_m0은 어디에서 왔으며 그것이 무엇을 나타내는가? 더 많은 것을 모르고 무엇을 할 것인지 말하기는 어렵습니다.

지역 1에 대한 읽기/쓰기가 VME 버스의 읽기/쓰기로 어떻게 해석되는지 알아 내려면 Bridge Chip 매뉴얼을 살펴 봐야합니다. 브리지 칩에는 PCI-> VME 주소 변환을 정의하는 레지스터 세트가 있어야합니다. 0x80020000에 액세스하여 생성 된 VME 주소는 해당 레지스터 중 하나에 지정된 VME 주소에 따라 다릅니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top