Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Библиотека дескрипторов USB на С++

Пт июн 17, 2022 20:28:10

Накидал библиотеку шаблонных классов на основе списка типов для определения дескрипторов USB. Код и примеры тут.

Что мы получаем по сравнению обычным и/или макросным подходом:
1. Всё поля типизированы. Нарушить формат дескрипторов проблематично.
2. Автоматическое вычисления размеров, количества интерфейсов и т.д.
3. Автоматически заполняемые и вычисляемые поля скрыты, что улучшает восприятие данных.
4. Проверки на корректность данных, дублирование интерфейсов и конечных точек, диапазон значений параметров и т.д.
5. Из дескрипторов легко "вытащить" на этапе компиляции список интерфейсов или конечных точек. Это можно использовать при инициализации USB-модулей контроллера.

Работающие примеры можно посмотреть в Compiler Explorer для С++17 или C++20

Тут приведу пример дескриптора конфигурации составного устройства из двух CDC.
Спойлер
Код:
//========================
// CDC VCP Configuration Descriptor
//========================
template<uint8_t first_if, uint8_t ctrl_ep_num, uint8_t data_ep_num, uint8_t iString=0>
using VCP = INTERFACE_ASSOCIATION
  < bFunctionClass<2>,
    bFunctionSubClass<2>,
    bFunctionProtocol<0>,
    iFunction<0>,

    INTERFACE     // Interface - CDC Communication
    < bInterfaceNumber<first_if>,
      bAlternateSetting<0>,
      bInterfaceClass<2>,     // Communications and CDC Control
      bInterfaceSubClass<2>,  // Abstract Control Model
      bInterfaceProtocol<1>,  // AT Commands defined by ITU-T V.250 etc
      iInterface<iString>,

      CDC_HEADER_FUNCTIONAL_DESCRIPTOR
      < bDescriptorSubType<0>,    // Header Functional Descriptor
        bcdCDC<0x01'10> >,        // CDC Version 1.10

      CDC_ACM_FUNCTIONAL_DESCRIPTOR
      < bDescriptorSubType<2>, // Abstract Control Management Functional Descriptor
        bmCapabilities<2> >,   //

      CDC_UNION_FUNCTIONAL_DESCRIPTOR
      < bDescriptorSubType<6>,       // Union Functional Descriptor
        bControlInterface<0>,        // Interface 0  -
        bSubordinateInterface0<1> >, // Interface 1  -  Data Class Interface

      CDC_CALL_MANAGEMENT_FUNCTIONAL_DESCRIPTOR
      < bDescriptorSubType<1>,     // Call Management Functional Descriptor
        bmCapabilities<0>,
        bDataInterface<1> >,       //

      ENDPOINT_DESCRIPTOR      // EP - In Interrupt EndPoint
      < bEndpointAddress<ctrl_ep_num, epDIR::IN>,
        bmAttributes<epTYPE::Interrupt>,
        wMaxPacketSize<8>,
        bInterval<255> >
    >,

    INTERFACE                // Interface - Data Interface
    < bInterfaceNumber<first_if+1>,
      bAlternateSetting<0>,
      bInterfaceClass<0x0A>, // CDC-Data
      bInterfaceSubClass<0>,
      bInterfaceProtocol<0>,
      iInterface<0>,

      ENDPOINT_DESCRIPTOR<    // EP - OUT Bulk EndPoint
        bEndpointAddress<data_ep_num, epDIR::OUT>,
        bmAttributes<epTYPE::Bulk>,
        wMaxPacketSize<64>,
        bInterval<0> >,

      ENDPOINT_DESCRIPTOR<    // EP - IN Bulk EndPoint
        bEndpointAddress<data_ep_num, epDIR::IN>,
        bmAttributes<epTYPE::Bulk>,
        wMaxPacketSize<64>,
        bInterval<0> >
    >
  >;

constexpr DEVICE_CONFIGURATION_DESCRIPTOR
<   bConfigurationValue<1>,               // Configuration 1
    iConfiguration<0>,                    // No String Descriptor
    bmAttributes<cfg_Attr::SelfPowered>,  // Self powered
    bMaxPower<100/2>,                     // 100 mA

    VCP<0,   // Интерфейсы (0 и 1)
        3,   // Control EP num
        1,   // Data EP num
        4 >, // Номер строкового дескриптора интерфейса

    VCP<2,   // Интерфейсы (2 и 3)
        4,   // Control EP num
        2,   // Data EP num
        5>   // Номер строкового дескриптора интерфейса
