基于設備樹的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.pswp.cn/news/370711.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370711.shtml
英文地址,請注明出處:http://en.pswp.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;還不知道小程序的…

實現字符串的編碼轉換,用以解決字符串亂碼問題

引起亂碼的情況很多~實質上 主要是字符串本身的編碼格式 與程序所需要的編碼格式不一致導致的。要解決亂碼其實很簡單&#xff0c; 分2步 &#xff1a; 1&#xff1a;獲取到字符串 本身的編碼 2&#xff1a;改變字符串編碼 &#xff08;本身編碼 -> 新編碼&#xff09; 話不…

python運行原理_Python線程池及其原理和使用(超級詳細)

系統啟動一個新線程的成本是比較高的&#xff0c;因為它涉及與操作系統的交互。在這種情形下&#xff0c;使用線程池可以很好地提升性能&#xff0c;尤其是當程序中需要創建大量生存期很短暫的線程時&#xff0c;更應該考慮使用線程池。 線程池在系統啟動時即創建大量空閑的線程…

Google Guava緩存

這篇文章是我在Google Guava上系列文章的續篇&#xff0c;這次涵蓋了Guava Cache。 與HashMap或ConcurrentHashMap相比&#xff0c;Guava Cache提供了更大的靈活性和功能&#xff0c;但不像使用EHCache或Memcached那樣繁重&#xff08;就此而言&#xff0c;它很健壯&#xff0c…

html 三列布局(兩列自適應,一列固定寬度)

不做過多解釋&#xff1a;主要是記錄一個完整的布局樣式&#xff0c;實現頁面大致三列其中左右兩列是自適應寬度&#xff0c;中間固定寬度效果。 不多少代碼奉上&#xff1a; CSS樣式代碼&#xff1a; /*********************公共標簽樣式********************//************…

jsp常用動作

jsp:include 動態包含&#xff1b; jsp:forward 轉發&#xff1b; jsp:useBean 實例化bean對象&#xff1b; jsp:setProperty 設置一個屬性值 jsp:getProperty 獲取一個屬性值 jsp:param 動態傳參數&#xff1b; jsp:plugin 生成一個插件 jsp:useBean 實例化一個對象…

單曲循環 翻譯_歌單 | 單曲循環amp;熱評

December2020/12/ 寫在前面的話 /本來打算在跨年的時候才更文&#xff0c;但是吧又覺得空出這最后一個月有點蒼白&#xff0c;然后最近一直夜半網抑云(敏感ing)就想到可以做一期分享歌單的推文&#xff0c;分享一些最近聽得頻繁的歌曲(還不是刷抖音刷出來的)。《曖昧》// 王菲徘…

python的字符串內建函數

python的字符串內建函數 字符串方法是從python1.6到2.0慢慢加進來的——它們也被加到了Jython中。 這些方法實現了string模塊的大部分方法&#xff0c;如下表所示列出了目前字符串內建支持的方法&#xff0c;所有的方法都包含了對Unicode的支持&#xff0c;有一些甚至是專門用…

休息使用Jersey –包含JAXB,異常處理和客戶端程序的完整教程

最近&#xff0c;我開始使用Jersey API開發一個Restful Web服務項目。 在線提供了一些教程&#xff0c;但是我遇到了異常處理方面的一些問題&#xff0c;而且在使用JaxB和提供異常處理方法的完整項目中找不到任何地方。 因此&#xff0c;一旦我能夠使用帶有異常處理和客戶端程序…

python基于web可視化_獨家 | 基于Python實現交互式數據可視化的工具(用于Web)

轉自&#xff1a;數據派ID&#xff1a;datapi 作者&#xff1a;Alark Joshi 翻譯&#xff1a;陳雨琳 校對&#xff1a;吳金笛 本文2200字&#xff0c;建議閱讀8分鐘。 本文將介紹實現數據可視化的軟件包。 這學期&#xff08;2018學年春季學期&#xff09;我教授了一門關于數據…

SASS簡介及使用方法

一、什么是Sass Sass (Syntactically Awesome StyleSheets)是css的一個擴展開發工具&#xff0c;它允許你使用變量、條件語句等&#xff0c;使開發更簡單可維護。這里是官方文檔。 二、基本語法 1&#xff09;變量 sass的變量名必須是一個$符號開頭&#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;先看看怎么用的解解饞吧…