1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/tgsp-USB-storage-knowledge

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
USB_Storage_spec.md 19 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 02.12.2024 07:28 9afcea2

USB Storage: обобщение информации


1. Введение в стандарт

1.1 Введение в спецификацию Mass Storage Class

Спецификации USB Mass Storage Class поддерживаются и публикуются USB Mass Storage Class Working Group (CWG). Они включают в себя следующие стандарты:

  • Спецификацию транспорта Control/Bulk/Interrupt (CBI) для USB Mass Storage Class;
  • Спецификацию транспорта Bulk-Only (BBB) для USB Mass Storage Class;
  • Спецификацию команд UFI (UFI) для USB Mass Storage Class;
  • Спецификацию загрузочности для USB Mass Storage Class;
  • Спецификацию тестирования соответствия для USB Mass Storage Class;
  • Спецификацию устройств хранения с блокировкой (LSD FS);
  • Спецификацию протокола USB Attached SCSI (UASP) для USB Mass Storage Class.

Примечание 1: спецификация транспорта Control/Bulk/Interrupt (CBI) предназначена только для полноскоростных дисководов.

1.1.1 Определение поля subclass

Интерфейс устройства USB Mass Storage Class содержит поле bInterfaceSubClass, которое указывает на набор команд промышленного стандарта, передаваемых через интерфейс Mass Storage Class:

Subclass Command Block Specification Comment
00h SCSI command set not reported De facto use
01h RBC Allocated by USB-IF for RBC. RBC is defined outside of USB.
02h MMC-5 (ATAPI) Allocated by USB-IF for MMC-5. MMC-5 is defined outside of USB.
03h Obsolete Was QIC-157
04h UFI Specifies how to interface Floppy Disk Drives to USB
05h Obsolete Was SFF-8070i
06h SCSI transparent command set Allocated by USB-IF for SCSI. SCSI standards are defined outside of USB.
07h LSD FS LSDFS specifies how host has to negotiate access before trying SCSI
08h IEEE 1667 Allocated by USB-IF for IEEE 1667. IEEE 1667 is defined outside of USB.
09h–FEh Reserved Reserved
FFh Specific to device vendor De facto use

1.1.2 Определение поля Protocol

Интерфейс устройства USB Mass Storage Class также содержит поле bInterfaceProtocol, которое указывает на поддерживаемый протокол передачи:

bInterfaceProtocol Protocol Implementation Comment
00h CBI (with command completion interrupt) USB Mass Storage Class Control/Bulk/Interrupt (CBI) Transport
01h CBI (with no command completion interrupt) USB Mass Storage Class Control/Bulk/Interrupt (CBI) Transport
02h–4Fh Reserved Reserved
50h BBB USB Mass Storage Class Bulk-Only (BBB) Transport
51h–61h Reserved Reserved
62h UAS Allocated by USB-IF for UAS. UAS is defined outside of USB.
63h–FEh Reserved Reserved
FFh Specific to device vendor De facto use

1.1.3 Определение макроса Request

В USB определены запросы управления USB, включая поле bRequest. Это тип команды, которую отправляет USB при отправке команды:

bRequest Name Comment
00h Accept Device-Specific Command (ADSC) Assigned in context by USB Mass Storage Class Control/Bulk/Interrupt (CBI) Transport, also aliases core USB request 00h Get Status.
01h–0Dh Reserved Aliases of core USB bRequest codes
0Eh–FBh Reserved Reserved
FCh Get Requests Assigned by Lockable Storage Devices Feature Specification
FDh Put Requests Assigned by Lockable Storage Devices Feature Specification
FEh Get Max LUN (GML) Assigned by USB Mass Storage Class Bulk-Only (BBB) Transport
FFh Bulk-Only Mass Storage Reset (BOMSR) Assigned by USB Mass Storage Class Bulk-Only (BBB) Transport

1.2 Спецификация Bulk-Only Transport для USB Mass Storage Class

Этот стандарт описывает Bulk-Only Transport, который передаёт команды, данные и состояние только через Bulk endpoints.

