Jump to content

    
Sign in to follow this  
Сергей Борщ

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

Recommended Posts

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

__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 мс. Собственно что делать и какая еще информация нужна от меня для лечения?

Share this post


Link to post
Share on other sites

Разобрался.

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this