# HG changeset patch # User Jacob Alexander # Date 1444439887 25200 # Node ID 801e7628d9774c47118a83bf9d2c3fb1a28073a2 # Parent 2268093deff40396ef51ab6066944f796eff59e9 Fixing long-standing SET_REPORT bug - Implementation was completely wrong (has never worked properly) - Now working in both NKRO and 6KRO modes - Added more debugging code if things go wrong again diff -r 2268093deff4 -r 801e7628d977 Output/pjrcUSB/arm/usb_dev.c --- a/Output/pjrcUSB/arm/usb_dev.c Wed Oct 07 20:06:41 2015 -0700 +++ b/Output/pjrcUSB/arm/usb_dev.c Fri Oct 09 18:18:07 2015 -0700 @@ -424,17 +424,23 @@ return; case 0x0921: // HID SET_REPORT - #ifdef UART_DEBUG - warn_msg("SET_REPORT - "); - printHex( setup.wValue ); - print(" - "); - printHex( setup.wValue & 0xFF ); - print( NL ); - #endif - USBKeys_LEDs = setup.wValue & 0xFF; + // Interface + switch ( setup.wIndex & 0xFF ) + { + // Keyboard Interface + case KEYBOARD_INTERFACE: + break; + // NKRO Keyboard Interface + case NKRO_KEYBOARD_INTERFACE: + break; + default: + warn_msg("Unknown interface - "); + printHex( setup.wIndex ); + print( NL ); + endpoint0_stall(); + break; + } - // Must be stall for some reason... -HaaTa - endpoint0_stall(); return; case 0x01A1: // HID GET_REPORT @@ -612,6 +618,10 @@ printHex(setup.wIndex); print(", len:"); printHex(setup.wLength); + print(" -- "); + printHex32(setup.word1); + print(" "); + printHex32(setup.word2); print(NL); #endif // actually "do" the setup request @@ -622,9 +632,22 @@ case 0x01: // OUT transaction received from host case 0x02: - #ifdef UART_DEBUG - print("PID=OUT"NL); + #ifdef UART_DEBUG_UNKNOWN + print("PID=OUT wRequestAndType:"); + printHex(setup.wRequestAndType); + print(", wValue:"); + printHex(setup.wValue); + print(", wIndex:"); + printHex(setup.wIndex); + print(", len:"); + printHex(setup.wLength); + print(" -- "); + printHex32(setup.word1); + print(" "); + printHex32(setup.word2); + print(NL); #endif + // CDC Interface if ( setup.wRequestAndType == 0x2021 /*CDC_SET_LINE_CODING*/ ) { @@ -643,17 +666,38 @@ endpoint0_transmit( NULL, 0 ); } - // Keyboard Interface - if ( setup.word1 == 0x02000921 && setup.word2 == ( (1<<16) | KEYBOARD_INTERFACE ) ) + // Keyboard SET_REPORT + if ( setup.wRequestAndType == 0x921 && setup.wValue & 0x200 ) { - USBKeys_LEDs = buf[0]; - endpoint0_transmit( NULL, 0 ); - } - // NKRO Keyboard Interface - if ( setup.word1 == 0x02000921 && setup.word2 == ( (1<<16) | NKRO_KEYBOARD_INTERFACE ) ) - { - USBKeys_LEDs = buf[0]; - endpoint0_transmit( NULL, 0 ); + // Interface + switch ( setup.wIndex & 0xFF ) + { + // Keyboard Interface + case KEYBOARD_INTERFACE: + USBKeys_LEDs = buf[0]; + endpoint0_transmit( NULL, 0 ); + break; + // NKRO Keyboard Interface + case NKRO_KEYBOARD_INTERFACE: + // Only use 2nd byte, first byte is the report id + USBKeys_LEDs = buf[1]; + endpoint0_transmit( NULL, 0 ); + break; + default: + warn_msg("Unknown interface - "); + printHex( setup.wIndex ); + print( NL ); + break; + } + + #ifdef UART_DEBUG + for ( size_t len = 0; len < setup.wLength; len++ ) + { + printHex( buf[ len ] ); + print(" "); + } + print( NL ); + #endif } // give the buffer back