Exynos4412 中断驱动开发相关问题总结

1、Linux 中如何标识一个外部中断?

     在linux kernel中,我们使用下面两个ID来标识一个来自外设的中断:

a -- IRQ number

      CPU需要为每一个外设中断编号,我们称之IRQ Number这个IRQ number是一个虚拟的interrupt ID,和硬件无关,仅仅是被CPU用来标识一个外设中断

b -- HW interrupt ID

       对于interrupt controller而言,它收集了多个外设的interrupt request line并向上传递,因此,interrupt controller需要对外设中断进行编码。Interrupt controller用HW interrupt ID来标识外设的中断(即硬件中断号是对于中断控制器来讲的)。在interrupt controller级联的情况下,仅仅用HW interrupt ID已经不能唯一标识一个外设中断,还需要知道该HW interrupt ID所属的interrupt controller(HW interrupt ID在不同的Interrupt controller上是会重复编码的)。

      系统中所有的interrupt controller会形成树状结构,对于每个interrupt controller都可以连接若干个外设的中断请求(我们称之interrupt source),interrupt controller会对连接其上的interrupt source(根据其在Interrupt controller中物理特性)进行编号(也就是HW interrupt ID了)。但这个编号仅仅限制在本interrupt controller范围内

      要注意,这里的中断控制器并不是GIC,而是每一个中断的 interrupt - parent,下面讲解设备树时会提到。


2、中断节点在设备树中的描述

      在Device Tree Source文件中,对于那些产生中断的外设,我们需要定义interrupt-parent和interrupts属性:

(1)interrupt-parent

          表明该外设的interrupt request line物理的连接到了哪一个中断控制器上,中断控制器会对中断源进行描述;

(2)interrupts

        这个属性描述了具体该外设产生的interrupt的细节信息(也就是传说中的interrupt specifier)。例如:HW interrupt ID(由该外设的device node中的interrupt-parent指向的interrupt controller解析)、interrupt触发类型等。


     对于Interrupt controller,我们需要定义interrupt-controller#interrupt-cells的属性:

(1)interrupt-controller

        表明该device node就是一个中断控制器

(2)#interrupt-cells

       该中断控制器用多少个cell(一个cell就是一个32-bit的单元)描述一个外设的interrupt request line。具体每个cell表示什么样的含义由interrupt controller自己定义。

(3)interrupts和interrupt-parent

      对于那些不是root 的interrupt controller,其本身也是作为一个产生中断的外设连接到其他的interrupt controller上,因此也需要定义interrupts和interrupt-parent的属性。

举个例子,这是上面编写按键驱动时的中断描述:

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. fs4412-key{          
  2.     compatible = "fs4412,key";         
  3.     interrupt-parent = <&gpx1>;    
  4.     interrupts = <1 2>,<2 2>;    
  5. };    

3、Linux 内核对中断的初始化过程

     ARM linux内核启动时,首先运行的是linux/arch/arm/kernel/head.S,进行一些初始化工作,然后调用main.c->start_kernel()函数,进而调用early_irq_init()函数进行初始化、init_IRQ()函数进行中断初始化、建立异常向量表

【init_IRQ ---> irqchip_init ---> of_irq_init】

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. extern struct of_device_id __irqchip_begin[];  
  2.   
  3. void __init irqchip_init(void)  
  4. {  
  5.     of_irq_init(__irqchip_begin);  
  6. }  

extern struct of_device_id __irqchip_begin[];

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. struct of_device_id  
  2. {  
  3.     char name[32];------要匹配的device node的名字  
  4.     char type[32];-------要匹配的device node的类型  
  5.     char compatible[128];---匹配字符串(DT compatible string),用来匹配适合的device node  
  6.     const void *data;--------对于clock source,这里是初始化函数指针  
  7. };  

     这个数据结构主要被用来进行Device node和driver模块进行匹配用的。从该数据结构的定义可以看出,在匹配过程中,device name、device type和DT compatible string都是考虑的因素。更细节的内容请参考__of_device_is_compatible函数。

    __irqchip_begin就是内核irq chip table的首地址,这个table也就保存了kernel支持的所有的中断控制器的ID信息(用于和device node的匹配)。


