PersCom — Компьютерная Энциклопедия Компьютерная Энциклопедия

USB

USB

Принтеры USB

Класс и протоколы принтеров с интерфейсом USB определены документом «Universal Serial Bus Device Class Definition for Printing Devices», первая версия которого появилась в 1997 году, версия 1.1 — в 2000 г. Протоколы определены с учетом обеспечения легкого перехода от традиционных интерфейсов принтера: последовательного (RS-232, RS-422) и параллельного (однонаправленного Centronics или двунаправленного IEEE 1284). Подключение принтера USB эмулирует его подключение к LPT-порту в режиме SPP или двунаправленном (IEEE 1284). Классовое определение USB принтера не затрагивает данные, передаваемые принтеру: это может быть любой язык описания страниц (PDL — Page Descriptor Language). Принтеры могут работать только на скоростях FS или HS (на низкой скорости в USB нет передач массивов).

Принтер имеет все стандартные дескрипторы устройства USB, специфических классовых дескрипторов нет. В дескрипторе устройства принтер сообщает нулевые коды класса, подкласса и протокола. Принтер имеет по крайней мере одну конфигурацию; в конфигурации имеется один интерфейс. На уровне интерфейса для принтеров определен класс 07 подкласс 01. Код протокола определяется выбранной альтернатиной установки интерфейса:

  • однонаправленный (Unidirectional) интерфейс: данные на принтер передаются через конечную точку типа Bulk-OUT; состояние от принтера в формате, принятом для параллельного порта (3 значимых бита регистра состояния LPT-порта) передается по классово-специфическому запросу Get_Port_Status через EP0. Этому варианту интерфейса соответствует код протокола 01;
  • двунаправленный (Bi-Directional) интерфейс: данные на принтер передаются через конечную точку типа Bulk-OUT; состояние от принтера передается через конечную точку типа Bulk-IN. Здесь также доступно получение состояния (3 бита) по запросу Get_Port_Status через EP0. Этому варианту интерфейса соответствует код протокола 02;
  • двунаправленный интерфейс с доставкой данных по логическим каналам в соответствии с IEEE 1284.4 (IEEE 1284.4 compatible Bi-directional Interface), введенный в версии 1.1. Модель обмена та же, что и у предыдущего. Этому варианту интерфейса соответствует код протокола 03.

В принтере используется (кроме нулевой) только одна конечная точка для вывода данных (Bulk-OUT), для двунаправленного интерфейса — еще и Bulk-IN для получения данных обратного канала (состояния).

Принтер поддерживает стандартные запросы к устройствам USB, кроме установки метки времени (у принтера нет изохронных точек). Кроме того, он должен поддерживать классовые запросы (см. таблицу).

По запросу Get_Device_Id принтер возвращает строку данных (Capabilities String), описывающих его в формате и синтаксисе, определенном в IEEE-1284. В запросе в поле wValue указывается номер интересующей конфигурации, старший байт wIndex задает номер интерфейса (0), младший — номер альтернативной установки. Возвращаемая строка начинается с 2-байтного поля длины всей строки (старший байт — первый), за которой идет собственно идентификатор.

Таблица. Классовые запросы к принтерам

Запрос bmRequestType bRequest
Get_Device_Id 10100001b 0
Get_Port_Status 10100001b 1
Soft_Reset 00100011b 2

По запросу Get_Port_Status принтер возвращает байт состояния, аналогичный байту состояния LPT-порта. Здесь значимы только 3 бита (остальные — нули):

  • бит 3 (Not Error), признак ошибки: 1 — нет ошибки, 0 — есть;
  • бит 4 (Select), признак выбранности принтера: 1 — выбран (доступен), 0 — нет;
  • бит 5 (Paper Empty), признак конца бумаги: 1 — нет бумаги, 0 — есть.

По запросу Soft_Reset принтер очищает свой буфер данных, переходит в исходное состояние, переводит в исходное состояние и разблокирует (если они были остановлены) конечные точки. На его состояние в плане интерфейса USB (адресован, сконфигурирован) этот сброс не влияет.

