Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32f4+USB3300 = usb high speed
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Integro
Всем привет.
Есть следующая задача, с использованием 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
};
Golikov A.
Цитата
Проблема в следующем, девайс определяется, но при попытке записи либо чтения ендпоинтов на железе нечего не происходит

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

Integro
Да, совсем забыл уточнить, на данный момент для работы с 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);
}
}




Сейчас попробую примеры на плюсах заюзать...
Dr.Alex
Цитата(Integro @ Aug 7 2014, 11:37) *
stm32f407 и usb3300


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

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

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

Golikov A.
а вы прослушкой USB поглядите по каким конечным точкам идет и какими размерами пакетов...
misyachniy
Цитата(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МБ не получится
jcxz
Цитата(misyachniy @ Aug 9 2014, 18:15) *
Для пересылки больших массивов данных обычно используют bulk endpoint.

Если нужна гарантированная скорость потока (у ТС вроде так?), то никаких bulk и interrupt. Только isochronous.
bulk - это фоновая передача с минимальным приоритетом. Никакую скорость она гарантировать не может.
interrupt - немногим лучше, но всё равно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.