2016-12-22 1 views
0

Я смущен тем, как пользовательские программы, использующие интерфейс Linux i2c dev, могут регистрировать (создавать экземпляры?) Устройства i2c.Linux - необходимо ли регистрировать (создавать экземпляры) устройства i2c перед их использованием?

Из моего понимания, прочитав это: https://www.kernel.org/doc/Documentation/i2c/instantiating-devices, кажется, что мы должны либо:

  1. Определить i2c_board_info-структуру с именем и адресом устройства i2c , сделать i2c_register_board_info()

  2. есть запись 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>; 
        }; 
    }; 
    
  3. 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?

+0

I2C dev - специальный универсальный драйвер. Рассмотрите это как доступ к необработанному устройству. – 0andriy

ответ

1

Драйвер i2c-dev привязывается к шине (i2c_adapter), а не к определенному устройству i2c (i2c_client). Поэтому вам нужно только создать устройство шины для использования i2c-dev, а добавление устройств для клиентов не требуется. Фактически, вы обнаружите, что i2c-dev не позволит вам использовать адрес I2C, привязанный к другому драйверу, если вы не используете I2C_SLAVE_FORCE ioctl.

Это противоположность драйверу spidev, который привязывается к определенному ведомому устройству spi, а не к шине в целом. I2C предшествует современной модели устройства Linux, а некоторые вещи отличаются от других, чем в других местах.

Если вы хотите, чтобы драйвер ядра управлял устройством I2C, тогда должно быть устройство для подключения драйвера. Исключением могут быть так называемые «старые стили» I2C-драйверов, которые исследуют набор адресов и привязываются к устройствам, если они найдены, которые выглядят правильно.

+0

Очень хорошо объяснил, спасибо. – Splaty

Смежные вопросы