|
Запуск USB |
|
|
|
 |
Ответов
|
May 23 2007, 09:18
|
Группа: Новичок
Сообщений: 8
Регистрация: 21-05-07
Пользователь №: 27 850

|
Цитата(grau @ May 22 2007, 15:16)  Salute!
Для освоения USB решил воспользоваться примером HID от Keil. Чип - LPC2148.
Запустил железку, на ПК сделал файл - данные гоняются туда и обратно.
Теперь хочу увеличить скорость. Правильно ли понимаю, что для увеличения скорости достаточно объявить еще одну конечную точку, добавить к репорту идентефикатор и как раньше читать данные из файла?
И еще вопросик. Изменил дескриптор из примера, чтоб переназначить поток с первой EP на четвертую. USB_ENDPOINT_IN(4), /* bEndpointAddress */ после чего связь с устройством установить не удается. Может еще чего подправить надо было? >Теперь хочу увеличить скорость. Правильно ли понимаю, что для увеличения скорости достаточно объявить еще одну конечную точку, добавить к репорту идентефикатор и как раньше читать данные из файла? Если так, то надо еще один интерфейс HID-устройства добавить. Можно по другому: 1) Файл usbdesc.c - дескриптор HID-устройства HID_ReportDescriptor - здесь все надо менять. Например так попробовать. const BYTE HID_ReportDescriptor[30] = { 6, 0, 0xFF, //Usage_Page (Vendor Defined) 9, 1, //Usage (I/O Device) 0xA1, 0x80,//1, // Collection (Application) 0x85, ReportID, // REPORT_ID (>30 - репорт, какой надо) 0x19, 1, // Usage_Minimum 0x29, 1, // Usage_Maximum 0x15, 0, // Logical_Minimum (0) 0x25, 0xff, // Logical_Maximum (255) 0x75, 8, // Report_Size (8 bit) 0x95, ReportCount, // Report_Count (8, 16, 64 bytes - по вашему желанию) 0x81, 2, // Input (Data,Var,Abs) 0x19, 1, // Usage_Minimum 0x29, 1, // Usage_Maximum 0x91, 2, // Output (Data,Var,Abs) 0xC0 // End_Collection }; 2) Файл usbdesc.c - дескриптор USB-устройства USB_ConfigDescriptor - элемент bInterval поставить 1 вместо 20. 3) Неплохо бы познакомится с документами со странички http://www.usb.org/developers/hidpage/. Или c книгой "Практика программирования USB" Агурова. 4) Переписать пример в Windows, чтобы репорт нужного размера забирал. Причем наверх из устройства нужно всегда отправлять пакет, начинающийся с байта REPORT_ID. Иначе hid.dll отбросит ваш ответ. >И еще вопросик. Изменил дескриптор из примера, чтоб переназначить поток с первой EP на четвертую. Возможно просто забыли EP4 включить в устройстве.
|
|
|
|
|
May 23 2007, 10:56
|

Участник

Группа: Участник
Сообщений: 49
Регистрация: 3-02-05
Пользователь №: 2 390

|
Цитата(Слава_2 @ May 23 2007, 13:18)  >Теперь хочу увеличить скорость. Правильно ли понимаю, что для увеличения скорости достаточно объявить еще одну конечную точку, добавить к репорту идентефикатор и как раньше читать данные из файла? Если так, то надо еще один интерфейс HID-устройства добавить. Вот этого момента как раз и не могу понять. Во-первых, добавил еще одну точку (к Ep1 добавил Ep4), так она просто игнорируется, т.е. не опрашивается и все in-репорты теряются (Device monitor их не видит). Вопрос: может ли виндовый HID-драйвер работать с несколькими конечными точками? Во-вторых, пока не разобрался с добавлением еще одного интерфейса. Делаю так: в ConfigDescriptor перед терминатором копирую Interface, HID и Ep дескрипторы. Правлю номера нужные цифры. Енумерация не проходит. Сижу сейчас разбираюсь. Цитата Можно по другому: 1) Файл usbdesc.c - дескриптор HID-устройства HID_ReportDescriptor - здесь все надо менять. Например так 2) Файл usbdesc.c - дескриптор USB-устройства USB_ConfigDescriptor - элемент bInterval поставить 1 Это уже сделал, 64000Б/с достигнуто. Хочу еще пару таких же каналов организовать Цитата 4) Переписать пример в Windows, чтобы репорт нужного размера забирал. Причем наверх из устройства нужно всегда отправлять пакет, начинающийся с байта REPORT_ID. Иначе hid.dll отбросит ваш ответ. Если правильно понимаю, то при чтении файла надо подсовывать буфер для данных, а функция сама уже разберется, чем и как его заполнять. Подсовываю памяти заведомо больше данных, а потом сам уже разгребаю по Id и длине пакетов. Цитата >И еще вопросик. Изменил дескриптор из примера, чтоб переназначить поток с первой EP на четвертую. Возможно просто забыли EP4 включить в устройстве. Разобрался. Оказывается, чтоб точка заработала, в нее надо было хоть раз что-то записать. Что-то в доках об этом не видел..
|
|
|
|
|
May 23 2007, 14:00
|
Группа: Новичок
Сообщений: 8
Регистрация: 21-05-07
Пользователь №: 27 850

