I2C и SMBus

Шины: зачем их несколько

I2C — двухпроводная шина управления. Два провода: SDA (данные) и SCL (тактовая частота). По ним десятки микросхем обмениваются байтами: датчики, тачпад, микросхема управления питанием, память монитора.

В отличие от USB и PCIe, здесь никто не представляется. Устройство не сообщает «я здесь, я такое-то» — у него есть только адрес, и обращаться к нему нужно, зная этот адрес. Нет перечисления — нет и «списка устройств»: есть «кто ответил на этом адресе».

Как устроено

  • контроллер (адаптер) — единственный ведущий на шине, обычно в чипсете или в видеоядре;
  • устройства — ведомые, каждое со своим 7-битным адресом (всего до 112 адресов);
  • линии с открытым стоком (open-drain) с подтягивающими резисторами: несколько устройств могут тянуть линию вниз, не мешая друг другу;
  • скорости: 100 кГц (стандарт), 400 кГц (fast), 1 МГц, 3,4 МГц (high-speed);
  • растягивание такта (clock stretching): медленное устройство может придержать SCL, пока не будет готово.

SMBus — подмножество I2C с таймаутами и более строгими правилами. Его используют для служебных задач: питание, температура, память SPD. В lspci он виден как отдельное устройство (00:1f.4 SMBus: Intel Cannon Point-LP SMBus Controller), и в системе это ещё один адаптер I2C.

Что на I2C в ноутбуке

Устройство Зачем на I2C
Микросхема управления (EC) Батарея, зарядка, температура, вентилятор
Тачпад Некоторые модели: координаты и настройки
Акселерометр Датчик падения (защита диска)
DDC/EDID монитора Чтение паспорта матрицы: производитель, режимы
Термодатчики Температуры зон
TPM (иногда) Модуль доверенной загрузки

EDID — самый наглядный пример: по двум проводам DDC монитор отдаёт 128 байт описания себя. Видеодрайвер читает их при подключении и понимает, какие режимы поддерживает матрица.

Как смотреть

$ ls /sys/bus/i2c/devices   # «шина-адрес»: 4-0050 = шина 4, адрес 0x50
$ ls /dev/i2c-*             # адаптеры, доступные программам
$ i2cdetect -l              # список адаптеров с именами (пакет i2c-tools)
$ i2cdetect -y 4            # просканировать адреса на шине 4

Осторожно со сканированием. i2cdetect -y N перебирает адреса и шлёт запросы. Большинство устройств это переживает, но некоторые (например, микросхемы управления питанием) на «чужой» запрос могут отреагировать непредсказуемо. Смотреть — можно, писать — нет: i2cset по неверному адресу способен испортить настройки платформы. Это инструмент для тех, кто знает, что делает.

Проверено на этой машине

В ноутбуке двенадцать адаптеров (i2c-0 … i2c-11): часть — от четырёх контроллеров чипсета, часть — от видеоядра (линии DDC), один — от SMBus. Устройства видны только на четвёртой шине:

$ ls /sys/bus/i2c/devices
4-0036
4-0037
4-0050

То есть на i2c-4 три устройства: адреса 0x36, 0x37 и 0x50. 0x50 — типичный адрес EEPROM; что именно за микросхемы на 0x36 и 0x37, по адресу не определить, нужна документация Dell.

А вот EDID матрицы читается целиком — по DDC, которая тоже I2C:

$ ls -l /sys/class/drm/card1-eDP-1/edid
$ xxd /sys/class/drm/card1-eDP-1/edid | head -3
00000000: 00ff ffff ffff ff00 0610 3d63 ...

Разбираем эти 128 байт:

Поле Значение на этой машине
Производитель (байты 8–9) AUO (AU Optronics)
Код продукта (байты 10–11) 0x633d
Год выпуска 2019
Режим из первого блока 1920×1080, пиксельклок 51,75 МГц

Это ровно тот «паспорт матрицы», о котором говорят в характеристиках ноутбука: 14-дюймовый экран Full HD производства AUO.

Где I2C не подходит

I2C — шина управления, а не данных. По двум проводам не передать видео с камеры или содержимое диска: для этого есть USB и PCIe. Поэтому деление простое: если устройству нужны байты «настроить и спросить» — I2C; если нужны мегабайты — другая шина.

Источники

  • Спецификация I2C: https://www.i2c-bus.org/ и NXP (бывшая Philips, автор шины).
  • Спецификация SMBus: https://smbus.org/.
  • Документация ядра: https://docs.kernel.org/i2c/ — подсистема I2C.
  • EDID: стандарт VESA; утилита edid-decode (пакет edid-decode).
  • man 8 i2cdetect, man 8 i2cget, man 8 i2cset.
  • Адаптеры, адреса и EDID — с ноутбука Dell Latitude 7400 (Ubuntu 26.04), 25.10.2026.

Что ещё не проверено

  • Что за микросхемы на адресах 0x36 и 0x37 — не установлено: нужна документация производителя. Названо только типичное назначение 0x50.
  • i2cdetect -l на машине не запускался (утилита не установлена), поэтому привязка «адаптер → контроллер» взята из /sys, а не из вывода утилиты.
  • Запись на I2C (i2cset) намеренно не проверялась: риск испортить настройки платформы выше пользы от эксперимента.
Оценка статьи 0

Комментарии

Пока комментариев нет.