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:
parent
d7fabf97e9
commit
f4da2560c4
@ -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
|
||||||
|
Reference in New Issue
Block a user