что такое usb upstream
Интерфейс USB. Часть 1. Основы
В настоящий момент один из самых популярных интерфейсов — это безусловно USB. Девайсов, которые его используют, просто огромное количество. Это и мышки, и клавиатуры, и принтеры, и сотовые телефоны, и много чего ещё. В отличии от стремительно исчезающего RS-232, USB встречается во всех современных компьютерах, ноутбуках, телефонах… так что, если мы хотим создавать действительно универсальные девайсы, придётся нам этот интерфейс изучать. Вот прямо сейчас и начнём, а заодно, по ходу изучения, попытаемся сами посоздавать каких-нибудь USB-девайсов.
Итак, USB (universal serial bus) — универсальная последовательная шина. Большинство USB-устройств соответствуют спецификациям 1.1 и 2.0. В спецификации 1.1 определены две скорости передачи информации: LS (low speed) — низкая скорость, 1,5 Мбит/с и FS (full speed) — полная скорость, 12 Мбит/с. В редакции 2.0 к ним добавлена ещё и высокая скорость HS (high speed), 480 Мбит/с. Не так давно вышла ещё спецификация — 3.0, но устройства, поддерживающие этот стандарт, пока не очень распространены, поэтому и бог с ней.
Физические устройства на шине USB бывают трёх типов: хост-контроллер, хаб и конечное устройство.
Хост-контроллер — это главный управляющий шиной USB. Именно он обеспечивает связь устройств, подключенных к шине, с компьютером (с ОС и с клиентским ПО). Любые сеансы обмена данными может начинать только хост-контроллер, остальные устройства молчат в тряпочку, пока хост-контроллер к ним не обратится.
Контроллер взаимодействует с ОС через драйвер хост-контроллера (HCD — host controller driver). Этот драйвер привязан к конкретной модели хост-контроллера. Только он знает какие данные, в какие регистры и в каком порядке пихать в хост-контроллер, а также откуда какие данные брать, чтобы хост-контроллер сделал то, чего от него хотят.
Со стороны ОС шиной USB управляет ещё один драйвер — USBD (universal serial bus driver). Ему совершенно пофиг, как там конкретно реализован хост-контроллер и где у него какие регистры (для этого есть HCD), USBD решает общие (неспецифические для конкретного хост-контроллера) вопросы: взаимодействие с клиентским ПО, нумерация устройств на шине, их конфигурирование, распределение питания и пропускной способности шины и так далее. Это, можно сказать, своеобразный диспетчер, который осуществляет общий контроль над шиной и её взаимодействие с внешним миром (с клиентским ПО).
Хост-контроллер — птица гордая и пугливая, поэтому непосредственно ни с кем из подданных он не разговаривает. Для общения с подданными у него есть специальные помощники — хабы (их ещё иногда называют концентраторами).
Хабы — это устройства, которые позволяют физически подключить устройства USB к шине. Они предоставляют порты для подключения, ретранслируют трафик от хост-контроллера к конечным устройствам и обратно, отслеживают состояние и физически управляют электропитанием портов. У хабов есть один восходящий (upstream) порт, — это тот порт, который подключен по направлению к хост-контроллеру, и несколько нисходящих (downstream) портов, — это порты, к которым подключаются конечные устройства. Хабы можно каскадировать, подключая к нисходящему порту хаба ещё один хаб. Самый главный хаб, интегрированный с хост-контроллером, называется корневым хабом (он же — корневой концентратор или root hub).
Другими словами можно сказать, что у хаба есть две основных задачи: 1) создать хост-контроллеру иллюзию, что он непосредственно разговаривает с подключенным к хабу устройством; 2) наблюдать за своим сегментом шины (за девайсами, подключенными к нисходящим портам), сообщать «наверх» обо всех изменениях и, если надо, — подключать и отключать питание портов.
Конечные устройства — это все те полезные устройства, которые мы подключаем к шине USB (флэшки, принтеры, мышки и т.д.)
Нужно сказать, что физические устройства и логические устройства — это не всегда одно и тоже. Существуют, например, такие конечные устройства (называемые составными — compound devices), которые содержат внутри себя хаб, к которому подключено ещё несколько устройств. Несмотря на то, что в этом случае хаб и все, подключенные к нему устройства, запакованы в один корпус, с точки зрения логики шины это будут совершенно разные устройства.
Для логических конечных устройств обычно используют термин «функции». Таким образом, с точки зрения логики шины, устройства на ней можно разделить на хабы и функции (и неважно, запакованы ли они в один корпус или нет). Каждое логическое устройство на шине имеет уникальный адрес (1-127), присваеваемый ему хостом при подключении.
Исходя из описанного выше, получается, что физическая топология шины USB — дерево (ну, потому что хабы можно каскадировать), а логическая топология — звезда, центром которой является хост-контроллер. Физическая и логическая топологии шины USB показаны на рисунке ниже.
Идём дальше. Что же вообще представляет собой логическое устройство USB (как хабы, так и функции)?
Логическое устройство представляет собой набор так называемых конечных точек (endpoints или просто EP). Физически, конечные точки — это просто разные буферы в логическом устройстве USB, через которые происходит обмен данными с хостом. Логичный вопрос — а зачем нам иметь несколько буферов? Ну, просто потому что удобно для разных задач иметь разные буферы. Устройство же у нас может выполнять параллельно несколько разных задач. (Минимум две — отслеживать команды управления от хоста и делать что-то полезное.) У этих разных задач могут могут быть разные степени важности, требования к надёжности, своевременности и скорости доставки данных и, наконец, источники и потребители пересылаемой информации также могут быть разные (источником и потребителем полезной инфы обычно является клиентский драйвер, в то же время всякая управляющая инфа ему обычно нафиг не нужна).
Поскольку для решения описанных выше проблем недостаточно иметь просто разные буферы для разной передаваемой информации, то в дополнение к этому придумали ещё кое-что.
Во-первых, придумали 4 различных типа передач. Для каждой конечной точки должно быть определено, каким из этих типов передач с ней нужно общаться. Типы передач в USB существуют следующие:
Вернёмся к нашим конечным точкам. Для того, чтобы отличить одну точку от другой, — конечные точки, должны иметь уникальный номер. Но это не всё. Кроме номера, каждая конечная точка имеет ещё и направление. IN — если точка предназначена для передачи данных хосту, OUT — если точка предназначена для приёма данных от хоста. Точки с одинаковыми номерами, но с разными направлениями передачи данных — это разные с точки зрения логики шины конечные точки.
Единственное исключение — конечная точка EP0. У неё вообще особый статус. Она является служебной и предназначена для общего управления устройством (конфигурирование, настройка и т.д.). Кроме того, эта конечная точка двунаправленная и она должна обязательно присутствовать в любом USB-устройстве.
Исходя из всего вышеописанного, для идентификации какой-то конечной точки на шине, нам нужно знать адрес устройства, к которому относится конечная точка, её номер в устройстве и направление передачи данных через эту точку.
Поскольку устройство не всегда делает абсолютно всё на что оно только способно, да и способов решения одной и той же задачи оно может иметь несколько, то обычно нет необходимости задействовать абсолютно все конечные точки. Поэтому придумали такие понятия, как интерфейс, конфигурация и альтернативные установки. Интерфейс объединяет конечные точки, предназначенные для решения какой-либо одной задачи. Наборы используемых одновременно интерфейсов называются конфигурациями. Альтернативные установки позволяют включать или отключать какие-то входящие в конфигурацию конечные точки, в зависимости от способа решения задач для которых предназначена эта конфигурация.
Самих конфигураций и альтернативных установок у каждой из этих конфигураций для одного логического устройства может существовать несколько, но в каждый момент времени только один из этих наборов может быть активен. Причём хост должен знать, какой именно набор активен и в соответствии с этим обеспечивать связь с входящими в этот набор конечными точками. Остальные конечные точки, не входящие в активный набор, не будут доступны для связи.
Поясню, что значит «обеспечивать связь с конечными точками». Для связи клиентского ПО с каждой активной конечной точкой хост создаёт коммуникационный канал (communication pipe). Клиентское ПО, которое хочет пообщаться с конечной точкой, должно отправить к соответствующему каналу пакет запроса ввода/вывода (IRP — input/output request packet) и ждать уведомления о завершении его обработки. В IRP указывается только адрес буфера, куда надо складывать или откуда брать данные и длина передачи. Всё остальное за вас сделает хост и обслуживающие его драйвера (USBD и HCD)
В зависимости от типа передач, используемых в канале, коммуникационные каналы делятся на два типа: потоковые (streaming pipes) и каналы сообщений (message pipes).
Коммуникационный канал к точке EP0 является служебным и называется основной канал сообщений (default pipe, control pipe 0). Владельцем основных каналов сообщений всех подключенных устройств является драйвер USBD, поскольку, как мы уже говорили, через EP0 осуществляется конфигурирование и настройка устройства.
На этом, пожалуй, с основами закончим и в следующей статье попробуем более детально рассмотреть механизм передачи данных по интерфейсу USB.
Типы стандартов USB и разница между ними
Содержание
Содержание
Вроде мы слышали, что USB 3.0 — это круче, чем USB 2.0. Но чем именно — знают не все. А тут еще появляются какие-то форматы Gen 1, Gen 2, маркировки Superspeed. Разбираемся, что значат все эти маркировки и чем они отличаются друг от друга. Спойлер: версий USB всего четыре.
USB 2.0
Когда-то было слово только USB 1.0. Сейчас это уже практически архаика, которую даже на старых устройствах почти не встретить. Еще 20 лет назад на смену первопроходцу USB 1.0 пришел улучшенный USB 2.0. Как и первая версия, эта спецификация использует два вида проводов. По витой паре идет передача данных, а по второму типу провода — питание устройства, от которого и идет передача информации. Но такой тип подключения подходил только для устройств с малым потреблением тока. Для принтеров и другой офисной техники использовались свои блоки питания.
USB версии 2.0 могут работать в трех режимах:
USB 3.0
Стандарт USB 3.0 появился в 2008 году и до сих пор используется во многих устройствах. Скорость передачи данных выросла с 480 Мбит/с до 5 Гбит/с. Помимо скорости передачи данных, USB 3.0 отличается от версии 2.0 и силой тока. В отличие от более ранней версии, которая выдавала 500 мА, USB 3.0 способен отдавать до 4.5 Вт (5 В, 900 мА).
Новое поколение USB обратно совместима с предыдущими версиями. То есть USB 3.0 может работать и с разъемами USB 2.0 и даже 1.1. Но в этом случае буду ограничения по скорости. Подключив USB 3.0 к устройству с USB 2.0 скорость, вы получите не больше 480 Мбит/с — стандарт для версии 2.0. И наоборот, кабель 2.0 не станет более скоростным, если подключить его в устройство с USB 3.0. Это связано с количеством проводов, используемых в конкретной технологии. В версии USB 2.0 всего 4 провода, тогда как у USB 3.0 их 8.
Если вы хотите получить скорость передачи, заявленную стандартом USB 3.0, оба устройства и кабель должны быть именно версии 3.0.
USB 3.1
В 2013 году появляется версия USB 3.1 с максимальной заявленной скорость передачи данных до 10 Гбит/с, выходной мощностью до 100 Вт (20 В, 5 А). С появлением USB 3.1 произошла революция в маркировках всех стандартов. Но с ней мы разберемся чуть позже. А пока запомним главное: пропускная способность USB 3.1 увеличилась вдвое по сравнению с версией 3.0. И одновременно с обновленным стандартом появился и принципиально новый разъем — USB type-С. Он навсегда решил проблему неправильного подключения кабеля, так как стал симметричным и универсальным, и теперь все равно, какой стороной подключать провод к устройству.
USB 3.2
В 2017 году появилась информация о новой версии — USB 3.2. Она получила сразу два канала (больше проводов богу проводов) по 10 Гбит/с в каждую сторону и суммарную скорость в 20 Гбит/с. Стандарт USB 3.2 также обратно совместим с режимами USB 3.1, 3.0 и ниже. Поддерживается типом подключения USB-C на более современных гаджетах.
Типы разъемов
Версий разъемов USB несколько, и для каждого есть свое предназначение.
Superspeed, Gen или как разобраться в маркировках стандартов USB
Как только в типах стандартов появилась USB 3.1, привычная цифровая маркировка изменилась и здорово запуталась. Вполне понятный и простой USB 3.0 автоматически превратился в USB 3.1 Gen 1 и ему была присвоена маркировка SuperSpeed. А непосредственно сам USB 3.1 стал называться USB 3.1 Gen 2 с маркировкой SuperSpeed +.
Но и это уже потеряло свою актуальность с выходом стандарта USB 3.2. Он получил название USB 3.2 Gen 2×2 и маркировку SuperSpeed ++. В итоге маркировка всех предшествующих стандартов опять меняется. Теперь USB 3.0, она же USB 3.1 Gen 1, превращается задним числом в USB 3.2 Gen 1 с прежней маркировкой SuperSpeed. А USB 3.1, ставшая USB 3.1 Gen 2, тоже поднялась до USB 3.2 Gen 2. При этом конструктивно все стандарты остались прежними — изменяются только названия. Если вы уже запутались во всех этих цифрах и маркировках, таблица ниже поможет внести ясность в актуальных названиях.
Если еще более кратко, то сейчас опознать стандарты USB можно так:
USB 3.0 — это USB 3.2 Gen 1, он же Superspeed
USB 3.1 — это USB 3.2 Gen 2, он же Superspeed+
USB 3.2 — это USB 3.2 Gen 2×2, он же Superspeed++
Интерфейс USB: описание и основы устройств сопряжения. Контроллеры для USB
Таким образом каждая транзакция состоит из трех фаз: фаза передачи пакета-признака, фаза передачи данных и фаза согласования
В интерфейсе USB используются несколько типов пересылок информации.
Потоковые пересылки характеризуются гарантированной безошибочной передачей данных между хостом и функцией посредством обнаружения ошибок при передаче и повторного запроса информации. Когда хост становится готовым принимать данные от функции, он в фазе передачи пакета-признака посылает функции IN-пакет. В ответ на это функция в фазе передачи данных передает хосту пакет с данными или, если она не может сделать этого, передает NAK- или STALL-пакет. NAK-пакет сообщает о временной неготовности функции передавать данные, а STALL-пакет сообщает о необходимости вмешательства хоста. Если хост успешно получил данные, то он в фазе согласования посылает функции ACK-пакет. В противном случае транзакция завершается.
Когда хост становится готовым передавать данные, он посылает функции OUT-пакет, сопровождаемый пакетом с данными. Если функция успешно получила данные, он отсылает хосту ACK-пакет, в противном случае отсылается NAK- или STALL-пакет.
Управляющие пересылки содержат не менее двух стадий: Setup-стадия и статусная стадия. Между ними может также располагаться стадия передачи данных. Setup-стадия используется для выполнения SETUP-транзакции, в процессе которой пересылается информация в управляющую КТ функции. SETUP-транзакция содержит SETUP-пакет, пакет с данным и пакет согласования. Если пакет с данными получен функцией успешно, то она отсылает хосту ACK-пакет. В противном случае транзакция завершается.
В стадии передачи данных управляющие пересылки содержат одну или несколько IN- или OUT-транзакций, принцип передачи которых такой же, как и в потоковых пересылках. Все транзакции в стадии передачи данных должны производиться в одном направлении.
В статусной стадии производится последняя транзакция, которая использует те же принципы, что и в потоковых пересылках. Направление этой транзакции противоположно тому, которое использовалось в стадии передачи данных. Статусная стадия служит для сообщения о результате выполнения SETUP-стадии и стадии передачи данных. Статусная информация всегда передается от функции к хосту. При управляющей записи (Control Write Transfer) статусная информация передается в фазе передачи данных статусной стадии транзакции. При управляющем чтении (Control Read Transfer) статусная информация возвращается в фазе согласовании статусной стадии транзакции, после того как хост отправит пакет данных нулевой длины в предыдущей фазе передачи данных
Пересылки с прерыванием могут содержать IN- или OUT-пересылки. При получении IN-пакета функция может вернуть пакет с данными, NAK-пакет или STALL-пакет. Если у функции нет информации, для которой требуется прерывание, то в фазе передачи данных функция возвращает NAK-пакет. Если работа КТ с прерыванием приостановлена, то функция возвращает STALL-пакет. При необходимости прерывания функция возвращает необходимую информацию в фазе передачи данных. Если хост успешно получил данные, то он посылает ACK-пакет. В противном случае согласующий пакет хостом не посылается
Изохронные транзакции содержат фазу передачи признака и фазу передачи данных, но не имеют фазы согласования. Хост отсылает IN- или OUT-признак, после чего в фазе передачи данных КТ (для IN-признака) или хост (для OUT-признака) пересылает данные. Изохронные транзакции не поддерживают фазу согласования и повторные посылки данных в случае возникновения ошибок.
В связи с тем, что в интерфейсе USB реализован сложный протокол обмена информацией, в устройстве сопряжения с интерфейсом USB необходим микропроцессорный блок, обеспечивающий поддержку протокола. Поэтому основным вариантом при разработке устройства сопряжения является применение микроконтроллера, который будет обеспечивать поддержку протокола обмена. В настоящее время все основные производители микроконтроллеров выпускают продукцию, имеющую в своем составе блок USB.
Варианты аппаратной реализации USB Type-C, или Когда не требуется Power Delivery
Когда мы в SberDevices делаем новое устройство, работаем над его аппаратной частью, перед нами встаёт вопрос выбора интерфейсов. Важным моментом при выборе является их доступность и совместимость с другими устройствами.
В своих устройствах мы не могли пройти мимо интерфейса USB-C. Помимо того, что он очень популярен в современных девайсах, он серьёзно расширил функциональность USB по сравнению со своими предшественниками. Давайте расскажу о нём поподробнее.
Краткий обзор особенностей USB TYPE-C
Стандарты USB существуют много лет, развиваются и совершенствуются по мере увеличения технологических потребностей и возможностей. Несмотря на свою универсальность, которая следует из аббревиатуры, привычный USB перестал удовлетворять по объему своей функциональности. В частности, не может решить задачу по обеспечению питания многих современных устройств, потребление которых серьёзно увеличилось. Первая версия USB TYPE-C появилась в 2013 году. Помимо возможностей USB 2.0 и USB 3.0, USB-C стал поддерживать существенно более энергоёмкие профили питания, а также альтернативные режимы работы. В альтернативных режимах контакты разъёма используются для передачи данных высокоскоростных стандартов, таких как Display Port, Thunderbolt, HDMI, Mobile High-Definition Link (MHL). Недавно была опубликована новая реализация стандарта — USB4, которая также ориентируется на спецификацию USB-C.
Описание и назначение контактов разъёма
Разъём включает в себя 24 контакта. Такое большое число контактов по сравнению с привычными разъёмами USB связано как с добавлением новых контактов, расширяющих функциональность, так и с дублированием контактов на противоположную часть разъёма. Так группы сигналов USB 2.0 и USB 3.0 задублированы, разъем стал симметричным, поэтому теперь его можно вставлять любой стороной.
Рассмотрим группы сигналов USB-C соединителя:
Группа | Цепи |
---|---|
Питание | VBUS (4 контакта), GND (4 контакта) |
USB 2.0 | DP (2 контакта), DN (2 контакта) |
USB 3.0 | TX1+, TX1-, TX2+, TX2-, RX1+, RX1-, RX2+, RX2- |
Конфигурационные контакты | CC1, CC2 |
Дополнительные (Альтернативный режим) | SBU1, SBU2 |
Видно, что под питание заложено 4 пары контактов. Это намекает на то, что через разъём стала возможна доставка существенно большей энергии для питания устройства. Через контакты питания возможна передача до 100 Ватт в нагрузку.
Профили питания доступные через USB TYPE-C:
USB 2.0 | 5 В 500 mA |
USB 3.0/USB 3.1 | 5 В 900 mA |
USB BC 1.2 | 5 В, до 1.5 А |
USB Type-C Current 1.5A | 5 В 1.5 A |
USB Type-C Current 3.0A | 5 В 3.0 A |
USB Power Delivery | до 20 В, до 5A |
Режим питания зависит от того, какая функциональность USB-C используется. Появившиеся контакты CC позволяют установить требуемый режим питания и открывают некоторые дополнительные возможности, но об этом позже.
Чтобы иметь возможность использовать профиль питания с большим током, при установке соединения нужно воспользоваться конфигурационными контактами CC.
Конфигурационные контакты СС
С помощью конфигурационных контактов CC (Configuration channel) происходит подключение двух устройств, установка параметров соединения, профилей питания, а также информационный обмен протокола USB Power Delivery. Функционально CC1- и CC2-пины решают следующие задачи:
Источник (он же DFP) подтягивает линии CC к плюсу через резисторы Rp или использует источники тока. Потребитель (UFP) в свою очередь через резисторы Rd подтягивает линии CC к минусу.
Выставляя определённый номинал Rp (или создавая определённый ток на линии СС), host сообщает, какой ток для питания устройства он может обеспечить. Измеряя падение напряжения на Rd, потребитель понимает, какой Rp используется на противоположном конце и, следовательно, определяет ток питания, который может обеспечить host. Без использования USB Power Delivery по такой схеме возможно установить соединение c током до 3А с единственно возможным напряжением 5В.
Экономичный вариант реализации без USB PD
Как видно выше, спецификация USB-C поддерживает широкий спектр стандартов передачи данных и профилей электропитания, но это не означает, что разработчик обязан использовать всю функциональность. Минимальный набор USB TYPE-C может включать в себя USB 2.0 с контактами CC и единственным напряжением питания 5V. В такой конфигурации можно обеспечить потребителю до 15 Вт (5 В, 3А), что значительно больше, чем может дать стандартный порт USB 3.0 – 4,5 Вт (5В, 900 мА).
Чтобы реализовать логику подключения между DFP и UFP, можно использовать микросхему контроллера конфигурации CC, например, PTN5150. Этот вариант значительно проще и дешевле навороченных контроллеров, поддерживающих USB Power Delivery. Структурная схема выглядит так:
Как видно, основные узлы представляют собой: монитор напряжений на СС контактах, набор источников тока, резисторов для переключения состояния выводов, модуль управления ролями устройства.
Микросхема имеет интерфейс I2C, с его помощью можно определить или изменить роль устройства (DFP, UFP, DRP).
Когда выбирается роль DFP, устройство предполагается как Power Source, для которого есть возможность выбрать 3 профиля питания. После выставления соответствующих бит в регистре управления, происходит подключение соответствующего источника тока на линию CC.
Ток на СС-линии | Режим питания |
---|---|
80 uA | 5V / 0.9 A |
180 uA | 5V / 1.5 A |
330 uA | 5V / 3 A |
В случае определения микросхемы в качестве UFP, контакты CC подключаются через резистор 5,1 кОм на землю. Монитор измеряет падение напряжения на этом резисторе и в статусный регистр заносится текущий режим питания.
Также возможно установить роль Dual Role Power (DRP), в этом режиме микросхема последовательно изменяет состояние СС-контактов от “pull-up Rp” до “pull-down Rd” и обратно до тех пор, пока не будет установлено соединение. Соединение возможно только между одним источником (Power Source) и одним потребителем (Power Sink). Таким образом, когда микросхема находится в режиме DRP и монитор напряжения CC-контактов замечает понижение напряжения на противоположном конце (подключён “pull-down Rd”), устройство понимает, что подключено к Sink, и начинает играть роль Source. Такой режим полезен в том случае, когда заранее неизвестно, в каком режиме должно работать устройство.
Рассмотрим пример использования контроллера
Кроме описанных выше СС-пинов и I2C-шины стоит отдельно отметить контакты ID, CON_DET, PORT. Контакт ID отображает режим, в котором в данный момент находится контроллер. Когда устройство определило себя в качестве DFP, ID примет значение LOW. Контакт CON_DET находится в HIGH, когда соединение установлено, LOW — в обратном случае. Эти два логических сигнала будем использовать далее для включения (когда мы DFP) и отключения (UFP) питания подключённого устройства.
Port — это вход, которым задаётся начальный режим устройства после включения питания. В случае, когда используется “pull-up”, контроллер становится DFP, если “pull-down” — UFP. Если нога осталась «висеть в воздухе», будет использоваться режим Dual Role, и устройство будет ждать подключения, чтобы определиться со своей ролью. Это состояние может быть изменено позднее, после конфигурирования по I2C или изменения уровня напряжения на PORT. Таким образом можно управлять режимами работы без использования I2C.
Нужно управлять питанием внешнего устройства, для этого можно воспользоваться дополнительной микросхемой логики и ключом.
Наша задача подавать питание на разъём USB-C только в том случае, когда к нам подключён UFP. ID в таком случае примет значение LOW, CON_DET — значение HIGH. Для того, чтобы открыть ключ высоким уровнем HIGH, надо реализовать функцию Y = CON_DET& (NOT ID). Таким образом, если снаружи подключён UFP, он от нас питается, если DFP, то напряжение на разъём не подаётся и не происходит конфликта двух источников.
В случае, если нет задачи менять роль устройства в процессе работы, а также не требуется определения ориентации кабеля, можно выполнить вариант проще, без микросхемы вообще. Допустим, ваше устройство играет строго одну роль — UFP/Power Sink, например, это флешка. В таком случае достаточно выводы СС1 и СС2 на разъёме подключить через 5,1 кОм на землю.
В случае, если ваше устройство играет только роль DFP/Power source и оно должно подключаться к устройству USB-C Dual Role, также можно обойтись резисторами. В этом случае подбираем номиналы в зависимости от напряжения источника, к которому подключаем резисторы.