非阻塞慢采样传感器驱动器

时间:2017-01-26 10:04:29

标签: c linux kernel device-driver

我正在为i2c连接的温度/压力表编写设备驱动程序。

首次请求新读数时,要操作传感器。然后,传感器将在一段时间内执行必要的采样,然后报告最终读数。这个过程预计需要一些时间。

用户空间应使用基于文件read和可能ioctl的字符设备接口连接到设备驱动程序。

我可以轻松创建一个阻塞界面,用户线程尝试读取并保持阻塞,直到我能够报告传感器读数。

我想允许驱动程序以非阻塞模式工作,因为预计采样需要一些时间。用户线程可以执行其他操作或阻止轮询/选择,直到采样完成。

问题是我需要read指示驱动程序开始采样但驱动程序无法完成read直到采样完成并且在非阻塞模式下,驱动程序不允许阻止这两种状态之间的线程。

作为一个额外的考虑因素,我想尽量减少为执行此操作而调用的内核调用的数量。我还需要确保不必要的采样浪费宝贵的电力。

这样做的正确Linux模式是什么?

更新:我对实现细节不感兴趣,我真正追求的是设计符合良好实践的用户/内核接口。

1 个答案:

答案 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章将有所帮助。