⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 button_int.c

📁 arm2440下
💻 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 + -