该按键驱动原理虽简单,但是在处理中却运用到了Linux驱动中中断的一些关键技术,比如“顶半部”和“底半部”使用,等待队列的设置。
这里“顶半部”即中断处理函数运行时间很短,基本就做了两件事:1、关中断;2、调用定时器。具体代码如下:
这里“底半部”通过设置内核定时器实现,“顶半部”调用定时器后便马上退出了,而定时器等待定时时间到达时调用设定的函数完成中断处理函数应该完成的事,即去抖动情况,确定按键被按下后,保存该按键序号,并唤醒被睡眠的进程,读取按键序号值。具体代码:
当上层应用调用read接口时,若按键缓存区头尾不相等时表明有数据可读,但是在读取数据前调用local_irq_save( )函数将中断关闭,读取完毕之后在恢复中断;相反,如果按键缓存区头尾相等则说明没有数据可读,该进程就会被睡眠,实现如下: