X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Output%2FpjrcUSB%2Farm%2Fusb_keyboard.c;h=8453534ad989cec18ace5411ec399fd138c8825a;hb=1acbc97e98d8388332c51260017ab23227a91339;hp=722ae8dccf1a957ce5c5f27d5aeaa62cad8ee522;hpb=11fb8bd77dea03ccda9a977c0ac7938abc938f6c;p=kiibohd-controller.git diff --git a/Output/pjrcUSB/arm/usb_keyboard.c b/Output/pjrcUSB/arm/usb_keyboard.c index 722ae8d..8453534 100644 --- a/Output/pjrcUSB/arm/usb_keyboard.c +++ b/Output/pjrcUSB/arm/usb_keyboard.c @@ -1,7 +1,7 @@ /* Teensyduino Core Library * http://www.pjrc.com/teensy/ * Copyright (c) 2013 PJRC.COM, LLC. - * Modifications by Jacob Alexander 2013-2014 + * Modifications by Jacob Alexander 2013-2015 * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the @@ -53,11 +53,13 @@ #define TX_TIMEOUT_MSEC 50 #if F_CPU == 96000000 - #define TX_TIMEOUT (TX_TIMEOUT_MSEC * 596) + #define TX_TIMEOUT (TX_TIMEOUT_MSEC * 596) +#elif F_CPU == 72000000 + #define TX_TIMEOUT (TX_TIMEOUT_MSEC * 512) // XXX Correct? #elif F_CPU == 48000000 - #define TX_TIMEOUT (TX_TIMEOUT_MSEC * 428) + #define TX_TIMEOUT (TX_TIMEOUT_MSEC * 428) #elif F_CPU == 24000000 - #define TX_TIMEOUT (TX_TIMEOUT_MSEC * 262) + #define TX_TIMEOUT (TX_TIMEOUT_MSEC * 262) #endif @@ -76,6 +78,13 @@ void usb_keyboard_send() uint32_t wait_count = 0; usb_packet_t *tx_packet; + if (remote_wakeup_enabled) { + USB0_CTL |= USB_CTL_RESUME; + _delay_ms(5); //wait 1 to 15ms + USB0_CTL &= ~USB_CTL_RESUME; + _delay_ms(5); + } + // Wait till ready while ( 1 ) { @@ -120,6 +129,23 @@ void usb_keyboard_send() { // Send boot keyboard interrupt packet(s) case 0: + // USB Boot Mode debug output + if ( Output_DebugMode ) + { + dbug_msg("Boot USB: "); + printHex_op( USBKeys_Modifiers, 2 ); + print(" "); + printHex( 0 ); + print(" "); + printHex_op( USBKeys_Keys[0], 2 ); + printHex_op( USBKeys_Keys[1], 2 ); + printHex_op( USBKeys_Keys[2], 2 ); + printHex_op( USBKeys_Keys[3], 2 ); + printHex_op( USBKeys_Keys[4], 2 ); + printHex_op( USBKeys_Keys[5], 2 ); + print( NL ); + } + // Boot Mode *tx_buf++ = USBKeys_Modifiers; *tx_buf++ = 0; @@ -133,91 +159,100 @@ void usb_keyboard_send() // Send NKRO keyboard interrupts packet(s) case 1: - // Check modifiers - if ( USBKeys_Changed & USBKeyChangeState_Modifiers ) + if ( Output_DebugMode ) { - *tx_buf++ = 0x01; // ID - *tx_buf = USBKeys_Modifiers; + dbug_msg("NKRO USB: "); + } + + // Check system control keys + if ( USBKeys_Changed & USBKeyChangeState_System ) + { + if ( Output_DebugMode ) + { + print("SysCtrl["); + printHex_op( USBKeys_SysCtrl, 2 ); + print( "] " NL ); + } + + *tx_buf++ = 0x02; // ID + *tx_buf = USBKeys_SysCtrl; tx_packet->len = 2; // Send USB Packet usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet ); - USBKeys_Changed &= ~USBKeyChangeState_Modifiers; // Mark sent + USBKeys_Changed &= ~USBKeyChangeState_System; // Mark sent } - // Check main key section - else if ( USBKeys_Changed & USBKeyChangeState_MainKeys ) + + // Check consumer control keys + if ( USBKeys_Changed & USBKeyChangeState_Consumer ) { - *tx_buf++ = 0x03; // ID + if ( Output_DebugMode ) + { + print("ConsCtrl["); + printHex_op( USBKeys_ConsCtrl, 2 ); + print( "] " NL ); + } - // 4-49 (first 6 bytes) - memcpy( tx_buf, USBKeys_Keys, 6 ); - tx_packet->len = 7; + *tx_buf++ = 0x03; // ID + *tx_buf++ = (uint8_t)(USBKeys_ConsCtrl & 0x00FF); + *tx_buf = (uint8_t)(USBKeys_ConsCtrl >> 8); + tx_packet->len = 3; // Send USB Packet usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet ); - USBKeys_Changed &= ~USBKeyChangeState_MainKeys; // Mark sent + USBKeys_Changed &= ~USBKeyChangeState_Consumer; // Mark sent } - // Check secondary key section - else if ( USBKeys_Changed & USBKeyChangeState_SecondaryKeys ) + + // Standard HID Keyboard + if ( USBKeys_Changed ) { - *tx_buf++ = 0x04; // ID + // USB NKRO Debug output + if ( Output_DebugMode ) + { + printHex_op( USBKeys_Modifiers, 2 ); + print(" "); + for ( uint8_t c = 0; c < 6; c++ ) + printHex_op( USBKeys_Keys[ c ], 2 ); + print(" "); + for ( uint8_t c = 6; c < 20; c++ ) + printHex_op( USBKeys_Keys[ c ], 2 ); + print(" "); + printHex_op( USBKeys_Keys[20], 2 ); + print(" "); + for ( uint8_t c = 21; c < 27; c++ ) + printHex_op( USBKeys_Keys[ c ], 2 ); + print( NL ); + } + + tx_packet->len = 0; + + // Modifiers + *tx_buf++ = 0x01; // ID + *tx_buf++ = USBKeys_Modifiers; + tx_packet->len += 2; + + // 4-49 (first 6 bytes) + memcpy( tx_buf, USBKeys_Keys, 6 ); + tx_buf += 6; + tx_packet->len += 6; // 51-155 (Middle 14 bytes) memcpy( tx_buf, USBKeys_Keys + 6, 14 ); - tx_packet->len = 15; - - // Send USB Packet - usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet ); - USBKeys_Changed &= ~USBKeyChangeState_SecondaryKeys; // Mark sent - } - // Check tertiary key section - else if ( USBKeys_Changed & USBKeyChangeState_TertiaryKeys ) - { - *tx_buf++ = 0x05; // ID + tx_buf += 14; + tx_packet->len += 14; // 157-164 (Next byte) memcpy( tx_buf, USBKeys_Keys + 20, 1 ); - tx_packet->len = 2; - - // Send USB Packet - usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet ); - USBKeys_Changed &= ~USBKeyChangeState_TertiaryKeys; // Mark sent - } - // Check quartiary key section - else if ( USBKeys_Changed & USBKeyChangeState_QuartiaryKeys ) - { - *tx_buf++ = 0x06; // ID + tx_buf += 1; + tx_packet->len += 1; // 176-221 (last 6 bytes) memcpy( tx_buf, USBKeys_Keys + 21, 6 ); - tx_packet->len = 7; + tx_packet->len += 6; // Send USB Packet usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet ); - USBKeys_Changed &= ~USBKeyChangeState_QuartiaryKeys; // Mark sent - } - // Check system control keys - else if ( USBKeys_Changed & USBKeyChangeState_System ) - { - *tx_buf++ = 0x07; // ID - *tx_buf = USBKeys_SysCtrl; - tx_packet->len = 2; - - // Send USB Packet - usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet ); - USBKeys_Changed &= ~USBKeyChangeState_System; // Mark sent - } - // Check consumer control keys - else if ( USBKeys_Changed & USBKeyChangeState_Consumer ) - { - *tx_buf++ = 0x08; // ID - *tx_buf++ = (uint8_t)(USBKeys_ConsCtrl & 0x00FF); - *tx_buf = (uint8_t)(USBKeys_ConsCtrl >> 8); - tx_packet->len = 3; - - // Send USB Packet - usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet ); - USBKeys_Changed &= ~USBKeyChangeState_Consumer; // Mark sent + USBKeys_Changed = USBKeyChangeState_None; // Mark sent } break;