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

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

Сб окт 06, 2018 09:38:01

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

Начало эпопеи здесь
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)

   
};

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

Сб окт 06, 2018 12:23:48

Проект создаете в Кубе?

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

Сб окт 06, 2018 21:43:43

да.. изначально создал в кубе - но практически голый. Класс написал с нуля сам (подглядывая в реализацию кастом хид и в инет) - т.к. единственное, что подходит из куба это custom hid - но по факту он не подходит т.к. заточен под один интерфейс, да и вообще мне(проф. софтверному разрабу) не нравятся как они пишут, но это лирика :)

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

Сб окт 06, 2018 23:01:42

Почему бы не взять "STM32 USB FS Device"?

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

Вс окт 07, 2018 15:59:29

Почему бы не взять

Ну это мой первый проект на стм да и вообще на арм-м. Ну дык на ст ж написано, что stdperif и всё, что к ней относится типа старое гамно... пока поддерживается, но не развивается уже чуть ли не с 12го года. Для новых дизайнов юзать куб.

Так как я нуб с стмах - я повелся на это громкое заявление. А что в кубовских реализациях хала всё так плохо? Ну то что это как то странно написано - это я уже увидел, но чтоб это ещё и плохо работало - это конечно будет очень печально....

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

Вс окт 07, 2018 19:01:38

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
Ответить