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) используется для сигнализации наличия данных обратного канала.



Sitelinkx by eXtro-media.de
Яндекс.Метрика