MMAP는 VME 버스를 PCI를 통해 사용자 공간 메모리로 오버레이하기 위해?
문제
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 주소에 따라 다릅니다.
제휴하지 않습니다 StackOverflow