|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418 |
- /* USB EHCI Host for Teensy 3.6
- Copyright 2017 Paul Stoffregen (paul@pjrc.com)
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, shiublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
-
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
- #include "HidDumper.h"
- bool HIDDumpController::show_raw_data = true;
- bool HIDDumpController::show_formated_data = true;
- bool HIDDumpController::changed_data_only = false;
-
- void HIDDumpController::init()
- {
- USBHost::contribute_Transfers(mytransfers, sizeof(mytransfers) / sizeof(Transfer_t));
- USBHIDParser::driver_ready_for_hid_collection(this);
- }
-
- hidclaim_t HIDDumpController::claim_collection(USBHIDParser *driver, Device_t *dev, uint32_t topusage)
- {
- // only claim RAWHID devices currently: 16c0:0486
- Serial.printf("HIDDumpController Claim: %x:%x usage: %x", dev->idVendor, dev->idProduct, topusage);
- if (mydevice != NULL && dev != mydevice) {
- Serial.println("- NO (Device)");
- return CLAIM_NO;
- }
- if (usage_ && (usage_ != topusage)) {
- Serial.printf(" - NO (Usage: %x)\n");
- return CLAIM_NO; // Only claim one
- }
- mydevice = dev;
- collections_claimed++;
- usage_ = topusage;
- driver_ = driver; // remember the driver.
- Serial.println(" - Yes");
- return CLAIM_INTERFACE; // We want
- }
-
- void HIDDumpController::disconnect_collection(Device_t *dev)
- {
- if (--collections_claimed == 0) {
- mydevice = NULL;
- usage_ = 0;
- }
- }
-
- void dump_hexbytes(const void *ptr, uint32_t len)
- {
- if (ptr == NULL || len == 0) return;
- uint32_t count = 0;
- // if (len > 64) len = 64; // don't go off deep end...
- const uint8_t *p = (const uint8_t *)ptr;
- while (len--) {
- if (*p < 16) Serial.print('0');
- Serial.print(*p++, HEX);
- count++;
- if (((count & 0x1f) == 0) && len) Serial.print("\n");
- else Serial.print(' ');
- }
- Serial.println();
- }
-
- bool HIDDumpController::hid_process_in_data(const Transfer_t *transfer)
- {
- // return true if we are not showing formated data...
- hid_input_begin_level_ = 0; // always make sure we reset to 0
- count_usages_ = index_usages_; // remember how many we output for this one
- index_usages_ = 0; // reset the index back to zero
-
- Serial.printf("HID(%x)", usage_);
- if (show_raw_data) {
- Serial.print(": ");
- dump_hexbytes(transfer->buffer, transfer->length);
- }
- else Serial.println();
-
- return !show_formated_data;
- }
-
- bool HIDDumpController::hid_process_out_data(const Transfer_t *transfer)
- {
- Serial.printf("HIDDumpController::hid_process_out_data: %x\n", usage_);
- return true;
- }
-
- void indent_level(int level) {
- if ((level > 5) || (level < 0)) return; // bail if something is off...
- while (level--) Serial.print(" ");
- }
-
- void HIDDumpController::hid_input_begin(uint32_t topusage, uint32_t type, int lgmin, int lgmax)
- {
- // Lets do simplified data for changed only
- if (changed_data_only) return;
-
- indent_level(hid_input_begin_level_);
- Serial.printf("Begin topusage:%x type:%x min:%d max:%d\n", topusage, type, lgmin, lgmax);
- if (hid_input_begin_level_ < 2)
- hid_input_begin_level_++;
- }
-
- void HIDDumpController::hid_input_data(uint32_t usage, int32_t value)
- {
-
- bool output_data = !changed_data_only;
-
- // See if something changed.
- if (index_usages_ < count_usages_) {
- if ((usage != usages_[index_usages_]) || (value != values_[index_usages_])) {
- output_data = true;
- }
- } else {
- output_data = true;
- }
- if (index_usages_ < MAX_CHANGE_TRACKED) {
- usages_[index_usages_] = usage;
- values_[index_usages_] = value;
- index_usages_++;
- }
-
- if (output_data) {
- indent_level(hid_input_begin_level_);
- Serial.printf("usage=%X, value=%d", usage, value);
- if ((value >= ' ') && (value <= '~')) Serial.printf(":%c", value);
-
- // maybe print out some information about some of the Usage numbers that we know about
- // The information comes from the USB document, HID Usage Tables
- // https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf
-
- uint16_t usage_page = usage >> 16;
- usage = usage & 0xffff; // keep the lower part
- switch (usage_page) {
- case 1: // Generic Desktop control:
- switch (usage) {
- case 0x30: Serial.print("(X)"); break;
- case 0x31: Serial.print("(Y)"); break;
- case 0x32: Serial.print("(Z)"); break;
- case 0x33: Serial.print("(Rx)"); break;
- case 0x34: Serial.print("(Ry)"); break;
- case 0x35: Serial.print("(Rz)"); break;
- case 0x36: Serial.print("(Slider)"); break;
- case 0x37: Serial.print("(Dial)"); break;
- case 0x38: Serial.print("(Wheel)"); break;
- case 0x39: Serial.print("(Hat)"); break;
- case 0x3D: Serial.print("(Start)"); break;
- case 0x3E: Serial.print("(Select)"); break;
- case 0x40: Serial.print("(Vx)"); break;
- case 0x41: Serial.print("(Vy)"); break;
- case 0x42: Serial.print("(Vz)"); break;
- case 0x43: Serial.print("(Vbrx)"); break;
- case 0x44: Serial.print("(Vbry)"); break;
- case 0x45: Serial.print("(Vbrz)"); break;
- case 0x46: Serial.print("(Vno)"); break;
- case 0x90: Serial.print("(D-Up)"); break;
- case 0x91: Serial.print("(D-Dn)"); break;
- case 0x92: Serial.print("(D-Right)"); break;
- case 0x93: Serial.print("(D-Left)"); break;
- default:
- break;
- }
- break;
- case 9: // Button
- Serial.printf(" (BUTTON %d)", usage);
- break;
- case 0xC: // Consummer page
- switch (usage) {
- case 0x20 : Serial.print("(+10)"); break;
- case 0x21 : Serial.print("(+100)"); break;
- case 0x22 : Serial.print("(AM/PM)"); break;
- case 0x30 : Serial.print("(Power)"); break;
- case 0x31 : Serial.print("(Reset)"); break;
- case 0x32 : Serial.print("(Sleep)"); break;
- case 0x33 : Serial.print("(Sleep After)"); break;
- case 0x34 : Serial.print("(Sleep Mode)"); break;
- case 0x35 : Serial.print("(Illumination)"); break;
- case 0x36 : Serial.print("(Function Buttons)"); break;
- case 0x40 : Serial.print("(Menu)"); break;
- case 0x41 : Serial.print("(Menu Pick)"); break;
- case 0x42 : Serial.print("(Menu Up)"); break;
- case 0x43 : Serial.print("(Menu Down)"); break;
- case 0x44 : Serial.print("(Menu Left)"); break;
- case 0x45 : Serial.print("(Menu Right)"); break;
- case 0x46 : Serial.print("(Menu Escape)"); break;
- case 0x47 : Serial.print("(Menu Value Increase)"); break;
- case 0x48 : Serial.print("(Menu Value Decrease)"); break;
- case 0x60 : Serial.print("(Data On Screen)"); break;
- case 0x61 : Serial.print("(Closed Caption)"); break;
- case 0x62 : Serial.print("(Closed Caption Select)"); break;
- case 0x63 : Serial.print("(VCR/TV)"); break;
- case 0x64 : Serial.print("(Broadcast Mode)"); break;
- case 0x65 : Serial.print("(Snapshot)"); break;
- case 0x66 : Serial.print("(Still)"); break;
- case 0x80 : Serial.print("(Selection)"); break;
- case 0x81 : Serial.print("(Assign Selection)"); break;
- case 0x82 : Serial.print("(Mode Step)"); break;
- case 0x83 : Serial.print("(Recall Last)"); break;
- case 0x84 : Serial.print("(Enter Channel)"); break;
- case 0x85 : Serial.print("(Order Movie)"); break;
- case 0x86 : Serial.print("(Channel)"); break;
- case 0x87 : Serial.print("(Media Selection)"); break;
- case 0x88 : Serial.print("(Media Select Computer)"); break;
- case 0x89 : Serial.print("(Media Select TV)"); break;
- case 0x8A : Serial.print("(Media Select WWW)"); break;
- case 0x8B : Serial.print("(Media Select DVD)"); break;
- case 0x8C : Serial.print("(Media Select Telephone)"); break;
- case 0x8D : Serial.print("(Media Select Program Guide)"); break;
- case 0x8E : Serial.print("(Media Select Video Phone)"); break;
- case 0x8F : Serial.print("(Media Select Games)"); break;
- case 0x90 : Serial.print("(Media Select Messages)"); break;
- case 0x91 : Serial.print("(Media Select CD)"); break;
- case 0x92 : Serial.print("(Media Select VCR)"); break;
- case 0x93 : Serial.print("(Media Select Tuner)"); break;
- case 0x94 : Serial.print("(Quit)"); break;
- case 0x95 : Serial.print("(Help)"); break;
- case 0x96 : Serial.print("(Media Select Tape)"); break;
- case 0x97 : Serial.print("(Media Select Cable)"); break;
- case 0x98 : Serial.print("(Media Select Satellite)"); break;
- case 0x99 : Serial.print("(Media Select Security)"); break;
- case 0x9A : Serial.print("(Media Select Home)"); break;
- case 0x9B : Serial.print("(Media Select Call)"); break;
- case 0x9C : Serial.print("(Channel Increment)"); break;
- case 0x9D : Serial.print("(Channel Decrement)"); break;
- case 0x9E : Serial.print("(Media Select SAP)"); break;
- case 0xA0 : Serial.print("(VCR Plus)"); break;
- case 0xA1 : Serial.print("(Once)"); break;
- case 0xA2 : Serial.print("(Daily)"); break;
- case 0xA3 : Serial.print("(Weekly)"); break;
- case 0xA4 : Serial.print("(Monthly)"); break;
- case 0xB0 : Serial.print("(Play)"); break;
- case 0xB1 : Serial.print("(Pause)"); break;
- case 0xB2 : Serial.print("(Record)"); break;
- case 0xB3 : Serial.print("(Fast Forward)"); break;
- case 0xB4 : Serial.print("(Rewind)"); break;
- case 0xB5 : Serial.print("(Scan Next Track)"); break;
- case 0xB6 : Serial.print("(Scan Previous Track)"); break;
- case 0xB7 : Serial.print("(Stop)"); break;
- case 0xB8 : Serial.print("(Eject)"); break;
- case 0xB9 : Serial.print("(Random Play)"); break;
- case 0xBA : Serial.print("(Select DisC)"); break;
- case 0xBB : Serial.print("(Enter Disc)"); break;
- case 0xBC : Serial.print("(Repeat)"); break;
- case 0xBD : Serial.print("(Tracking)"); break;
- case 0xBE : Serial.print("(Track Normal)"); break;
- case 0xBF : Serial.print("(Slow Tracking)"); break;
- case 0xC0 : Serial.print("(Frame Forward)"); break;
- case 0xC1 : Serial.print("(Frame Back)"); break;
- case 0xC2 : Serial.print("(Mark)"); break;
- case 0xC3 : Serial.print("(Clear Mark)"); break;
- case 0xC4 : Serial.print("(Repeat From Mark)"); break;
- case 0xC5 : Serial.print("(Return To Mark)"); break;
- case 0xC6 : Serial.print("(Search Mark Forward)"); break;
- case 0xC7 : Serial.print("(Search Mark Backwards)"); break;
- case 0xC8 : Serial.print("(Counter Reset)"); break;
- case 0xC9 : Serial.print("(Show Counter)"); break;
- case 0xCA : Serial.print("(Tracking Increment)"); break;
- case 0xCB : Serial.print("(Tracking Decrement)"); break;
- case 0xCD : Serial.print("(Pause/Continue)"); break;
- case 0xE0 : Serial.print("(Volume)"); break;
- case 0xE1 : Serial.print("(Balance)"); break;
- case 0xE2 : Serial.print("(Mute)"); break;
- case 0xE3 : Serial.print("(Bass)"); break;
- case 0xE4 : Serial.print("(Treble)"); break;
- case 0xE5 : Serial.print("(Bass Boost)"); break;
- case 0xE6 : Serial.print("(Surround Mode)"); break;
- case 0xE7 : Serial.print("(Loudness)"); break;
- case 0xE8 : Serial.print("(MPX)"); break;
- case 0xE9 : Serial.print("(Volume Up)"); break;
- case 0xEA : Serial.print("(Volume Down)"); break;
- case 0xF0 : Serial.print("(Speed Select)"); break;
- case 0xF1 : Serial.print("(Playback Speed)"); break;
- case 0xF2 : Serial.print("(Standard Play)"); break;
- case 0xF3 : Serial.print("(Long Play)"); break;
- case 0xF4 : Serial.print("(Extended Play)"); break;
- case 0xF5 : Serial.print("(Slow)"); break;
- case 0x100: Serial.print("(Fan Enable)"); break;
- case 0x101: Serial.print("(Fan Speed)"); break;
- case 0x102: Serial.print("(Light)"); break;
- case 0x103: Serial.print("(Light Illumination Level)"); break;
- case 0x104: Serial.print("(Climate Control Enable)"); break;
- case 0x105: Serial.print("(Room Temperature)"); break;
- case 0x106: Serial.print("(Security Enable)"); break;
- case 0x107: Serial.print("(Fire Alarm)"); break;
- case 0x108: Serial.print("(Police Alarm)"); break;
- case 0x150: Serial.print("(Balance Right)"); break;
- case 0x151: Serial.print("(Balance Left)"); break;
- case 0x152: Serial.print("(Bass Increment)"); break;
- case 0x153: Serial.print("(Bass Decrement)"); break;
- case 0x154: Serial.print("(Treble Increment)"); break;
- case 0x155: Serial.print("(Treble Decrement)"); break;
- case 0x160: Serial.print("(Speaker System)"); break;
- case 0x161: Serial.print("(Channel Left)"); break;
- case 0x162: Serial.print("(Channel Right)"); break;
- case 0x163: Serial.print("(Channel Center)"); break;
- case 0x164: Serial.print("(Channel Front)"); break;
- case 0x165: Serial.print("(Channel Center Front)"); break;
- case 0x166: Serial.print("(Channel Side)"); break;
- case 0x167: Serial.print("(Channel Surround)"); break;
- case 0x168: Serial.print("(Channel Low Frequency Enhancement)"); break;
- case 0x169: Serial.print("(Channel Top)"); break;
- case 0x16A: Serial.print("(Channel Unknown)"); break;
- case 0x170: Serial.print("(Sub-channel)"); break;
- case 0x171: Serial.print("(Sub-channel Increment)"); break;
- case 0x172: Serial.print("(Sub-channel Decrement)"); break;
- case 0x173: Serial.print("(Alternate Audio Increment)"); break;
- case 0x174: Serial.print("(Alternate Audio Decrement)"); break;
- case 0x180: Serial.print("(Application Launch Buttons)"); break;
- case 0x181: Serial.print("(AL Launch Button Configuration Tool)"); break;
- case 0x182: Serial.print("(AL Programmable Button Configuration)"); break;
- case 0x183: Serial.print("(AL Consumer Control Configuration)"); break;
- case 0x184: Serial.print("(AL Word Processor)"); break;
- case 0x185: Serial.print("(AL Text Editor)"); break;
- case 0x186: Serial.print("(AL Spreadsheet)"); break;
- case 0x187: Serial.print("(AL Graphics Editor)"); break;
- case 0x188: Serial.print("(AL Presentation App)"); break;
- case 0x189: Serial.print("(AL Database App)"); break;
- case 0x18A: Serial.print("(AL Email Reader)"); break;
- case 0x18B: Serial.print("(AL Newsreader)"); break;
- case 0x18C: Serial.print("(AL Voicemail)"); break;
- case 0x18D: Serial.print("(AL Contacts/Address Book)"); break;
- case 0x18E: Serial.print("(AL Calendar/Schedule)"); break;
- case 0x18F: Serial.print("(AL Task/Project Manager)"); break;
- case 0x190: Serial.print("(AL Log/Journal/Timecard)"); break;
- case 0x191: Serial.print("(AL Checkbook/Finance)"); break;
- case 0x192: Serial.print("(AL Calculator)"); break;
- case 0x193: Serial.print("(AL A/V Capture/Playback)"); break;
- case 0x194: Serial.print("(AL Local Machine Browser)"); break;
- case 0x195: Serial.print("(AL LAN/WAN Browser)"); break;
- case 0x196: Serial.print("(AL Internet Browser)"); break;
- case 0x197: Serial.print("(AL Remote Networking/ISP Connect)"); break;
- case 0x198: Serial.print("(AL Network Conference)"); break;
- case 0x199: Serial.print("(AL Network Chat)"); break;
- case 0x19A: Serial.print("(AL Telephony/Dialer)"); break;
- case 0x19B: Serial.print("(AL Logon)"); break;
- case 0x19C: Serial.print("(AL Logoff)"); break;
- case 0x19D: Serial.print("(AL Logon/Logoff)"); break;
- case 0x19E: Serial.print("(AL Terminal Lock/Screensaver)"); break;
- case 0x19F: Serial.print("(AL Control Panel)"); break;
- case 0x1A0: Serial.print("(AL Command Line Processor/Run)"); break;
- case 0x1A1: Serial.print("(AL Process/Task Manager)"); break;
- case 0x1A2: Serial.print("(AL Select Tast/Application)"); break;
- case 0x1A3: Serial.print("(AL Next Task/Application)"); break;
- case 0x1A4: Serial.print("(AL Previous Task/Application)"); break;
- case 0x1A5: Serial.print("(AL Preemptive Halt Task/Application)"); break;
- case 0x200: Serial.print("(Generic GUI Application Controls)"); break;
- case 0x201: Serial.print("(AC New)"); break;
- case 0x202: Serial.print("(AC Open)"); break;
- case 0x203: Serial.print("(AC Close)"); break;
- case 0x204: Serial.print("(AC Exit)"); break;
- case 0x205: Serial.print("(AC Maximize)"); break;
- case 0x206: Serial.print("(AC Minimize)"); break;
- case 0x207: Serial.print("(AC Save)"); break;
- case 0x208: Serial.print("(AC Print)"); break;
- case 0x209: Serial.print("(AC Properties)"); break;
- case 0x21A: Serial.print("(AC Undo)"); break;
- case 0x21B: Serial.print("(AC Copy)"); break;
- case 0x21C: Serial.print("(AC Cut)"); break;
- case 0x21D: Serial.print("(AC Paste)"); break;
- case 0x21E: Serial.print("(AC Select All)"); break;
- case 0x21F: Serial.print("(AC Find)"); break;
- case 0x220: Serial.print("(AC Find and Replace)"); break;
- case 0x221: Serial.print("(AC Search)"); break;
- case 0x222: Serial.print("(AC Go To)"); break;
- case 0x223: Serial.print("(AC Home)"); break;
- case 0x224: Serial.print("(AC Back)"); break;
- case 0x225: Serial.print("(AC Forward)"); break;
- case 0x226: Serial.print("(AC Stop)"); break;
- case 0x227: Serial.print("(AC Refresh)"); break;
- case 0x228: Serial.print("(AC Previous Link)"); break;
- case 0x229: Serial.print("(AC Next Link)"); break;
- case 0x22A: Serial.print("(AC Bookmarks)"); break;
- case 0x22B: Serial.print("(AC History)"); break;
- case 0x22C: Serial.print("(AC Subscriptions)"); break;
- case 0x22D: Serial.print("(AC Zoom In)"); break;
- case 0x22E: Serial.print("(AC Zoom Out)"); break;
- case 0x22F: Serial.print("(AC Zoom)"); break;
- case 0x230: Serial.print("(AC Full Screen View)"); break;
- case 0x231: Serial.print("(AC Normal View)"); break;
- case 0x232: Serial.print("(AC View Toggle)"); break;
- case 0x233: Serial.print("(AC Scroll Up)"); break;
- case 0x234: Serial.print("(AC Scroll Down)"); break;
- case 0x235: Serial.print("(AC Scroll)"); break;
- case 0x236: Serial.print("(AC Pan Left)"); break;
- case 0x237: Serial.print("(AC Pan Right)"); break;
- case 0x238: Serial.print("(AC Pan)"); break;
- case 0x239: Serial.print("(AC New Window)"); break;
- case 0x23A: Serial.print("(AC Tile Horizontally)"); break;
- case 0x23B: Serial.print("(AC Tile Vertically)"); break;
- case 0x23C: Serial.print("(AC Format)"); break;
- }
- break;
- }
- Serial.println();
- }
- }
-
- void HIDDumpController::hid_input_end()
- {
- // Lets do simplified data for changed only
- if (changed_data_only) return;
- hid_input_begin_level_--;
- indent_level(hid_input_begin_level_);
- Serial.println("END:");
- }
|