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을 가리 킵니까?
; 그런 다음 pci_disable_msi (dev); derefference NULL 포인터 오류를 얻을 수 없습니다. 왜 그랬을까요? – whh4000
확실하지 않습니다. 스택 추적을 봐야 할 것입니다. BTW는 CONFIG_FRAME_POINTER를 사용하여 스택 추적으로 디버깅을 쉽게 할 수 있습니다. –