Автоматическое назначение адресов
Динамическое реконфигурирование шины SMBus — возможность «горячего» подключения/отключения основано на базовых принципах протокола I²C. Автоматическое назначение адресов, появившееся в версии 2.0, использует еще и контрольные байты пакетов (PEC). Задача динамического реконфигурирования включает распознавание фактов подключения/отключения устройств и обеспечение бесконфликтного распределения их адресов. Подключение новых устройств может распознаваться двумя способами. Устройство, которое может работать ведущим устройством, при подключении (после своей инициализации по включению питания) может послать хосту уведомление, содержащее его адрес. Другой вариант обнаружения — периодический опрос устройств ведущим устройством, ведающим «переучетом» всех устройств на шине.
Для динамического бесконфликтного назначения личных адресов устройств используется протокол ARP (Address Resolution Protocol). Назначение адресов основано на стандартном механизме арбитража (разрешения конфликтов) шины SMBus (и I²C). Назначенный адрес запоминается устройством на все время, пока подано питание. Возможны и устройства PSA (Persistent Slave Address), «вспоминающие» ранее назначенный адрес после повторного включения питания. После назначения адреса обмен с устройством выполняется точно так же, как и с устройством с фиксированным адресом. Назначение адресов может выполнять любое ведущее устройство шины SMBus.
Для динамического назначения адреса требуется изоляция устройств — возможность диалога ведущего устройства-нумератора с каждым устройством без помех со стороны других устройств (типичная задача настройки системы PnP). Изоляция основана на уникальном идентификаторе устройства UDID (Unique Device Identifier) — 128-битной структуре, содержащей описание возможностей, версию, идентификаторы производителя, устройства, подсистемы и специфическую информацию. Идентификатор начинается с байта возможностей (Device Capabilities), в котором два старших бита характеризуют способности динамической адресации, а младший бит — поддержку PEC. Чтение идентификатора выполняется ведущим устройством ARP по протоколу блочного чтения по «дежурному» адресу SMBus. На это чтение отзываются все устройства с еще не назначенными адресами, и на арбитраже этой операции работает изоляция устройств. Первый считанный байт (указатель длины) у всех устройств одинаков, по нему конфликтов нет. Далее устройства передают идентификаторы, и в арбитраже будут иметь приоритет те устройства, у которых нулевое значение бит данных встретится раньше. С учетом этого принята следующая кодировка классов устройств в старших битах первого байта идентификатора:
♦ 00 — устройства с фиксированными адресами, идентифицируются в первую очередь;
♦ 01 — динамические устойчивые (persistent) адреса устройств PSA;
♦ 10 — динамические изменчивые (volatile) адреса;
♦ 11 — устройства со случайными номерами, идентифицируются в последнюю очередь.
Младший бит этого байта указывает на поддержку PEC и всех возможностей, основанных на идентификаторе. При нулевом значении этого бита о поддержке PEC ничего определенного сказать нельзя.
Последний элемент UDID — 32-битный идентификатор устройства, играющий важную роль в распознавании похожих устройств. Это может быть либо число, назначаемое изготовителем (отвечающим за его неповторимость), либо случайное число, генерируемое (и запоминаемое) устройством каждый раз при включении или выполнении команды сброса.
Устройство, поддерживающее ARP, должно иметь специальные флаги :
♦ AR (Address Resolved) — данному устройству процедурой ARP назначен адрес;
♦ AV (Address Valid) — устройство имеет действительный личный адрес, на который оно отзывается в обычных транзакциях (при AV=0 устройство должно игнорировать все адреса, кроме «дежурного»).
При AV=AR=0 устройство не имеет личного адреса и должно участвовать в процессе ARP (отвечать на общий опрос идентификатора). При AV=1 и AR=0 устройство имеет личный адрес, но должно участвовать в ARP. При AV=AR=1 устройство имеет личный адрес, но не должно отвечать на общий запрос идентификатора. При этом оно должно отрабатывать адресованную ему команду назначения адреса (и впоследствии пользоваться новым назначенным адресом). Комбинация AV=0 и AR=1 недопустима.
Для протокола ARP введены специальные команды.
♦ Get UDID (general) — общий запрос идентификатора — команда чтения блока данных с адресом 1100 001 и кодом команды 3. На нее устройства, поддерживающие ARP, отвечают посылкой блока с длиной 17 байт, сопровождаемого PEC. Первые 16 байт блока — UDID, 17-й байт — адрес устройства (с единицей в младшем бите). Если у устройства флаг AV=0, оно вместо адреса передает код «1111 111». Команда не влияет на флаги AV и AR.
♦ Assign address — назначить адрес — команда записи блока данных с адресом 1100 001 и кодом команды 4 и длиной 17 байт, сопровождаемого PEC. Первые 16 байт блока — UDID, 17-й байт — назначаемый адрес устройства (младший бит игнорируется). По этой команде устройство, обнаружившее полное совпадение UDID со своим собственным, устанавливает флаги AV=AR=1.
♦ Get UDID (directed) — направленный запрос идентификатора — команда чтения блока данных с адресом 1100 001, в поле кода команды находится адрес интересующего устройства с единицей в младшем бите. На нее отвечает только устройство, опознавшее свой адрес в поле команды, и отвечает посылкой блока с длиной 17 байт, сопровождаемого PEC. Первые 16 байт блока — UDID, 17-й байт — адрес устройства (с единицей в младшем бите). Команда не влияет на флаги AV и AR.
♦ Reset device (general) — общий сброс устройства — посылка по адресу 1100 001 байта команды с кодом 2, сопровождаемого байтом PEC. По этой команде все устройства инициализируются и обнуляют флаги AR и AV (PSA-устройства флага AV не изменяют).
♦ Reset device ARP (dirеcted) — направленный сброс устройства — посылка по адресу 1100 001 байта с адресом целевого устройства (с нулем в младшем бите), сопровождаемого байтом PEC. По этой команде выбранное устройство инициализируется и обнуляет флаги AR и AV (PSA-устройства флага AV не изменяют).
♦ Notify ARP master — уведомление ведущего устройства ARP — посылка на адрес 0001 000 байта с «дежурным» адресом 1100 0010, за которым следуют два байта нулей. Устройство может посылать это уведомление о необходимости выполнения ARP при включении питания, а также при обнаружении коллизии в процессе выполнении чтения данных по индивидуальному адресу устройства.
На каждый байт команд ARP-устройства, поддерживающие этот протокол, отвечают подтверждением ACK. Отсутствие подтверждений трактуется ведущим ARP-устройством как отсутствие ARP-устройств на шине.
«Переучет» и назначение адресов вкратце выглядит следующим образом: ведущее ARP-устройство выполняет команду общего запроса идентификатора и по ней получает UDID и, возможно, адрес первого «победителя» в арбитраже. Далее этому победителю назначается личный адрес — тот же или по усмотрению ведущего ARP-устройства, после чего он уже не участвует в арбитраже по общему запросу. Сведения об устройстве и его адрес ведущим ARP-устройством заносятся в таблицу устройств. После этого общий запрос и назначение адреса повторяются снова и снова, пока все ARP-устройства не будут удовлетворены. Признаком «общего удовлетворения» для ведущего ARP-устройства будет отсутствие подтверждений приема команд общего запроса.