作者

彭東林

pengdonglin137@163.com

平臺

tiny4412 ADK

Linux-4.4.4

u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uImage做了稍許改動

簡介

前面我們實現了一種設備樹下中斷的使用方法,下面介紹第二種,這種方式本質上跟前者是一樣的,使用的是platform_bus的接口。

爲了便於比較,還是以底板上面上的四個按鍵爲例分析,其中前兩個按鍵使用第二種方式,後兩個按鍵使用第一種方式。

正文

原理圖可以參考博文:基於tiny4412的Linux內核移植--- 中斷和GPIO學習(1)

下面是設備樹的改動:

 diff --git a/arch/arm/boot/dts/exynos4412-tiny4412.dts b/arch/arm/boot/dts/exynos4412-tiny4412.dts
index 610202a..2e69c91
--- a/arch/arm/boot/dts/exynos4412-tiny4412.dts
+++ b/arch/arm/boot/dts/exynos4412-tiny4412.dts
@@ -, +, @@
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/usb4640/usb4640.h>
#include <dt-bindings/pwm/pwm.h>
+#include <dt-bindings/interrupt-controller/irq.h>
#include <autoconf.h> / {
@@ -, +, @@
};
};
#endif
+
+interrupt_another: interrupt_another {
+ compatible = "tiny4412,interrupt_another";
+ interrupt-parent = <&gpx3>;
+ interrupts = < IRQ_TYPE_EDGE_FALLING IRQ_TYPE_EDGE_FALLING>;
+ tiny4412,int_gpio0 = <&gpx3 GPIO_ACTIVE_HIGH>;
+ tiny4412,int_gpio1 = <&gpx3 GPIO_ACTIVE_HIGH>;
+ };
}; &rtc {

其中,interrupts屬性值的解析需要看中斷控制器gpx3在創建irq_domain時設置的回調函數exynos_eint_irqd_ops的xlate成員。以後我們再分析。而gpio屬性的值的含義則需要看gpio控制器gpx3在創建時設置的of_xlate回調函數of_gpio_simple_xlate,這個以後分析。

下面看驅動:

 #include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/gpio.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/interrupt.h> typedef struct
{
int gpio;
int irq;
char name[];
}int_demo_data_t; static irqreturn_t int_demo_isr_pdev(int irq, void *dev_id)
{
int_demo_data_t *data = dev_id; printk("%s enter, %s irq: %d\n", __func__, data->name, irq); return IRQ_HANDLED;
} static irqreturn_t int_demo_isr_gpio(int irq, void *dev_id)
{
int_demo_data_t *data = dev_id; printk("%s enter, %s irq: %d\n", __func__, data->name, irq);
return IRQ_HANDLED;
} static int int_demo_probe(struct platform_device *pdev) {
struct device *dev = &pdev->dev;
int irq_gpio = -;
int irq = -;
int ret = ;
int i = ;
int_demo_data_t *data = NULL; printk("%s enter.\n", __func__); if (!dev->of_node) {
dev_err(dev, "no platform data.\n");
goto err0;
} data = devm_kmalloc(dev, sizeof(*data)*, GFP_KERNEL);
if (!data) {
dev_err(dev, "no memory.\n");
goto err0;
} for (i = ; i < ; i++) {
irq = platform_get_irq(pdev, i);
sprintf(data[i].name, "tiny4412,pdev_irq_%d", i);
ret = devm_request_any_context_irq(dev, irq,
int_demo_isr_pdev, IRQF_TRIGGER_FALLING, data[i].name, data+i);
if (ret < ) {
dev_err(dev, "Unable to claim irq %d; error %d\n",
irq, ret);
goto err0;
}
printk("request irq: %d\n", irq);
} for (i = ; i < ; i++) {
sprintf(data[i+].name, "tiny4412,int_gpio%d", i);
irq_gpio = of_get_named_gpio(dev->of_node,
data[i+].name, );
if (irq_gpio < ) {
dev_err(dev, "Looking up %s property in node %s failed %d\n",
data[i].name, dev->of_node->full_name, irq_gpio);
goto err0;
} data[i+].gpio = irq_gpio; irq = gpio_to_irq(irq_gpio);
if (irq < ) {
dev_err(dev,
"Unable to get irq number for GPIO %d, error %d\n",
irq_gpio, irq);
goto err0;
} data[i+].irq = irq; printk("%s: gpio: %d ---> irq (%d)\n", __func__, irq_gpio, irq); ret = devm_request_any_context_irq(dev, irq,
int_demo_isr_gpio, IRQF_TRIGGER_FALLING, data[i+].name, data+i+);
if (ret < ) {
dev_err(dev, "Unable to claim irq %d; error %d\n",
irq, ret);
goto err0;
}
} return ; err0:
return -EINVAL;
} static int int_demo_remove(struct platform_device *pdev) { printk("%s enter.\n", __func__);
return ;
} static const struct of_device_id int_demo_dt_ids[] = {
{ .compatible = "tiny4412,interrupt_another", },
{},
}; MODULE_DEVICE_TABLE(of, int_demo_dt_ids); static struct platform_driver int_demo_driver = {
.driver = {
.name = "interrupt_another",
.of_match_table = of_match_ptr(int_demo_dt_ids),
},
.probe = int_demo_probe,
.remove = int_demo_remove,
}; static int __init int_demo_init(void)
{
int ret; ret = platform_driver_register(&int_demo_driver);
if (ret)
printk(KERN_ERR "int demo: probe failed: %d\n", ret); return ret;
}
module_init(int_demo_init); static void __exit int_demo_exit(void)
{
platform_driver_unregister(&int_demo_driver);
}
module_exit(int_demo_exit); MODULE_LICENSE("GPL");

在platform_device進行populate的時候,已經對其irq資源進行了映射,這個以後分析。

驗證

加載驅動:

[root@tiny4412 mnt]# insmod interrupt_another.ko
[ 33.330879] int_demo_probe enter.
[ 33.331896] request irq:
[ 33.332778] request irq:
[ 33.333412] int_demo_probe: gpio: ---> irq ()
[ 33.334535] int_demo_probe: gpio: ---> irq ()

依次按鍵,由於沒有加消抖處理,所以依次按鍵可能會觸發多次中斷

[root@tiny4412 mnt]# [ 1244.082303] int_demo_isr_pdev enter, tiny4412,pdev_irq_0 irq:
[ 1244.229761] int_demo_isr_pdev enter, tiny4412,pdev_irq_0 irq:
[ 1245.129735] int_demo_isr_pdev enter, tiny4412,pdev_irq_1 irq:
[ 1245.283928] int_demo_isr_pdev enter, tiny4412,pdev_irq_1 irq:
[ 1246.269231] int_demo_isr_gpio enter, tiny4412,int_gpio0 irq:
[ 1246.476101] int_demo_isr_gpio enter, tiny4412,int_gpio0 irq:
[ 1247.769903] int_demo_isr_gpio enter, tiny4412,int_gpio1 irq:
[ 1248.034338] int_demo_isr_gpio enter, tiny4412,int_gpio1 irq:
[ 1248.035396] int_demo_isr_gpio enter, tiny4412,int_gpio1 irq:
[ 1248.035858] int_demo_isr_gpio enter, tiny4412,int_gpio1 irq:
[ 1248.036218] int_demo_isr_gpio enter, tiny4412,int_gpio1 irq:

我們再看看系統中斷資源註冊情況

[root@tiny4412 mnt]# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
: GIC Edge mct_comp_irq
: GIC Edge MCT
: PMU Edge s3c2410-rtc alarm
: PMU Edge s3c2410-rtc tick
: GIC Edge mmc0
: GIC Edge .hsotg, .hsotg, dwc2_hsotg:usb1
: GIC Edge ehci_hcd:usb2, ohci_hcd:usb3
: GIC Edge .serial
: GIC Edge .i2c
: GIC Edge .pdma
: GIC Edge .pdma
: GIC Edge .mdma
: GIC Edge .pinctrl
: GIC Edge .pinctrl
: COMBINER Edge .pinctrl
: GIC Edge 106e0000.pinctrl
: GIC Edge dw-mci
103: 8 0 0 0 exynos4210_wkup_irq_chip 2 Edge tiny4412,pdev_irq_0
104: 4 0 0 0 exynos4210_wkup_irq_chip 3 Edge tiny4412,pdev_irq_1
: exynos4210_wkup_irq_chip Edge mma7660
: exynos_gpio_irq_chip Edge .sdhci cd
107: 6 0 0 0 exynos4210_wkup_irq_chip 4 Edge tiny4412,int_gpio0
108: 9 0 0 0 exynos4210_wkup_irq_chip 5
Edge tiny4412,int_gpio1
IPI0: CPU wakeup interrupts
IPI1: Timer broadcast interrupts
IPI2: Rescheduling interrupts
IPI3: Function call interrupts
IPI4: Single function call interrupts
IPI5: CPU stop interrupts
IPI6: IRQ work interrupts
IPI7: completion interrupts

未完待續...

基於tiny4412的Linux內核移植--- 中斷和GPIO學習(3)的更多相关文章

  1. 基於tiny4412的Linux內核移植--- 中斷和GPIO學習(2)

    作者 彭東林 pengdonglin137@163.com 平臺 tiny4412 ADK Linux-4.4.4 u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uIma ...

  2. 基於tiny4412的Linux內核移植--- 中斷和GPIO學習(1)

    作者 彭東林 pengdonglin137@163.com 平臺 tiny4412 ADK Linux-4.4.4 u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uIma ...

  3. 基於tiny4412的Linux內核移植 --- 实例学习中断背后的知识(2)

    作者:彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台 tiny4412 ADK Linux-4.9 概述 前面一篇博文基於tiny4412的Linux內核移 ...

  4. 基於tiny4412的Linux內核移植 --- 实例学习中断背后的知识(1)

    作者:彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台 tiny4412 ADK Linux-4.9 概述 前面几篇博文列举了在有设备树的时候,gpio中断的 ...

  5. Linux內核中常用的一些延時方法

    Linux內核中常用的一些延時方法 這些方法在以下路徑下定義:kernel/include/linux/delay.h #ifndef _LINUX_DELAY_H #define _LINUX_DE ...

  6. 【转】Linux內核驅動之GPIO子系統(一)GPIO的使用 _蝸牛

    原文网址:http://tc.chinawin.net/it/os/article-2512b.html 一 概述 Linux內核中gpio是最簡單,最常用的資源(和interrupt ,dma,ti ...

  7. 無心插柳的Linux學習者代言人——蔡德明

    誰是「蔡德明」恐怕沒有多少人知道,不過提到「鳥哥」這個稱號,在臺灣的Linux社群幾乎是無人不知無人不曉,蔡德明正是鳥哥的本名.鳥哥究竟多有名? 如果你是有意學習Linux的初學者,卻不知如何下手,1 ...

  8. 第一章 Linux內核簡介

    1. Linux是類Unix系統,但他不是Unix. 儘管Linux借鑑了Unix的許多設計並且實現了Unix的API(由Posix標準和其他Single Unix Specification定義的) ...

  9. 基于tiny4412的Linux内核移植 ---- 調試方法

    作者信息 彭東林 郵箱: pengdonglin137@163.com 平臺 Linux-4.4.4 uboot使用的是友善自帶的(爲了支持uImage和設備樹做了稍許修改) 概述 這篇博客主要用於匯 ...

随机推荐

  1. Fis3前端工程化之项目实战

    Fis3项目 项目目录结构: E:. │ .gitignore │ fis-conf.js │ index.html │ package.json │ README.md │ ├─material │ ...

  2. 【.net 深呼吸】序列化中的“引用保留”

    假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...

  3. .NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布

    众所周知,Red Hat和微软正在努力使.NET Core成为Red Hat企业版Linux (RHEL)系统上的一流开发平台选项.这个团队已经一起工作好几个月了,RHEL对.NET有许多需求.今天在 ...

  4. HTML5 sessionStorage会话存储

    sessionStorage 是HTML5新增的一个会话存储对象,用于临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后将会删除这些数据.本篇主要介绍 sessionStorage(会话存储) ...

  5. 使用Oracle官方巡检工具ORAchk巡检数据库

    ORAchk概述 ORAchk是Oracle官方出品的Oracle产品健康检查工具,可以从MOS(My Oracle Support)网站上下载,免费使用.这个工具可以检查Oracle数据库,Gold ...

  6. ASP.NET MVC5+EF6+EasyUI 后台管理系统(81)-数据筛选(万能查询)

    系列目录 前言 听标题的名字似乎是一个非常牛X复杂的功能,但是实际上它确实是非常复杂的,我们本节将演示如何实现对数据,进行组合查询(数据筛选) 我们都知道Excel中是如何筛选数据的.就像下面一样 他 ...

  7. 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...

  8. 玩转Vim 编辑器

    一:VIM快速入门 1.vim模式介绍 以下介绍内容来自维基百科Vim 从vi演生出来的Vim具有多种模式,这种独特的设计容易使初学者产生混淆.几乎所有的编辑器都会有插入和执行命令两种模式,并且大多数 ...

  9. iOS有关横向TableView的东西

    之前看到Apple store里面有横向的tableview,当然也有可能是collectionview啦. 尤其是项目中只有一条那么需要横向滑动的东西,就没有必要使用庞大的collectionvie ...

  10. web服务器集群

    概述 集群和分布式都是从集中式进化而来的.分布式和集群会相互合作的,同时的集群和分布式.在这里重点说说集群 集群是什么? 集群能提高单位时间内处理的任务数量,提升服务器性能 有多台服务器去处理任务,但 ...