Спасибо за наводку, через виглер напрямую не получилось, зато получилось через H-JTAG. Правда, все равно - бесполезно, т.к. тайминги уезжают и винда отрубает USB-устройство.
Сейчас впоролся - вроде и осознание процесса пришло, а все равно, не получается.
Итак, беру демо-проект из FreeRTOS с джойстиком на три оси.
Дескриптор репорта там выглядит следующим образом:
Код
const portCHAR pxReportDescriptor[] =
{
0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
0x09, 0x04, /* USAGE (Joystick) */
0xa1, 0x01, /* COLLECTION (Application) */
0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
0x09, 0x01, /* USAGE (Pointer) */
0xa1, 0x00, /* COLLECTION (Physical) */
0x09, 0x30, /* USAGE (X) */
0x09, 0x31, /* USAGE (Y) */
0x09, 0x32, /* USAGE (Z) */
// 0x09, 0x33, /* USAGE (T) */
0x15, 0x81, /* LOGICAL_MINIMUM (-127) */
0x25, 0x7f, /* LOGICAL_MAXIMUM (127) */
0x75, 0x08, /* REPORT_SIZE (8) */
// 0x95, 0x04, /* REPORT_COUNT (4) */
0x95, 0x03, /* REPORT_COUNT (3) */
0x81, 0x02, /* INPUT (Data,Var,Abs) */
0xc0, /* END_COLLECTION */
0xc0 /* END_COLLECTION */
};
То, что закоментарено - мое, т.е. я добавил 0x09, 0x33 и подправил REPORT_COUNT.
Плюс к этому подправлено вот что:
Код
/* Endpoint 1 descriptor */
0x07, /* bLength */
0x05, /* bDescriptorType */
0x81, /* bEndpointAddress, Endpoint 01 - IN */
0x03, /* bmAttributes INT */
//0x04, 0x00, /* wMaxPacketSize: 4 bytes (x, y, z, t) */
0x03, 0x00, /* wMaxPacketSize: 3 bytes (x, y, z) */
0x0A /* bInterval
т.е. я по наитию расширил максимальный размер пакета.
Плюс к этому в функции, которая собственно шлет данные, добавил посылку еще одной оси:
Код
/* Write our sample data to the fifo. */
AT91C_BASE_UDP->UDP_FDR[ usbEND_POINT_1 ] = x;
AT91C_BASE_UDP->UDP_FDR[ usbEND_POINT_1 ] = y;
AT91C_BASE_UDP->UDP_FDR[ usbEND_POINT_1 ] = z;
//AT91C_BASE_UDP->UDP_FDR[ usbEND_POINT_1 ] = t;
В итоге, судя по обмену, винду вроде все устраивает, но устройство не отвечает на BULK_OR_INTERRUPT TRANSFER, после чего винда его отваливает через какое-то время....
Где еще копать - не пойму.. Помогите, люди добрые