Обзор I2C в Linux

Как запустить команду «скрипт» («script») в Linux Обзоры

В этой статье мы рассмотрим базовое введение в I2C и реализацию I2C в Linux. Мы рассмотрим подсистему I2C в ядре Linux и несколько примеров для связи ведущего и ведомого I2C.

Описание

I2C расшифровывается как Inter Integrated Circuit, это встроенный протокол, используемый для связи между двумя микросхемами. Это последовательный двухпроводной протокол. Это следует за режимом ведущего ведомого. Мастер I2C всегда инициирует связь, а часы для связи также предоставляются мастером I2C. К двум линиям может быть подключено несколько устройств. В конфигурации с одним ведущим и многими ведомыми каждое ведомое устройство будет отличаться уникальным адресом ведомого.

Пример конфигурации одного ведущего и нескольких ведомых устройств:

Пример конфигурации одного ведущего и нескольких ведомых устройств

На приведенной выше блок-схеме мы видим, что есть один главный и 3 подчиненных устройства с адресами, указанными в поле каждого подчиненного устройства.

Протокол I2C

Общая последовательность сообщений I2C, используемых для связи между ведущим и ведомым, показана ниже:

Start —> Address + R/W byte —> Ack —> Data byte1 —> Ack —> Data byte2 —> Ack —> Data byte3 —> Ack —> Stop

Начало : условие, генерируемое мастером, чтобы указать, что он хочет связаться с ведомым устройством.

Адрес + байт чтения / записи: 7-битный адрес подчиненного устройства и 1 бит, указывающий, является ли операция чтением или записью.

Подтверждение : подтверждение всегда отправляется для каждой передачи байта. Он отправляется принимающим устройством.

Стоп : после завершения передачи контроллер / ведущий отправит условие остановки для завершения передачи.

В Linux драйверы I2C разделены на три логических уровня:

  1. master/adapter driver
  2. I2C-core layer
  3. slave/client driver

Драйверы I2C Master / Adapter

Они расположены в дереве исходных текстов ядра по пути: drivers / I2C / busses /. Для каждого мастера или контроллера I2C на этом пути должен присутствовать драйвер. Это драйвер, который регистрируется на уровне ядра I2C и контролирует / управляет шинами I2C. Это драйвер, который обменивается данными с ведомыми устройствами I2C по шинам I2C, имеющимся на платформе.

Драйверы I2C-Core

Это общая логика ядра I2C в Linux. Это обычное явление и не зависит от какого-либо конкретного ведущего или ведомого устройства I2C. Это основная реализация подсистемы I2C в Linux.

Подчиненный / клиентский драйвер I2C

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

Включение драйверов I2C в ядре Linux

Реализация, связанная с ядром I2C, будет включена с флагами конфигурации ядра I2C Core. Драйвер I2C Master также будет включен с контроллером I2C конкретной платы. Точно так же должен быть включен один флаг конфигурации для ведомого драйвера I2C.

Все необходимые конфигурации можно активировать двумя способами. Один как встроенный драйвер или как модуль ядра. Модули ядра дают нам возможность загружать их как среду выполнения без изменения или компиляции ядра Linux.

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

Создание экземпляров устройств I2C

В Linux существуют разные способы создания экземпляров устройств I2C. Два широко используемых метода: статический и динамический.

Статический : в системах ARM дерево устройств можно использовать для создания экземпляра устройства I2C.

В дерево устройств можно добавить конкретный узел устройства. Пример объявления дерева устройств для устройства I2C:

i2C0: i2C@60000000 {

eeprom@50 {
compatible = «atmel,eeprom-at»;
reg = <0x50>;
};

rtc@60 {
compatible = «rtc,rtc-maxim»;
reg = <0x60>;
};
};

В приведенном выше примере создается экземпляр 2 ведомых устройств I2C. Одно устройство EEPROM, а другое устройство RTC. После запуска системы эти записи можно будет найти в / sys / bus / I2C / devices / I2C-0 /. Оба будут созданы внутри каталога I2C-0, потому что они размещены внутри узла I2C 0.

Динамический : экземпляр устройства I2C во время выполнения может быть создан с помощью файлов sysfs.

Для каждой шины I2C есть два файла sysfs. new_device и delete_device, оба файла предназначены только для записи, и в эти файлы можно записать адрес ведомого устройства I2C для создания экземпляра устройства и удаления экземпляра устройства.
Чтобы создать устройство I2C, эквивалентное устройствам, определенным в дереве устройств в предыдущем примере.

Создайте экземпляр EEPROM с адресом подчиненного устройства 0×50:

echo eeprom 0x50 > /sys/bus/i2c/devices/i2c-0/new_device

Удаление экземпляра устройства EEPROM:

echo 0x50 > /sys/bus/i2c/devices/i2c-0/delete_device

Затем зондирование устройства с драйвером также может быть выполнено из файлов sysfs: есть два файла только для записи, привязка и отключение, связанные с каждым драйвером. Экспорт идентификатора устройства в файлы привязки и отмены привязки приводит к связыванию и отключению драйвера от устройства. Например, драйвер rtc-ds1307 имеет следующие файлы в sysfs, как обсуждалось ранее.

[root]ls /sys/bus/i2c/drivers/rtc-ds1307/
bind    uevent  unbind
[root]$

Давайте еще немного поговорим о файлах sysfs подсистемы I2C:

I2C sysfs находится по адресу: / sys / bus / I2C /

Снимок I2C sysfs:

Снимок I2C sysfs

Как видим, есть два каталога: устройства и драйверы.

Как видим, есть два каталога устройства и драйверы

Устройства будут содержать все экземпляры устройств, присутствующие и известные ядру Linux. На нашей плате у нас есть следующие устройства I2C в каталоге устройств:

Драйверы будут содержать все драйверы I2C, существующие и известные ядру Linux. На нашей плате у нас есть следующие драйверы I2C в каталоге драйверов:

Для привязки и отмены привязки устройств с драйверами внутри

Для привязки и отмены привязки устройств с драйверами внутри каждого драйвера есть два файла только для записи. Связь любого устройства с драйвером может быть выполнена путем повторения идентификатора устройства в файле привязки, а отключение может быть выполнено путем отображения идентификатора устройства в файле отмены привязки.

Связывание устройства I2C с драйвером I2C

[root]echo 1-0068 > /sys/bus/i2c/drivers/rtc-ds1307/bind
[592061.085104] rtc-ds1307 1-0068: registered as rtc0
[root]$

Подтверждение успешной привязки можно сделать, проверив программную ссылку, созданную после операции привязки. Программную ссылку нового устройства можно увидеть в приведенном ниже экземпляре журнала после выполнения команды, упомянутой в разделе привязки:

[root]ls /sys/bus/i2c/drivers/rtc-ds1307/
1-0068  bind    uevent  unbind
[root]$

Отмена привязки устройства I2C с драйвером I2C

[root]echo 1-0068 > /sys/bus/i2c/drivers/rtc-ds1307/unbind

Подтверждение успешной отмены привязки можно сделать, проверив, что узел устройства soft link, созданный ранее в каталоге драйверов, будет удален. Если мы проверим содержимое каталога драйверов, мы должны увидеть снимок журналов, как показано ниже:

[root]ls /sys/bus/i2c/drivers/rtc-ds1307
bind    uevent  unbind
[root]$

Приложения I2C или варианты использования в отношении Linux

  1. Устройство EEPROM для хранения небольших данных, объем памяти составляет несколько КБ.
  2. Устройство RTC, используемое для хранения данных в реальном времени. Устройство используется для отслеживания времени, даже когда основная система выключена.
  3. Многие сенсорные устройства HW, такие как термодатчики, датчики тока и датчики напряжения, поставляются в виде устройств I2C.
  4. Микросхемы управления вентилятором также поставляются как устройства I2C.

I2C-инструменты

Приложения пользовательского пространства в среде Linux используются для доступа к ведомым устройствам I2C. I2Cdetect, I2Cget, I2Cset, I2Cdump и I2Ctransfer — это команды, доступные при установке инструментов I2C на любой платформе Linux. С помощью этих инструментов можно получить доступ ко всем вариантам использования устройств, обсуждаемым в разделах о приложениях I2C.

Нет необходимости в драйвере ведомого устройства I2C при попытке доступа к ведомому устройству с помощью инструментов I2C. Эти инструменты могут позволить нам получить доступ к устройствам в необработанном формате. Подробнее об этих утилитах читайте в другой статье.

Заключение

Мы обсуждали подсистему I2C в Linux. Был предоставлен фреймворк I2C с обзором организации логического кода. Мы также обсудили файлы sysfs I2C. Мы обсудили последовательность сообщений связи I2C. Мы прошли через создание экземпляра устройства двумя способами: статическим и динамическим. Мы также исследовали привязку / отвязку драйверов с устройствами. Некоторые приложения I2C реального времени.

Читайте также:  Обзор Oppo Pad Air
Оцените статью
ПОПУЛЯРНЫЕ ТЕХНОЛОГИИ
Добавить комментарий