[arm驅動]linux內核中斷編程

第一部分獲取中斷(開啟硬件中斷)
一、中斷的申請注銷:
1)中斷的申請

1
2
int?request_irq(unsigned?int?irq, irq_handler_t handler,
?????????????????????????unsigned?long?irqflags,?const?char?*devname,?void?*dev_id)

2)中斷的注銷

1
void?free_irq(unsigned?int?irq,?void?*dev_id)

3)中斷處理函數

1
static?irqreturn_t irq_handle(int?irq,?void?*dev__id);

? ?參數:irq:表示中斷號,這個參數還保留由于歷史遺留問題,往后可能越來越沒用了。由于第二個參數信息更強大
dev__id:就是request_irq()中void *dev_id參數
二、中斷申請函數參數

1
2
int?request_irq(unsigned?int?irq, irq_handler_t handler,
?????????????????????????unsigned?long?irqflags,?const?char?*devname,?void?*dev_id)

? ?1)參數:
? ?irq:是要申請的硬件中斷號。
handler:是向系統注冊的中斷處理函數,是一個回調函數,中斷發生時,系統調用這個函數,dev_id參數將被傳遞給它
? ? irqflags:是中斷處理的屬性,
? ? ? ?a)若設置了IRQF_DISABLED,則表示中斷處理程序是快速處理程序,快速處理程序被調用時屏蔽所有中斷,慢速處理程序不屏蔽;
? ? ? ?b)若設置了 ? ?IRQF_SHARED,則表示多個設備共享中斷;//在另一篇文章會提到
? ? ? ?c)若設置了IRQF_SAMPLE_RANDOM,表示對系統熵有貢獻,對系統獲取隨機數有好處。
? ? ? ? ? ?Tip:(flag是可以通過或的方式同時使用的
? ?devname:設置中斷名稱,通常是設備驅動程序的名稱 ?在cat /proc/interrupts中可以看到此名稱。
? ?dev_id:在中斷共享時會用到,一般設置為這個設備的設備結構體或者不使用時為NULL。因為在共享中斷中同一個中斷線(或可以說同一個中斷號)可能掛載好幾個設備,當使用void free_irq(unsigned int irq, void *dev_id)時,根據irq和dev_id可以找到中斷線為irq上的標識為dev_id的某個具體設備。dev_id也經常在不是共享中斷中的驅動傳遞數據

? ?2)返回值:
? ?a)request_irq()返回0表示成功;
? ?b)返回-EINVAL表示無效的參數,如果返回這個值,應該看看傳遞給request_irq()的參數是否正確;
? ?c)返回-EBUSY表示中斷已經被占用且不能共享;
? ?d)返回ENOMEM表示內存不足。嵌入式系統由于內存資源有限,經常會發生這樣的錯誤。

? ?3)擴展---unsigned long irqflags值
? ?在include\linux\interrupt.h中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*
?* These correspond to the IORESOURCE_IRQ_* defines in
?* linux/ioport.h to select the interrupt line behaviour.? When
?* requesting an interrupt without specifying a IRQF_TRIGGER, the
?* setting should be assumed to be "as already configured", which
?* may be as per machine or firmware initialisation.
?*/
#define IRQF_TRIGGER_NONE??? 0x00000000
#define IRQF_TRIGGER_RISING??? 0x00000001
#define IRQF_TRIGGER_FALLING??? 0x00000002
#define IRQF_TRIGGER_HIGH??? 0x00000004
#define IRQF_TRIGGER_LOW??? 0x00000008
#define IRQF_TRIGGER_MASK??? (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \
?????????????????IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)
#define IRQF_TRIGGER_PROBE??? 0x00000010
/*
?* These flags used only by the kernel as part of the
?* irq handling routines.
?*
?* IRQF_DISABLED - keep irqs disabled when calling the action handler
?* IRQF_SAMPLE_RANDOM - irq is used to feed the random generator
?* IRQF_SHARED - allow sharing the irq among several devices
?* IRQF_PROBE_SHARED - set by callers when they expect sharing mismatches to occur
?* IRQF_TIMER - Flag to mark this interrupt as timer interrupt
?* IRQF_PERCPU - Interrupt is per cpu
?* IRQF_NOBALANCING - Flag to exclude this interrupt from irq balancing
?* IRQF_IRQPOLL - Interrupt is used for polling (only the interrupt that is
?*??????????????? registered first in an shared interrupt is considered for
?*??????????????? performance reasons)
?*/
#define IRQF_DISABLED??????? 0x00000020
#define IRQF_SAMPLE_RANDOM??? 0x00000040
#define IRQF_SHARED??????? 0x00000080
#define IRQF_PROBE_SHARED??? 0x00000100
#define IRQF_TIMER??????? 0x00000200
#define IRQF_PERCPU??????? 0x00000400
#define IRQF_NOBALANCING??? 0x00000800
#define IRQF_IRQPOLL??????? 0x00001000


