Перейти к содержанию
    

nalale

Новичок
  • Постов

    4
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о nalale

  • День рождения 04.11.1990

Информация

  • Город
    Array
  1. WinUSB

    Спасибо за замечание) ошибку исправил, но и при обоих EndPoint в режиме Bulk (0x02), устройство не определяется.
  2. WinUSB

    Ошибку нашел. Почему то если в устройстве один EndPoint, то все работает хорошо, а если больше 1го то устройство не определяется. И мне казалось что EndPoint'ы с адресами 0x01 и 0x81 (т.е IN и OUT) - это одна точка. Таким образом если в дескрипторе интерфейса в поле bNumEndpoint записать 1, и оставить оконечную точку либо IN либо OUT, то все работает. Но мне остается непонятным почему при большем количестве EndPoints не работает. В прикрипленном файле - скрин отчета работы порта. Странность для меня в том, что если судить по этому отчету, порт не посылает запросы на получение дескрипторов, в то время, как сам МК такие запросы ловит и дескрипторы отсылает. И еще под устройством написано Connection Status - Enumeration of Device failed, но в регистре МК присвоенный номер все-таки записался. Это дескприторы с двумя EndPpoints static uint8_t Usb_Device_Descriptor[0x12] = { 0x12, /* bLength */ 0x01, /* bDescriptorType (Device) */ 0x00, 0x02, /* bcdUSB */ 0xFF, /* bDeviceClass (CDC) */ 0x00, /* bDeviceSubClass */ 0x00, /* bDeviceProtocol */ MAX_PACKET_SIZE, /* bMaxPacketSize0 */ 0xc4, 0x55, /* idVendor */ 0x47, 0x88, /* idProduct */ 0x00, 0x02, /* bcdDevice */ 0x00, /* iManufacturer */ 0x00, /* iProduct */ 0x00, /* iSerialNumber */ 0x01 /* bNumConfigurations */ }; static uint8_t Usb_Configuration_Descriptor[0x20] = { /* Configuration Descriptor */ 0x09, /* bLength */ 0x02, /* bDescriptorType (Configuration) */ 0x20, 0x00, /* wTotalLength */ 0x01, /* bNumInterfaces */ 0x01, /* bConfigurationValue */ 0x00, /* iConfiguration */ USB_POWER_ATTIBUTES, /* bmAttributes */ 0x32, /* bMaxPower (100 mA) */ /* Interface Descriptor */ 0x09, /* bLength */ 0x04, /* bDescriptorType (Interface) */ 0x00, /* bInterfaceNumber */ 0x00, /* bAlternateSetting */ 0x02, /* bNumEndpoints */ 0xFF, /* bInterfaceClass (Vendor) */ 0x00, /* bInterfaceSubClass */ 0x00, /* bInterfaceProtocol */ 0x00, /* iInterface */ /* Endpoint 1 Descriptor */ 0x07, /* bLength (Endpoint Descriptor size) */ 0x05, /* bDescriptorType (Endpoint) */ 0x01, /* bEndpointAddress (IN | 1) */ 0x02, /* bmAttributes (Bulk) */ MAX_PACKET_SIZE, 0x00, /* wMaxPacketSize */ 0x00, /* bInterval */ /* Endpoint 2 Descriptor */ 0x07, /* bLength (Endpoint Descriptor size) */ 0x05, /* bDescriptorType (Endpoint) */ 0x82, /* bEndpointAddress (OUT | 2) */ 0x01, /* bmAttributes (Bulk) */ MAX_PACKET_SIZE, 0x00, /* wMaxPacketSize */ 0x00, /* bInterval */ };
  3. WinUSB

    Я это читал все, но проблема в том, что Windows не видит VID и PID устройства. Поэтому и не может определить какой драйвер ставить на устройство. А если он не видит эти номера, значит не был обработан дескриптор устройства, что тоже странно, так как идентификационный номер устройству присвоился.
  4. WinUSB

    В качестве драйвера для USB устройства на МК пытаюсь использовать стандартный WinUSB. Для этой цели помимо стандартных USB-дескрипторов Microsoft требует от устройства специальных дескрипторов, для распознавания того что данное устройство работает с WinUSB - OS String Descriptor и OS Feature Descriptors. Но, если в дескрипторе интерфейса указывать класс интерфейса (bInterfaceClass) 0xFF (определяется производителем, что и нужно в случае WinUSB), то после запроса дескриптора конфигурации устройство определяется как неизвестное и не подает признаков жизни, хотя, как я понимаю дальше должен следовать запрос о строковом дескрипторе OS String Descriptor. Т.е последовательность запросов такая - 1 - GET_DESCRIPTOR(device) 2 - SET_ADDRESS 3 - GET_DESCRIPTOR(device) 4 - GET_DESCRIPTOR(configuration) Дескриптор Устройства - static uint8_t Usb_Device_Descriptor[0x12] = { 0x12, /* bLength */ 0x01, /* bDescriptorType (Device) */ 0x00, 0x02, /* bcdUSB */ 0x00, /* bDeviceClass */ 0x00, /* bDeviceSubClass */ 0x00, /* bDeviceProtocol */ MAX_PACKET_SIZE, /* bMaxPacketSize0 */ 0xc4, 0x10, /* idVendor */ 0x47, 0x88, /* idProduct */ 0x00, 0x01, /* bcdDevice */ 0x00, /* iManufacturer */ 0x00, /* iProduct */ 0x00, /* iSerialNumber */ 0x01 /* bNumConfigurations */ }; Вот кусок дескриптора конфигурации, который описывает интерфейс, описание EndPoint опустил. static uint8_t Usb_Configuration_Descriptor[0x20] = { /* Configuration Descriptor */ 0x09, /* bLength */ 0x02, /* bDescriptorType (Configuration) */ 0x20, 0x00, /* wTotalLength */ 0x01, /* bNumInterfaces */ 0x01, /* bConfigurationValue */ 0x00, /* iConfiguration */ USB_POWER_ATTIBUTES,, /* bmAttributes */ 0x32, /* bMaxPower (100 mA) */ /* Interface Descriptor */ 0x09, /* bLength */ 0x04, /* bDescriptorType (Interface) */ 0x00, /* bInterfaceNumber */ 0x00, /* bAlternateSetting */ 0x01, /* bNumEndpoints */ 0xFF, /* bInterfaceClass (Vendor) */ 0x00, /* bInterfaceSubClass */ 0x00, /* bInterfaceProtocol */ 0x00, /* iInterface */ .... .... Если описывать устройство как CDC то все работает хорошо, а вот с WinUsb не получается. В чем ошибка?
×
×
  • Создать...