LINUX 按键中断
来源:互联网 发布:济南网络电视台直播 编辑:程序博客网 时间:2024/05/16 09:04
/* 执行"insmod mini2440_buttons.ko"命令时就会调用这个函数*/
static int __init mini2440_buttons_init (void)
{
int ret;
/*这里主要是注册设备驱动程序,参数为主设备号,如果BUTTON_MAJOR设为0,表示由内核自动分配主设备号,设备的名字,file_operations结构,操作主调和号为BUTTON_MAJOR的设备文件时,就会调用mini2440_buttons_fops中的相关成员函数*/
ret = register_chrdev(BUTTON_MAJOR,DEVICE_NAME,&mini2440_buttons_fops);
if(ret < 0)
{
printk(DEVICE_NAME "can't register major number\n");
return ret ;
}
printk(DEVICE_NAME"initialized\n");
return 0;
}
/* 执行 rmmod mini2440_buttons.ko0 命令时就会调用这个函数 */
static void __exit mini2440_buttons_exit(void)
{//卸载驱动程序
unregister_chrdev(BUTTON_MAJOR,DEVICE_NAME);
}
//指定驱动程序的初始化函数和卸载函数
module_init(mini2440_buttons_init);
module_exit(mini2440_buttons_exit);
/* 这个结构是字符设备驱动程序的核心,当应用程序操作设备文件时所调用的open,read,write等函数,最终会调用这个结构中的对应函数*/
static struct file_operations mini2440_buttons_fops =
{
.owner = THIS_MODULE, //这是 个宏,指向编译模块时自动创建的_this_module变量
.open = mini2440_buttons_open,
.release = mini2440_buttons_close,
.read = mini2440_buttons_read,
};
static int mini2440_buttons_open(struct inode *inode,struct file *file)
{
int i;
int err;
for (i=0;i<sizeof(button_irqs)/sizeof(button_irqs[0]);i++)
{ //注册中断处理函数 一共六个
err = request_irq(button_irqs[i].irq,buttons_interrupt,button_irqs[i].flags,button_irqs[i].name,(void *)&press_cnt[i]);
if (err)
break;
}
if(err) //出错处理函数,如果出错释放已经注册的中断
{
i--;
for(;i>=0;i--)
free_irq(button_irqs[i].irq,(void *)&press_cnt[i]);
return -EBUSY;
}
return 0;
}
struct button_irq_desc
{
int irq;//中断号
unsigned long flags; //中断标志,用来定义中断的触发方式
char *name; //中断名称
};
static struct button_irq_desc button_irqs[] =
{ //下面是按键对应的外部的中断号,触发方式,名称
{IRQ_EINT8,IRQF_TRIGGER_FALLING,"KEY0"},
{IRQ_EINT11,IRQF_TRIGGER_FALLING,"KEY1"},
{IRQ_EINT13,IRQF_TRIGGER_FALLING,"KEY2"},
{IRQ_EINT14,IRQF_TRIGGER_FALLING,"KEY3"},
{IRQ_EINT15,IRQF_TRIGGER_FALLING,"KEY4"},
{IRQ_EINT19,IRQF_TRIGGER_FALLING,"KEY5"},
};
/* 应用程序对设备文件/dev/buttons执行close(...)时。就会调用mini2440_buttons_close函数*/
static int mini2440_buttons_close(struct inode *inode,struct file *file)
{
int i;
for(i=0;i<sizeof(button_irqs)/sizeof(button_irqs[0]);i++)
{ //释放已注册的函数
free_irq(button_irqs[i].irq,(void *)&press_cnt[i]);
}
return 0;
}
中断处理函数会在press_cnt数组中记录按键被按下的次数。mini_buttons_read函数,首先判断是否按键再次按下,如果没有则休眠;否则读取press_cnt数组的数据,
/*等待队列:
当没有按键被按下时,如果有进程调用mini2440_buttons_read函数,它将休眠*/
static DECLARE_WAIT_QUEUE_HEAD(button_waitq);
/*中断事件标志,中断服务程序将它置1,mini2440_buttons_read将它清0*/
static volatile int ev_press = 0;
/*应用程序对设备文件/dev/buttons执行read(...)时,就会调用mini2440_buttons_read函数*/
static int mini2440_buttons_read(struct file *filp,char __user *buff,size_t count,loff_t *offp)
{
unsigned long err;
//如果ev_press等于0,休眠
wait_event_interruptible(button_waitq,ev_press);
ev_press = 0;// 执行到这里是ev_press肯定是1,将它清0
//将按键状态复制给用户,并清0
err = copy_to_user(buff,(const void *)press_cnt,min(sizeof(press_cnt),count));
memset((void *)press_cnt,0,sizeof(press_cnt));
return err ? -EFAULT:0;
}
- LINUX 按键中断
- linux驱动开发--中断:按键中断
- linux驱动之按键中断
- S5PV210 Linux 按键中断输入
- linux按键中断驱动示例
- Linux gpio 按键中断学习
- 【Linux内核驱动】按键中断
- linux按键中断驱动程序——S3C2440
- linux字符驱动之中断按键
- Linux驱动学习之:按键中断驱动
- Linux字符设备驱动之中断按键
- linux字符驱动之中断按键 .
- linux字符驱动之中断按键
- linux驱动之按键(中断)
- S5PV210 Linux内核按键中断实验
- linux字符驱动之中断按键
- 5. Linux驱动中断编程: 驱动按键
- linux设备驱动-按键中断实验笔记
- P2P技术基础: 关于TCP打洞技术
- Windows文件过滤驱动开发
- 数据库基础知识
- PreviewActivityLoop1
- google maps api v3版页面镶嵌
- LINUX 按键中断
- PreviewActivityLoop2
- SAP PO相关打印编程
- spark(A)?
- oracle执行计划(4)--COST成本全表扫描成本
- QTableView add row background-iamge
- hibernate4.x编译
- 读取pdf文件,然后按页将其装换成bitmap,将bitmap以JPEG的格式存储在sdcard
- delphi串口API函数