1.2.1 Функциональные особенности

1.2.1.1 Bulk-Only Mass Storage Reset (class-specific request)

Этот запрос используется для reset устройства массового хранения данных и связанного с ним интерфейса. Этот class-specific запрос подготавливает устройство к следующему CBW. Хост отправляет этот запрос на устройство через стандартный pipe. Устройство сохраняет значение bulk data toggle и статус STALL для конечной точки. Устройство будет NAK состояние этапа запроса устройства до тех пор, пока не завершится Bulk-Only Mass Storage Reset. Хосту необходимо отправить запрос устройства на стандартный pipe:

  • bmRequestType: Class, Interface, хост к устройству;
  • поле bRequest установлено на 255 (FFh);
  • поле wValue установлено на 0;
  • поле wIndex установлено на номер интерфейса;
  • поле wLength установлено на 0.
bmRequestType bRequest wValue wIndex wLength Data
00100001b 11111111b 0000h Interface 0000h none
1.2.1.2 Get Max LUN (class-specific request)

Получает количество логических единиц (logical units numbers), поддерживаемых устройством. LUN будут последовательно пронумерованы от 0 до 15 (Fh). Хосту нужно отправить запрос устройства на стандартный pipe:

  • bmRequestType: Class, Interface, устройство к хосту;
  • поле bRequest установлено на 254 (FEh);
  • поле wValue установлено на 0;
  • поле wIndex установлено на номер интерфейса;
  • поле wLength установлено на 1.
bmRequestType bRequest wValue wIndex wLength Data
10100001b 11111110b 0000h Interface 0001h 1 byte *u8 iManufacturer; / 描述厂商字符串的索引 */
**u8  iProduct;         /* 描述产品字符串的索引 */
**u8  iSerialNumber;    /* 设备序列号字符串的索引 */**
**u8  bNumConfigurations;/* 可能的配置数量 */**

} attribute ((packed));

#define USB_DT_DEVICE_SIZE 18


**Где bDescriptorType — это тип дескриптора, его значение можно найти в таблице ниже:**

| Тип | Дескриптор | Значение bDescriptorType |
| --- | --- | --- |
| Стандартный дескриптор | Дескриптор устройства (Device Descriptor) | 0x01 |
| Дескриптор конфигурации (Configuration Descriptor) | 0x02 |
| Строковый дескриптор (String Descriptor) | 0x03 |
| Интерфейсный дескриптор (Interface Descriptor) | 0x04 |
| Конечный дескриптор (EndPont Descriptor) | 0x05 |
| Класс дескриптора | Дескриптор концентратора (Hub Descriptor) | 0x29 |
| Человеко-машинный интерфейс (HID) | 0x21 |
| Определённый производителем дескриптор | | 0xFF

**Значение bDeviceClass можно найти в следующей таблице:**

| Десятичное число | Шестнадцатеричное число | Описание
| --- | --- | ---
| 0 | 0x00 | Значение класса, предоставляемое в интерфейсном дескрипторе
| 2 | 0x02 | Коммуникационный класс
| 9 | 0x09 | Класс концентратора
| 220 | 0xDC | Класс устройства для диагностики
| 224 | 0xE0 | Класс беспроводного коммуникационного устройства
| 255 | 0xFF | Определённый производителем класс устройства

### 2.2 Дескриптор конфигурации
Дескриптор конфигурации включает в себя длину дескриптора (сумму длин всех интерфейсных дескрипторов и конечных дескрипторов, принадлежащих этому дескриптору конфигурации), способ питания (автономное питание/питание от шины), максимальную потребляемую мощность и т. д.

