USB MSD. Часть 3. USB класс накопителей данных (перевод)
- переводы |
- USB |
- MSD |
- Mass Storage Device
Ответ на команды
В сеансах связи с накопителями данных, использующими команды SCSI, USB-хост посылает командный блок, хост или устройство могут посылать данные и устройство возвращает состояние. В операциях чтения/записи блоков данных хост задаёт область чтения/записи, используя логический адрес блока (logical block address - LBA). Сеансы связи по шине USB ничего не знают и не могут знать о файлах, директориях или кластерах на носителе.
В BBB-протоколе сеансы связи состоят из двух или трёх этапов: передача команды, передача данных (не используется для некоторых команд) и возврат состояния. (Не путайте эти этапы со стадиями транзакции на шине USB или фазами контрольного обмена USB). На этапе пересылки команды хост передаёт командный блок, упакованный в структуру, именуемую "контейнером командного блока" (command block wrapper - CBW). На этапе пересылки данных, отсутствующем в некоторых командах, хост или устройство передают данные. На этапе пересылки состояния устройство передаёт статусную информацию, упакованную в структуру, именуемую "контейнером состояния команды" (command status wrapper - CSW).
Спецификация накопителей данных и стандарт SCSI не конкретизируют время ожидания доставки запрошенных или отосланных данных, по истечении которого операция должна быть завершена принудительно. Драйвера Windows и других операционных систем обычно ждут 20–30 секунд.
Контейнер командного блока (CBW)
Хост посылает контейнер командного блока (CBW) в оконечную точку устройства, работающую в режиме приёма (OUT). CBW содержит собственно командный блок и дополнительную информацию о команде (смотри таблицу 3-6). Длина CBW - 31 байт.
0 | dCBWSignature | Число 0x43425355 [* "CBSU"], служащее опознавательным признаком CBW. Младший байт (0x55) передаётся первым [* т.е. "USBC"] |
4 | dCBWTag | Число, которое должно совпасть со значением поля "dCSWTag" в ответном контейнере состояния команды (CSW) |
8 | dCBWDataTransferLength | Объём информации, передаваемой на этапе пересылки данных, в байтах |
12 | bmCBWFlags | Направление передачи на этапе пересылки данных. Бит 7 = 0 для направления OUT (от хоста к устройству). Бит 7 = 1 для направления IN (от устройства к хосту). Если этап передачи данных отсутствует, данный бит игнорируется. Все остальные биты должны быть равны нулю |
13 | bCBWLUN | Старшие 4 бита зарезервированы и должны быть равны нулю. Младшие биты задают номер логического накопителя (LUN) (для устройств, поддерживающих несколько логических накопителей) или равны нулю |
14 | bCBWCBLength | Старшие три бита зарезервированы и равны нулю. Младшие 5 бит задают длину команды (CDB) внутри поля "CBWCB" в байтах. Допустимы значения в диапазоне 1..16. Все определённые к настоящему моменту командные блоки имеют длину не менее шести байт |
15..31 | CBWCB | Собственно командный блок |
Поле "CBWCB" содержит блок-описатель команды (command descriptor block - CDB) или, для краткости, просто "командный блок". Командный блок (CDB) - структура, содержащая команду и зависящую от неё дополнительную информацию. Длина поля "CBWCB" всегда равна 16 байтам. В том случае, когда CDB короче этого значения, оставшееся место заполняется нулями.
В большинстве случаев поле "bCBWCBLength" содержит длину командного блока (CDB) внутри поля "CBWCB" без дополняющих нулей. Исключением являются UFI устройства (значение поля "bInterfaceSubClass" равно 0x04). Для них хост должен указывать длину командного блока не короче 12 байт, дополняя короткие команды нулями. Кроме того, для командных блоков содержащих 6-байтовую SCSI-команду "REQUEST SENSE" драйвер накопителей Windows некорректно присваивает полю "bCBWCBLength" значение 12 байт даже для не-UFI устройств.
Поле "bmCBWFlags" указывает направление передачи на этапе пересылки данных, а поле "dCBWDataTransferLength" сообщает объём передаваемых данных в байтах.
По получении командного блока (CBW), устройство должно проверить правильность его структуры и значимость содержимого. Командный блок (CBW) считается правильным, если верны все три условия:
- CBW принят после контейнера состояния команды (CSW) или после сброса.
- Длина CBW равна 31 байту.
- Поле "dCBWSignature" содержит правильное значение.
Содержимое командного блока (CBW) считается значимым, если верны все три условия:
- Все биты, помеченные как зарезервированные, равны нулю.
- Поле "bCBWLUN" содержит поддерживаемый номер накопителя.
- Содержимое командного блока ("CBWCB") и его длина ("bCBWCBLength") имеют смысл для подкласса интерфейса устройства.
После приёма командного блока (CBW) устройство должно приготовиться, в зависимости от команды, к приёму данных в оконечную точку, работающую в режиме OUT, или передаче данных или контейнера состояния (CSW) из точки в режиме IN.
- блог пользователя teap0t
- 137220 просмотров
Новые записи в блогах
- Устранение дребезга контактов на основе вертикальных счетчиков
- Диагностика Imprecise Bus Faults в микроконтроллерах Cortex-M3/M4/M4F
- Self-powered камера
- Фоновый модулятор: беспроводная связь из ничего (перевод)
- Texas Instruments Analog Applications Journal SLYT612 "Снижение искажений в аналоговых КМОП ключах" (перевод)
- USB MSD. Часть 6. Команды SCSI (перевод)
- USB MSD. Часть 3. USB класс накопителей данных (перевод)
- Texas Instruments Application Report SBAA042 "Кодовые схемы, используемые в аналогово-цифровых преобразователях" (перевод)
- 10 принципов правильного интерфейса
- Релиз SDK на русский микропроцессор КРОЛИК
Recent comments
9 часов 10 минут назад
2 дня 23 часа назад
3 дня 2 часа назад
3 дня 2 часа назад
3 дня 9 часов назад
3 дня 16 часов назад
4 дня 3 часа назад
4 дня 7 часов назад
5 дней 8 часов назад
5 дней 21 час назад