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

设备树:

    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)

完。

基于设备树的TQ2440的中断(2)相关推荐

  1. 基于设备树的TQ2440 DMA学习(3)—— DMA控制器驱动

    作者 彭东林 pengdonglin137@163.com 平台 TQ2440 Linux-4.9 概述 上一篇直接操作DMA控制器实现了一个mem2mem的DMA传输,但是这样不符合linux dr ...

  2. 基于设备树的TQ2440 DMA学习(2)—— 简单的DMA传输

    作者 彭东林 pengdonglin137@163.com 平台 TQ2440 Linux-4.9 概述 上一篇博客分析了DMA控制器的寄存器,循序渐进,下面我们直接操作DMA控制器的寄存器实现一个m ...

  3. 基于设备树的中断实现 (24x0平台)

    文章目录 一.平台信息 1. 平台信息 二.中断的驱动实现方式 2. 不使用设备树的中断实现 2.1 mach-mini2440.c文件中注册中断 2.2 注册中断 3. 使用设备树的中断实现 设备树 ...

  4. 设备树之GPIO和中断实例

    概述 设备树不仅仅描述常规硬件信息,还可以描述中断,GPIO,DMA,PINCTRL,时钟,电源管理等内核基础设施信息及其使用情况,下面重点介绍中断,GPIO等结点属性 中断控制器 对于中断控制器结点 ...

  5. Linux 设备树下的 platform 驱动实验基于正点原子IMX6ULL开发板

    1 设备树下的 platform 驱动简介 platform 驱动框架分为总线.设备和驱动,其中总线不需要我们这些驱动程序员去管理,这个是 Linux 内核提供的,我们在编写驱动的时候只要关注于设备和 ...

  6. 【基于Linux系统设备树的SPI驱动编写方法】

    文章目录 前言 一.SPI驱动编写 1.修改设备树  a.设备树文件是什么?  b.设备树怎么改? 2.编写驱动 二.完善和测试 1.编译和应用程序  a.编译 && 拷贝到开发板命令 ...

  7. 【正点原子MP157连载】第二十三章 Linux设备树-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  8. 韦东山 IMX6ULL和正点原子_「正点原子Linux连载」第四十三章Linux设备树(一)

    1)实验平台:正点原子Linux开发板 2)摘自<正点原子I.MX6U嵌入式Linux驱动开发指南> 关注官方微信号公众号,获取更多资料:正点原子 前面章节中我们多次提到"设备树 ...

  9. Linux下按键设备驱动开发以及对中断的上半部分和下半部分详细介绍

    文章目录 一.编写并且加载设备树插件 (1)检测管脚是否占用 (2)添加设备树插件 (3)加载设备树插件 二.中断相关函数 (1)request_irq中断注册函数 (2)free_irq中断注销函数 ...

最新文章

  1. SQL*PLUS常用命令
  2. mysql 数据索引使用_mysql数据库正确建立索引及使用
  3. 定义系统消息 Specify system messages
  4. 一道关于信号量的问题
  5. Asterisk权威指南/第三章 安装Asterisk
  6. bootstraptable导出excel独立使用_JavaWeb系列之-一小时搞定POI导出Excel
  7. java hmget 最大值,【Redis】基本数据类型及命令操作(超详细)
  8. 1022 D进制的A+B (20 分)—PAT (Basic Level) Practice (中文)
  9. java后端简历项目经历_java后台开发个人简历怎么写
  10. 【CNN回归预测】基于matlab鲸鱼算法优化CNN回归预测【含Matlab源码 1453期】
  11. 网络性能指标及测试方法
  12. ACM在线模版-f-zyj
  13. 江民科技董事长王江民因病在北京逝世 享年59岁
  14. Espresso环境搭建及其基本使用
  15. Docker-compose编排MySQL+Nacos+Seata
  16. 键盘按键错乱,鼠标也失灵怎么办。。。。。
  17. DBeaver 给id设置为键 以及执行sql查询语句
  18. iOS 编译器__Attribute__的入门指南
  19. mfc 多边形裁剪算法
  20. Java编程基础小总结

热门文章

  1. tcp丢包率_网络编程 | TCP/IP基础知识
  2. java native 开发环境搭建_Java3D 集成开发环境部署与配置(含实例)
  3. 计算机理论python字符串作业_[Python基础 ] Day_07_作业参考答案
  4. 基于vue axios element-ui 的 demo
  5. pat上写java程序_如何运行Java程序和设置CLASSPAT
  6. mysql5.7.6允许远程_mysql5.7 设置远程访问
  7. linux6.3 插u盘,U盘安装centos 6.3教程(超级详细教程)
  8. php sql 字段不能为空值,关于php:Sudden SQL问题-一般错误:1364字段没有默认值
  9. Android Studio出现R.raw文件标红找不到错误(有多个模块的Project)
  10. Eclipse自动换行