中断的设备树修改及上机实验(按键驱动)流程

写在前面的话:对于 GPIO 按键,我们并不需要去写驱动程序,使用内核自带的驱动程序 drivers/input/keyboard/gpio_keys.c 就可以,然后你需要做的只是修改设备树指定引脚及键值。
根据驱动文件中的platform_driver中的.of_match_table的compatible属性名去找对应在dts文件中的节点做修改。

查看原理图确定按键引脚

修改设备树文件

查看原理图确定按键使用的引脚,再在设备树中添加节点,在节点里指定中断信息
 例子:
gpio_keys_100ask {
compatible = "100ask,gpio_key";
gpios = <&gpio5 1 GPIO_ACTIVE_HIGH
&gpio4 14 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&key1_pinctrl
&key2_pinctrl>;
};

在硬件上,“中断控制器”只有 GIC 这一个,但是我们在软件上也可以把下图中的“GPIO ”称为“中断控制器”。很多芯片有多个 GPIO 模块,比如 GPIO1 、 GPIO2 等等。所以软件上的“中断控制器”就有很多个: GIC GPIO1 GPIO2 等 等。
一个外设,它的中断信号接到哪个“中断控制器”的哪个“中断引脚”,这个中断的触发方式是怎样的? 这 3 个问题,在设备树里使用中断时,都要有所体现。
interrupt-parent=<&XXXX>
你要用哪一个中断控制器里的中断?
interrupts
你要用哪一个中断?
Interrupts 里要用几个 cell ,由 interrupt-parent 对应的中断控制器决定。在中断控制器里有“#interrupt-cells ”属性,它指明了要用几个 cell来描述中断。
比如:下图为dtsi文件中的 gpio 5 定义,也表明了此io既是gpio控制器也是中断控制器,它的parent是GIC
			gpio5: gpio@020ac000 {compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";reg = <0x020ac000 0x4000>;interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;gpio-controller;#gpio-cells = <2>;interrupt-controller;#interrupt-cells = <2>;

对于一个引脚要用作中断时:

a) 要通过 PinCtrl 把它设置为 GPIO 功能;
b) 表明自身:是哪一个 GPIO 模块里的哪一个引脚

写驱动程序

首先要获得中断号

在Linux中,如果要使用gpio_to_irq函数获取GPIO引脚对应的中断号,通常是在驱动程序中进行的,而不是在设备树中。设备树通常只描述硬件连接和属性,而不涉及中断处理。因此,为了获取GPIO引脚对应的中断号,需要在相应的驱动程序中进行。

例如,在使用了这些GPIO键的驱动程序中,可以使用gpio_to_irq函数来获取GPIO引脚对应的中断号。

然后编写中断处理函数;
最后 request_irq

具体来说,request_irq函数做了以下几件事情:

  1. 注册中断处理函数:将你提供的中断处理函数注册到内核中,以便在中断发生时调用该函数执行中断处理操作。

  2. 请求分配中断号:告诉内核你需要一个中断号来处理中断。内核会分配一个可用的中断号给你的设备,并将中断处理函数与这个中断号关联起来。

  3. 配置中断属性:你可以指定中断的一些属性,例如中断类型(边沿触发、电平触发等)、中断处理函数的上下文(共享中断或独占中断)、中断处理函数的参数等。

  4. 关联中断上下文:如果你的设备需要访问中断处理函数之外的其他数据,你可以将这些数据通过中断处理函数的上下文参数传递给中断处理函数。

在代码中获取中断:

1、对于 platform_device
一个节点能被转换为 platform_device ,如果它的设备树里指定了中断属 性,那么可以从 platform_device 中获得“中断资源”,函数如下,可以使用下 列函数获得 ORESOURCE_IRQ 资源,即中断号:
2、 对于 I2C 设备、 SPI 设备
对于 I2C 设备节点, I2C 总线驱动在处理设备树里的 I2C 子节点时,也会处 理其中的中断信息。一个 I2C 设备会被转换为一个 i2c_client 结构体,中断号会保存在 i2c_client 的 irq 成员里
对于 SPI 设备节点, SPI 总线驱动在处理设备树里的 SPI 子节点时,也会处理其中的中断信息。一个 SPI 设备会被转换为一个 spi_device 结构体,中断号会保存在 spi_device irq 成员里
i2c代码如下:
3、调用 of_irq_get 获得中断号
如果你的设备节点既不能转换为 platform_device ,它也不是 I2C 设备, 不是 SPI 设备,那么在驱动程序中可以自行调用 of_irq_get 函数去解析设备树,得到中断号。
对于 GPIO 参考:drivers/input/keyboard/gpio_keys.c 可以使用 gpio_to_irq gpiod_to_irq 获得中断号。
                            irq = gpiod_to_irq(bdata->gpiod);

