Как многие правильно заметили, в случае с USB-C важен не просто сам стандарт, а то, как он реализован. В конце концов, мы имеем дело с реализациями, и именно на этой почве обычно возникает большинство проблем. Отчасти, конечно, вина лежит и на стандарте, например, в плане отсутствия маркировки кабелей. Хотя, на мой взгляд, он продуман намного лучше, чем некоторым кажется.
Я хочу познакомить вас с несколькими реализациями USB-C в некоторых интересных опенсорсных продуктах. Все они в том или ином смысле не идеальны – иначе и быть не может, поскольку им приходится иметь дело с беспорядочным реальным миром, где совершенство является редкостью.
Сегодня мы поговорим о Pinecil – недорогом и качественном паяльнике от Pine64, выпущенном пару лет назад. Для питания в нём предусмотрен и круглый разъём, и порт USB-C. Это стало долгожданным отступлением от стратегии компании Miniware, которая не применяла такое решение ни в оснащённой исключительно круглым разъёмом модели TS100, ни в маломощных паяльниках TS80. Кроме того, поскольку Pinecil разработан под использование жал T12 от модели TS100, он заслуженно завоевал популярность в мире электронщиков-любителей.
Прим. пер.: Продолжение серии статей про USB-C, посвящённой всестороннему анализу этой технологии. Остальные части доступны здесь:
▍ Недостаточно просто нажать на курок
Исходя из сказанного, у вас могло создаться впечатление, что Pinecil должен представлять собой простое устройство. Стандартным решением для получения высокой мощности через USB-C является триггерная микросхема с поддержкой протокола Power Delivery (PD), и можно просто использовать её. Однако, если вы читали статью, посвящённую обеспечению питания через USB-C, то можете помнить сценарии с зарядным устройством на 45 Вт и 60 Вт, где подобная схема оказалась обречена на провал. В целом триггерные микросхемы не особо поддаются конфигурированию, и в случае несовместимости с некоторыми блоками питания в качестве решения остаётся лишь их замена на микросхемы с другой логикой. Проблема же в том, что замены обычно нет. Такой подход оказывается дорогостоящим и ограничивает возможности использования продукта в реальных условиях.
Разработчики Pinecil же пошли путём совмещения программного стека PD и интерфейсной микросхемы PD, поручив микроконтроллеру обработку коммуникации по протоколу в реальном времени. В качестве интерфейса PD использовалась микросхема FUSB302, подключённая к микроконтроллеру через стандартную шину I2C. При этом в Pinecil v1 использовался микроконтроллер GD32VF103, а в Pinecil v2 – BL706, оба на архитектуре RISC-V.
Здесь я начала говорить несколько абстрактно, но мне хочется показать, как электронщик проделывает фактическую работу по воплощению в жизнь стека PD – в действительности всего стека ПО Pinecil. Человека, отвечающего за PD и всё ПО Pinecil, зовут Ralim. Он известен своей разработкой IronOS, изначально использованной в TS100, TS80 и других паяльниках, оснащённых микроконтроллерами. Инженеры Pine64 связались с Ralim, ещё когда Pinecil был только в задумке, попросив его портировать IronOS, включая необходимую работу с PD.
С течением лет подход «интерфейсная микросхема + микроконтроллер» прекрасно себя оправдал. Основная причина – это совместимость с блоками питания. В реализации питания по USB-C существует очень много вариаций, поскольку наладить функционирование PD бывает сложно, особенно в пограничных случаях. Изначальная прошивка на паяльниках Pinecil действительно не работала с некоторыми блоками питания, включая ряд моделей от Apple.
Красота в том, что когда кто-то создавал на GitHub вопрос по теме совместимости с БП, Ralim вникал в этот вопрос путём либо удалённой отладки через «опробование конкретного бинарника», либо через покупку такого же БП. Затем он исправлял проблему, корректируя процесс обработки программным стеком пограничных случаев, тестировал это исправление и загружал новую версию прошивки Pinecil на GitHub для всеобщего пользования. В течение года большинство проблем с USB-C было устранено, и если у вас какие-то сложности с Pinecil ещё наблюдаются, то, скорее всего, достаточно обновить устаревшую заводскую прошивку на новую.
Со временем программный стек стал довольно зрелым и, самое главное, прошёл проверку в рабочих условиях – сегодня уже сложно найти блок питания, с которым бы Pinecil не дружил. При этом для отладки и удобства электронщиков была реализована дополнительная возможность. Если подключить БП с USB-C к Pinecil, удерживая кнопку +, отобразится отладочное меню PD с перечислением всех профилей – в некотором смысле Pinecil является отладочным инструментом PD.
Будет ли такой подход работать для небольшого хобби-проекта, требующего блока питания с USB-C? Вряд ли такое было возможно, когда Pinecil ещё только появился. Однако сегодня стек PD уже является опенсорсным и довольно зрелым.
▍ Использование USB-C в опенсорсе
Написать программный стек PD USB-C не так же просто как, скажем, драйвер АЦП. С целью соблюдения требований к совместимости и безопасности в USB-C используются конечные автоматы. Если вам когда-то показывали одну из этих пугающих диаграмм из документации USB-C, то вы можете считать, что к USB-C простому смертному лучше не прикасаться. И такое мнение не совсем ошибочно – повторная реализация этих конечных автоматов вряд ли окажется для вас желанным делом. С другой стороны, несмотря на агрессивную в информационном плане природу, использованные в этом стандарте конечные автоматы проще, чем могут показаться.
Тем не менее, если вы мечтаете о реализации опенсорсного проекта с использованием USB-C, то вам не нужно начинать с нуля. Сегодня, благодаря труду Ralim, нам доступен открытый стек PD. Написан он на С++ и предназначен для работы с RTOS – поскольку USB-C требует достаточно быстрых ответов на элементы протокола, задействованные на стороне источника питания. Этот стек начала создавать [Clara Hobbs] в рамках проекта PD Buddy Sink, после чего он вырос в самостоятельную библиотеку, которая пригодится, если вы тоже собираетесь создать собственное устройство с USB-C.
Благодаря приличной коллекции накопившихся у Ralim блоков питания с USB-C, этот стек хорошо протестирован. Возможно, именно это и делает его столь ценным. Однако он также выступает в качестве песочницы для экспериментов с USB-C. Когда на рынке начали появляться зарядки с EPR вроде модели на 140 Вт от Apple, они поддерживали 28 В – как раз то напряжение, которое Pinecil мог бы использовать для повышения мощности нагрева с 50 до 98 Вт. Через несколько месяцев стек, который ранее поддерживал только SPR, был расширен до EPR, и мы увидели, как паяльники Pinecil получают от зарядок Apple 28 В. В итоге это оказался первый открытый проект, соответствующий дополнительным требованиям EPR.
▍ Нюансы с интерфейсной микросхемой
У интерфейсной микросхемы PD, FUSB302, есть один странный аспект – её спецификация устанавливает для контакта VBUS два максимальных уровня напряжения: рекомендованный максимум 21 В и абсолютный максимум 28 В. Сей контакт в порту USB-C подключён к дорожке питания VBUS, то есть по факту ко входу питания. Раньше это вызывало в сообществе беспокойство, и хотя кто-то протестировал совместимость с 24 В, выложив убедительные графики кривых, Pinecil понизили в маркировке, указав совместимость только с БП на 21 В и ниже, что является недостатком в сравнении с TS100.
Позднее могло случиться так, что, ввиду отличий в производственных допусках разных партий, FUSB302 стала более чувствительной. Как-то в один из периодов безделья я волонтёрила в техподдержке чата Pinecil. Тогда мы столкнулись с некой тенденцией – люди либо использовали дешёвые БП с круглым разъёмом, либо случайно подключали БП на 24 В, либо просто использовали стандартное устройство на 20 В, в результате чего FUSB302 умирала. Иногда это происходило тихо, и паяльник начинал работать только через круглый разъём или протокол QC. Иногда на этой микросхеме замыкало внутреннюю линию 3,3 В, и паяльник выходил из строя полностью. В последнем случае приходилось его возвращать к жизни при помощи горячего воздуха.
Эти проблемы не особо выделялись на фоне общего числа продаваемых Pinecil, но тут определённо наблюдалась тенденция, и нам стало любопытно. В итоге один электронщик под ником Thanos the tank engine решил докопаться до сути проблемы и разобраться, как её можно исправить. Вместе с Ralim они выяснили, что контакт VBUS в ПО совсем не используется, и его можно полностью отключить. За этим последовал выпуск «VBUS mod» — хака, который добавлял Pinecil поддержку 24 В за счёт исключения соединения VBUS и сопровождался видеоинструкцией по правильному отсечению соответствующей дорожки.
В качестве защитного механизма для пользователей, которые в первый раз могли по недосмотру оставить волосок медной дорожки, Ralim изменил прошивку, добавив проверку корректности работы мода. В конечном итоге эта модификация также вошла в очередную ревизию печатной платы Pinecil и в Pinecil v2. В целом получилась замечательная короткая история о том, как крупные опенсорсные продукты, окружённые процветающим сообществом, становятся для него укрепляющим фактором.
▍ Отклонение от стандарта ради совместимости и отладки
USB-C спроектирован с целью отказа от проприетарных зарядных устройств, в связи с чем его спецификация гласит, что вы не должны реализовывать в своих портах USB-C поддержку стандартов зарядки вроде QC, задействующих линию передачи данных. Однако цель Pinecil – доступность, и эту часть спецификации USB-C пришлось проигнорировать. Так что, помимо поддержки PD, на случай, если вам потребуется работа с зарядкой QC или пауэрбанком, в паяльнике присутствует поддержка QC – доступность для электронщиков превыше спецификации USB-C. И это не единственный пункт спецификации, который Pinecil оправданно нарушает.
Высокоскоростные и SBU-сигналы на порту USB-C этого паяльника используются для различных сигналов – JTAG, SPI, I2C, UART и нескольких ADC с основного микроконтроллера. В результате Pinecil представляет собой макетную плату с RISC-V и USB-PD, сопоставимую с дешёвой коммутационной платой. Не все люди пользуются преимуществом этих сигналов, но они определённо доступны и изначально использовались во время разработки Pinecil – так зачем же их оставили в готовой версии?
Спецификация USB-C позволяет переиспользовать эти сигналы в целях отладки, но в таком случае необходим мультиплексор, который бы отключал их до момента вызова отладочного режима. Так что по этому пункту Pinecil тоже стандарту не соответствует. С другой стороны, для мультиплексора на плате Pinecil нет места, да и его добавление излишне повысило бы цену продукта ради редко используемой функции, которая, тем не менее, слишком хороша, чтобы от неё отказываться.
Вместо этого на случай, если кто-то решит использовать для подключения Pinecil к порту USB3 высокоскоростной кабель, сигналы были размещены так, чтобы ни один из контактов вывода GPIO не подключался к TX паре USB3. В итоге вопросов со стороны пользователей не возникало. Если бы они и возникли, то достаточно было просто взять другой кабель, а если бы проблемы оказались частыми, то есть ещё перемычки 0 R, которые можно исключить на этапе производства. К счастью, ничего из этого не потребовалось.
▍ Отступление от стандарта по необходимости
Читая историю про FUSB302, вы могли задаться вопросом: «Как так получалось, что напряжение с круглого разъёма попадало на линию VBUS микросхемы?» Причина проста – центральный вывод круглого разъёма и VBUS линия USB-C соединены. Если вам доведётся разрабатывать продукт с двумя входами питания, то именно этого не стоит делать. Однако, похоже, у Pine64 другого выхода не было. Вместо этого они установили порт USB-C и круглый разъём так, чтобы нельзя было подключить кабели в оба гнезда сразу.
Теперь у вас нет причины, по которой вы могли бы одновременно задействовать оба разъёма, разве что для использования Pinecil в качестве своеобразной триггерной платы – но тут уже мешает задуманное разработчиками механическое препятствие. При этом также нет никаких инструкций, которые бы просили вас это делать. И всё же известно две истории, в которых люди пытались при подключённом круглом разъёме параллельно подключить ещё и штекер USB-C для прошивки, что привело к сгоранию использовавшихся компьютеров. Это были какие-то странные случаи, поскольку никто в сообществе Pinecil так и не смог воткнуть оба штекера одновременно, хотя мы определённо пытались.
В конечном итоге это был компромисс дизайна, когда для решения потенциальной проблемы разработчики пошли механическим путём. Теперь у вас должен сложиться очень специфичный набор обстоятельств, чтобы возникла даже просто возможность сбоя. И в этом смысле количество сбоев приближается к тому же проценту, который мы бы получили, если бы инженеры Pine64 установили на линии порта USB-C транзисторный выключатель или диод; всё же компоненты, отвечающие за переключение питания, склонны выходить из строя вследствие короткого замыкания. Хотя со стороны сообщества мы нашли, что ещё можно исправить – дополнить все инструкции прошивки и кастомный инструмент прошивки Pinecil предупреждением пользователей о том, что перед прошивкой необходимо отключать БП с круглым разъёмом. После добавления этих предупреждений о новых подобных эксцессах ещё никто не сообщал.
▍ Хороший результат
Немало усилий было вложено в этот открытый проект, который вылился в десятки тысяч продуктов, попавших в руки электронщиков по всему миру. Мой Pinecil ещё ни разу меня не подвёл, и я уверенно полагаюсь на возможности его порта USB-C. Нам также следует по достоинству ценить подарок, которым стал проверенный временем опенсорсный программный стек PD. И хотя реализация USB-C в Pinecil не безупречна, она оказалась невероятно полезной для электронщиков во всех концах света. К тому же здесь есть немало историй, на которых можно поучиться.
Telegram-канал с розыгрышами призов, новостями IT и постами о ретроиграх