void __init of_irq_init(const struct of_device_id *matches)

       of_irq_init函数执行之前,系统已经完成了device tree的初始化,因此系统中的所有的设备节点都已经形成了一个树状结构,每个节点代表一个设备的device node。of_irq_init是在所有的device node中寻找中断控制器节点,形成树状结构系统可以有多个interrupt controller,之所以形成中断控制器的树状结构,是为了让系统中所有的中断控制器驱动按照一定的顺序进行初始化)。之后,从root interrupt controller节点开始,对于每一个interrupt controller的 device node,扫描irq chip table,进行匹配,一旦匹配到,就调用该interrupt controller的初始化函数,并把该中断控制器的device node以及parent中断控制器的device node作为参数传递给irq chip driver。


4、中断触发后的处理流程

a -- 具体CPU architecture相关的模块会进行现场保护,然后调用machine driver对应的中断处理handler;

b -- machine driver对应的中断处理handler中会根据硬件的信息获取HW interrupt ID,并且通过irq domain模块翻译成IRQ number

c --  调用该IRQ number 对应的high level irq event handler,在这个high level的handler中,会通过和interupt controller交互,进行中断处理的flow control(处理中断的嵌套、抢占等),当然最终会遍历该中断描述符的IRQ action list,调用外设的specific handler来处理该中断

d -- 具体CPU architecture相关的模块会进行现场恢复

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

delphi 最全日期格式_DateUtils时间单元说明

DateUtils时间单元说明 CompareDate 函数 比较两个日期时间值日期部分的大小 CompareDateTime 函数 比较两个日期时间值的大小 CompareTime 函数 比较两个日期时间值时间部分的大小 DateOf 函数 去除日期时间值的时间部分 DateTimeToJulianDate 函数 转换日期时间值为儒略日 Da…

python基础学习笔记

变量赋值 赋值运算符 是主要的赋值运算符&#xff0c;其他的是增量赋值运算符。 aint 12 astring python afloat 3.14 alist [1,3,4]赋值并不是将一个值赋给一个变量。python中对象是通过引用传递的&#xff0c;是将对象的应用传递给变量。 >>> x1 >>&g…

Exynos4412 IIC 总线驱动开发相关问题总结

一 、问题 1、IIC总线上的设备是怎么描述的&#xff1f; struct i2c_client{struct device dev;...};2、IIC总线上的驱动是怎么描述的&#xff1f; struct i2c_driver {struct device_driver driver;};3、IIC总线上的设备和驱动是怎么匹配的 1)、对于 Cortex - A8 通过driver…

sersync+rsync实现实时同步

在分布式应用中会遇到一个问题&#xff0c;就是多个服务器间的文件如何能始终保持一致。一种经典的办法是将需要保持一致的文件存储在NFS上&#xff0c;这种方法虽然简单方便但却将本来多点的应用在文件存储上又变成了单点&#xff0c;这违背了分布式应用部署的初衷。为了保留多…

Python爬虫利器五Selenium用法

在上一节我们学习了 PhantomJS 的基本用法&#xff0c;归根结底它是一个没有界面的浏览器&#xff0c;而且运行的是 JavaScript 脚本&#xff0c;然而这就能写爬虫了吗&#xff1f;这又和 Python 有什么关系&#xff1f;说好的 Python 爬虫呢&#xff1f;别急&#xff0c;接下来…

Cronolog 分割 Tomcat8 Catalina.out日志 (转)

默认情况下&#xff0c;tomcat的catalina.out日志文件是没有像其它日志一样&#xff0c;按日期进行分割&#xff0c;而是全部输出全部写入到一个catalina.out&#xff0c;这样日积月累就会造成.out日志越来越大&#xff0c;给管理造成了不便&#xff0c;为了实现像其它日志文件…

Exynos4412 IIC总线驱动开发(二)—— IIC 驱动开发

前面在Exynos4412 IIC总线驱动开发&#xff08;一&#xff09;—— IIC 基础概念及驱动架构分析 中学习了IIC驱动的架构&#xff0c;下面进入我们的驱动开发过程 首先看一张代码层次图&#xff0c;有助于我们的理解 上面这些代码的展示是告诉我们&#xff1a;linux内核和芯片提…

Python爬虫利器六PyQuery的用法

你是否觉得 XPath 的用法多少有点晦涩难记呢&#xff1f; 你是否觉得 BeautifulSoup 的语法多少有些悭吝难懂呢&#xff1f; 你是否甚至还在苦苦研究正则表达式却因为少些了一个点而抓狂呢&#xff1f; 你是否已经有了一些前端基础了解选择器却与另外一些奇怪的选择器语法混淆了…

windows10下载

http://care.dlservice.microsoft.com/dl/download/F/5/7/F574727C-B145-4A7D-B85B-11C4E8DC894B/9841.0.140912-1613.FBL_RELEASE_CLIENTENTERPRISE_VOL_X64FRE_ZH-CN.ISO转载于:https://www.cnblogs.com/thankyouGod/p/6366971.html

Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析

关于Exynos4412 IIC 裸机开发请看 &#xff1a;Exynos4412 裸机开发 —— IIC总线 &#xff0c;下面回顾下 IIC 基础概念 一、IIC 基础概念 IIC(Inter&#xff0d;Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备。I…

Python 爬虫进阶一之爬虫框架概述

综述 爬虫入门之后&#xff0c;我们有两条路可以走。 一个是继续深入学习&#xff0c;以及关于设计模式的一些知识&#xff0c;强化 Python 相关知识&#xff0c;自己动手造轮子&#xff0c;继续为自己的爬虫增加分布式&#xff0c;多线程等功能扩展。另一条路便是学习一些优秀…

1039. 到底买不买(20)

1039. 到底买不买&#xff08;20&#xff09; 小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串&#xff0c;但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下&#xff0c;某串珠子里是否包含了全部自己想要的珠子&#xff1f;如果是&#xff0c…

Exynos4412 ADC 设备驱动开发

具体ADC硬件知识及裸机驱动请看&#xff1a; Exynos4412裸机开发 —— A/D转换器 1、原理图如下&#xff1a; 2、相关寄存器信息 ADC_BASE 0x126C0000ADCCON 0x0000 1<<0 | 1<<14 | 0X1<<16 | 0XFF<<6ADCDLY 0x000…

mongodb morphia

原文&#xff1a;http://www.blogjava.net/watchzerg/archive/2012/09/20/388109.html快速开始&#xff1a;Entitypublic class Hotel {Id private ObjectId id;private String name;private int stars;Embeddedprivate Address address;}Embeddedpublic class Address {privat…

2017 《Java技术预备作业 》1501 乔 赫

1.阅读邹欣老师的博客,谈谈你期望的师生关系是什么样的&#xff1f; 师生关系为亦师亦友&#xff0c;但不缺少老师的严肃 2.你有什么技能&#xff08;学习&#xff0c;棋类&#xff0c;球类&#xff0c;乐器&#xff0c;艺术&#xff0c;游戏&#xff0c;......&#xff09;比大…

Python 爬虫进阶二之 PySpider 框架安装配置

PySpider官方文档 项目地址 官方文档 安装 phantomjs PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API。它全面支持 web 而不需浏览器支持&#xff0c;其快速、原生支持各种 Web 标准&#xff1a;DOM 处理、CSS 选择器、JSON、Canvas 和 SVG。 PhantomJS 可以用于页…

Exynos4412 中断驱动开发(三)—— 设备树中中断节点的创建

提到中断就必须了解到GIC&#xff0c;下面先了解一下GIC 一、GIC概念 GIC&#xff08;Generic Interrupt Controller&#xff09;是ARM公司提供的一个通用的中断控制器。GIC通过AMBA&#xff08;Advanced Microcontroller Bus Architecture&#xff09;这样的片上总线连接到一个…

老码农:如何写出让自己满意的代码

今天有位朋友在微博上问我这样一个问题&#xff1a; “老码农的自留地 &#xff0c;最近出于学习目的写一个管理系统&#xff0c;越到后边&#xff0c;越觉得自己前边的代码写得烂。前辈&#xff0c;我想让代码写得更好一点&#xff0c;能不能谈谈你的经验&#xff0c;给我指点…

Python 爬虫进阶三之 Scrapy 框架安装配置

初级的爬虫我们利用 urllib 和 urllib2 库以及正则表达式就可以完成了&#xff0c;不过还有更加强大的工具&#xff0c;爬虫框架 Scrapy&#xff0c;这安装过程也是煞费苦心哪&#xff0c;在此整理如下。 官网 官方安装文档 安装python 安装 Python 安装过程我就不多说啦&a…

泛型类、泛型方法及泛型应用

泛型类、泛型方法及泛型应用 泛型是Java SE 1.5的新特性&#xff0c;泛型的本质是参数化类型&#xff0c;也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中&#xff0c;分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安…