RK3568驱动指南|第七期-设备树-第69章 of操作函数实验:获取中断资源

news2024/11/15 19:23:39

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。


【公众号】迅为电子

【粉丝群】824412014(加群获取驱动文档+例程)

【视频观看】嵌入式学习之Linux驱动(第七期_设备树_全新升级)_基于RK3568

【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板


第69章 of操作函数实验:获取中断资源

69.1 of操作:获取中断资源

69.1.1 irq_of_parse_and_map函数

该函数的主要功能是解析设备节点的"interrupts"属性,并将对应的中断号映射到系统的中断号。"interrupts"属性通常以一种特定的格式表示,可以包含一个或多个中断号。通过提供索引号,可以获取对应的中断号。

函数原型:

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

头文件:

#include <linux/of_irq.h>

函数作用:
从设备节点的"interrupts"属性中解析和映射对应的中断号

参数说明:

dev:设备节点,表示要解析的设备节点。

index:索引号,表示从"interrupts"属性中获取第几个中断号。

返回值:

是一个无符号整数,表示成功解析和映射的中断号。

 

69.1.2 irq_get_trigger_type函数

该函数的主要功能是从给定的中断数据结构中提取中断触发类型。中断触发类型描述了中断信号的触发条件,例如边沿触发(edge-triggered)或电平触发(level-triggered)等。

 函数原型:

u32 irqd_get_trigger_type(struct irq_data *d);

头文件:

#include <linux/irq.h>

函数作用:

从中断数据结构(irq_data)中获取对应的中断触发类型。

参数说明:

d:中断数据结构(irq_data),表示要获取中断触发类型的中断。

返回值:

是一个无符号32位整数,表示成功获取的中断触发类型。 

 

69.1.3 irq_get_irq_data函数

函数irq_get_irq_data的作用是根据中断号获取对应的中断数据结构(irq_data)。

函数原型:

struct irq_data *irq_get_irq_data(unsigned int irq);

头文件:
#include <linux/irq.h>

函数作用:
根据中断号获取对应的中断数据结构。

参数说明:

irq:中断号,表示要获取中断数据结构的中断号。

返回值:

指向irq_data结构体的指针,表示成功获取的中断数据结构。

69.1.4 gpio_to_irq函数

该函数的主要功能是将给定的GPIO编号转换为对应的中断号。在某些系统中,GPIO可以配置为中断引脚,当特定事件发生时触发中断。通过该函数,可以根据GPIO编号获取与之关联的中断号,以便进行中断处理等操作。

函数原型:

int gpio_to_irq(unsigned int gpio);

头文件:
#include <linux/gpio.h>

函数作用:

根据GPIO编号获取对应的中断号。

参数说明:

gpio:GPIO编号,表示要获取中断号的GPIO。

返回值:

是一个整数,表示成功获取的中断号。

69.1.5 of_irq_get函数

该函数的主要功能是从给定的设备节点的"interrupts"属性中解析并获取对应的中断号。"interrupts"属性通常以一种特定的格式表示,可以包含一个或多个中断号。通过提供索引号,可以获取对应的中断号

函数原型:

int of_irq_get(struct device_node *dev, int index);

头文件
#include <linux/of_irq.h>

函数作用:

是从设备节点的"interrupts"属性中获取对应的中断号。

参数说明:

dev:设备节点,表示要获取中断号的设备节点。

index:索引号,表示从"interrupts"属性中获取第几个中断号。

返回值:

是一个整数,表示成功获取的中断号。

 

69.1.6 irq_of_parse_and_map函数

irq_of_parse_and_map函数的主要功能是根据给定的平台设备和索引号获取对应的中断号。平台设备是指与特定硬件平台相关的设备。在某些情况下,平台设备可能具有多个中断号,通过提供索引号,可以获取对应的中断号。

函数原型:

int platform_get_irq(struct platform_device *dev, unsigned int num);

函数作用:
根据平台设备和索引号获取对应的中断号。

头文件:
linux/platform_device.h

参数说明:

dev:平台设备,表示要获取中断号的平台设备。

num:索引号,表示从中获取第几个中断号。

返回值:

是一个整数,表示成功获取的中断号。

69.2 实验程序编写

69.2.1 设备树的修改

本实验修改完成的设备树和编译完成的boot.img对应的网盘路径为:iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\57_of_03\dts

