应用程序开发过程,读写一个设备之前,常常需要查询一下设备是否有数据可读写,可以通过查询,然后根据查询的结果进行下一步的操作。这样的操作叫做轮循操作,需要应用层与驱动层配合使用,以下直接说明:
应用层:
1 定义要轮询的设备文件描述符并将其初始化,代码:
struct pollfd pfds; //定义轮询设备
memset(&pfds,0,sizeof(pfds));
pfds->POLL | POLOUT;
fd=open("xxx",O_RDWR);
pfds->fd=fd;
2 调用poll函数轮询多个设备描述符
3.根据poll返回输出信息,判断是哪个设备发生了什么事件,然后应用程序做相应的处理。
驱动层:
1.定义设备驱动的轮询等待队列和状态标志
wait_queue_head_t poll_wq_write
int full_flag
2,在探测函数probe初始化函数中初始化轮询等待队列
init_waitqueue_head(wait_queue_head_t * q)
3.实现设备驱动程序的POLL函数,设备驱动程序的POLL函数主要做两件事情;
(1)调用POLL函数,将当前进程加入到设备的轮询队列中;
(2)根据设备标志位返回设备的当前状态信息
如代码:
unsigned int mixled_poll(struct file *file, poll_table *wait)
{
unsigned int mask = 0;
poll_wait(file, &Elmixled_dev->poll_wq_write,wait );
if(1 == Elmixled_dev->full_flag )
{
// device have something to read
mask |= POLLIN;
}
return mask;
}