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

Механизм передачи данных является асинхронным и блочным. Блок передаваемых данных называется USB-фреймом или USB-кадром и передается за фиксированный временной интервал. Оперирование командами и блоками данных реализуется при помощи логической абстракции, называемой каналом. Внешнее устройство также делится на логические абстракции, называемые конечными точками. Таким образом, канал является логической связкой между хост-контроллером и конечной точкой внешнего устройства. Канал можно сравнить с открытым файлом.

Каналы USB

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

Информация по каналу передается в виде пакетов (Packet). Каждый пакет начинается с поля синхронизации SYNC (SYNChronization), за которым следует идентификатор пакета PID (Packet IDentifier). Поле Check представляет собой побитовую инверсию PID.

Структура пакета

Систему USB следует разделить на три логических уровня с определенными правилами взаимодействия. Устройство USB содержит интерфейсную, логическую и функциональную части. Хост тоже делится на три части - интерфейсную, системную и программное обеспечение. Каждая часть отвечает только за определенный круг задач. Логическое и реальное взаимодействие между ними показано на рисунке.

Уровни USB


Таким образом, операция обмена данными между прикладной программой и шиной USВ выполняется путем передачи буферов памяти через следующие уровни.
Уровень клиентского ПО в хосте:

  • обычно представляется драйвером устройства USB;
  • обеспечивает взаимодействие пользователя с операционной системой с одной стороны и системным драйвером с другой.
Уровень системного обеспечения USB в хосте (USBD, Universal Serial Bus Driver):
  • управляет нумерацией устройств на шине;
  • управляет распределением пропускной способности шины и мощности питания;
  • обрабатывает запросы пользовательских драйверов.
Хост-контроллер интерфейса шины USB (HCD, Host Controller Driver):
  • преобразует запросы ввода/вывода в структуры данных, по которым хост-контроллер выполняет физические транзакции;
  • работает с регистрами хост-контроллера.

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

  • буфер памяти, называемый клиентским буфером;
  • пакет запроса на в/в (IRP, Input/output Request Packet), указывающий тип необходимой операции.
  • IRP содержит только сведения о запросе (адрес и длина буфера в оперативной памяти). Непосредственно обработкой запроса занимается системный драйвер USB.

Уровень системного драйвера USB необходим для управления ресурсами USB. Он отвечает за выполнение следующих действий:

  • распределение полосы пропускания шины USB;
  • назначение логических адресов устройств каждому физическому USB-устройству;
  • планирование транзакций.

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

Клиентское ПО посылает IPR-запросы уровню USBD.

Драйвер USBD разбивает запросы на транзакции по следующим правилам:

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

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

  • планирует исполнение полученных транзакций, добавляя их к списку транзакций;
  • извлекает из списка очередную транзакцию и передает ее уровню хост-контроллера интерфейса шины USB;
  • отслеживает состояние каждой транзакции вплоть до ее завершения.

Хост-контроллер интерфейса шины USB формирует кадры.
Кадры передаются последовательной передачей бит по методу NRZI.

Передача данных по уровням

Таким образом, можно сформировать следующую упрощенную схему:

  • каждый кадр состоит из наиболее приоритетных посылок, состав которых формирует драйвер хоста;
  • каждая передача состоит из одной или нескольких транзакций;
  • каждая транзакция состоит из пакетов;
  • каждый пакет состоит из идентификатора пакета, данных (если они есть) и контрольной суммы.
Общая схема USB протокола