由于本章节要获取的是中断相关的资源,所以需要在设备树中添加有关中断的设备节点,在第57章节的学习中,我们已经对中断实例进行了讲解,所以这里直接对rk3568-evb1-ddr4-v10-linux.dts设备树进行中断节点的添加,添加的内容如下所示:

	myirq {
		compatible = "my_devicetree_irq";
		interrupt-parent = <&gpio3>;
		interrupts = <RK_PA5 IRQ_TYPE_LEVEL_LOW>;
	};

添加完成如下图(图69-1)所示:

图249-1

保存退出之后,重新编译内核源码,得到boot.img内核镜像之后烧写到开发板即可。

69.2.2 实验程序的编写

本实验驱动对应的网盘路径为:iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\57_of_03

本小节驱动程序是由65章驱动程序修改而来,由于本章节获取中断属性的函数需要在查找到设备树节点的前提下使用,所以在下面的程序中,先在probe函数中查找设备树节点,然后添加了本章节学习的of操作相关代码和其他一些相关的函数,用来获取设备树节点中断资源。

编写完成的platform_driver.c代码如下所示:

#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/mod_devicetable.h>
#include <linux/of.h>
#include <linux/of_irq.h>
#include <linux/gpio.h>
int num;
int irq;
struct irq_data *my_irq_data;
struct device_node *mydevice_node;
u32 trigger_type;

// 平台设备的初始化函数
static int my_platform_probe(struct platform_device *pdev)
{
    printk(KERN_INFO "my_platform_probe: Probing platform device\n");

    // 查找设备节点
    mydevice_node = of_find_node_by_name(NULL, "myirq");
    
    // 解析和映射中断
    irq = irq_of_parse_and_map(mydevice_node, 0);
    printk("irq is %d\n", irq);
    
    // 获取中断数据结构
    my_irq_data = irq_get_irq_data(irq);
    // 获取中断触发类型
    trigger_type = irqd_get_trigger_type(my_irq_data);
    printk("trigger type is 0x%x\n", trigger_type);
    
    // 将GPIO转换为中断号
    irq = gpio_to_irq(101);
    printk("irq is %d\n", irq);
    
    // 从设备节点获取中断号
    irq = of_irq_get(mydevice_node, 0);
    printk("irq is %d\n", irq);
    
    // 获取平台设备的中断号
    irq = platform_get_irq(pdev, 0);
    printk("irq is %d\n", irq);
    return 0;
}

// 平台设备的移除函数
static int my_platform_remove(struct platform_device *pdev)
{
    printk(KERN_INFO "my_platform_remove: Removing platform device\n");

    // 清理设备特定的操作
    // ...

    return 0;
}


const struct of_device_id of_match_table_id[]  = {
	{.compatible="my_devicetree_irq"},
};

// 定义平台驱动结构体
static struct platform_driver my_platform_driver = {
    .probe = my_platform_probe,
    .remove = my_platform_remove,
    .driver = {
        .name = "my_platform_device",
        .owner = THIS_MODULE,
		.of_match_table =  of_match_table_id,
    },
};

// 模块初始化函数
static int __init my_platform_driver_init(void)
{
    int ret;

    // 注册平台驱动
    ret = platform_driver_register(&my_platform_driver);
    if (ret) {
        printk(KERN_ERR "Failed to register platform driver\n");
        return ret;
    }

    printk(KERN_INFO "my_platform_driver: Platform driver initialized\n");

    return 0;
}

// 模块退出函数
static void __exit my_platform_driver_exit(void)
{
    // 注销平台驱动
    platform_driver_unregister(&my_platform_driver);

    printk(KERN_INFO "my_platform_driver: Platform driver exited\n");
}

