Перейти к содержанию
    

v-usb (Virtual USB por for AVR) кто-нибудь ковырял?

Разобрался с дескриптором репорта, устройство определяется.

__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
};

В цикле отсылаю данные:

    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:

post-17095-1308053317_thumb.png

 

Прерывания кроме v-usb не используются, задержаться программе негде, кварц 12МГц, главный цикл выполняется 35мс, USB_CFG_INTR_POLL_INTERVAL указал 100 мс. Собственно что делать и какая еще информация нужна от меня для лечения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разобрался.

Умножал 7 на 8, получил 72 :cranky: , что и вписал в дескриптор. Естественно, столько бит в одну 8-байтовую посылку не влезает, и простое наличие такой записи в дескрипторе сводило винду с ума (этот пакет я даже не пытался передавать).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...