我正在为i2c连接的温度/压力表编写设备驱动程序。
首次请求新读数时,要操作传感器。然后,传感器将在一段时间内执行必要的采样,然后报告最终读数。这个过程预计需要一些时间。
用户空间应使用基于文件read
和可能ioctl
的字符设备接口连接到设备驱动程序。
我可以轻松创建一个阻塞界面,用户线程尝试读取并保持阻塞,直到我能够报告传感器读数。
我想允许驱动程序以非阻塞模式工作,因为预计采样需要一些时间。用户线程可以执行其他操作或阻止轮询/选择,直到采样完成。
问题是我需要read
指示驱动程序开始采样但驱动程序无法完成read
直到采样完成并且在非阻塞模式下,驱动程序不允许阻止这两种状态之间的线程。
作为一个额外的考虑因素,我想尽量减少为执行此操作而调用的内核调用的数量。我还需要确保不必要的采样浪费宝贵的电力。
这样做的正确Linux模式是什么?
更新:我对实现细节不感兴趣,我真正追求的是设计符合良好实践的用户/内核接口。
答案 0 :(得分:0)
在open方法中对传感器使用工作队列或其他异步原语进行必要的采样。在工作函数中,使用wait_queue通知poll设备是否可读。
在open方法中:
work_function()
{
/*perform the necessary sampling*/
/*after done, use wait queue to notify poll the device is readable.*/
}
DECLARE_WORK(name, work_function, data);
static int open(struct inode *inode, struct file *filp)
{
/*do other stuff....*/
queue_work(.......);
}
static unsigned int scull_p_poll(struct file *filp, poll_table *wait)
{
poll_wait(filp, &dev->outq, wait);
.......
return mask;
}
LDD第7章将有所帮助。