时间:2022-11-17 05:29:29来源:本站整理作者:点击:
在上一篇文章中,我们简要分析了中断子系统框架,本章我们将通过实现一个虚拟的中断控制器驱动,说明如何进行中断控制器驱动开发。本章的内容大概分为如下几部分:
一、实现虚拟中断控制器的可行性说明
二、中断控制器驱动的开发流程
三、虚拟中断控制器驱动设计说明
一、实现虚拟中断控制器的可行性说明在进行虚拟中断控制器的设计之前,我们先说明下LINUX系统中硬件中断触发后的处理过程。如下图所示,当硬件中断触发后,各架构的CPU板级代码经过处理后,大都会调用do_IRQ/generic_handle_irq接口,从而调用具体irq_desc的irq flow handler接口,进行中断处理函数的调用等工作。基于此,我们可以提供操作接口调用generic_handle_irq,从而模拟硬件中断触发,实现中断处理流程的触发操作,这是我们实现虚拟中断控制器的理论基础。
在提供了模拟硬件中断触发的机制后,我们再确认下中断控制器驱动的开发流程,主要分为如下几个部分:
有了以上的基础后,我们即可以进行虚拟中断控制器驱动的开发,以便了解中断控制器驱动的开发流程。
虚拟中断控制器型号介绍与说明本次我们开发的虚拟中断控制器包含两个型号virt0808、virt0813,这两个中断控制器均提供16个hw irq line。然后这两个中断控制器级联在一起(virt0813连接至virt0808的第16个中断号,virt0808作为root controller),连接方式如下图所示。
这两个中断控制器均提供如下几个寄存器:
以上即为虚拟中断控制器的主要内容,下面为这两个中断控制器进行驱动开发。
虚拟中断控制器驱动开发设计针对虚拟中断控制器驱动,主要包括如下几步部分内容:
针对virt0808,定义数据结构virt_irq_provider,主要的成员包括:
针对模拟硬件中断触发,我们主要借助irq work实现。主要的调用流程如下图所示
而针对virt0813而言,其数据结构定义如下,该数据结构的定义与virt_irq_provider的定义类似。
在进行irq domain的map接口中完成irq desc与irq chip、irq flow handler的绑定操作
在probe接口中通过调用如下接口完成irq domain、irq desc的创建操作
以上就是virt0808的驱动程序,完成以上功能后,就完成针对virt0808 irq controller的驱动操作。
Virt0813 driver该设备驱动与virt0808 driver的驱动类似,唯一区别的是,因为virt0813是挂载在virt0808上的,因此当virt0813上中断发生时,cpu首先得到的是virt0808对应引脚中断,然后在virt0808的chain hw irq line的中断处理函数中,通过读取virt0813的中断状态寄存器,确认virt0813上是哪一个hw irq line发生中断,再调用generic_handle_irq接口去处理该中断。处理过程如下图所示:
virt0813_sub_irq_handler的定义如下:
在测试驱动中主要申请两个irq,一个irq是virt0808 irq controller的hw irq line;一个irq是virt0813 irq controller 的hw irq line,该驱动仅仅是测试用,比较简单,代码如下:
在该virt irq的目录下执行make &&make install,驱动镜像即在image目录下。
驱动加载:
insmod virt0808_dev.ko
insmod virt0808_irq.ko
insmod virt0813_irq.ko
insmod irq_consumer_dev.ko
insmod irq_consumer_driver.ko
Virt0808 irq controller中断触发验证因我们在测试驱动中,申请了virt0808的第7个中断,因此我们触发该中断,看下该中断对应的中断处理程序有没有调用:
cd /sys/devices/platform/virt0808_irq_dev.0/
echo 6 >>irq_trigger
dmesg
如上图所示,中断处理函数已经执行。下面我们进行virt0813中断的测试,我们申请的是virt0813的第一个中断,执行
命令如下:
cd /sys/devices/platform/virt0813_irq_dev.0
echo 1 >>irq_status
cd /sys/devices/platform/virt0808_irq_dev.0/
echo 15 >>irq_trigger
dmesg
如上图所示,中断处理函数也已经执行成功,测试成功。
以上就是本篇文章的主要内容,我们主要实现了virt irq controller driver,熟悉irq controller driver的开发流程,我们实现的驱动中,两个irq controller通过级联的方式连接,也比较有代表性。我们学习了irq子系统下irq controller driver的开发后,对我们平常的开发有没有帮助呢?当我们需要为一个gpio controller开发驱动,且该gpio controller支持中断时,则可以为该gpio controller创建irq controller driver即可完成该功能(此种功能需求下,可参考virt0813的驱动程序实现该需求)。至此我们完成了irq子系统的学习,针对irq子系统我也就是会开发相应驱动,若要彻底理解中断子系统,还有很长的路要走…后续如果有可能,会再深入学习(本次虚拟驱动的源码链接稍后会发出来,或者在gitee上搜索用户jerry_chg,也可以找到本次的驱动代码)。
,Copyright 2022-2026 feiyundao.com 〖妃孕岛〗 版权所有 备案号 :陕ICP备2022000637号-3
声明: 本站文章均来自互联网,不代表本站观点 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告