驱动学习之POLL机制

POLL的应用:

1. 允许进程决定是否可以对一个或多个打开的文件做非阻塞的读取或写入,这些调用也会阻塞进程,知道给定的文件描述符集合中的任一个可读取或写入。因此它们常用于多个输入或多个输出流而又不会阻塞其中任一个流的应用中。

unsigned int (*poll) (struct file *file,poll_table *wait);

1. 在一个或多个可以指示poll状态变化的等待队列上调用poll_wait。如果当前没有文件描述符可以用来执行I/O,内核将使进程在传递到该系统调用的所有文件描述符对应的等待队列上。

2. 返回一个用来描述操作是否可以立即无阻塞执行的为掩码。

传递给poll的第二个参数。poll_table结构用于在内核中实现poll系统调用,通过poll_wait函数驱动程序向poll_table结构添加一个等待队列。

void poll_wait (struct file*,wait_queue_head_t *.poll_table *);

poll的返回是可以立即执行的为掩码,如下:

POLLIN 如果设备可以问阻塞的读取,就设置该位。

POLLRDNORM如果通常的数据已经就绪,可以读取,就设置该位。一个科读取设备返回(POLLIN | POLLRDNORM)。

……

static irqreturn_t buttons_irq(int irq, void *dev_id)
{
struct pin_desc * pindesc = (struct pin_desc *)dev_id;
unsigned int pinval;

pinval = s3c2410_gpio_getpin(pindesc->pin);


if (pinval)
{
/* 松开 */
key_val = 0x80 | pindesc->key_val;
}
else
{
/* 按下 */
key_val = pindesc->key_val;
}


    ev_press = 1;                  /* 表示中断发生了 */
    wake_up_interruptible(&button_waitq);   /* 唤醒休眠的进程 */



return IRQ_RETVAL(IRQ_HANDLED);
}

static unsigned forth_drv_poll(struct file *file, poll_table *wait)
{
unsigned int mask = 0;
poll_wait(file, &button_waitq, wait); // 不会立即休眠


if (ev_press)
mask |= POLLIN | POLLRDNORM; //中断发生有数据可读,


return mask;
}


参考韦东山 视频和设备驱动程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值