//头文件
#include <linux/module.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <asm/io.h>
#include <asm/system.h>
#include <asm/uaccess.h>
#include <linux/poll.h>
#include <linux/signal.h>
#include <linux/irq.h>
#include <asm/irq.h>
#include <linux/interrupt.h>
#include <linux/kernel.h>
#include <linux/sysdev.h>
#include <asm/hardware/vic.h>
#include <plat/regs-irqtype.h>
#include <mach/map.h>
#include <plat/cpu.h>
#include <plat/pm.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>
#include <mach/regs-gpio.h>
#include <mach/irqs.h>
#include <mach/gpio-bank.h>
#include <linux/delay.h>
#include <asm/delay.h>
#include <asm/param.h>
#include <linux/io.h>
#include <linux/sysdev.h>
#include <mach/map.h>
#define DEVICE_NAME "menu_test"
//#define IRQ_NO (IRQ_EINT(16))
struct menu_dev {
struct cdev cdev;
};
struct menu_dev *menu_devp;//设备结构体指针
int IRQ_NO;//定义中断号
//函数声明
static int menu_major = 250;
static void menu_setup_cdev(struct menu_dev * , int );
static int menu_init(void);
static int menu_open(struct inode * , struct file *);
static int menu_release(struct inode * ,struct file *);
static void init_gpio(void);
//中断处理函数
irqreturn_t menu_interrupt(int irq, void *dev_id)
{
printk("menu_interrupt start.....!\n");
disable_irq_nosync(irq);//关中断
udelay(5);//延迟5ms,消除毛刺信号
printk("i am interrup handler\n");
init_gpio();
enable_irq(irq);//开中断
printk("menu_interrupt over.......!\n");
return IRQ_HANDLED;
}
//初始化配置函数
static void init_gpio(void)
{
int error;
printk("init_gpio start....\n");
error = gpio_request(S5PV210_GPH2(0),"gpio_keys");//检查gpio管脚是否被使用
if (error < 0)
printk("gpio-keys: failed to request GPIO %d \n", S5PV210_GPH2(0));
else
printk("gpio %d success!\n",S5PV210_GPH2(0));
s3c_gpio_cfgpin(S5PV210_GPH2(0),0xf); //将管脚配置为中断模式
IRQ_NO = gpio_to_irq(S5PV210_GPH2(0));//获取中断号,其实这个我也不太清楚,看别人的。
if (error < 0)
printk("gpio_to_irq: failed %d \n", S5PV210_GPH2(0));
else
printk("gpio_to_irq %d success!\n",S5PV210_GPH2(0));
//配置为输出 且为低电平
s3c_gpio_cfgpin(S5PV210_GPH3(0),S3C_GPIO_OUTPUT);//配置为输出,低电平 EINT24号管脚 参照原理图上的。
s3c_gpio_setpin(S5PV210_GPH3(0),1);
s3c_gpio_cfgpin(S5PV210_GPH3(1),S3C_GPIO_OUTPUT);//配置为输出,低电平 EINT25号管脚
s3c_gpio_setpin(S5PV210_GPH3(1),1);
//设置下降沿触发
set_irq_type(IRQ_NO,IRQ_TYPE_EDGE_FALLING);
printk("init_gpio successed!\n");
}
static int menu_open(struct inode *inode , struct file *filp)
详细解决方案
关于简单的按键驱动 请问
热度:79 发布时间:2016-04-28 10:35:51.0
相关解决方案