📄 button_int.c
字号:
#include <linux/module.h>
#include <linux/version.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/timer.h>
#include <linux/errno.h>
#include <asm/io.h>
#include <asm/hardware.h>
#include <asm/irq.h>
#include <linux/config.h>
#include <linux/fs.h>
#include <linux/devfs_fs_kernel.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/arch/regs-gpio.h>
#include <asm/uaccess.h>
#define DEVICE_NAME "button_int"
#define button_MAJOR 233#define LED_SET_PIN 0X1
#define LED_CLR_PIN 0X2#define MAIN_IRQ IRQ_EINT10 //#define IRQ_EINT10 S3C2410_IRQ(38)
#define KEY1_IRQ IRQ_EINT0
//#define MAIN_IRQ IRQ_EINT0
unsigned int data;unsigned int check_data = 0;unsigned int ret=0;
static struct timer_list P_timer;
//GPG2 ---------------button
//GPB7----------------LED
static void Do_timer_handle(unsigned long arg)
{ if(data==1) { check_data = 1; data = 0; } else { check_data = 0; data = 0; } //enable_irq(MAIN_IRQ);
enable_irq(KEY1_IRQ);
}
static int button_open(struct inode *inode,struct file *file)
{ printk(KERN_INFO "I am open yeh\n");
//enable_irq(MAIN_IRQ);
enable_iqr(KEY1_IRQ);
init_timer(&P_timer);
P_timer.function=Do_timer_handle;
// atomic_set(&counter_exint,0);
return 0;
}
static int button_release(struct inode *inode,struct file *file)
{
//disable_irq(MAIN_IRQ);
disable_irq(KEY1_IRQ);
del_timer(&P_timer);
return 0;
}
static int interrupt_kirq(int irq,void *id,struct pt_regs *r)
{ printk(KERN_INFO "button down\n"); //disable_irq(MAIN_IRQ);
disable_irq(KEY1_IRQ);
data = 1; P_timer.expires=jiffies+(HZ/100);
add_timer(&P_timer);
}static ssize_t button_read(struct file *filp,char *buf,size_t count,loff_t *f_pos){// check_data = data; copy_to_user(buf,&check_data,sizeof(check_data));//第一个参数为用户空间,第二个是内核空间
check_data = 0; data = 0; return sizeof(check_data);}/*static int button_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg){ switch(cmd) { case LED_SET_PIN: s3c2410_gpio_setpin(S3C2410_GPB7,0); break; case LED_CLR_PIN: s3c2410_gpio_setpin(S3C2410_GPB7,1); default: return -EINVAL; } return 0;}
*/
static struct file_operations button_fops={
.owner=THIS_MODULE,
.open=button_open, .read=button_read,// .ioctl=button_ioctl,
.release=button_release,
};
static int __init button_init(void)
{
int ret;
// disable_irq(MAIN_IRQ); //s3c2410_gpio_cfgpin(S3C2410_GPG2,S3C2410_GPG2_INP);
s3c2410_gpio_cfgpin(S3C2410_GPF0,S3C2410_GPF0_INP);
//set_irq_type(MAIN_IRQ,IRQT_FALLING);//设置中断,下降沿有效
set_irq_type(KEY1_IRQ,IRQT_FALLING);
// set_irq_type(MAIN_IRQ,IRQT_LOW);
//request_irq(MAIN_IRQ,interrupt_kirq,SA_INTERRUPT,"button",0);
request_irq(KEY1_IRQ,interrupt_kirq,SA_INTERRUPT,"button",0);
ret=register_chrdev(button_MAJOR,DEVICE_NAME,&button_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);
// enable_irq(MAIN_IRQ);
printk(DEVICE_NAME "initialized\n");
return 0;
}
void __exit button_exit(void)
{// disable_irq(MAIN_IRQ);
//free_irq(MAIN_IRQ,interrupt_kirq);
free_irq(KEY1_IRQ,interrupt_kirq);
devfs_remove(DEVICE_NAME);
unregister_chrdev(button_MAJOR,DEVICE_NAME);
}
module_init(button_init);
module_exit(button_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("qlx-1983@163.com");
MODULE_DESCRIPTION("button driver for S3C2440");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -