keil中断函数的写法_在Linux设备树(DTS)中指定中断_在代码中获得中断

更新时间:2023-05-12 13:54:44 阅读: 评论:0

keil中断函数的写法_在Linux设备树(DTS)中指定中断_在代
码中获得中断
来源:百问⽹
作者:韦东⼭
本⽂字数:3436,阅读时长:5分钟
1.设备树⾥中断节点的语法
1.1 设备树⾥的中断控制器
中断的硬件框图如下:
在硬件上,“中断控制器”只有GIC这⼀个,但是我们在软件上也可以把上图中的“GPIO”称为“中断控制器”。很多芯⽚有多个GPIO模块,⽐如GPIO1、GPIO2等等。所以软件上的“中断控制器”就有很多个:GIC、GPIO1、GPIO2等等。
GPIO1连接到GIC,GPIO2连接到GIC,所以GPIO1的⽗亲是GIC,GPIO2的⽗亲是GIC。
假设GPIO1有32个中断源,但是它把其中的16个汇聚起来向GIC发出⼀个中断,把另外16个汇聚起来向GIC发出另⼀个中断。这就意味着GPIO1会⽤到GIC的两个中断,会涉及GIC⾥的2个hwirq。
这些层级关系、中断号(hwirq),都会在设备树中有所体现。
在设备树中,中断控制器节点中必须有⼀个属性:interrupt-controller,表明它是“中断控制器”。
还必须有⼀个属性:#interrupt-cells,表明引⽤这个中断控制器的话需要多少个cell。
#interrupt-cells的值⼀般有如下取值:
① #interrupt-cells=<1>
别的节点要使⽤这个中断控制器时,只需要⼀个cell来表明使⽤“哪⼀个中断”。
② #interrupt-cells=<2>
别的节点要使⽤这个中断控制器时,需要⼀个cell来表明使⽤“哪⼀个中断”;
还需要另⼀个cell来描述中断,⼀般是表明触发类型:
第2个cell的bits[3:0] ⽤来表⽰中断触发类型(trigger type and level flags):
1 = low-to-high edge triggered,上升沿触发
2 = high-to-low edge triggered,下降沿触发
4 = active high level-nsitive,⾼电平触发
8 = active low level-nsitive,低电平触发
⽰例如下:
vic: intc@10140000 {  compatible = "arm,versatile-vic";  interrupt-controller;  #interrupt-cells = <1>;  reg = <0x10140000 0x1000>;};
如果中断控制器有级联关系,下级的中断控制器还需要表明它的“interrupt-parent”是谁,⽤了interrupt-parent”中的哪⼀
个“interrupts”,请看下⼀⼩节。
1.2 设备树⾥使⽤中断
⼀个外设,它的中断信号接到哪个“中断控制器”的哪个“中断引脚”,这个中断的触发⽅式是怎样的?
这3个问题,在设备树⾥使⽤中断时,都要有所体现。
① interrupt-parent=
你要⽤哪⼀个中断控制器⾥的中断?
② interrupts
你要⽤哪⼀个中断?
Interrupts⾥要⽤⼏个cell,由interrupt-parent对应的中断控制器决定。在中断控制器⾥有“#interrupt-cells”属性,它指明了要⽤⼏个cell来描述中断。
⽐如:
i2c@7000c000 {  gpioext: gpio-adnp@41 {    compatible = "ad,gpio-adnp";    interrupt-parent = ;    interrupts = <160 1>;    gpio-controller;    #gpio-cells = <1
③ 新写法:interrupts-extended
⼀个“interrupts-extended”属性就可以既指定“interrupt-parent”,也指定“interrupts”,⽐如:
interrupts-extended = , ;
2.设备树⾥中断节点的⽰例
以100ASK_IMX6ULL开发板为例,在arch/arm/boot/dts⽬录下可以看到2个⽂件:imx6ull.dtsi、100ask_imx6ull-14x14.dts,把
⾥⾯有关中断的部分内容抽取出来。
从设备树反推IMX6ULL的中断体系,如下,⽐之前的框图多了⼀个“GPC INTC”:
GPC INTC的英⽂是:General Power Controller, Interrupt Controller。它提供中断屏蔽、中断状态查询功能,实际上这些功能在GIC⾥
也实现了,个⼈觉得有点多余。除此之外,它还提供唤醒功能,这才是保留它的原因。
3.在代码中获得中断
之前我们提到过,设备树中的节点有些能被转换为内核⾥的platform_device,有些不能,回顾如下:
A. 根节点下含有compatile属性的⼦节点,会转换为platform_device
B. 含有特定compatile属性的节点的⼦节点,会转换为platform_device
如果⼀个节点的compatile属性,它的值是这4者之⼀:“simple-bus”,“simple-mfd”,“isa”,“arm,amba-bus”,
那么它的⼦结点(需含compatile属性)也可以转换为platform_device。
C. 总线I2C、SPI节点下的⼦节点:不转换为platform_device
某个总线下到⼦节点,应该交给对应的总线驱动程序来处理, 它们不应该被转换为platform_device。
3.1 对于platform_device
⼀个节点能被转换为platform_device,如果它的设备树⾥指定了中断属性,那么可以从platform_device中获得“中断资源”,函数如
下,可以使⽤下列函数获得IORESOURCE_IRQ资源,即中断号:
/*** platform_get_resource - get a resource for a device* @dev: platform device* @type: resource type  // 取哪类资源?IORESOURCE_MEM、IORESOURCE_RE
3.2 对于I2C设备、SPI设备
对于I2C设备节点,I2C总线驱动在处理设备树⾥的I2C⼦节点时,也会处理其中的中断信息。⼀个I2C设备会被转换为⼀个i2c_client结构
体,中断号会保存在i2c_client的irq成员⾥,代码如下(drivers/i2c/i2c-core.c):
对于SPI设备节点,SPI总线驱动在处理设备树⾥的SPI⼦节点时,也会处理其中的中断信息。⼀个SPI设备会被转换为⼀个spi_device结构体,中断号会保存在spi_device的irq成员⾥,代码如下(drivers/spi/spi.c):
3.3. 调⽤of_irq_get获得中断号
如果你的设备节点既不能转换为platform_device,它也不是I2C设备,不是SPI设备,那么在驱动程序中可以⾃⾏调⽤of_irq_get函数去解析设备树,得到中断号。
3.4. 对于GPIO
参考:
drivers/input/keyboard/gpio_keys.c
可以使⽤gpio_to_irq或gpiod_to_irq获得中断号。
举例,假设在设备树中有如下节点:
gpio-keys {    compatible = "gpio-keys";    pinctrl-names = "default";    ur {        label = "Ur Button";        gpios = ;        gpio-key,wakeup;        linux,code =那么可以使⽤下⾯的函数获得引脚和flag:
button->gpio = of_get_gpio_flags(pp, 0, &flags);bdata->gpiod = gpio_to_desc(button->gpio);
再去使⽤gpiod_to_irq获得中断号:
irq = gpiod_to_irq(bdata->gpiod);
点击“了解更多”阅读更多相关章节

本文发布于:2023-05-12 13:54:44,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/888214.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:中断   设备   节点   控制器   属性   触发   总线   阅读
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图