? ?Tip:下面是老版本(2.4內核irqflags的值),不要在新版本使用。(2.6 內核及2.6以上內核都為新內核)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
?* Migration helpers. Scheduled for removal in 9/2007
?* Do not use for new code !//不要的新版本使用,2.6 內核及2.6以上內核都為新內核
?*/
static?inline
unsigned?long?__deprecated deprecated_irq_flag(unsigned?long?flag)
{
????return?flag;
}
#define SA_INTERRUPT??????? deprecated_irq_flag(IRQF_DISABLED)
#define SA_SAMPLE_RANDOM??? deprecated_irq_flag(IRQF_SAMPLE_RANDOM)
#define SA_SHIRQ??????? deprecated_irq_flag(IRQF_SHARED)
#define SA_PROBEIRQ??????? deprecated_irq_flag(IRQF_PROBE_SHARED)
#define SA_PERCPU??????? deprecated_irq_flag(IRQF_PERCPU)
#define SA_TRIGGER_LOW??????? deprecated_irq_flag(IRQF_TRIGGER_LOW)
#define SA_TRIGGER_HIGH??????? deprecated_irq_flag(IRQF_TRIGGER_HIGH)
#define SA_TRIGGER_FALLING??? deprecated_irq_flag(IRQF_TRIGGER_FALLING)
#define SA_TRIGGER_RISING??? deprecated_irq_flag(IRQF_TRIGGER_RISING)
#define SA_TRIGGER_MASK??????? deprecated_irq_flag(IRQF_TRIGGER_MASK)

三、使用模板
? ?使用步驟:以外部中斷為例
a)定義結構體,相當于定義(void *dev_id)中的(void *)

1
2
3
4
5
struct pin_desc{//聲明一個引腳描述的結構體pin_desc
???????unsigned?int?pin;//引腳值,參考數據手冊及板子電路原理圖
???????unsigned?int?key_val;//值自已隨便定義;看自己的項目需要
???????//...................
???};

b)實例化結構體,相當于(void *dev_id)中的 dev_id

1
2
3
4
5
struct?pin_desc pins_desc[3] = {//實例化結構體,以jz2440按鍵為列
???????{S3C2410_GPF0, 0x01},//S3C2410_GPFn在內核中定義好了
???????{S3C2410_GPF2, 0x02},
???????{S3C2410_GPG3, 0x03},
???};

c)定義中斷處理函數

1
2
3
4
5
static?irqreturn_t irq_handle(int?irq,?void?*dev__id){
????struct pin_desc *pindesc = (struct pin_desc *)dev__id;
????//................
????return?IRQ_RETVAL(IRQ_HANDLED);//返回IRQ_HANDLED表示中斷已經處理
????}

d)申請中斷

1
2
3
request_irq(IRQ_EINT0, irq_handle, IRQ_TYPE_EDGE_BOTH,?"s2", &pins_desc[0]);//IRQ_EINTn在內核中定義好了
???request_irq(IRQ_EINT2, irq_handle, IRQ_TYPE_EDGE_BOTH,?"s3", &pins_desc[1]);
???request_irq(IRQ_EINT11, irq_handle, IRQ_TYPE_EDGE_BOTH,?"s4", &pins_desc[2]);

e)釋放內存

1
2
3
free_irq(IRQ_EINT0, &pins_desc[0]);
????free_irq(IRQ_EINT2, &pins_desc[1]);
????free_irq(IRQ_EINT11, &pins_desc[2]);


Tip:可以直接將IRQ_EINTn也在pins_desc定義,然后

