gpt4 book ai didi

c - UART 16550 和 Linux 内核中的中断

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:29 29 4
gpt4 key购买 nike

我正在尝试使用中断来查看 UART 16550D 中是否存在错误以及何时可以读取字符。

串口配置如下:

#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。编译过程中没有问题。

最佳答案

我对为什么没有触发中断处理程序的分析:

(1) 确保传递给 request_irq(virq,...) 的第一个参数是硬件 irq 号或虚拟 irq 号。在某些平台上,硬件 irq 和 request_irq(...) 使用的编号之间存在映射。如果你的盒子上有一个映射,那么你错误地将你的处理程序连接到其他中断源;

(2) 确保16550D上的中断屏蔽寄存器设置正确。我认为16550D上应该有一个中断屏蔽寄存器,可以屏蔽/取消屏蔽中断事件;

(3) 检查request_irq(...)的返回值,确保中断连接成功。

希望以上对你有帮助。

关于c - UART 16550 和 Linux 内核中的中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16594098/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com