Обработчик прерывания драйвера UART не вызывается
Доброе время суток. В настоящее время я изучаю, пытаюсь разобраться как писать драйвера под Linux (3.13.0). Для начала решил разобраться с последовательным портом, т.к он присутствует на ПК. К данному моменту у меня вышло запустить драйвер, при этом я могу передавать и принимать через порт данные используя и не используя буфер микросхемы. Встала задача подключить для передачи/приема прерывания. При этом возникла следующая проблема: наблюдая за регистрами микросхемы порта я вижу, что фактически прерывание происходит, биты идентификации прерываний взводятся, но при этом не происходит вызов моего обработчика прерывания. Использую 4 линию прерывания для первого порта. При просмотре /proc/unterrupts счетчики прерывания не изменяются. Приведу участки кода:
inline static int start_interrupt(struct UART_DEVICE* dev)
{
int ret = 0;
if (dev->interrupt > 0)
{
ret = request_irq(dev->interrupt, uart_interrupt, IRQF_DISABLED, "my_uart", (void*) dev);
if (ret) // ошибка -BUSY
{
printk(KERN_INFO "UART: can't get assigned irq %i\n", dev->interrupt);
dev->interrupt = 0;
}
else
{
outb(0x1, dev->IER_RD_WR); // По умолчанию разрешены прерывания только при приеме данных.
//enable_irq(dev->interrupt);//
//if (!ret) printk(KERN_INFO "UART: interrupt %i - OK!\n", dev->interrupt);//
ret = 0;
}
}
else
{
ret = -ENODEV;
}
return ret;
}
irqreturn_t uart_interrupt(int irq, void *dev_id)
{
//int ret = 0;
struct UART_DEVICE *dev = (struct UART_DEVICE *) dev_id;
printk(KERN_ALERT "Interrupt\n");
//if (inb(dev->IIR_RD) & 0x1) return IRQ_NONE; // маска 0000 0001 выделить бит прерывания IP, если 1, то прерывания небыло
//printk(KERN_ALERT "Interrupt\n");
return IRQ_HANDLED;
}
Если у кого то есть мысли или кто то сталкивался с подобной проблемой, буду благодарен если просветите)!
P.S. Перед использованием своего драйвера я выгружаю стандартный драйвер и тем самым освобождаю ресурсы для работы моего драйвера по средствам setserial. Обработчик прерывания регистрируется нормально, о чем свидетельствует возврат нуля request_irq(), и запись в /proc/interrupts.