把修改后的dts文件编译得到新的dtb文件,拷贝到板子的boot目录下;

先进入驱动程序目录,执行 make 即可,把编译后的驱动程序ko文件拷贝到板子网络文件系统文件夹下;

重启开发板;

进入根目录insmod装载ko文件;

测试;

总结:

对于此例按键驱动,用gpio接收按键中断信号,要做的就是

1)注意设备树中的Pinctrl设置好按键对应引脚的gpio功能,dtsi文件中写明了该gpio节点也是中断控制器

2)在驱动程序中获得中断号;申请中断(注册一个中断处理函数,并分配一个中断号来处理该中断);写明中断处理函数。

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

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

相关文章

gemini国内能用吗

gemini国内能用吗 虽然 Gemini 的具体功能和性能还未完全公开&#xff0c;但基于 Google 在 AI 领域的强大背景和技术实力&#xff0c;已经火出圈了&#xff0c;很多小伙伴已经迫不及待想了解一下它有什么优势以及如何快速使用上 首先我们来讲一下gemini的优势 多模态能力&a…

Python之Excel公式与注释处理秘籍

在日常工作中&#xff0c;我们经常需要处理Excel表格&#xff0c;无论是读取数据、编辑公式还是添加注释。Python中的xlrd和xlwt库就是我们的得力助手。今天&#xff0c;我们就来一起探索如何使用这两个库优雅地应对带有公式和注释的Excel文件。 一、xlrd&#xff1a;读取Exce…

Springboot配置文件(application.yml)的加载顺序

spring boot 启动会扫描一下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件 file…/config/ file…/ classpath:/config classpath:/ 以上是按照优先级从高到低的顺序&#xff0c;所有位置的文件都会被加载&#xff0c;高优先级配置内容会…

C++-命名空间

C 命名空间是一种用于组织代码的机制&#xff0c;可以帮助避免命名冲突&#xff0c;提高代码的可读性和可维护性。命名空间将代码分组到逻辑单元中&#xff0c;允许在不同的代码单元中使用相同的名称而不会产生冲突。 命名空间通过将代码放置在一个命名空间内部来实现。在 C 中…

边缘计算、联邦学习、语义通信、知识蒸馏等,这些在科研方面有什么联系?

在科研领域中&#xff0c;边缘计算、联邦学习、语义通信和知识蒸馏等概念之间存在一定的联系和交叉点。这些概念通常在人工智能、机器学习、计算机视觉等领域中被广泛讨论和应用。 1. **边缘计算**&#xff1a;边缘计算是一种分布式计算架构&#xff0c;旨在将数据处理和存储功…

算法-反转单向链表

需求 思路 链表必有节点&#xff0c;节点两要素&#xff1a;当前元素值&#xff0c;下一个节点地址 import java.util.Scanner;// 定义一个单向链表 public class MyLinkedList<E> {int size 0;// 顶一个私有的内部类&#xff0c;表示链表的节点public class Node {E da…

第十四届蓝桥杯ABD题

A、阶乘求和&#xff1a; 【问题描述】 令 S 1! 2! 3! ... 202320232023! &#xff0c;求 S 的末尾 9 位数字。 提示&#xff1a;答案首位不为 0 。 【答案提交】 这是一道结果填空的题&#xff0c;你只需要算出结果后提交即可。本题的结果为一 个整数&#xff0c;在…

JavaSE 有这一篇就够(呕心狂敲41k字,只为博君一点赞!)

目录 一. 基础语法 1. 数据类型 2. 基本数据类型转换 3. 运算符 3. 循环语句 5. 定义方法 6. 数组 二. 面向对象 1. 类和对象 2. 构造方法 3. 方法的重载 4. this关键字 5. static关键字 6. 代码块 7. 访问权限修饰符 8. 面向对象的三大特征 封装 继承…

你会写SAP技术规格说明书(Specification)吗

有些小伙伴可能还在发愁技术规则说明书应该写什么&#xff0c;做了张思维导图&#xff0c;包含了所有RICEFW。 R - Report - 报表 I - Interface - 接口 C - Conversion - 数据转换 E - Enhancement - 增强 F - Form - 表单 W - Workflow - 工作流

