Freescale MPC8308 프로세서 (PowerPC 아키텍처 기반)에서 PCI-e 포트를 사용하고 있으며 사용하려고 할 때 몇 가지 문제가 있습니다. 엔드 포인트 PCI-e 디바이스의 메모리 공간은 256MB입니다. "pciutils"패키지를 사용하여 엔드 포인트 장치의 구성 공간을 쉽게 읽고 쓸 수 있습니다.mmap을 사용한 PCI-e 메모리 공간 액세스
구성 레지스터에 올바른 값을 쓰고 메모리 공간을 액세스 할 수있는 권한을 얻은 후; I는 "mmap에()"C 함수를 사용하여 메모리 공간에 액세스하는 시도에있는 파일 디스크립터 사용했을
"/sys/devices/pci0000:00/0000:00:00.0/resource0"을
정확히 256MB (엔드 포인트 장치의 메모리 공간과 동일)이므로 파일 설명자에 올바른 경로를 사용하고있는 것처럼 보입니다. 여기 당신은 https://github.com/billfarrow/pcimem에 언급 된 "의 mmap()"를 사용하여 내 코드를 찾을 수 있습니다
https://github.com/billfarrow/pcimem/blob/master/pcimem.c
그러나 불행하게도을 내가 "의 mmap()"함수의 반환 주소를 사용하여 메모리 공간을 사용하려고하면, 엔드 포인트 장치의 읽기 전용 레지스터를 올바르게 읽을 수 없습니다. 또한 "0x7FFFFFC"보다 큰 주소를 읽을 때 MPC8308이 재부팅됩니다. 위의 상황을 고려해 볼 때 PCI-e 인터페이스를 초기화하기위한 모든 단계를 놓치고 있습니까? Linux 커널 이미지 또는 U-Boot 코드에서 무엇을 변경해야합니까? mmap()과 함께 PowerPC PCI-e를 사용하는 것과 다른 점이 있습니까? PCI-e 메모리 공간을 읽는 데 도움이되는 예제 코드가 있습니까?
감사합니다.
엔드 포인트의 메모리 공간이 너무 큰 것 같습니다. 내 프로세서 (i.MX6)에서는 16MB보다 큰 엔드 포인트를 가질 수 없습니다. PCIe 용 Linux 부팅에서 초기화 오류가 있습니까? PCI-e 메모리 장치 란 무엇입니까? FPGA입니까? – FabienM
예, 나에게는 너무 많은 것처럼 보였지만 리눅스 부팅에는 오류가 없었으며/proc/iomem에서 볼 수있는 것처럼 디바이스 용 메모리에 256MB를 사용했습니다. 엔드 포인트 디바이스는 FPGA가 아닙니다. PCI-e 인터페이스가있는 ASIC. –
다른 경로는 장치의 기본 물리적 주소와 한계를 찾아서/dev/mem에 매핑하는 것입니다. (정직하게 작동하는 것은 보장 할 수 없지만, 그래도 궁금하다.) – ruthafjord