You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ubuntu Linux上通过硬件中断验证中断处理程序及驱动代码

如何用键盘按键中断验证你的Linux中断驱动

先修正你的驱动代码问题

你的原代码硬编码了固定IRQ号(50),这在实际系统中不可靠——不同设备的IRQ号不固定,且直接请求键盘的IRQ会和系统自带的键盘驱动冲突。下面是适配键盘中断测试的修改版代码:

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/interrupt.h>

// 替换为你从系统中查到的键盘IRQ号
static int irq = 1; 
static void *irq_dev_id = &irq; // 共享中断必须提供唯一标识

static irqreturn_t peripheral_interrupt_handler(int irq, void *data)
{
    pr_info("Interrupt triggered! IRQ: %d\n", irq);
    return IRQ_HANDLED;
}

static int __init peripheral_interrupt_init(void)
{
    int ret;

    pr_info("Requesting IRQ %d\n", irq);

    // 加入IRQF_SHARED实现中断共享,避免和系统驱动冲突
    ret = request_irq(irq, peripheral_interrupt_handler, 
                      IRQF_TRIGGER_RISING | IRQF_SHARED,
                      "peripheral_interrupt", irq_dev_id);
    if (ret) {
        pr_err("Failed to request IRQ %d: %d\n", irq, ret);
        return ret;
    }

    pr_info("Interrupt handler registered for IRQ %d\n", irq);
    return 0;
}

static void __exit peripheral_interrupt_exit(void)
{
    free_irq(irq, irq_dev_id);
    pr_info("Interrupt handler unregistered\n");
}

module_init(peripheral_interrupt_init);
module_exit(peripheral_interrupt_exit);
MODULE_LICENSE("GPL");

验证步骤

1. 查找键盘的IRQ号

执行以下命令查看系统中断分配:

cat /proc/interrupts

找到键盘相关条目,比如PS/2键盘通常对应i8042或atkbd,其开头的数字就是IRQ号(比如1);USB键盘则会在usb-ohci或usbhid条目下。

2. 编译驱动

创建Makefile:

obj-m += peripheral_interrupt.o
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

执行make编译生成.ko驱动文件。

3. 加载驱动并测试

  • 共享中断模式(推荐,无需卸载系统驱动):

    1. 加载驱动:
      sudo insmod peripheral_interrupt.ko
      
    2. 实时查看内核日志:
      dmesg -w
      
    3. 按下键盘任意按键,日志中会出现Interrupt triggered! IRQ: X的输出,说明你的中断处理程序被触发。
  • 独占中断模式(需临时禁用系统键盘驱动):

    1. 卸载系统键盘驱动(PS/2键盘):
      sudo rmmod atkbd
      
      (USB键盘执行sudo rmmod usbhid,注意这会禁用所有USB输入设备,建议用远程终端或备用输入设备操作)
    2. 加载你的驱动,按下键盘按键查看dmesg输出。
    3. 测试完成后,恢复系统驱动:
      sudo rmmod peripheral_interrupt
      sudo modprobe atkbd
      

注意事项

  • 共享中断时,dev_id必须是唯一的非空指针,否则内核无法区分不同的中断处理程序。
  • 若使用USB键盘,IRQ号可能随系统重启动态变化,建议后续学习通过设备树或sysfs动态获取IRQ,而非硬编码。
  • 不要长时间禁用系统键盘驱动,避免无法操作系统。

内容的提问来源于stack exchange,提问作者manju.g.r.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:24:52