1
2
3
4
int?i =?0;
???for(i =?0; i <?3; i++){
???free_irq(pins_desc[i].irqnum, &pins_desc[i]);
???}

? ?實例見[arm驅動]Linux內核開發之阻塞非阻塞IO----輪詢操作?中的實例(按鍵中斷雙邊沿觸發)



本文轉自lilin9105 51CTO博客,原文鏈接:http://blog.51cto.com/7071976/1392439,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392922.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392922.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392922.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于VCP(Virtual Com Port)拓展的調試經歷(一)

* The Overview 前日&#xff0c;接到老板部署的任務&#xff0c;將現有的基于STM32L151與L432的LoRaWAN程序中添加USB CDC(Communication Device Class)功能&#xff0c;并枚舉為VCP(Virtual Com Port)用以替代以往的串口打印。很疑惑為什么以前架構代碼的時候沒有添加進去。。…

leetcode701. 二叉搜索樹中的插入操作(dfs)

給定二叉搜索樹&#xff08;BST&#xff09;的根節點和要插入樹中的值&#xff0c;將值插入二叉搜索樹。 返回插入后二叉搜索樹的根節點。 輸入數據保證&#xff0c;新值和原始二叉搜索樹中的任意節點值都不同。注意&#xff0c;可能存在多種有效的插入方式&#xff0c;只要樹在…

三星s6 android 8.0,再見Android 8.0,三星s6全系列系統都停止了,第一代國王已經倒下了嗎?...

對于Android用戶而言&#xff0c;最令人興奮的事情是系統更新&#xff0c;因為該更新意味著更流暢的體驗和更加用戶友好的功能. 但是&#xff0c;舊的三星S6并不是那么幸運&#xff0c;并且不再錯過Android 8.0.三星s6的全系列指的是三星s6&#xff0c;三星s6 edge&#xff0c;…

devise tree_Devise如何確保您的Rails應用密碼安全

devise treeby Tiago Alves由蒂亞戈阿爾維斯(Tiago Alves) Devise如何確保您的Rails應用密碼安全 (How Devise keeps your Rails app passwords safe) Devise is an incredible authentication solution for Rails with more than 40 million downloads. However, since it ab…

Exchange 2010無法安裝問題解決方法

當你在活動目錄(AD)森林中安裝多臺全局編錄服務器(GC)之后,默認情況下你會發現在AD站點里面自動生成二條站點連接,從上面的截圖可以看到目前在AD森林的Default-First-Site-Name(默認站點)里面有6臺GC。 從上面的截圖可以看到目前只有一臺叫做Sh-Site1GC(全局編錄服務器)是處于運…

android edittext 不滾動,EditText 設置可以垂直滑動但是不可輸入

一、前言&#xff1a;android:id"id/edtInput"android:layout_width"match_parent"android:layout_height"60dp"android:background"drawable/round_theme_3_gray"android:gravity"top"android:hint"string/please_inp…

snmpd修改端口

http://blog.csdn.net/cau99/article/details/5077239 http://blog.csdn.net/gua___gua/article/details/48547701轉載于:https://www.cnblogs.com/diyunpeng/p/6829592.html

leetcode LCP 19. 秋葉收藏集(dp)

小扣出去秋游&#xff0c;途中收集了一些紅葉和黃葉&#xff0c;他利用這些葉子初步整理了一份秋葉收藏集 leaves&#xff0c; 字符串 leaves 僅包含小寫字符 r 和 y&#xff0c; 其中字符 r 表示一片紅葉&#xff0c;字符 y 表示一片黃葉。 出于美觀整齊的考慮&#xff0c;小扣…

步進電機 步距角 編碼器_我如何邁出了學習編碼的第一步

步進電機 步距角 編碼器A couple of months ago, I was chatting to a developer at work about how I’ve always wanted to learn to code but never tried.幾個月前&#xff0c;我正在與一個開發人員聊天&#xff0c;討論我一直想學習編碼但從未嘗試過的方法。 Coding alwa…

第五章:配置使用FastJson返回Json視圖

fastJson是阿里巴巴旗下的一個開源項目之一&#xff0c;顧名思義它專門用來做快速操作Json的序列化與反序列化的組件。它是目前json解析最快的開源組件沒有之一&#xff01;在這之前jaskJson是命名為快速操作json的工具&#xff0c;而當阿里巴巴的fastJson誕生后jaskjson就消聲…

