реклама на сайте
подробности

 
 
> stm32f4+USB3300 = usb high speed, Конфигурирование endpoint, Получить датарейт 4MБ/с
Integro
сообщение Aug 7 2014, 07:37
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 167
Регистрация: 25-12-09
Из: Минск
Пользователь №: 54 460



Всем привет.
Есть следующая задача, с использованием stm32f407 и usb3300 (HS физика, ULPI интерфейс) получить двунаправленый поток 2х4МБ/с
План следующий, использовать Custom HID, Interrupt передачи размером 1024байт раз в 250мкс

За основу взят пример HID USB Joystick и успешно запущен на моем железе.
После переконфигурирования дескрипторов получил девайс с одним интерфейсом и тремя ендпоинтами, Control и два Interrupt (In\Out)

Проблема в следующем, девайс определяется, но при попытке записи либо чтения ендпоинтов на железе нечего не происходит.
Вопрос к тем кто имеет опыт работ с HS, правильный ли я выбрал подход реализации (hid, interrupt)?
На какие грабли могу наступить(или наступил) в конфигурировании дескрипторов?

Device Descriptor
Код
#define USBD_VID                     0x0483
#define USBD_PID                     0x5711

uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] =
  {
    0x12,                       /*bLength */
    USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
    0x00,                       /*bcdUSB */
    0x02,
    0x00,                       /*bDeviceClass*/
    0x00,                       /*bDeviceSubClass*/
    0x00,                       /*bDeviceProtocol*/
    USB_OTG_MAX_EP0_SIZE,      /*bMaxPacketSize*/
    LOBYTE(USBD_VID),           /*idVendor*/
    HIBYTE(USBD_VID),           /*idVendor*/
    LOBYTE(USBD_PID),           /*idVendor*/
    HIBYTE(USBD_PID),           /*idVendor*/
    0x00,                       /*bcdDevice rel. 2.00*/
    0x02,
    USBD_IDX_MFC_STR,           /*Index of manufacturer  string*/
    USBD_IDX_PRODUCT_STR,       /*Index of product string*/
    USBD_IDX_SERIAL_STR,        /*Index of serial number string*/
    USBD_CFG_MAX_NUM            /*bNumConfigurations*/
  }; /* USB_DeviceDescriptor */


Configuration descriptor

CODE
/* USB HID device Configuration Descriptor */
uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] =
{
0x09, /* bLength: Configuration Descriptor size */
USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
USB_HID_CONFIG_DESC_SIZ,
/* wTotalLength: Bytes returned */
0x00,
0x01, /*bNumInterfaces: 1 interface*/
0x01, /*bConfigurationValue: Configuration value*/
0x00, /*iConfiguration: Index of string descriptor describing
the configuration*/
0xE0, /*bmAttributes: bus powered and Support Remote Wake-up */
0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/

/************** Descriptor of Joystick Mouse interface ****************/
/* 09 */
0x09, /*bLength: Interface Descriptor size*/
USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/
0x00, /*bInterfaceNumber: Number of Interface*/
0x00, /*bAlternateSetting: Alternate setting*/
2,//0x01, /*bNumEndpoints*/
0x03, /*bInterfaceClass: HID*/
0,//0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
0,//0x02, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
0, /*iInterface: Index of string descriptor*/
/******************** Descriptor of Joystick Mouse HID ********************/
/* 18 */
0x09, /*bLength: HID Descriptor size*/
HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
1,//0x11, /*bcdHID: HID Class Spec release number*/
0x01,
0x00, /*bCountryCode: Hardware target country*/
0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/
0x22, /*bDescriptorType*/
HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
0x00,
/******************** Descriptor of Mouse endpoint ********************/
/* 27 */
0x07, /*bLength: Endpoint Descriptor size*/
USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/

HID_IN_EP, /*bEndpointAddress: Endpoint Address (IN)*/
0x03, /*bmAttributes: Interrupt endpoint*/
0x00, /*wMaxPacketSize: 1024 Byte max */
0x04,
0x02, /*bInterval: Polling Interval (250 us)*/
/* 34 */
/******************** Descriptor of Mouse endpoint ********************/
/* 27 */
0x07, /*bLength: Endpoint Descriptor size*/
USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/

HID_OUT_EP, /*bEndpointAddress: Endpoint Address (IN)*/
0x03, /*bmAttributes: Interrupt endpoint*/
0x00, /*wMaxPacketSize: 1024 Byte max */
0x04,
0x02, /*bInterval: Polling Interval (250 us)*/
/* 34 */
};


и репорт

CODE
RHID_ReportDescriptor[HID_REPORT_DESC_SIZE] =
{
0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop)
0x09, 0x01, // USAGE (Vendor Usage 1)
0xa1, 0x01, // COLLECTION (Application)
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, 0x01, // REPORT_COUNT (1)
0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol)
0x85, 0x01, // REPORT_ID (1)
0x09, 0x01, // USAGE (Vendor Usage 1)
0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol)

0x85, 0x02, // REPORT_ID (2)
0x09, 0x02, // USAGE (Vendor Usage 2)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol)
0x85, 0x02, // REPORT_ID (2)
0x09, 0x02, // USAGE (Vendor Usage 2)
0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol)

0x85, 0x03, // REPORT_ID (3)
0x09, 0x03, // USAGE (Vendor Usage 3)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 255, // REPORT_COUNT (N)
0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol)
0x85, 0x03, // REPORT_ID (3)
0x09, 0x03, // USAGE (Vendor Usage 3)
0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol)

0x85, 0x04, // REPORT_ID (4)
0x09, 0x04, // USAGE (Vendor Usage 4)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 32, // REPORT_COUNT (N)
0x81, 0x82, // INPUT (Data,Var,Abs,Vol)
0xc0 // END_COLLECTION
};


