Archived
1
0

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
This commit is contained in:
Jacob Alexander 2015-10-09 18:18:07 -07:00
parent d7fabf97e9
commit f4da2560c4

View File

@ -424,17 +424,23 @@ static void usb_setup()
return; return;
case 0x0921: // HID SET_REPORT case 0x0921: // HID SET_REPORT
#ifdef UART_DEBUG // Interface
warn_msg("SET_REPORT - "); switch ( setup.wIndex & 0xFF )
printHex( setup.wValue ); {
print(" - "); // Keyboard Interface
printHex( setup.wValue & 0xFF ); case KEYBOARD_INTERFACE:
print( NL ); break;
#endif // NKRO Keyboard Interface
USBKeys_LEDs = setup.wValue & 0xFF; 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; return;
case 0x01A1: // HID GET_REPORT case 0x01A1: // HID GET_REPORT
@ -612,6 +618,10 @@ static void usb_control( uint32_t stat )
printHex(setup.wIndex); printHex(setup.wIndex);
print(", len:"); print(", len:");
printHex(setup.wLength); printHex(setup.wLength);
print(" -- ");
printHex32(setup.word1);
print(" ");
printHex32(setup.word2);
print(NL); print(NL);
#endif #endif
// actually "do" the setup request // actually "do" the setup request
@ -622,9 +632,22 @@ static void usb_control( uint32_t stat )
case 0x01: // OUT transaction received from host case 0x01: // OUT transaction received from host
case 0x02: case 0x02:
#ifdef UART_DEBUG #ifdef UART_DEBUG_UNKNOWN
print("PID=OUT"NL); 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 #endif
// CDC Interface // CDC Interface
if ( setup.wRequestAndType == 0x2021 /*CDC_SET_LINE_CODING*/ ) if ( setup.wRequestAndType == 0x2021 /*CDC_SET_LINE_CODING*/ )
{ {
@ -643,17 +666,38 @@ static void usb_control( uint32_t stat )
endpoint0_transmit( NULL, 0 ); endpoint0_transmit( NULL, 0 );
} }
// Keyboard Interface // Keyboard SET_REPORT
if ( setup.word1 == 0x02000921 && setup.word2 == ( (1<<16) | KEYBOARD_INTERFACE ) ) if ( setup.wRequestAndType == 0x921 && setup.wValue & 0x200 )
{ {
USBKeys_LEDs = buf[0]; // Interface
endpoint0_transmit( NULL, 0 ); switch ( setup.wIndex & 0xFF )
} {
// NKRO Keyboard Interface // Keyboard Interface
if ( setup.word1 == 0x02000921 && setup.word2 == ( (1<<16) | NKRO_KEYBOARD_INTERFACE ) ) case KEYBOARD_INTERFACE:
{ USBKeys_LEDs = buf[0];
USBKeys_LEDs = buf[0]; endpoint0_transmit( NULL, 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 // give the buffer back