#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/irq.h>
#include <linux/kdev_t.h>
#include <linux/interrupt.h>
#include <linux/uaccess.h>
#include <mach/gpio-fns.h>
#include <mach/regs-gpio.h>
MODULE_LICENSE("Dual BSD/GPL");
dev_t key_dev_t; //定义设备号描述类型
struct cdev key_cdev; //定义cdev结构体,用来标识字符设备
char buff[1]={0};
int key_open(struct inode *i,struct file *f)
{
//printk("open/n");
return 0;
}
ssize_t key_read(struct file *f,char __user *p,size_t size,loff_t *l)
{
copy_to_user(p,buff,1); //将buff的内容赋给p,即赋给用户空间
// printk("read/n");
return 0;
}
ssize_t key_write(struct file *f,const char __user *p,size_t size,loff_t *l)
{
copy_from_user(buff,p,1); //用户空间 p=malloc(sizeof(buff));
return 0;
}
int key_release(struct inode *i,struct file *f)
{
return 0;
}
struct file_operations key_fops={
.open=key_open,
.read=key_read,
.write=key_write,
.release=key_release,
};
//初始化gpio函数
static void gpio_init(void)
{
//如电路图所示,管脚应设置为低电平
//因为测试键选用的是S6键,对应的管脚为GPF0,所以这里对GPF0进行设置
s3c2410_gpio_cfgpin(S3C2410_GPF(0),S3C2410_GPIO_OUTPUT);
s3c2410_gpio_setpin(S3C2410_GPF(0),0);
//GPF1控制S6键的中断
s3c2410_gpio_cfgpin(S3C2410_GPF(1),IRQ_EINT1); //设置中断
s3c2410_gpio_pullup(S3C2410_GPF(1),1); //禁上拉
set_irq_type(IRQ_EINT1,IRQ_TYPE_EDGE_FALLING); //设置中断触发方式为下降沿触发
}
//中断处理函数
static int key_interrupt(int irq,void *dev_id)
{
buff[0]=1;
return 0;
}
//中断注册函数
static void irq_register(void)
{
int result;
result=request_irq(IRQ_EINT1,&key_interrupt,IRQF_DISABLED,"KEY_CTL",NULL);
//IRQF_DISABLED 当前中断发生时,不允许产生其他中断
//NULL 非共享中断
if(result)
{
printk("irq resister error/n");
return result;
}
return 0;
}
static int key_init(void)
{
key_dev_t=MKDEV(223,2); //在命令行中生成设备文件 mknod c filename 223 2
//regiser_chrdev_region(key_dev_t,1,"KEY");
cdev_init(&key_cdev,&key_fops);
cdev_add(&key_cdev,key_dev_t,1);
gpio_init(); //对寄存器进行初始化
irq_register(); //中断处理程序
return 0;
}
static void key_exit(void)
{
free_irq(IRQ_EINT1,NULL);
cdev_del(&key_cdev);
}
//start
module_init(key_init);
module_exit(key_exit);