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


Строковые описатели

Строковые описатели содержат поясняющий текст. Поддержка большинства из них не обязательна, но каждый накопитель данных, использующий BBB-протокол, обязан иметь строковый описатель, содержащий серийный номер. Серийный номер должен быть не короче 12 цифр и состоять только из Unicode символов "0".."9" (0x0030..0x0039) и "A".."F" (0x0041..0x0046). Обратите внимание, что строчные буквы, дефисы (тире) и все остальные символы запрещены. 12 последних цифр серийного номера должны отличаться от 12 последних цифр номера любого другого устройства с такими же значениями полей "idVendor" и "idProduct" в описателе устройства. Серийный номер позволяет хосту сохранять реквизиты устройства, такие как буква диска или политика доступа, после подключения устройства к другому USB-порту или в случае подключения нескольких устройств с одинаковыми "idVendor" и "idProduct".

Поле "iSerialNumber" описателя устройства содержит индекс строкового описателя серийного номера.

В таблице 3-5 приведены поля строкового описателя. Ниже приводится более подробное описание каждого поля и особенности его использования в накопителях данных.


Таблица 3-5. Строковый описатель
 
0 bLength Длина описателя в байтах
1 bDescriptorType Тип описателя ("STRING")
2 bSTRING или
wLANGID
Для описателя с нулевым индексом содержит массив из одного и более идентификаторов языков, для описателей с ненулевыми индексами содержит строку в формате Unicode
  • bLength

    Длина описателя в байтах. Равно двум байтам ("bDescriptorType" и "bLength") плюс удвоенное число идентификаторов языков в массиве "wLANGID" или удвоенное количество символов в строке поля "bString".

  • bDescriptorType

    Константа, соответствующая типу описателя. Для текстового описателя ("STRING") равна 0x03.

  • wLANGID[0...n] или bString

    Когда в пакете "Setup" хост запрашивает строковый описатель, младший байт поля "wValue" содержит индекс. Если индекс равен нулю, хост запрашивает идентификаторы используемых языков (language ID). Если индекс больше нуля, запрашивается строковый описатель с указанным индексом.

    Нулевой описатель содержит набор 16-битных кодов языков, в которых представлены остальные строковые описатели. Код для английского языка, используемого на территории США (U.S. English) - 0x0409, и, похоже, что это единственный поддерживаемый операционной системой Windows код. Значение "wLANGID" должно содержать действительные коды языков для всех наличествующих в устройстве строковых описателей. Устройствам, не возвращающим строковых описателей, запрещено возвращать список поддерживаемых языков. Список идентификаторов языков, определённых к настоящему моменту, можно найти на сайте USB-IF.

    Для значений индекса большего нуля поле "bString" содержит строку в кодировке Unicode. Кодировка символов ANSI с 0x00 по 0x7F соответствует, с незначительными исключениями, значениям Unicode с 0x0000 по 0x007F. Например, строка "Gizmo" в формате Unicode будет представлена пятью 16-битными словами:

    				0x0047 0x0069 0x007A 0x006D 0x006F
    

    и при передаче строкового описателя через USB будет передаваться младшим байтом вперёд:

    				0x47 0x00 0x69 0x00 0x7A 0x00 0x6D 0x00 0x6F 0x00
    

    В отличие от языка "Си", строки в описателях не оканчиваются нулём.

ПредпросмотрВложениеРазмер
usb_msd_3.zip68.8 КБ