module_init(my_platform_driver_init);
module_exit(my_platform_driver_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("topeet");

69.3 运行测试

69.3.1 编译驱动程序

export ARCH=arm64#设置平台架构
export CROSS_COMPILE=aarch64-linux-gnu-#交叉编译器前缀
obj-m += platform_driver.o    #此处要和你的驱动源文件同名
KDIR :=/home/topeet/Linux/linux_sdk/kernel    #这里是你的内核目录                                                                                                                            
PWD ?= $(shell pwd)
all:
    make -C $(KDIR) M=$(PWD) modules    #make操作
clean:
    make -C $(KDIR) M=$(PWD) clean    #make clean操作

对于Makefile的内容注释已在上图添加,保存退出之后,来到存放platform_driver.c和Makefile文件目录下,如下图(图69-2)所示:

图 69-2

然后使用命令“make”进行驱动的编译,编译完成如下图(图69-3)所示:

图 69-3

编译完生成platform_driver.ko目标文件,如下图(图69-4)所示:

图 69-4

至此驱动模块就编译成功了。

69.3.2 运行测试

在进行实验之前,首先要确保开发板烧写的是我们在69.2.1小节中编译出来的boot.img,开发板启动之后,使用以下命令进行驱动模块的加载,如下图(图69-5)所示:

insmod platform_driver.ko

图 69-5

可以看到总共有5个打印,第1、3、4、5个打印都是获取的中断号为113,第2个打印的是中断的类型,即IRQ_TYPE_LEVEL_LOW,该触发类型的宏定义在内核源码“include/dt-bindings/interrupt-controller/irq.h”目录下,具体内容如下所示:

#define IRQ_TYPE_NONE           0   // 无中断触发类型
#define IRQ_TYPE_EDGE_RISING    1   // 上升沿触发
#define IRQ_TYPE_EDGE_FALLING   2   // 下降沿触发
#define IRQ_TYPE_EDGE_BOTH    (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)// 双边沿触发
#define IRQ_TYPE_LEVEL_HIGH     4   // 高电平触发
#define IRQ_TYPE_LEVEL_LOW      8   // 低电平触发

可以看到IRQ_TYPE_LEVEL_LOW的宏定义为8,证明上面的打印正确。

然后使用以下命令进行驱动模块的卸载,如下图(图69-6)所示:

rmmod platform_driver.ko 

图 69-6

至此,使用of操作函数获取中断资源实验就完成了。


 

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

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

相关文章

HR8825 STEP/DIR 微步进电机驱动芯片

HR8825是一种内置步进表的集成微步进电机驱动器&#xff0c;为打印机、扫描仪和其它自动化设备提供处理方案。HR8825提供一种带有裸L焊盘的TSSOP-28封装&#xff0c;能改进散热性能&#xff0c;且是无铅产品&#xff0c;引脚框采用100&#xff05;无锡电镀。 内部的同步整流控制…

局域网协议:动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)

在局域网络中&#xff0c;DHCP协议通过自动化和简化网络配置过程&#xff0c;提高网络的可管理性和灵活性&#xff0c;使得设备可以更轻松地连接到网络并获得所需的网络配置信息。 文章目录 What is DHCP?DHCP的组成1. DHCP客户端2. DHCP服务器&#xff1a;3. 中继代理&#…

电源控制系统架构(PCSA)之系统分区电压域

目录 4.1 电压域 4.1.1 系统逻辑 4.1.2 Always-On逻辑 4.1.3 处理器Clusters 4.1.4 图形处理器 4.1.5 其他功能 4.1.6 SoC分区示例 本章描述基于Arm组件的SoC划分为电压域和电源域。 所描述的选择并不详尽&#xff0c;只是可能性的一个子集。目的是描述基于Arm组件的SoC…

Java基于springoot开发的企业招聘求职网站

演示视频&#xff1a; https://www.bilibili.com/video/BV1xw411n7Tu/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 技术&#xff1a;springootmysqlvuejsbootstrappoi制作word模板 主要功能&#xff1a;求职者可以注册发布简历&#xff0c;选择简…

大金仓数据库:kingbase学习

kingbase学习 1.简介2. 安装3. 基础使用3.1 客户端连接3.2 表数据测试3.2.1 建表创建字段备注 3.2.2 数据写入测试3.2.2 查询测试json查询测试 4.springboot实战4.1 maven依赖4.2 连接配置4.3 mybatis-plus测试4.4 liquibase整合(1). 使用pg方式替换kingbase驱动上面(2). 修改j…

互联网+智慧工地系统源码

智慧工地以施工现场风险预知和联动预控为目标&#xff0c;将智能AI、传感技术、人像识别、监控、虚拟现实、物联网、5G、大数据、互联网等新一代科技信息技术植入到建筑、机械、人员穿戴设施、场地进出关口等各类设备中&#xff0c;实现工程管理与工程施工现场的整合&#xff0…

软著项目推荐 深度学习 opencv python 实现中国交通标志识别

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 &#x1f525; 优质…

freeRTOS下载链接(sourceForge)

FreeRTOS Real Time Kernel (RTOS) download | SourceForge.net 文件名&#xff1a;FreeRTOSv202212.00.exe 双击后会自动变成这个样子的&#xff1a; 文件夹大小&#xff1a;506M 可以看到跟那个教程里面的文件结构是一模一样的&#xff0c;所以很可能是同一个最新版本的文件…

Android Tombstone 与Debuggerd 原理浅谈

一、前言 Android系统类问题主要有stability、performance、power、security。Android集成一个守护进程tombstoned是android平台的一个守护进程&#xff0c;它注册成3个socket服务端&#xff0c;客户端封装在crash_dump和debuggerd_client。 crash_dump用于跟踪定位C crash&am…

