三星2440按键驱动

banmiton 2011-09-06 09:55:53
static int s3c24xx_buttons_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)
{
unsigned long err;

if (!ev_press) {
if (filp->f_flags & O_NONBLOCK)
return -EAGAIN;
else
wait_event_interruptible(button_waitq, ev_press);
}


/*将按键状态复制给用户,并清0*/
ev_press = 0;

err = copy_to_user(buff, (const void *)key_values, min(sizeof(key_values), count));

return err ? -EFAULT : min(sizeof(key_values), count);
}该段代码红色部分如何理解?是按键没有按下时,使所有等待进程都休眠是吗?if (filp->f_flags & O_NONBLOCK)
return -EAGAIN;如何理解?另外内核是如何知道等待进程的,为何是直接就调用睡眠函数?请教各位大侠 wait_event_interruptible?
...全文
239 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
念茜 2011-09-07
  • 打赏
  • 举报
回复
wait_event_interruptible() -> 宏__wait_event_interruptible -> signal_pending(current)->test_bit(),测试是否有TIF_SIGPENDING标记,即当前进程是否被挂起,如果处于挂起schedule()继续等
皮CaPr 2011-09-06
  • 打赏
  • 举报
回复
(filp->f_flags & O_NONBLOCK)
return -EAGAIN
表示当上层用非阻塞的方式调用read函数时,直接返回-EAGAIN。

如果是以阻塞的方式调用read函数,那么调用read函数的进程就会阻塞,进入休眠状态。

wait_event_interruptible(button_waitq, ev_press);
就是当 ev_press为真之前,会让进程保持休眠。

然后就是,当有按键发生时,产生中断 ,在中断处理函数中,会唤醒在等待队列button_waitq上睡眠的进程,最后 ,将数据拷贝到用户空间。

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