Linux设备树语法详解 - Abnor - 博客园
中断系统中的设备树(四)__设备树描述按键中断_gaoquan.wu-CSDN博客_中断 设备树
写写一些理解就算了。
interrupt-controller 一个空属性用来声明这个node接收中断信号,即这个node是一个中断控制器。#interrupt-cells,是中断控制器节点的属性,用来标识这个控制器需要几个单位做中断描述符,用来描述子节点中"interrupts"属性使用了父节点中的interrupts属性的具体的哪个值。一般,如果父节点的该属性的值是3,则子节点的interrupts一个cell的三个32bits整数值分别为:<中断域 中断 触发方式>,如果父节点的该属性是2,则是<中断 触发方式>interrupt-parent,标识此设备节点属于哪一个中断控制器,如果没有设置这个属性,会自动依附父节点的interrupts,一个中断标识符列表,表示每一个中断输出信号
内核中使用虚拟中断号跟实际的硬件中断号一一对应,虚拟中断号保存在irq_desc结构体数组中,如果是属于主中断控制器,则对应irq_desc结构体下的handle_irq就会执行用户设定的中断函数。如果属于子中断控制器,则子中断控制器对应的主中断控制器下的中断号的irq_desc结构体下的handle_irq函数就会执行irq_dmux分发函数,跳转找到子中断控制器下的中断号的irq_desc结构体,然后执行handle_irq就会执行用户设定的中断函数。
过去是所有虚拟中断号在irq_desc结构体数组中写死,一个虚拟中断号对应一个坑,用户调用的时候直接使用固定的虚拟中断号即可。
新改动的中断模式采用domain域的方式,一个中断控制器有一个域,虚拟中断号也不再提前设定,irq_desc结构数组是空的,用的时候才会跟实际的中断号进行绑定,数组哪里有空位就用哪里。比如硬件中断号是5,irq_desc结构数组第五项是空的,虚拟中断号就成了5,如果5被占用,就往后查询,比如到8是空的,虚拟中断号就是8.
用户只需要在设备树中指定使用哪一个中断控制器和中断控制器中的哪一个中断,irq_domain就自行处理。
irq_domain中的xlate函数会解析设备树的中断
irq_domain中的 linear_revmap[m]函数会分配虚拟中断号,假如实际中断号为hwirq = m,virq = irq_domain.linear_revmap[m]
irq_domain中的map函数会把虚拟中断号virq与实际的硬件中断号hwirq绑定。
其实,我感觉,设备树就类似于配置文件,platform_driver如何获得硬件资源的配置。匹配上后platform_driver通过函数调用获得硬件资源。platform_driver内的函数调用是固定的,更改设备树的话要配合platform_driver内的程序,一般都会有详细的文档作为说明。
除了第一次写platform_driver,设备树内的一些规则用户才可以随意设定,platform_driver定好后,要改设备树就不能随便写。
所以不是说会设备树语法就搞定,改它要看设备文档,搞清楚究竟某一些项目为什么是这样定义的。