- 论坛徽章:
- 1
|
本帖最后由 arm-linux-gcc 于 2014-06-29 12:08 编辑
request_irq用的是物理中断号(soc手册上的中断号)还是虚拟中断号(与硬中断号有一个偏差),具体要看中断控制器的驱动是怎么实现的
严格说来应该是虚拟中断号,但是我们只讨论根中断控制器,因此虚拟中断号和物理中断号相等;而在下级中断控制器中,虚拟中断号和物理中断号是不相等的
irq-gic.c的实现:
gic_of_init
gic_init_bases(gic_cnt, -1, dist_base, cpu_base, percpu_offset, node);
irq_base = irq_alloc_descs(irq_start, 16, gic_irqs, numa_node_id()); 这里得到的irq_base将会是16
gic->domain = irq_domain_add_legacy(node, gic_irqs, irq_base, hwirq_base, &gic_irq_domain_ops, gic); 这里传进去的hwirq_base也是16
所以虚拟中断号和物理中断号在顶层gic控制器中是相等的
request_irq的irq参数,一般都是用的resource中传过来的
of_platform_populate流程里面,在of_device_alloc中,有of_irq_to_resource_table
of_irq_to_resource_table的参数就是直接从dts中得到的,然后走到irq_of_parse_and_map
然会走到irq_create_of_mapping,参数intspec就是dts中的那个数字,然后就会调用到gic_irq_domain_xlate,于是就取得了物理中断号
之后有这么一句virq = irq_create_mapping(domain, hwirq);
于是在根gic中断控制器中,virq和hwirq就相等了,因为gic_init_bases里面做irq_alloc_descs的时候的虚拟中断号和做irq_domain_add_legacy时的物理中断号相等
于是最后resource中的irq其实就是虚拟中断号,只不过和物理中断号是相等的
下级控制器这里就不想写了,太罗嗦了,这种下层的会经过dts里面的层层转换和generic_handle_irq里的转换
|
|