stm32f103 USB чудеса

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
fsmoke
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб июл 10, 2010 19:33:15

stm32f103 USB чудеса

Сообщение fsmoke »

Не работает простейший композитный интерфейс из 2х hid, меняю только USBD_MAX_NUM_INTERFACES с 2 на 1 - всё начинает работать - ставлю 2ку - всё капец. Причем бред заключается в том, что всё нормально отправляется на хост до момента, когда хост пытается выбрать конфигурацию.
Лог выглядит так:

Изображение

Т.е. контроллер просто не отвечает на set configuration

В функции USBD_StdDevReq - сюда

Код: Выделить всё

case USB_REQ_SET_CONFIGURATION:                    
    USBD_SetConfig (pdev , req);
    break;
вообще не попадает! Т.е. такое ощущение, что запрос вообще не доходит

Повторяюсь - меняю только одну циферку - кол-во интерфейсов в дескрипторе. Уже 3 дня сижу - хз. ПОМОГИТЕ

А вот сам дескриптор:

Код: Выделить всё

//******************************************* Configuration descriptor ********************************************

#define USB_CUSTOM_HID_CONFIG_DESC_SIZE       59

__ALIGN_BEGIN static uint8_t configuration_descriptor[USB_CUSTOM_HID_CONFIG_DESC_SIZE] __ALIGN_END =
{
	// bLength: Configuration Descriptor size 
	0x09,
	// bDescriptorType: Configuration 
	USB_DESC_TYPE_CONFIGURATION,
	// wTotalLength: Bytes returned 
	USB_CUSTOM_HID_CONFIG_DESC_SIZE, 0x00,
	//bNumInterfaces: USBD_MAX_NUM_INTERFACES interfaces
	USBD_MAX_NUM_INTERFACES,
	//bConfigurationValue: Configuration value
	0x01,
	//iConfiguration: Index of string descriptor describing	the configuration
	0x00,
	//bmAttributes: bus powered //DKOS check need
	0xC0,
	//MaxPower 100 mA
	0x32,
	
	//*********************** Iface 1 *************************
	//************** Descriptor of interface ****************
	//Offset 0x09(9)
	
	//bLength: Interface Descriptor size
	0x09,
	//bDescriptorType: Interface descriptor type
	USB_DESC_TYPE_INTERFACE, 
	//bInterfaceNumber: Number of Interface
	0x00,
	//bAlternateSetting: Alternate setting
	0x00,
	//bNumEndpoints
	0x01,
	//bInterfaceClass: HID
	0x03,
	//bInterfaceSubClass : 1=BOOT, 0=no boot
	0x00,
	//nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse
	0x00,
	//iInterface: Index of string descriptor
	0,
	
	//******************** Descriptor of hid ********************
	//Offset 0x12(18)
	
	//bLength: HID Descriptor size
	0x09,
	//bDescriptorType: HID
	HID_DESCRIPTOR_TYPE,
	//bcdHID: HID Class Spec release number //DKOS check need
	0x00,
	//bCountryCode: Hardware target country
	0x01, 0x00,
	//bNumDescriptors: Number of HID class descriptors to follow
	0x01,
	//bDescriptorType
	0x22,
	//wItemLength: Total length of Report descriptor
	GAMEPAD_REPORT_DESC_SIZE, 0x00,
	
	//******************* Descriptor of endpoints ***********
	
	//Offset 0x1b(27)
	
	//bLength: Endpoint Descriptor size
	0x07,
	//bDescriptorType:
	USB_DESC_TYPE_ENDPOINT,
	//bEndpointAddress: Endpoint Address (IN)
	GAMEPAD1_EP_IN_ADDR,
	//bmAttributes: Interrupt endpoint
	0x03,
	//wMaxPacketSize: 4 Byte max/
	GAMEPAD_EPIN_SIZE,
	//bInterval: Polling Interval (10 ms)
	0x00, 10,
	
	//*********************** Iface 2 *************************
	//************** Descriptor of interface ****************

	//Offset 0x22(34)
	
	//bLength: Interface Descriptor size
	0x09,
	//bDescriptorType: Interface descriptor type
	USB_DESC_TYPE_INTERFACE, 
	//bInterfaceNumber: Number of Interface
	0x01,
	//bAlternateSetting: Alternate setting
	0x00,
	//bNumEndpoints
	0x01,
	//bInterfaceClass: HID
	0x03,
	//bInterfaceSubClass : 1=BOOT, 0=no boot
	0x00,
	//nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse
	0x00,
	//iInterface: Index of string descriptor
	0,
	
	//******************** Descriptor of hid ********************
	
	//Offset 0x2b(43)
	
	//bLength: HID Descriptor size
	0x09,
	//bDescriptorType: HID
	HID_DESCRIPTOR_TYPE,
	//bcdHID: HID Class Spec release number //DKOS check need
	0x00,
	//bCountryCode: Hardware target country
	0x01, 0x00,
	//bNumDescriptors: Number of HID class descriptors to follow
	0x01,
	//bDescriptorType
	0x22,
	//wItemLength: Total length of Report descriptor
	GAMEPAD_REPORT_DESC_SIZE, 0x00,
	
	//******************* Descriptor of endpoints ***********
	
	//Offset 0x34(52)
	
	//bLength: Endpoint Descriptor size
	0x07,
	//bDescriptorType:
	USB_DESC_TYPE_ENDPOINT,
	//bEndpointAddress: Endpoint Address (IN)
	GAMEPAD2_EP_IN_ADDR,
	//bmAttributes: Interrupt endpoint
	0x03,
	//wMaxPacketSize: 4 Byte max/
	GAMEPAD_EPIN_SIZE,
	//bInterval: Polling Interval (10 ms)
	0x00, 10,
	
	//Offset 0x3b(59)

	
};
PS
компилю через VisualGDB
Реклама
fsmoke
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб июл 10, 2010 19:33:15

Re: stm32f103 USB чудеса

Сообщение fsmoke »

Проблема Решена - ошибки в дексрипторе нет.

Проблема была вот в чем:

Windows запоминает девайс по VID PID и его конфигурацию у себя !!! - и если вы меняете дескриптор конфигурации(что при отладке и разработке usb девайса нормальная практика) - винда начинает думать, что это тоже самое старое устройство и начинает сравнивать, ранее сохраненный дескриптор конфигурации с вновь полученным - они не совпадают - и винда решает выдать ошибку - INVALID_CONFIGURATION_DESCRIPTOR.

Решение:
1) При каждом изменении дескрипторов менять VID/PID
2) Удалять дрова на ваше устройство перед извлечением (чтоб в следующий раз винда опять его поставила)

Лично я пока просто инкрементирую PID, снос и переустановка дров не пробовал

Как я до этого до всего дошел:
Вычитал - спустя 4 вечера!! на каком то форуме - капец. Причем куча людей сталкивается с этим спрашивают на форумах - и вопросы остаются без ответа ...

Надо бы как нибудь это автоматизировать - чтоб при запуске отладки - не только код заливался, но и система чистилась...

Добавлено after 36 minutes 21 second:
Продолжение мытарств с USB здесь:
https://radiokot.ru/forum/viewtopic.php?f=24&t=157879
Реклама
Ответить

Вернуться в «ARM»