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


Блоковые команды

Все нижеперечисленные команды описываются в спецификации на блоковые команды SCSI (SCSI Block Commands - SBC).


Форматировать устройство (FORMAT UNIT)

Команда "FORMAT UNIT" предписывает устройству разделить носитель на доступные с прикладного уровня логические блоки. Если перед "FORMAT UNIT" хост выдавал команду "MODE SELECT", то устройство должно использовать данные о размерах и количестве логических блоков из указанного запроса. В противном случае, при форматировании должны использоваться текущие значения этих параметров.

Устройства, использующие мультимедийные карты памяти (MMC) или другие форматированные съёмные носители, могут обходиться без форматирования носителя, но спецификация SBC обозначает данную команду как обязательную. Хост может использовать команду, как быстрый и безопасный способ полной очистки носителя.


Прочитать (READ)

В командах "READ" и "WRITE" хост работает с носителем данных. Командой "READ" он запрашивает чтение блока данных с носителя. Поле "LOGICAL BLOCK ADDRESS" в командном блоке указывает логический адрес (LBA) первого из запрашиваемых блоков, а поле "TRANSFER LENGTH" - число запрашиваемых блоков.

Существует пять вариантов команды чтения: "READ(6)", "READ(10)", "READ(12)", "READ(16)" и "READ(32)". Команды различаются размерами полей "LOGICAL BLOCK ADDRESS" и "TRANSFER LENGTH", а также типом и объёмом дополнительных данных в командном блоке. Команды "READ(6)" и "READ(10)" являются обязательными для блоковых (SBC) устройств. Спецификация рекомендует переписать код под использование "READ(10)" вместо команды "READ(6)", но хост может продолжать использовать "READ(6)". USB драйвер накопителей данных операционной системы Windows использует команду "READ(10)".

Получив команду "READ(10)", устройство должно на этапе пересылки данных отправить хосту содержимое запрошенных блоков. Устройству не надо знать, что находится в запрошенных блоках, или интересоваться содержимым. Всё, что нужно, - номер блока и число возвращаемых блоков.


Считать объём носителя (READ CAPACITY)

Команда "READ CAPACITY" используется, чтобы выяснить какой объём данных может хранить устройство. На этапе пересылки данных устройство возвращает структуру, содержащую логический адрес (LBA) последнего блока на носителе и размер блока в байтах. Отметим, что команда запрашивает логический адрес (LBA) последнего блока, а не количество блоков на носителе. Логический адрес первого блока равен нулю, таким образом, логический адрес последнего блока на единицу меньше количества блоков.

Существует два варианта команды: "READ CAPACITY(10)" и "READ CAPACITY(16)", отличающиеся размерами полей командного блока и форматом ответа. Блоковые устройства (SBC) должны поддерживать команду "READ CAPACITY(10)".


Остановить/запустить устройство (START STOP UNIT)

Команда "START STOP UNIT" используется для изменения режима энергопотребления устройства: активный, ожидающий или спящий, а также для загрузки или выгрузки носителя. Команда не предусматривает этап пересылки данных и не обязательна к поддержке со стороны блоковых (SBC) устройств.


Синхронизировать кэш (SYNCHRONIZE CACHE)

Команда "SYNCHRONIZE CACHE" используется хостом для того, чтобы убедиться, что указанный сектор на носителе или каком-либо энергонезависимом кэше содержит наиболее свежие данные. Команда существует в двух вариантах: "SYNCHRONIZE CACHE(10)" и "SYNCHRONIZE CACHE(16)", отличающихся размерами полей в командном блоке. Команда не предусматривает этап пересылки данных и необязательна к поддержке со стороны блоковых (SBC) устройств.


Сравнить (VERIFY)

Команда "VERIFY" предписывает устройству проверить один или несколько секторов. Если бит "BYTCHK" в командном блоке равен нулю, то устройство должно проверить возможность чтения данных из указанного места. В противном случае ("BYTCHK" равен единице), то, что хост передал на этапе пересылки данных, устройство должно поверить на совпадение с содержимым носителя. Если устройство использует дополнительную информацию на носителе для проверки целостности данных, о чём сообщало в ответе на команду "INQUIRY", то проверяться должны и эти данные.

Существует четыре варианта команды: "VERIFY(10)", "VERIFY(12)", "VERIFY(16)" и "VERIFY(32)", отличающиеся размером полей в командном блоке. "VERIFY(32)", кроме этого, содержит дополнительные поля. Поддержка команды со стороны блоковых устройств (SBC) опциональная.


Записать (WRITE)

Команда "WRITE" является дополнительной к команде "READ" и используется для записи данных на носитель. Поле "LOGICAL BLOCK ADDRESS" в командном блоке используется для задания логического адреса (LBA) первого записываемого блока, а поле "TRANSFER LENGTH" - числа записываемых блоков.

Определено шесть вариантов команды: "WRITE(6)", "WRITE(10)", "WRITE(12)", "WRITE(16)" и "WRITE(32)". Варианты отличаются размерами полей "LOGICAL BLOCK ADDRESS" и "TRANSFER LENGTH" командного блока, а также объёмом и типом дополнительных данных. Варианты "WRITE(6)" и "WRITE(10)" обязательны для поддержки блоковыми (SBC) устройствами (исключая, разумеется, устройства "только для чтения"). Спецификация рекомендует переход с команды "WRITE(6)" на "WRITE(10)", но хост может по-прежнему использовать "WRITE(6)". Драйвер USB накопителей операционной системы Windows использует вариант "WRITE(10)".

После командного блока, на этапе пересылки данных устройство должно принять данные для записи и сохранить их в указаном месте на носителе. Устройству не надо интересоваться содержимым. Всё, что нужно, - номер блока и число записываемых блоков.

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