Linux设备驱动程序可以抢占i2c事务吗?

时间:2018-03-02 03:11:45

标签: c linux-kernel linux-device-driver embedded-linux i2c

我遇到问题的代码是尝试将一个大的寄存器表写入挂在处理器上的i2c从设备。该表有大约200个寄存器设置。步骤是:

  1. 为此特定i2c客户端(从设备)分配的gutex
  2. 要写入的每个从器件寄存器:通过执行i2c_smbus_write_byte_data设置页寄存器,然后再次使用i2c_smbus_write_byte_data将数据写入实际寄存器。
  3. 对整个表格重复2.
  4. 释放互斥锁
  5. 在我们的应用程序代码中,我们发现每隔一段时间(5个中有1个?)应用整个表失败。 i2c_smbus_write_byte_data有时会失败,有时会失败。有时它在设置页面寄存器时失败,有时是在实际寄存器中写入数据。

    i2c_smbus_write_byte_data返回代码是-EIO。从设备上的故障寄存器指示“SMBus超时”。

    奇怪的是,我有一个软件工具调用我公开的完全相同的API。在1000个周期内重复使用bash脚本(无延迟)同时运行此工具的两个实例不会产生任何错误。只有应用程序代码才能重现该问题。应用程序代码只运行一次,所以我认为它比压力测试脚本压力小得多。

    我认为不同之处在于该工具以root用户权限运行,而应用程序代码的优先级较低?

    所以我的问题是:

    1. 任何人在随机失败的I2C事务之前遇到过这个问题吗?
    2. 是否可以在内核空间中预先调用i2c_smbus_write_byte_data?这意味着i2c事务已启动,但处理器执行其他操作,使从属设备挂起?
    3. 谢谢,感谢任何帮助。

0 个答案:

没有答案