Linux内核驱动程序异步I2C(在Raspberry PI上)

Linux内核驱动程序异步I2C(在Raspberry PI上),linux,asynchronous,driver,nonblocking,i2c,Linux,Asynchronous,Driver,Nonblocking,I2c,我想为传感器设备编写一个I2C驱动程序。有一个非零转换时间,我不想浪费内核时间等待和轮询忙状态,直到设备忙 我想我设置了一个计时器,并随时调用更新 然而,当执行达到任何I2C功能时,整个系统都会冻结 我准备了一个非常简单的示例,但它不起作用。一切正常,直到I2C接入 没有I2C的东西,代码就可以工作。没有定时器,I2C就可以工作 我没有找到如何以异步(非阻塞)方式使用I2C。由于I2C函数处于休眠状态,因此无法从计时器调用它们。幸运的是,计时器并不是将工作安排到未来的唯一方式。查看工作队列:

我想为传感器设备编写一个I2C驱动程序。有一个非零转换时间,我不想浪费内核时间等待和轮询忙状态,直到设备忙

我想我设置了一个计时器,并随时调用更新

然而,当执行达到任何I2C功能时,整个系统都会冻结

我准备了一个非常简单的示例,但它不起作用。一切正常,直到I2C接入

没有I2C的东西,代码就可以工作。没有定时器,I2C就可以工作


我没有找到如何以异步(非阻塞)方式使用I2C。

由于I2C函数处于休眠状态,因此无法从计时器调用它们。幸运的是,计时器并不是将工作安排到未来的唯一方式。查看工作队列:


特别是,看看
queue\u delayed\u work
,它将允许您将来在能够睡眠的进程上下文中运行函数。

我使用
queue\u delayed\u work
实现了它,但结果是相同的。当执行达到I2C通信时,整个机器会冻结每一个案例。为了进行健全性检查,您可以从用户空间与I2C设备通信吗?另外,如果在设备探测期间尝试执行读取,会发生什么情况。如果没有计时器/工作队列,我可以从用户和内核空间使用设备。甚至I2C读/写探针也可以工作,在计时器/工作队列调用更新函数之前,一切都正常。计时器/wq调用更新函数后的结果是一个oops:这是一个简单的空指针解引用。可能
test114_i2c
为空。有两件事需要尝试:
printk
使用指针值之前,请先初始化该变量,然后再对第一个工作项进行排队。