代码随想录算法训练营第四十五天|57.爬楼梯、322.零钱兑换、279.完全平方数

文档链接&#xff1a;https://programmercarl.com/ LeetCode57.爬楼梯 题目链接&#xff1a;https://kamacoder.com/problempage.php?pid1067 思路&#xff1a;每个物品能用多次——完全背包。求排列&#xff0c;遍历顺序要先背包后物品。 动规&#xff1a; #include<…

使用Python实现交叉验证与模型评估

交叉验证是一种评估机器学习模型性能的常用方法&#xff0c;它可以更准确地估计模型在未知数据上的性能。在本文中&#xff0c;我们将介绍交叉验证的原理和常见的几种交叉验证方法&#xff0c;并使用Python来实现这些方法&#xff0c;并展示如何使用交叉验证来评估模型的性能。…

华为OD机试:30 找出通过车辆最多颜色

package a_od_test;import java.util.Arrays; import java.util.Scanner;/* 找出通过车辆最多颜色 知识点滑奩 时间限制&#xff1a;1S空间限制&#xff1a;256MB限定语言&#xff1a;不限 题目描述&#xff1a; 在一个狭小的路口&#xff0c;每秒只能通过一辆车&#xff0c;假…

蓝桥杯刷题-包子凑数

1226. 包子凑数 - AcWing题库 #include <bits/stdc.h>using namespace std;const int N 110; int n , d 0; int a[N]; bool dp[N][10005];int gcd(int a,int b) {return b ? gcd(b , a % b) : a; }int main() {cin >> n;for(int i 1 ;i < n;i ){cin >&g…

【机器学习】数据变换---小波变换特征提取及应用案列介绍

引言 在机器学习领域&#xff0c;数据变换是一种常见且重要的预处理步骤。通过对原始数据进行变换&#xff0c;我们可以提取出更有意义的特征&#xff0c;提高模型的性能。在众多数据变换方法中&#xff0c;小波变换是一种非常有效的方法&#xff0c;尤其适用于处理非平稳信号和…

OpenHarmony网络协议通信c-ares [交叉编译]异步解析器库

简介 c-ares是异步解析器库&#xff0c;适用于需要无阻塞地执行 DNS 查询或需要并行执行多个 DNS 查询的应用程序。 下载安装 直接在OpenHarmony-SIG仓中搜索c-ares并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 将下载的c-ares库代码存在以下路径&#xff1a;…

AI大模型日报#0416:李飞飞《2024年人工智能指数报告》、Sora加入Adobe、李彦宏聊百度大模型之路

​导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。标题: 刚刚&#xff0c;李飞飞团队发布《2024年人工智能指数报告》&#xff1a;10大趋势&#xff0c;揭示AI大模型的“喜”与“忧” 摘…

代码随想录打卡—day27—【回溯】— 回溯基础练习 4.15+4.16

1 39. 组合总和 39. 组合总和 我的AC代码&#xff1a; class Solution { public:vector<vector<int>> ans;vector<int> path;void dfs(int sum,vector<int>& candidates,int target,int start_idx){if(sum > target)return;if(sum target){a…

将 Notepad++ 添加到右键菜单

目录 方式一&#xff1a;添加注册表&#xff08;手动&#xff09; 方式二&#xff1a;添加注册表&#xff08;一键添加&#xff09; 有时安装了notepad后&#xff0c;在txt文件上右键&#xff0c;在弹出的菜单栏中没有【通过 Notepad 打开】&#xff0c;如下&#xff1a; 这…

【面经】2024春招-云计算后台研发工程师1(3个问题,移动TW等)

【面经】2024春招-云计算后台研发工程师1&#xff08;3个问题&#xff0c;移动&TW等&#xff09; 文章目录 岗位与面经基础1&#xff1a;数据库 & 网络&#xff08;3个问题&#xff09;基础2&#xff1a;系统 & 语法模板3&#xff1a;算法 & 项目&#xff08;移…

[StartingPoint][Tier2]Base

Task 1 Which two TCP ports are open on the remote host? (远程服务器开放了哪两个TCP端口?) $ nmap -sC -sV 10.129.234.232 22,80 Task 2 What is the relative path on the webserver for the login page? (相关的登录页面路径是什么?) /login/login.php Task 3 …