USB MSD. Часть 6. Команды SCSI (перевод)


Запретить/разрешить извлечение носителя (PREVENT ALLOW MEDIUM REMOVAL)

Команда "PREVENT ALLOW MEDIUM REMOVAL" разрешает или запрещает извлечение носителя из устройства. 2-х битовое поле "PREVENT" команды устанавливается в состояние "00b" для разрешения или в состояние "01b" для запрета извлечения. Данная команда не подразумевает этап пересылки данных. Поддержка её опциональна, так как многие устройства содержат несъёмные носители данных или, как в случае флэш-карт, не имеют механизма, предотвращающего её извлечение.

Флэш-диски, отказывающиеся выполнять запрет на извлечение носителя (PREVENT = "01b"), имеют лучшую производительность, так как в этом случае операционная система Windows запрещает кэшировать операции записи. Кэширование записи позволяет операционной системе запускать много пишущих процессов, которые ухудшают производительность носителя. [* Производительность, возможно, и улучшается, но в качестве обоснования данного утверждения предложена совершеннейшая чепуха].


Сообщить количество логических накопителей (REPORT LUNS)

Команда "REPORT LUNS" запрашивает список номеров всех имеющихся логических накопителей, тип периферийного устройства ("PDT") которых совпадает с типом, возвращаемым в ответ на команду "INQUIRY". Ответ может включать необязательную информацию о количестве логических накопителей, не имеющих в настоящий момент физического носителя. Устройство обязано отвечать на эту команду даже в отсутствие непосредственного доступа к носителю или неготовности отвечать на другие запросы. Спецификации SBC-2, SBC-3 и SPC-3 объявляют данную команду обязательной к реализации, а в спецификации SPC-2 она отмечена, как опциональная.


Вернуть расширенное сообщение о состоянии (REQUEST SENSE)

Команда "REQUEST SENSE" запрашивает структуру, содержащую дополнительные контекстные данные. Спецификация указывает, что параметр "ALLOCATION LENGTH" запроса всегда должен быть равен 252 байтам для того, чтобы устройство могло возвратить всю значимую информацию, включая внутренние данные производителя. Тем не менее, хост Windows обычно запрашивает только первые 18 байт. По этой причине разработчики часто используют собственные команды для чтения дополнительных данных. Команда "REQUEST SENSE" обязательна для всех блоковых (SBC) устройств.

Длина командного блока для этой команды составляет 6 байт, но драйвер Windows ошибочно присваивает полю "bCBWCBLength" (CBW) значение "0x0C" вместо "0x06". Данная ошибка не приводит к изменению объёма передаваемых по шине данных - контейнер командного блока (CBW) всегда равен 31 байту, из которых 16 занимает сам командный блок. Устройство должно принять неправильное значение и не обращать внимание на 6 лишних байт.


Произвести диагностику (SEND DIAGNOSTIC)

Команда "SEND DIAGNOSTIC" предписывает устройству провести самотестирование и/или проверку логического накопителя. Для блоковых устройств (SBC) обязательна поддержка самотестирования, способ реализации которого оставляется на усмотрение разработчика. Хост запрашивает проведение этого теста, устанавливая бит "SELF-TEST" в "1", "SELF-TEST CODE" в "0" (*) и присвоив полю "PARAMETER LIST LENGTH" значение "0". Приняв команду, устройство должно начать самотестирование в фоновом режиме (без загрузки шины). По окончании тестирования возвращается контейнер состояния (CSW) с результатами.

Если в момент фонового тестирования была принята другая команда, устройство должно не позднее, чем через 2 секунды приостановить выполнение теста и ответить на полученную команду. В режиме самотестирования блоковые устройства (SBC) не обязаны выполнять команды "FORMAT UNIT" и "START STOP UNIT". Для принудительного завершения тестирования хост должен выдать команду "SEND DIAGNOSTIC" со значением поля "SELF-TEST CODE" равным "100b" (*).

(*) Спецификация об этих полях ничего не знает.

Это редко используемая команда. Некоторые устройства немедленно возвращают состояние успешного завершения без проведения собственно тестирования.


Проверить готовность (TEST UNIT READY)

Команда "TEST UNIT READY" используется хостом для выяснения степени готовности устройства к работе. Команда не предусматривает этапа пересылки данных. Если носитель не готов, устройство обновляет подробные данные о состоянии и возвращает контейнер состояния (CSW) со значением поля "bCSWStatus" равным "0x01" (ошибка исполнения). Хост может запросить подробную информацию о состоянии командой "REQUEST SENSE". Все блоковые устройства (SBC) должны поддерживать эту команду.

Для устройств со сменным носителем некоторые хосты переодически рассылают запрос "TEST UNIT READY", дабы убедиться, что носитель всё ещё в устройстве. Но рапорт о готовности не гарантирует успешного выполнения команды "READ" или "WRITE". Вместо того, чтобы переодически проверять устройство на готовность, хост может просто попытаться выполнить требуемую операцию записи или чтения. Если носителя нет, команда вернётся с ошибкой, а запрос "REQUEST SENSE" поможет выяснить причину.

ПредпросмотрAttachmentSize
usb_msd_6.zip17.66 КБ