Для работы с USB-принтером следует считать дескриптор устройства и дескрипторы всех возможных конфигураций, выбрать конфигурацию и требуемую альтернативную установку интерфейса. При работе с двунаправленным интерфейсом некоторое неудобство вызывает тип конечной точки обратного канала (Bulk): запрос данных о состоянии принтера, который делает драйвер, будет «висеть» до срабатывания тайм-аута драйвера, если принтеру «нечего сказать». Формальное определение результатов запроса Get_Port_Status (по крайней мере, согласно спецификации версии 1.1) не позволяет судить о наличии данных в обратном канале. Однако, вспоминая работу LPT-порта, которую эмулирует подключение по USB, можно предположить, что признаком наличия данных обратного канала будет бит 3 (Not Error). В LPT-порту этот бит представляет текущее состояние сигнала Error#, который во всех режимах IEEE 1284 (исключая режим совместимости с SPP) используется для сигнализации наличия данных обратного канала.



Запросы, пакеты и транзакции

Модель передачи данных

Каждая единица клиентского ПО (обычно представляемая драйвером) связывается с одним интерфейсом своего устройства (функции) монопольно и независимо (см. рисунок ниже). Связи на этом рисунке обозначают коммуникационные каналы (communication pipes), которые устанавливаются между драйверами устройств и их конечными точками. Каналы устанавливаются только с конечными точками устройств, относящимися к выбранным (из альтернативных) вариантам интерфейсов активной конфигурации. Другие конечные точки недоступны.

Запросы, пакеты и транзакции

Для передачи или приема данных клиентское ПО посылает к каналу пакет запроса ввода/вывода — IRP (Input/Output Request Packet) и ждет уведомления о завершении его отработки. Формат IRP определяется реализацией драйвера USBD в конкретной ОС. В IRP имеются только сведения о запросе (местоположение буфера передаваемых данных в оперативной памяти и длина передачи); от свойств конкретного текущего подключения (скорость, допустимый размер пакета) драйвер устройства абстрагируется. Отработкой запроса в виде транзакций на шине USB занимается драйвер USBD; при необходимости он разбивает на части длинные запросы (пакеты), пригодные для передачи за одну транзакцию. Транзакция на шине USB — это последовательность обмена пакетами между хостом и ПУ, в ходе которой может быть передан или принят один пакет данных (возможны транзакции, в которых данные не передаются). Отработка запроса считается завершенной, когда успешно выполняются все связанные с ним транзакции. «Временные трудности», встречающиеся при их выполнении (неготовность к обмену данными), до сведения клиентского драйвера не доводятся — ему остается только ждать завершения обменов (или выхода по тайм-ауту). Однако устройство может сигнализировать о серьезных ошибках (ответом STALL), что приводит к аварийному завершению запроса, о чем уведомляется клиентский драйвер. В этом случае отбрасываются и все последующие запросы к данному каналу. Возобновление работы с данным каналом возможно лишь после явного уведомления об обработке ошибочной ситуации, которое драйвер устройства делает с помощью специального запроса (тоже вызова USBD).

Длинные запросы разбиваются на транзакции так, чтобы использовать максимальный размер пакета. Последний пакет с остатком может оказаться короче максимального размера. Хост-контроллер имеет средства обнаружения приема от устройства «неполновесного» пакета, размер которого меньше ожидаемого. В запросе IRP указывается, следует ли особым образом реагировать на это событие. Особая реакция может быть двоякой:

  • считать короткий пакет разделителем, указывающим на конец блока данных. При этом данный IRP завершается нормально и исполняются следующие запросы к данному каналу;
  • считать короткий пакет признаком ошибки, по которому канал останавливается (все его последующие ожидающие запросы сбрасываются).

При передаче массивов использование укороченных пакетов в качестве разделителей наиболее естественно. Таким образом, например, в одном из вариантов протоколов для устройств хранения данных укороченные пакеты известной длины используются в качестве управляющих.




Подтверждения, управление потоком и сигнализация ошибок устройства

