Linux驱动开发之八-----按键驱动(异步通知机制)

来源:互联网 发布:java中的移位运算 编辑:程序博客网 时间:2024/05/21 11:33

在Linux下,异步通知类似于信号机制,内核和应用程序之间采用通知方法来告知是否发生对应的事件,并进一步采取相应的动作,当产生按键动作时,发生中断,由驱动程序使用kill_fasync函数告知应用程序,而应用程序需要向内核提供PID,然后就可以工作了。

驱动fasync接口实现:

int buttons_fasync(int fd, struct file *filp, int on){return fasync_helper(fd, filp, on, &but_fasync);}
在中断处理程序中调用kill_fasync函数:

//中断处理程序,记录按键按下的次数,并置标志位为1,唤醒等待队列上等待的进程static irqreturn_t buttons_interrupt(int irq,void *dev_id){struct button_irq_desc *temp = (struct button_irq_desc *)dev_id;key_val = (unsigned char)(temp->number+1);ev_press = 1;//表示中断发生了wake_up_interruptible(&buttons_waitq);//当有按键被按下时驱动程序通知应用程序kill_fasync(&but_fasync,SIGIO, POLL_IN);return IRQ_RETVAL(IRQ_HANDLED);}
应用程序告知内核其PID并调用fasync函数

fcntl(fd,F_SETOWN,getpid());//把当前进程的ID号告诉驱动程序Oflag = fcntl(fd,F_GETFL);fcntl(fd,F_SETFL,Oflag | FASYNC);//设置异步通知标志,调用fasync
编译并下载运行截图如下:



0 0