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

news/2024/5/28 4:08:48/ 标签: 单片机, 嵌入式硬件
写在前面的话:对于 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.ppmy.cn/news/1424619.html

相关文章

【uniapp】request请求函数封装,token、成功、失败等

1、封装http.ts //utils--->http.ts/*** 添加拦截器* 拦截request请求* 拦截uploadFile文件上传** TODO* 1、非http开头需要拼接地址* 2、请求超时* 3、添加小程序端请求头标识* 4、添加token请求头标识*/ import { useMemberStore } from /stores/index const member…

yolov8目标检测 部署瑞芯微rk3588记录

1. 前置条件 本地电脑系统&#xff0c;ubuntu20.04 训练代码&#xff1a; 训练代码下载的ultralytics官方代码 SHA&#xff1a;6a2fddfb46aea45dd26cb060157d22cf14cd8c64 训练代码仅做数据修改&#xff0c;类别修改&#xff0c;代码结构未做任何修改 需要准备的代码&#…

【网站项目】驾校报名小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

华为校园公开课走入上海交大,鸿蒙成为专业核心课程

4月12日&#xff0c;华为校园公开课在中国上海交通大学成功举办&#xff0c;吸引了来自计算机等相关专业的150余名学生参加。据了解&#xff0c;由吴帆、陈贵海、过敏意、吴晨涛、刘生钟等教授在中国上海交通大学面向计算机系本科生开设的《操作系统》课程&#xff0c;是该系学…

Day04 - React 第四天

学习react的第四天&#xff0c;持续更新中 关注不迷路&#xff01;&#xff01;&#xff01; 组件三大核心之——Ref ref多种形式 字符串形式 回调形式 createRef 字符串形式 class Perosn extends React.Component {render() {return (<div><input ref"ipnp…

R语言影像批量镶嵌与裁剪——mosaic

你有中国不同省份的影像&#xff0c;想要拼接镶嵌成完整的中国影像 镶嵌一 library("raster") library("sp") library("rgdal") library("rgeos") library("…

Django中间件路由映射自动加/斜杠问题原因及分析

输入 http://127.0.0.1:8000/main/index/ 输入 http://127.0.0.1:8000/main/index 路由定义情况 urlpatterns [path("index/", views.index) ]可以发现我在输入URL的index路由时&#xff0c;如果没有和Django定义的路由匹配规则一样的话&#xff0c;浏览器自…

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

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

(十六)call、apply、bind介绍、区别和实现

函数中的this指向&#xff1a; 函数中的this指向是在函数被调用的时候确定的&#xff0c;也就是执行上下文被创建时确定的。在一个执行上下文中&#xff0c;this由调用者提供&#xff0c;由调用函数的方式来决定。 类数组对象arguments&#xff1a; arguments只在函数&#…

Adobe Premiere Pro将加入AI生成式功能,以提高视频编辑的效率;OpenAI宣布在东京设立亚洲首个办事处

&#x1f989; AI新闻 &#x1f680; Adobe Premiere Pro将加入AI生成式功能&#xff0c;以提高视频编辑的效率 摘要&#xff1a;Adobe宣布&#xff0c;将为Premiere Pro引入由生成式AI驱动的新功能&#xff0c;以提高视频编辑的效率。这些功能包括“生成扩展”&#xff0c;能…

ArrayList,Vector,LinkedList内存解析

1.ArrayList (1). 特点 : 实现了List接口&#xff0c;存储有序的&#xff0c;可重复的数据.底层使用Object[]数组存储.线程不安全.(底层方法未用synchronized修饰.) (2). 版本解析 : <i> : JDK7版本 ArrayList<String> list &#xff1d;new ArrayList<&…

OV通配符证书:安全、便捷的网络认证新选择

OV通配符证书&#xff0c;即组织验证型通配符证书&#xff0c;其最大特点在于其通配符功能。这意味着&#xff0c;一个OV通配符证书可以覆盖同一主域名下的多个子域名&#xff0c;大大简化了证书管理和维护的复杂性。无论是大型企业还是个人网站&#xff0c;都可以通过OV通配符…

服务器上部署GPU版的milvus向量数据库

1、安装docker compose 我们可以从 Github 上下载它的二进制包来使用&#xff0c;最新发行的版本地址&#xff1a; https://github.com/docker/compose/releases sudo curl -L "https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-$(uname -s)…

「GO基础」在Windows上安装Go编译器并配置Golang开发环境

文章目录 1、安装Go语言编译程序1.1、下载GoLang编译器1.2、安装GoLang编译器 2、配置Golang IDE运行环境2.1、配置GO编译器2.1.1、GOROOT 概述2.1.2、GOROOT 作用2.1.2、配置 GOROOT 2.2、配置GO依赖管理2.2.1、Module管理依赖2.2.2、GOPATH 管理依赖 2.3、运行GO程序2.3.1、创…

什么是PE 格式

2024年4月19日&#xff0c;周五下午 PE&#xff08;Portable Executable&#xff09;格式是一种 Windows 操作系统中常见的可执行文件和对象文件格式。它是微软公司为 Windows NT 操作系统引入的一种文件格式&#xff0c;用于存储可执行程序、动态链接库&#xff08;DLL&#x…

全栈外包接单/远程工作(TS, React, Vue, Java, 移动端)

个人介绍 我毕业于中国某一本院校计算机专业&#xff0c;曾在北京大型软件公司从事Java开发多年&#xff0c;主要服务于全国各大头部985/211院校。后来为扩宽职业路径&#xff0c;转向了Ts全栈&#xff0c;现专注于远程外包接单工作&#xff0c;致力于打造一个能为客户带来优质…

binary tree Leetcode 二叉树算法题

144.二叉树的前序遍历 前序遍历是&#xff1a;根-左-右 所以记录序列的的时候放在最前面 递归 class Solution {List<Integer> ans new ArrayList<>();public List<Integer> preorderTraversal(TreeNode root) {if(root null) return ans;ans.add(root…

CSS实现弹性盒子保持水平和垂直居中

弹性盒子 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &…

C语言 | Leetcode C语言题解之第32题最长有效括号

题目&#xff1a; 题解&#xff1a; int longestValidParentheses(char* s) {int n strlen(s);int left 0, right 0, maxlength 0;for (int i 0; i < n; i) {if (s[i] () {left;} else {right;}if (left right) {maxlength fmax(maxlength, 2 * right);} else if (…

MySQL慢SQL优化方案汇总

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《mysql经验总结》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 优化思路 避免查询不必要的列 分页优化 索引优化 JOIN优化 排序优化 UNION 优化 写在最后 写在前面 本…