From f1802bbc7a20d5f8f2912b999514e481830bc06b Mon Sep 17 00:00:00 2001 From: Oleg Mazurov Date: Tue, 14 Jun 2011 23:05:10 -0600 Subject: [PATCH] hid --- hid.cpp | 174 ++++++++++++++++++++++++++++++++++------------------- hid.h | 34 ++++++----- max3421e.h | 4 +- 3 files changed, 135 insertions(+), 77 deletions(-) diff --git a/hid.cpp b/hid.cpp index 4ebfd182..628c0bea 100644 --- a/hid.cpp +++ b/hid.cpp @@ -256,9 +256,15 @@ void HID::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto uint8_t index; if ((pep->bmAttributes & 0x03) == 3 && (pep->bEndpointAddress & 0x80) == 0x80) + { + USBTRACE("I8\r\n"); index = epInterruptInIndex; + } else + { + USBTRACE("I0\r\n"); index = epInterruptOutIndex; + } // Fill in the endpoint info structure epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F); @@ -289,15 +295,29 @@ uint8_t HID::Poll() { uint8_t rcode = 0; - //if (!bPollEnable) - // return 0; + if (!bPollEnable) + return 0; - //if (qNextPollTime <= millis()) - //{ - // Serial.println(bAddress, HEX); + if (qNextPollTime <= millis()) + { + qNextPollTime = millis() + 100; - // qNextPollTime = millis() + 100; - //} + const uint8_t const_buff_len = 16; + uint8_t buf[const_buff_len]; + + HexDumper Hex; + uint16_t read = (uint16_t)const_buff_len; + + uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[epInterruptInIndex].epAddr, &read, buf); + + if (rcode && rcode != hrNAK) + { + USBTRACE2("Poll:", rcode); + return rcode; + } + for (uint8_t i=0; i(buf[i]); + } return rcode; } @@ -313,7 +333,7 @@ uint8_t HID::getReportDescr( uint8_t ep, USBReadParser *parser ) // HID_DESCRIPTOR_REPORT, 0x0000, constBufLen, constBufLen, buf, NULL )); uint8_t rcode = pUsb->ctrlReq( bAddress, ep, /*bmREQ_HIDREPORT*/0x81, USB_REQUEST_GET_DESCRIPTOR, 0x00, - HID_DESCRIPTOR_REPORT, 0x0000, constBufLen, constBufLen, buf, (USBReadParser*)parser ); + HID_DESCRIPTOR_REPORT, 0x0000, 0x142, constBufLen, buf, (USBReadParser*)parser ); //return ((rcode != hrSTALL) ? rcode : 0); return rcode; @@ -347,42 +367,24 @@ uint8_t HID::getProto( uint8_t ep, uint8_t iface, uint8_t* dataptr ) return( pUsb->ctrlReq( bAddress, ep, bmREQ_HIDIN, HID_REQUEST_GET_PROTOCOL, 0x00, 0x00, iface, 0x0001, 0x0001, dataptr, NULL )); } -//ReportDescParser::UsagePageFunc usagePageFunctions[] /*PROGMEM*/ = -//{ -// ReportDescParser::PrintGenericDesktopPageUsage, -// ReportDescParser::PrintSimulationControlsPageUsage, -// ReportDescParser::PrintVRControlsPageUsage, -// ReportDescParser::PrintSportsControlsPageUsage, -// ReportDescParser::PrintGameControlsPageUsage, -// ReportDescParser::PrintGenericDeviceControlsPageUsage, -// ReportDescParser::PrintLEDPageUsage, -// ReportDescParser::PrintTelephonyPageUsage, -// ReportDescParser::PrintConsumerPageUsage, -// ReportDescParser::PrintDigitizerPageUsage, -// ReportDescParser::PrintAlphanumDisplayPageUsage, -// ReportDescParser::PrintMedicalInstrumentPageUsage -//}; - void ReportDescParser::Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset) { uint16_t cntdn = (uint16_t)len; uint8_t *p = (uint8_t*)pbuf; - Serial.print("\r\nL:"); - Serial.println(len, HEX); - while(cntdn) { - //Serial.print("CDN:"); - //Serial.println(cntdn, HEX); + ParseItem(&p, &cntdn); - if (ParseItem(&p, &cntdn)) - return; + //if (ParseItem(&p, &cntdn)) + // return; } } uint8_t ReportDescParser::ParseItem(uint8_t **pp, uint16_t *pcntdn) { + uint8_t ret = enErrorSuccess; + switch (itemParseState) { case 0: @@ -404,7 +406,7 @@ uint8_t ReportDescParser::ParseItem(uint8_t **pp, uint16_t *pcntdn) //USBTRACE2("Sz1:", size); //Serial.print("\r\nSz:"); - //Serial.print(itemSize,DEC); + //Serial.println(itemSize,DEC); switch (itemPrefix & (TYPE_MASK | TAG_MASK)) { @@ -474,19 +476,32 @@ uint8_t ReportDescParser::ParseItem(uint8_t **pp, uint16_t *pcntdn) (*pcntdn) --; itemSize --; itemParseState = 1; - case 1: + if (!itemSize) break; if (!pcntdn) + return enErrorIncomplete; + case 1: + theBuffer.valueSize = itemSize; + valParser.Initialize(&theBuffer); + itemParseState = 2; + case 2: + if (!valParser.Parse(pp, pcntdn)) + return enErrorIncomplete; + itemParseState = 3; + case 3: { - if (itemSize) - return enErrorIncomplete; + uint8_t data = *((uint8_t*)varBuffer); - break; - } switch (itemPrefix & (TYPE_MASK | TAG_MASK)) { + case (TYPE_LOCAL | TAG_LOCAL_USAGE): + if (pfUsage) + if (theBuffer.valueSize > 1) + pfUsage(*((uint16_t*)varBuffer)); + else + pfUsage(data); case (TYPE_GLOBAL | TAG_GLOBAL_LOGICALMIN): case (TYPE_GLOBAL | TAG_GLOBAL_LOGICALMAX): case (TYPE_GLOBAL | TAG_GLOBAL_PHYSMIN): @@ -498,33 +513,26 @@ uint8_t ReportDescParser::ParseItem(uint8_t **pp, uint16_t *pcntdn) case (TYPE_LOCAL | TAG_LOCAL_USAGEMAX): case (TYPE_GLOBAL | TAG_GLOBAL_UNITEXP): case (TYPE_GLOBAL | TAG_GLOBAL_UNIT): - case (TYPE_LOCAL | TAG_LOCAL_USAGE): - //PrintGenericDesktopPageUsage((**pp)); - //PrintSimulationControlsPageUsage((**pp)); - //PrintVRControlsPageUsage((**pp)); - //PrintSportsControlsPageUsage((**pp)); - //PrintGameControlsPageUsage((**pp)); - //PrintGenericDeviceControlsPageUsage((**pp)); - //PrintLEDPageUsage((**pp)); - //PrintTelephonyPageUsage((**pp)); - //PrintConsumerPageUsage((**pp)); - //PrintDigitizerPageUsage((**pp)); - //PrintAlphanumDisplayPageUsage((**pp)); - //PrintMedicalInstrumentPageUsage((**pp)); Notify(PSTR("(")); - PrintHex((**pp)); + for (uint8_t i=0; i(data); Notify(PSTR(")")); break; - break; case (TYPE_GLOBAL | TAG_GLOBAL_PUSH): case (TYPE_GLOBAL | TAG_GLOBAL_POP): break; case (TYPE_GLOBAL | TAG_GLOBAL_USAGEPAGE): - PrintUsagePage((**pp)); + SetUsagePage(data); + PrintUsagePage(data); + + Notify(PSTR("(")); + for (uint8_t i=0; i(data); + Notify(PSTR(")")); break; case (TYPE_MAIN | TAG_MAIN_COLLECTION): case (TYPE_MAIN | TAG_MAIN_ENDCOLLECTION): - switch ((**pp)) + switch (data) { case 0x00: Notify(PSTR(" Physical")); @@ -549,7 +557,7 @@ uint8_t ReportDescParser::ParseItem(uint8_t **pp, uint16_t *pcntdn) break; default: Notify(PSTR(" Vendor Defined(")); - PrintHex((**pp)); + PrintHex(data); Notify(PSTR(")")); } break; @@ -557,15 +565,13 @@ uint8_t ReportDescParser::ParseItem(uint8_t **pp, uint16_t *pcntdn) case (TYPE_MAIN | TAG_MAIN_OUTPUT): case (TYPE_MAIN | TAG_MAIN_FEATURE): Notify(PSTR("(")); - PrintBin((**pp)); + PrintBin(data); Notify(PSTR(")")); break; } // switch (**pp & (TYPE_MASK | TAG_MASK)) - (*pp) ++; - (*pcntdn) --; - itemSize --; - itemParseState = 2; - case 2: + } + itemParseState = 4; + case 4: if (itemSize > 1 && !theSkipper.Skip(pp, pcntdn, itemSize)) return enErrorIncomplete; } // switch (itemParseState) @@ -601,6 +607,52 @@ const char *usagePageTitles1[] PROGMEM = pstrUsagePageArcade }; +ReportDescParser::UsagePageFunc ReportDescParser::usagePageFunctions[] /*PROGMEM*/ = +{ + &ReportDescParser::PrintGenericDesktopPageUsage, + &ReportDescParser::PrintSimulationControlsPageUsage, + &ReportDescParser::PrintVRControlsPageUsage, + &ReportDescParser::PrintSportsControlsPageUsage, + &ReportDescParser::PrintGameControlsPageUsage, + &ReportDescParser::PrintGenericDeviceControlsPageUsage, + NULL, // Keyboard/Keypad + &ReportDescParser::PrintLEDPageUsage, + NULL, // Button + NULL, // Ordinal + &ReportDescParser::PrintTelephonyPageUsage, + &ReportDescParser::PrintConsumerPageUsage, + &ReportDescParser::PrintDigitizerPageUsage, + NULL, // Reserved + NULL, // PID + NULL // Unicode +}; + +void ReportDescParser::SetUsagePage(uint16_t page) +{ + pfUsage = NULL; + + if (page > 0x00 && page < 0x11) + pfUsage = /*(UsagePageFunc)pgm_read_word*/(usagePageFunctions[page - 1]); + //else if (page > 0x7f && page < 0x84) + // Notify(pstrUsagePageMonitor); + //else if (page > 0x83 && page < 0x8c) + // Notify(pstrUsagePagePower); + //else if (page > 0x8b && page < 0x92) + // Notify((char*)pgm_read_word(&usagePageTitles1[page - 0x8c])); + //else if (page > 0xfeff && page <= 0xffff) + // Notify(pstrUsagePageVendorDefined); + else + switch (page) + { + case 0x14: + pfUsage = &ReportDescParser::PrintAlphanumDisplayPageUsage; + break; + case 0x40: + pfUsage = &ReportDescParser::PrintMedicalInstrumentPageUsage; + break; + } +} + void ReportDescParser::PrintUsagePage(uint16_t page) { Notify(pstrSpace); diff --git a/hid.h b/hid.h index 66dc3eea..c98fe001 100644 --- a/hid.h +++ b/hid.h @@ -151,8 +151,21 @@ class ReportDescParser : public USBReadParser public: typedef void (*UsagePageFunc)(uint16_t usage); + static void PrintGenericDesktopPageUsage(uint16_t usage); + static void PrintSimulationControlsPageUsage(uint16_t usage); + static void PrintVRControlsPageUsage(uint16_t usage); + static void PrintSportsControlsPageUsage(uint16_t usage); + static void PrintGameControlsPageUsage(uint16_t usage); + static void PrintGenericDeviceControlsPageUsage(uint16_t usage); + static void PrintLEDPageUsage(uint16_t usage); + static void PrintTelephonyPageUsage(uint16_t usage); + static void PrintConsumerPageUsage(uint16_t usage); + static void PrintDigitizerPageUsage(uint16_t usage); + static void PrintAlphanumDisplayPageUsage(uint16_t usage); + static void PrintMedicalInstrumentPageUsage(uint16_t usage); + private: - //static UsagePageFunc usagePageFunctions[]; + static UsagePageFunc usagePageFunctions[]; MultiValueBuffer theBuffer; MultiByteValueParser valParser; @@ -168,18 +181,7 @@ private: UsagePageFunc pfUsage; static void PrintUsagePage(uint16_t page); - static void PrintGenericDesktopPageUsage(uint16_t usage); - static void PrintSimulationControlsPageUsage(uint16_t usage); - static void PrintVRControlsPageUsage(uint16_t usage); - static void PrintSportsControlsPageUsage(uint16_t usage); - static void PrintGameControlsPageUsage(uint16_t usage); - static void PrintGenericDeviceControlsPageUsage(uint16_t usage); - static void PrintLEDPageUsage(uint16_t usage); - static void PrintTelephonyPageUsage(uint16_t usage); - static void PrintConsumerPageUsage(uint16_t usage); - static void PrintDigitizerPageUsage(uint16_t usage); - static void PrintAlphanumDisplayPageUsage(uint16_t usage); - static void PrintMedicalInstrumentPageUsage(uint16_t usage); + void SetUsagePage(uint16_t page); public: ReportDescParser() : @@ -187,7 +189,11 @@ public: itemSize(0), itemPrefix(0), pfUsage(NULL) - {}; + { + theBuffer.pValue = varBuffer; + valParser.Initialize(&theBuffer); + theSkipper.Initialize(&theBuffer); + }; virtual void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset); diff --git a/max3421e.h b/max3421e.h index e39a61f2..b4320886 100644 --- a/max3421e.h +++ b/max3421e.h @@ -9,8 +9,8 @@ /* pin numbers to port numbers */ //#define MAX_SS 10 -#define MAX_INT 3 // Black Widdow -//#define MAX_INT 9 // Duemielanove +//#define MAX_INT 3 // Black Widdow +#define MAX_INT 9 // Duemielanove #define MAX_GPX 8 //#define MAX_RESET 7