1

PCIe MSI 인터럽트를 처리하는 데 사용할 수있는 커널 모듈을 쓰려고합니다. 지금은 내 인터럽트를 구성하는 데 문제가 있고 "Linux Device Drivers Ed. 3"과 함께 따라하려고 시도하고 있습니다. 해당 서적의 내용 :PCIe 인터럽트 번호

"드라이버는 인터럽트 번호를 확인해야 할 필요가 없습니다. PCI_INTERRUPT_LINE에있는 값이 올바른 것으로 보장됩니다. "

그래서 물론이 설정에 대한 논리적 인 방법으로 내 인터럽트 것 같다 :

err = pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &myirq); 
if(err) 
{ 
    printk(KERN_WARNING "Could not get IRQ number\n"); 
    return err; 
} 
err = request_irq(myirq, fpga_isr, IRQF_SHARED, fpga_driver.name, dev); 

지금이 내가 수동으로 인터럽트를 트리거하기 위해 JTAG 사용에 대한 이동 인터럽트 (60) 저를 등록하고 나는 커널을 얻을 인터럽트에 핸들러가 없다는 메시지 (인터럽트 576). irq_line을 576으로 하드 코드하면 request_irq가 실패합니다.

내 인터럽트 라인을 찾는 가장 좋은 방법은 무엇입니까? 왜 내가 필요한 IRQ를 얻을 수 없습니까?

부팅 할 때 내 장치는 자동으로 IRQ 핀 1 (레거시 인터럽트 A)으로 설정되며 이는 dev-> irq에 저장된 값인 irq 라인 572에 해당합니다. 부트 시퀀스가 ​​자동으로 IRQ를 핀 0 (레거시 인터럽트 비활성화)으로 설정하면 dev-> irq가 내 MSI 인터럽트 @ 576을 가리 킵니까?

답변

2

MSI의 경우, 먼저 pci_enable_msi를 사용하여 장치에서 MSI 인터럽트를 활성화해야합니다. MSI 인터럽트는 "표준 PCI"인터럽트와 동일하지 않습니다. pci_enable_msi를 호출 한 후 request_irq를 호출하기 위해 pci_dev-> irq에서 인터럽트 번호를 가져와야합니다. 커널 소스 트리에서 예제를 찾으십시오.

문서/PCI에서

더 많은 정보/MSI-HOWTO.txt

나는이 작업을 수행 할 때, 내가 지금 올바른 인터럽트 번호를 볼 수 있지만 내가 free_irq 때 (dev-> IRQ, DEV)
+0

; 그런 다음 pci_disable_msi (dev); derefference NULL 포인터 오류를 얻을 수 없습니다. 왜 그랬을까요? – whh4000

+0

확실하지 않습니다. 스택 추적을 봐야 할 것입니다. BTW는 CONFIG_FRAME_POINTER를 사용하여 스택 추적으로 디버깅을 쉽게 할 수 있습니다. –