linear类型中断控制器与legacy类型的中断控制器一样,都是一对多的中断控制器,但是linear类型中断控制器是在第一次进行中断映射时才创建相应的irq_desc,相比于legacy类型的中断控制器再注册之前预先在系统中分配相应的irq_desc的方案而言更节省系统资源。
驱动代码编写
实验程序是虚拟的中断控制器驱动,它利用 GIC_SPI 210 号中断为父中断,采用一个随机数生成函数来模拟子中断控制器产生的中断。虚拟中断驱动代码、设备树、中断测试程序与5.3 legacy中断控制器驱动的几乎一模一样,唯一的区别便是中断域的注册,linear类型中断控制器中断域注册代码如下:
//设备和驱动匹配成功执行
static int virtual_intc_probe(struct platform_device *pdev)
{
int irq_parent;
//获取父中断号
irq_parent = of_irq_get(pdev->dev.of_node, 0);
if(irq_parent <= 0)
{
printk("get parent failed");
return irq_parent;
}
//重新设置父中断的中断处理函数
irq_set_chained_handler_and_data(irq_parent, virtual_intc_irq_handler, NULL);
//分配并初始化一个中断域,此方法会在内核中动态分配irq_desc,得到虚拟中断号
virtual_intc_domain = irq_domain_add_linear(pdev->dev.of_node, 4,
&virtual_intc_domain_ops, NULL);
if (!virtual_intc_domain)
{
printk("couldn't allocate irq domain (DT).\n");
return -ENODEV;
}
return 0;
}
//设备或驱动卸载时执行
static int virtual_intc_remove(struct platform_device *pdev)
{
irq_domain_remove(virtual_intc_domain);
return 0;
}
上机测试
上机测试步骤与5.3 legacy中断控制器驱动一样,相应的代码在添加链接描述下载