本文已参与【新人创作礼】活动,一起开启掘金创作之路。
一、和legacy方式对比
| legacy | linear | |
|---|---|---|
| 函数 | irq_domain_add_legacy | irq_domain_add_linear |
| irq_desc | 一次性分配完 | 用到再分配 |
| (hwirq,virq) | domain->linear_revmap[hwirq] = irq_data->irq; | 同左边 |
linear、legacy方式,都是用来编写链式中断控制器驱动程序。
代码
book@100ask:~/100ask_rk3288_module/16_interrupt/02_virtual_interrupt-line$ diff ../01_virtual_interrupt-legacy/virtual_int_controller.c ./virtual_int_controller.c
108,109c108,109
< irq_base = irq_alloc_descs(-1, 0, 4, numa_node_id());
< printk("%s irq_base = %d\n", __FUNCTION__, irq_base);
---
> //irq_base = irq_alloc_descs(-1, 0, 4, numa_node_id());
> //printk("%s irq_base = %d\n", __FUNCTION__, irq_base);
111c111,117
< virtual_intc_domain = irq_domain_add_legacy(np, 4, irq_base, 0,
---
> /* Usage:
> * a. dts decide to which hwirq will be used
> * b. allocate irq_desc when kernel parse the deivcetree
> * c. (hwirq, virq) ==> store in domain
> * */
>
> virtual_intc_domain = irq_domain_add_linear(np, 4,
主要只是使用的函数不一样了
测试结果
root/printknt/home/picture/03_interrupt/02_linear# echo "7 4 1 7" > /proc/sys/kernel
root@npi:/mnt/home/picture/03_interrupt/02_linear# ls
gpio_key_drv.ko virtual_int_controller.ko
.ko @npi:/mnt/home/picture/03_interrupt/02_linear# insmod virtual_int_controller.
[ 148.255050] virtual_int_controller: loading out-of-tree module taints kernel.
[ 148.265719] virtual_intc_init 139
[ 148.277355] virtual_intc_probe irq_to_parent = 73
root@npi:/mnt/home/picture/03_interrupt/02_linear# insmod gpio_key_drv.ko
[ 152.843010] /home/book/100ask_rk3288_module/16_interrupt/02_virtual_interrupt-line/gpio_key_drv.c gpio_key_init line 97
[ 152.867608] /home/book/100ask_rk3288_module/16_interrupt/02_virtual_interrupt-line/gpio_key_drv.c gpio_key_probe line 53
[ 152.881594] virtual_intc_irq_unmask 55
[ 152.885477] devm_request_irq 236 for 100ask_virtual_key0, err = 0
[ 152.893852] virtual_intc_irq_unmask 55
[ 152.897691] devm_request_irq 237 for 100ask_virtual_key1, err = 0
[ 152.905759] virtual_intc_irq_unmask 55
[ 152.909596] devm_request_irq 238 for 100ask_virtual_key2, err = 0
[ 152.917500] virtual_intc_irq_unmask 55
[ 152.922672] devm_request_irq 239 for 100ask_virtual_key3, err = 0
root@npi:/mnt/home/picture/03_interrupt/02_linear# grep "virtual_intc" -nr /sys/kernel/irq/
/sys/kernel/irq/239/chip_name:1:100ask_virtual_intc
/sys/kernel/irq/237/chip_name:1:100ask_virtual_intc
/sys/kernel/irq/238/chip_name:1:100ask_virtual_intc
/sys/kernel/irq/236/chip_name:1:100ask_virtual_intc
0oot@npi:/mnt/home/picture/03_interrupt/02_linear# devmem2 0x00a01210 w 0x4000000
/dev/mem opened.[ 235.979979] virtual_intc_irq_mask_ack 50
[ 235.985070] key 100ask_virtual_key2 0
[ 235.988740] virtual_intc_irq_unmask 55
Memory mapped at address 0x76f27000.
Value at address 0xA01210 (0x76f27210): 0x0
Written 0x4000000; readback 0x4000000
0oot@npi:/mnt/home/picture/03_interrupt/02_linear# devmem2 0x00a01210 w 0x4000000
/dev/mem opened.[ 237.035033] virtual_intc_irq_mask_ack 50
[ 237.039814] key 100ask_virtual_key3 0
[ 237.043528] virtual_intc_irq_unmask 55
Memory mapped at address 0x76f78000.
Value at address 0xA01210 (0x76f78210): 0x0
Written 0x4000000; readback 0x4000000
0oot@npi:/mnt/home/picture/03_interrupt/02_linear# devmem2 0x00a01210 w 0x4000000
/dev/mem opened.[ 237.925280] virtual_intc_irq_mask_ack 50
[ 237.930048] key 100ask_virtual_key3 1
[ 237.933756] virtual_intc_irq_unmask 55
Memory mapped at address 0x76f89000.
Value at address 0xA01210 (0x76f89210): 0x0
Written 0x4000000; readback 0x4000000
0oot@npi:/mnt/home/picture/03_interrupt/02_linear# devmem2 0x00a01210 w 0x4000000
/dev/mem opened.[ 238.645315] virtual_intc_irq_mask_ack 50
[ 238.650100] key 100ask_virtual_key1 0
[ 238.653809] virtual_intc_irq_unmask 55
Memory mapped at address 0x76f8b000.
Value at address 0xA01210 (0x76f8b210): 0x0
Written 0x4000000; readback 0x4000000