# HG changeset patch # User Jacob Alexander # Date 1411342193 25200 # Node ID 138e5ca7f8e42584796f38d973abcd7890567f4d # Parent fc3b9cb190ccfd7135297db6ce2713283ebf0484 Preparing ARM for USB NKRO - API changes from the AVR NKRO support diff -r fc3b9cb190cc -r 138e5ca7f8e4 CMakeLists.txt --- a/CMakeLists.txt Sun Sep 21 11:55:37 2014 -0700 +++ b/CMakeLists.txt Sun Sep 21 16:29:53 2014 -0700 @@ -20,9 +20,9 @@ # "at90usb162" # Teensy 1.0 (avr) # "atmega32u4" # Teensy 2.0 (avr) # "at90usb646" # Teensy++ 1.0 (avr) - "at90usb1286" # Teensy++ 2.0 (avr) +# "at90usb1286" # Teensy++ 2.0 (avr) # "mk20dx128" # Teensy 3.0 (arm) -# "mk20dx128vlf5" # McHCK mk20dx128vlf5 + "mk20dx128vlf5" # McHCK mk20dx128vlf5 # "mk20dx256" # Teensy 3.1 (arm) ) @@ -48,8 +48,7 @@ #| Please look at the {Scan,Macro,Output,Debug} for information on the modules and how to create new ones ##| Deals with acquiring the keypress information and turning it into a key index -set( ScanModule "DPH" ) -#set( ScanModule "MD1" ) +set( ScanModule "MD1" ) ##| Provides the mapping functions for DefaultMap and handles any macro processing before sending to the OutputModule set( MacroModule "PartialMap" ) @@ -89,17 +88,15 @@ ##| Set the base keyboard .kll map, defaults to "defaultMap" if not found ##| Looks in Scan/ for the available BaseMaps ##| TODO Support layering in basemap -set( BaseMap "kishsaver" ) -#set( BaseMap "defaultMap" ) +set( BaseMap "defaultMap" ) ##| Layer additonal .kll maps on the BaseMap, layers are in order from 1st to nth ##| Can be set to "" -#set( DefaultMap "colemak stdFuncMap" ) -set( DefaultMap "colemak kishsaver_unix1 stdFuncMap" ) +set( DefaultMap "colemak stdFuncMap" ) ##| ParitalMaps available on top of the BaseMap. See above for syntax on specifying multiple layers vs. layering ##| Can be set to "" -#set( PartialMaps "hhkbpro2" ) +set( PartialMaps "hhkbpro2" ) diff -r fc3b9cb190cc -r 138e5ca7f8e4 Output/pjrcUSB/arm/usb_keyboard.c --- a/Output/pjrcUSB/arm/usb_keyboard.c Sun Sep 21 11:55:37 2014 -0700 +++ b/Output/pjrcUSB/arm/usb_keyboard.c Sun Sep 21 16:29:53 2014 -0700 @@ -1,6 +1,7 @@ /* Teensyduino Core Library * http://www.pjrc.com/teensy/ * Copyright (c) 2013 PJRC.COM, LLC. + * Modifications by Jacob Alexander 2013-2014 * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the @@ -10,10 +11,10 @@ * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * - * 1. The above copyright notice and this permission notice shall be + * 1. The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * - * 2. If the Software is incorporated into a build system that allows + * 2. If the Software is incorporated into a build system that allows * selection among a list of target devices, then similar target * devices manufactured by PJRC.COM must be included in the list of * target devices and selectable in the same manner. @@ -28,17 +29,26 @@ * SOFTWARE. */ +// ----- Includes ----- + +// Compiler Includes +#include // for memcpy() + +// Project Includes +#include +#include + +// Local Includes #include "usb_dev.h" #include "usb_keyboard.h" -#include -#include // for memcpy() + +// ----- Defines ----- + // Maximum number of transmit packets to queue so we don't starve other endpoints for memory #define TX_PACKET_LIMIT 4 -static uint8_t transmit_previous_timeout=0; - // When the PC isn't listening, how long do we wait before discarding data? #define TX_TIMEOUT_MSEC 50 @@ -51,32 +61,53 @@ #endif + +// ----- Variables ----- + +static uint8_t transmit_previous_timeout = 0; + + + +// ----- Functions ----- + // send the contents of keyboard_keys and keyboard_modifier_keys -int usb_keyboard_send(void) +void usb_keyboard_send() { - uint32_t wait_count=0; + uint32_t wait_count = 0; usb_packet_t *tx_packet; - while (1) { - if (!usb_configuration) { - return -1; + while ( 1 ) + { + if ( !usb_configuration ) + { + erro_print("USB not configured..."); + return; } - if (usb_tx_packet_count(KEYBOARD_ENDPOINT) < TX_PACKET_LIMIT) { + if ( usb_tx_packet_count(KEYBOARD_ENDPOINT) < TX_PACKET_LIMIT ) + { tx_packet = usb_malloc(); - if (tx_packet) break; + if ( tx_packet ) + break; } - if (++wait_count > TX_TIMEOUT || transmit_previous_timeout) { + if ( ++wait_count > TX_TIMEOUT || transmit_previous_timeout ) + { transmit_previous_timeout = 1; - return -1; + warn_print("USB Transmit Timeout..."); + return; } yield(); } + + // Boot Mode *(tx_packet->buf) = USBKeys_Modifiers; *(tx_packet->buf + 1) = 0; - memcpy(tx_packet->buf + 2, USBKeys_Array, USB_MAX_KEY_SEND); + memcpy( tx_packet->buf + 2, USBKeys_Keys, USB_BOOT_MAX_KEYS ); tx_packet->len = 8; - usb_tx(KEYBOARD_ENDPOINT, tx_packet); - return 0; + // Send USB Packet + usb_tx( KEYBOARD_ENDPOINT, tx_packet ); + USBKeys_Changed = USBKeyChangeState_None; + + return; } diff -r fc3b9cb190cc -r 138e5ca7f8e4 Output/pjrcUSB/arm/usb_keyboard.h --- a/Output/pjrcUSB/arm/usb_keyboard.h Sun Sep 21 11:55:37 2014 -0700 +++ b/Output/pjrcUSB/arm/usb_keyboard.h Sun Sep 21 16:29:53 2014 -0700 @@ -1,6 +1,7 @@ /* Teensyduino Core Library * http://www.pjrc.com/teensy/ * Copyright (c) 2013 PJRC.COM, LLC. + * Modifications by Jacob Alexander 2013-2014 * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the @@ -10,10 +11,10 @@ * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * - * 1. The above copyright notice and this permission notice shall be + * 1. The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * - * 2. If the Software is incorporated into a build system that allows + * 2. If the Software is incorporated into a build system that allows * selection among a list of target devices, then similar target * devices manufactured by PJRC.COM must be included in the list of * target devices and selectable in the same manner. @@ -31,10 +32,21 @@ #ifndef USBkeyboard_h_ #define USBkeyboard_h_ +// ----- Includes ----- + +// Compiler Includes #include -#include "output_com.h" + +// Local Includes +#include + + -int usb_keyboard_send(void); +// ----- Functions ----- + +void usb_keyboard_send(); + + #endif // USBkeyboard_h_ diff -r fc3b9cb190cc -r 138e5ca7f8e4 Output/pjrcUSB/avr/usb_keyboard_serial.c --- a/Output/pjrcUSB/avr/usb_keyboard_serial.c Sun Sep 21 11:55:37 2014 -0700 +++ b/Output/pjrcUSB/avr/usb_keyboard_serial.c Sun Sep 21 16:29:53 2014 -0700 @@ -99,6 +99,7 @@ // Send boot keyboard interrupt packet(s) case 0: usb_keyboard_toHost(); + USBKeys_Changed = USBKeyChangeState_None; break; // Send NKRO keyboard interrupts packet(s) diff -r fc3b9cb190cc -r 138e5ca7f8e4 Output/pjrcUSB/output_com.c --- a/Output/pjrcUSB/output_com.c Sun Sep 21 11:55:37 2014 -0700 +++ b/Output/pjrcUSB/output_com.c Sun Sep 21 16:29:53 2014 -0700 @@ -106,7 +106,7 @@ // Protocol setting from the host. // 0 - Boot Mode // 1 - NKRO Mode (Default, unless set by a BIOS or boot interface) -volatile uint8_t USBKeys_Protocol = 1; +volatile uint8_t USBKeys_Protocol = 0; // Indicate if USB should send update // OS only needs update if there has been a change in state @@ -379,29 +379,18 @@ // USB Data Send inline void Output_send() { - // Don't send update if USB has not changed - if ( !USBKeys_Changed ) - { - // Clear modifiers and keys - USBKeys_Modifiers = 0; - USBKeys_Sent = 0; - - return; - } - // 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; - // Send keypresses + // Send keypresses while there are pending changes while ( USBKeys_Changed ) usb_keyboard_send(); // Clear modifiers and keys USBKeys_Modifiers = 0; USBKeys_Sent = 0; - USBKeys_Changed = USBKeyChangeState_None; // Signal Scan Module we are finished switch ( USBKeys_Protocol )