Browse Source

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
capsense
Jacob Alexander 8 years ago
parent
commit
f4da2560c4
1 changed files with 66 additions and 22 deletions
  1. 66
    22
      Output/pjrcUSB/arm/usb_dev.c

+ 66
- 22
Output/pjrcUSB/arm/usb_dev.c 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 );
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 @@ 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 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