我已经编写了一个快速用户空间程序,可以使用此处描述的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);
}
所以两个可能的关键部分:
答案 0 :(得分:2)
I2C_SLAVE
ioctl()设置的I2C从设备地址存储在每次i2c_client
打开时分配的/dev/i2c-X
中。因此,这些信息是每个&#34;开放的本地信息。 / dev / i2c-X。
关于在I2C设备中设置页面寄存器,只要没有其他进程与同一I2C设备通信,它就可以。
一般来说,如果您担心多个进程对一个设备的访问,您应该为该设备编写一个Linux内核驱动程序。