设为首页 加入收藏

TOP

mini6410按键驱动程序
2014-11-24 12:49:21 来源: 作者: 【 】 浏览:0
Tags:mini6410 按键 驱动程序

mini6410按键驱动程序:


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include


#include
#include
#include


#include
#include
#include


#define DEVICE_NAME "buttons"


struct button_irq_desc {
int irq;
int number;
char *name;
};


static struct button_irq_desc button_irqs [] = {
{IRQ_EINT( 0), 0, "KEY0"},
{IRQ_EINT( 1), 1, "KEY1"},
{IRQ_EINT( 2), 2, "KEY2"},
{IRQ_EINT( 3), 3, "KEY3"},
{IRQ_EINT( 4), 4, "KEY4"},
{IRQ_EINT( 5), 5, "KEY5"},
{IRQ_EINT(19), 6, "KEY6"},
{IRQ_EINT(20), 7, "KEY7"},
};
static volatile char key_values [] = {'0', '0', '0', '0', '0', '0', '0', '0'};


static DECLARE_WAIT_QUEUE_HEAD(button_waitq);


static volatile int ev_press = 0;



static irqreturn_t buttons_interrupt(int irq, void *dev_id)
{
struct button_irq_desc *button_irqs = (struct button_irq_desc *)dev_id;
int down;
int number;
unsigned tmp;


udelay(0);
number = button_irqs->number;
switch(number) {
case 0: case 1: case 2: case 3: case 4: case 5:
tmp = readl(S3C64XX_GPNDAT);
down = !(tmp & (1< break;
case 6: case 7:
tmp = readl(S3C64XX_GPLDAT);
down = !(tmp & (1 << (number + 5)));
break;
default:
down = 0;
}


if (down != (key_values[number] & 1)) {
key_values[number] = '0' + down;


ev_press = 1;
wake_up_interruptible(&button_waitq);
}


return IRQ_RETVAL(IRQ_HANDLED);
}



static int s3c64xx_buttons_open(struct inode *inode, struct file *file)
{
int i;
int err = 0;


for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) {
if (button_irqs[i].irq < 0) {
continue;
}
free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);
}


return 0;
}



static int s3c64xx_buttons_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)
{
unsigned long err;


if (!ev_press) {
if (filp->f_flags & O_NONBLOCK)
return -EAGAIN;
else
wait_event_interruptible(button_waitq, ev_press);
}


ev_press = 0;


err = copy_to_user((void *)buff, (const void *)(&key_values), min(sizeof(key_values), count));


return err -EFAULT : min(sizeof(key_values), count);
}


static unsigned int s3c64xx_buttons_poll( struct file *file, struct poll_table_struct *wait)
{
unsigned int mask = 0;
poll_wait(file, &button_waitq, wait);
if (ev_press)
mask |= POLLIN | POLLRDNORM;
return mask;
}



static struct file_operations dev_fops = {
.owner = THIS_MODULE,
.open = s3c64xx_buttons_open,
.release = s3c64xx_buttons_close,
.read = s3c64xx_buttons_read,
.poll = s3c64xx_buttons_poll,
};


static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &dev_fops,
};


static int __init dev_init(void)
{
int ret;


ret = misc_register(&misc);


printk (DEVICE_NAME"\tinitialized\n");


return ret;
}


static void __exit dev_exit(void)
{
misc_deregister(&misc);
}


module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("yinjiabin");


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇mini6410 adc驱动程序 下一篇Android手机浏览器访问本地网络相..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·如何利用Python做数 (2025-12-24 23:48:36)
·如何使用python进行 (2025-12-24 23:48:34)
·python 爬虫入门该怎 (2025-12-24 23:48:31)
·Java 实现多个大文件 (2025-12-24 23:22:00)
·Java多线程编程在工 (2025-12-24 23:21:56)