#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);