Jump to content

    
J_Aleks

USB HS максимальная скорость обмена

Recommended Posts

Прошу помощи у вселенского разума...

суть проблемы...

есть отладочная плата, STM32F746ZG + модуль расширения USB3300, задача получить максимально возможную скорость обмена с PC...

желательно, точка отправления: проект на CubeMX, какой нибудь CASTOM HID поправленый в нужную сторону, с одной стороны, ну пусть работает как эхо,

что нибудь принял, это же выплюнул... другой стороны что нибудь простенькое например на QT, либа libusb, шлем килограмм байтов в эндпойнт, читаем этот же килограм в ответ, ну пусть количество килограмм за секунду...

Цель, максимально приблизиться к аппаратной скорости порта в 480 МГЦ...

На просторах инета рабочих макетов такой пары не обнаружил, везде только проэкты с мышами и джойстиками в FS моде... да расплывчатые рассуждения, из категории, вот я вчера пытал контроллер с USB...

Короче, если не жалко, выложите такой рабочий тестовый макет, или ткните носом в практическую реализацию...

а то уже моск расплавился, обмен получается забавно плавающих результатах от 500 килобит до 50-60 мегабит, причем непредсказуемо...

да и увековечитесь в анналах...

 

Edited by J_Aleks

Share this post


Link to post
Share on other sites

CASTOM HID - однозначно в помойку.

Берете какой либо готовый пример mass storage device, и меняете идентификаторы чтобы получилось custom устройство.

На сколько я помню, достаточно класс устройства поменять на 0xFF.

Затем скачивается libusb с примерами.

При подключенном устройстве "натравливаем libusb" на наше устройство что-бы получить inf.

http://www.gaw.ru/html.cgi/txt/interface/usb/instr/6.htm

Quote

Теперь осталось написать приложение, чтобы получать, отдавать данные.

Для максимальной скорости нужно использовать блоки обмена по 64К. По моему начиная с Windows XP, такие блоки поддерживаются.

Если все заработает, но немного не хватит скорости, тогда придется читать о перекрывающихся операциях ввода/вывода в windows.

Ну и при максимальных объемах прокачки, главное окно приложения будет "замерзать"

 

Share this post


Link to post
Share on other sites
20 часов назад, misyachniy сказал:

......CASTOM HID - однозначно в помойку......

Возможно...

По идее то, правильный дескриптор и репорт... а кастом или не кастом по барабану... (к тому же после всех насилий над ним, он уже давно не кастом...)

НО вероятны тонкости неведомые... и поэтому обмен не разгоняется...

с клиентской то стороны, с libusb проблем то нет, я в никсах сижу... там все с коробки так сказать работает...

А вот в контроллере...

В частности, например в всеми растиражированном Report Descriptor-е

  /* USER CODE BEGIN 1 */
        0x06, 0x00, 0xff,              //     USAGE_PAGE (Generic Desktop)
        0x09, 0x01,                    //     USAGE (Vendor Usage 1)
        0xa1, 0x01,                    //     COLLECTION (Application)
        //7
        0x85, 0x01,                    //   REPORT_ID (1)
        0x09, 0x01,                    //   USAGE (Vendor Usage 1)
        0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
        0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
        0x75, 0x08,                    //   REPORT_SIZE (8)
        0x95, CUSTOM_HID_EPIN_SIZE,

        0xb1, 0x82,                    //   FEATURE (Data,Var,Abs,Vol)
        //21
        0x85, 0x01,                    //   REPORT_ID (1)
        0x09, 0x01,                    //   USAGE (Vendor Usage 1)
        0x91, 0x82,                    //   OUTPUT (Data,Var,Abs,Vol)
        //27
        0x85, 0x02,                    //   REPORT_ID (4)
        0x09, 0x02,                    //   USAGE (Vendor Usage 4)
        0x75, 0x08,                    //   REPORT_SIZE (8)
        0x95, CUSTOM_HID_EPIN_SIZE,

        0x81, 0x82,                    //   INPUT (Data,Var,Abs,Vol)
        //37
  /* USER CODE END 1 */
   0xC0    /*     END_COLLECTION             */

0x95, CUSTOM_HID_EPIN_SIZE

допустим - CUSTOM_HID_EPIN_SIZE = 64

это что, ассоциация с длиной посылки, или 64 блока по 64 байта...

и таких нюансов судя по всему хватает..., и что за что цепляется не совсем понятно...

