|
|
  |
Комозитное устройство - не работает. Помогите. |
|
|
|
Feb 3 2007, 21:41
|
Местный
  
Группа: Свой
Сообщений: 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) отключает девайс. Подскажите, пожалуйста, где что не так. Заранее спасибо!
|
|
|
|
|
Feb 5 2007, 02:30
|
Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Feb 20 2007, 15:14
|
Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Feb 21 2007, 13:40
|
Местный
  
Группа: Свой
Сообщений: 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.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|