Linux中断子系统:级联中断控制器驱动

Linux中断子系统

Linux中断子系统是个很大的话题,如下面的思维导图所示,包含硬件、驱动、中断上半部、中断下半部等等。本文着眼于中断控制器(PIC),特别是级联中断控制器驱动部分,对驱动的设计和调试要点进行分析总结。

 

级联中断控制器驱动

中断控制器的核心对象是irq_chip,其提供了很多接口,一般情况下不需要全部实现。下面是几个类似的接口的差别介绍:

  1. irq_enable:在中断注册或使能时调用,一般在使能中断前需要清除中断状态。
  2. irq_disable:在中断注销或关闭时调用,一般在关闭中断前不清除中断状态。
  3. irq_mask_ack:在进入中断处理函数前调用,一般在屏蔽中断前需要清除中断源信号。
  4. irq_unmask:在退出中断处理函数后调用,一般在去屏蔽中断前不清除清除中断源信号。

级联中断控制器的初始化流程

中断控制器的级联如上图所示。级联中断控制器的初始化流程分为2部分:根中断控制器的初始化和子中断控制器的初始化。

根中断控制器相关部分

  1. 根据irq获取根PIC的irt;
  2. 将irt/irq的映射关系配置到根PIC的IRT表寄存器;
  3. 初始化根PIC的irq_chip接口对象;
  4. 调用irq_set_chip_and_handler设置根PIC irq的irq_chip及其handler;
  5. 调用irq_set_chip_data设置根PIC irq_chip接口调用时的环境对象;

子中断控制器相关部分

  1. 初始化子PIC的irq_chip接口对象;
  2. 映射子PIC io mem空间,以便后续访问其寄存器;
  3. 获取PIC的irq domain的irq基值,并调用irq_domain_add_xxx获取子PIC的中断域空间;
  4. 调用irq_set_chip_and_handler设置子PIC irq的irq_chip及其handler;
  5. 调用irq_set_chip_data设置子PIC irq_chip接口调用时的环境对象;
  6. 获取根PIC的irq;
  7. 调用irq_set_chained_handler设置根PIC irq handler;
  8. 调用irq_set_handler_data设置根PIC irq handler调用时的环境对象;

级联中断控制器的中断处理流程

首先,CPU只能感知到root PIC的中断,当root PIC的中断触发后,进入root irq handler,在handler中找到触发中断的sub irq,并调用其handler进行中断处理。换句话说,root irq的handler是root PIC的中断路由功能的软件扩展。

找到sub irq的方法依赖sub PIC具体硬件实现,以GPIO中断控制器的root irq handler为例,其方法如下:

  1. 调用chained_irq_enter,mask_ack root irq;
  2. 获取gpio 中断pin脚使能情况;
  3. 读取gpio interrupt status寄存器,判断此gpio 中断使能pin脚是否触发了中断;
  4. 通过irq_find_mapping获取此gpio pin对应的irq#;
  5. 通过generic_handle_irq调用 sub irq handler来进行gpio中断处理;
  6. 调用chained_irq_exit,unmask root irq。

中断控制器驱动调试要点

  1. 根据中断控制器特点,仔细设计irq_chip的接口。那么哪些需要实现,哪些又不需要是需要仔细考虑;
  2. root irq的handler要用chained_irq_enter/chained_irq_exit进行保护;
  3. 理顺中断触发时序。比如设备、子PIC的中断状态、中断源信号等中断标记清除顺序,以此来决定在哪些irq_chip接口中清除中断标记;
  4. 一般来说,对于任何中断设备,在使能中断前需要清除中断状态,避免垃圾中断干扰。

附关键数据结构

  

--EOF--

 

posted @   wahaha02  阅读(2948)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示