我想使用中断来查看UART 16550D是否有错误以及何时可以读取字符。UART 16550和Linux内核中的中断
的UART配置如下:
#define UART 0x03f8 // Endereço da Porta Serial - I (com1)
#define UART_IER 1
#define UART_LCR 3
#define UART_LSR 5
#define UART_DLL 0 /* Out: Divisor Latch Low */
#define UART_DLM 1 /* Out: Divisor Latch High */
#define UART_LSR_THRE 0x20 /* Transmit-hold-register empty */
#define UART_LSR_DR 0x01 /* Receiver data ready */
#define UART_RX 0 /* In: Receive buffer */
#define UART_TX 0 /* Out: Transmit buffer */
void UART_init(void){
outb(0x80 , UART + UART_LCR);
outb(0x00 , UART + UART_DLM);
outb(0x60 , UART + UART_DLL);
outb(0x1f , UART + UART_LCR);
outb(0x07 , UART + UART_IER);
return;
}
和中断
irqreturn_t short_interrupt(int irq, void *dev_id){
printk("INTERRUPT HAPPENED. WILL NOW RETURN\n");
return 0;
}
static int seri_init(void){
int result, i;
UART_init();
request_irq(4, short_interrupt, SA_SHIRQ, "seri", NULL);
....
所以现在我只是想看看如果处理器被称为与否。 4被定义为我正在使用的虚拟框设置中的IRQ。
我想知道的是,这个设置有什么问题吗?在测试时,阅读和处理我正在阅读的内容时,我没有任何问题。事情是,处理程序永远不会被调用。
request_irq()的返回值是-22。编译期间没有问题。
你的问题到底是什么? –
哎呦,完全忘了那个。抱歉。 – Aleister
您可能需要查看drivers/tty/serial/8250.c中的现有驱动程序(它也可以处理16550设备和其他类似设备)。中断处理程序是'serial8250_interrupt()'。如果您没有禁用该驱动程序,则由于与该驱动程序发生冲突,您可能无法获得您的中断。 –