驱动设备数-of函数-获取中断资源

提示:of 函数获取中断信息


前言

  • 前面了解了of 函数获取设备节点、设备属性 相关内容,这里通过 of 函数获取中断相关信息

一、参考资料

Linux-驱动-设备树实案例分析-中断
Linux驱动-设备树-获取节点属性of函数分析
RK3568平台(中断篇)of操作函数获取中断资源
of操作函数——获取中断资源

二、of 相关API 获取中断资源

配置中断设备树节点

路径:kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10-linux.dts 中,新增中断设备数描述,如下:
新增如下设备数,配置中断节点:

。。。。。
/{
   
   
    topeet{
   
   
        #address-cells = <1>;
        #size-cells = <1>;
        ranges;
        compatible = "simple-bus";

        myLed{
   
   
            compatible = "my devicetree";
            reg = <0xFDD60000 0x00000004>;
        };
         
         myirq {
   
   
                        compatible = "my_devicetree_irq";
                        interrupt-parent = <&gpio3>;
                        interrupts = <RK_PA5 IRQ_TYPE_LEVEL_LOW>;
                };
    };
};
。。。。。。。。。。

问题:
上面配置为什么这么配置,设备树中中断配置就是这么配置的,前面我们了解过。 这里我们参考的文件是:/kernel/arch/arm64/boot/dts/rockchip/topeet_rk3568_lcds.dtsi

在这里插入图片描述

编译Room后,查看开发板是否生成了中断设备,如下:路径:/sys/bus/platform/devices

[root@topeet:/sys/bus/platform/devices]# ls topeet
driver_override  fdd60000.myLed  modalias  of_node  power  subsystem  topeet:myirq  uevent

看到了 topeet:myirq ,说明设备树生成设备成功。

irq_of_parse_and_map

irq_of_parse_and_map 是 Linux 设备树(DTS)操作中用于解析和映射中断请求(IRQ)的重要函数。它在设备驱动初始化过程中经常被使用,用于从设备树节点获取中断信息并将其映射到Linux内核的IRQ编号。

函数原型

unsigned int irq_of_parse_and_map(struct device_node *dev, int index);

参数说明

  • dev: 指向设备树节点的指针,表示要从中获取中断信息的设备节点
  • index: 中断的索引号,表示要获取该设备的第几个中断描述

返回值
成功返回Linux IRQ号,失败返回0

示例驱动代码如下:

#include <linu
在Linux内核中,获取设备树(Device Tree)下多个中断号通常涉及到内核提供的API函数设备树是描述硬件设备信息的据结构,它在系统启动时被解析,以配置和管理硬件资源。 要获取设备树中定义的多个中断号,首先需要通过设备树节点的`interrupts`属性获取中断号列表。这些中断号可以通过`of_irq_get`或`of_irq_parse_raw`等函数进行解析和获取。下面是一个获取多个中断号的基本步骤: 1. 在驱动程序中,首先需要解析设备树节点。这通常在驱动的probe函数中完成,通过传递的`struct device_node`参,可以找到对应的设备节点。 2. 使用`of_irq_get`或`of_irq_parse_raw`等函数,根据设备节点的`interrupts`属性解析出中断号。通常,这些函数返回的是一个整值,可以是单个中断号,也可以是多个中断号的组合。 3. 如果返回值表示多个中断号,你可能需要使用`irq_of_parse_and_map`函数来映射并解析这些中断号。 下面是一个简化的示例代码,展示了如何在设备驱动获取多个中断号: ```c #include <linux/module.h> #include <linux/of_irq.h> #include <linux/irq.h> static int my_driver_probe(struct platform_device *pdev) { struct device_node *node = pdev->dev.of_node; int irq; int err; unsigned int irq_count = 0; int *irqs; /* 获取设备树中断号量 */ irq_count = irq_of_parse_and_map(node, 0); if (irq_count <= 0) { dev_err(&pdev->dev, "Failed to parse and map interrupts\n"); return -EINVAL; } irqs = devm_kzalloc(&pdev->dev, sizeof(int) * irq_count, GFP_KERNEL); if (!irqs) { dev_err(&pdev->dev, "Failed to allocate memory for irqs\n"); return -ENOMEM; } /* 获取所有的中断号 */ for (int i = 0; i < irq_count; i++) { irqs[i] = irq_of_parse_and_map(node, i); if (!irqs[i]) { dev_err(&pdev->dev, "Failed to parse and map interrupt %d\n", i); return -EINVAL; } } /* 使用获取到的中断号做一些处理 */ /* ... */ return 0; } ``` 在这个示例中,`irq_of_parse_and_map`函数用于解析并映射设备树中的中断号,它通过一个索引参获取第`i`个中断号。这个函数返回的中断号可以直接用于请求和处理中断
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野火少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值