基于设备树的TQ2440的中断(2)

下面以按键中断为例看看基于设备数的中断的用法:

设备树:

    tq2440_key {compatible = "tq2440,key";interrupt-parent = <&gpf>;interrupts = <0 IRQ_TYPE_EDGE_FALLING>, <1 IRQ_TYPE_EDGE_FALLING>;key_3 = <&gpf 2 GPIO_ACTIVE_HIGH>;key_4 = <&gpf 4 GPIO_ACTIVE_HIGH>;key_8 = <&gpg 0 GPIO_ACTIVE_HIGH>;};

驱动:

 1 #include <linux/init.h>
 2 #include <linux/module.h>
 3 #include <linux/platform_device.h>
 4 #include <linux/gpio.h>
 5 #include <linux/of.h>
 6 #include <linux/of_gpio.h>
 7 #include <linux/interrupt.h>
 8 
 9 static irqreturn_t tq2440_key_isr(int irq, void *dev_id)
10 {
11     printk("%s enter, irq: %d, %s\n", __func__, irq, (char *)dev_id);
12     return IRQ_HANDLED;
13 }
14 
15 static int tq2440_key_probe(struct platform_device *pdev) {
16     struct device *dev = &pdev->dev;
17     int irq_gpio = -1;
18     int irq = -1;
19 
20     printk("%s enter.\n", __func__);
21 
22     if (!dev->of_node) {
23         dev_err(dev, "no platform data.\n");
24         return -EINVAL;
25     }
26 
27     irq = platform_get_irq(pdev, 0);
28     printk("%s: get irq %d\n", __func__, irq);
29     devm_request_any_context_irq(dev, irq,
30         tq2440_key_isr, IRQF_TRIGGER_FALLING, "key-1", "key-1");
31 
32     irq = platform_get_irq(pdev, 1);
33     printk("%s: get irq %d\n", __func__, irq);
34     devm_request_any_context_irq(dev, irq,
35         tq2440_key_isr, IRQF_TRIGGER_FALLING, "key-2", "key-2");
36 
37     irq_gpio = of_get_named_gpio(dev->of_node, "key_3", 0);
38     irq = gpio_to_irq(irq_gpio);
39     printk("%s: gpio: %d ---> irq (%d)\n", __func__, irq_gpio, irq);
40     devm_request_any_context_irq(dev, irq,
41         tq2440_key_isr, IRQF_TRIGGER_FALLING, "key-3", "key-3");
42 
43     irq_gpio = of_get_named_gpio(dev->of_node, "key_4", 0);
44     irq = gpio_to_irq(irq_gpio);
45     printk("%s: gpio: %d ---> irq (%d)\n", __func__, irq_gpio, irq);
46     devm_request_any_context_irq(dev, irq,
47         tq2440_key_isr, IRQF_TRIGGER_FALLING, "key-4", "key-4");
48 
49     irq_gpio = of_get_named_gpio(dev->of_node, "key_8", 0);
50     irq = gpio_to_irq(irq_gpio);
51     printk("%s: gpio: %d ---> irq (%d)\n", __func__, irq_gpio, irq);
52     devm_request_any_context_irq(dev, irq,
53         tq2440_key_isr, IRQF_TRIGGER_FALLING, "key-8", "key-8");
54 
55     return 0;
56 }
57 
58 static int tq2440_key_remove(struct platform_device *pdev) {
59 
60     printk("%s enter.\n", __func__);
61 
62     return 0;
63 }
64 
65 static const struct of_device_id tq2440_key_dt_ids[] = {
66     { .compatible = "tq2440,key", },
67     {},
68 };
69 
70 MODULE_DEVICE_TABLE(of, tq2440_key_dt_ids);
71 
72 static struct platform_driver tq2440_key_driver = {
73     .driver        = {
74         .name    = "tq2440_key",
75         .of_match_table    = of_match_ptr(tq2440_key_dt_ids),
76     },
77     .probe        = tq2440_key_probe,
78     .remove        = tq2440_key_remove,
79 };
80 
81 static int __init tq2440_key_init(void)
82 {
83     int ret;
84 
85     ret = platform_driver_register(&tq2440_key_driver);
86     if (ret)
87         printk(KERN_ERR "tq2440_key: probe failed: %d\n", ret);
88 
89     return ret;
90 }
91 module_init(tq2440_key_init);
92 
93 static void __exit tq2440_key_exit(void)
94 {
95     platform_driver_unregister(&tq2440_key_driver);
96 }
97 module_exit(tq2440_key_exit);
98 
99 MODULE_LICENSE("GPL");
View Code

启动后,加载驱动,可以看看/proc/interrupts:

