2013-06-04 4 views
0

리눅스 PCIe 드라이버를 수정하여 FPGA PCIe 코어와 함께 작동합니다. 내 드라이버 코드 내에서 PCIe 읽기 쓰기가 작동하도록하려면 pci_set_master (dev)를 사용하십시오.ISR 내에서 PCIe 읽기 쓰기

ARM DMA를 사용하는 대신 PCIe 전송을 수행하기 위해 altera SG-DMA를 사용하고 있습니다. 전송을 시작하려면 FPGA DMA에 활성화 비트를 기록해야합니다. 그것은 가능 비트 레지스터에 pcie write (barx, offset, data)를 수행함으로써 완벽하게 작동합니다.

문제는 PCIe FPGA DMA를 I/O 인터럽트가 발생할 때 시작해야하지만 인터럽트가 발생하면 ISR 내부에서 pcie 쓰기 (barx, 오프셋, 데이터)가 발생하므로이 문제가 발생합니다. 전체 리눅스가 거기에 매달린다.

누구나 전에 얼굴을 보았습니까? 도와주세요. 미리 감사드립니다.

답변

0

제게 따르면 귀하의 문제는 FPGA가 아니지만 귀하의 인터럽트가 처리되는 방식입니다. 이 문제를 격리하고 적절한 태그를 사용하여 질문 할 수 있습니다. PCIe 또는 FPGA를 포함하지 마십시오. PCIe 또는 FPGA가 현재 문제의 일부가 아닌 가능성이 높습니다.

SGDMA에 사용하는 PCIe 드라이버는 FPGA마다 다릅니다. 수동으로 PCIe-FPGA 인터페이스에 대한 읽기 및 쓰기 기능을 호출하기 때문에이 부분 (PCIe 드라이버)에도 문제가없는 것 같습니다. 당신이 사용하는 기능은 다른 사람들에게 알려지지 않을 것이므로 귀하의 질문에 그 점을 공유 할 필요가 없습니다.

IO 인터럽트 처리에 대해 자세히 읽어 볼 것을 권합니다. 인터럽트 이벤트에 대해 폴링이 아닌 다른 것을 시도하십시오.

+0

감사합니다. 안녕하세요, 이미 문제를 발견했습니다. 실수로 드라이버에서 PCIe bar0 맵핑을 해제했기 때문입니다. 인터럽트가 발생하면 unmap bar0에 액세스하여 시스템 정지를 시도합니다. – Shahril