Вот и интересен рабочий макет для перегона данных на макс. скорости...

почему в КУБ не засунули такой примитив непонятно...но там своя глубина мысли...

и самое гадкое, что на прсторах сети подобные макеты необнаруживаются, или искал не там...

20 часов назад, misyachniy сказал:
 

 

Share this post


Link to post
Share on other sites
2 hours ago, J_Aleks said:

0x95, CUSTOM_HID_EPIN_SIZE

допустим - CUSTOM_HID_EPIN_SIZE = 64

это что, ассоциация с длиной посылки, или 64 блока по 64 байта...

Еще раз
 

Quote

 

USB HID (human interface device) class — класс устройств USB для взаимодействия с человеком. Этот класс включает в себя такие устройства как клавиатура, мышь, игровой контроллер.

Помимо детальных спецификаций классических устройств ввода (типа клавиатур и мышек) стандарт HID определяет особый класс устройств без детальных спецификаций. Этот класс именуется USB HID Consumer Control и представляет по сути нерегламентированный канал связи с устройством. При этом устройство пользуется теми же стандартными для операционной системы драйверами что и мышка с клавиатурой. Таким образом можно создать USB устройство которое не требует создания и инсталляции специальных драйверов в большинстве распространенных компьютерных операционных систем.

 

У вас низкоскоростное устройство типа мыши или клавиатуры, но со специфическим протоколом, точнее интерпретацией данных.

Тут описан ваш базовый класс УСТРОЙСТВА в целом

https://www.usb.org/defined-class-codes

 

03h        Interface  HID (Human Interface Device)

HID подразумевает опрос по прерывания до 1000 раз в секунду размером CUSTOM_HID_EPIN_SIZE,  что и дает максимальный размер передаваемых данных в 64кБ.

А нужен класс FFh  Vendor Specific.

toweroff - все правильно уточнил.

P.S. После настройки bulk обмена, все Report Descriptor-ы и иже с ними можно удалять

 

Share this post


Link to post
Share on other sites

Ну в HS дескрипторе я сразу поменял:

/* USB CUSTOM_HID device HS Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgHSDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END =
{
  0x09,                                                                                     /* bLength: Configuration Descriptor size */
  USB_DESC_TYPE_CONFIGURATION,             //0x02        /* bDescriptorType: Configuration */
  USB_CUSTOM_HID_CONFIG_DESC_SIZ,       //0x41
                                                                                                 /* wTotalLength: Bytes returned */
  0x00,
  0x01,                                                                   /* bNumInterfaces: 1 interface */
  0x01,                                                                   /* bConfigurationValue: Configuration value */
  0x00,                                                                   /* iConfiguration: Index of string descriptor describing the configuration */
  0xC0,                                                                  /* bmAttributes: bus powered */
  0x32,                                                                  /* MaxPower 100 mA: this current is used for detecting Vbus */

  /************** Descriptor of CUSTOM HID interface ****************/
  /* 09 */
  0x09,                                                                                /* bLength: Interface Descriptor size */
  USB_DESC_TYPE_INTERFACE,                 //0x04        /* bDescriptorType: Interface descriptor type */
  0x00,                                               /* bInterfaceNumber: Number of Interface */
  0x00,                                               /* bAlternateSetting: Alternate setting */
  0x02,                                               /* bNumEndpoints */
  0xFF,                                               /* bInterfaceClass: CUSTOM_HID */
  0xFF,                                               /* bInterfaceSubClass : 1=BOOT, 0=no boot */
  0xFF,                                               /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
  0,                                                  /* iInterface: Index of string descriptor */
  /******************** Descriptor of CUSTOM_HID *************************/
  /* 18 */
  0x09,                                                                                   /* bLength: CUSTOM_HID Descriptor size */
  CUSTOM_HID_DESCRIPTOR_TYPE,            //0x21        /* bDescriptorType: CUSTOM_HID */
  0x11,                                                                                  /* bCUSTOM_HIDUSTOM_HID: CUSTOM_HID Class Spec release number */
  0x01,
  0x00,                                               /* bCountryCode: Hardware target country */
  0x01,                                               /* bNumDescriptors: Number of CUSTOM_HID class descriptors to follow */
  0x22,                                                                                           /* bDescriptorType */
  USBD_CUSTOM_HID_REPORT_DESC_SIZE,        //38          /* wItemLength: Total length of Report descriptor */
  0x00,
  /******************** Descriptor of Custom HID endpoints ********************/
  /* 27 */
  0x07,                                                                               /* bLength: Endpoint Descriptor size */
  USB_DESC_TYPE_ENDPOINT,                 //0x05         /* bDescriptorType: */

  CUSTOM_HID_EPIN_ADDR,                    //0x81         /* bEndpointAddress: Endpoint Address (IN) */
  0x02,                                                                             /* bmAttributes: bulk
  0x00,                                                                             /* wMaxPacketSize: 2 Byte max */
  0x02,
  CUSTOM_HID_HS_BINTERVAL,                //0x00        /* bInterval: Polling Interval */
  /* 34 */

  0x07,                                                                               /* bLength: Endpoint Descriptor size */
  USB_DESC_TYPE_ENDPOINT,                 //0x05        /* bDescriptorType: */
  CUSTOM_HID_EPOUT_ADDR,                 //0x01        /* bEndpointAddress: Endpoint Address (OUT) */
  0x02,                                                                             /* bmAttributes: bulk
  0x00,                                                                             /* wMaxPacketSize: 2 Bytes max  */
  0x02,
  CUSTOM_HID_HS_BINTERVAL,                 //0x00        /* bInterval: Polling Interval */
  /* 41 */
};

