Как многие правильно заметили, в случае с 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 и постами о ретроиграх
Комментарии (18)
okhsunrog
00.00.0000 00:00+18Рад видеть этот перевод. Не так давно читал оригинал. Вставлю свои 5 копеек. Примерно с декабря начал проектировать устройство, которое должно получать питание через type c, и чем больше - тем лучше. У меня давно был блок на 100W с поддержкой PD3.0, а когда услышал про PD3.1 - непременно захотелось 140W в своё устройство. Причём PD-триггеры с али в моем случае не катят - устройство должно отпределять, какой ток способно отдавать зу и соотвественно регулировать свой аппетит, чтобы зу не уходило в защиту по току. А это значит, нужен PD-контроллер, или хотя бы PD PHY (пояснение: PHY обеспечивает только физический уровень взаимодействия с источником питания, вся логика ложится на микроконтроллер, PD-контроллер же всё делает сам). К моему разочарованию, не смог найти ни одного PD3.1 контроллера или PHY в продаже. Уже было разочаровался, решил делать на PD3.0 чипе HUSB238, но тут так совпало, что я купил Pinecil v2. И листая коммиты в репозитории IronOS взгляд зацепился за PD 3.1. Пошёл на вики устройства - и точно ведь, поддерживается с недавнего времени! Срочно дайте мне схему устройства! (Хвала опен сорсу!) Смотрю на схеме - так это же старый добрый PHY FUSB302, даташит которого я до этого раз 5 читал, и там кроме PD2.0 ничего не упоминается. Я догадывался, что если на физическом уровне ничего не поменялось, то можно использовать тот же PHY, но смущало ещё и максимальное напряжение питания в 21в. Оказывается, можно было и так) В общем, заказал себе FUSB302, жду! Pinecil v2 меня сильно вдохновил, а библиотека usb-pd от Ralim - это просто нечто. Сегодня получил курьером PD3.1 зарядку, проверил с паяльником - работает! Приходят 28 вольт (паяльник даже 29 вольт показывает). Нагрев до 320 градусов за 2 секунды, если не быстрее. Скоро закончу трассировку плату своего устройства, а там уже начнутся настоящие приключения. Напишу об этом статью на хабр весной/летом. Думаю, аудитории зайдёт.
art1fact
00.00.0000 00:00-4Ого! Звучит очень интересно. Если будет желание - напишите мне в личку. Опубликуем статью с хабом нашего блога :)
Didimus
00.00.0000 00:00+2А в чем смысл получать такие мощности от усб? Этот блок питания гораздо логичнее встроить в само устройство, не?
avf1906
00.00.0000 00:00+2габариты, в ручку уже не влезет, с другой стороны, мне достаточно одного зарядника на выезде для всего - ноут, телефон, паяльник.
Didimus
00.00.0000 00:00-5А через неделю выйдет новый стандарт, и все прекратится в тыкву.
Ваш зарядник сгорит/потеряется/перестанет подходить к новым устройствам, и вот вы уже носите 2 блока питания..
kAIST
00.00.0000 00:00+6То есть вы предлагаете сразу на всякий случай отказаться от единого стандарта и вернуть зоопарк зарядников и блоков питания?
У меня сейчас десятки девайсов с PD и это прекрасно, когда не нужно беспокоиться, где завалялся кабель от этой фигни, которой ты не пользовался пару месяцев. Дома есть блок питания, на выезде PD от повербанка или прикуривателя машины.
Didimus
00.00.0000 00:00Розетка 220 вольт - вот хороший стандарт. А для выездов - клеммы на 12 вольт
kAIST
00.00.0000 00:00+1И что в эти клеммы на 12 вольт подключать? Костыль в виде инвертора 12-220, который сначала преобразует постоянный ток в подобие синуса, повысит до 220, а потом блок питания сделает все наоборот, до напряжения 5-20 Вольт?
nafikovr
00.00.0000 00:00Во-первых, PD стандарту уже не один день.
Во-вторых, имеется обратная совместимость и старые устройства новым источником будут поддерживаться.
В-третьих, существуют мультистандартные источники питания QC/PD.
В-четвертых, QC/PD это таки стандарт для подавляющего большинства современных мобильных устройств. То есть, имея зарядник для телефона/ноутбука по дефолту, ваше "уже носите 2 блока питания" можно перефразировать как "можно носить 0 дополнительных блоков питания помимо того что всегда лежит в рюкзаке"
EfogHD
00.00.0000 00:00О! Возможно, вы — моё спасение.
Я абсолютный новичок в электронике и схемотехнике, слова эти узнал меньше 3 месяцев назад. Спроектировал платы для своего девайса, и захотелось мне PD.
Т.к. я заказываю на LCSC — компонентная база оттуда.
В общем, мне чудом удалось найти такую микросхему, как CH224K, которая прекрасно, к слову работает, для PD 2.0/3.0.Но эта IC в наличии в небольших кол-вах, вдруг вообще пропадёт — можете посоветовать несколько наименований?
Запросы максимально простые — standalone IC (и так ног МК не хватает), которая умеет попросить 12V/20V по СС-линиям.
И, может быть, сможете подсказать, где вообще искать подобные микросхемы, а то гугл так себе помогает, если честно :)
eps
00.00.0000 00:00-1Хорошая статья, перевод подкачал. Слова все переведены, но структура предложений не русская, неудобная, неприятная.
tigreavecdesailes
00.00.0000 00:00-1Пожалуйста, прекратите жать на бедный курок...
Szen
00.00.0000 00:00+2Курок не жмут. Его взводят!!!
Извиняюсь за отклонение от темы, не удержался.
tigreavecdesailes
00.00.0000 00:00Сарказм — это сатирический прием: злая ирония. Он строится на противоречии явного и скрытого смысла: когда подразумевается обратное тому, что говорится.
sizziff
00.00.0000 00:00Я купил себе такой последней версии на 85 Ватт. Айфон среди паяльников :)
Замечу что он работает и от повер банка с QC или PD, что делает его на 100% автономным.
Kudesnick33
Спасибо за перевод. Люблю такие истории. Многим начинающим разрабам на заметку. Если код или схемотехника девайса в целом грамотная, но присутствуют какие-то странные "косяки" - подумай десять раз, какую неявную задачу закрывает этот костыль и к каким последствиям он может привести на практике, а не в теории.