
以前, 对于每一个硬件中断(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节点,发现也没有

那就再找该节点的父节点