Сообщение отредактировал IgorKossak - Aug 7 2014, 07:51
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
Golikov A.
сообщение Aug 7 2014, 09:31
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

как вы это делаете? как вы пишите?
HID имеет 2 канала обмена данными, любой его репорт может быть послан как через Interrupt так и через control конечные точки. Если вы используете библиотеку HID в виндах от HID.dll, то функции SetFeature и SetOutReport (или как там они завуться) посылают данные через контрольную точку, для работы через интерапт точки надо использовать WriteFile.

Go to the top of the page
 
+Quote Post
Integro
сообщение Aug 7 2014, 11:46
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 167
Регистрация: 25-12-09
Из: Минск
Пользователь №: 54 460



Да, совсем забыл уточнить, на данный момент для работы с hid использую драйвер и код сгенерированный jungo windriver на C#.

Он предоставляет следующие методы для работы с EP
CODE

namespace Jungo.test_hid_lib
{
public class TEST_HID_Pipe
{
public byte[] GetBuffer();
public uint GetBuffSize();
public uint GetBytesTransferred();
public bool GetfRead();
public IntPtr GethDev();
public uint GetPipeDirection();
public WDU_PIPE_INFO GetPipeInfo();
public uint GetPipeInterval();
public uint GetPipeMaxPacketSz();
public uint GetPipeNum();
public uint GetPipeType();
public byte[] GetSetupPacket();
public uint GetTimeOut();
public uint GetTransferStatus();
public uint HaltTransferOnPipe();
public bool IsBulkPipe();
public bool IsContiguous();
public bool IsControlPipe();
public bool IsInterruptPipe();
public bool IsInUse();
public bool IsIsochronousPipe();
public bool IsPipeDirectionIn();
public bool IsPipeDirectionInOut();
public bool IsPipeDirectionOut();
public uint ResetPipe();
public void SetContiguous(bool bIsContiguous);
public uint UsbPipeTransfer(bool fRead, uint dwOptions, byte[] buffer, uint dwBuffSize, ref uint dwBytesTransfered, byte[] pSetupPacket, uint timeOut);
public void UsbPipeTransferAsync(bool fRead, uint dwOptions, uint timeOut, D_USER_TRANSFER_COMPLETION TransferCompletion);
public void UsbPipeTransferAsync(bool fRead, uint dwOptions, byte[] buffer, uint dwBuffSize, uint timeOut, D_USER_TRANSFER_COMPLETION TransferCompletion);
}
}




Сейчас попробую примеры на плюсах заюзать...
Go to the top of the page
 
+Quote Post
Dr.Alex
сообщение Aug 8 2014, 10:14
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



Цитата(Integro @ Aug 7 2014, 11:37) *
stm32f407 и usb3300


У вас кит или своя плата?
Go to the top of the page
 
+Quote Post
Integro
сообщение Aug 8 2014, 14:51
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 167
Регистрация: 25-12-09
Из: Минск
Пользователь №: 54 460



Цитата(Dr.Alex @ Aug 8 2014, 13:14) *
У вас кит или своя плата?

На текущий момент stm32f407discovery + USB3300 от wvshare. С сантиметром переходником на проводах.
Ноя думаю это дело не меняет, пример работы joystick работает стабильно и исправно.

Хотя размер пакетов значительно отличается ...

Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 8 2014, 16:42
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



а вы прослушкой USB поглядите по каким конечным точкам идет и какими размерами пакетов...
Go to the top of the page
 
+Quote Post
misyachniy
сообщение Aug 9 2014, 12:15
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 716
Регистрация: 27-05-05
Из: Kyiv
Пользователь №: 5 454



Цитата(Integro @ Aug 7 2014, 10:37) *
Всем привет.
Есть следующая задача, с использованием stm32f407 и usb3300 (HS физика, ULPI интерфейс) получить двунаправленый поток 2х4МБ/с
План следующий, использовать Custom HID, Interrupt передачи размером 1024байт раз в 250мкс

За основу взят пример HID USB Joystick и успешно запущен на моем железе.
После переконфигурирования дескрипторов получил девайс с одним интерфейсом и тремя ендпоинтами, Control и два Interrupt (In\Out)

Проблема в следующем, девайс определяется, но при попытке записи либо чтения ендпоинтов на железе нечего не происходит.
Вопрос к тем кто имеет опыт работ с HS, правильный ли я выбрал подход реализации (hid, interrupt)?
На какие грабли могу наступить(или наступил) в конфигурировании дескрипторов?



Для пересылки больших массивов данных обычно используют bulk endpoint.
Рекомендую взять пример massstorage.
С дескриптора поменять признаки massstorage.
Драйвер можно использовать libusb0 http://sourceforge.net/projects/libusb/

Двунаправленый поток 2х4МБ/с получить можно. Но зависит от порядка поступления данных.
Лучше всего обмениваться запросами по 4МБ разбив на части по 64К.

В windows запрос от программы идет к libusb, от него к драйверу шины, драйвер шины производит планировку загрузки шыны и формирование пакетов. Данные идут в обратном порядке. Так что если пытаться обмениваться короткими пакетами по паре килобайт, то даже 1МБ не получится
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 9 2014, 16:13
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(misyachniy @ Aug 9 2014, 18:15) *
Для пересылки больших массивов данных обычно используют bulk endpoint.

Если нужна гарантированная скорость потока (у ТС вроде так?), то никаких bulk и interrupt. Только isochronous.
bulk - это фоновая передача с минимальным приоритетом. Никакую скорость она гарантировать не может.
interrupt - немногим лучше, но всё равно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 16:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.0144 секунд с 7
ELECTRONIX ©2004-2016