реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Комозитное устройство - не работает. Помогите.
Kitsok
сообщение Feb 3 2007, 21:41
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



Привет всем!

Пытаюсь сделать композитное устройство на SAM7, два джойстика.

Дескрипторы устройства и конфигурации(+интерфейсов +конечных точек +HID) выглядят следующим образом (согласно http://msdn2.microsoft.com/en-us/library/aa476434.aspx):

Код
const S_usb_device_descriptor pxDeviceDescriptor = {
         sizeof(S_usb_device_descriptor),                   // Size of this descriptor
         USB_DEVICE_DESCRIPTOR,                             // DEVICE descriptor type
         USB2_00,                                           // USB 2.0 specification
//         USB_CLASS_VENDOR_SPECIFIC,                         // Class is specified in the interface descriptor.
         0xef,                                  // Class is specified in the interface descriptor.
         0x02,                                              // No device subclass code
         0x01,                                              // No device protocol code
         0x08,                                              // Maximum packet size for endpoint 0
         0xffff,                                            // Vendor ID
         0x200C,                                            // Product ID = 0x0001
         0x0003,                                            // Device release number 0.01
         usbMANUFACTURER_STRING,                            // Index of manufacturer description
         usbPRODUCT_STRING,                                 // Index of product description
         0x00,                                              // Index of serial number description
         0x01                                               // One possible configuration
};  

const char pxConfigDescriptorNew[] = {

      /* Configuration 1 descriptor */
        sizeof(S_usb_configuration_descriptor),             // Size of this descriptor
        USB_CONFIGURATION_DESCRIPTOR,                       // CONFIGURATION descriptor type
        //0x29,0x00,                                          // Total length of data
        0x42,0x00,                                          // Total length of data
        0x02,                                               // Two interfaces are used by this configuration
        0x01,                                               // Value 0x01 is used to select this configuration
        usbCONFIGURATION_STRING,                            // No string is used to describe this configuration
        USB_CONFIG_BUS_NOWAKEUP,                            // Device is bus-powered, no remote wakeup
        USB_POWER_MA(100),                                  // maximum power consumption (0x32 = 50 = 100mA)

    /* Interface Descriptor Requirement */
        sizeof(S_usb_interface_descriptor),                 // Size of this descriptor
        USB_INTERFACE_DESCRIPTOR,                           // INTERFACE Descriptor Type
        0x00,                                               // Interface 0
        0x00,                                               // No alternate settings
        0x02,                                               // 2 endpoints used
        USB_CLASS_HID,                                      // HID class code
        HID_NO_SUBCLASS,                                    // The Boot protocol is not supported
        HID_PROTOCOL_CODE_NONE,                             // No protocol
        usbINTERFACE_STRING,                                // No associated string descriptor

    /* HID Descriptor */
        sizeof(S_hid_descriptor),                           // Size of this descriptor in bytes (9)
        HID_DESCRIPTOR,                                     // HID descriptor type
        HID_1_11,                                           // HID Class Specification 1.11
        0x00,                                               // No country code
        0x01,                                               // 1 HID class descriptor
        HID_REPORT_DESCRIPTOR,                              // First HID-specific descriptor type
        sizeof(pxReportDescriptor),0x00,                    // Total length of first descriptor

        /* Endpoint 1 descriptor */
        sizeof(S_usb_endpoint_descriptor),                  // Size of this descriptor
        USB_ENDPOINT_DESCRIPTOR,                            // ENDPOINT descriptor type
        0x01 | USB_ENDPOINT_IN,                             // Endpoint number, direction IN
        ENDPOINT_TYPE_INTERRUPT,                            // Endpoint type interrupt
        0x40,0x00,                                          // Endpoint maximum packet size (reverse order)
        0x0A,                                               // Interval for polling: 10ms

        /* Endpoint 2 descriptor */
        sizeof(S_usb_endpoint_descriptor),                  // Size of this descriptor
        USB_ENDPOINT_DESCRIPTOR,                            // ENDPOINT descriptor type
        0x02 | USB_ENDPOINT_OUT,                            // Endpoint number, direction IN
        ENDPOINT_TYPE_INTERRUPT,                            // Endpoint type interrupt
        0x40,0x00,                                          // Endpoint maximum packet size (reverse order)
        0xC8,                                               // Interval for polling: 100ms
        //0x0A                                               // Interval for polling: 100ms
        
        
        //0x29
        /* Interface Descriptor Requirement */
        sizeof(S_usb_interface_descriptor),                 // Size of this descriptor
        USB_INTERFACE_DESCRIPTOR,                           // INTERFACE Descriptor Type
        0x01,                                               // Interface 1
        0x00,                                               // No alternate settings
        0x01,                                               // 1 endpoints used
        USB_CLASS_HID,                                      // HID class code
        HID_NO_SUBCLASS,                                    // The Boot protocol is not supported
        HID_PROTOCOL_CODE_NONE,                             // No protocol
        //usbINTERFACE_STRING,                                // No associated string descriptor
        0x00,                                // No associated string descriptor

    /* HID Descriptor */
        sizeof(S_hid_descriptor),                           // Size of this descriptor in bytes (9)
        HID_DESCRIPTOR,                                     // HID descriptor type
        HID_1_11,                                           // HID Class Specification 1.11
        0x00,                                               // No country code
        0x01,                                               // 1 HID class descriptor
        HID_REPORT_DESCRIPTOR,                              // First HID-specific descriptor type
        sizeof(pxReportDescriptor),0x00,                    // Total length of first descriptor

        /* Endpoint 3 descriptor */
        sizeof(S_usb_endpoint_descriptor),                  // Size of this descriptor
        USB_ENDPOINT_DESCRIPTOR,                            // ENDPOINT descriptor type
        0x03 | USB_ENDPOINT_IN,                             // Endpoint number, direction IN
        ENDPOINT_TYPE_INTERRUPT,                            // Endpoint type interrupt
        0x08,0x00,                                          // Endpoint maximum packet size (reverse order)
        0x0A,                                               // Interval for polling: 10ms

};


Однако энумерация не проходит.

После получения конфиг-дескриптора винда (2000) отключает девайс.

Подскажите, пожалуйста, где что не так.

Заранее спасибо!
Go to the top of the page
 
+Quote Post
Седой
сообщение Feb 4 2007, 19:20
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806



Нарушен прорядок следовния дескрипоторов.

Нужно так:

Configuration descriptor
Interface descriptor // 1 интерфейс (1 -ое устройство)
Endpoint descriptors // дескрипторы конечных точек 1 -го интерфейса
HID descriptor // HID 1-го устройства
Interface descriptor // 2 интерфейс (2 -ое устройство)
Endpoint descriptors // дескрипторы конечных точек 2 -го интерфейса
HID descriptor // HID 2-го устройства

см. спецификацию на USB2.0
Go to the top of the page
 
+Quote Post
Kitsok
сообщение Feb 5 2007, 02:30
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



Цитата(Седой @ Feb 4 2007, 19:20) *
Нарушен прорядок следовния дескрипоторов.

Нужно так:

Configuration descriptor
Interface descriptor // 1 интерфейс (1 -ое устройство)
Endpoint descriptors // дескрипторы конечных точек 1 -го интерфейса
HID descriptor // HID 1-го устройства
Interface descriptor // 2 интерфейс (2 -ое устройство)
Endpoint descriptors // дескрипторы конечных точек 2 -го интерфейса
HID descriptor // HID 2-го устройства

см. спецификацию на USB2.0


Сейчас сделал Configuration->Interface0->EP1->EP2->HID->Interface1->EP3->HID. Все то-же самое.... ;(
Причем, что характерно, если Int->HID-EP, т.е. как было у меня, то при изменениия NumInterfaces с 0x02 на 0x01 (и больше ничего не меняю) - энумерация проходит, устройство успешно работает. Если как Вы написали, то ни при 0x02, ни при 0x01 энумерация не проходит.

P.S. Документ "Device class definition for Human Interface Devices(HID) ver 1.11", в разделе 7.1 Request. Standard Request определяет порядок следования дескрипторов следующим образом:
Цитата
The HID descriptor shall be interleaved between the Interface and Endpoint descriptors for HID interfaces.
, т.е.
Config->Interface->HID->Endpoint->Optional Endpoint

Нашел еще одно отличие между работающей (0x01, мой порядок) и не работающей (0x02, любой порядок) в HHD USB Monitor
Вот это когда не работает, сразу после получения виндой конфиг-дескриптора (с интерфейс-, HID- и EP-дескрипторами):


Код
000013: Select Configuration (DOWN), 05.02.2007 02:18:43.6911344 +0.0 Configuration Index: 1

000014: Select Configuration (UP), 05.02.2007 02:18:43.6911344 +0.0 Configuration Index: 1 Configuration Handle: 0x3


Это - когда энумерация проходит:

Код
000013: Select Configuration (DOWN), 05.02.2007 02:31:47.8486976 +0.0 Configuration Index: 1

000014: Select Configuration (UP), 05.02.2007 02:31:47.8587120 +0.0100144 Configuration Index: 1 Configuration Handle: 0xe13db928


Что это?

Сообщение отредактировал Kitsok - Feb 5 2007, 02:37
Go to the top of the page
 
+Quote Post
Kitsok
сообщение Feb 5 2007, 10:29
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



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

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

Спасибо всем за помощь!
Go to the top of the page
 
+Quote Post
Седой
сообщение Feb 13 2007, 21:26
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806



C HID дескриптором был не прав, извиняюсь, что направил на ложный путь.

Совершенно забыл, что HID дескриптор класса идет раньше дескрипторов endpoint-ов.

Сообщение отредактировал Седой - Feb 13 2007, 21:34
Go to the top of the page
 
+Quote Post
Kitsok
сообщение Feb 20 2007, 15:14
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



Цитата(Седой @ Feb 13 2007, 21:26) *
C HID дескриптором был не прав, извиняюсь, что направил на ложный путь.

Совершенно забыл, что HID дескриптор класса идет раньше дескрипторов endpoint-ов.

Ничего страшного, бывает.

Кстати, заработало-то оно заработало, да не до конца. Не поддерживает виндовз два джойстика с одинаковыми VID/HID и одним адресом на шине. В итоге пришлось работать через виртуальный джойстик и юзерское приложение, которое берет vendor-defined часть репорта и шлет виртуальному джойстику. Через одно место, но драйвер писать еще геморройнее.

Сообщение отредактировал Kitsok - Feb 20 2007, 15:15
Go to the top of the page
 
+Quote Post
Седой
сообщение Feb 21 2007, 13:40
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806



Цитата
но драйвер писать еще геморройнее


На самом деле не так страшен черт, как его рисуют.

Немного не в тему:

Вторая половина 90-х. Куча экспериментальных установок, все автоматизированные - КАМАК+ISA-плата+PC c DOS. Захотелось перевести под Windows - удобнее отображать и обрабатывать данные. Вроде бы все просто - и Win3.1 и Win95 позволяют работать напрямую с железом - обращение к портам открыто. Но с прерываниями не получается, да и Win NT ( тогда еще 3.50 и 3.51) понадежнее. Но для NT нужны драйверы, к железу доступа впрямую нет.

Долго спорили, но в конце концов купили подписку на MSDN. Получили 50 CD, в том числе и с DDK. Через 3 месяца комплект драйверов был готов. Но самое главное, получили опыт в использовании данной технологии. Потом PCI, USB. C USB вообще все просто оказалось, на мосты USB-COM порт даже смотреть не стали, используем свой драйвер + любой USB контроллер (или МК с USB).

Сейчас же вообще просто - скачал DDK с Microsoft, нашел в сети DriverStudio( в ней в том числе есть хорошие примеры, даже виртуальный COM), скачал с Cypress драйверы с исходниками ( кстати очень качественные) - сделал свой. Или пользуешься новой технологией от Microsoft - KMDF.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 13:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01463 секунд с 7
ELECTRONIX ©2004-2016