> Configuration_Descriptor;

Вот так из дескриптора можно вытащить, например, адреса конечных точек
Спойлер
Код:
Configuration_Descriptor.GetDescriptorList().GetEndpoints().foreach
(
  [](auto ep)
  {       
    printf("\nEP = %02X", TypeUnBox<ep>::GetEpAddress() );
  }
);

// Вывод
EP = 83
EP = 01
EP = 81
EP = 84
EP = 02
EP = 82

Можно много что ещё "поставить на проверку" и автоматизировать. А для начала так. Это уже мощнее любого макроса.

Re: Библиотека дескрипторов USB на С++

Пт июн 17, 2022 21:07:15

Круто.
Иногда, глядя на такое, я уж грешным делом подумываю: а не начать ли изучать С++? Но потом, вспомнив, насколько это сложный ЯП, передумываю!

Re: Библиотека дескрипторов USB на С++

Пт июн 17, 2022 22:06:22

ну не знаю... они все сложные! :))
VladislavS, спасибо, ща посмотрим, усб - это нужно.

Re: Библиотека дескрипторов USB на С++

Сб июн 18, 2022 06:47:32

И? Писанина ради писанины, графомания от нефик делать. Обычно, тот кто сам пишет дескриптор, тот понимает, какие поля чего должны содержать, а ошибки допускает только невнимательный.
насколько это сложный ЯП,

Да ничего там слишком сложного нет. Просто применять его надо более достойно, чем графомания с дескрипторами. Есть '10' типа людей - которые не используют возможности ++ где надо, и те, кто сует графоманию там, где не нужно.

Re: Библиотека дескрипторов USB на С++

Сб июн 18, 2022 10:42:55

А можно список всех "непростительных заклинаний"? :)))

А то, GPIO - нельзя. Любой джедай должен в 3 ночи проснуться и на память все биты регистров 100500 разных контроллеров выдать.

USB дескрипторы - тоже нельзя. Будь добр сотни байт врукопашную пахать. И только попробуй быть невнимательным и ошибись - сразу из страны розовых пони выгонят.

Давай сразу весь список, где ещё недостойно, а то мы ведь не знаем.

Re: Библиотека дескрипторов USB на С++

Сб июн 18, 2022 12:28:30

Да потому что это должно быть оформлено в виде приложения-утилиты с GUI, а на выходе должен быть уже короткий готовый список дескрипторов, без лишней воды. Вот тогда будет толк, потому что это уже по-взрослому. Твою бы энергию да в правильное русло. А то графомания какаято без дела.

Re: Библиотека дескрипторов USB на С++

Сб июн 18, 2022 12:56:55

Где-то я это уже слышал. У каждого клона по графическому конфигуратору на каждый чих, только он их никому не покажет.

Только вот как дескриптор в виде массива мёртвых байт использовать в программе? Тут же есть живые интерфейсы и конечные точки - бери да используй их по назначению.

Re: Библиотека дескрипторов USB на С++

Сб июн 18, 2022 15:26:18

Up2805 писал(а):Да потому что это должно быть оформлено в виде приложения-утилиты с GUI

Это ещё зачем? Достаточно указать требования к версии компилятора(ов), составу и версиям библиотек, необходимых для сборки, плюс примеры использования. И не забыть о списке МК, на которых это всё должно работать и список МК, на которых проверено. ИМХО, этого достаточно для осознанного использования. А всякие генераторы и ГУИ- нафиг. Цени и уважай время разработчиков, и не требуй лишнего. Пусть они его потратят на что-нибудь ещё, что может оказаться полезным окружающим.

Re: Библиотека дескрипторов USB на С++

Сб июн 18, 2022 15:58:01

Да ничего там слишком сложного нет.

Такое может говорить лишь человек, вообще не имеющий понятия, что такое С++!!!
Видел я "знатоков С++", которые писали на С, но файлы обзывали cpp и компилировали их g++… Чтобы нормально на С++ писать, нужно не только минимум лет 5 на его изучение потратить, но и регулярно читать о новинках и применять их. Мне такое нафиг не нужно. А еще меня бесит, что пять страничек кода на С++ может собираться аж 10 секунд — у меня столько времени даже под 100тыс строк на С не собирается!

Re: Библиотека дескрипторов USB на С++

Сб июн 18, 2022 16:11:38

Видел я "знатоков С++", которые писали на С, но файлы обзывали cpp
О, это про меня :?
Ответить