USB девайс определяется со 2го раза

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

USB девайс определяется со 2го раза

Сообщение fsmoke »

Решил создать ещё один топик т.к. это уже другая проблема

Начало эпопеи здесь
https://radiokot.ru/forum/viewtopic.php ... 4#p3474274

Проблема:
Меняю PID, спецом, чтобы винда думала, что это новое устройство. Прошиваю, вставляю.
Бац: Устройство не опознано :(

Перетыкиваю в тот же порт - хлоп: устройство готово к использованию. И после этого всё хорошо - хоть млн. раз перетыкивай в любые порты.

Опять меняю PID - ситуация повторяется. Нормальная инициализация устройства происходит всегда со второго(и последующих) раза...

Пробовал на 2х компах - ситуация аналогичная - общего на них: стоит антивирус AVIRA. Пробовал его отключать - ничего не меняется .

Может где то надо задержки инициализации USB сделать или флажки какие нибудь неправильные у меня в дескрипторах. Пробовал заливать и дебажную и релизную версии - болт.

Лог говорит о том, что винда якобы 3 раза запрашивает DEVICE descriptor - но ей никто не отвечает.

ПС
Вроде бы всё работает, но всё же неприятно что девайс со второго раза будет инициализироваться при новом подключении..


Вот дескриптор девайса

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

__ALIGN_BEGIN uint8_t device_descriptor[USB_LEN_DEV_DESC] __ALIGN_END =
{
	//bLength 
	0x12, 
	//bDescriptorType
	USB_DESC_TYPE_DEVICE, 
	//bcdUSB 
	0x00, 0x02,
	//bDeviceClass
	0x00, 
	//bDeviceSubClass
	0x00, 
	//bDeviceProtocol
	0x00, 
	//bMaxPacketSize
	USB_MAX_EP0_SIZE,
	//idVendor
	LOBYTE(USBD_VID), HIBYTE(USBD_VID), 
	//idProduct
	LOBYTE(USBD_PID), HIBYTE(USBD_PID),
	//bcdDevice rel. 2.00
	0x00, 0x02,
	//Index of manufacturer  string
	USBD_IDX_MFC_STR, 
	//Index of product string
	USBD_IDX_PRODUCT_STR,
	//Index of serial number string
	USBD_IDX_SERIAL_STR, 
	//bNumConfigurations
	USBD_MAX_NUM_CONFIGURATION 
};
Вот конфигурация:

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

//******************************************* 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)

	
};
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: USB девайс определяется со 2го раза

Сообщение Мурик »

Проект создаете в Кубе?
Реклама
fsmoke
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб июл 10, 2010 19:33:15

Re: USB девайс определяется со 2го раза

Сообщение fsmoke »

да.. изначально создал в кубе - но практически голый. Класс написал с нуля сам (подглядывая в реализацию кастом хид и в инет) - т.к. единственное, что подходит из куба это custom hid - но по факту он не подходит т.к. заточен под один интерфейс, да и вообще мне(проф. софтверному разрабу) не нравятся как они пишут, но это лирика :)
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: USB девайс определяется со 2го раза

Сообщение Мурик »

Почему бы не взять "STM32 USB FS Device"?
Реклама
Эиком - электронные компоненты и радиодетали
fsmoke
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб июл 10, 2010 19:33:15

Re: USB девайс определяется со 2го раза

Сообщение fsmoke »

[uquote="Мурик",url="/forum/viewtopic.php?p=3474795#p3474795"]Почему бы не взять[/uquote]
Ну это мой первый проект на стм да и вообще на арм-м. Ну дык на ст ж написано, что stdperif и всё, что к ней относится типа старое гамно... пока поддерживается, но не развивается уже чуть ли не с 12го года. Для новых дизайнов юзать куб.

Так как я нуб с стмах - я повелся на это громкое заявление. А что в кубовских реализациях хала всё так плохо? Ну то что это как то странно написано - это я уже увидел, но чтоб это ещё и плохо работало - это конечно будет очень печально....
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: USB девайс определяется со 2го раза

Сообщение Мурик »

fsmoke писал(а):stdperif и всё, что к ней относится типа старое гамно
Тогда куб, извиняюсь за выражение - новое гамно. :)))
USB FS Device почти не использует SPL и из нее не сложно ее исключить. :) Вот к примеру пара проектов с USB FS Device. http://purebasic.mybb.ru/viewtopic.php?id=592#p7394
http://purebasic.info/phpBB3ex/viewtopi ... =10&t=4713
Реклама
Ответить

Вернуться в «Интеграция с ПК»