```
/* USB_DT_CONFIG: Configuration descriptor information.
 *
 * USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the
 * descriptor type is different.  Highspeed-capable devices can look
 * different depending on what speed they're currently running.  Only
 * devices with a USB_DT_DEVICE_QUALIFIER have any OTHER_SPEED_CONFIG
 * descriptors.
 */
struct usb_config_descriptor {
    __u8  bLength;              /* 长度 */
    __u8  bDescriptorType;      /* 类型编号 */

    __le16 wTotalLength;        /* 返回所有数据的大小 */
    __u8  bNumInterfaces;       /* 支持的接口数 */
    __u8  bConfigurationValue;  /* Set_Configuration命令需要的参数值 */
    __u8  iConfiguration;       /* 该配置的字符串索引值 */
    __u8  bmAttributes;         /* 供电模式的选择 */
    __u8  bMaxPower;            /* 从总线提取的最大电流 */
} __attribute__ ((packed));

#define USB_DT_CONFIG_SIZE      9
```
### 2.3 Интерфейсный дескриптор
Дескриптор конфигурации содержит один или несколько интерфейсных дескрипторов. Здесь «интерфейс» не относится к физическому интерфейсу, здесь он называется «функцией», что легче понять. Например, устройство имеет функцию записи звука и функцию динамика, тогда у этого устройства есть как минимум два «интерфейса».

```
/* USB_DT_INTERFACE: Interface descriptor */
struct usb_interface_descriptor {
    __u8  bLength;              /* 长度 */
    __u8  bDescriptorType;      /* 类型 */

    __u8  bInterfaceNumber;     /* 接口编号 */
    __u8  bAlternateSetting;    /* 备用接口描述符编号 */
    __u8  bNumEndpoints;        /* 该接口使用的端点数,不包括端点0 */
    __u8  bInterfaceClass;      /* 接口类型 */
    __u8  bInterfaceSubClass;   /* 子类型 */
    __u8  bInterfaceProtocol;   /* 所遵循的协议 */
    __u8  iInterface;           /* 该接口的字符串索引值 */
} __attribute__ ((packed));

#define USB_DT_INTERFACE_SIZE       9
```
Для поля **bInterfaceClass** указывается класс интерфейса, который USB-протокол классифицирует по функциям на разные классы, конкретное значение показано в следующей таблице:

| Шестнадцатеричный код | Категория
| --- | ---
| 0x01 | Аудио
| 0x02 | CDC Control
| 0x03 | Человеко-машинный интерфейс (HID)
| 0x05 | Физический
| 0x06 | Изображение
| 0x07 | Принтер
| **0x08 | Большое хранилище данных**
| 0x09 | Концентратор
| 0x0A | CDC Data
| 0x0B | Смарт-карта
| 0x0D | Безопасность
| 0xDC | Диагностическое устройство
| 0xE0 | Беспроводной контроллер
| 0xFE | Специфическое приложение (включая мост инфракрасного излучения и т.д.)
| 0xFF | Определённое производителем устройство

**Примечание 7**: U-диск **bInterfaceProtocol** фиксирован на **0x50**.

### 2.4 Конечный дескриптор
Конечная точка — это логический интерфейс между устройством и хостом для передачи данных, за исключением контрольной конечной точки (обычно только одно устройство имеет одну контрольную конечную точку), которая является двунаправленным портом, остальные являются однонаправленными. Конечный дескриптор описывает тип передачи данных, направление передачи, размер пакета данных и номер конечной точки (также называемый адресом конечной точки) и т. д.