[root@tq2440 mnt]# cat /proc/interrupts CPU0       7:        252  s3c-eint   7 Edge      eth08:          0       s3c   8 Edge      s3c2410-rtc tick13:      37624       s3c  13 Edge      samsung_time_irq15:          7  s3c2410-eint0_3   0 Edge      key-117:         10  s3c2410-eint0_3   1 Edge      key-218:         12  s3c2410-eint0_3   2 Edge      key-319:          6  s3c-eint   4 Edge      key-420:          0  s3c-eint   0 Edge      key-826:          0       s3c  26 Edge      ohci_hcd:usb127:          4       s3c  27 Edge      54000000.i2c30:          0       s3c  30 Edge      s3c2410-rtc alarm32:        236  s3c-level  32 Level     50000000.serial33:       2820  s3c-level  33 Level     50000000.serial59:          0  s3c-level  59 Edge      53000000.watchdog

下面是加载驱动的时候时的log:

<7>[   29.155953] tq2440_key_probe enter.
<7>[   29.156100] tq2440_key_probe: get irq 15
<7>[   29.156350] tq2440_key_probe: get irq 17
<7>[   29.156546] tq2440_key_probe: gpio: 86 ---> irq (18)
<7>[   29.156803] tq2440_key_probe: gpio: 88 ---> irq (19)
<7>[   29.157061] tq2440_key_probe: gpio: 92 ---> irq (20)

按键的时候会看到下面的log:

<7>[  350.161506] tq2440_key_isr enter, irq: 17, key-2
<7>[  354.624168] tq2440_key_isr enter, irq: 18, key-3
<7>[  355.301634] tq2440_key_isr enter, irq: 19, key-4
<7>[  357.053889] tq2440_key_isr enter, irq: 15, key-1
<7>[  368.231196] tq2440_key_isr enter, irq: 20, key-8

可以在中断处理函数中将调用栈打印出来:

EINT0_3中断对应的log:

<7>[  483.595441] [<bf008044>] (tq2440_key_isr [interrupts_demo]) from [<c00447d8>] (__handle_irq_event_percpu+0x3c/0x130)
<7>[  483.595481] [<c00447d8>] (__handle_irq_event_percpu) from [<c00448e8>] (handle_irq_event_percpu+0x1c/0x54)
<7>[  483.595521] [<c00448e8>] (handle_irq_event_percpu) from [<c0044948>] (handle_irq_event+0x28/0x3c)
<7>[  483.595558] [<c0044948>] (handle_irq_event) from [<c00476a8>] (handle_edge_irq+0xbc/0x190)
<7>[  483.595586] [<c00476a8>] (handle_edge_irq) from [<c0043fd8>] (generic_handle_irq+0x2c/0x40)
<7>[  483.595621] [<c0043fd8>] (generic_handle_irq) from [<c00441ac>] (__handle_domain_irq+0x6c/0xcc)
<7>[  483.595653] [<c00441ac>] (__handle_domain_irq) from [<c0009444>] (s3c24xx_handle_irq+0x6c/0x12c)
<7>[  483.595681] [<c0009444>] (s3c24xx_handle_irq) from [<c000e5fc>] (__irq_svc+0x5c/0x78)

EINT4:

<7>[  594.735684] [<bf008044>] (tq2440_key_isr [interrupts_demo]) from [<c00447d8>] (__handle_irq_event_percpu+0x3c/0x130)
<7>[  594.735725] [<c00447d8>] (__handle_irq_event_percpu) from [<c00448e8>] (handle_irq_event_percpu+0x1c/0x54)
<7>[  594.735764] [<c00448e8>] (handle_irq_event_percpu) from [<c0044948>] (handle_irq_event+0x28/0x3c)
<7>[  594.735801] [<c0044948>] (handle_irq_event) from [<c00476a8>] (handle_edge_irq+0xbc/0x190)
<7>[  594.735832] [<c00476a8>] (handle_edge_irq) from [<c0043fd8>] (generic_handle_irq+0x2c/0x40)
<7>[  594.735878] [<c0043fd8>] (generic_handle_irq) from [<c02490f4>] (s3c24xx_demux_eint4_7+0xa4/0x120)
<7>[  594.735916] [<c02490f4>] (s3c24xx_demux_eint4_7) from [<c00441ac>] (__handle_domain_irq+0x6c/0xcc)
<7>[  594.735946] [<c00441ac>] (__handle_domain_irq) from [<c0009444>] (s3c24xx_handle_irq+0x6c/0x12c)
<7>[  594.735975] [<c0009444>] (s3c24xx_handle_irq) from [<c000e5fc>] (__irq_svc+0x5c/0x78)

EINT8:

<7>[  652.506024] [<bf008044>] (tq2440_key_isr [interrupts_demo]) from [<c00447d8>] (__handle_irq_event_percpu+0x3c/0x130)
<7>[  652.506065] [<c00447d8>] (__handle_irq_event_percpu) from [<c00448e8>] (handle_irq_event_percpu+0x1c/0x54)
<7>[  652.506106] [<c00448e8>] (handle_irq_event_percpu) from [<c0044948>] (handle_irq_event+0x28/0x3c)
<7>[  652.506142] [<c0044948>] (handle_irq_event) from [<c00476a8>] (handle_edge_irq+0xbc/0x190)
<7>[  652.506171] [<c00476a8>] (handle_edge_irq) from [<c0043fd8>] (generic_handle_irq+0x2c/0x40)
<7>[  652.506219] [<c0043fd8>] (generic_handle_irq) from [<c0249224>] (s3c24xx_demux_eint8_23+0xb4/0x130)
<7>[  652.506258] [<c0249224>] (s3c24xx_demux_eint8_23) from [<c00441ac>] (__handle_domain_irq+0x6c/0xcc)
<7>[  652.506287] [<c00441ac>] (__handle_domain_irq) from [<c0009444>] (s3c24xx_handle_irq+0x6c/0x12c)
<7>[  652.506316] [<c0009444>] (s3c24xx_handle_irq) from [<c000e5fc>] (__irq_svc+0x5c/0x78)

 

完。

转载于:https://www.cnblogs.com/pengdonglin137/p/6848851.html

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

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

相关文章

计算机里有个不能进入的磁盘分区,新电脑只有一个分区怎么办? 教你们如何不进pe给硬盘创建新分区!...

很多朋友新电脑刚买回来打开发现明明自己机械硬盘1T或者1T机械加128G固态&#xff0c;但是却只有一个或者两个分区&#xff0c;但是又不会分区现在教大家如何不用老毛桃大白菜之类的进pe系统里面就能直接创建新分区1 WinR输入diskmgmt.msc2进入磁盘管理可以查看本机的C盘与E盘的…

OSGi中的权限

在上一篇文章中 &#xff0c;我们介绍了为Java应用程序实现沙箱的方法&#xff0c;在其中我们可以安全地运行移动代码 。 这篇文章探讨了如何在OSGi环境中执行相同的操作。 OSGi OSGi规范 为Java定义了一个动态模块系统 。 因此&#xff0c;它是实施那种可以使您的应用程序动…

HTTP简单教程

目录 HTTP简介 HTTP工作原理 HTTP消息结构 客户端请求消息服务器响应消息实例 HTTP请求方法HTTP响应头信息HTTP状态码 HTTP状态码分类HTTP状态码列表 HTTP content-type对照表 HTTP简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写&…

Reversed-Z详解

在3D渲染管线中&#xff0c;Z这个家伙几乎无处不在&#xff0c;如Z-Buffer&#xff0c;Early-Z&#xff0c;Z-Cull&#xff0c;Z-Test&#xff0c;Z-Write等等&#xff0c;稍有接触图形学的人都会对这些术语有所耳闻。 那么Z到底是什么呢&#xff1f;首先Z当然可以是任意坐标系…

pyqt开发的程序模板_小程序定制开发和模板开发要多少钱?有什么区别?

到现在&#xff0c;小程序开发已经有了1年多的历史&#xff0c;已经达到百万数量级。无论是小程序商城还是小程序游戏&#xff0c;其开发方式不外乎两种&#xff0c;一种是定制开发&#xff0c;另一种是模板开发。对于很多初次接触小程序的客户来说&#xff0c;还不知道小程序的…

html 三列布局(两列自适应,一列固定宽度)

不做过多解释&#xff1a;主要是记录一个完整的布局样式&#xff0c;实现页面大致三列其中左右两列是自适应宽度&#xff0c;中间固定宽度效果。 不多少代码奉上&#xff1a; CSS样式代码&#xff1a; /*********************公共标签样式********************//************…

单曲循环 翻译_歌单 | 单曲循环amp;热评

December2020/12/ 写在前面的话 /本来打算在跨年的时候才更文&#xff0c;但是吧又觉得空出这最后一个月有点苍白&#xff0c;然后最近一直夜半网抑云(敏感ing)就想到可以做一期分享歌单的推文&#xff0c;分享一些最近听得频繁的歌曲(还不是刷抖音刷出来的)。《暧昧》// 王菲徘…

休息使用Jersey –包含JAXB,异常处理和客户端程序的完整教程

最近&#xff0c;我开始使用Jersey API开发一个Restful Web服务项目。 在线提供了一些教程&#xff0c;但是我遇到了异常处理方面的一些问题&#xff0c;而且在使用JaxB和提供异常处理方法的完整项目中找不到任何地方。 因此&#xff0c;一旦我能够使用带有异常处理和客户端程序…

【转】Java方向如何准备BAT技术面试答案(汇总版)

