USB MSD. Часть 3. USB класс накопителей данных (перевод)


Ответ на команды

В сеансах связи с накопителями данных, использующими команды SCSI, USB-хост посылает командный блок, хост или устройство могут посылать данные и устройство возвращает состояние. В операциях чтения/записи блоков данных хост задаёт область чтения/записи, используя логический адрес блока (logical block address - LBA). Сеансы связи по шине USB ничего не знают и не могут знать о файлах, директориях или кластерах на носителе.


Рисунок 1. Процесс записи MSD через шину USB
Рисунок 1. Процесс записи MSD через шину USB

В BBB-протоколе сеансы связи состоят из двух или трёх этапов: передача команды, передача данных (не используется для некоторых команд) и возврат состояния. (Не путайте эти этапы со стадиями транзакции на шине USB или фазами контрольного обмена USB). На этапе пересылки команды хост передаёт командный блок, упакованный в структуру, именуемую "контейнером командного блока" (command block wrapper - CBW). На этапе пересылки данных, отсутствующем в некоторых командах, хост или устройство передают данные. На этапе пересылки состояния устройство передаёт статусную информацию, упакованную в структуру, именуемую "контейнером состояния команды" (command status wrapper - CSW).


Рисунок 2. Процесс чтения MSD через шину USB
Рисунок 2. Процесс чтения MSD через шину USB

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


Контейнер командного блока (CBW)

Хост посылает контейнер командного блока (CBW) в оконечную точку устройства, работающую в режиме приёма (OUT). CBW содержит собственно командный блок и дополнительную информацию о команде (смотри таблицу 3-6). Длина CBW - 31 байт.


Таблица 3-6. Структура CBW
 
0 dCBWSignature Число 0x43425355 [* "CBSU"], служащее опознавательным признаком CBW. Младший байт (0x55) передаётся первым [* т.е. "USBC"]
4 dCBWTag Число, которое должно совпасть со значением поля "dCSWTag" в ответном контейнере состояния команды (CSW)
8 dCBWDataTransferLength Объём информации, передаваемой на этапе пересылки данных, в байтах
12 bmCBWFlags Направление передачи на этапе пересылки данных. Бит 7 = 0 для направления OUT (от хоста к устройству). Бит 7 = 1 для направления IN (от устройства к хосту). Если этап передачи данных отсутствует, данный бит игнорируется. Все остальные биты должны быть равны нулю
13 bCBWLUN Старшие 4 бита зарезервированы и должны быть равны нулю. Младшие биты задают номер логического накопителя (LUN) (для устройств, поддерживающих несколько логических накопителей) или равны нулю
14 bCBWCBLength Старшие три бита зарезервированы и равны нулю. Младшие 5 бит задают длину команды (CDB) внутри поля "CBWCB" в байтах. Допустимы значения в диапазоне 1..16. Все определённые к настоящему моменту командные блоки имеют длину не менее шести байт
15..31 CBWCB Собственно командный блок

Поле "CBWCB" содержит блок-описатель команды (command descriptor block - CDB) или, для краткости, просто "командный блок". Командный блок (CDB) - структура, содержащая команду и зависящую от неё дополнительную информацию. Длина поля "CBWCB" всегда равна 16 байтам. В том случае, когда CDB короче этого значения, оставшееся место заполняется нулями.

В большинстве случаев поле "bCBWCBLength" содержит длину командного блока (CDB) внутри поля "CBWCB" без дополняющих нулей. Исключением являются UFI устройства (значение поля "bInterfaceSubClass" равно 0x04). Для них хост должен указывать длину командного блока не короче 12 байт, дополняя короткие команды нулями. Кроме того, для командных блоков содержащих 6-байтовую SCSI-команду "REQUEST SENSE" драйвер накопителей Windows некорректно присваивает полю "bCBWCBLength" значение 12 байт даже для не-UFI устройств.

Поле "bmCBWFlags" указывает направление передачи на этапе пересылки данных, а поле "dCBWDataTransferLength" сообщает объём передаваемых данных в байтах.

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

  • CBW принят после контейнера состояния команды (CSW) или после сброса.
  • Длина CBW равна 31 байту.
  • Поле "dCBWSignature" содержит правильное значение.

Содержимое командного блока (CBW) считается значимым, если верны все три условия:

  • Все биты, помеченные как зарезервированные, равны нулю.
  • Поле "bCBWLUN" содержит поддерживаемый номер накопителя.
  • Содержимое командного блока ("CBWCB") и его длина ("bCBWCBLength") имеют смысл для подкласса интерфейса устройства.

После приёма командного блока (CBW) устройство должно приготовиться, в зависимости от команды, к приёму данных в оконечную точку, работающую в режиме OUT, или передаче данных или контейнера состояния (CSW) из точки в режиме IN.

ПредпросмотрAttachmentSize
usb_msd_3.zip68.8 КБ