|
grau>Вопрос: может ли виндовый HID-драйвер работать с несколькими конечными точками? Если под конечной точкой подразумевать комбинацию EP IN, EP OUT, то скорее всего нет.
У вас есть шанс попробовать так (но лучше все-таки свой драйвер написать): в usbdesc.c в USB_ConfigDescriptor есть поле bNumInterfaces: сделайте =2. Создаете копию еще одного интерфейса, в нем еще одну копию HID-дескриптора, затем еще два EP. В интерфейсе изменяете HID_REPORT_DESCRIPTOR_TYPE на HID_REPORT_DESCRIPTOR_TYPE+1. А дальше надо изменить usbcore.c здесь: case HID_HID_DESCRIPTOR_TYPE: if (SetupPacket.wIndex.WB.L != USB_HID_IF_NUM) { return (FALSE); /* Only Single HID Interface is supported */ } EP0Data.pData = (BYTE *)USB_ConfigDescriptor + HID_DESC_OFFSET; len = HID_DESC_SIZE; break; case HID_REPORT_DESCRIPTOR_TYPE: if (SetupPacket.wIndex.WB.L != USB_HID_IF_NUM) { return (FALSE); /* Only Single HID Interface is supported */ } чтобы при опросе система получала еще одну копию дескриптора в ответ на запрос HID_REPORT_DESCRIPTOR_TYPE для второго интерфейса: содержимое HID_ReportDescriptor2 - копия HID_ReportDescriptor с другим ReportID. По сути получите композитное устройство с двумя HID интерфейсами - в теории конечно - я так не пробовал делать. Будут ли hidclass.sys, hidparse.sys, hidusb.sys правильно давать запросы двум разным EP (по сути их будет 4)? Не знаю.
Хотите от устройства скорости? Пишите свой драйвер или используйте готовый, но не HID. Размножение логических точек вам мало чем поможет.
|
|
|
|
|
May 24 2007, 15:48
|

Участник

Группа: Участник
Сообщений: 49
Регистрация: 3-02-05
Пользователь №: 2 390

