LINUX.ORG.RU

Обработчик прерывания драйвера UART не вызывается

 , ,


0

1

Доброе время суток. В настоящее время я изучаю, пытаюсь разобраться как писать драйвера под 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;
}

При вызове функции write в приемный буфер передается символ, при наличии которого должно вызываться прерывание по приему символа (при этом включен режим генерации прерывании по каждому символу в fifo регистре). Но обработчик не выполняется. Пока не заморачивался с самим обработчиком, просто хочу сделать запись в журнал.

Если у кого то есть мысли или кто то сталкивался с подобной проблемой, буду благодарен если просветите)!

P.S. Перед использованием своего драйвера я выгружаю стандартный драйвер и тем самым освобождаю ресурсы для работы моего драйвера по средствам setserial. Обработчик прерывания регистрируется нормально, о чем свидетельствует возврат нуля request_irq(), и запись в /proc/interrupts.

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.