프리 스케일 MPC8308에서 PCIe 버스를 루트 컴플렉스로 사용 중이며 엔드 포인트 디바이스는 하나의 256MB 메모리 영역과 단 하나의 BAR 레지스터가있는 ASIC입니다. 장치 구성 공간 레지스터는 "pciutils"패키지를 통해 쉽게 액세스 할 수 있습니다. 처음에는 mmap()
을 사용하여 메모리 영역에 액세스하려고 시도했지만 작동하지 않았습니다. 그래서 다음 레벨에서, 나는 리눅스 부팅 후에 커널에로드하는 커널 모듈 인 PCIe 엔드 포인트 장치를위한 장치 드라이버를 준비했습니다. 내 드라이버에서디바이스 활성화 및 메모리 할당을위한 PCIe 드라이버 오류
엔드 포인트 장치는 장치 ID 테이블에서 식별하지만 pci_enable_device()
하여 장치를 사용하려는 경우,이 오류 참조 : 나는 PCIe 장치를위한 메모리 영역을 할당 할 때 또한
driver-pci 0000:00:00.0: device not available because of BAR 0 [0x000000-0xfffffff] collisions
을 pci_request_region()
을 사용하면 불가능합니다. 여기
pci_enable_result = pci_enable_device (pdev);
if (pci_enable_result)
{
printk(KERN_INFO "PCI enable encountered a problem \n");
return pci_enable_result;
}
else
{
printk(KERN_INFO "PCI enable was succesfull \n");
}
을 그리고 여기에 "dmesg를"의 결과입니다
driver-pci 0000:00:00.0: device not available because of BAR 0 [0x000000-0xfffffff] collisions
PCI enable encountered a problem
driver-pci: probe of 0000:00:00.0 failed with error -22
그것은 주목할 가치가 드라이버에서 내가 할 수있는 그 pci_read_config_dword()
및 pci_write_config_dword()
과 같은 기능을 사용하여 올바르게 구성 레지스터를 읽고 쓰십시오.
당신이 생각하는 문제는 무엇입니까? 커널이 커널 모듈 이전에 장치를 초기화하기 때문에 문제가 나타날 수 있습니까? 이 문제가 발생하지 않도록하려면 어떻게해야합니까?
하드웨어가 고장났습니다. 일반적인 작업 시스템에서는 버스 주소 공간에 충돌이 없어야합니다. 그렇지 않으면 다시 할당해야합니다. – 0andriy
@AndyShevchenko, 감사합니다 Andy, 전체 버스 주소와 메모리 영역을 재 할당하려는 경우; 현재 PCI 장치에 할당 된 주소 공간을 제거 할 수있는 방법이 있습니까? –