Я смущен тем, как пользовательские программы, использующие интерфейс Linux i2c dev, могут регистрировать (создавать экземпляры?) Устройства i2c.Linux - необходимо ли регистрировать (создавать экземпляры) устройства i2c перед их использованием?
Из моего понимания, прочитав это: https://www.kernel.org/doc/Documentation/i2c/instantiating-devices, кажется, что мы должны либо:
Определить i2c_board_info-структуру с именем и адресом устройства i2c , сделать i2c_register_board_info()
есть запись devicetree, такие как это:
i2c1: [email protected] { /* ... master properties skipped ... */ clock-frequency = <100000>; [email protected] { compatible = "atmel,24c256"; reg = <0x50>; }; pca9532: [email protected] { compatible = "nxp,pca9532"; gpio-controller; #gpio-cells = <2>; reg = <0x60>; }; };
Instantiate де соперничает явно определяя i2c_board_info-структуру, а затем вызвать i2c_new_device() в инициализации драйвера устройства i2c
Но как это делается для космических программ пользователя с помощью интерфейса i2c-DEV, описанный здесь https://www.kernel.org/doc/Documentation/i2c/dev-interface?
У меня нет элемента devicetree, и когда я grep код для i2c_board_info, i2c_register_board_info() или i2c_new_device(), я ничего не нахожу. Но код ниже все еще работает, как?
#include <linux/i2c-dev.h>
void read_from_device(uint8_t *read_data)
{
int result;
file_desc = open("/dev/i2c-2", O_RDWR);
ioctl(file_desc, I2C_SLAVE, device_address);
i2c_smbus_write_byte_data(file_desc, DEVICE_PAGE_ADDRESS, page_number);
result = i2c_smbus_read_byte_data(file_desc, device_register_address);
*read_data = result;
close(file_desc);
}
Означает ли это, что нам необязательно регистрировать (создавать экземпляры) устройства i2c для их использования? Это относится как к i2c-драйверам, так и к программам пользовательского пространства, использующим интерфейс i2c-dev?
I2C dev - специальный универсальный драйвер. Рассмотрите это как доступ к необработанному устройству. – 0andriy