```
/* USB_DT_ENDPOINT: Endpoint descriptor */
struct usb_endpoint_descriptor {
    __u8  bLength;              /* 长度 */
    __u8  bDescriptorType;      /* 类型 */

    __u8  bEndpointAddress;     /* 地址:[0:3]端点号,[7]方向(0-输出,1-输入) */
    __u8  bmAttributes;         /* 属性:[0:1](00-控制,01-同步,02-批量,03-中断) */
    __le16 wMaxPacketSize;      /* 本端点接收或发送的最大信息包的大小 */
    __u8  bInterval;            /* 轮询数据传送端点的时间间隔:同步-1,中断-(1-255) */

    /* NOTE:  these two are _only_ in audio endpoints. */
    /* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
    __u8  bRefresh;
    __u8  bSynchAddress;
} __attribute__ ((packed));

#define USB_DT_ENDPOINT_SIZE        7
#define USB_DT_ENDPOINT_AUDIO_SIZE  9   /* Audio extension */
```
**Примечание 8**: U-диск **bmAttributes** фиксирован на 0x02. 64     /* Максимальный размер пакета для конечной точки 0 */
  idVendor           0x0930 Toshiba Corp.
  idProduct          0x1408
  bcdDevice            0.01
  iManufacturer           1 TOSHIBA
  iProduct                2 USB FLASH DRIVE
  iSerial                 3 7427EAB351F9C290C0020888
  bNumConfigurations      1     /* Количество дескрипторов конфигурации */

  Дескриптор конфигурации:
    bLength                 9
    bDescriptorType         2       /* Тип дескриптора конфигурации */
    wTotalLength           32       /* Общая длина возвращаемых данных конфигурации, включая последующие дескрипторы: 9 + 9 + 7 + 7 */
    bNumInterfaces          1       /* Количество интерфейсов в этой конфигурации */
    bConfigurationValue     1       /* Используется как параметр при выборе этой конфигурации в SetConfiguration() */
    iConfiguration          0 
    bmAttributes         0x80       /* Бит 7 зарезервирован и должен быть установлен в единицу по историческим причинам. */
      (Питание от шины)
    MaxPower              300mA

  Дескриптор интерфейса:
    bLength                 9
    bDescriptorType         4     /* Тип дескриптора интерфейса */
    bInterfaceNumber        0     /* Номер этого интерфейса */
    bAlternateSetting       0     /* Номер альтернативного дескриптора интерфейса */
    bNumEndpoints           2     /* Количество конечных точек в этом интерфейсе */
    bInterfaceClass         8 Mass Storage  /* Класс MASS STORAGE */
    bInterfaceSubClass      6 SCSI        /* Подкласс интерфейса */
    bInterfaceProtocol     80 Bulk-Only   /* Транспорт BULK-ONLY */
    iInterface              0 

  Дескриптор конечной точки:
    bLength                 7
    bDescriptorType         5               /* Тип дескриптора конечной точки */
    bEndpointAddress     0x81  EP 1 IN  /* [3..0] - номер конечной точки, [7] - In */
    bmAttributes            2               /* Свойства конечной точки: это массовая конечная точка */
      Тип передачи            Bulk
      Синхронный тип          None
      Использование типа      Данные
    wMaxPacketSize     0x0200  1x 512 bytes /* Максимальный размер пакета */
    bInterval             255

  Дескриптор конечной точки:
    bLength                 7
    bDescriptorType         5
    bEndpointAddress     0x02  EP 2 OUT     /* Конечная точка 2, направление Out */
    bmAttributes            2
      Тип передачи            Bulk
      Синхронный тип          None
      Использование типа      Данные
    wMaxPacketSize     0x0200  1x 512 bytes
    bInterval             255

Дескриптор хранилища двоичных объектов:
  bLength                 5
  bDescriptorType        15
  wTotalLength           22
  bNumDeviceCaps          2

USB 2.0 Extension Device Capability:
  bLength                 7
  bDescriptorType        16
  bDevCapabilityType      2
  bmAttributes   0x00000006
    Поддерживается управление питанием (LPM)

SuperSpeed USB Device Capability:
  bLength                10
  bDescriptorType        16
  bDevCapabilityType      3
  bmAttributes         0x00
  wSpeedsSupported   0x000e
    Устройство может работать на полной скорости (12 Мбит/с)
    Устройство может работать на высокой скорости (480 Мбит/с)
    Устройство может работать на сверхвысокой скорости (5 Гбит/с)
  bFunctionalitySupport   2
    Минимальная полностью функциональная скорость устройства — высокая скорость (480 Мбит/с)
  bU1DevExitLat          10 микросекунд
  bU2DevExitLat        2047 микросекунд

Состояние устройства:     0x0000
  (Питание от шины)

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/tgsp-USB-storage-knowledge.git
git@api.gitlife.ru:oschina-mirror/tgsp-USB-storage-knowledge.git
oschina-mirror
tgsp-USB-storage-knowledge
tgsp-USB-storage-knowledge
master