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

在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
编译并下载运行截图如下:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值