原文地址&#xff1a;http://www.jianshu.com/p/1f1d3193d9e3 这个主题的内容之前分三个篇幅分享过&#xff0c;导致网络上传播的比较分散&#xff0c;所以本篇做了一个汇总&#xff0c;同时对部分内容及答案做了修改&#xff0c;欢迎朋友们吐槽、转发。因为篇幅长度和时间的原…

numpy维度交换_“lazy”的transpose()函数——从numpy 数组的内存布局讲起

1 数组的两种内存布局方式行优先与列优先首先我们回顾一下&#xff0c;矩阵数据在内存中的两种布局方式&#xff1a;行优先&#xff08;row-major&#xff09;&#xff1a;以行为优先单位&#xff0c;在内存中逐行存储/读取&#xff1b;对于多维&#xff0c;意味着当线性扫描内…

云耀服务器切换系统,【计算】云耀服务器-常见操作汇总指南

通过上期的介绍&#xff0c;相信大家对于云耀云服务器的基本知识有了一个了解。云耀云服务器是一个具备独立、完整的操作系统和网络功能&#xff0c;可快速搭建简单应用的新一代云服务器。接下来&#xff0c;本期为大家带来关于云耀云服务器使用中的一些简单方法和小技巧。1.云…

机器学习应该准备哪些数学预备知识?

转 https://www.zhihu.com/question/36324957 https://www.zhihu.com/question/36324957/answer/139408269 机器学习应该准备哪些数学预备知识&#xff1f; 数据分析师&#xff0c;工作中经常使用机器学习模型&#xff0c;但是以调库为主。 自己一直也在研究算法&#xff0c;也…

react usecontext_Vue3原理实战运用,我用40行代码把他装进了React做状态管理

前言vue-next是Vue3的源码仓库&#xff0c;Vue3采用lerna做package的划分&#xff0c;而响应式能力vue/reactivity被划分到了单独的一个package中。如果我们想把它集成到React中&#xff0c;可行吗&#xff1f;来试一试吧。使用示例话不多说&#xff0c;先看看怎么用的解解馋吧…

css的三个特性 背景透明设置

关于行内元素&#xff08;补充一点&#xff09; 行内元素只能容纳文本或其他行内元素。&#xff08;a特殊a里面可以放块级元素&#xff09; 例子&#xff1a; 关于行高tip: 选择器的嵌套层级不应大于3级&#xff0c;位置靠后的限定条件应尽可能的精确。 属性定义必须另起一行…

ccs安装多版本编译器离线_大数据分析:学习工具JDK,在线安装指南

hadoop是使用Java语言开发的并且Hadoop运行需要有Java环境的支持&#xff0c;因此在安装hadoop之前需要安装Java开发环境即JDK(Java Development Kit)。安装前首先向大家介绍以一下本文会用到的几个词&#xff1a;JAVA_HOME:一是为了方便引用&#xff0c;比如&#xff0c;JDK安…

asp.net尚未在web服务器上注册_最新版Web服务器项目详解 00 项目概述

点 击 关 注 上 方&#xff02;两猿社&#xff02;设 为&#xff02;置 顶 或 星 标&#xff02;&#xff0c;干 货 第 一 时 间 送 达。互 联 网 猿 | 两 猿 社TineyWebServerLinux下C轻量级Web服务器&#xff0c;助力初学者快速实践网络编程&#xff0c;搭建属于自己的服务器…

DBMS-基本概念

文件处理系统&#xff08;file-processing system&#xff09;的主要弊端&#xff1a; 数据冗余和不一致&#xff08;data redundancy and inconsistency&#xff09;、数据访问困难&#xff08;difficulty in accessing data&#xff09;、数据孤立&#xff08;data isolation…

python多大孩子可以学_孩子学编程最佳年龄是多大

儿童编程教育已经悄悄地掀起了编程低龄化的热浪。但是很多人会疑惑&#xff0c;到底孩子学编程最佳年龄是多少呢&#xff1f;下面小编就为大家解答一下。孩子学编程最佳年龄 首先&#xff0c;孩子的学习黄金时期是非常重要的。从6岁开始&#xff0c;大多数孩子都可以掌握对基本…

上传文件到华为云云服务器,上传文件到云服务器

上传文件到云服务器 内容精选换一换登录Windows操作系统的弹性云服务器时&#xff0c;需使用密码方式登录。因此&#xff0c;用户需先根据创建弹性云服务器时使用的密钥文件&#xff0c;获取该弹性云服务器初始安装时系统生成的管理员密码(Administrator帐户或Cloudbase-init设…

关于图片预加载的思考

引子&#xff1a; 很多时候&#xff0c;我们在写html页面的时候&#xff0c;当需要在页面中加入图片时&#xff0c;我们很自然地把图片直接用<img>标签放在了<body>里面&#xff0c;这本来是没有多大问题的。 但是当图片数量很多的时候&#xff0c;问题就来了。H…