|
Цитата(Слава_2 @ May 23 2007, 18:00)  в usbdesc.c в USB_ConfigDescriptor есть поле bNumInterfaces: сделайте =2. ... Сделал. В конце приведу дескриптор, для конкретики. Причем, обратил внимание, одни предлагают делать последовательность Configuration Descriptor Interface 0 HID Class Endpoint Interface 1 HID Class Endpoint А по другим источникам надо Configuration Descriptor Interface 0 Endpoint HID Class Interface 1 Endpoint HID Class Пробовал и так, и так. Результат един: после получения Configuration Descriptor и его отдачи хосту устройство отключается Цитата(Слава_2 @ May 23 2007, 18:00)  Хотите от устройства скорости? Пишите свой драйвер или используйте готовый, но не HID. Размножение логических точек вам мало чем поможет. Ну скажем, так.. Три канала по 64кБ/с меня вполне устроят. А драйвер надо разбираться, как писать, причем с нуля, а потом еще и поддерживать для всех версий ОС. А пользователь должен права админа потом получать. Геморойно. Думал еще прикинуться композитным устройством, один HID и два Audio чтоб было, но если как сейчас винда переваривать не хочет, то наверное и впрямь придется драйверами заняться. Еще интересный вопрос возник: зачем нужен терминатор в конце Configuration Descriptor? Он же не передается.. Код /* USB Configuration Descriptor */ const BYTE USB_ConfigDescriptor[] = { /* Configuration 1 */ USB_CONFIGUARTION_DESC_SIZE, /* bLength */ USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */ WBVAL( /* wTotalLength */ USB_CONFIGUARTION_DESC_SIZE + USB_INTERFACE_DESC_SIZE + HID_DESC_SIZE + USB_ENDPOINT_DESC_SIZE + USB_INTERFACE_DESC_SIZE + HID_DESC_SIZE + USB_ENDPOINT_DESC_SIZE ), 0x02, /* bNumInterfaces */ 0x01, /* bConfigurationValue */ 0x00, /* iConfiguration */ USB_CONFIG_BUS_POWERED /*|*/ /* bmAttributes */ /*USB_CONFIG_REMOTE_WAKEUP*/, USB_CONFIG_POWER_MA(100), /* bMaxPower */ /* Interface 0, Alternate Setting 0, HID Class */ USB_INTERFACE_DESC_SIZE, /* bLength */ USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ 0x00, /* bInterfaceNumber */ 0x00, /* bAlternateSetting */ 0x01, /* bNumEndpoints */ USB_DEVICE_CLASS_HUMAN_INTERFACE, /* bInterfaceClass */ HID_SUBCLASS_NONE, /* bInterfaceSubClass */ HID_PROTOCOL_NONE, /* bInterfaceProtocol */ 0x5C, /* iInterface */
/* Endpoint, HID Interrupt In */ USB_ENDPOINT_DESC_SIZE, /* bLength */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ USB_ENDPOINT_IN(1), /* bEndpointAddress */ USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */ WBVAL(0x0004), /* wMaxPacketSize */ 0x20, /* 32ms */ /* bInterval */ // 0x1, /* 1ms */ /* bInterval */
/* HID Class Descriptor */ /* HID_DESC_OFFSET = 0x0012 */ HID_DESC_SIZE, /* bLength */ HID_HID_DESCRIPTOR_TYPE, /* bDescriptorType */ WBVAL(0x0100), /* 1.00 */ /* bcdHID */ 0x00, /* bCountryCode */ 0x01, /* bNumDescriptors */ HID_REPORT_DESCRIPTOR_TYPE, /* bDescriptorType */ WBVAL(HID_REPORT_DESC_SIZE), /* wDescriptorLength */
/* Interface 1, Alternate Setting 0, HID Class */ USB_INTERFACE_DESC_SIZE, /* bLength */ USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ 0x01, /* bInterfaceNumber */ 0x00, /* bAlternateSetting */ 0x01, /* bNumEndpoints */ USB_DEVICE_CLASS_HUMAN_INTERFACE, /* bInterfaceClass */ HID_SUBCLASS_NONE, /* bInterfaceSubClass */ HID_PROTOCOL_NONE, /* bInterfaceProtocol */ 0x00, /* iInterface */
/* Endpoint, HID Interrupt In */ USB_ENDPOINT_DESC_SIZE, /* bLength */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ USB_ENDPOINT_IN(4), /* bEndpointAddress */ USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */ WBVAL(0x0004), /* wMaxPacketSize */ 0x20, /* 32ms */ /* bInterval */ // 0x1, /* 1ms */ /* bInterval */
/* HID Class Descriptor */ HID_DESC_SIZE, /* bLength */ HID_HID_DESCRIPTOR_TYPE, /* bDescriptorType */ WBVAL(0x0100), /* 1.00 */ /* bcdHID */ 0x00, /* bCountryCode */ 0x01, /* bNumDescriptors */ HID_REPORT_DESCRIPTOR_TYPE, /* bDescriptorType */ WBVAL(HID_REPORT_DESC_SIZE), /* wDescriptorLength */
/* Terminator */ 0 /* bLength */ };
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|