Анализ и доработка виртуального COM-порта USB на базе AT32F403A: работа с дескрипторами класса CDC
9

Анализ и доработка виртуального COM-порта USB на базе AT32F403A: работа с дескрипторами класса CDC

Автор: admin

В continuation цикла статей исследуется создание виртуального COM-порта на микроконтроллере AT32F403ACGT7. Автор детально разбирает структуру дескрипторов USB, необходимую для определения класса устройства, и описывает доработки функциональности последовательного интерфейса.

В предыдущей части цикла мы создали виртуальный COM‑порт USB на базе микроконтроллера AT32F403ACGT7 производства компании Artery Technology. В этой части мы проведём анализ сгенерированного кода с помощью официальной документации на класс устройств USB, предназначенных для передачи данных по последовательным интерфейсам, а затем дополним функциональность нашего виртуального COM‑порта. Данный цикл публикаций состоит из четырёх частей: Составное устройство USB на AT32. Часть 1: Подготовка, Составное устройство USB на AT32F403A. Часть 2: Виртуальный COM-порт и его доработки, Составное устройство USB на AT32F403A. Часть 3: Звуковое устройство и его доработки, Составное устройство USB на AT32F403A. Часть 4: Составное устройство Audio + CDC.

По моему опыту изучение устройства USB проще всего начинать с чтения его дескрипторов, из которых нужно выделить: дескриптор устройства (Device Descriptor), дескриптор конфигурации (Configuration Descriptor), дескрипторы интерфейсов устройства (Class‑Specific Interface Descriptors). Здесь и далее нумерация байтов начинается с нуля. По байтам 4 и 5 дескриптора устройства определяем класс устройства USB и его подкласс. По дескриптору конфигурации определяем интерфейсы, входящие в эти конфигурации. По дескрипторам интерфейсов определяем тип интерфейсов и их функциональность.

Читаем дескрипторы: Сначала обратимся к дескриптору устройства: открываем файл cdc_desc.c и находим там массив g_usbd_descriptor[USB_DEVICE_DESC_LEN]. По значению байта 4 (bDeviceClass = 0×02) определяем, что это — устройство USB для передачи данных. Далее открываем раздел 5.1.1 на странице 15 документа [1] и сверяем по таблице 8 значения байтов 5 и 6 (bDeviceSubClass = 0×00, bDeviceProtocol = 0×00). Значения этих полей дескриптора соответствуют указанным в таблице значениям для класса устройств Communications Device Class.

cdc_desc.c ... USB_DEVICE_DESC_LEN, /* bLength */ USB_DESCIPTOR_TYPE_DEVICE, /* bDescriptorType */ 0x00, /* bcdUSB */ 0x02, 0x02, /* bDeviceClass */ 0x00, /* bDeviceSubClass */ 0x00, /* bDeviceProtocol */ USB_MAX_EP0_SIZE, /* bMaxPacketSize */ LBYTE(USBD_CDC_VENDOR_ID), /* idVendor */ HBYTE(USBD_CDC_VENDOR_ID), /* idVendor */ LBYTE(USBD_CDC_PRODUCT_ID), /* idProduct */ HBYTE(USBD_CDC_PRODUCT_ID), /* idProduct */ 0x00, /* bcdDevice rel. 2.00 */ 0x02, USB_MFC_STRING, /* Index of manufacturer string */ USB_PRODUCT_STRING, /* Index of product string */ USB_SERIAL_STRING, /* Index of serial number string */ 1 /* bNumConfigurations */.

Переходим к дескриптору конфигурации: находим в файле cdc_desc.c массив g_usbd_configuration[USBD_CDC_CONFIG_DESC_SIZE] и определяем по значению байта 4 (bNumInterfaces = 0×02), что конфигурация содержит два интерфейса. Далее обратимся к дескриптору первого интерфейса конфигурации. По значениям байтов 11 и 13 определяем логический номер этого интерфейса (байт 11, bInterfaceNumber = 0×00) и количество связанных с ним конечных точек (байт 13, bNumEndpoints = 0×01, одна конечная точка). По значениям байта 14 (bInterfaceClass = 0×02, CDC class code) и байта 15 (bInterfaceSubClass = 0×02, Abstract Control Model subclass code) дескриптора конфигурации определяем, что это интерфейс управления виртуальным COM‑портом, и что порт этот собран на базе устройства подкласса ACM класса CDC.

Описание этого подкласса дано в разделе 3.2.2 на странице 7 документа [2]. Значения вышеуказанных байтов дескриптора интерфейса управления (Communication Class Interface Descriptor) даны в разделе 5.1.3 на странице 15 документа [1]. Значение следующего за ними байта (bInterfaceProtocol = 0×01, AT Command) указывает на поддержку устройством набора команд по стандарту V.250 ITU‑T, то есть устройство USB, которое мы видим в Диспетчере устройств как COM‑порт, на самом деле описывается дескриптором Hayes‑совместимого телефонного модема.

Функциональность интерфейса управления описывается в следующих за дескриптором интерфейса девятнадцати байтах дескриптора конфигурации: Header Functional Descriptor (5 байт). Call Management Functional Descriptor (5 байт). ACM Functional Descriptor (4 байта). Union Functional Descriptor (5 байт). Обратим особое внимание на байт 32 дескриптора конфигурации (ACM Functional Descriptor, bmCapabilities = 0×02). Согласно данным таблицы 4 на странице 15 документа [2] этот виртуальный COM...

Похожие материалы

Аквариус: перенос ИТ-инфраструктуры Московского паркинга.
Аквариус дата-центр серверные мощности

Аквариус: перенос ИТ-инфраструктуры Московского паркинга.

"Аквариус" выделит миллиард рублей на модернизацию ИТ-инфраструктуры "Московского паркинга". Российская компания займется …

AMD признала проблему с atieclxx.exe, забивающим SSD мусором.
AMD SSD графический драйвер обновление

AMD признала проблему с atieclxx.exe, забивающим SSD мусором.

Компания AMD подтвердила наличие сбоя в своих графических драйверах, который приводит к …

Турция запускает систему тотального ИИ-ценза Via+ для контроля СМИ и интернета
ИИ-цензура RTÜK Турция медиамониторинг

Турция запускает систему тотального ИИ-ценза Via+ для контроля СМИ и интернета

Турецкий регулятор RTÜK внедряет автономную систему Via+ на базе ИИ для круглосуточного …

Ylem — симулятор первых 400 000 лет Вселенной и тайна лития
космология нуклеосинтез симулятор Большой взрыв

Ylem — симулятор первых 400 000 лет Вселенной и тайна лития

Ylem — бесплатный браузерный симулятор рождения Вселенной от кварк-глюонной плазмы до рекомбинации. …