25 лет назад сфера применения USB-интерфейса и его перспективы определялись очень четко: простой и недорогой способ подключения низкоскоростных устройств. Что-то более сложное по замыслу производителей должно было использовать совсем другие разработки — например, FireWire. Однако суровая реальность внесла свои коррективы — о чем мы уже писали и повторяться не будем. Главное, что вот уже много лет именно USB является стандартным периферийным интерфейсом «ближнего действия», массово применимым не только в компьютерах, но и вообще в быту. Впрочем, за эти годы грань между «компьютерной» и «бытовой» техникой стала очень размытой — так что и не удивительно.
Разумеется, «сегодняшняя» USB давно уже не та, что была 25 лет назад — сменилось несколько версий спецификаций, радикально выросла пропускная способность, да и даже логика работы контроллеров стала совсем другой. При этом сильным местом интерфейса всегда считалось сохранение совместимости между версиями — что иногда достигалось не слишком уж тривиальными способами, но достигалось. Разобраться, правда, как все будет работать в итоге не всегда просто. Особенно в последние годы: если в «нулевые» было понятно, что USB 2.0 это «круче» 1.1, но хуже, чем 3.0, то сейчас… Не всякий человек, не заглядывая в справочник сможет сказать, что лучше хотя бы потенциально: USB 3.2 Gen1 или USB 3.1 Gen2. А ведь конкретный режим работы будет определяться не одним устройством (точнее, поддерживаемыми им спецификациями), а двумя. Да еще и кабель в некоторых случаях может внести свои коррективы.
Принципиальных сложностей, впрочем, нет — просто не всегда есть тот самый «справочник», в который можно быстро заглянуть и разобраться. Во многом потому, что интерфейс, как уже сказано, развивался до современного состояния более 20 лет, устройства выпускались все эти годы, подходы к маркировке менялись. Попытки же USB Implementers Forum навести в них какой-то порядок, естественно, относятся лишь к тому, что производится прямо сейчас. Да и иногда вместо порядка получается напротив — усиление путаницы: как в примере выше с USB 3.2 Gen1 и USB 3.1 Gen2. Но, если знать, как и что примерно устроено, и как развивалось — разобраться несложно. Для этого, правда, придется углубиться в историю, но это и само по себе интересно.
Спецификации и скоростные режимы
Первое, что стоит помнить — на самом деле, ни контроллеры, ни конечные устройства не оперируют номерами спецификаций, а работают в одном из режимов, различающихся не только скоростью, но иногда и логикой работы. Для сохранения совместимости обычно поддерживают несколько — откуда и возникает иногда путаница, поскольку «внутри» они очень разные (хотя от пользователя разработчики это всегда старались скрыть, апеллируя к универсальности интерфейса). При этом каждая последующая спецификация не отменяла, а дополняла предыдущие, полностью включая их в себя. Полная документация, соответственно, постоянно увеличивалась в объеме, информация же для массового потребителя давалась (и дается) в сокращенном виде. В итоге, например, для некоторых покупателей в свое время было шоком, что соответствующее спецификациям USB 2.0 устройство при подключении к соответствующему спецификациям USB 2.0 контроллеру, на практике работало не лучше и не хуже аналогичной связки в рамках USB 1.1. С технической точки зрения — это нормально. Но неожиданно, если ограничиваться лишь краткими выдержками из стандарта, согласно которым скорость USB 2.0 может достигать 480 Мбит/с, а USB 1.1 ограничена 12 Мбит/с. Именно эти цифры всегда использовались и в рекламе, хотя на деле речь шла лишь о старшем из трех скоростных режимов USB 2.0, отсутствующем в предыдущих версиях. А вот два младших и в них, и в последующих версиях USB абсолютно одинаковые — и одинаково же работают.
На данный момент количество режимов работы USB-устройств достигло уже восьми, а пройди инициатива Intel об объединении USB и Thunderbolt, было бы под полтора десятка. Однако получилось, как в анекдоте про похороны преферансиста — и двух восьми хватило. Для ясности внесем их в таблицу, указав также максимальную пропускную способность и версию спецификаций, начиная с которой поддержка такового режима изначально появилась.
Режим | Пиковая пропускная способность | Стартовая версия спецификаций |
---|---|---|
Low Speed | 1,5 Мбит/с | USB 1.1 |
Full Speed | 12 Мбит/с | USB 1.1 |
High Speed | 480 Мбит/с | USB 2.0 |
SuperSpeed 5Gbps / USB3 Gen1 | 5 Гбит/с | USB 3.0 |
SuperSpeed 10Gbps / USB3 Gen2 | 10 Гбит/с | USB 3.1 |
SuperSpeed 20Gbps / USB3 Gen2×2 | 20 Гбит/с | USB 3.2 |
USB4 20Gbps / USB4 Gen2×2 | 20 Гбит/с | USB4 |
USB4 40Gbps / USB4 Gen3×2 | 40 Гбит/с | USB4 |
На первый взгляд все выглядит просто и логично — интерфейс рос и развивался, попутно наращивая скорость. С точки зрения пользователя — так и есть. Однако, если копнуть поглубже, оказывается, что USB — это что-то простое и единое с линейным развитием, а конгломерат разных контроллеров, реализующих разные скоростные режимы и работающих под управлением разных программных протоколов. Точнее, так оно было до внедрения USB 3.0 — где решено было покончить с бардаком как в организации, так и в системе наименований. Но благими намерениями известно куда дорога вымощена — в одном порядок навели, в другом беспорядок создали. Причем в ближайшее время нас ожидает новый его виток, поскольку USB4 готовится к массовому выходу на рынок. И в рамках его внедрения разработчики опять попытались навести порядок, но в чем-то степень энтропии только увеличили. Как такое могло получиться? А вот это и разберем подробнее.
Low Speed и Full Speed: основа всех основ
В принципе, эти два скоростных режима были всегда — даже когда USB еще в формальном смысле не было: разделение было проведено в предварительных спецификациях 0.7. Окончательная версия 1.0 появилась в январе 1996 года, первые попытки ее аппаратной реализации показали, что не такая уж она и «окончательная», так что в середине 1998 года в стандарте появились необходимые исправления и дополнения. В итоге первой массовой версией стала 1.1, формально появившаяся в сентябре 1998 года. Почему «формально»? А потому, что на практике именно ее поддерживали и более ранние продукты разных производителей. Например, чипсет i430TX, вышедший на рынок в феврале 1997 года уже полностью соответствовал спецификациям USB 1.1. USB 1.0 же поддерживалась более ранним i430VX, но так, что добиться нормальной работы всех устройств на платах с ним никому не удавалось. Впрочем, в конце 90-х это больших проблем не создавало, поскольку и устройств-то тогда практически не было, а многие пользователи компьютеров и два-три года спустя считали эти разъемы бесполезными. Зато можно было ни о каких режимах и стандартах не упоминать, поскольку тогда еще это было «просто» USB. По планам таким интерфейс и должен был остаться. Для мышей, клавиатур, игровой периферии, модемов для телефонных линий и прочего, что в 90-е и ранее обходилось COM-портом или специализированными примитивными интерфейсами, т. е. низкоскоростной периферии предназначался режим Low Speed. Принтерам и прочему оборудованию, использующему параллельный порт (дешевые сетевые адаптеры, некоторые накопители и т. п.), т. е. среднескоростным (по меркам того времени) устройствам полагался USB Full Speed. «Полная» скорость USB таким образом должна была навсегда (или очень надолго) остаться равной 12 Мбит/с, а для высокоскоростной периферии предполагалось использование FireWire.
Если интерфейс предполагается использовать только для подключения периферийных устройств, и только низкоскоростных, и относительно простых — его и следует сделать простым и недорогим, да и устройства максимально удешевить. Для последнего, в частности, было реализовано и питание подключаемых устройств — 5 В 500 мА максимум, т. е. 2,5 Вт. Этого как раз хватало на многие простые устройства, а для «непростых» разрабатывалась FireWire или сохранялись схемы с отдельными блоками питания и т. п.
Логически шина представляла собой типичное дерево, корнем которого является хост-контроллер. Согласно изначальным предположениям (позднее тоже модифицированным), в системе он может быть только один на всех. Это специальное устройство — все другие являются подчиненными и никакой самостоятельностью не отличаются. Делятся они на хабы и оконечные устройства. Хаб вообще никаким интеллектом не обладает — это всего лишь разветвитель портов: делит один входящий на два или более исходящих. Пассивный хаб точно так же делит на всех полученное электропитание, активный чуть гуманнее — имея собственный БП, на каждом исходящем порту он обеспечивает стандартные 5 В 500 мА. На самом верху иерархии находится корневой хаб, подключенный непосредственно к хост-контроллеру. К его исходящим портам подключаются либо хабы более низкого уровня, либо устройства. И так далее по нисходящей, пока не будет исчерпан либо лимит на 127 устройств (128-м является сам хост), либо на пять соединенных подряд хабов. Такая организация сразу же накладывает несколько серьезных ограничений:
- В сети не может быть двух хостов, что автоматически запрещает простое использование USB для связи двух компьютеров
- Устройство может быть либо хостом (и тогда его нельзя подключить к компьютеру — следствие первого пункта), либо именно устройством (и тогда оно не может послужить «корнем» другой сети — например, к первым КПК нельзя было подключить накопитель или принтер)
- Скорость контроллера делится на все подключенные устройства, т. е. если одно из них «забьет» всю шину, остальным ничего не достанется. Решена эта проблема крайне неэлегантно — никакое устройство так поступить не может никогда. Даже если оно никому не мешает
Третий пункт не совсем очевиден, так что расшифруем его. Как уже было сказано выше, все устройства являются подчиненными, и самостоятельно инициировать обмен данными не могут. А для того, чтобы они могли вообще работать, контроллер постоянно их опрашивает. Все и по кругу — своеобразная «карусель». Разделения по времени является самой простой схемой организации работы нескольких устройств на общей шине одновременно. Самой простой, значит, и самой дешевой. Но, к сожалению, и самой неоптимальной тоже. Именно поэтому в большинстве шинных протоколов от нее отказались, введя прерывания, приоритеты и прочее. А вот USB в конце 90-х получила именно такую архаичную схему, унаследованную еще из 60-х годов прошлого века. По простой причине — для низкоскоростных устройств ничего большего и не нужно. Однако, как только на шине появляется скоростное устройство, начинаются проблемы. Допустим, мы подключили внешний винчестер и пытаемся записать на него 1 ГБ информации. Эта операция долгая, поэтому если допустить захват шины одним устройством, работало бы оно с максимальной скоростью, но все остальные были бы заморожены — механизма прерываний-то нет. А кому нужен компьютер, на котором во время копирования информации мышь не двигается, и клавиатура символы теряет? Для решения данной проблемы используется «карусель», однако она же вызывает другие проблемы — в этом случае мы не можем писать данные на винчестер с максимальной скоростью, поскольку ему будет доставаться лишь часть времени: контроллер вынужден постоянно опрашивать прочие устройства. И чем их больше, тем больше времени будет уходить впустую. Даже если все остальные устройства на самом деле не используются — понять это можно только их опросив, поскольку сами они «безголосны».
В мобильных компьютерах, кстати, такая организация приводила к еще одной проблеме, связанной с экономией энергии — не может никакое устройство само уйти в «глубокий сон». Если оно это сделает, контроллер сочтет, что нет больше такого на шине, и его отключит. Соответственно, какая-то часть любого USB-устройства должна всегда бодрствовать и сообщать «я здесь» на каждом обороте «карусели». Ну а потери производительности будут в любом компьютере. Почему так было сделано? А для младших скоростных режимов ничего более сложного и не требуется: там потери на опрос устройств невелики, поскольку невелики и скорости. Поскольку старшие изначально не планировались, шину решено было удешевить. Потом это, конечно же, аукнулось.
Точно так же, как и полудуплексный режим работы. Дело в том, что в каждый момент времени контроллер может либо передавать, либо получать данные. Проблема в том, что большинство реальных операций требует делать и то, и другое. Например, все операции с носителями информации в конечном итоге сводятся к чтению и записи отдельных секторов. А чтобы прочитать сектор нам надо передать накопителю его номер. Т. е. на практике все выглядит так: включаемся в режим записи, передаем номер сектора, переходим в режим чтения — oops: а временной квант-то для винчестера уже и кончился. Пора опрашивать клавиатуру и другие устройства, а запрошенный сектор данных мы получим только на следующем обороте «карусели».
Нельзя сказать, что разработчики об этих проблемах не знали изначально — знали, но не придавали им значения. Да и не нужно это было, поскольку планировалось лишь два небыстрых режима. Причем два их было только потому, что для многих планируемых потребителей шины, таких, как мыши или клавиатуры, например, и 12 Мбит/с много. «Карусель» для среднескоростных устройств вращается с частотой 1 кГц, что гарантировано не позволяет иметь время доступа ниже 1 мс. Чтобы низкоскоростные устройства совсем уж сильно не мешали всем остальным, официально им положено «требовать к себе внимания» не чаще, чем на одном обороте «карусели» из десяти. На практике в Windows (да и во многих других системах) используется делитель восемь, который в свое время еще и получалось легко изменить. На базе чего работали различные методики «разгона» USB-мышей, что прекратилось, поскольку производители последних решили побороться с данной практикой для улучшения продаж более дорогих игровых моделей: таковые, как правило, рассчитаны на Full Speed, так что в тюнинге не нуждаются (хоть это и противоречит изначальным задумкам разработчиков USB), а дешевым моделям поддерживаемую частоту опроса ограничили жестко на уровне контроллера. Главное же, что при скоростях 12 или, тем более, 1,5 Мбит/с, накладные расходы на опрос устройств или переключение направления передачи по шине невелики, а более сложные механизмы удорожили бы шину.
И потребовали бы, как минимум, использовать более дорогие кабели. Это тоже оказалось одной из проблем FireWire, но не USB, где удалось ограничиться всего четырьмя проводами: одна пара для питания и одна — для передачи данных. Всех — и пользовательских, и команд со стороны контроллера и т. п. Из-за всего этого и реальная скорость передачи информации оказывалась более низкой, чем некоторые пользователи предполагали, разделив 12 на 8 и «получив» 1,5 МБ/с. На деле для кодирования одного байта использовалось 10 бит, а накладные расходы при выбранной схеме работы составляли примерно 20% — так что на практике «оригинальная» версия USB обеспечивает скорость порядка 1 МБ/с. Естественно, касается это только Full Speed, но «заботиться» о совместимости между первыми двумя режимами не нужно: они появились одновременно. И используются до сих пор, поскольку многие USB-устройства с тех пор практически не изменились. Зато понадобилось подключать новые — поддержка которых изначально не предполагалась.
High Speed: отменяем ограничения, добавляем проблемы
Старт FireWire в те же годы был неудачным по большому количеству причин. USB повезло намного больше — ее поддержку интегрировали во все чипсеты, порты начали встречаться во всех новых ПК, возможности оказались достаточными для производителей периферии. В том числе, и такой, использование которой в рамках «экосистемы» USB изначально не предполагалось — например, именно тогда начался «расцвет» USB-флэшек, радикально нарушающих изначальное правило подключения полноскоростных устройств «только кабелем». Да и производители более емких и быстрых накопителей «устали ждать» распространения FireWire — и начали внедрять USB. И не только они.
В таких условиях у разработчиков FireWire и USB (разделить их сложно — фактически составы «1394 Trade Association» и «USB Implementers Forum» в те годы пересекались почти полностью) было два пути: либо продолжать попытки продавить FireWire, либо… перестать сдерживать USB. Разброд и шатания кончились выбором второго варианта — это сделать было проще, поскольку интерфейс уже пошел в массы. Соответственно, решено было модифицировать USB, но с сохранением полной совместимости с первыми версиями.
Формально это вылилось в добавление третьего режима High Speed, пропускная способность в котором могла достигать 480 Мбит/с. Скачок сразу в 40 раз — большая редкость по меркам индустрии, однако упрощало его то, что изначальные версии были ограничены искусственно. Правда добавление высокоскоростного режима потребовало усложнить логику его работы — а вот тут уже выбранный изначально вариант с полудуплексной передачей данных по однобитному интерфейсу начал мешать. К тому же, возможны были проблемы совместимости со старыми устройствами — на новшества не рассчитанными. Поэтому от изначальной концепции немного отошли — количество корневых хабов в системе виртуально удвоилось, хотя оба подключались к одним и тем же портам. Но «используемый» в каждый момент времени зависел от того, какое устройство подключалось с другой стороны, что определялось на этапе его инициализации. Если старое, то в дело вступал все тот UHCI- или OHCI-контроллер (т. е. реализующий протоколы для работы с режимами Low/Full Speed — проще говоря, соответствующий спецификациям USB 1.1), что и ранее. Соответственно, для таких устройств вообще ничего не менялось. А вот «новые» быстрые логически подключались к EHCI-контроллеру с измененным протоколом работы. Не радикально измененным — в частности, так и осталась та же «карусель» с разделением времени. Только для быстрых устройств она была своей собственной и вращалась в восемь раз быстрее — частота опроса составила уже 8 кГц. Кроме того, было реализовано такое новшество, как изохронный режим работы — потоковая передача данных на заранее «оговоренной» контроллером и устройством стабильной скорости. Таковой был нужен в мультимедийных приложениях и полностью подрывал позиции FireWire в области цифрового видео. Фактически этой шине удалось плотно закрепиться только в камерах на кассетах mini-DV, но в 2004 году свет увидела Panasonic NV-GS400 (позднее — еще несколько моделей этого производителя), снабженная и USB 2.0 и FireWire. Для подключения к компьютеру оба могли использоваться идентичным образом, благо типовой поток mini-DV составлял 25 Мбит/с, что в рамках изохронного режима USB High Speed реализовать было несложно.
Даже если не рассматривать усовершенствования логики работы, скоростные возможности USB улучшились радикально. Сохранение архаичной схемы с разделением времени их и старой схемы кодирования, конечно, их ограничивало — но за счет увеличения «сырой» пропускной способности и уменьшения задержек, «отмасштабировать» скорость получилось практически линейно. Было 12 Мбит/с, превращающиеся в 1 МБ/с — стало 480 Мбит/с в теории и до 40 МБ/с на практике. Правда именно «до» — получить их в конкретной связке «контроллер-устройство» удавалось далеко не всегда: при таких скоростях многое уже начало зависеть от конкретных реализаций. И не всегда «виновниками» более низких скоростей оказывались именно устройства: многие USB-контроллеры (в т. ч. и встроенные в массовые чипсеты Intel, например) больше ~30 МБ/с на практике «не тянули». Что, естественно, вызывало возмущение пользователей, решивших, что 480 Мбит/с — это 60 МБ/с и никак иначе.
К чему добавились и первые выкрутасы со стороны производителей. Как уже было сказано, формально спецификации USB 2.0 включали в себя все три скоростных режима. В итоге на рынке быстро появились устройства с гордой маркировкой «USB 2.0 Full Speed». По форме правильно — по существу издевательство, поскольку в данном случае речь не шла не только о 60 или там 30 МБ/с: естественно, скорость была равна все тому же 1 МБ/с, что и ранее.
Еще одну проблему добавили… кабели. Стараясь сохранить полную совместимость, разработчики не учли, что на рынке к тому моменту был завал таковых, не отвечающих требованиям стандарта. Тоже следствие экономии на спичках: USB 1.x со своими искусственно ограниченными скоростями относилась к сечению проводников крайне лояльно. В итоге вместо «обещанных» стандартом 3-5 метров на практике для устройств, имеющих собственное питание, можно было собрать и «сложную конструкцию» из удлинителей до 10 м. И все работало. А при внедрении USB 2.0 перестало работать — даже от одного кабеля, длиной пару метров. Оказалось, что ходовые (на тот момент) недорогие кабели 28 AWG «не добивают» и до метра, а дорогие «качественные» 26 AWG позволяют получить порядка полутора. В общем, совместимость нашли, но осадочек остался.
Но в целом спецификации USB 2.0 оказались существенным, логичным и вообще нужным шагом вперед. Тем более, что идея использования «виртуальных» контроллеров в «нулевые» позволила решить еще одну «родовую» проблему USB, а именно низкую скорость в рамках всей шины. Например, возьмем контроллеры USB 2.0, встроенный в последние южные мосты Intel без поддержки USB 3.0 (пятое и шестое семейства). Обычно их называют именно контроллером, поддерживающим 14 портов USB 2.0. На практике все чуть сложнее — «контроллер» состоит из семи (!) UHCI-контроллеров (т. е. поддерживающих режимы Low Speed и Full Speed) с семью же двухпортовыми корневыми хабами, и двух EHCI-контроллеров (поддерживающих только High Speed) с двумя корневыми хабами на восемь и шесть портов соответственно. Абсолютно не похоже на изначальный проект однокорневого дерева на 127 оконечных устройств, зато работает. Низко- и среднескоростные контроллеры крутятся в своих «песочницах», не вмешиваясь в жизнь высокоскоростных. Да и среди последних может одновременно и независимо друг от друга работать пара устройств — главное подключить их к двум разным корневым хабам. Суммарная пиковая пропускная способность шины в такой реализации составляет 2 × 480 + 7 × 12 = 1044 Мбит/с, т. е. более одного гигабита в секунду — будь контроллер действительно единым (и единственным) получить такое было бы невозможно. В своей линейке южных мостов тех лет компания AMD пошла еще дальше, реализовав три EHCI-контроллера, семь UHCI и еще один восьмой UHCI совсем «в сторонке» от них, так что суммарно удалось превысить 1,5 Гбит/с.
На самом деле миф о том, что для USB 2.0 пиковый предел в 480 Мбит/с именно суммарный на все устройства (для других версий стандарта — соответственно) живуч. И существует даже сейчас. Но к действительности он отношения не имеет: ограничена пропускная способность на один корневой хаб, а их стало много — хотя четверть века назад предполагался только один. Другой вопрос, что это, все-таки, суммарная пропускная способность, да еще и пиковая, а возникла необходимость повысить скорость, доступную одному устройству. И именно это было сделано около 15 лет назад.
SuperSpeed: совершенно новый USB, каким его никто не видел
Мощность компьютерных систем продолжала расти — усложнялись и периферийные устройства. Назрела необходимость существенного увеличения пропускной способности интерфейса USB, благо он стал уже основным проводным «ближнего действия». Сделать это сохраняя архаичную систему с корневыми хабами, разделением времени и полудуплексным режимом передачи данных, было невозможно. И пытаться никто не стал — для сохранения совместимости в очередной раз использовалась виртуализация контроллеров. Которые стали уже достаточно сложными — но остались недорогими благодаря общему прогрессу в микроэлектронике.
Что изменилось в SuperSpeed-режиме? Да, практически, все. Во-первых, этот режим не полудуплексный, а дуалсимплексный с выделенным каналом управления — контроллер может принимать и отправлять данные одновременно, т. е. исчезли задержки на переключение направлений шины. Иногда даже говорят о полном дуплексе, чего, вообще-то, нет: полнодуплексный канал на 5 Гбит/с позволил бы иметь именно столько и туда, и обратно, а на деле указывается суммарная пропускная способность. Которая, впрочем, даже в теории на порядок выше, чем 480 Мбит/с High Speed, а на практике можно «выжать» и еще немного «сверху».
Во-вторых, устройства, работающие в режиме SuperSpeed, не нужно постоянно опрашивать — для них (но только для них) реализован полноценный механизм прерываний! Следовательно, и этот источник задержек устранен. Более того — в процессе работы устанавливается соединение между хостом и конкретным устройством, т. е. фактически реализуется соединение «точка-точка» как у FireWire. Кстати, позаботились и о полноценном управлении питанием: в новой схеме совершенно официально появились статусы Idle, Sleep и Suspend. Таким образом, SuperSpeed-устройства вовсе не обязаны больше постоянно «болтаться» на шине когда нужно и когда не нужно. В общем, это не дополнительный скоростной режим старой шины — это совершенно новый и несовместимый со старым сам по себе интерфейс. Более того — он и аппаратно с ним ограничено совместим: USB 2.0 обходилась одной парой проводов для передачи данных в обоих направлениях, а в 3.х нужно минимум две. Вот две и добавили, но сохранив на месте «старую». Именно она используется на этапе инициализации, а далее (если и устройство, и контроллер поддерживают соответствующие режимы и соединены соответствующим кабелем) уже «включается» поддерживаемый SS-режим с отдельными линиями (в обе стороны) для передачи данных. Потоки команд и прочей служебной информации им не мешают, используя «унаследованную» — пропускную способность интерфейса новый режим использует более полно, в частности, и поэтому.
Но удвоение количества проводов в кабеле, естественно, потребовало переработать разъемы. Это удалось сделать с частичным сохранением совместимости. Точнее, основной для хост-систем «прямоугольный» разъем Type-A внешне не изменился — просто контактов в нескольких местах добавилось. А вот разъемы для подключения устройств пришлось переделывать существенно, так что старые-то кабели к ним подходят, но новые к старым — нет. Что сильно мешало, например, лет пять назад — мы либо используем один кабель с micro-USB и для телефона, и для внешнего SSD, но на скоростях USB 2.0, либо получаем полную скорость — но не можем уже обойтись одним кабелем. Позднее проблема была решена элегантным образом — но позднее. И «унаследованной» технике никак не помогла.
Соединение «точка-точка» позволило упорядочить и работу со старыми устройствами в старых режимах. Сделать это было необходимо, поскольку программные протоколы UHCI/OHCI (до 12 Мбит/с) и EHCI (480 Мбит/с) разрабатывались еще в конце 90-х и рассчитаны были на 32-разрядную адресацию в соответствующем режиме работы процессора. Но к концу нулевых вовсю шел уже переход на 64-разрядные системы. Так что по-хорошему весь пласт «унаследованного» ПО нужно было либо переписать, либо просто упразднить. Выбран был второй вариант — все необходимое низкоскоростным режимам было внесено в «суперскоростной» протокол XHCI. В итоге появилась возможность ограничиться и одним XHCI-контроллером на все порты, причем вне зависимости от их скоростных режимов. Для унаследованных же устройств ничего не менялось — они продолжали считать, что крутятся на своей карусели и получали старые же команды. Только таковая «крутилась» уже для одного потребителя — организовываясь для него контроллером на соответствующем порту. А новые устройства на скоростных портах работали уже в новом режиме, полностью реализуя свои возможности. Программный драйвер можно было оставить один — только для XHCI.
Казалось бы, что может пойти не так? Кое-что пошло. Первое время производителей интересовала совместимость со старыми системами, так что ограничиваться только XHCI они не стали. В первых чипсетах Intel с поддержкой USB 3.0 (т. е. седьмой серии) XHCI-контроллер добавился к старым UHCI и EHCI. Минимальной поддерживаемой операционной системой для XHCI была выбрана Windows 7, так что пользователи Windows XP и Vista поддержку SuperSpeed-режима не получили. А вот работоспособность режимов USB 2.0 — сохранилась: поскольку эти драйверы уже были написаны ранее. Потом были восьмая и девятая серии чипсетов, где количество скоростных портов увеличили с четырех до шести, но организацию виртуального USB-контроллера не трогали. А в 2015 году вместе со Skylake появились чипсеты сотой серии — с полной реализацией задумок USB-форума. Все 14 портов (в старших чипсетах) обслуживал один единственный XHCI-контроллер. Что это дало пользователям Windows 7 и новее? Например, ускорение работы режима High Speed — старый EHCI-контроллер (не менявшийся с нулевых) обеспечивал реальную скорость работы до 28-30 МБ/с, а новый XHCI с тем же устройством мог «разогнаться» и до 40 МБ/с. Учитывая, что до сих пор подобные устройства все еще встречаются и даже выпускаются, а в прошлом десятилетии их было намного больше, ценное приобретение. Но только для пользователей Windows 7/8/10. Причем и установка первой «с нуля» немного затруднилась — в оригинальном дистрибутиве нужного XHCI-драйвера нет, так что, если его не интегрировать заранее, на этапе установки USB-периферия работать не может. А под управлением более старых версий Windows заставить ее работать можно только нетривиальными методами. Таковые, впрочем, появились позднее, поскольку некоторые любители Windows XP оказались очень упорными, но, естественно, массовому пользователю подобные костыли и бубны в принципе не подходили.
В свое время проблема нашумевшая — но, как и все подобные со временем оказалась забытой. В отличие от реальных побочных эффектов внедрения SuperSpeed, на которые не все сначала обратили внимание. Основное — ранее мы имели пропускную способность на контроллер, а по новому стилю — на порт. Казалось бы, серьезное улучшение — ведь устройства больше не дерутся друг с другом вообще, а каждое может получить свои 5 Гбит/с гарантировано. Да. Но нет. Проблема никуда не делась — просто она «переехала» на другую сторону контроллера. Теперь значение стал иметь интерфейс его подключения к системе. Во времена USB 2.0 пачку портов можно было добавить простой и недорогой PCI-платой — с 3.0 такие фокусы не проходят: даже пара SuperSpeed портов первой версии уже выходят за рамки возможностей этой шины. И вообще для полноценной реализации хотя бы одного такого порта нужна как минимум одна линия PCIe 2.0 — на момент принятия спецификаций USB 3.0 самого быстрого интерфейса, которого во многих компьютерах еще и просто не было. Разумеется, реальные устройства зачастую сами работают на более низких скоростях, да и теорию массового обслуживания никто не отменял, так что первые контроллеры USB 3.0 с двумя и даже четырьмя портами подключались к системе при помощи PCIe 2.0 x1 и даже умудрялись сносно работать на PCIe 1.1 x1, но понятно было, что со временем проблемы будут усиливаться.
И даже внутри чипсетов порты USB перестали в итоге скороговоркой перечисляться в числе прочих, а, наряду с Ethernet, SATA и PCIe начали конкурировать за внутренние ресурсы. Именно поэтому, например, в той же сотой серии чипсетов Intel было до 14 USB-портов, лишь до 10 из которых скоростные. На деле у производителя плат был выбор: либо четыре USB 2.0 и 10 USB 3.0, либо 8 USB 2.0, но 6 USB 3.0 — плюс дополнительные четыре линии PCIe 3.0 (по отдельности или дополнительный слот PCIe x4, например).
Зато период с 2008 по 2013 год оказался непривычно спокойным в плане прозрачности наименований. Рубя совместимость со старым миром, было принято решение, что сертификацию на соответствие USB 3.0 получат только SuperSpeed-устройства, а все более медленными так и останутся жить под зонтиком USB 2.0. Короче говоря, «USB 3.0 FullSpeed» в принципе невозможен. Что прекрасно и удивительно — и очень необычно для разработчиков. Которые немногим позднее вернулись в нормальное для себя состояние.
USB 3.1 и USB 3.2: продолжение плясок на граблях
Основная революция, как видим, случилась в рамках USB 3.0 — дальше концепцию можно было только улучшать. Например, раз у нас все равно есть порты разного сорта и от этого никуда не деться, значит кроме медленных и скоростных, могут появиться и «сверхскоростные». По крайней мере, в теории. Но и на практике тоже — благодаря прогрессу микроэлектроники, реальная возможность «упаковывать» в стандартный канал не 5, а 10 Гбит/с за пять лет появилась. И появился в итоге режим SuperSpeed+, который решено было в окончательном виде переименовать в SuperSpeed 10Gbps, а старый SuperSpeed тоже облагородить довеском 5Gbps. Фантазии, разработчикам было не занимать, причем непонятной пользователям — которые предпочли бы ориентироваться просто по номерам версий. Но такой возможности им не дали. Наоборот — 3.1 полностью вобрал в себя 3.0 с переименованием: просто «старые» устройства теперь можно было сертифицировать как USB 3.1 Gen1, а новые «сверхскоростные» — USB 3.1 Gen2. Ко вторым еще и первое время подключать было практически нечего — разве что внешние массивы RAID0 из пары SSD, при помощи которых новые возможности и демонстрировались. Но чтобы решить эту проблему, смежникам потребовалось лет пять.
Прочих дополнений в рамках стандарта было немало, но производительности они не касались. Зато был предложен компактный симметричный разъем Type-C, постепенно становящийся все более актуальным в качестве универсального. Впрочем, разъемы — это отдельная (будущая) тема. А применительно к режимам работы просто скажем, что разъем с двумя наборами контактов (что необходимо для симметричности подключения) разработчикам очень пригодился в 2017 году — когда была принята спецификация USB 3.2. А в ней новые «сдвоенные» скоростные режимы Gen1×2 и Gen2×2. Первый был мертворожденным, поскольку обеспечивал лишь те же 10 Гбит/с, что и простой Gen2, но сложнее и дороже. А вот второй до последнего времени был максимумом для USB — поскольку целых 20 Гбит/с.
Но не добавить ложку дегтя разработчики не могли, заодно и переименовав предыдущие режимы еще раз. Т. е. давно выпущено на рынок устройство USB 3.0 — и это просто 3.0. Позднее начали продаваться сертифицированные как USB 3.1 Gen1 — но и это просто USB 3.0 на самом деле. После 2017 года появляются USB 3.2 Gen1 — и это тоже просто USB 3.0. А хост-контроллеру USB 3.2 никто не запрещает ограничиваться лишь портами Gen1 — и чем это отличается от USB 3.0 от 2008 года? Правильно — ничем. Нет разницы между Понтием и Пилатом. И быть не может — поскольку это один и тот же человек. Что еще смешнее, контроллер-то может быть «нормальным», но производитель конкретной платы для экономии разводит его порты исключительно как Gen1. Такое сплошь и рядом встречается на бюджетных моделях плат для AMD AM4 на чипсетах А320, В450 и даже В550 — хотя даже первый может обеспечить системе один порт Gen2, а последний позволяет получить до шести таких портов (два «своих» и еще четыре при использовании процессоров Ryzen 3000 и выше). И ладно еще бюджетные платы, выбираемые самостоятельно — в таком же положении можно до сих пор оказаться и покупая ноутбук или моноблок на самых что ни на есть современных платформах, типа Intel Tiger Lake.
В общем, подытоживая, после революции USB 3.0 началась эволюция еще лет на 10. Полезная — появились новые скоростные режимы, удобные разъемы, переработан подход к питанию устройств (что тоже заслуживает отдельного разговора) и многое другое. Правда вот в плане бардака переименования оказались еще хуже, чем «включения» двадцатилетней давности. Могли бы быть лучше — если бы по мановению волшебной USB-палочки переименовывались бы и все существующие к тому моменту устройства. Но таковой, естественно, не существует. И то, что USB 3.2 позволяет устройствам работать в четыре раза быстрее, чем USB 3.0… Позволяет. Но соответствующим устройствам на соответствующих портах. Причем и создание нового универсального разъема оказалось полезно лишь для разработки новых устройств. Для старых — все тот же зоопарк кабелей и переходников, накопившийся за 20 лет.
Заранее пугающий USB4
В рамках новейшей (принята летом 2019 года) версии спецификаций тоже планировалась революция — а именно объединение протоколов USB и Thunderbolt. Однако таковая осталась опциональной, так что сохраняется достигнутое еще во времена USB 3.1 и Thunderbolt 3 положение: одинаковые разъемы и возможная, но не обязательная совместимость.
При этом некоторые особенности Thunderbolt все-таки стали обязательными — в частности, все хост-порты USB4 обязаны поддерживать вывод видеосигнала, т. е. инкапсулируют DisplayPort. Это важное усовершенствование по сравнению с USB3 — где DisplayPort был опциональным в альтернативном режиме. Кроме того, USB4 может (но не обязана) туннелировать и PCIe — так что по большому счету новый стандарт может заменить Thunderbolt 3 и 4 полностью. Правда есть одна тонкость: отсутствие совместимости способно поставить крест на использовании существующих хабов и устройств, а идея в обязательном порядке покупать новые вряд ли вызовет энтузиазм пользователей. Пока, впрочем, проблем нет — все уже появившиеся на рынке реализации USB4 поддерживают и Thunderbolt, но в дальнейшем положение дел может и испортиться.
Не все гладко и с родными USB-режимами. Новых два — Gen2 и Gen3. При этом для USB4 обязательна поддержка двух линков (раз это уже придумано, незачем отступать), так что превращаются они в Gen2×2 и Gen3×2 с пропускной способностью 20 и 40 Гбит/с соответственно. А теперь вишенка на торте: USB 3.2 Gen2×2 и USB4 Gen2×2 называются почти одинаково, имеют одинаковую пропускную способность и вообще очень похожи со стороны пользователя, но это абсолютно разные режимы, использующие в частности разные схемы кодирования информации и вообще несовместимые на электрическом уровне! Зачем нужно было создавать такую путаницу с самого начала? Спросите у разработчиков.
В довершение всех бед USB 3.2 Gen2×2 не попал в список режимов старых версий USB, которые обязаны туннелироваться в USB4! Максимальным обязательным является «старый» Gen2 с пропускной способностью 10 Гбит/с, являющийся также и наибольшим общим множителем с Thunderbolt 3 и 4. Вы уже успели купить устройства с поддержкой USB 3.2 Gen2×2? Возможно, его тоже придется менять на аналогичное, рассчитанное на USB4 Gen2×2, либо терпеть вдвое более низкую скорость. Особую пикантность этому добавляет то, что многие покупали топовые внешние SSD как раз в расчете на перспективу, а перспектива может и не настать. Что, впрочем, сомнительно — раз «старый» Gen2 тоже поддерживается и обязательна работа по двум ликам, а «старый» Gen2×2 прямо не запрещен, производителям контроллеров есть смысл превратить опциональную поддержку в стандартную. Но кто-то из них может придерживаться и обратного мнения. Например, AMD в своих чипсетах USB 3.2 Gen2×2 не поддерживала — так что нужно будет проверить: как в ее новых продуктах дела обстоят с этим режимом. Вот насчет Intel можно быть, скорее всего, спокойным. Насчет альтернативных производителей дискретных контроллеров — тоже. Хотя им придется и непросто — для полной реализации новых скоростных режимов нужен быстрый внешний интерфейс, да еще и видеосигнал надо как-то на контроллер заводить — та проблема, которая изрядно попортила уже жизнь производителям Thunderbolt-контроллеров. Все просто только с ноутбуками — если ограничиваться интегрированной графикой и встраивать контроллер USB4 непосредственно в SoC рядышком с GPU и PCIe, то реализация может быть и относительно простой.
Но вообще с PCIe вопрос, как уже сказано, скользкий. И разработка какого-то отдельного режима для его туннелирования изначально не слишком осмысленное мероприятие. Почему? А потому, что пиковая пропускная способность USB4 те же 40 Гбит/с, как и у давно существующих Thunderbolt 3 и 4. Это примерно эквивалентно PCIe Gen3 x4 — чего хватало всем возможным потребителям в середине прошлого десятилетия (когда и был разработан Thunderbolt 3), но, как мы уже убедились, сегодня уже радикально недостаточно для внешних видеокарт. Да и внешние SSD будет ограничивать уже достигнутыми скоростями. В общем, единственный разумный вариант для топовых систем — как раз «полная» версия USB4 — с новыми и старыми скоростными режимами USB, а также полной совместимостью с Thunderbolt 4. Что-то «попроще» обойдется и без Thunderbolt (и туннелирования PCIe тоже) — в ряде случаев на минималках: USB4 Gen2×2 плюс совместимость со старыми USB-режимами до Gen2 включительно плюс DisplayPort. При этом портов нового стиля много быть просто не может — они слишком уж быстрые, а проблема интерфейса остро встала еще во времена USB3 Gen2 и Gen2×2. Сейчас она только усугубится.
К чему еще добавится и полное упразднение всех старых разъемов — в светлое будущее не берут ни Type-A, ни micro-B, ни всех остальных: исключительно Type-C — универсальный и имеющий достаточное для двух линков количество контактов. Из чего, конечно, не следует их мгновенное исчезновение отовсюду, поскольку старые спецификации никто не отменяет. Но придется и оставлять в хост-системах старые Type-A. Часть которых наверняка как и ранее будет поддерживать только USB 2.0 — для мышей, клавиатур и подобной низкоскоростной периферии он не менее актуален, чем было 20 лет назад. Хуже другое — вполне возможно, что на каком-то этапе придется ставить разные порты Type-C. Сейчас-то с топовыми платами не всегда просто понять — какой именно из одинаковых внешних разъемов нужно использовать: одни поддерживают Thunderbolt, другие — USB3 Gen2×2, а в каких-то так и остался обычный USB3 Gen2, который есть и в первых двух. А теперь добавьте в эту картину еще пару-тройку портов USB4 🙂
С другой стороны, это издержки того, что в настольных системах портов разных можно разместить много — вот и размещают много и разных. В ноутбуках их нередко 3-4, так что есть возможность все сделать совместимыми с USB4 — либо с USB4 и Thunderbolt. Со временем, впрочем, в топовых ноутбуках к этому добавится еще и отдельный Thunderbolt 5 — ведь проблема пропускной способности для PCIe-устройств с выходом USB4 не решена, а решать ее надо. Однако можно надеяться, что его одного и хватит — просто для контроллеров ТВ5 сделают обязательной поддержку режимов USB4. Точно так же, как в TB3 в обязательном порядке «встроили» совместимость с (лучшим на тот момент) USB3 Gen2 — хорошее не грех и повторить. Но проблемы выбора нужных устройств и даже «правильного» порта для подключения свежекупленного устройства пользователям по-прежнему придется решать. Новый стандарт мог бы навести в этом вопросе больше порядка. Но что получилось — то получилось. Одних лишь двух разных режимов Gen2×2 с одинаковой пропускной способностью и почти одинаковыми названиями, но несовместимых друг с другом вполне достаточно.
Как видим, за прошедшие 25 лет шина USB существенно изменилась со всех точек зрения. Когда-то на задней панели компьютеров сиротливо пылилась пара ненужных портов, способных обеспечить скорость передачи данных 12 Мбит/с (на двоих) и выдать 2,5 Вт мощности (каждому)… при условии, что найдется еще что к ним подключить. Нынешние реализации стали быстрыми, удобными и универсальными: максимальные скорости выросли в три тысячи (!) раз (на заре внедрения USB еще не было даже внутренних интерфейсов с подобными скоростями — пропускная способность AGP 2X, например, намного ниже), «прокормить» уже можно и достаточно «серьезного потребителя», которому требуется несколько десятков ватт. Портов уже не пара, а иногда и больше десятка, что позволяет и разместить их в удобных местах, и сами по себе (во всяком случае, новомодный Type-C, становящийся основным стандартом) стали более удобными. Впрочем, с этим мы забежали вперед — темы эволюции разъемов и энергоснабжения сами по себе обширны и заслуживают отдельного разговора. В скором времени мы ими займемся подробно 🙂
В общем, «гадкий утенок» несколько раз сменил оперение и стал действительно универсальным стандартом, причем не только в традиционных «компьютерных» областях: в начале нулевых на человека, предположившего наличие USB-портов в телевизорах, автомагнитолах и даже на автобусных остановках, посмотрели бы, мягко говоря, странно. Хотя изначально такой успех никто не прогнозировал. Скорее, даже, наоборот — будущее должно было принадлежать другим интерфейсам. Но вышло совсем иначе. Так бывает часто — разработанное идеальное универсальное решение оказывается невостребованным, а массовую популярность обретает что-то ограниченное и несуразное. Справедливости ради, ограниченными и несуразными были первые реализации — в процессе развития, как видим, переделано было практически все и радикально. Победи FireWire — была бы она сейчас точно такой же. Только название другое — и не более того. Но многие переделки привели к изрядной путанице. И к тому, что часть пользователей до сих пор применительно к USB оперирует понятиями многолетней давности. Считая, например, что шина остается полнодуплексной с разделением времени и пропускной способности, т. е. такой, какой она была во времена USB 2.0. А это уже давно не так. Причем некоторые технические решения позволяют воспользоваться частью преимуществ современных реализаций USB и формально старым устройствам. И внедрение USB4 будет аналогичным.
Так что на деле USB сегодня и в ближайшей перспективе — действительно универсальный и очень мощный интерфейс, покрывающий большинство потребностей массового пользователя. Не без особенностей. Но разобраться с ними не так уж и сложно. Правда нельзя не отметить, что изначальная простота концепции один порт на всё за время развития исчезла. Портов оказалось много и разных. Но благодаря сохранению совместимости даже там, где ее было сложно обеспечить, принципиальных неудобств не возникает.