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


Подробнее о состоянии останова (STALL)

Класс накопителей данных отличается необычным использованием состояния "STALL" для квинтирования передачи неструктурированных данных (bulk). В USB-устройствах других классов посылающая сторона может обозначать окончание обмена передачей короткого пакета с длиной блока данных меньшей, чем величина "wMaxPacketSize", включая нулевое значение. Накопители данных для окончания обмена или сообщения об ошибке используют состояние "STALL".

После того, как оконечная точка сообщила о состоянии "STALL", она переходит в режим останова. Для возобновления обмена с данной точкой хост должен послать запрос "Setup" с опцией "Clear Feature(ENDPOINT_HALT)" и адресом интересующей оконечной точки в поле "wIndex".

(Нулевая оконечная точка тоже может использовать состояние "STALL" для подтверждения связи. Приняв запрос "Get Max LUN" устройство с единственным логическим накопителем может возвратить "STALL" для сообщения о том, что команда не поддерживается. Но нулевая оконечная точка возобновляет нормальную работу с началом новой управляющей ("Setup") транзакции.)

Накопитель данных должен в обязательном порядке перевести в состояние останова одну или обе оконечные точки в случае:

  • если на этапе пересылки данных устройство передало меньше данных, чем было запрошено, оно должно остановить передающую (IN) оконечную точку.
  • если принят недействительный командный контейнер (CBW), устройство должно перевести в состояние останова передающую (IN) оконечную точку и, кроме того, либо перевести в состояние останова принимающую (OUT) оконечную точку, либо принимать и отбрасывать любые приходящие к ней данные.
  • в случае появления внутренней ошибки, требующей вмешательства хоста, устройство может либо перевести в останов оконечную точку, с которой ведётся обмен, и выставить значение поля "bCSWStatus" в 0x02, либо перевести в останов обе оконечные точки до проведения процедуры сброса-восстановления.

Накопители данных могут переводить "bulk" оконечные точки в останов в следующих ситуациях:

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

Ниже описываются тринадцать возможных вариантов использования останова (STALL) в командах для накопителей данных.

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