+ -
当前位置:首页 → 问答吧 → 三星2440按键驱动

三星2440按键驱动

时间:2011-09-06

来源:互联网

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?

作者: banmiton   发布时间: 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上睡眠的进程,最后 ,将数据拷贝到用户空间。

作者: zhangzhaocap   发布时间: 2011-09-06