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


Тринадцать вариантов для любых ситуаций

Спецификация накопителей данных, работающих по BBB-протоколу, поясняет, как обе стороны должны действовать после посылки хостом команды во всех 13 случаях. Варианты 1, 6, 12 соответствуют нормальному развитию событий, когда и хост, и устройство ожидают одного и того же объёма информации и направления передачи на этапе пересылки данных. Остальные случаи относятся к несовпадающим ожиданиям сторон.

  1. Хост не ожидает этапа пересылки данных.
    Устройство не ожидает этапа пересылки данных.
     
  2. Хост не ожидает этапа пересылки данных.
    Устройство собирается передавать данные.
     
  3. Хост не ожидает этапа пересылки данных.
    Устройство собирается принимать данные.
     
  4. Хост собирается принимать данные.
    Устройство не ожидает этапа пересылки данных.
     
  5. Хост собирается принимать данные.
    Устройство собирается передавать меньше данных, чем ожидает хост.
     
  6. Хост собирается принимать данные.
    Устройство собирается передавать объявленный объём данных.
     
  7. Хост собирается принимать данные.
    Устройство собирается передавать больше данных, чем ожидает хост.
     
  8. Хост собирается принимать данные.
    Устройство собирается принимать данные.
     
  9. Хост собирается передавать данные.
    Устройство не ожидает этапа пересылки данных.
     
  10. Хост собирается передавать данные.
    Устройство собирается передавать данные.
     
  11. Хост собирается передавать данные.
    Устройство собирается принимать меньше данных, чем собирается послать хост.
     
  12. Хост собирается передавать данные.
    Устройство собирается принимать объявленный объём данных.
     
  13. Хост собирается передавать данные.
    Устройство собирается принимать больше данных, чем объявляет хост.
     

Далее детализируются действия сторон в каждом из 13 случаев.


Хост не ожидает этапа пересылки данных

Признаком отсутствия этапа пересылки данных является нулевое значение поля "dCBWDataTransferLength" (CBW).

В наиболее распространённом случае (вариант 1) устройство согласно с отсутствием этапа пересылки данных и устанавливает "bCSWStatus" (CSW) в 0x00 или 0x01, а "dCSWDataResidue" в нуль.

Если устройство собиралось передавать (вариант 2) или принимать (вариант 3) данные, то оно устанавливает "bCSWStatus" (CSW) в 0x02 и может перевести в останов передающую (IN) оконечную точку. Приняв статус "bCSWStatus" 0x02, хост игнорирует значение поля "dCSWDataResidue" и проводит либо сброс-восстановление, либо инициализацию порта.


Хост собирается принимать данные

Если значение поля "dCBWDataTransferLength" (CBW) отлично от нуля и бит "Direction" в поле "bmCBWFlags" установлен в единицу, хост готовится к приёму на этапе пересылки данных.

В большинстве случаев (вариант 6) устройство собирается передавать указанное в поле "dCBWDataTransferLength" (CBW) количество байт данных, после выдачи которых устанавливает поле "bCSWStatus" (CSW) в 0x00 или 0x01, а поле "dCSWDataResidue" в нуль.

Если устройство собирается передавать меньше, чем запрошено хостом, (вариант 5) или не собиралось передавать данные (вариант 4), оно может дополнить пакет до запрошенного объёма любыми данными (например, нулями), либо отослать меньше данных, чем запрошено, либо не отсылать их вообще. Устройство, посылающее меньше запрошенного объёма данных, должно перевести передающую (IN) оконечную точку в останов. В любом случае, устройство устанавливает поле "bCSWStatus" (CSW) в 0x00 или 0x01, а поле "dCSWDataResidue" в соответствии с разницей между запрошенным в "dCBWDataTransferLength" (CBW) и отосланным объёмами без учёта дополняющих данных.

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


Хост собирается передавать данные

Если значение поля "dCBWDataTransferLength" отлично от нуля и бит "Direction" в поле "bmCBWFlags" равен нулю, хост собирается передавать данные на этапе пересылки.

В большинстве случаев устройство собирается принимать (вариант 12) и принимает запрошенный в поле "dCBWDataTransferLength" (CBW) объём данных, после чего устанавливает поле "bCSWStatus" (CSW) в 0x00 или 0x01, а "dCSWDataResidue" в нуль.

Если устройство собирается принимать меньше предписываемого полем "dCBWDataTransferLength" числа байт (вариант 11) или не собирается принимать вовсе (вариант 9), оно может принять "dCBWDataTransferLength" байт, что рекомендуется, или досрочно завершить передачу переводом принимающей (OUT) оконечной точки в останов. В любом случае, поле "bCSWStatus" устанавливается в 0x00 или 0x01, а полю "dCSWDataResidue" присваевается значение разницы между запрошенным в "dCBWDataTransferLength" (CBW) и обработанным объёмами данных. Объём обработанных данных может быть меньше или равен объёму принятых устройством. Перевод в таких обстоятельствах принимающей (OUT) оконечной точки в останов может порождать проблемы в Windows, поэтому большинство устройств принимают объявленный в "dCBWDataTransferLength" объём данных и присваивают полю "dCSWDataResidue" подобающее значение.

Если устройство собралось принимать данных больше, чем объявлено полем "dCBWDataTransferLength" (вариант 13) или собралось передавать данные хосту (вариант 10), то оно может принять или запрошенное, или, переведя принимающую (OUT) точку в останов, меньшее количество данных. В любом случае устройство присваивает полю "bCSWStatus" (CSW) значение 0x02 и может опционально перевести передающую (IN) оконечную точку в останов. Получив состояние 0x02, хост игнорирует значение поля "dCSWDataResidue" (CSW) и проводит сброс-восстановление или инициализацию порта устройства.

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