Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запуск USB
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
grau
Salute!

Для освоения USB решил воспользоваться примером HID от Keil. Чип - LPC2148.

Запустил железку, на ПК сделал файл - данные гоняются туда и обратно.

Теперь хочу увеличить скорость. Правильно ли понимаю, что для увеличения скорости достаточно объявить еще одну конечную точку, добавить к репорту идентефикатор и как раньше читать данные из файла?

И еще вопросик. Изменил дескриптор из примера, чтоб переназначить поток с первой EP на четвертую.
USB_ENDPOINT_IN(4), /* bEndpointAddress */
после чего связь с устройством установить не удается. Может еще чего подправить надо было?
Слава_2
Цитата(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 включить в устройстве.
grau
Цитата(Слава_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 включить в устройстве.


Разобрался. Оказывается, чтоб точка заработала, в нее надо было хоть раз что-то записать. Что-то в доках об этом не видел..
Слава_2
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. Размножение логических точек вам мало чем поможет.
grau
Цитата(Слава_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 */
};
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.