在设备树中指定中断,在代码中获得中断

在设备树中指定中断

设备树是用来描述设备的,那么设备树如何描述中断控制器呢?
中断硬件框图:
在设备树中指定中断,在代码中获得中断_第1张图片
在硬件层面中断控制器只有GIC这一个,但是在软件层面我们把上图中的GPIO也称为中断控制器。很多芯片上有多个GPIO,所以软件层次上的“中断控制器”也就会有很多个。这些中断控制器还可能存在级联关系。GPIO1连接到GIC,GPIO2连接到GIC,所以GPIO1、GPIO2中断控制器的父亲是GIC.
同时如果GPIO1有32个中断源,但是他会把其中的16个汇聚起来向GIC发出一个中断,把另外16个汇聚起来向GIC发出另一个中断。这就意味着GPIO1会用到GIC的两个中断,会涉及GIC里的2个hwirq。这点在imx6ull的数据手册中也有所体现,如下图所示:
在这里插入图片描述
gpio1的0~15引脚信号整合在一起,向上一级中断发出66号中断。
gpio1的16~31引脚信号整合在一起,向上一级发出67号中断。
因此在设备树描述中断控制器时需要有以下几个属性。
1、compatible :中断控制器需要和驱动程序相匹配。
2、interrupt-controller :中断属性
3、interrupt_cells = <1> 表示如果引用这个中断控制器的某个中断的话需要多少个cell。
如果中断控制器存在级联关系,需要添加表明使用上一级中断控制器的哪个中断。
4、interrupt-parent = <&xxx> 表明要用哪一个中断控制里的中断
5、interrupts = <> <>;如果需要用到多个父级中断控制器的中断,那就需要多对尖括号进行表示父级中断控制的相应中断。具体需要多少个cell来描述中断,由父级中断控制器中的cell属性来表示。上述这些东西都是BSP工程试帮我们写好了相应的设备树节点。作为用户,我们只需要通过4、5两点规则描述我们需要使用哪个中断即可。对于4、5有新的写法:interrupts-extended = <&intcl 2 1>;即指定了interrupt-parent ,也指定了interrupts

在代码中获得中断

1、有些设备树节点是可以转化为platform_device 转化规则如下:

A. 根节点下含有 compatile 属性的子节点,会转换为 platform_device
B. 含有特定 compatile 属性的节点的子节点,会转换为 platform_device
如 果 一 个 节 点 的 compatile 属 性 , 它 的 值 是 这 4 者之一: “simple-bus”,“simplemfd”,“isa”,“arm,amba-bus”,
那么它的子结点(需含 compatile 属性)也可以转换为 platform_device。
C. 总线 I2C、SPI 节点下的子节点:不转换为 platform_device
某个总线下到子节点,应该交给对应的总线驱动程序来处理, 它们不应该被转换为 platform_device。

platform_device
如果它的设备树中制定了中断属性,便可以从platform_device中获得中断资源。即中断号。通过如下函数获得:

struct resource *platform_get_resource(struct platform_device *dev,
 unsigned int type, unsigned int num);

对于I2C 、SPI设备
对于这些设备,总线驱动在处理这些设备树节点时,会处理其中的中断信息。中断号会被保存在相应的结构体成员里。

如果对于某些设备节点,既不能转化为platform_device,也不是I2C、SPI设备。驱动同时不能很好的转换这些中断资源
自行调用of_irq_get函数去解析设备树,取得中断号。

由于大部分外部设备运用到中断时,用到某个GPIO中断,因此对于GPIO内核有所优待。
可以使用gpio_to_irq 或 gpiod_to_irq 获得中断号。

你可能感兴趣的:(Linux系统,中断,设备树)