Это все связано с арбитражем. Любая система, которая требует подключения нескольких устройств, нуждается в определенном способе определения того, кому и когда следует разговаривать. Существуют разные схемы, как и следовало ожидать, в зависимости от приложения.
Типичный пример - в сети у нас много узлов, которые все общаются друг с другом. Это выполняется каждым узлом, имеющим адрес (например, IP-адрес), и когда узел хочет установить связь с другим узлом, он отправляет пакет по этому адресу. Затем у вас есть устройства, такие как маршрутизаторы, которые принимают пакеты, поступающие на несколько портов, и направляют их на правильный порт. Арбитраж выполняется с использованием памяти для хранения пакетов, пока порт назначения не освободится.
Теперь на USB. На самом деле это намного проще, чем работа в сети, потому что не все узлы сделаны равными. У вас есть два вида, хост и конечная точка. Существует только один хост, но может быть много конечных точек. В этом случае арбитраж намного проще, потому что только порт хоста может говорить по желанию. Конечные точки могут общаться только по запросу хоста , и хост всегда говорит только с одной конечной точкой за раз.
Для пакетов host-> endpoint концентраторы USB просто передают запрос от хоста всем конечным точкам. Поскольку все конечные точки имеют адрес, только тот, которому адресован запрос, будет что-либо делать с ним (например, отвечать), все остальные будут игнорировать пакет.
Для пакетов конечная точка-> хост сначала отправляет пакет определенной конечной точке по адресу, чтобы сказать «вы можете говорить сейчас», а затем эта конечная точка должна немедленно отправить ответ. Поскольку в любой момент времени разрешено говорить только одной конечной точке, концентратор USB будет просто маршрутизировать пакет с любого порта, который отвечает на запрос от хоста.
С точки зрения того, как хост определяет, какие устройства подключены, и как конечная точка получает их адрес, это достигается путем перечисления.
Все порты хоста и концентратора имеют нагрузочные резисторы (15 кОм) на линиях D + и D-. Они переводят линии данных этого порта в известное состояние, когда нет подключенного устройства, состояние, в котором порт вообще не будет отправлять данные по линиям D + / D-.
Когда устройство подключено, оно заявляет о себе, подключая линию передачи данных D + (полная скорость) или D- (низкая скорость) к VCC с использованием резистора 1,5 кОм. Это вызывает событие перечисления. Затем порт начнет процесс настройки устройства и назначения адреса. Если вы подключите два устройства одновременно, они будут перечислены по одному .
Если концентраторов нет, хост просто обращается к новому устройству и настраивает его. Если в системе есть концентраторы, это тот концентратор, который сообщает о подключении нового устройства . Если концентратор сообщает, что подключено новое устройство, хост-компьютер проинструктирует концентратор перезагрузить новое устройство и запустить связь. Во время сброса конечной точке присваивается адрес по умолчанию 0 (*). Затем хост может связаться с конечной точкой, используя адрес по умолчанию, и настроить для него уникальный ненулевой адрес, который позволит ему узнать, когда с ним разговаривают.
(*) Поскольку в каждый момент времени перечисляется только одно устройство, адрес 0 всегда будет уникальным для вновь подключенного устройства.
Тогда вы можете спросить: «Ну, как я могу одновременно говорить о нескольких устройствах?». Допустим, у вас есть мышь, клавиатура и флэш-накопитель, подключенные к одному USB-концентратору. Мы все знаем, что вы можете одновременно использовать мышь и клавиатуру, одновременно копируя файлы на флэш-накопитель и обратно, но если одновременно может общаться только одно устройство, как это возможно?
Ну, все сводится к тому, что несколько сотен миллисекунд, которые требуются вашему мозгу, чтобы заметить, что вы нажали клавишу, и ожидаете, что экран обновится, - вечность для компьютера. Интерфейс USB 2.0 может работать на скорости до 480 Мбит / с (USB 3.1 может работать на скорости до 10 Гбит / с!), Что означает, что, хотя хост в любой момент времени общается только с одной конечной точкой, он циклически переключается между ними, так что вы можете не говори, что делает это.
USB Host: «Эй, мышь на порту 1, скажите мне, если вы переехали. Хорошо, теперь клавиатура на порту 2, есть ли у вас какие-либо нажатия клавиш, чтобы сообщить? Теперь вы там на порту 3, флэш-накопитель, сохраните эти данные для меня. С кем-то еще, с кем мне нужно поговорить? Нет, хорошо, тогда наведите указатель мыши на порт 1, скажите, переехали ли вы ... "
Человек: «О, смотри, компьютер заметил, что я просто переместил мышь, нажал клавишу на клавиатуре и скопировал изображение на флэш-накопитель одновременно!»
Хост-устройство отслеживает, какие адреса конечных точек используются, и будет отправлять пакеты каждому из них последовательно или по мере необходимости (т. Е. Когда ОС запрашивает доступ к конкретному устройству). Таким образом, хотя не все это происходит одновременно, арбитраж настолько быстр, что компьютеры не могут понять разницу между людьми.