Для подтверждений приема, управления потоком и сигнализации ошибок используются пакеты квитирования (handshake packets). Из этих пакетов хост-контроллер может посылать устройству только пакет ACK, подтверждающий безошибочный прием пакета данных. Устройство для ответа хосту использует следующие пакеты квитирования:

 ACK — подтверждение (положительное) успешного выполнения транзакции вывода или управления;
 NAK — отрицательное подтверждение, является признаком неготовности устройства к выполнению данной транзакции (нет данных для передачи хосту, отсутствует место в буфере для приема, не завершена операция управления). Это является нормальным ответом, о котором не узнает никто, кроме хост-контроллера, вынужденного повторить данную транзакцию позже. В транзакциях ввода ответ NAK устройство дает вместо пакета данных, если они не готовы;
 STALL — сообщение о серьезной ошибке, которое означает, что без специального программного вмешательства работа с данной конечной точкой становится невозможной. Этот ответ доводится до сведения и драйвера USBD, отменяющего дальнейшие транзакции с этой точкой, и до клиентского драйвера, от которого и ожидается программное вмешательство, разблокирующее точку. В управляющих транзакциях (Control) ответ STALL означает невыполнимость данного запроса; разблокирования точки при этом не требуется.

Управление потоком при выводе данных, основанное только на возможности ответа NAK в случае неготовности устройства, весьма неэффективно расходует пропускную способность шины: чтобы убедиться в неготовности устройства, по шине впустую передается большой пакет данных. В USB 2.0 этой неприятности в транзакциях Bulk-OUT и Control избегают, применив протокол проб (Ping Protocol). Хост может опросить готовность устройства к приему пакета максимального размера, послав ему маркер-пробник PING. На этот маркер устройство может ответить подтверждением ACK (при готовности) или NAK (если не способно принять пакет максимального размера). Отрицательный ответ заставит хост повторить пробу позже, положительный разрешит ему выполнить транзакцию вывода данных. На транзакцию вывода после положительного ответа на пробу ответы устройства более разнообразны:

  • ACK означает успешный прием и готовность принять следующий полноразмерный пакет;
  • NYET означает успешный прием, но неготовность к следующему пакету;
  • NAK — неожиданный ответ (он противоречит успеху пробы), но он возможен, если устройство внезапно стало временно не готово.

Высокоскоростное устройство в дескрипторах конечных точек сообщает о возможной интенсивности посылок NAK: поле bInterval для конечных точек типа Bulk и Control указывает число микрокадров, приходящееся на один NAK (0 означает, что устройство никогда не ответит NAK’ом на транзакцию вывода).



Совместная работа устройств с разными скоростями на одной шине

Спецификация USB позволяет к одной шине подключать устройства, работающие на существенно различающихся скоростях передачи. Для их нормального сосуществования в плане распределения времени микрокадров для каждой из скоростей приняты соответствующие ограничения на максимальную длину поля данных пакета:

  • низкая скорость (LS, 1,5 Мбит/с) — до 8 байт, при этом двухстадийная транзакция управления занимает 30% кадра, а транзакция прерывания — 14%;
  • полная скорость (FS, 12 Мбит/с) — до 1023 байт для изохронных обменов (69% кадра) и 64 байт для остальных типов (5% кадра);
  • высокая скорость (HS, 480 Мбит/с) — до 1024 байт для прерываний и изохронных обменов (14% микрокадра), до 512 байт для передач массивов и управления (7–8% микрокадра).

Приемопередатчики (да и соединительные кабели) низкоскоростных устройств не способны работать с сигналами полной скорости, на которой передаются все маркеры SOF и пакеты обмена с полноскоростными устройствами. Поэтому хаб USB не транслирует трафик на свои нисходящие порты, к которым подключены низкоскоростные устройства, до тех пор, пока хост-контроллер не передаст специального маркера — преамбулы низкоскоростного обмена (PRE). Этот маркер игнорируется всеми устройствами, кроме хабов. Пакетом-преамбулой хост-контроллер гарантирует, что следующий пакет будет им передан на низкой скорости. Этим пакетом будет маркер, определяющий тип транзакции с LS-устройством, а в транзакциях вывода — и пакет данных (перед которым требуется своя преамбула). Хаб разрешает транслировать на свой нисходящий порт с LS-устройством только один пакет, следующий за преамбулой; по концу пакета (увидев EOP на низкой скорости) он снова запрещает трансляцию. Чтобы хаб успел переключить режим своего приемопередатчика, между преамбулой и последующим пакетом вводится зазор (4 битовых интервала FS). Для ответа LS-устройства никаких преамбул не нужно — хабы способны прозрачно передавать восходящий трафик на обеих скоростях (LS и FS). Хост-контроллер, естественно, должен принимать пакеты и на FS, и на LS. Очевидно, что низкоскоростные транзакции расходуют время кадра весьма неэффективно, но в USB 1.x с этим мирятся ради возможности подключения дешевых устройств и упрощения хабов, которые являются просто повторителями сигналов. Заметим, что маркеры SOF не транслируются на низкоскоростные порты, так что изохронный обмен, для которого они необходимы, для LS-устройств невозможен и не поддерживается.

