#linux-device-driver #kernel-module #pci-e
#linux-устройство-драйвер #kernel-module #pci-e
Вопрос:
Здравствуйте, я разрабатываю связь PCIe между ПЛИС Xilinx и ПК Intel… Я написал модуль ядра (драйвер Linux), я использую прерывания INTx. Я столкнулся с проблемой обработки прерываний….
Перед загрузкой модуля ядра:
из lspci: INT A—>11
из конфигурации читайте: INT A—> 11
из /proc/interrupts : ничего, потому что irq не зарегистрирован
После загрузки модуля ядра:
из lspci: INT A—>16
из конфигурации читайте: INT A—> 11
из /proc/interrupts: INT 11 registerd
Когда я запускал программу в 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; }
Итак, кто-нибудь может сказать, в чем может быть проблема….
Ответ №1:
Вы не показываете, откуда у вас dev->gIrq
установлено, но ваш модуль ядра должен принимать номер прерывания из struct pci_dev
связанного с вашим устройством. Смотрите этот комментарий в include/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;
Комментарии:
1. И в новейшем ядре вы не должны делать даже этого, а вместо этого использовать
pci_alloc_irq_vectors()
amp; Co .
Ответ №2:
Да, Гил, спасибо за твой ответ.. в коде
request_irq(dev->gIrq, XPCIe_IRQHandler, IRQF_SHARED, gDrvrName, gDev));
dev-> gIrq — это не что иное, как то, что я взял только из структуры pci_dev.
и
Энди, я не использую какие-либо прерывания MSI или MSI-X для использования pci_alloc_irq_vectors().