Mercurial > louis > kiibohd-controller
diff Output/usbMuxUart/output_com.c @ 449:45feb80a2ad1
Major USB update, fixes most (if not all) known issues
USB - General
- Refactored descriptors
- Enabled/Disable USB endpoints
- Added debug flags for special features
- Code cleanup
- Interface count calculation based off of enabled endpoints
- Delayed wTotalLength calculation to simplify descriptor offsets
- Re-ordered endpoints and interfaces
- Added more debug output
- Added usbInitTime to show how long keyboard initialization took
(Useful when debugging bad init sequences)
- Added function for usb_resume() which takes care of the resume sequence
* Resume is now only called if packets are starting to timeout
USB - Special Options
- Added enableDeviceRestartOnUSBTimeout
* A last resort hammer for bad USB Chipsets/OSs, don't use if you can help it
* Disabled
- Added enableUSBResume
* Enables host resume wake-up signalling, required to wake a computer from sleep
* Enabled
- Added enableUSBLowPowerNegotiation
* Enables power negotiation hack
* Required to use firmware with an IPad and other hard-limit low-power USB hosts
* Hasn't been tested with the recent changes
* Disabled
- Added enableUSBSuspend
* Enables power down events on host USB bus suspend
* Enabled
USB - Keyboard
- Attempted to cleanup HID SET_REPORT
* Works much better
* Still has an issue under Linux which generates *a lot* of NAKs (initializes quickly regardless)
+ Not present on other keyboards
+ SETUP -> OUT -> IN : This sequence is the problem
+ Specifically during the OUT phase
- Enabled
USB - CDC Virtual Serial Port
- Code cleanup
- Added convenience struct USBCDCLineCoding for easier debugging
- Attempted to cleanup CDC_SET_LING_CODING
* Works much better
* Still has an issue under Linux which generates *a lot* of NAKs (initializes quickly regardless)
+ SETUP -> OUT -> IN : This sequence is the problem
+ Specifically during the OUT phase
+ Likely the same issues as HID SET_REPORT
- Enabled
USB - Mouse
- Enabled
USB - Joystick
- Disabled
USB - RawIO
- Initial code, API not used yet
- Disabled
DFU
- Updated load script, now faster
author | Jacob Alexander <haata@kiibohd.com> |
---|---|
date | Tue, 31 May 2016 00:19:45 -0700 |
parents | 56237ba5da6f |
children |
line wrap: on
line diff
--- a/Output/usbMuxUart/output_com.c Sun May 29 10:27:21 2016 -0700 +++ b/Output/usbMuxUart/output_com.c Tue May 31 00:19:45 2016 -0700 @@ -51,14 +51,15 @@ // ----- Macros ----- // Used to build a bitmap lookup table from a byte addressable array -#define byteLookup( byte ) case (( byte ) * ( 8 )): bytePosition = byte; byteShift = 0; break; \ - case (( byte ) * ( 8 ) + ( 1 )): bytePosition = byte; byteShift = 1; break; \ - case (( byte ) * ( 8 ) + ( 2 )): bytePosition = byte; byteShift = 2; break; \ - case (( byte ) * ( 8 ) + ( 3 )): bytePosition = byte; byteShift = 3; break; \ - case (( byte ) * ( 8 ) + ( 4 )): bytePosition = byte; byteShift = 4; break; \ - case (( byte ) * ( 8 ) + ( 5 )): bytePosition = byte; byteShift = 5; break; \ - case (( byte ) * ( 8 ) + ( 6 )): bytePosition = byte; byteShift = 6; break; \ - case (( byte ) * ( 8 ) + ( 7 )): bytePosition = byte; byteShift = 7; break +#define byteLookup( byte ) \ + case (( byte ) * ( 8 )): bytePosition = byte; byteShift = 0; break; \ + case (( byte ) * ( 8 ) + ( 1 )): bytePosition = byte; byteShift = 1; break; \ + case (( byte ) * ( 8 ) + ( 2 )): bytePosition = byte; byteShift = 2; break; \ + case (( byte ) * ( 8 ) + ( 3 )): bytePosition = byte; byteShift = 3; break; \ + case (( byte ) * ( 8 ) + ( 4 )): bytePosition = byte; byteShift = 4; break; \ + case (( byte ) * ( 8 ) + ( 5 )): bytePosition = byte; byteShift = 5; break; \ + case (( byte ) * ( 8 ) + ( 6 )): bytePosition = byte; byteShift = 6; break; \ + case (( byte ) * ( 8 ) + ( 7 )): bytePosition = byte; byteShift = 7; break @@ -72,6 +73,7 @@ void cliFunc_sendUART ( char* args ); void cliFunc_setKeys ( char* args ); void cliFunc_setMod ( char* args ); +void cliFunc_usbInitTime( char* args ); @@ -86,6 +88,7 @@ CLIDict_Entry( sendUART, "Send characters over UART0." ); CLIDict_Entry( setKeys, "Prepare a space separated list of USB codes (decimal). Waits until \033[35msendKeys\033[0m." ); CLIDict_Entry( setMod, "Set the modfier byte:" NL "\t\t1 LCtrl, 2 LShft, 4 LAlt, 8 LGUI, 16 RCtrl, 32 RShft, 64 RAlt, 128 RGUI" ); +CLIDict_Entry( usbInitTime, "Displays the time in ms from usb_init() till the last setup call." ); CLIDict_Def( outputCLIDict, "USB Module Commands" ) = { CLIDict_Item( kbdProtocol ), @@ -96,6 +99,7 @@ CLIDict_Item( sendUART ), CLIDict_Item( setKeys ), CLIDict_Item( setMod ), + CLIDict_Item( usbInitTime ), { 0, 0, 0 } // Null entry for dictionary end }; @@ -167,6 +171,11 @@ // Initially 100 mA, but may be negotiated higher (e.g. 500 mA) uint16_t Output_USBCurrent_Available = 0; +// USB Init Time (ms) +volatile uint32_t USBInit_TimeStart; +volatile uint32_t USBInit_TimeEnd; +volatile uint16_t USBInit_Ticks; + // ----- Capabilities ----- @@ -174,6 +183,7 @@ // Set Boot Keyboard Protocol void Output_kbdProtocolBoot_capability( uint8_t state, uint8_t stateType, uint8_t *args ) { +#if enableKeyboard_define == 1 // Display capability name if ( stateType == 0xFF && state == 0xFF ) { @@ -195,12 +205,14 @@ // Set the keyboard protocol to Boot Mode USBKeys_Protocol = 0; +#endif } // Set NKRO Keyboard Protocol void Output_kbdProtocolNKRO_capability( uint8_t state, uint8_t stateType, uint8_t *args ) { +#if enableKeyboard_define == 1 // Display capability name if ( stateType == 0xFF && state == 0xFF ) { @@ -222,12 +234,14 @@ // Set the keyboard protocol to NKRO Mode USBKeys_Protocol = 1; +#endif } // Toggle Keyboard Protocol void Output_toggleKbdProtocol_capability( uint8_t state, uint8_t stateType, uint8_t *args ) { +#if enableKeyboard_define == 1 // Display capability name if ( stateType == 0xFF && state == 0xFF ) { @@ -244,12 +258,14 @@ // Toggle the keyboard protocol Mode USBKeys_Protocol = !USBKeys_Protocol; } +#endif } // Sends a Consumer Control code to the USB Output buffer void Output_consCtrlSend_capability( uint8_t state, uint8_t stateType, uint8_t *args ) { +#if enableKeyboard_define == 1 // Display capability name if ( stateType == 0xFF && state == 0xFF ) { @@ -278,6 +294,7 @@ // Set consumer control code USBKeys_ConsCtrl = *(uint16_t*)(&args[0]); +#endif } @@ -299,6 +316,7 @@ // Sends a System Control code to the USB Output buffer void Output_sysCtrlSend_capability( uint8_t state, uint8_t stateType, uint8_t *args ) { +#if enableKeyboard_define == 1 // Display capability name if ( stateType == 0xFF && state == 0xFF ) { @@ -327,6 +345,7 @@ // Set system control code USBKeys_SysCtrl = args[0]; +#endif } @@ -334,6 +353,7 @@ // Argument #1: USB Code void Output_usbCodeSend_capability( uint8_t state, uint8_t stateType, uint8_t *args ) { +#if enableKeyboard_define == 1 // Display capability name if ( stateType == 0xFF && state == 0xFF ) { @@ -534,6 +554,7 @@ break; } +#endif } void Output_flashMode_capability( uint8_t state, uint8_t stateType, uint8_t *args ) @@ -557,6 +578,7 @@ // Argument #3: USB Y Axis (16 bit) relative void Output_usbMouse_capability( uint8_t state, uint8_t stateType, uint8_t *args ) { +#if enableMouse_define == 1 // Display capability name if ( stateType == 0xFF && state == 0xFF ) { @@ -604,6 +626,7 @@ if ( mouse_x || mouse_y ) USBMouse_Changed |= USBMouseChangeState_Relative; +#endif } @@ -652,10 +675,6 @@ usb_device_check(); // Boot Mode Only, unset stale keys - if ( USBKeys_Protocol == 0 ) - for ( uint8_t c = USBKeys_Sent; c < USB_BOOT_MAX_KEYS; c++ ) - USBKeys_Keys[c] = 0; - // XXX - Behaves oddly on Mac OSX, might help with corrupted packets specific to OSX? -HaaTa /* // Check if idle count has been exceed, this forces usb_keyboard_send and usb_mouse_send to update @@ -669,9 +688,16 @@ } */ +#if enableMouse_define == 1 // Process mouse actions while ( USBMouse_Changed ) usb_mouse_send(); +#endif + +#if enableKeyboard_define == 1 + if ( USBKeys_Protocol == 0 ) + for ( uint8_t c = USBKeys_Sent; c < USB_BOOT_MAX_KEYS; c++ ) + USBKeys_Keys[c] = 0; // Send keypresses while there are pending changes while ( USBKeys_Changed ) @@ -692,6 +718,7 @@ Scan_finishedWithOutput( USBKeys_Sent ); break; } +#endif } @@ -705,18 +732,24 @@ // USB Input buffer available inline unsigned int Output_availablechar() { +#if enableVirtualSerialPort_define == 1 return usb_serial_available() + uart_serial_available(); +#else + return uart_serial_available(); +#endif } // USB Get Character from input buffer inline int Output_getchar() { +#if enableVirtualSerialPort_define == 1 // XXX Make sure to check output_availablechar() first! Information is lost with the cast (error codes) (AVR) if ( usb_serial_available() > 0 ) { return (int)usb_serial_getchar(); } +#endif if ( uart_serial_available() > 0 ) { @@ -730,11 +763,15 @@ // USB Send Character to output buffer inline int Output_putchar( char c ) { +#if enableVirtualSerialPort_define == 1 // First send to UART uart_serial_putchar( c ); // Then send to USB return usb_serial_putchar( c ); +#else + return uart_serial_putchar( c ); +#endif } @@ -750,11 +787,15 @@ while ( str[count] != '\0' ) count++; +#if enableVirtualSerialPort_define == 1 // First send to UART uart_serial_write( str, count ); // Then send to USB return usb_serial_write( str, count ); +#else + return uart_serial_write( str, count ); +#endif } @@ -938,3 +979,15 @@ USBKeys_ModifiersCLI = numToInt( arg1Ptr ); } +void cliFunc_usbInitTime( char* args ) +{ + // Calculate overall USB initialization time + // XXX A protocol analyzer will be more accurate, however, this is built-in and easier to collect data + print(NL); + info_msg("USB Init Time: "); + printInt32( USBInit_TimeEnd - USBInit_TimeStart ); + print(" ms - "); + printInt16( USBInit_Ticks ); + print(" ticks"); +} +