Linux的i2c dev接口有多个进程

时间:2016-12-15 20:27:06

标签: linux multithreading embedded-linux i2c

我已经编写了一个快速用户空间程序,可以使用此处描述的i2c dev界面访问i2c设备:https://www.kernel.org/doc/Documentation/i2c/dev-interface

问题在于,我不确定如何使这个多进程和多线程安全,或者Linux已经处理过这个问题。

这是代码的准系统:

#include <linux/i2c-dev.h>

void read_from_device(void)
{
  int result;

  file_desc = open(/dev/i2c-2, O_RDWR);

  /* Possible critical section #1 starting here? */
  ioctl(file_desc, I2C_SLAVE, device_address);

  /* Possible critical section #2 starting here
   * This device requires writing to a page register first
   * before accessing the wanted register */
  i2c_smbus_write_byte_data(file_desc, DEVICE_PAGE_ADDRESS, page_number);

  /* I don't want another process in come in between here and
   * setting a different page address before accessing the register*/

  result = i2c_smbus_read_byte_data(file_desc, device_register_address);

  /* Critical section end for both possibilities */

  close(file_desc);
}

所以两个可能的关键部分:

  1. Linux的i2c dev接口是否处理设置I2C_SLAVE的多个进程?含义:一旦我为此适配器/ dev / i2c-2设置了I2C_SLAVE,是否可以进入另一个进程并将其更改为总线上的另一个设备?
  2. 在设备上设置页面注册表然后设置它自己的page_number之后,我不想让另一个进程进入,然后我的读取将是不正确的。如here所述的流程共享互斥锁是否合适?
  3. 其他人提出了类似的问题here,并且响应是Linux非常好地处理对同一适配器的多个进程访问。我想确认这意味着什么以及我需要从用户空间担心的线程安全访问的哪些部分。

1 个答案:

答案 0 :(得分:2)

I2C_SLAVE ioctl()设置的I2C从设备地址存储在每次i2c_client打开时分配的/dev/i2c-X中。因此,这些信息是每个&#34;开放的本地信息。 / dev / i2c-X。

关于在I2C设备中设置页面寄存器,只要没有其他进程与同一I2C设备通信,它就可以。

一般来说,如果您担心多个进程对一个设备的访问,您应该为该设备编写一个Linux内核驱动程序。