?? myirq.c
字號:
#include <linux/config.h>
#include <linux/module.h>
#include <linux/version.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <asm/hardware.h>
#include <asm/delay.h>
#include <asm/uaccess.h>
#include <asm-arm/arch-s3c2410/regs-gpio.h>
#include <asm/io.h>
#include <asm-arm/arch-s3c2410/irqs.h>
#include <asm-arm/irq.h>
#include <linux/interrupt.h>
#include <linux/wait.h>#include <linux/irq.h>#include "devfs_fs_kernel.h"
#define BUTTON_IRQ IRQ_EINT8 //申請的中斷號 s1//------------------------------------------------------
#define DEVICE_NAME "button" //設備名字
#define button_Major 232
DECLARE_WAIT_QUEUE_HEAD(wq); //申請等待隊列并初始化
static unsigned char key_down_cnt=0; //中斷計數
static int ev_press=0; //喚醒等待的條件
//設備號
static irqreturn_t button_irq_ser(int irq,void *dev_id,struct pt_regs *regs) //中斷服務程序
{ key_down_cnt++; //來一次,中斷計數加一
ev_press = 1; //表示中斷發生了
wake_up_interruptible(&wq); //喚醒休眠的進程
return 0;
}
static int s3c2410_button_open(struct inode *inode,struct file *filp) //open 函數
{ int ret;
ret= request_irq(BUTTON_IRQ,button_irq_ser,SA_INTERRUPT,DEVICE_NAME,NULL); //注冊中斷
if(ret<0)
{ printk("could not register interrupt !");
return ret;
}
printk("interrupt register successed");
return 0;
}
static int s3c2410_button_release(struct inode *inode,struct file *filp) //關閉設備
{ free_irq(BUTTON_IRQ,NULL); //釋放中斷
return 0;
}
//讀設備
static ssize_t s3c2410_button_read(struct file *filp,char __user *buff,size_t count,loff_t *offp)
{ //printk("sleep\n");
//如果ev_press = 0,則繼續休眠
wait_event_interruptible(wq,ev_press);
//若執行到這兒,ev_press = 1
printk("wake up \n");
//清除ev_press
ev_press = 0;
//拷貝key_down_cnt 到用戶空間
copy_to_user(buff,(const void *)&key_down_cnt,sizeof(char));
printk("process is waked up after");
// key_down_cnt = 0;
return sizeof(unsigned char);
}
static struct file_operations s3c2410_button_flops = {
.owner = THIS_MODULE,
.open = s3c2410_button_open,
.read = s3c2410_button_read,
.release = s3c2410_button_release,
};
//模塊初始化
static int __init s3c2410_button_init(void)
{ /* int ret; ret = register_chrdev(BUTTON_MAJOR, DEVICE_NAME, &qq2440_buttons_fops); if (ret < 0) { printk(DEVICE_NAME " can't register major number\n"); return ret; } devfs_mk_cdev(MKDEV(BUTTON_MAJOR, 0), S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, DEVICE_NAME); printk(DEVICE_NAME " initialized\n"); return 0;}*/ int ret;
set_irq_type(BUTTON_IRQ,IRQT_FALLING); //設置觸發中斷的類型,下降沿觸發
ev_press = 0; //初始化ev_press
//注冊設備,返回主設備號
ret=register_chrdev(button_Major,DEVICE_NAME,&s3c2410_button_flops);
if(ret<0)
{
printk(DEVICE_NAME"can not register the number!");
return ret;
}
//建立設備節點
devfs_mk_cdev(MKDEV(button_Major,0),S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP,DEVICE_NAME);
printk("button_init initialized successed!\n");
return 0;
}
//卸載模塊
static void __exit s3c2410_button_exit(void)
{
devfs_remove(DEVICE_NAME);
unregister_chrdev(button_Major,DEVICE_NAME);
}
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("the s3c2410 key interrupt driver");
module_init(s3c2410_button_init);
module_exit(s3c2410_button_exit);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -