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;
case 0x0921: // HID SET_REPORT
#ifdef UART_DEBUG
warn_msg("SET_REPORT - ");
printHex( setup.wValue );
print(" - ");
printHex( 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 );
#endif
USBKeys_LEDs = setup.wValue & 0xFF;
// Must be stall for some reason... -HaaTa
endpoint0_stall();
break;
}
return;
case 0x01A1: // HID GET_REPORT
@ -612,6 +618,10 @@ static void usb_control( uint32_t stat )
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 @@ static void usb_control( uint32_t stat )
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 @@ static void usb_control( uint32_t stat )
endpoint0_transmit( NULL, 0 );
}
// Keyboard SET_REPORT
if ( setup.wRequestAndType == 0x921 && setup.wValue & 0x200 )
{
// Interface
switch ( setup.wIndex & 0xFF )
{
// Keyboard Interface
if ( setup.word1 == 0x02000921 && setup.word2 == ( (1<<16) | KEYBOARD_INTERFACE ) )
{
case KEYBOARD_INTERFACE:
USBKeys_LEDs = buf[0];
endpoint0_transmit( NULL, 0 );
}
break;
// NKRO Keyboard Interface
if ( setup.word1 == 0x02000921 && setup.word2 == ( (1<<16) | NKRO_KEYBOARD_INTERFACE ) )
{
USBKeys_LEDs = buf[0];
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