Преглед на файлове

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 години
родител
ревизия
f4da2560c4
променени са 1 файла, в които са добавени 66 реда и са изтрити 22 реда
  1. 66
    22
      Output/pjrcUSB/arm/usb_dev.c

+ 66
- 22
Output/pjrcUSB/arm/usb_dev.c Целия файл

return; return;


case 0x0921: // HID SET_REPORT 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; return;


case 0x01A1: // HID GET_REPORT case 0x01A1: // HID GET_REPORT
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


case 0x01: // OUT transaction received from host case 0x01: // OUT transaction received from host
case 0x02: 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 #endif

// CDC Interface // CDC Interface
if ( setup.wRequestAndType == 0x2021 /*CDC_SET_LINE_CODING*/ ) if ( setup.wRequestAndType == 0x2021 /*CDC_SET_LINE_CODING*/ )
{ {
endpoint0_transmit( NULL, 0 ); 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 // give the buffer back