Эффективное сосуществование трех скоростей в USB 2.0 реализуется сложнее и обходится дороже. Во-первых, хост-контроллер USB 2.0 содержит фактически два контроллера — EHC, работающий только на высокой скорости, и контроллеркомпаньон (возможно, и не один) USB 1.x (UHC или OHC) для полной и низкой скорости. Корневой хаб может иметь равноправные порты, но в процессе автоконфигурирования, в зависимости от свойств подключенного к нему устройства (или хаба), каждый порт соединяется с соответствующим контроллером. Существуют системные платы с фиксированным распределением портов по контроллерам: часть портов отводится под USB 2.0 и подключена к EHC, часть — под USB 1.1 и подключена к UHC или OHC. Ради повышения пропускной способности применяют и индивидуальные контроллеры (UHC или OHC) для каждого порта USB 1.x.

Во-вторых, хабы USB 2.0 имеют более сложную структуру: кроме повторителя он имеет еще и транслятор транзакций. Когда восходящий и нисходящие порты хаба работают на одинаковой скорости (FS или HS), хаб работает в режиме повторителя. При этом транзакция с устройством, подключенным к хабу, занимает весь канал от хост-контроллера до устройства на все время своего выполнения. Если же к порту хаба USB 2.0, работающего на HS, подключается устройство или хаб 1.1, то применяются расщепленные транзакции. Здесь по части канала от хоста до хаба (его транслятора транзакций) обмен проходит на скорости HS, а между транслятором транзакций и устройством (или хабом) USB 1.x обмен идет уже на его «родной» скорости FS или LS. Эти обмены разнесены во времени, между ними могут вклиниваться любые транзакции на высокой скорости (в том числе и расщепленные). Таким образом, расщепленные транзакции позволяют не расходовать попусту пропускную способность высокоскоростной шины: транзакции с хабом на высокой скорости занимают в 40 (для FS) и даже в 320 (для LS) раз меньше времени шины, чем транзакции с самим целевым устройством. От старых (USB 1.x) устройств и хабов все тонкости расщепленных транзакций скрываются, чем и обеспечивается обратная совместимость.

Порт хаба имеет возможность аппаратно определить, какую скорость поддерживает подключенное устройство. Все HS-устройства по включению работают в режиме FS, и только после взаимного согласования с портом хаба перейдут в режим HS. Если HS-устройство подключается к хабу USB 1.x, который этого согласования не поддерживает, устройство останется в режиме FS, возможно, с усеченной функциональностью. В системе с USB 2.0 у устройства можно спросить (запросом дескрипторов), что изменится в его функциональности, если его подключить на другой скорости (изменив топологию соединений).

Вполне понятно, что устройство USB 2.0 сможет реализовать высокую скорость, только если по пути от него к хост-контроллеру (тоже 2.0) будут встречаться только хабы 2.0. Если это правило нарушить и между ним и контроллером 2.0 окажется старый хаб, то связь может быть установлена только в режиме FS. Если такая скорость устройство и клиентское ПО устроит (к примеру, для принтера и сканера это выльется только в большее время ожидания пользователя), то подключенное устройство работать будет, но появится сообщение о неоптимальной конфигурации соединений. По возможности ее (конфигурацию) следует исправить, благо переключения кабелей USB можно выполнять на ходу. Устройства и ПО, критичные к полосе пропускания шины, в неправильной конфигурации работать откажутся и категорично потребуют переключений. Если же хост-контроллер старый, то все преимущества USB 2.0 окажутся недоступными пользователю. В этом случае придется менять хост-контроллер (менять системную плату или приобретать PCI-карту контроллера USB 2.0).

