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) намеренно не проверялась: риск испортить настройки платформы выше пользы от эксперимента.
Комментарии
Пока комментариев нет.