Работая с USB-C, люди то и дело сталкиваются с различными проблемами. Я поспрашивала пользователей на Twitter и Mastodon об их отрицательном опыте работы с USB-C и получила широкий отклик. Помимо этого, в различных сообществах вроде r/UsbCHardware собрано немало информации о явлениях, которые вызывают проблемы при использовании этой технологии.
Текущая статья посвящена обзору допускаемых производителями недочётов в реализации стандарта USB-C и анализу возможных причин этого.
Прим. пер.: Продолжение серии статей про USB-C, посвящённой всестороннему анализу этой технологии. Остальные части доступны здесь:
В инженерном деле и электронике существуют негласные нюансы, которые мы привыкли просто считать нецелесообразными. Двунаправленное питание и высокоскоростная линия данных в одном порту с тысячей периферийных устройств, использующих всего один контакт данных – если вам доводилось видеть схему проприетарного разъёма док-станции, пытающегося совершить такой технический подвиг, то вы знаете, что здесь кроются ужасы за гранью понимания. К примеру, контакт ID в MicroUSB быстро превратился в кладезь несовместимых значений резистора для всего, что выходит за рамки «получения и подачи питания».
Производителям ноутбуков пришлось постоянно прибегать к резисторам и однопроводным схемам, чтобы их зарядные устройства не перегружались ноутбуком, требующим больше питания, чем зарядка способна обеспечить, что само по себе приводило ко множеству возможных сбоев.
При разработке USB-C его создатели изучили зарядные устройства, переходники OTG, выводы дисплеев, док-станции, в том числе с функцией зарядки, и объединили их в спецификацию, которая может подойти, по сути, для всего, используя один кабель. Что же могло пойти не так?
Естественно, производители нашли разные способы пренебрежительно реализовать все возможности USB-C. Причём некоторые из огрехов являются заметными трендами. Большинство из них, как я выяснила, появились по вине производителя, будь то намеренно или по невнимательности. В качестве примеров можно привести проблемы с маркировкой кабелей и нередкие случаи сбоев по причине износа.
Я не знаю, можно ли было сделать стандарт USB-C проще, но могу уверенно сказать, что многие ошибки являются результатом недостатка внимания со стороны производителей кабелей и устройств. Давайте разберём самые известные грехи USB-C и посмотрим, что из этого можно усвоить.
▍ Пренебрежение резисторами ради центовой экономии
Резисторов USB-C не видно, а контакты даже не припаяны
Вы понимаете, о чём я. Первое и почётное место – это отсутствие подтягивающих к земле резисторов 5,1 кОм на порту USB-C, предназначенном для зарядки устройства. «Почему мой девайс заряжается через кабель USB-A – USB-C, но не через USB-C – USB-C?», – спрашивает пользователь. И ответ прост – потому что разработчик вашего устройства решил сэкономить один цент на его сборке и не позаботился о тестировании перед продажей. Иными словами, в вашем устройстве к разъёму USB-C должны быть подключены два резистора, которых на деле нет, в связи с чем БП с USB-C не могут обнаружить, что от них требуется обеспечить питание. Напомню, что обнаружение резистора является полностью безопасным механизмом, и сейчас информации по этой проблеме предостаточно.
Пренебрежение этими резисторами является одной из наиболее раздражающих пользователей ошибок Type-C, зачастую приводящей к тому, что люди вынуждены отлаживать проблему часами напролёт. К примеру, одному разработчику, который работал с платой WCH RISC-V, используя для питания разъём USB-C, пришлось потратить несколько часов из-за того, что WCH не удосужились добавить эти резисторы. Если вы покупаете оборудованную USB-C плату Arduino Pro Micro или TP4056 на Aliexpress, то резисторов в ней наверняка не будет. Везде, где ни посмотри, вы найдёте одно или два устройства без резисторов. По этой проблеме скопилось до смешного много информации.
▍ Убийственные БП с “USB-C” в супермаркетах LIDL
Помните статью про питание по USB-C, а именно описание получения более высокого напряжения? Вкратце напомню: сначала вы получаете 5 В, и то только после обнаружения резистора. Повышенное напряжение требует согласования по цифровому протоколу. Это требование безопасности – так вы можете использовать одну зарядку с USB-C для ноутбука, телефона, беспроводных наушников, макетных плат и чего-угодно другого.
Фото Stephanie Lahs
А теперь, что происходит, когда кто-то создаёт зарядное устройство с фиксированным выходом напряжения, скажем, 12 В и добавляет в него разъём USB-C? Ответом будут печальные последствия. Такой источник питания небезопасен для использования в реальных устройствах USB-C – он может убить ваш телефон или ноутбук, а на взгляд будет неотличим от переходника, соблюдающего правила USB-C, прописанные для всех остальных. Если вам постоянно приходится использовать такой переходник для какого-то устройства, то вы можете отметить его штекер красной лентой, чтобы случайно не использовать этот кабель для зарядки чего-то другого. Серьёзно. Здесь легко допустить ошибку, и чем более привычным для вас становится USB-C, тем выше её вероятность.
Кто так делает? Ну, на такое идут многие безымянные производители, хотя встречается это также, к примеру, в инструментах Lidl Parkside. Ещё на подобный ход пошла компания CrowPi в своём недавно вышедшем ноутбуке CrowPi L. В обоих случаях продукты поставляются с «тупыми» зарядными устройствами USB-C, и ни одно из них не должно продаваться потребителям, особенно с учётом того, что CrowPi разработан для детей и образовательных целей, а инструменты Parkside предназначены для технически неподкованных людей. Когда ваш ребёнок сжигает смартфон за 500$, или ваша бабушка сжигает его ноутбук из-за зарядки ценой 2$, тогда-то и проявляется вся серьёзность нарушения этого стандарта.
▍ Обвинить компании? Всё не так просто
Пренебрежение установкой резисторов уже стало проблемой для потребителей, а убийственные схемы БП вообще непростительны. Разработчики не должны производить такие вещи. Однако есть одна область, в которой я могу простить допущение ошибок. Речь идёт о протоколе USB-PD – в частности об ошибках совместимости, особенно в ранних моделях устройств с USB-C.
Спецификация PD состоит из 800 страниц – это, несомненно, пугает. Хотя, если вы зарабатываете на реализации USB-C, то быть знакомым с ней – это ваша обязанность. С другой стороны, когда вы являетесь первопроходцем, реализующим сложную спецификацию, весьма вероятно, что вы допустите ошибки даже не по своей вине. В вашем распоряжении не так много реализаций, вам придётся работать с таким же незрелым низкоуровневым оборудованием вроде микросхем, и прочие устройства вокруг будут аналогичным образом иметь тонкие недостатки. Суть в том, что первые реализации представляют более серьёзную инженерную проблему, чем мы привыкли считать.
Помимо этого, для столь обширной технологии есть два пути первичного внедрения. Первый – это когда вы создаёте устройство, которое должно быть конкретно совместимым с выпускаемой вами дорогостоящей периферией, и не тестируете его с другими вещами. И это несмотря на заложенный в нём опенсорсный стандарт, нацеленный на взаимосовместимость. Этот путь я называю путём Nintendo Switch, без какой бы то ни было конкретной причины.
Второй путь раннего внедрения технологии – это когда вы разрабатываете продукт и затем тестируете его с другими устройствами. Это ранняя стадия внедрения, поэтому другие устройства зачастую оказываются тоже с недостатками, и в итоге вы добавляете костыли и исправления, наслаивающиеся поверх друг друга. Новые девайсы выходят постоянно, и в течение какого-то времени каждое несёт в себе несколько недоработанную реализацию. В лучшем случае вы тратите уйму времени на тестирование, когда вокруг этого почти никто не делает, обеспечивая точную совместимость – при условии, что вы можете выделить для этой задачи разработчиков. В худшем же случае ваши исправления приводят к созданию совершенно нового дефективного устройства.
Учитывая эту оговорку про лежащую на компаниях вину, давайте перейдём к следующему пункту, где я займусь как раз обвинением компаний.
▍ Недостаточное тестирование реализаций PD
Сегодня уже нет прощения выпуску плохо протестированного продукта с USB-C. Если опенсорсный проект может не иметь множества источников питания для тестирования БП с USB-C, то крупным компаниям это не простительно. Представьте, что купили мощный пауэрбанк, который не озадачивается выяснением ролей подключаемых устройств и в итоге заряжается от ноутбука, когда вам нужно противоположное. Это означает, что на ноутбуках, подобных вашему, его не тестировали и на многих других наверняка тоже. Давайте признаем – производители пауэрбанков могут позволить себе купить несколько ноутбуков с разными ОС и тестировать поведение своего продукта до тех пор, пока он не заработает как положено.
Проблемы совместимости по протоколу PD реально существуют, и вы вполне можете с ними столкнуться, особенно в случаях зарядки. Есть ноутбуки, которые не работают с конкретными зарядными устройствами, к примеру мой Framework не дружит с зарядкой на 65 Вт от ноутбука Xiaomi. То есть батарея продолжает циклически заряжаться от 10% до 30%, а само зарядное устройство при этом также циклически отключается/подключается. Ещё у меня есть док-станция, где функция зарядки работает только для половины ноутбуков. Естественно, бывают случаи ошибочного следования спецификации, но давайте смотреть правде в глаза – для этого должна быть более фундаментальная причина.
Отчасти проблема лежит в недостаточном обмене информацией. Когда крупный опенсорсный проект решает непростую задачу по совместимости и добавляет костыль, его отправляют на GitHub для всеобщего ознакомления и использования, а в сообщении коммита сопровождают описанием решённой задачи.
Когда же аналогичный баг исправляют в коммерческом продукте, он выбрасывается в /dev/null
для всестороннего информационного использования, за исключением BLOB, который компания отправляет в виде обновления прошивки – если вообще это делает. В этом случае каждая компания, реализующая девайсы с PD, имеет собственную базу данных нюансов этого протокола, подстраивающихся под особенности устройств, с которыми проводилось тестирование. Эти нюансы PD должны находиться в открытом доступе, но по факту этого доступа к ним никто не предоставляет.
Разработчики проприетарных решений не получают деньги за то, чтобы делиться своими идеями. А вот в открытых проектах такой обмен информацией происходит естественным образом, что лишний раз указывает на фундаментальную неполноценность проприетарных процессов. Основная логика таких доводов в том, что вы получаете глючные устройства, и что компаниям выгоднее заставить вас переплатить и испытывать неудобства вместо того, чтобы прикладывать усилия к обмену информацией между собой. Будь то информация об уязвимости безопасности или совместная разработка стандартов, крупные корпорации постепенно учатся делать всё правильно, сфера за сферой, но общий принцип так никогда и не приживётся – настолько сильны фундаментальные мотивы получения прибыли и жадность.
Микроконтроллеры с периферией, взаимодействующей по PD, тоже зачастую представляют сложность в работе. Опять же, причина в недостатке усилий, нацеленных на то, чтобы сделать эту периферию удобной для разработчиков, будь то за счёт лучшего дизайна или лучшей документации – зачастую более открытого кода, как вы, к сожалению, можете догадаться. Один только этот фактор повышает вероятность того, что конечный пользователь столкнётся с ошибками только потому, что для сложной в работе периферии будет сложнее писать грамотный код.
▍ Нечего добавить
Вы можете купить ноутбук за 1000$ и выяснить, что его порт USB-C реализует только функцию USB3 – никакой зарядки или DisplayPort. Либо вы можете купить неплохой смартфон за 500$, и окажется, что он не может заряжаться и одновременно обеспечивать функционал OTG. Хотя USB-C предполагает, что устройства должны уметь делать это стандартизированным образом, искореняя все эти адаптеры-разветвители MicroUSB со странными резисторами на линии ID.
Фото Ильи Плеханова, CC A-SA 4.0
В сфере ноутбуков компания Asus является одним из самых злостных нарушителей, выпустив множество устройств, предоставляющих по USB-C только функционал USB3 – никакого вам DisplayPort, зарядки, не говоря уже о Thunderbolt. Что ещё хуже – при чтении документации вы можете не найти никакого упоминания о возможностях порта USB-C вне зависимости от того, умеет ли он что-либо или нет. И, естественно, недостаток ясной маркировки портов ухудшает всё ещё больше.
Вишенкой на торте является присутствие в ноутбуке всего одного порта USB-C – ничего более – вы могли видеть подобные Macbook. По сути, вам приходится носить с собой донгл с поддержкой PD, у вас нет возможности подключить приёмник беспроводной мыши, и сам порт USB-C становится живым проявлением выражения «узкое место». Когда дело доходит до ремонта, наличие единственного порта USB-C для всего означает огромную точку сбоя, которая оставит вас без ноутбука, если вы случайно используете дешёвую зарядку и поплавите пластик этого порта. Если это не Macbook, то удачи вам отыскать заменный порт. Обычный любитель может банально не найти замену кастомному порту USB-C, выпущенному ограниченной партией.
▍ Но обходной путь всё же есть
Запомните: если ваш кабель USB-C сломан или ненадёжен, вам следует перестать его использовать и купить замену. Отмечайте устройства, которые ведут себя некорректно, и говорите о них в сети, позорьте их. Если вас волнует совместимость, читайте онлайн-обзоры, просматривайте Aliexpress или ищите по названию продукта, чтобы понять, есть ли в покупаемом вами устройстве необходимые резисторы. Приобретая блок питания с USB-C или дорогущую док-станцию, будет нелишним протестировать это устройство с вашим и убедиться, что вы можете вернуть или обменять его на другое. Со временем все эти острые углы сгладятся, и когда в наши дома придёт уже USB-D, вы встретите множество людей, испытывающих ностальгию по былой простоте USB-C.