1. 程式人生 > >Linux裝置驅動之中斷---基本程式碼框架

Linux裝置驅動之中斷---基本程式碼框架

原理已經在上一篇文章中介紹了,這篇文章主要介紹最基本的使用方法,後面的文章有其他使用示例

我使用的硬體是imx6q,原理都一樣。原來的beep引腳是output模式,電路上把它改成了按鍵。

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/delay.h>
#include <linux/time.h>
#include <linux/input.h>
#include <linux/init.h> #include <linux/gpio.h> #include <asm/io.h> #include <asm/irq.h> #define IMX_GPIO_NR(bank, nr) (((bank) - 1) * 32 + (nr)) //平臺相關,不用關心 #define CYNO_GPIO_BEEP_NUM IMX_GPIO_NR(6,10) //獲得gpio埠 //定義gpio引腳的結構體 static struct pin_desc{ int
irq; unsigned char *name; unsigned int pin; }; //例項化一個具體的引腳 static struct pin_desc beep_desc = { 0, "beep_num", CYNO_GPIO_BEEP_NUM }; //中斷響應函式 static irqreturn_t beep_interrupt_handler(int irq, void *dev_id) { printk("%s\n", __func__); //中斷上半部不應該使用printk這種耗時的操作,應該是配置暫存器這種高速操作,這裡為了看到效果才這麼寫的
return IRQ_HANDLED; } //驅動初始化,當驅動載入或者insmod interrupt_base.ko(此程式檔名)時被執行 static int interrupt_base_init(void) { int ret; printk(KERN_INFO "%s\n", __func__); //獲取beep引腳 if(gpio_request(beep_desc.pin ,beep_desc.name)){ printk(KERN_ERR "%s : request gpio %d error\n", __func__, beep_desc.pin); goto err_gpio_request; } //設定為輸入模式 gpio_direction_input(beep_desc.pin); //動態獲取中斷號 beep_desc.irq = gpio_to_irq(beep_desc.pin); printk(KERN_INFO "%s : the irq num is %d\n", __func__, beep_desc.irq); //獲取中斷,並且設定中斷處理函式,中斷響應方式(這裡為下降沿,beep引腳預設上拉,按下去為低電平) ret = request_irq(beep_desc.irq, beep_interrupt_handler , IRQF_TRIGGER_FALLING, beep_desc.name , &beep_desc); if(ret){ printk(KERN_ERR "%s : request_irq is error\n", __func__); goto err_request_irq; } printk("%s : init end\n", __func__); return 0; //處理各種錯誤 err_request_irq: free_irq(beep_desc.irq, &beep_desc); err_gpio_request: gpio_free(beep_desc.pin); return -1; } //驅動解除安裝執行此函式,rmmod interrupt_base static void interrupt_base_exit(void) { printk("%s\n", __func__); free_irq(beep_desc.irq, &beep_desc); gpio_free(beep_desc.pin); } module_init(interrupt_base_init); module_exit(interrupt_base_exit); MODULE_AUTHOR("xiaolei"); MODULE_DESCRIPTION("interrupt base use"); MODULE_LICENSE("GPL");

對應Makefile

obj-m   += interrupt_base.o

上面的程式是最基本的中斷程式框架,下面幾篇會介紹中斷上下文的使用方法。