]> git.donarmstrong.com Git - kiibohd-controller.git/blobdiff - Output/pjrcUSB/arm/usb_keyboard.c
Adding initial dfu-upload code and debugging for Bootloader.
[kiibohd-controller.git] / Output / pjrcUSB / arm / usb_keyboard.c
index 722ae8dccf1a957ce5c5f27d5aeaa62cad8ee522..8453534ad989cec18ace5411ec399fd138c8825a 100644 (file)
@@ -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
 #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;