Контроллер и хабы USB 2.0 позволяют повысить суммарную пропускную способность шины и для старых устройств. Если устройства FS подключать к разным портам хабов USB 2.0 (включая и корневой), то для них возможно повышение суммарной пропускной способности шины USB по сравнению с 12 Мбит/с во столько раз, сколько используется портов высокоскоростных хабов. Конечно, при этом суммарная пропускная способность для всех устройств, включая и HS-устройства, не может превышать общую пропускную способность HS-шины (нужно учитывать и накладные расходы). Кроме того, нужно учитывать архитектурные особенности хост-контроллера и хабов. Хост-контроллер может умножать пропускную способность FS/LS на число своих встроенных контроллеров USB 1.x. «Умножительные способности» хаба зависят от реализации его транслятора транзакций.



Передача данных

Передача по двум проводам USB не ограничивается лишь дифференциальными сигналами. Приемники и передатчики позволяют использовать множество состояний линий и команд, используемых для организации аппаратного интерфейса. При этом учитываются не только уровни электрических сигналов, но и время нахождения их в том или ином состоянии. По уровням напряжения на входах приемников различают сигналы:

  • Diff0: (D+) — (D-) > 200 мВ при (D+) > 2 В;
  • Diff1: (D-) — (D+) > 200 мВ при (D-) > 2 В;
  • SE0 (single-ended zero): (D+) < 0,8 В и (D-) < 0,8 В.

Для передачи данных используются сигналы Diff0 и Diff1, они кодируют состояния J (Data J State) и K (Data K State). На полной и высокой скорости состояние J соответствует сигналу Diff1, состояние K — сигналу Diff0. На низкой скорости назначение обратное: J — Diff0 и K — Diff1. Последовательная передача информации ведется с использованием кодирования NRZI (см. рисунок ниже): при передачи нулевого бита в начале битового интервала состояние сигнала (J или K) меняется на противоположное; при передаче единичного — не меняется. Длительность битового интервала определяется номинальной частотой передачи: 0,666… мкс для низкой скорости (LS, 1,5 Мбит/с); 83,3… нс для полной (FS, 12 Мбит/с) и 2,0833… нс для высокой (HS, 480 Мбит/с).

Состояние покоя (Bus Idle) на FS/LS соответствует длительному состоянию J, а на HS — состоянию SE0.

Признаком начала пакета является переход из состояния покоя в состояние K, что является первым битом синхропоследовательности (Sync), — последовательности нулей, которая в NRZI кодируется переключением состояний (J и K) в начале каждого битового интервала. Синхропоследовательность позволяет приемнику настроиться на нужною частоту и фазу синхронизации. Синхропоследовательность завершает единичный бит (нет смены состояния), последующие за ним биты относятся к идентификатору и телу пакета. На HS начальная часть синхропоследовательности может быть потеряна хабом (из-за задержки реакции на детектор сигнала). С учетом этого синхросполедовательность для HS удлинена до 32 бит (включая последний единичный бит). Проходя через 5 хабов, каждый из которых может потерять до 4 синхробит, синхропоследовательность может оказаться сокращенной до 12 бит.

Для того чтобы синхронизация не терялась на монотонном сигнале (при передаче длинной последовательности единиц), применяется техника вставки бит (bit stuffing): после каждых 6 подряд следующих единиц передатчик вставляет «0», приемник эти вставленные биты удаляет. Если принимается более 6 единиц подряд, это считается ошибкой вставки бит.

Конец пакета (EOP) на FS/LS обозначается сигналом SE0, длящимся 2 битовых интервала, за которым следует переход в состояние покоя (Bus Idle). На HS для признака EOP используется нарушение правила вставки бит. Здесь в качестве EOP используется передача последовательности 01111111 без вставки бит. Прием седьмой единицы вызовет индикацию ошибки вставки бит, которая на HS и является признаком конца пакета. Нормальный пакет при этом от действительно ошибочного будет отличаться целым количеством принятых байт (это условие может и не проверяться) и верным значением CRC. Начальный нолик (вызывающий смену состояния) в EOP облегчает точное определение границы тела пакета. В пакетах SOF поле EOP удлинено до 40 бит для обнаружения отключения устройства.



Подкатегории