Поддержка SMBus в BIOS и ACPI
Шина SMBus, в отличие от ACCESS.bus, сразу получила спецификацию ее поддержки на уровне BIOS . Позже появились спецификации, позволяющие интегрировать устройства SMBus в систему ACPI.
В 1995 г. была опубликована спецификация интерфейса SMBus BIOS — System Management Bus BIOS Interface Specification, основные идеи которой вкратце изложены ниже. Интерфейс позволяет верхним уровням ПО абстрагироваться от аппаратной реализации хост-контроллера. Поддержка BIOS обеспечивается для трех типов режимов работы процессора: реального (и V86), защищенного 16-разрядного и защищенного 32-разрядного.
Вызов функций может выполняться либо через BIOS Int 15h (в реальном режиме и в V86), либо через точку входа, полученную при подключении в соответствующем режиме. Для подключения (и отключения) также используется сервис BIOS Int 15h; после подключения доступ через Int 15h блокируется (до отключения). В защищенном режиме вызов интерфейсных функций возможен только через точку входа, полученную при подключении. Поддержка точки входа для реального режима необязательна.
Анализатор сигналов SMBus на примере контроллера заряда батареи ноутбука.
Спецификация SMBus BIOS обеспечивает хост-центрическое обращение к абонентам шины: по инициативе вызывающей программы хост-контроллер посылает устройству команду, которая может предполагать и немедленный ответ устройства. Однако устройства могут посылать хосту сообщения по собственной инициативе, при этом они обязаны использовать протокол Write Word. Хост способен помещать принятые сообщения в небольшую очередь, из которой они могут программно извлекаться путем вызова функции 7 (программа должна периодически выполнять этот вызов для проверки наличия сообщений в очереди). В очереди каждое сообщение представлено байтом адреса источника и парой байт тела сообщения.
Шина SMBus тесно связана с оборудованием, управляющим питанием и участвующим в генерации запросов системного прерывания SMI (System Management Interrupt — особое аппаратное прерывание процессора) и их обработки. Из-за этого в BIOS введен специальный механизм, позволяющий обнаружить обработку SMI во время выполнения транзакций и в иное время. Это необходимо, поскольку обработчик SMI, работающий в режиме SMM, совершенно невидим прикладной программе, а результаты его работы могут существенно влиять на работу программы, вызывающей BIOS SMBus.
Функции общих обращений к SMBus :
SMBus Installation Check (01h) — проверка наличия функций;
SMBus Real Mode Connect (02h) — подключение в реальном режиме;
SMBus 16-Bit Connect (03h) — подключение в 16-битном защищенном режиме;
SMBus 32-Bit Connect (04h) — подключение в 32-битном защищенном режиме;
SMBus Disconnect (05h) — отключение от сервиса;
SMBus Deviсе Address (06h) — получение списка адресов устройств SMBus;
SMBus Critical Messages (07h) — чтение сообщений устройств, переданных хосту.
Для взаимодействия с конкретными устройствами SMBus предназначен набор функций, позволяющих генерировать запросы протокольных команд SMBus и получать результаты их выполнения. Функции запросов и получения ответов разделены, что позволяет на время выполнения (и передачи) довольно длительных команд не занимать время центрального процессора. Большинство протокольных команд вводится за один вызов BIOS; исключение составляет команда записи блока, данные для которой передаются за один или более последующих запросов продолжения. Результаты большинства команд также принимаются за один вызов; результат чтения блока получается за несколько вызовов продолжения.
✅ Анализ данных на шине SMBus (I2C) в ноутбуке на примере BQ24780s
Вызовы протокольных команд устройств SMBus :
SMBus Request (10h) — запрос команды устройству;
SMBus Request Continuation (11h) — продолжение запроса для записи блока;
SMBus Request Abort (12h) — отказ от выполнения ранее посланного запроса;
SMBus Request Data and Status (13h) — запрос данных и состояния.
Шина SMBus является одним из главных коммуникационных средств в ACPI. Интерфейс SMBus для ACPI определен в спецификации SMBus CMI — документе System Management Bus (SMBus) Control Method Interface Specification Version 1.0, опубликованном в конце 1999 г. Этот интерфейс позволяет легко использовать все возможности SMBus независимо от происхождения или особенностей реализации оборудования. Ниже перечислены основные цели спецификации.
Обеспечить эффективный и надежный интерфейс ACPI для аппаратных средств хост-контроллера независимо от его реализации (со встроенным микроконтроллером или без него).
Обеспечить системную синхронизацию доступа ко всем ресурсам SMBus.
Гарантировать соответствие интерфейса версиям 1.0 и 1.1 спецификации SMBus и возможности его расширения для поддержки новых свойств в будущих версиях.
Для успешного функционирования системы требуется поддержка соответствующими драйверами операционной системы. Для управления питанием форум разработчиков «интеллектуальных» батарей — Smart Battery System Implementers Forum (SBS-IF) — разработал спецификацию драйверов для ОС Windows 9x/2000, с которой можно ознакомиться на сайте http://www.sbs-forum.org/smbus/.
Рассмотрение программного интерфейса CMI выходит за рамки данной книги. Отметим лишь, что коды протоколов SMBus, используемые в CMI, отличаются от кодов, используемых в SMBus BIOS. Те же протоколы, но с байтом PEC, кодируются с единицей в старшем бите (значение увеличено на 80h).
11.1.4. Сравнение шин IC, ACCESS.bus и SMBus
Как видно из вышеприведенных описаний, все эти три шины являются «близкими родственниками»; однако они имеют ряд электрических, конструктивных и протокольных отличий.
Электрический интерфейс шин (табл. 11.5) достаточно близок, и при обычном (5 В) питании схем проблем совместимости не возникает (Vdd — напряжение питания).
Таблица 11.5 . Электрические параметры шин IC, ACCESS.bus и SMBus
Параметр | IC | ACCESS.bus внешняя | ACCESS.bus внутренняя | SMBus мощная | SMBus маломощная |
Входной уровень лог. 0, не более | 1,5 В или 0,3 Vdd | 0,3 Vdd | 0,3 Vdd | 0,8 В | 0,8 В |
Входной уровень лог. 1, не менее | 3,0 В или 0,7 Vdd | 0,7 Vdd | 0,7 Vdd | 2,1 В | 2,1 В |
Выходной уровень лог. 0, не более | 0,4 В или 0,2 Vdd при Vdd | 0,6 В | 0,6 В | 0,4 В | 0,4 В |
Выходной ток лог. 0, мА | 0,35 | 0,35 | |||
Максимальная емкость линии шины, пФ | – | ||||
Частота, КГц | 0-100, 0-400, 0-3400 | 0-100 | 0-100 | 10-100 | 10-100 |
Вместо емкости задаются допустимые длительности фронтов и спадов.
Конструктивно выделяется шина ACCESS.Bus (внешняя), в которой определены разъемы и кабели, а также питание (5 В) устройств от шины; в других — нет.
Протокольные различия более существенны, из них отметим лишь следующие.
В шине ACCESS.Bus определены лишь передачи данных ведущим устройством, в остальных шинах ведущее устройство может и принимать данные.
В шинах ACCESS.Bus и SMBus ведущее устройство не имеет права повторного захвата шины ранее, чем через 50 мкс после начала передачи. Сигнал SCL в этой шине может удерживаться на низком уровне не дольше 2 мс. В IC таких ограничений нет.
В шине SMBus ведущее устройство ожидает от ведомого устройства немедленного ответа, в шине ACCESS.Bus ответ приходит независимо, но ожидается не позже чем через 40 мс. В шине SMBus и ведущее устройство, и ведомое устройство могут притормаживать обмен на уровне приема битов, что позволяет им вписываться в свои временные диаграммы (успевать «просыпаться», обрабатывать прерывания).
Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим.
Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций.
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰).
Источник: cyberpedia.su
Делаем собственный имплант для электроники
История от Bloomberg о том, что на материнских платах якобы были установлены некие импланты [Китайцы использовали микрочип, чтобы контролировать американские компьютеры], не прошла незамеченной. После неё многие люди делились идеями по поводу возможности создания подобных имплантов (их предполагаемого размера, возможностей или способа их обнаружения).
Через несколько дней журнал Bloomberg выпустил статью с дополнительными доказательствами. Вот что конкретно подогрело наш интерес:
Легальный сервер отправлял сообщения одним способом, имплант – другим, но казалось, что весь трафик происходит от одного доверенного сервера.
Существуют способы взаимодействия с сетевой картой прямо с материнской платы. Несколько людей указали на то, что можно поиграться с BMC (Baseboard Management Controller – компонент, разрешающий доступ к серверу помимо основного канала), что позволит импланту контролировать BMC и получать доступ к сетевой карте. Но как это работает на практике? Давайте посмотрим, сможем ли мы это воспроизвести.
Начальная позиция
Посмотрим на наличие возможных интерфейсов между NIC (сетевой платой) и BMC. Один из основных протоколов для работы по выделенному каналу – это интеллектуальный интерфейс управления платформой IPMI.
IPMI
Википедия говорит, что IPMI — «интеллектуальный интерфейс управления платформой, предназначенный для автономного мониторинга и управления функциями, встроенными непосредственно в аппаратное и микропрограммное обеспечения серверных платформ. Ключевые характеристики IPMI — мониторинг, восстановление функций управления, журналирование и инвентаризация, которые доступны независимо от процессора, BIOS’a и операционной системы. Функции управления платформой могут быть доступны, даже если система находится в выключенном состоянии». Весьма похоже на то, что нам нужно.
На следующей блок-схеме показан возможный путь реализации проекта:
IPMI на самом деле определяет два Sideband-канала для NIC: SMBus и NC-SI. NC-SI – это современная замена SMBus, поддерживающая увеличенную скорость передачи данных и другие новые возможности. Проблема в том, что ей требуется больше сигналов (порядка 10), и в её работу гораздо сложнее вмешаться в случае, когда мы работаем с имплантом. Так что пока остановимся на SMBus.
SMBus
SMBus (System Management Bus) — последовательный протокол обмена данными для устройств питания. Односторонняя простая двухпроводная шина, обеспечивающая несложные коммуникации. Чаще всего используется в компьютерах для связи материнской платы с источником питания и отправки инструкций вида вкл/выкл. Основан на шине I 2 C, обычно использующейся в микроконтроллерах.
Интерфейсу нужно всего два сигнала (тактовая частота и данные), и третий сигнал — прерывание. Идеально подходящий для игр с имплантом протокол.
Первый контакт
Приходится проявлять смекалку, не имея доступа к материнской плате с BMC. Изучая технические характеристики серверных материнок, мы обнаружили, что некоторые из них используют чип Intel 82574L. Он, согласно документации, обеспечивает «SMBus advanced pass-through interface» – как раз то, что нужно. А что лучше всего, он бывает в формате карт PCI-E.
Доступ к SMBus
Мы сходили в магазин, и теперь у нас есть карточки Intel EXPI9301CTBLK с чипом 82574L. Что теперь?
В документации можно отследить SMB_DAT и SMB_ALRT_N. К счастью, все они оказались доступными на контактных площадках. Вроде бы всё достаточно легко.
NIC PCB. Слева вверху – EEPROM, справа вверху — коннектор для SMBus [ALRT|CLK|DAT]. Обратите внимание, что R39 и R40 отпаяны, что запрещает доступ к SMBus для коннектора PCIe.
Мы подключили зонд I 2 C и просканировали SMBus, но ничего полезного не считали. Документация говорит, что SMBus включается только при установке определённого битового регистра. Это значение загружается с EEPROM. Пришло время копнуть глубже.
Включаем доступ к SMBus
Нам снова помогает документация. Доступ к SMBus определяется значением регистра, загружаемого с NIC EEPROM. К счастью, EEPROM можно прочесть при помощи flashrom. Сбросив содержимое EEPROM, мы можем проанализировать и изменить значения:
> ./flashrom -p buspirate_spi_dev=/dev/hydrabus —read /tmp/flash.dump
flashrom p1.0-87-g9891b75-dirty on Linux 4.18.12-arch1-1-ARCH (x86_64)
flashrom is free software, get the source code at https://flashrom.org
Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Found Winbond flash chip «W25X40» (512 kB, SPI) on buspirate_spi.
Reading flash. done.
Судя по NVM map (глава 6.1 документации), видно, что нам надо изменить два значения:
- Init Control Word 2[MNGM] (Datasheet chapter 6.1.1.6)
- Compatibility[ASF SMBus Connected] (Datasheet chapter 6.1.2.1.1)
- Compatibility[SMBus Connected] (Datasheet chapter 6.1.2.1.1)
После этого нам надо ещё разобраться со значением Checksum. В главе 6.1.2.11 указано, что сумма всех слов в диапазоне [0x00-0x40] должна равняться 0xBABA. Немного Python поможет нам подсчитать правильную контрольную сумму:
import struct
data = open(‘/tmp/flash.mod’, ‘rb’).read()
tot = 0
for i in range(0x3f):
tot = (tot + struct.unpack(‘