неясно, накой секция с /* 18 */ , вроде выбивается из общего строя, но пробовал исключать, ни на что не влияло...

и обмен булками тоже сразу поставил...

Report я уже показывал:

  /* USER CODE BEGIN 1 */
        0x06, 0x00, 0xff,              //     USAGE_PAGE (Generic Desktop)
        0x09, 0x01,                    //     USAGE (Vendor Usage 1)
        0xa1, 0x01,                    //     COLLECTION (Application)
        //7
        0x85, 0x01,                    //   REPORT_ID (1)
        0x09, 0x01,                    //   USAGE (Vendor Usage 1)
        0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
        0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
        0x75, 0x08,                    //   REPORT_SIZE (8)
        0x95, CUSTOM_HID_EPIN_SIZE,    //   REPORT_COUNT (4)

        0xb1, 0x82,                    //   FEATURE (Data,Var,Abs,Vol)
        //21
        0x85, 0x01,                    //   REPORT_ID (1)
        0x09, 0x01,                    //   USAGE (Vendor Usage 1)
        0x91, 0x82,                    //   OUTPUT (Data,Var,Abs,Vol)
        //27
        0x85, 0x02,                    //   REPORT_ID (4)
        0x09, 0x02,                    //   USAGE (Vendor Usage 4)
        0x75, 0x08,                    //   REPORT_SIZE (8)
        0x95, CUSTOM_HID_EPIN_SIZE,    //   REPORT_COUNT (4)

        0x81, 0x82,                    //   INPUT (Data,Var,Abs,Vol)
        //37
  /* USER CODE END 1 */
   0xC0    /*     END_COLLECTION             */

 

В общем пребываю в не понятках..., вроде все вылизал... но тупит,

P/S сорри за форматирование, что то оно при вставке развалилось...(

 

P/S/S

а вот коммент расшифруйте плис

......P.S. После настройки bulk обмена, все Report Descriptor-ы и иже с ними можно удалять....

 

Edited by J_Aleks

Share this post


Link to post
Share on other sites

да, report можно пристрелить... и без него ловится интерфейс...

вот usbview что кажет:

TM32 Custom Human interface
Manufacturer: STMicroelectronics
Serial Number: 326239533535
Speed: 480Mb/s (high)
Bus:   1
Address:  45
USB Version:  2.00
Device Class: 00(>ifc )
Device Subclass: 00
Device Protocol: 00
Maximum Default Endpoint Size: 64
Number of Configurations: 1
Vendor Id: 0483
Product Id: 5750
Revision Number:  2.00

Config Number: 1
    Number of Interfaces: 1
    Attributes: c0
    MaxPower Needed: 100mA

    Interface Number: 0
        Name: (none)
        Alternate Number: 0
        Class: ff(vend.)
        Sub Class: ff
        Protocol: ff
        Number of Endpoints: 2

            Endpoint Address: 81
            Direction: in
            Attribute: 2
            Type: Bulk
            Max Packet Size: 512
            Interval: 0ms

            Endpoint Address: 01
            Direction: out
            Attribute: 2
            Type: Bulk
            Max Packet Size: 512
            Interval: 0ms

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.