一加6android9玩飛車掉,解鎖新速度:一加6T深度評測

解鎖新速度&#xff1a;一加6T深度評測2019-11-02 14:28:595點贊2收藏4評論創作立場聲明&#xff1a;我們只談智能硬件&#xff0c;向改變生活的智能硬件Say“嗨”&#xff01;作為安卓旗艦機成員&#xff0c;一加這個品牌在玩機一類的同學手里可是大放光彩&#xff0c;各種刷機…

設計模式(第十七式:迭代器模式)

概念&#xff1a;  迭代器模式&#xff1a;Provide a way to access the elements of an aggregarte object sequentiaally with exposing its underlying representation. 提供一種訪問容器對象內每個元素的一種方式&#xff0c;并且不暴露對象的一些內部細節。實現&#xf…

探討跨域請求資源的幾種方式

[轉自&#xff1a;http://www.cnblogs.com/dojo-lzz/p/4265637.html] 什么是跨域JSONPproxy代理corsxdr由于瀏覽器同源策略&#xff0c;凡是發送請求url的協議、域名、端口三者之間任意一與當前頁面地址不同即為跨域。具體可以查看下表&#xff08;來源&#xff09; JSONP 這種…

算法訓練營 重編碼_編碼訓練營適合您嗎?

算法訓練營 重編碼by Joanna Gaudyn喬安娜高登(Joanna Gaudyn) 編碼訓練營適合您嗎&#xff1f; (Is a Coding Bootcamp something for you?) Coding bootcamps’ popularity is growing. It sounds like a perfect idea to fast-forward your career. But is it really some…

leetcode 771. 寶石與石頭(set)

給定字符串J 代表石頭中寶石的類型&#xff0c;和字符串 S代表你擁有的石頭。 S 中每個字符代表了一種你擁有的石頭的類型&#xff0c;你想知道你擁有的石頭中有多少是寶石。 J 中的字母不重復&#xff0c;J 和 S中的所有字符都是字母。字母區分大小寫&#xff0c;因此"a…

用ntdsutil命令中的restore object 更新版本號

備份域控建立好后&#xff0c;備份域信息&#xff0c;用目錄還 原模式&#xff0c;還原域信息&#xff0c;用ntdsutil命令&#xff0c;中的 restore ob ject 更新版本號 本文轉自9pc9com博客&#xff0c;原文鏈接&#xff1a; http://blog.51cto.com/215363/783334 如需…

python處理excel文件(xls和xlsx)

一、xlrd和xlwt 使用之前需要需要先安裝&#xff0c;windows上如果直接在cmd中運行python則需要先執行pip3 install xlrd和pip3 install xlwt&#xff0c;如果使用pycharm則需要在項目的解釋器中安裝這兩個模塊&#xff0c;File-Settings-Project:layout-Project Interpreter&a…

html塊中的內容垂直居中,css如何設置行內元素與塊級元素的內容垂直居中

首先我們先了解一下行內元素和塊級元素行內元素(內聯元素)&#xff1a;沒有自己的獨立空間&#xff0c;它是依附于其他塊級元素存在的&#xff0c;空間大小依附于內容多少。行內元素沒有度、寬度、內外邊距等屬性。塊級元素&#xff1a;占據獨立的空間&#xff0c;具有寬度&…

Mina、Netty、Twisted一起學(五):整合protobuf

protobuf是谷歌的Protocol Buffers的簡稱&#xff0c;用于結構化數據和字節碼之間互相轉換&#xff08;序列化、反序列化&#xff09;&#xff0c;一般應用于網絡傳輸&#xff0c;可支持多種編程語言。protobuf怎樣使用這里不再介紹&#xff0c;本文主要介紹在MINA、Netty、Twi…

leetcode 1. 兩數之和(map)

給定一個整數數組 nums 和一個目標值 target&#xff0c;請你在該數組中找出和為目標值的那 兩個 整數&#xff0c;并返回他們的數組下標。 你可以假設每種輸入只會對應一個答案。但是&#xff0c;數組中同一個元素不能使用兩遍。 示例: 給定 nums [2, 7, 11, 15], target …