changeset 383:801e7628d977

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
author Jacob Alexander <haata@kiibohd.com>
date Fri, 09 Oct 2015 18:18:07 -0700
parents 2268093deff4
children 82ce1988fefe
files Output/pjrcUSB/arm/usb_dev.c
diffstat 1 files changed, 66 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- 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