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


Контейнер состояния команды (CSW)

Таблица 3-7 показывает структуру 13-и байтного контейнера состояния команды.


Таблица 3-7. Структура контейнера состояния (CSW)
 
Смещение (байты) Имя поля Ширина (биты) Описание
0 dCSWSignature 32 Число 0x53425355 [* "SBSU"], служащее опознавательным признаком CBW. Младший байт (0x55) передаётся первым [* т.е. "USBS"].
4 dCSWTag 32 Число из поля "dCBWTag" принятого командного блока (CBW)
8 dCSWDataResidue 32 Для случая посылки хостом данных в устройство поле сообщает разницу между "dCBWDataTransferLength" и числом реально обработанных данных. Для случая посылки устройством данных хосту, поле сообщает разницу между "dCBWDataTransferLength" и числом байт данных переданных устройством, без учёта байтов-заполнителей
12 bCSWStatus 8 0x00 = успешное выполнение. 0x01 = ошибка исполнения. 0x02 = ошибка протокольной последовательности. Хост должен провести процедуру сброса и восстановления

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

  • Длина CSW - 13 байт.
  • Поле "dCSWSignature" содержит правильное значение.
  • Значение поля "dCSWTag" равно значению поля "dCBWTag" ранее посланного командного контейнера (CBW).

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

  • Поле "bCSWStatus" равно 0x02.
  • Поле "bCSWStatus" равно 0x00 или 0x01 и значение поля "dCSWDataResidue" меньше или равно значению поля "dCBWDataTransferLength" контейнера команды (CBW).

В поле "dCSWDataResidue" (CSW) устройство сообщает обработаны ли все запрашивавшиеся в CBW к приёму либо передаче данные.

В командах, подразумевающих на этапе пересылки данных передачу в устройство, поле "dCSWDataResidue" содержит разницу между длиной блока данных, заявленной в командном блоке в поле "dCBWDataTransferLength", и объёмом обработанных устройством данных. Если устройство обработало "dCBWDataTransferLength" байт, то поле "dCSWDataResidue" равно нулю.

В командах, подразумевающих на этапе пересылки данных передачу из устройства, поле "dCSWDataResidue" (CSW) показывает разницу между запрошенным через "dCBWDataTransferLength" (CBW) объёмом данных и реально переданных из устройства, исключая нули-заполнители. Если устройство передало "dCBWDataTransferLength" (CBW) байт, то поле "dCSWDataResidue" (CSW) равно нулю.

Поле "bCSWStatus" содержит признак завершения команды: 0x00 означает успешное, а 0x01 - неуспешное выполнение. В последнем случае хосту следует немедленно послать SCSI-команду "REQUEST SENSE", чтобы получить дополнительную информацию. Протокол, понуждающий хост посылать запрос "REQUEST SENSE" в ответ на ошибку исполнения, иногда называют "с автоматическим запросом", так как запрос инициируется на уровне драйвера USB хоста, а не программным кодом более высокого уровня. Обработка исключений и поясняющих их данных происходит "автоматически" с точки зрения кода более высокого уровня. Подробнее о команде "REQUEST SENSE" говорится в части 6.

Значение 0x02 означает необходимость проведения хостом процедуры сброса и восстановления устройства, состоящей из следующих управляющих сеансов обмена в указанной последовательности:

1. "Bulk Only Mass Storage Reset" - сброс накопителей, работающих по BBB-протоколу. По окончании сброса устройство готово принять новый командный контейнер (CBW). Этот вид сброса не должен менять состояние бита-переключателя (data-toggle) или выводить оконечную точку из режима останова (STALL). Это специализированная команда для класса накопителей данных.

2. Послать запрос "Clear Feature(ENDPOINT_HALT)" для передающей (IN) оконечной точки. Устройство инициализирует бит-переключатель в состояние "DATA0". Оконечная точка восстанавливает нормальный обмен, если это возможно. Это стандартный управляющий ("Setup") запрос USB.

3. Послать запрос "Clear Feature(ENDPOINT_HALT)" для принимающей (OUT) оконечной точки. Устройство инициализирует бит-переключатель в состояние "DATA0". Оконечная точка восстанавливает нормальный обмен, если это возможно. Это стандартный управляющий ("Setup") запрос USB.

Другим вариантом является управляющий запрос "Set Port Feature (PORT_RESET)" инициализирующий USB-порт устройства. После этого хост должен провести процедуру повторного опознания. Такой вариант плохо подходит композитным устройствам, имеющим много активных интерфейсов, так как сброс порта воздействует на все интерфейсы, но может быть необходим в случае обмена с устройством, попавшим в состояние ошибки после попытки хоста провести сброс-восстановление. Такие изделия существуют. Драйвер накопителей Windows предпочитает инициализировать порт, а не проводить сброс-восстановление.

Управление обменом с оконечными точками, работающими в режиме передачи неструктурированных данных (Bulk)

ПредпросмотрВложениеРазмер
usb_msd_3.zip68.8 КБ