Разобрался с дескриптором репорта, устройство определяется.
CODE
__attribute__((section(".progmem.Descriptor")))
char usbHidReportDescriptor[79] =
{
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x04, // USAGE (Joystick)
0xA1, 0x01, // COLLECTION (Application)
0x16, 0x00, 0xFE, // LOGICAL_MINIMUM (-512)
0x26, 0xFF, 0x01, // LOGICAL_MAXIMUM (511)
0x75, 0x0A, // REPORT_SIZE (10)
0x95, 0x05, // REPORT_COUNT (5)
0x85, 0x01, // REPORT_ID (1) // 5 axes
0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x09, 0x32, // USAGE (Z)
0x09, 0x36, // USAGE (Slider)
0x09, 0x37, // USAGE (Dial)
0x81, 0x02, // INPUT (Data, Var, Abs)
// Padding to 8-bit boundary
0xA4, // PUSH
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x06, // REPORT_SIZE (6)
0x81, 0x01, // INPUT (Constant)
0xB4, // POP
0x85, 0x02, // REPORT_ID (2) // 5 axes
0x05, 0x02, // USAGE_PAGE (Simulation Controls)
0x09, 0xB0, // USAGE (Aileron)
0x09, 0xB8, // USAGE (Elevator)
0x09, 0xBA, // USAGE (Rudder)
0x09, 0xBB, // USAGE (Throttle)
0x09, 0xC3, // USAGE (Wing flaps)
0x81, 0x02, // INPUT (Data, Var, Abs)
// Padding to 8-bit boundary
// 0xA4, // PUSH
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x06, // REPORT_SIZE (6)
0x81, 0x01, // INPUT (Constant)
// 0xB4, // POP
0x85, 0x03, // REPORT_ID (3) // 72 buttons
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 72, // USAGE_MAXIMUM (Button 72)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 72, // REPORT_COUNT (72)
// 0x55, 0x00, // UNIT_EXPONENT (0)
// 0x65, 0x00, // UNIT (None)
0x81, 0x02, // INPUT (Data, Var, Abs)
0xC0, // END COLLECTION
};
В цикле отсылаю данные:
CODE
for(;;)
{ /* main event loop */
wdt_reset();
usbPoll();
if(usbConfiguration && usbInterruptIsReady())
{
// called after every poll of the interrupt endpoint
Axes[0].Report.Axe1_lo = ++Report_counter;
usbSetInterrupt(Axes[0].get_report(), Axes[0].get_report_size());
}
}
Однако SnoopyPro показывает, что в комп поступает только каждый второй пакет. Куда копать? И еще непонятка с нумерацией пакетов - (если я правильно понял) почему-то устройство отвечает с предыдущим sequence number:
Прерывания кроме v-usb не используются, задержаться программе негде, кварц 12МГц, главный цикл выполняется 35мс, USB_CFG_INTR_POLL_INTERVAL указал 100 мс. Собственно что делать и какая еще информация нужна от меня для лечения?