Gen-2重磅发布“运动画笔”,可制作视频连环画啦!

著名生成式AI平台Runway在官网宣布&#xff0c;其文生视频产品Gen-2正式发布运动画笔、预设风格、更新导演模式和优化图像模型4个功能。 其中&#xff0c;运动画笔成为本次更新的最大亮点&#xff0c;用户只需要对上传的图片指定区域进行涂抹&#xff0c;就能让生成的视频按照…

使用nginx代理s3服务(私有云存储)

1、背景 公司网络安全原因&#xff0c;私有部署s3服务的机器无法被直接访问&#xff0c;所以需要加一层代理&#xff0c;通过访问代理去访问s3服务器&#xff0c;这里使用nginx进行代理。使用s3服务的方式是在代码中使用官方的java s3 sdk&#xff08;本文对于其他语言的官方s…

输入4个整数,找出其中最大的数。用函数的嵌套调用来处理

目录 1解题思路: 2运行代码&#xff1a; 3运行结果: 4总结&#xff1a; 函数 定义函数 实例 函数声明 调用函数 实例 函数参数 1解题思路: 这个问题并不复杂&#xff0c;完全可以利用一个主函数就可以得到结果。现在根据题目要求&#xff0c;用函数的嵌套调用来处理。…

redis运维(十二) 位图

一 位图 ① 概念 1、说明&#xff1a;位图还是在操作字符串2、位图玩字符串在内存中存储的二进制3、ASCII字符通过映射转化为二进制4、操作的是字符串value ② ASCII字符铺垫 1、控制ASCII字符 2、ASCII可显示字符 ③ SETBIT 细节&#xff1a; setbit 命令的返回值是之…

自求导的方法实现线性回归算法

线性回归是一种常用的回归算法&#xff0c;用于建立输入变量和连续输出变量之间的关系。传统的线性回归算法通常依赖于繁琐的数学推导和梯度计算。但是&#xff0c;随着深度学习的兴起&#xff0c;自求导的方法逐渐成为实现线性回归算法的有效途径。本文将介绍如何使用自求导的…

FreeRTOS-FreeRTOS概述

FreeRTOS FreeRTOS目录结构 移植过程 在工程中创建freertos文件夹&#xff0c;在freertos文件夹中创建src文件夹、inc文件夹、port文件夹。 freertos/src存放源码freertos/inc存放头文件freertos/port存放移植平台的相关文件 复制内存管理文件&#xff1a;复制FreeRTOS/Sourc…

时间复杂度 空间复杂度 ---java

目录 一. 算法效率 二.时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3常见时间复杂度计算举例 三. 空间复杂度 一. 算法效率 算法效率分析分为两种&#xff1a;第一种是时间效率&#xff0c;第二种是空间效率 。 时间效率被称为时间复杂度&#xff0c;而空间…

post请求参数全大写后台接不到参数

post请求参数全大写后台接不到参数 开发过程中&#xff0c;我们一般都习惯用驼峰命名法&#xff0c;但是特殊情况要求请求参数全大写&#xff08;或者首字母大写&#xff09;&#xff0c;测试验证的时候发现&#xff0c;接收不到请求参数。 前端请求传递&#xff1a; 服务端接…

季报含金量强势推高股价,满帮十年持续拉高数字货运生态天花板

经济活动越发密集&#xff0c;跑在路上的货车和司机们成为最忙碌的角色。11月20日美股盘前&#xff0c;数字货运龙头满帮集团&#xff08;YMM.US&#xff0c;以下简称&#xff1a;满帮&#xff09;发布2023年第三季度财报&#xff0c;其用户规模、业绩数据、履约单量等指标全面…

亚马逊两步验证有哪些验证方法?

亚马逊通常提供多种两步验证的方式&#xff0c;包括短信&#xff08;通过手机接收验证码&#xff09;和认证器应用程序&#xff08;如Google Authenticator、Authy等&#xff09;。选择你偏好的方式。 短信验证&#xff1a; 如果选择短信验证&#xff0c;需要将你的手机号码关联…

《算法通关村——原来这就是堆》

《算法通关村——原来这就是堆》 理解最大堆&#xff1a; 最大堆就是父节点一定比子节点都要大所以就形成了&#xff0c;自然而然根节点就是最大的值了。 如果在最大堆中要插入值得话&#xff0c;那么就需要把值插入到最后&#xff0c;然后一步一步得走上去&#xff0c;也就是…