2016-10-16 7 views
1

안녕하세요 iam이 자일링스 FPGA와 인텔 PC 간의 PCIe 통신을 개발하고 있습니다 ... 커널 모듈 (Linux 드라이버)을 작성했으며 INTx 인터럽트를 사용하고 있습니다. 내가 인터럽트 처리의 문제에 직면하고있다 .... 로딩 커널 모듈 전에드라이버의 PCI Express 인터럽트

: lspci를에서

: INT A -> 11

설정에서 읽어 INT A ->

(11) PROC /하는 인터럽트 /에서 : 아무것도 IRQ가

로드 커널 모듈 후

을 등록을 한 때문이 아니라 :

lspci를에서

: INT의 A -> 16

설정에서 읽기 : INT A ->

11/proc 디렉토리/인터럽트 : INT (11) 등록을 한

내가 프로그램을 실행하면 FPGA가 IRQ-16에 인터럽트를 보내고 아무 몸도 신경 쓰지 않고 장애가되었다고 말했습니다. 내 module_init()라는에

:

request_irq(dev->gIrq, XPCIe_IRQHandler, IRQF_SHARED, gDrvrName, gDev)); 

내 IRQ 핸들러 :

static irqreturn_t XPCIe_IRQHandler(int irq, void *dev_id, struct pt_regs *regs) 
{ return IRQ_HANDLED; } 

그래서 사람

답변

0

당신은 돈 .... 문제가있을 수 있습니다 무엇을 말할 수있다 ' 귀하의 dev->gIrq이 어디에서 설정 되었는가를 보여 주지만, 커널 모듈은 인터럽트 번호를 가져야합니다. 기기와 연결된 struct pci_devinclude/linux/pci.h에서이 댓글보기 :

struct pci_dev { 
    ... 
    /* 
    * Instead of touching interrupt line and base address registers 
    * directly, use the values stored here. They might be different! 
    */ 
    unsigned int irq; 
+0

그리고 최신 커널에서는 그걸하지 말고 대신'pci_alloc_irq_vectors()'& Co를 사용합니다. – 0andriy

0

네 길, 답장을 보내 주셔서 감사합니다 .. 내가있는 pci_dev 구조체에서 촬영 한 어떤 그러나 코드

request_irq(dev->gIrq, XPCIe_IRQHandler, IRQF_SHARED, gDrvrName, gDev)); 

dev-> gIrq은 아무것도에 만 .

앤디 스피 어떤 MSI 또는 MSI-X를 사용하지 않는이 pci_alloc_irq_vectors를 사용하는 인터럽트().