Linux驱动 2026年5月18日 9 分钟

中断号的演变与ir_domain

以前, 对于每一个硬件中断(hwirq)都预先确定它的中断号(virq),这些中断号一般都写在一个头文件里, 比如arc…

以前, 对于每一个硬件中断(hwirq)都预先确定它的中断号(virq),
这些中断号一般都写在一个头文件里, 比如arch\arm\mach-s3c24xx\include\mach\irqs.h
使用时,
a. 执行 request_irq(virq, my_handler) :
内核根据virq可以知道对应的硬件中断, 然后去设置、使能中断等
b. 发生硬件中断时,
内核读取硬件信息, 确定hwirq, 反算出virq,
然后调用 irq_desc[virq].handle_irq, 最终会用到my_handler

有什么方法改进?
a. hwirq跟virq之间不再绑定
b. 要使用某个hwirq时,
先在irq_desc数组中找到一个空闲项, 它的位置就是virq
再在irq_desc[virq]中放置处理函数

新中断体系中, 怎么使用中断:
a.以前是request_irq发起,
现在是先在设备树文件中声明想使用哪一个中断(哪一个中断控制器下的哪一个中断)

b. 内核解析设备树时,
会根据”中断控制器”确定irq_domain,
根据”哪一个中断”确定hwirq,
然后在irq_desc数组中找出一个空闲项, 它的位置就是virq
并且把virq和hwirq的关系保存在irq_domain中: irq_domain.linear_revmap[hwirq] = virq;

c. 驱动程序 request_irq(virq, my_handler)

struct irq_domain {

    struct list_head link;

    const char *name;

    const struct irq_domain_ops *ops;

    void *host_data;

    unsigned int flags;

    /* Optional data */

    struct device_node *of_node;

    struct irq_domain_chip_generic *gc;

#ifdef  CONFIG_IRQ_DOMAIN_HIERARCHY

    struct irq_domain *parent;

#endif

    /* reverse map data. The linear map gets appended to the irq_domain */

    irq_hw_number_t hwirq_max;

    unsigned int revmap_direct_max_irq;

    unsigned int revmap_size;

    struct radix_tree_root revmap_tree;

    unsigned int linear_revmap[];

};

新中断的管理方式

在使用中断时,需要先在设备树中进行声明,内核才可以虚拟中断号与硬件中断号进行配对


老内核:
/ # cat /proc/interrupts
           CPU0
 29:      17593       s3c  13 Edge      samsung_time_irq
 42:          0       s3c  26 Edge      ohci_hcd:usb1
 43:          0       s3c  27 Edge      s3c2440-i2c.0
 74:         86  s3c-level   0 Edge      s3c2440-uart
 75:        561  s3c-level   1 Edge      s3c2440-uart
 83:          0  s3c-level   9 Edge      ts_pen
 84:          0  s3c-level  10 Edge      adc
 87:          0  s3c-level  13 Edge      s3c2410-wdt
中断号相对固定
使用新内核,中断号相对相对来说不是固定的,是会变动的(设备树确定之后就不会变了)
新内核:
nfs 30000000 192.168.1.124:/work/nfs_root/uImage; nfs 32000000 192.168.1.124:/work/nfs_root/jz2440_irq.dtb; bootm 30000000 - 32000000
 
/ # cat /proc/interrupts
           CPU0
  8:          0       s3c   8 Edge      s3c2410-rtc tick
 13:        936       s3c  13 Edge      samsung_time_irq
 30:          0       s3c  30 Edge      s3c2410-rtc alarm
 32:         15  s3c-level  32 Level     50000000.serial
 33:         60  s3c-level  33 Level     50000000.serial
 59:          0  s3c-level  59 Edge      53000000.watchdog

设备树中中断控制器的描述方法

2440中寻找中断关系的方法

这两个中断控制器没有看到父中断是哪一个,就找该节点的父节点pinctrl节点,发现也没有

那就再找该节点的父节点

上一篇 设备树6-platform_device与platform_driver的匹配

上述是设备的一边 下图是驱动的一边 匹配过程

下一篇 使用设备树来描述按键中断

中断扩展 当在一个节点中存在多个中断时,需要使用中断扩展来进行中断的描述 根据帮助文档来判断具体的要如何写