历史上的今天
今天是:2024年11月26日(星期二)
2018年11月26日 | tq2440 按键中断 去抖
2018-11-26 来源:eefocus
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define DEVICE_NAME "driver_button"
static volatile int ev_press = 0;
static volatile int dev_num=0;
static volatile int press_cnt [] = {0, 0, 0, 0};
static volatile int flag_press[] = {0, 0, 0, 0};
static DECLARE_WAIT_QUEUE_HEAD(button_waitq);
static irqreturn_t irq_interrupt(int irq, int dev_id)
{
//
//disable_irq(IRQ_EINT0); ???????????????????????????ú
//
//printk("dev_id= %dn",dev_id);
dev_num=dev_id;
ev_press=1;
switch( dev_num)
{
case 1:
flag_press[0]=1;break;
case 2:
flag_press[1]=1;break;
case 3:
flag_press[2]=1;break;
case 4:
flag_press[3]=1;break;
default:
break;
}
wake_up_interruptible(&button_waitq);
//enable_irq(IRQ_EINT0);
return IRQ_RETVAL(IRQ_HANDLED);
}
// ------------------- OPEN ------------------------
ssize_t button_open (struct inode * inode ,struct file * file)
{
request_irq(IRQ_EINT0, irq_interrupt, IRQ_TYPE_EDGE_FALLING, "KEY1", 1);
request_irq(IRQ_EINT1, irq_interrupt, IRQ_TYPE_EDGE_FALLING, "KEY2", 2);
request_irq(IRQ_EINT2, irq_interrupt, IRQ_TYPE_EDGE_FALLING, "KEY3", 3);
request_irq(IRQ_EINT4, irq_interrupt, IRQ_TYPE_EDGE_FALLING, "KEY4", 4);
printk("-----------------drive button open ok----------------n");
return 0;
}
// ------------------- RELEASE/CLOSE ---------------
ssize_t button_release (struct inode * inode ,struct file * file)
{
free_irq(IRQ_EINT0, 1);
free_irq(IRQ_EINT1, 2);
free_irq(IRQ_EINT2, 3);
free_irq(IRQ_EINT4, 4);
return 0;
}
// ------------------- READ ------------------------
ssize_t button_read (struct file * file ,char * buf, size_t count, loff_t * f_ops)
{
wait_event_interruptible(button_waitq, ev_press);
ev_press = 0;
msleep(200);
if(flag_press[0])
{
press_cnt[0]++;
}
else if(flag_press[1])
{
press_cnt[1]++;
}
else if(flag_press[2])
{
press_cnt[2]++;
}
else if(flag_press[3])
{
press_cnt[3]++;
}
flag_press[0]=0; flag_press[1]=0; flag_press[2]=0; flag_press[3]=0;
printk("------------device read --------------------n");
printk("press_cnt[0]= %dn",press_cnt[0]);
copy_to_user( buf,(const void *)press_cnt,sizeof(press_cnt) );
return 0;
}
// ------------------- WRITE -----------------------
ssize_t button_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops)
{
return 0;
}
// ------------------- IOCTL -----------------------
ssize_t button_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, unsigned long arg)
{
return 0;
}
// -------------------------------------------------
static struct file_operations button_ops ={
.owner = THIS_MODULE,
.open = button_open,
.read = button_read,
.write = button_write,
.ioctl = button_ioctl,
.release = button_release,
};
static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &button_ops,
};
static int __init init_button_init(void)
{
int ret;
ret = misc_register(&misc);
printk("-----------------drive button init ok----------------n");
return 0;
}
static void __exit exit_button_ctl(void)
{
misc_deregister(&misc);
}
module_init(init_button_init);
module_exit(exit_button_ctl);
MODULE_LICENSE("GPL");
#include
#include
#include
#include // open() close()
#include // read() write()
#define DEVICE_NAME "/dev/driver_button"
//------------------------------------- main ---------------------------------------------
int main(int argc, char **argv)
{
int fd,ret;
int cnt=0;
unsigned int key_val[4];
fd = open(DEVICE_NAME, O_RDWR);
if (fd == -1)
{
printf("can't open device mknod %s c zhu ci n",DEVICE_NAME);
return 0;
}
while(1)
{
read(fd,key_val,sizeof(key_val));
printf(" key_val= %d %d %d %dn",key_val[0],key_val[1],key_val[2],key_val[3]);
}
// close
ret = close(fd);
printf ("close gpio_led_driver testn");
return 0;
}// end main
上一篇:tq2440触摸屏学习笔记
史海拾趣
|
最近正在实习,得到一些凌阳单片机的资料,传上来看大家谁需要^_^ 资料说明 1.《61指令周期表V1.1》 介绍了SPCE061A的unSP 1.1版本CPU内核的指令周期数、指令形式等 2.《SPCE061A英文数据手册v0.8》 最新的英文数据手册,当其他资料和它冲突时 ...… 查看全部问答> |
|
我看了一些关于CORDIC算法的资料,我现在想用CORDIC算法来实现求反正切,我想问一下求反正切时主要考虑一些什么问题?那些要考虑,那些不需要考虑?例如,校正因子K需不需要考虑,旋转方向采用什么方法判断比较有利。希望熟悉的大侠给点意见,非常 ...… 查看全部问答> |
|
Linux系统下新增一块500G磁盘,这个磁盘是用于嵌入式硬盘录像机录像的磁盘,我需要把里面的内容COPY出来,但是无法挂载这块磁盘。用fdisk -l出现如下提示: Disk /dev/sda: 500.1G,500107862016 bytes 255 heads,63 sectors/track,60801 cylind ...… 查看全部问答> |
|
100分请您提供WinCEPB50-061231-Product-Update-Rollup-Armv4I.msi,GOOGLE至凌晨没找着 如题,多谢。 我已经打了了: WinCEPB50-081231-Product-Update-Rollup-Armv4I.msi WinCEPB50-090131-2009M01-Armv4I.msi WinCEPB50-090228-2009M02-Armv4I.msi 结果编译时,发现WINCE500\\PUBLIC\\COMMON\\OAK\\DRIVERS\\SDCARD\\SDBUSDRIVER ...… 查看全部问答> |
|
请问各位: 1、WINCE50下是不是分物理中断号和逻辑中断号??物理中断号就是定义的跟硬件开关中断相关的中断号,逻辑中断号是物理中断号对应的由系统调用的中断号???这个理解对不对??? 2、BSP中SD驱动的注册表信 ...… 查看全部问答> |




