Как USB-тестер читает eMarker
I NРешил разобраться с тем, что делает usb-тестер для чтения eMarker в кабеле.
Начнем с того, как этот маркер читается штатным способом, в ходе согласования power delivery. Опуская экзотику, типа обмена источника VCONN, работа с маркером сводится к единственному чтению маркера источником (source) в процессе согласования параметров протокола. Сильно упрощая процесс, можно выделить следующие шаги:
- Начинаем с выключенного состояния, на VBUS ноль
- Подключаем кабель с двух сторон к источнику и приемнику, через линию CC в кабеле пошел ток, потому что у источника контакты CC1 и CC2 подключены через резистор Rd к напряжению (pullup), а у потребителя (sink) через резистор Rp к земле (pulldown). Линия CC соединяет один из двух контактов у источника с контактом у потребителя. Такое соединение определяет два параметра: взаимное положение разъемов на каждой из двух сторон кабеля (это определяет какие линии будут использоваться для передачи данных) и какой ток можно получить от источника (0.5/1.5/3A в зависимости от сопротивления Rd). Для современного источника это даст напряжение примерно равное 1.6V (там может быть от 0.25 до 2.04V в зависимости от возможностей source).
- Только в этот момент на линию VBUS source подаёт напряжение 5V
- Source смотрит на другую CC линию. Если там висит сопротивление Ra в режиме pulldown (и напряжение до 0.15V ), то линия CC2 называется VCONN и на неё подается 3-5V (примерно 3.2V в реальности) для питания eMarker. VCONN - это не полный провод между разъемами, а провод до eMarker. То есть VCONN не доходит до другого конца кабеля. Низкое и фиксированное напряжение позволяет чипу питаться от VCONN без LDO-стабилизатора и не завязываться на VBUS, на котором может быть и выше 5V. Сопротивления Rd, Rp и Ra подобраны так, чтобы каждая из сторон могла однозначно определить, к чему из CC1 и CC2 подключена линия CC, и по какой линии питать маркер.
- Source посылает маркеру (адрес ближайшего маркера обозначается как SOP') запрос Discover Identity
- Ответ маркера как раз и содержит параметры чипа: максимальный ток, напряжение, вендора, длину и скорость передачи данных. Обратите внимание, что ответ кабеля повлияет на список профилей, которые в дальнейшем source отдаст sinkу. Если кабель не поддерживает EPR, то источник не покажет EPR-профили. Этот ответ умеют подменять тестеры, опци обычно называется line simultor.
- Вдогонку source может запросить Discover SVIDs (список альтернативных режимов) или Get_Manufacturer_info для получения идентификатора вендора кабеля
- После этого напряжение с VCONN можно снять, если кабель оказался пассивным и не требует напряжения для дальнейшей работы. Но не все source так поступают.
Часть действий опциональна, часть действий может выполняться заранее. Вообще, стандарты USB изобилуют модальными глаголами shall или may, которые дают очень большую вариативность того, что реально происходит на шине.
Возвращаемся к чтению маркера тестером. Тестеру нужно изменить роль: от пассивного устройства между source и sink (это штатная роль любого тестера при показе тока и напряжения), тестер должен сам стать source и запросить информацию у маркера. И для изменения роли нужно исполнить два противоречивых требования: с одной стороны нужно запитать тестер от источника, с другой стороны источник не должен брать на себя роль source на шине, роль source должна быть у тестера. Для старых тестеров активная роль включется переключателем PD, что позволяет тестеру управлять линиями CC1/CC2. Заметим, что для чтения PD профилей у source тестеру нужно наоборот, принять роль sink (для этого тоже нужно включить PD).
Самый простой способ исполнить указанные требования - это подключить питание тестера через разъем HID (вариант 1). В этом случае собственное питание никак не проявляется на шине и тем, что будет выставляться на CC1/CC2 полностью зависит от тестера. А вот линия VBUS в таком режиме будет по нулям.
Инструкции предлагают еще несколько схем подключения питания тестера для чтения маркера:
• Вариант 2. Запитываем тестер через входящий USB A (папу)
• Вариант 3. Запитываем тестер через вход Type C (папу) с переходником USB A (папа) в Type C (мама)
• Вариант 4. Запитываем тестер через выход Type C (маму) через тестируемый кабель и переходник USB A (папа) в Type C (мама). Кабель оказывается между тестером и переходником.


Во всех вариантах кроме четвертого, тестируемый кабель подключается к выходу тестера, а второй конец висит в воздухе. В варианте 4 кабель закреплен между питанием с переходником и тестером.
Какой из этих вариантов правильный с точки зрения стандартов USB? Никакой. Отличие между вариантами в том, что в первом варианте отсутствует напряжение на VBUS, а в остальных вариантах на VBUS будет 5V от source, который будет давать фиксированное напряжение (но возможность управлять напряжением будет убрана). В вариантах 2-4 на состояние шины также будет влиять pull-up резистор на 56кОм между VBUS и CC, который находится в любом переходнике с USB A на Type C. Но нигде не будет нужного pull-down резистора как в случае штатного подключения sink к кабелю.
Удивительно, что в недрах стандарта USB есть похожая ситуация. Если на одном из CC нет связи с землей, а на другом висит pull-down сопротивление Ra, то эта ситуация должно диагностироваться как "Присоединен кабель с подключенным питанием без sink или включен режим избавления от коррозии". И в качестве реакции для source написано: слушать CC для определения присоединения sink и не подавать напряжение ни на VBUS ни на VCONN.
Вот в такой конфигурации запускается процесс запроса маркера. Что делает тестер? Тестер срезает все углы, без pull-down резистора он не может определить конфигурацию кабеля. Поэтому он пропускает все предварительные ласки, не трогает VBUS и сразу начинает подавать поочередно на CC1 и CC2 3.2V (это напряжение VCONN) и посылать маркеру запрос Discover Identity на линию, противоположную той, куда он подал VCONN. Исключение - KM003C, который поднимает напряжение VCOMM не последовательно, а сразу на двух линиях СС1 и CC2. На руку этой конструкции играет то, что линия VCONN разомкнута внутри кабеля, то есть отсутствие устройства sink не мешает питать маркер.
Почему такая кривая схема работает? Потому что скорее всего питание большинства чипов маркеров сделано просто: на VCONN висит резистор Ra (или аналогичная нагрузка внутри чипа) и маркер безусловно включается по подаче напряжения на VCONN. До другой линии и до напряжения на VBUS чипу нет дела, он включается и готов отвечать на запросы по линии CC невзирая на то, что она не заземлена.
Почему же иногда не срабатывают определения маркеров? Причина в нестандартности подхода с отсутствующим sinkом, при котором на откуп конфигурации отдано напряжение на VBUS и напряжение на линии CC. Если вдруг кабель (его электронные компоненты) ожидает правильных напряжений от VBUS или CC, то конструкция с питанием через HID не сработает. Но мне не попался ни один кабель, который бы не работал в конфигурации питания через HID (вариант 1). UPD: попался такой кабель. Описал во второй части статьи https://telegra.ph/Pochemu-ne-chitaetsya-eMarker-02-05
Если хочется кошерности конфигурации, то есть интересный новый адаптер от Ryken, который идёт вместе с сопротивлениями. Это плата с входами и выходами USB A/Type C, которая нужна для отключения линий данных D+/D- от тестера. Если в первой версии платы линии просто не были разведены, то в новой версии есть переключатели, позволяющие настраивать отключение D+/D-/CC1/CC2 и (главное для нас) подтягивать линии CC к 5.1кОм. Повесив такой адаптер на свободный конец кабеля мы получим практически легальную конфигурацию.