链式中断控制器驱动编写-Linear方式

151 阅读2分钟

本文已参与【新人创作礼】活动,一起开启掘金创作之路。

一、和legacy方式对比

legacylinear
函数irq_domain_add_legacyirq_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