summary refs log tree commit diff
path: root/tmk_core/protocol
diff options
context:
space:
mode:
Diffstat (limited to 'tmk_core/protocol')
-rw-r--r--tmk_core/protocol/chibios/usb_main.c19
-rw-r--r--tmk_core/protocol/iwrap/suart.S312
-rw-r--r--tmk_core/protocol/iwrap/suart.h16
-rw-r--r--tmk_core/protocol/iwrap/wd.h318
-rw-r--r--tmk_core/protocol/lufa.mk11
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/Bootloaders/CDC/asf.xml322
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/Bootloaders/DFU/asf.xml312
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/Bootloaders/HID/asf.xml246
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/BootloaderAPITable.S204
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/asf.xml312
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/makefile136
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/BootloaderAPITable.S182
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/asf.xml318
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/makefile110
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/Build/HID_EEPROM_Loader/makefile84
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/DeviceTemplate/asf.xml110
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/HostTemplate/asf.xml82
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/DoxygenPages/BuildSystem.txt1950
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/mshelp/placeholder.txt2
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/placeholder.txt2
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_hv1_transform.xslt90
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_studio_help_styling.css106
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/[Content_Types].xml26
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/asf-manifest.xml36
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/extension.vsixmanifest66
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/generate_caches.py76
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa.xml192
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_common.xml68
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board.xml228
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board_names.xml1706
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_misc.xml112
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_peripheral.xml396
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb.xml62
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_class.xml64
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core.xml170
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_avr8.xml86
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_uc3.xml84
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_xmega.xml72
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform.xml120
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_uc3.xml52
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_xmega.xml46
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_toolchain.xml86
-rw-r--r--tmk_core/protocol/lufa/adafruit_ble.cpp805
-rw-r--r--tmk_core/protocol/lufa/adafruit_ble.h60
-rw-r--r--tmk_core/protocol/lufa/descriptor.c208
-rw-r--r--tmk_core/protocol/lufa/descriptor.h88
-rw-r--r--tmk_core/protocol/lufa/lufa.c397
-rw-r--r--tmk_core/protocol/lufa/lufa.h15
-rw-r--r--tmk_core/protocol/lufa/outputselect.c56
-rw-r--r--tmk_core/protocol/lufa/outputselect.h41
-rw-r--r--tmk_core/protocol/lufa/ringbuffer.hpp66
-rw-r--r--tmk_core/protocol/midi.mk1
-rwxr-xr-xtmk_core/protocol/midi/Config/LUFAConfig.h186
-rw-r--r--tmk_core/protocol/pjrc/usb.c18
-rw-r--r--tmk_core/protocol/pjrc/usb_keyboard.c8
-rw-r--r--tmk_core/protocol/ps2_mouse.c330
-rw-r--r--tmk_core/protocol/ps2_mouse.h132
-rw-r--r--tmk_core/protocol/vusb.mk3
-rw-r--r--tmk_core/protocol/vusb/main.c6
-rw-r--r--tmk_core/protocol/vusb/vusb.c22
60 files changed, 6603 insertions, 4831 deletions
diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c
index e2c9d9bf14..d0c72c46c7 100644
--- a/tmk_core/protocol/chibios/usb_main.c
+++ b/tmk_core/protocol/chibios/usb_main.c
@@ -28,6 +28,12 @@
 #include "led.h"
 #endif
 
+#ifdef NKRO_ENABLE
+  #include "keycode_config.h"
+
+  extern keymap_config_t keymap_config;
+#endif
+
 /* ---------------------------------------------------------
  *       Global interface variables and declarations
  * ---------------------------------------------------------
@@ -39,9 +45,6 @@ uint16_t keyboard_led_stats __attribute__((aligned(2))) = 0;
 volatile uint16_t keyboard_idle_count = 0;
 static virtual_timer_t keyboard_idle_timer;
 static void keyboard_idle_timer_cb(void *arg);
-#ifdef NKRO_ENABLE
-extern bool keyboard_nkro;
-#endif /* NKRO_ENABLE */
 
 report_keyboard_t keyboard_report_sent = {{0}};
 #ifdef MOUSE_ENABLE
@@ -943,8 +946,8 @@ static bool usb_request_hook_cb(USBDriver *usbp) {
         if((usbp->setup[4] == KBD_INTERFACE) && (usbp->setup[5] == 0)) {   /* wIndex */
           keyboard_protocol = ((usbp->setup[2]) != 0x00);   /* LSB(wValue) */
 #ifdef NKRO_ENABLE
-          keyboard_nkro = !!keyboard_protocol;
-          if(!keyboard_nkro && keyboard_idle) {
+          keymap_config.nkro = !!keyboard_protocol;
+          if(!keymap_config.nkro && keyboard_idle) {
 #else /* NKRO_ENABLE */
           if(keyboard_idle) {
 #endif /* NKRO_ENABLE */
@@ -962,7 +965,7 @@ static bool usb_request_hook_cb(USBDriver *usbp) {
         keyboard_idle = usbp->setup[3];     /* MSB(wValue) */
         /* arm the timer */
 #ifdef NKRO_ENABLE
-        if(!keyboard_nkro && keyboard_idle) {
+        if(!keymap_config.nkro && keyboard_idle) {
 #else /* NKRO_ENABLE */
         if(keyboard_idle) {
 #endif /* NKRO_ENABLE */
@@ -1089,7 +1092,7 @@ static void keyboard_idle_timer_cb(void *arg) {
   }
 
 #ifdef NKRO_ENABLE
-  if(!keyboard_nkro && keyboard_idle) {
+  if(!keymap_config.nkro && keyboard_idle) {
 #else /* NKRO_ENABLE */
   if(keyboard_idle) {
 #endif /* NKRO_ENABLE */
@@ -1122,7 +1125,7 @@ void send_keyboard(report_keyboard_t *report) {
   osalSysUnlock();
 
 #ifdef NKRO_ENABLE
-  if(keyboard_nkro) {  /* NKRO protocol */
+  if(keymap_config.nkro) {  /* NKRO protocol */
     /* need to wait until the previous packet has made it through */
     /* can rewrite this using the synchronous API, then would wait
      * until *after* the packet has been transmitted. I think
diff --git a/tmk_core/protocol/iwrap/suart.S b/tmk_core/protocol/iwrap/suart.S
index 1b02909638..a873515e10 100644
--- a/tmk_core/protocol/iwrap/suart.S
+++ b/tmk_core/protocol/iwrap/suart.S
@@ -1,156 +1,156 @@
-;---------------------------------------------------------------------------;

-; Software implemented UART module                                          ;

-; (C)ChaN, 2005 (http://elm-chan.org/)                                      ;

-;---------------------------------------------------------------------------;

-; Bit rate settings:

-;

-;            1MHz  2MHz  4MHz  6MHz  8MHz  10MHz  12MHz  16MHz  20MHz

-;   2.4kbps   138     -     -     -     -      -      -      -      -

-;   4.8kbps    68   138     -     -     -      -      -      -      -

-;   9.6kbps    33    68   138   208     -      -      -      -      -

-;  19.2kbps     -    33    68   102   138    173    208      -      -

-;  38.4kbps     -     -    33    50    68     85    102    138    172

-;  57.6kbps     -     -    21    33    44     56     68     91    114

-; 115.2kbps     -     -     -     -    21     27     33     44     56

-

-.nolist

-#include <avr/io.h>

-.list

-

-#define	BPS	102 	/* Bit delay. (see above table) */

-#define	BIDIR	0	/* 0:Separated Tx/Rx, 1:Shared Tx/Rx */

-

-#define	OUT_1		sbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT	/* Output 1 */

-#define	OUT_0		cbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT	/* Output 0 */

-#define	SKIP_IN_1	sbis _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT	/* Skip if 1 */

-#define	SKIP_IN_0	sbic _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT	/* Skip if 0 */

-

-

-

-#ifdef SPM_PAGESIZE

-.macro	_LPMI	reg

-	lpm	\reg, Z+

-.endm

-.macro	_MOVW	dh,dl, sh,sl

-	movw	\dl, \sl

-.endm

-#else

-.macro	_LPMI	reg

-	lpm

-	mov	\reg, r0

-	adiw	ZL, 1

-.endm

-.macro	_MOVW	dh,dl, sh,sl

-	mov	\dl, \sl

-	mov	\dh, \sh

-.endm

-#endif

-

-

-

-;---------------------------------------------------------------------------;

-; Transmit a byte in serial format of N81

-;

-;Prototype: void xmit (uint8_t data);

-;Size: 16 words

-

-.global xmit

-.func xmit

-xmit:

-#if BIDIR

-	ldi	r23, BPS-1	;Pre-idle time for bidirectional data line

-5:	dec	r23     	;

-	brne	5b		;/

-#endif

-	in	r0, _SFR_IO_ADDR(SREG)	;Save flags

-

-	com	r24		;C = start bit

-	ldi	r25, 10		;Bit counter

-	cli			;Start critical section

-

-1:	ldi	r23, BPS-1	;----- Bit transferring loop 

-2:	dec	r23     	;Wait for a bit time

-	brne	2b		;/

-	brcs	3f		;MISO = bit to be sent

-	OUT_1			;

-3:	brcc	4f		;

-	OUT_0			;/

-4:	lsr	r24     	;Get next bit into C

-	dec	r25     	;All bits sent?

-	brne	1b	     	;  no, coutinue

-

-	out	_SFR_IO_ADDR(SREG), r0	;End of critical section

-	ret

-.endfunc

-

-

-

-;---------------------------------------------------------------------------;

-; Receive a byte

-;

-;Prototype: uint8_t rcvr (void);

-;Size: 19 words

-

-.global rcvr

-.func rcvr

-rcvr:

-	in	r0, _SFR_IO_ADDR(SREG)	;Save flags

-

-	ldi	r24, 0x80	;Receiving shift reg

-	cli			;Start critical section

-

-1:	SKIP_IN_1		;Wait for idle

-	rjmp	1b

-2:	SKIP_IN_0		;Wait for start bit

-	rjmp	2b

-	ldi	r25, BPS/2	;Wait for half bit time

-3:	dec	r25

-	brne	3b

-

-4:	ldi	r25, BPS	;----- Bit receiving loop

-5:	dec	r25     	;Wait for a bit time

-	brne	5b		;/

-	lsr	r24     	;Next bit

-	SKIP_IN_0		;Get a data bit into r24.7

-	ori	r24, 0x80

-	brcc	4b	     	;All bits received?  no, continue

-

-	out	_SFR_IO_ADDR(SREG), r0	;End of critical section

-	ret

-.endfunc

-

-

-; Not wait for start bit. This should be called after detecting start bit.

-.global recv

-.func recv

-recv:

-	in	r0, _SFR_IO_ADDR(SREG)	;Save flags

-

-	ldi	r24, 0x80	;Receiving shift reg

-	cli			;Start critical section

-

-;1:	SKIP_IN_1		;Wait for idle

-;	rjmp	1b

-;2:	SKIP_IN_0		;Wait for start bit

-;	rjmp	2b

-	ldi	r25, BPS/2	;Wait for half bit time

-3:	dec	r25

-	brne	3b

-

-4:	ldi	r25, BPS	;----- Bit receiving loop

-5:	dec	r25     	;Wait for a bit time

-	brne	5b		;/

-	lsr	r24     	;Next bit

-	SKIP_IN_0		;Get a data bit into r24.7

-	ori	r24, 0x80

-	brcc	4b	     	;All bits received?  no, continue

-

-	ldi	r25, BPS/2	;Wait for half bit time

-6:	dec	r25

-	brne	6b

-7:	SKIP_IN_1		;Wait for stop bit

-	rjmp	7b

-

-	out	_SFR_IO_ADDR(SREG), r0	;End of critical section

-	ret

-.endfunc

+;---------------------------------------------------------------------------;
+; Software implemented UART module                                          ;
+; (C)ChaN, 2005 (http://elm-chan.org/)                                      ;
+;---------------------------------------------------------------------------;
+; Bit rate settings:
+;
+;            1MHz  2MHz  4MHz  6MHz  8MHz  10MHz  12MHz  16MHz  20MHz
+;   2.4kbps   138     -     -     -     -      -      -      -      -
+;   4.8kbps    68   138     -     -     -      -      -      -      -
+;   9.6kbps    33    68   138   208     -      -      -      -      -
+;  19.2kbps     -    33    68   102   138    173    208      -      -
+;  38.4kbps     -     -    33    50    68     85    102    138    172
+;  57.6kbps     -     -    21    33    44     56     68     91    114
+; 115.2kbps     -     -     -     -    21     27     33     44     56
+
+.nolist
+#include <avr/io.h>
+.list
+
+#define	BPS	102 	/* Bit delay. (see above table) */
+#define	BIDIR	0	/* 0:Separated Tx/Rx, 1:Shared Tx/Rx */
+
+#define	OUT_1		sbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT	/* Output 1 */
+#define	OUT_0		cbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT	/* Output 0 */
+#define	SKIP_IN_1	sbis _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT	/* Skip if 1 */
+#define	SKIP_IN_0	sbic _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT	/* Skip if 0 */
+
+
+
+#ifdef SPM_PAGESIZE
+.macro	_LPMI	reg
+	lpm	\reg, Z+
+.endm
+.macro	_MOVW	dh,dl, sh,sl
+	movw	\dl, \sl
+.endm
+#else
+.macro	_LPMI	reg
+	lpm
+	mov	\reg, r0
+	adiw	ZL, 1
+.endm
+.macro	_MOVW	dh,dl, sh,sl
+	mov	\dl, \sl
+	mov	\dh, \sh
+.endm
+#endif
+
+
+
+;---------------------------------------------------------------------------;
+; Transmit a byte in serial format of N81
+;
+;Prototype: void xmit (uint8_t data);
+;Size: 16 words
+
+.global xmit
+.func xmit
+xmit:
+#if BIDIR
+	ldi	r23, BPS-1	;Pre-idle time for bidirectional data line
+5:	dec	r23     	;
+	brne	5b		;/
+#endif
+	in	r0, _SFR_IO_ADDR(SREG)	;Save flags
+
+	com	r24		;C = start bit
+	ldi	r25, 10		;Bit counter
+	cli			;Start critical section
+
+1:	ldi	r23, BPS-1	;----- Bit transferring loop 
+2:	dec	r23     	;Wait for a bit time
+	brne	2b		;/
+	brcs	3f		;MISO = bit to be sent
+	OUT_1			;
+3:	brcc	4f		;
+	OUT_0			;/
+4:	lsr	r24     	;Get next bit into C
+	dec	r25     	;All bits sent?
+	brne	1b	     	;  no, coutinue
+
+	out	_SFR_IO_ADDR(SREG), r0	;End of critical section
+	ret
+.endfunc
+
+
+
+;---------------------------------------------------------------------------;
+; Receive a byte
+;
+;Prototype: uint8_t rcvr (void);
+;Size: 19 words
+
+.global rcvr
+.func rcvr
+rcvr:
+	in	r0, _SFR_IO_ADDR(SREG)	;Save flags
+
+	ldi	r24, 0x80	;Receiving shift reg
+	cli			;Start critical section
+
+1:	SKIP_IN_1		;Wait for idle
+	rjmp	1b
+2:	SKIP_IN_0		;Wait for start bit
+	rjmp	2b
+	ldi	r25, BPS/2	;Wait for half bit time
+3:	dec	r25
+	brne	3b
+
+4:	ldi	r25, BPS	;----- Bit receiving loop
+5:	dec	r25     	;Wait for a bit time
+	brne	5b		;/
+	lsr	r24     	;Next bit
+	SKIP_IN_0		;Get a data bit into r24.7
+	ori	r24, 0x80
+	brcc	4b	     	;All bits received?  no, continue
+
+	out	_SFR_IO_ADDR(SREG), r0	;End of critical section
+	ret
+.endfunc
+
+
+; Not wait for start bit. This should be called after detecting start bit.
+.global recv
+.func recv
+recv:
+	in	r0, _SFR_IO_ADDR(SREG)	;Save flags
+
+	ldi	r24, 0x80	;Receiving shift reg
+	cli			;Start critical section
+
+;1:	SKIP_IN_1		;Wait for idle
+;	rjmp	1b
+;2:	SKIP_IN_0		;Wait for start bit
+;	rjmp	2b
+	ldi	r25, BPS/2	;Wait for half bit time
+3:	dec	r25
+	brne	3b
+
+4:	ldi	r25, BPS	;----- Bit receiving loop
+5:	dec	r25     	;Wait for a bit time
+	brne	5b		;/
+	lsr	r24     	;Next bit
+	SKIP_IN_0		;Get a data bit into r24.7
+	ori	r24, 0x80
+	brcc	4b	     	;All bits received?  no, continue
+
+	ldi	r25, BPS/2	;Wait for half bit time
+6:	dec	r25
+	brne	6b
+7:	SKIP_IN_1		;Wait for stop bit
+	rjmp	7b
+
+	out	_SFR_IO_ADDR(SREG), r0	;End of critical section
+	ret
+.endfunc
diff --git a/tmk_core/protocol/iwrap/suart.h b/tmk_core/protocol/iwrap/suart.h
index 72725b998f..7d92be0692 100644
--- a/tmk_core/protocol/iwrap/suart.h
+++ b/tmk_core/protocol/iwrap/suart.h
@@ -1,8 +1,8 @@
-#ifndef SUART

-#define SUART

-

-void xmit(uint8_t);

-uint8_t rcvr(void);

-uint8_t recv(void);

-

-#endif	/* SUART */

+#ifndef SUART
+#define SUART
+
+void xmit(uint8_t);
+uint8_t rcvr(void);
+uint8_t recv(void);
+
+#endif	/* SUART */
diff --git a/tmk_core/protocol/iwrap/wd.h b/tmk_core/protocol/iwrap/wd.h
index 99058f0331..12395bf696 100644
--- a/tmk_core/protocol/iwrap/wd.h
+++ b/tmk_core/protocol/iwrap/wd.h
@@ -1,159 +1,159 @@
-/* This is from http://www.mtcnet.net/~henryvm/wdt/ */

-#ifndef _AVR_WD_H_

-#define _AVR_WD_H_

-

-#include <avr/io.h>

-

-/*

-Copyright (c) 2009, Curt Van Maanen

-

-Permission to use, copy, modify, and/or distribute this software for any

-purpose with or without fee is hereby granted, provided that the above

-copyright notice and this permission notice appear in all copies.

-

-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES

-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF

-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR

-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES

-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN

-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF

-OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

-

-

-include usage-

-    #include "wd.h"             //if in same directory as project

-    #include <avr/wd.h>         //if wd.h is in avr directory

-

-set watchdog modes and prescale

-

-usage-

-    WD_SET(mode,[timeout]);     //prescale always set

-

-modes-

-    WD_OFF                      disabled

-    WD_RST                      normal reset mode

-    WD_IRQ                      interrupt only mode (if supported)

-    WD_RST_IRQ                  interrupt+reset mode (if supported)

-

-timeout-

-    WDTO_15MS                   default if no timeout provided

-    WDTO_30MS

-    WDTO_60MS

-    WDTO_120MS

-    WDTO_250MS

-    WDTO_500MS

-    WDTO_1S

-    WDTO_2S

-    WDTO_4S                     (if supported)

-    WDTO_8S                     (if supported)

-

-examples-

-    WD_SET(WD_RST,WDTO_1S);     //reset mode, 1s timeout

-    WD_SET(WD_OFF);             //watchdog disabled (if not fused on)

-    WD_SET(WD_RST);             //reset mode, 15ms (default timeout)

-    WD_SET(WD_IRQ,WDTO_120MS);  //interrupt only mode, 120ms timeout

-    WD_SET(WD_RST_IRQ,WDTO_2S); //interrupt+reset mode, 2S timeout

-

-

-for enhanced watchdogs, if the watchdog is not being used WDRF should be

-cleared on every power up or reset, along with disabling the watchdog-

-    WD_DISABLE();               //clear WDRF, then turn off watchdog

-

-*/

-

-//reset registers to the same name (MCUCSR)

-#if !defined(MCUCSR)

-#define MCUCSR                  MCUSR

-#endif

-

-//watchdog registers to the same name (WDTCSR)

-#if !defined(WDTCSR)

-#define WDTCSR                  WDTCR

-#endif

-

-//if enhanced watchdog, define irq values, create disable macro

-#if defined(WDIF)

-#define WD_IRQ                  0xC0

-#define WD_RST_IRQ              0xC8

-#define WD_DISABLE()            do{                       \

-                                    MCUCSR &= ~(1<<WDRF); \

-                                    WD_SET(WD_OFF);       \

-                                }while(0)

-#endif

-

-//all watchdogs

-#define WD_RST                  8

-#define WD_OFF                  0

-

-//prescale values

-#define WDTO_15MS               0

-#define WDTO_30MS               1

-#define WDTO_60MS               2

-#define WDTO_120MS              3

-#define WDTO_250MS              4

-#define WDTO_500MS              5

-#define WDTO_1S                 6

-#define WDTO_2S                 7

-

-//prescale values for avrs with WDP3

-#if defined(WDP3)

-#define WDTO_4S                 0x20

-#define WDTO_8S                 0x21

-#endif

-

-//watchdog reset

-#define WDR()                   __asm__ __volatile__("wdr")

-

-//avr reset using watchdog

-#define WD_AVR_RESET()          do{                              \

-                                    __asm__ __volatile__("cli"); \

-                                    WD_SET_UNSAFE(WD_RST);       \

-                                    while(1);                    \

-                                }while(0)

-

-/*set the watchdog-

-1. save SREG

-2. turn off irq's

-3. reset watchdog timer

-4. enable watchdog change

-5. write watchdog value

-6. restore SREG (restoring irq status)

-*/

-#define WD_SET(val,...)                                 \

-    __asm__ __volatile__(                               \

-        "in __tmp_reg__,__SREG__"           "\n\t"      \

-        "cli"                               "\n\t"      \

-        "wdr"                               "\n\t"      \

-        "sts %[wdreg],%[wden]"              "\n\t"      \

-        "sts %[wdreg],%[wdval]"             "\n\t"      \

-        "out __SREG__,__tmp_reg__"          "\n\t"      \

-        :                                               \

-        : [wdreg] "M" (&WDTCSR),                        \

-          [wden]  "r" ((uint8_t)(0x18)),                \

-          [wdval] "r" ((uint8_t)(val|(__VA_ARGS__+0)))  \

-        : "r0"                                          \

-)

-

-/*set the watchdog when I bit in SREG known to be clear-

-1. reset watchdog timer

-2. enable watchdog change

-5. write watchdog value

-*/

-#define WD_SET_UNSAFE(val,...)                          \

-    __asm__ __volatile__(                               \

-        "wdr"                               "\n\t"      \

-        "sts %[wdreg],%[wden]"              "\n\t"      \

-        "sts %[wdreg],%[wdval]"             "\n\t"      \

-        :                                               \

-        : [wdreg] "M" (&WDTCSR),                        \

-          [wden]  "r" ((uint8_t)(0x18)),                \

-          [wdval] "r" ((uint8_t)(val|(__VA_ARGS__+0)))  \

-)

-

-

-//for compatibility with avr/wdt.h

-#define wdt_enable(val) WD_SET(WD_RST,val)

-#define wdt_disable()   WD_SET(WD_OFF)

-

-

-#endif /* _AVR_WD_H_ */

+/* This is from http://www.mtcnet.net/~henryvm/wdt/ */
+#ifndef _AVR_WD_H_
+#define _AVR_WD_H_
+
+#include <avr/io.h>
+
+/*
+Copyright (c) 2009, Curt Van Maanen
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+
+include usage-
+    #include "wd.h"             //if in same directory as project
+    #include <avr/wd.h>         //if wd.h is in avr directory
+
+set watchdog modes and prescale
+
+usage-
+    WD_SET(mode,[timeout]);     //prescale always set
+
+modes-
+    WD_OFF                      disabled
+    WD_RST                      normal reset mode
+    WD_IRQ                      interrupt only mode (if supported)
+    WD_RST_IRQ                  interrupt+reset mode (if supported)
+
+timeout-
+    WDTO_15MS                   default if no timeout provided
+    WDTO_30MS
+    WDTO_60MS
+    WDTO_120MS
+    WDTO_250MS
+    WDTO_500MS
+    WDTO_1S
+    WDTO_2S
+    WDTO_4S                     (if supported)
+    WDTO_8S                     (if supported)
+
+examples-
+    WD_SET(WD_RST,WDTO_1S);     //reset mode, 1s timeout
+    WD_SET(WD_OFF);             //watchdog disabled (if not fused on)
+    WD_SET(WD_RST);             //reset mode, 15ms (default timeout)
+    WD_SET(WD_IRQ,WDTO_120MS);  //interrupt only mode, 120ms timeout
+    WD_SET(WD_RST_IRQ,WDTO_2S); //interrupt+reset mode, 2S timeout
+
+
+for enhanced watchdogs, if the watchdog is not being used WDRF should be
+cleared on every power up or reset, along with disabling the watchdog-
+    WD_DISABLE();               //clear WDRF, then turn off watchdog
+
+*/
+
+//reset registers to the same name (MCUCSR)
+#if !defined(MCUCSR)
+#define MCUCSR                  MCUSR
+#endif
+
+//watchdog registers to the same name (WDTCSR)
+#if !defined(WDTCSR)
+#define WDTCSR                  WDTCR
+#endif
+
+//if enhanced watchdog, define irq values, create disable macro
+#if defined(WDIF)
+#define WD_IRQ                  0xC0
+#define WD_RST_IRQ              0xC8
+#define WD_DISABLE()            do{                       \
+                                    MCUCSR &= ~(1<<WDRF); \
+                                    WD_SET(WD_OFF);       \
+                                }while(0)
+#endif
+
+//all watchdogs
+#define WD_RST                  8
+#define WD_OFF                  0
+
+//prescale values
+#define WDTO_15MS               0
+#define WDTO_30MS               1
+#define WDTO_60MS               2
+#define WDTO_120MS              3
+#define WDTO_250MS              4
+#define WDTO_500MS              5
+#define WDTO_1S                 6
+#define WDTO_2S                 7
+
+//prescale values for avrs with WDP3
+#if defined(WDP3)
+#define WDTO_4S                 0x20
+#define WDTO_8S                 0x21
+#endif
+
+//watchdog reset
+#define WDR()                   __asm__ __volatile__("wdr")
+
+//avr reset using watchdog
+#define WD_AVR_RESET()          do{                              \
+                                    __asm__ __volatile__("cli"); \
+                                    WD_SET_UNSAFE(WD_RST);       \
+                                    while(1);                    \
+                                }while(0)
+
+/*set the watchdog-
+1. save SREG
+2. turn off irq's
+3. reset watchdog timer
+4. enable watchdog change
+5. write watchdog value
+6. restore SREG (restoring irq status)
+*/
+#define WD_SET(val,...)                                 \
+    __asm__ __volatile__(                               \
+        "in __tmp_reg__,__SREG__"           "\n\t"      \
+        "cli"                               "\n\t"      \
+        "wdr"                               "\n\t"      \
+        "sts %[wdreg],%[wden]"              "\n\t"      \
+        "sts %[wdreg],%[wdval]"             "\n\t"      \
+        "out __SREG__,__tmp_reg__"          "\n\t"      \
+        :                                               \
+        : [wdreg] "M" (&WDTCSR),                        \
+          [wden]  "r" ((uint8_t)(0x18)),                \
+          [wdval] "r" ((uint8_t)(val|(__VA_ARGS__+0)))  \
+        : "r0"                                          \
+)
+
+/*set the watchdog when I bit in SREG known to be clear-
+1. reset watchdog timer
+2. enable watchdog change
+5. write watchdog value
+*/
+#define WD_SET_UNSAFE(val,...)                          \
+    __asm__ __volatile__(                               \
+        "wdr"                               "\n\t"      \
+        "sts %[wdreg],%[wden]"              "\n\t"      \
+        "sts %[wdreg],%[wdval]"             "\n\t"      \
+        :                                               \
+        : [wdreg] "M" (&WDTCSR),                        \
+          [wden]  "r" ((uint8_t)(0x18)),                \
+          [wdval] "r" ((uint8_t)(val|(__VA_ARGS__+0)))  \
+)
+
+
+//for compatibility with avr/wdt.h
+#define wdt_enable(val) WD_SET(WD_RST,val)
+#define wdt_disable()   WD_SET(WD_OFF)
+
+
+#endif /* _AVR_WD_H_ */
diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk
index 0eeace44ec..de0cc795f6 100644
--- a/tmk_core/protocol/lufa.mk
+++ b/tmk_core/protocol/lufa.mk
@@ -8,24 +8,33 @@ LUFA_PATH ?= $(LUFA_DIR)/LUFA-git
 ifneq (, $(wildcard $(TMK_PATH)/$(LUFA_PATH)/LUFA/Build/lufa_sources.mk))
     # New build system from 20120730
     LUFA_ROOT_PATH = $(LUFA_PATH)/LUFA
-    include $(TMK_PATH)/$(LUFA_PATH)/LUFA/Build/lufa_sources.mk 
+    include $(TMK_PATH)/$(LUFA_PATH)/LUFA/Build/lufa_sources.mk
 else
     include $(TMK_PATH)/$(LUFA_PATH)/LUFA/makefile
 endif
 
 LUFA_SRC = lufa.c \
 	   descriptor.c \
+	   outputselect.c \
 	   $(LUFA_SRC_USB)
 
 ifeq ($(strip $(MIDI_ENABLE)), yes)
 	include $(TMK_PATH)/protocol/midi.mk
 endif
 
+ifeq ($(strip $(ADAFRUIT_BLE_ENABLE)), yes)
+	LUFA_SRC += $(LUFA_DIR)/adafruit_ble.cpp
+endif
+
 ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
 	LUFA_SRC += $(LUFA_DIR)/bluetooth.c \
 	$(TMK_DIR)/protocol/serial_uart.c
 endif
 
+ifeq ($(strip $(VIRTSER_ENABLE)), yes)
+	LUFA_SRC += $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/CDCClassDevice.c
+endif
+
 SRC += $(LUFA_SRC)
 
 # Search Path
diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/CDC/asf.xml b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/CDC/asf.xml
index 72f3ff04c7..02e7063c66 100644
--- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/CDC/asf.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/CDC/asf.xml
@@ -1,161 +1,161 @@
-<asf xmlversion="1.0">

-	<project caption="CDC Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.128_4" force-caption="true" workspace-name="lufa_cdc_128kb_4kb_">

-		<require idref="lufa.bootloaders.cdc"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb1287"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x1F000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="CDC Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.64_4" force-caption="true" workspace-name="lufa_cdc_64kb_4kb_">

-		<require idref="lufa.bootloaders.cdc"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb647"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0xF000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="CDC Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.32_4" force-caption="true" workspace-name="lufa_cdc_32kb_4kb_">

-		<require idref="lufa.bootloaders.cdc"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega32u4"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="CDC Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.16_4" force-caption="true" workspace-name="lufa_cdc_16kb_4kb_">

-		<require idref="lufa.bootloaders.cdc"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega16u2"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x3000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="CDC Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.8_4" force-caption="true" workspace-name="lufa_cdc_8kb_4kb_">

-		<require idref="lufa.bootloaders.cdc"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega8u2"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x1000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<module type="application" id="lufa.bootloaders.cdc" caption="CDC Bootloader">

-		<info type="description" value="summary">

-		CDC Class Bootloader, capable of reprogramming a device using avrdude or other AVR109 protocol compliant software when plugged into a host.

-		</info>

-

- 		<info type="gui-flag" value="move-to-root"/>

-

-		<info type="keyword" value="Technology">

-			<keyword value="Bootloaders"/>

-			<keyword value="USB Device"/>

-		</info>

-

- 		<device-support-alias value="lufa_avr8"/>

-		<device-support-alias value="lufa_xmega"/>

-		<device-support-alias value="lufa_uc3"/>

-

-		<build type="include-path" value="."/>

-		<build type="c-source" value="BootloaderCDC.c"/>

-		<build type="header-file" value="BootloaderCDC.h"/>

-		<build type="c-source" value="Descriptors.c"/>

-		<build type="header-file" value="Descriptors.h"/>

-		<build type="c-source" value="BootloaderAPI.c"/>

-		<build type="header-file" value="BootloaderAPI.h"/>

-		<build type="asm-source" value="BootloaderAPITable.S"/>

-

-		<build type="module-config" subtype="path" value="Config"/>

-		<build type="header-file" value="Config/LUFAConfig.h"/>

-		<build type="header-file" value="Config/AppConfig.h"/>

-

-		<build type="distribute" subtype="user-file" value="doxyfile"/>

-		<build type="distribute" subtype="user-file" value="BootloaderCDC.txt"/>

-		<build type="distribute" subtype="user-file" value="LUFA CDC Bootloader.inf"/>

-

-		<require idref="lufa.common"/>

-		<require idref="lufa.platform"/>

-		<require idref="lufa.drivers.usb"/>

-		<require idref="lufa.drivers.board"/>

-		<require idref="lufa.drivers.board.leds"/>

-	</module>

-</asf>

+<asf xmlversion="1.0">
+	<project caption="CDC Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.128_4" force-caption="true" workspace-name="lufa_cdc_128kb_4kb_">
+		<require idref="lufa.bootloaders.cdc"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb1287"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x1F000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="CDC Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.64_4" force-caption="true" workspace-name="lufa_cdc_64kb_4kb_">
+		<require idref="lufa.bootloaders.cdc"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb647"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0xF000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="CDC Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.32_4" force-caption="true" workspace-name="lufa_cdc_32kb_4kb_">
+		<require idref="lufa.bootloaders.cdc"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega32u4"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="CDC Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.16_4" force-caption="true" workspace-name="lufa_cdc_16kb_4kb_">
+		<require idref="lufa.bootloaders.cdc"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega16u2"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x3000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="CDC Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.8_4" force-caption="true" workspace-name="lufa_cdc_8kb_4kb_">
+		<require idref="lufa.bootloaders.cdc"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega8u2"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x1000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<module type="application" id="lufa.bootloaders.cdc" caption="CDC Bootloader">
+		<info type="description" value="summary">
+		CDC Class Bootloader, capable of reprogramming a device using avrdude or other AVR109 protocol compliant software when plugged into a host.
+		</info>
+
+ 		<info type="gui-flag" value="move-to-root"/>
+
+		<info type="keyword" value="Technology">
+			<keyword value="Bootloaders"/>
+			<keyword value="USB Device"/>
+		</info>
+
+ 		<device-support-alias value="lufa_avr8"/>
+		<device-support-alias value="lufa_xmega"/>
+		<device-support-alias value="lufa_uc3"/>
+
+		<build type="include-path" value="."/>
+		<build type="c-source" value="BootloaderCDC.c"/>
+		<build type="header-file" value="BootloaderCDC.h"/>
+		<build type="c-source" value="Descriptors.c"/>
+		<build type="header-file" value="Descriptors.h"/>
+		<build type="c-source" value="BootloaderAPI.c"/>
+		<build type="header-file" value="BootloaderAPI.h"/>
+		<build type="asm-source" value="BootloaderAPITable.S"/>
+
+		<build type="module-config" subtype="path" value="Config"/>
+		<build type="header-file" value="Config/LUFAConfig.h"/>
+		<build type="header-file" value="Config/AppConfig.h"/>
+
+		<build type="distribute" subtype="user-file" value="doxyfile"/>
+		<build type="distribute" subtype="user-file" value="BootloaderCDC.txt"/>
+		<build type="distribute" subtype="user-file" value="LUFA CDC Bootloader.inf"/>
+
+		<require idref="lufa.common"/>
+		<require idref="lufa.platform"/>
+		<require idref="lufa.drivers.usb"/>
+		<require idref="lufa.drivers.board"/>
+		<require idref="lufa.drivers.board.leds"/>
+	</module>
+</asf>
diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/DFU/asf.xml b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/DFU/asf.xml
index 6f3312b764..f56aba69f5 100644
--- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/DFU/asf.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/DFU/asf.xml
@@ -1,156 +1,156 @@
-<asf xmlversion="1.0">

-	<project caption="DFU Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.128_4" force-caption="true" workspace-name="lufa_dfu_128kb_4kb_">

-		<require idref="lufa.bootloaders.dfu"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb1287"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x1F000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="DFU Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.64_4" force-caption="true" workspace-name="lufa_dfu_64kb_4kb_">

-		<require idref="lufa.bootloaders.dfu"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb647"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0xF000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="DFU Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.32_4" force-caption="true" workspace-name="lufa_dfu_32kb_4kb_">

-		<require idref="lufa.bootloaders.dfu"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega32u4"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="DFU Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.16_4" force-caption="true" workspace-name="lufa_dfu_16kb_4kb_">

-		<require idref="lufa.bootloaders.dfu"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega16u2"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x3000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="DFU Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.8_4" force-caption="true" workspace-name="lufa_dfu_8kb_4kb_">

-		<require idref="lufa.bootloaders.dfu"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega8u2"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x1000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<module type="application" id="lufa.bootloaders.dfu" caption="DFU Bootloader">

-		<info type="description" value="summary">

-		DFU Class Bootloader, capable of reprogramming a device using the Atmel FLIP or other AVR DFU programming software when plugged into a host.

-		</info>

-

- 		<info type="gui-flag" value="move-to-root"/>

-

-		<info type="keyword" value="Technology">

-			<keyword value="Bootloaders"/>

-			<keyword value="USB Device"/>

-		</info>

-

- 		<device-support-alias value="lufa_avr8"/>

-		<device-support-alias value="lufa_xmega"/>

-		<device-support-alias value="lufa_uc3"/>

-

-		<build type="include-path" value="."/>

-		<build type="c-source" value="BootloaderDFU.c"/>

-		<build type="header-file" value="BootloaderDFU.h"/>

-		<build type="c-source" value="Descriptors.c"/>

-		<build type="header-file" value="Descriptors.h"/>

-		<build type="c-source" value="BootloaderAPI.c"/>

-		<build type="header-file" value="BootloaderAPI.h"/>

-		<build type="asm-source" value="BootloaderAPITable.S"/>

-

-		<build type="module-config" subtype="path" value="Config"/>

-		<build type="header-file" value="Config/LUFAConfig.h"/>

-		<build type="header-file" value="Config/AppConfig.h"/>

-

-		<build type="distribute" subtype="user-file" value="doxyfile"/>

-		<build type="distribute" subtype="user-file" value="BootloaderDFU.txt"/>

-

-		<require idref="lufa.common"/>

-		<require idref="lufa.platform"/>

-		<require idref="lufa.drivers.usb"/>

-		<require idref="lufa.drivers.board"/>

-		<require idref="lufa.drivers.board.leds"/>

-	</module>

-</asf>

+<asf xmlversion="1.0">
+	<project caption="DFU Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.128_4" force-caption="true" workspace-name="lufa_dfu_128kb_4kb_">
+		<require idref="lufa.bootloaders.dfu"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb1287"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x1F000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="DFU Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.64_4" force-caption="true" workspace-name="lufa_dfu_64kb_4kb_">
+		<require idref="lufa.bootloaders.dfu"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb647"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0xF000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="DFU Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.32_4" force-caption="true" workspace-name="lufa_dfu_32kb_4kb_">
+		<require idref="lufa.bootloaders.dfu"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega32u4"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="DFU Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.16_4" force-caption="true" workspace-name="lufa_dfu_16kb_4kb_">
+		<require idref="lufa.bootloaders.dfu"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega16u2"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x3000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="DFU Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.8_4" force-caption="true" workspace-name="lufa_dfu_8kb_4kb_">
+		<require idref="lufa.bootloaders.dfu"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega8u2"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x1000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<module type="application" id="lufa.bootloaders.dfu" caption="DFU Bootloader">
+		<info type="description" value="summary">
+		DFU Class Bootloader, capable of reprogramming a device using the Atmel FLIP or other AVR DFU programming software when plugged into a host.
+		</info>
+
+ 		<info type="gui-flag" value="move-to-root"/>
+
+		<info type="keyword" value="Technology">
+			<keyword value="Bootloaders"/>
+			<keyword value="USB Device"/>
+		</info>
+
+ 		<device-support-alias value="lufa_avr8"/>
+		<device-support-alias value="lufa_xmega"/>
+		<device-support-alias value="lufa_uc3"/>
+
+		<build type="include-path" value="."/>
+		<build type="c-source" value="BootloaderDFU.c"/>
+		<build type="header-file" value="BootloaderDFU.h"/>
+		<build type="c-source" value="Descriptors.c"/>
+		<build type="header-file" value="Descriptors.h"/>
+		<build type="c-source" value="BootloaderAPI.c"/>
+		<build type="header-file" value="BootloaderAPI.h"/>
+		<build type="asm-source" value="BootloaderAPITable.S"/>
+
+		<build type="module-config" subtype="path" value="Config"/>
+		<build type="header-file" value="Config/LUFAConfig.h"/>
+		<build type="header-file" value="Config/AppConfig.h"/>
+
+		<build type="distribute" subtype="user-file" value="doxyfile"/>
+		<build type="distribute" subtype="user-file" value="BootloaderDFU.txt"/>
+
+		<require idref="lufa.common"/>
+		<require idref="lufa.platform"/>
+		<require idref="lufa.drivers.usb"/>
+		<require idref="lufa.drivers.board"/>
+		<require idref="lufa.drivers.board.leds"/>
+	</module>
+</asf>
diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/HID/asf.xml b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/HID/asf.xml
index 9394b13530..c67b9419ed 100644
--- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/HID/asf.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/HID/asf.xml
@@ -1,123 +1,123 @@
-<asf xmlversion="1.0">

-	<project caption="HID Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.128_4" force-caption="true" workspace-name="lufa_hid_128kb_4kb_">

-		<require idref="lufa.bootloaders.hid"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb1287"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x1F000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>

-	</project>

-

-	<project caption="HID Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.64_4" force-caption="true" workspace-name="lufa_hid_64kb_4kb_">

-		<require idref="lufa.bootloaders.hid"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb647"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0xF000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>

-	</project>

-

-	<project caption="HID Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.32_4" force-caption="true" workspace-name="lufa_hid_32kb_4kb_">

-		<require idref="lufa.bootloaders.hid"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega32u4"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>

-	</project>

-

-	<project caption="HID Bootloader - 16KB FLASH / 2KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.16_2" force-caption="true" workspace-name="lufa_hid_16kb_2kb_">

-		<require idref="lufa.bootloaders.hid"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega16u2"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x3800"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3800"/>

-	</project>

-

-	<project caption="HID Bootloader - 8KB FLASH / 2KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.8_2" force-caption="true" workspace-name="lufa_hid_8kb_2kb_">

-		<require idref="lufa.bootloaders.hid"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega8u2"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x1800"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1800"/>

-	</project>

-

-	<module type="application" id="lufa.bootloaders.hid" caption="HID Bootloader">

-		<info type="description" value="summary">

-		HID Class Bootloader, capable of reprogramming a device via a custom cross-platform command line utility when plugged into a host.

-		</info>

-

- 		<info type="gui-flag" value="move-to-root"/>

-

-		<info type="keyword" value="Technology">

-			<keyword value="Bootloaders"/>

-			<keyword value="USB Device"/>

-		</info>

-

-		<device-support-alias value="lufa_avr8"/>

-		<device-support-alias value="lufa_xmega"/>

-		<device-support-alias value="lufa_uc3"/>

-

-		<build type="include-path" value="."/>

-		<build type="c-source" value="BootloaderHID.c"/>

-		<build type="header-file" value="BootloaderHID.h"/>

-		<build type="c-source" value="Descriptors.c"/>

-		<build type="header-file" value="Descriptors.h"/>

-

-		<build type="module-config" subtype="path" value="Config"/>

-		<build type="header-file" value="Config/LUFAConfig.h"/>

-

-		<build type="distribute" subtype="user-file" value="doxyfile"/>

-		<build type="distribute" subtype="user-file" value="BootloaderHID.txt"/>

-		<build type="distribute" subtype="directory" value="HostLoaderApp"/>

-		<build type="distribute" subtype="directory" value="HostLoaderApp_Python"/>

-

-		<require idref="lufa.common"/>

-		<require idref="lufa.platform"/>

-		<require idref="lufa.drivers.usb"/>

-		<require idref="lufa.drivers.board"/>

-		<require idref="lufa.drivers.board.leds"/>

-	</module>

-</asf>

+<asf xmlversion="1.0">
+	<project caption="HID Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.128_4" force-caption="true" workspace-name="lufa_hid_128kb_4kb_">
+		<require idref="lufa.bootloaders.hid"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb1287"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x1F000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>
+	</project>
+
+	<project caption="HID Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.64_4" force-caption="true" workspace-name="lufa_hid_64kb_4kb_">
+		<require idref="lufa.bootloaders.hid"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb647"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0xF000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>
+	</project>
+
+	<project caption="HID Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.32_4" force-caption="true" workspace-name="lufa_hid_32kb_4kb_">
+		<require idref="lufa.bootloaders.hid"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega32u4"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>
+	</project>
+
+	<project caption="HID Bootloader - 16KB FLASH / 2KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.16_2" force-caption="true" workspace-name="lufa_hid_16kb_2kb_">
+		<require idref="lufa.bootloaders.hid"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega16u2"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x3800"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3800"/>
+	</project>
+
+	<project caption="HID Bootloader - 8KB FLASH / 2KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.8_2" force-caption="true" workspace-name="lufa_hid_8kb_2kb_">
+		<require idref="lufa.bootloaders.hid"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega8u2"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x1800"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1800"/>
+	</project>
+
+	<module type="application" id="lufa.bootloaders.hid" caption="HID Bootloader">
+		<info type="description" value="summary">
+		HID Class Bootloader, capable of reprogramming a device via a custom cross-platform command line utility when plugged into a host.
+		</info>
+
+ 		<info type="gui-flag" value="move-to-root"/>
+
+		<info type="keyword" value="Technology">
+			<keyword value="Bootloaders"/>
+			<keyword value="USB Device"/>
+		</info>
+
+		<device-support-alias value="lufa_avr8"/>
+		<device-support-alias value="lufa_xmega"/>
+		<device-support-alias value="lufa_uc3"/>
+
+		<build type="include-path" value="."/>
+		<build type="c-source" value="BootloaderHID.c"/>
+		<build type="header-file" value="BootloaderHID.h"/>
+		<build type="c-source" value="Descriptors.c"/>
+		<build type="header-file" value="Descriptors.h"/>
+
+		<build type="module-config" subtype="path" value="Config"/>
+		<build type="header-file" value="Config/LUFAConfig.h"/>
+
+		<build type="distribute" subtype="user-file" value="doxyfile"/>
+		<build type="distribute" subtype="user-file" value="BootloaderHID.txt"/>
+		<build type="distribute" subtype="directory" value="HostLoaderApp"/>
+		<build type="distribute" subtype="directory" value="HostLoaderApp_Python"/>
+
+		<require idref="lufa.common"/>
+		<require idref="lufa.platform"/>
+		<require idref="lufa.drivers.usb"/>
+		<require idref="lufa.drivers.board"/>
+		<require idref="lufa.drivers.board.leds"/>
+	</module>
+</asf>
diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/BootloaderAPITable.S b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/BootloaderAPITable.S
index 6844d4b01c..91fc949666 100644
--- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/BootloaderAPITable.S
+++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/BootloaderAPITable.S
@@ -1,102 +1,102 @@
-/*

-             LUFA Library

-     Copyright (C) Dean Camera, 2014.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

-*/

-

-/*

-  Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com)

-

-  Permission to use, copy, modify, distribute, and sell this

-  software and its documentation for any purpose is hereby granted

-  without fee, provided that the above copyright notice appear in

-  all copies and that both that the copyright notice and this

-  permission notice and warranty disclaimer appear in supporting

-  documentation, and that the name of the author not be used in

-  advertising or publicity pertaining to distribution of the

-  software without specific, written prior permission.

-

-  The author disclaims all warranties with regard to this

-  software, including all implied warranties of merchantability

-  and fitness.  In no event shall the author be liable for any

-  special, indirect or consequential damages or any damages

-  whatsoever resulting from loss of use, data or profits, whether

-  in an action of contract, negligence or other tortious action,

-  arising out of or in connection with the use or performance of

-  this software.

-*/

-

-#if AUX_BOOT_SECTION_SIZE > 0

-#warning Using a AUX bootloader section in addition to the defined bootloader space (see documentation).

-

-; Trampoline to jump over the AUX bootloader section to the start of the bootloader,

-; on devices where an AUX bootloader section is used.

-.section .boot_aux_trampoline, "ax"

-.global Boot_AUX_Trampoline

-Boot_AUX_Trampoline:

-	jmp BOOT_START_ADDR

-#endif

-

-; Trampolines to actual API implementations if the target address is outside the

-; range of a rjmp instruction (can happen with large bootloader sections)

-.section .apitable_trampolines, "ax"

-.global BootloaderAPI_Trampolines

-BootloaderAPI_Trampolines:

-

-	BootloaderAPI_ErasePage_Trampoline:

-		jmp BootloaderAPI_ErasePage

-	BootloaderAPI_WritePage_Trampoline:

-		jmp BootloaderAPI_WritePage

-	BootloaderAPI_FillWord_Trampoline:

-		jmp BootloaderAPI_FillWord

-	BootloaderAPI_ReadSignature_Trampoline:

-		jmp BootloaderAPI_ReadSignature

-	BootloaderAPI_ReadFuse_Trampoline:

-		jmp BootloaderAPI_ReadFuse

-	BootloaderAPI_ReadLock_Trampoline:

-		jmp BootloaderAPI_ReadLock

-	BootloaderAPI_WriteLock_Trampoline:

-		jmp BootloaderAPI_WriteLock

-	BootloaderAPI_UNUSED1:

-		ret

-	BootloaderAPI_UNUSED2:

-		ret

-	BootloaderAPI_UNUSED3:

-		ret

-	BootloaderAPI_UNUSED4:

-		ret

-	BootloaderAPI_UNUSED5:

-		ret

-

-

-

-; API function jump table

-.section .apitable_jumptable, "ax"

-.global BootloaderAPI_JumpTable

-BootloaderAPI_JumpTable:

-

-	rjmp BootloaderAPI_ErasePage_Trampoline

-	rjmp BootloaderAPI_WritePage_Trampoline

-	rjmp BootloaderAPI_FillWord_Trampoline

-	rjmp BootloaderAPI_ReadSignature_Trampoline

-	rjmp BootloaderAPI_ReadFuse_Trampoline

-	rjmp BootloaderAPI_ReadLock_Trampoline

-	rjmp BootloaderAPI_WriteLock_Trampoline

-	rjmp BootloaderAPI_UNUSED1 ; UNUSED ENTRY 1

-	rjmp BootloaderAPI_UNUSED2 ; UNUSED ENTRY 2

-	rjmp BootloaderAPI_UNUSED3 ; UNUSED ENTRY 3

-	rjmp BootloaderAPI_UNUSED4 ; UNUSED ENTRY 4

-	rjmp BootloaderAPI_UNUSED5 ; UNUSED ENTRY 5

-

-

-

-; Bootloader table signatures and information

-.section .apitable_signatures, "ax"

-.global BootloaderAPI_Signatures

-BootloaderAPI_Signatures:

-

-	.long BOOT_START_ADDR ; Start address of the bootloader

-	.word 0xDF30 ; Signature for the MS class bootloader, V1

-	.word 0xDCFB ; Signature for a LUFA class bootloader

+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2014.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#if AUX_BOOT_SECTION_SIZE > 0
+#warning Using a AUX bootloader section in addition to the defined bootloader space (see documentation).
+
+; Trampoline to jump over the AUX bootloader section to the start of the bootloader,
+; on devices where an AUX bootloader section is used.
+.section .boot_aux_trampoline, "ax"
+.global Boot_AUX_Trampoline
+Boot_AUX_Trampoline:
+	jmp BOOT_START_ADDR
+#endif
+
+; Trampolines to actual API implementations if the target address is outside the
+; range of a rjmp instruction (can happen with large bootloader sections)
+.section .apitable_trampolines, "ax"
+.global BootloaderAPI_Trampolines
+BootloaderAPI_Trampolines:
+
+	BootloaderAPI_ErasePage_Trampoline:
+		jmp BootloaderAPI_ErasePage
+	BootloaderAPI_WritePage_Trampoline:
+		jmp BootloaderAPI_WritePage
+	BootloaderAPI_FillWord_Trampoline:
+		jmp BootloaderAPI_FillWord
+	BootloaderAPI_ReadSignature_Trampoline:
+		jmp BootloaderAPI_ReadSignature
+	BootloaderAPI_ReadFuse_Trampoline:
+		jmp BootloaderAPI_ReadFuse
+	BootloaderAPI_ReadLock_Trampoline:
+		jmp BootloaderAPI_ReadLock
+	BootloaderAPI_WriteLock_Trampoline:
+		jmp BootloaderAPI_WriteLock
+	BootloaderAPI_UNUSED1:
+		ret
+	BootloaderAPI_UNUSED2:
+		ret
+	BootloaderAPI_UNUSED3:
+		ret
+	BootloaderAPI_UNUSED4:
+		ret
+	BootloaderAPI_UNUSED5:
+		ret
+
+
+
+; API function jump table
+.section .apitable_jumptable, "ax"
+.global BootloaderAPI_JumpTable
+BootloaderAPI_JumpTable:
+
+	rjmp BootloaderAPI_ErasePage_Trampoline
+	rjmp BootloaderAPI_WritePage_Trampoline
+	rjmp BootloaderAPI_FillWord_Trampoline
+	rjmp BootloaderAPI_ReadSignature_Trampoline
+	rjmp BootloaderAPI_ReadFuse_Trampoline
+	rjmp BootloaderAPI_ReadLock_Trampoline
+	rjmp BootloaderAPI_WriteLock_Trampoline
+	rjmp BootloaderAPI_UNUSED1 ; UNUSED ENTRY 1
+	rjmp BootloaderAPI_UNUSED2 ; UNUSED ENTRY 2
+	rjmp BootloaderAPI_UNUSED3 ; UNUSED ENTRY 3
+	rjmp BootloaderAPI_UNUSED4 ; UNUSED ENTRY 4
+	rjmp BootloaderAPI_UNUSED5 ; UNUSED ENTRY 5
+
+
+
+; Bootloader table signatures and information
+.section .apitable_signatures, "ax"
+.global BootloaderAPI_Signatures
+BootloaderAPI_Signatures:
+
+	.long BOOT_START_ADDR ; Start address of the bootloader
+	.word 0xDF30 ; Signature for the MS class bootloader, V1
+	.word 0xDCFB ; Signature for a LUFA class bootloader
diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/asf.xml b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/asf.xml
index f1d550d1eb..700ffa26ff 100644
--- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/asf.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/asf.xml
@@ -1,156 +1,156 @@
-<asf xmlversion="1.0">

-	<project caption="Mass Storage Bootloader - 128KB FLASH / 8KB Boot - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.128_8" force-caption="true" workspace-name="lufa_ms_128kb_8kb_">

-		<require idref="lufa.bootloaders.mass_storage"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb1287"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x1E000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1E000"/>

-

-		<build type="define" name="AUX_BOOT_SECTION_SIZE" value="0"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="Mass Storage Bootloader - 64KB FLASH / 8KB Boot - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.64_8" force-caption="true" workspace-name="lufa_ms_64kb_8kb_">

-		<require idref="lufa.bootloaders.mass_storage"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb647"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0xE000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0xE000"/>

-

-		<build type="define" name="AUX_BOOT_SECTION_SIZE" value="0"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="Mass Storage Bootloader - 32KB FLASH / 4KB Boot (2KB AUX) - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.32_4" force-caption="true" workspace-name="lufa_ms_32kb_4kb_">

-		<require idref="lufa.bootloaders.mass_storage"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega32u4"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>

-

-		<build type="define" name="AUX_BOOT_SECTION_SIZE" value="2048"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.boot_aux=0x6810"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.boot_aux_trampoline=0x6800"/>

-		<build type="linker-config" subtype="flags" value="--undefined=Boot_AUX_Trampoline"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="Mass Storage Bootloader - 16KB FLASH / 4KB Boot (2KB AUX) - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.16_4" force-caption="true" workspace-name="lufa_ms_16kb_4kb_">

-		<require idref="lufa.bootloaders.mass_storage"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega16u2"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x3000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>

-

-		<build type="define" name="AUX_BOOT_SECTION_SIZE" value="2048"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.boot_aux=0x2810"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.boot_aux_trampoline=0x2800"/>

-		<build type="linker-config" subtype="flags" value="--undefined=Boot_AUX_Trampoline"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<module type="application" id="lufa.bootloaders.mass_storage" caption="Mass Storage Bootloader">

-		<info type="description" value="summary">

-		Mass Storage Class Bootloader, capable of reprogramming a device via binary BIN files copied to the virtual FAT12 file-system it creates when plugged into a host.

-		</info>

-

- 		<info type="gui-flag" value="move-to-root"/>

-

-		<info type="keyword" value="Technology">

-			<keyword value="Bootloaders"/>

-			<keyword value="USB Device"/>

-		</info>

-

-		<device-support-alias value="lufa_avr8"/>

-		<device-support-alias value="lufa_xmega"/>

-		<device-support-alias value="lufa_uc3"/>

-

-		<build type="include-path" value="."/>

-		<build type="c-source" value="BootloaderMassStorage.c"/>

-		<build type="header-file" value="BootloaderMassStorage.h"/>

-		<build type="c-source" value="Descriptors.c"/>

-		<build type="header-file" value="Descriptors.h"/>

-		<build type="c-source" value="BootloaderAPI.c"/>

-		<build type="header-file" value="BootloaderAPI.h"/>

-		<build type="asm-source" value="BootloaderAPITable.S"/>

-

-		<build type="module-config" subtype="path" value="Config"/>

-		<build type="header-file" value="Config/LUFAConfig.h"/>

-		<build type="header-file" value="Config/AppConfig.h"/>

-

-		<build type="include-path" value="Lib"/>

-		<build type="header-file" value="Lib/VirtualFAT.h"/>

-		<build type="c-source" value="Lib/VirtualFAT.c"/>

-		<build type="header-file" value="Lib/SCSI.h"/>

-		<build type="c-source" value="Lib/SCSI.c"/>

-

-		<build type="distribute" subtype="user-file" value="doxyfile"/>

-		<build type="distribute" subtype="user-file" value="BootloaderMassStorage.txt"/>

-

-		<require idref="lufa.common"/>

-		<require idref="lufa.platform"/>

-		<require idref="lufa.drivers.usb"/>

-		<require idref="lufa.drivers.board"/>

-		<require idref="lufa.drivers.board.leds"/>

-	</module>

-</asf>

+<asf xmlversion="1.0">
+	<project caption="Mass Storage Bootloader - 128KB FLASH / 8KB Boot - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.128_8" force-caption="true" workspace-name="lufa_ms_128kb_8kb_">
+		<require idref="lufa.bootloaders.mass_storage"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb1287"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x1E000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1E000"/>
+
+		<build type="define" name="AUX_BOOT_SECTION_SIZE" value="0"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="Mass Storage Bootloader - 64KB FLASH / 8KB Boot - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.64_8" force-caption="true" workspace-name="lufa_ms_64kb_8kb_">
+		<require idref="lufa.bootloaders.mass_storage"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb647"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0xE000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0xE000"/>
+
+		<build type="define" name="AUX_BOOT_SECTION_SIZE" value="0"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="Mass Storage Bootloader - 32KB FLASH / 4KB Boot (2KB AUX) - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.32_4" force-caption="true" workspace-name="lufa_ms_32kb_4kb_">
+		<require idref="lufa.bootloaders.mass_storage"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega32u4"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>
+
+		<build type="define" name="AUX_BOOT_SECTION_SIZE" value="2048"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.boot_aux=0x6810"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.boot_aux_trampoline=0x6800"/>
+		<build type="linker-config" subtype="flags" value="--undefined=Boot_AUX_Trampoline"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="Mass Storage Bootloader - 16KB FLASH / 4KB Boot (2KB AUX) - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.16_4" force-caption="true" workspace-name="lufa_ms_16kb_4kb_">
+		<require idref="lufa.bootloaders.mass_storage"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega16u2"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x3000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>
+
+		<build type="define" name="AUX_BOOT_SECTION_SIZE" value="2048"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.boot_aux=0x2810"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.boot_aux_trampoline=0x2800"/>
+		<build type="linker-config" subtype="flags" value="--undefined=Boot_AUX_Trampoline"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<module type="application" id="lufa.bootloaders.mass_storage" caption="Mass Storage Bootloader">
+		<info type="description" value="summary">
+		Mass Storage Class Bootloader, capable of reprogramming a device via binary BIN files copied to the virtual FAT12 file-system it creates when plugged into a host.
+		</info>
+
+ 		<info type="gui-flag" value="move-to-root"/>
+
+		<info type="keyword" value="Technology">
+			<keyword value="Bootloaders"/>
+			<keyword value="USB Device"/>
+		</info>
+
+		<device-support-alias value="lufa_avr8"/>
+		<device-support-alias value="lufa_xmega"/>
+		<device-support-alias value="lufa_uc3"/>
+
+		<build type="include-path" value="."/>
+		<build type="c-source" value="BootloaderMassStorage.c"/>
+		<build type="header-file" value="BootloaderMassStorage.h"/>
+		<build type="c-source" value="Descriptors.c"/>
+		<build type="header-file" value="Descriptors.h"/>
+		<build type="c-source" value="BootloaderAPI.c"/>
+		<build type="header-file" value="BootloaderAPI.h"/>
+		<build type="asm-source" value="BootloaderAPITable.S"/>
+
+		<build type="module-config" subtype="path" value="Config"/>
+		<build type="header-file" value="Config/LUFAConfig.h"/>
+		<build type="header-file" value="Config/AppConfig.h"/>
+
+		<build type="include-path" value="Lib"/>
+		<build type="header-file" value="Lib/VirtualFAT.h"/>
+		<build type="c-source" value="Lib/VirtualFAT.c"/>
+		<build type="header-file" value="Lib/SCSI.h"/>
+		<build type="c-source" value="Lib/SCSI.c"/>
+
+		<build type="distribute" subtype="user-file" value="doxyfile"/>
+		<build type="distribute" subtype="user-file" value="BootloaderMassStorage.txt"/>
+
+		<require idref="lufa.common"/>
+		<require idref="lufa.platform"/>
+		<require idref="lufa.drivers.usb"/>
+		<require idref="lufa.drivers.board"/>
+		<require idref="lufa.drivers.board.leds"/>
+	</module>
+</asf>
diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/makefile b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/makefile
index 91bb4038e8..a0edb2c4f5 100644
--- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/makefile
+++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/makefile
@@ -1,68 +1,68 @@
-#

-#             LUFA Library

-#     Copyright (C) Dean Camera, 2014.

-#

-#  dean [at] fourwalledcubicle [dot] com

-#           www.lufa-lib.org

-#

-# --------------------------------------

-#         LUFA Project Makefile.

-# --------------------------------------

-

-# Run "make help" for target help.

-

-MCU          = at90usb1287

-ARCH         = AVR8

-BOARD        = USBKEY

-F_CPU        = 8000000

-F_USB        = $(F_CPU)

-OPTIMIZATION = s

-TARGET       = BootloaderMassStorage

-SRC          = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S Lib/SCSI.c Lib/VirtualFAT.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)

-LUFA_PATH    = ../../LUFA

-CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START_OFFSET)

-LD_FLAGS     = -Wl,--section-start=.text=$(BOOT_START_OFFSET) $(BOOT_API_LD_FLAGS)

-

-# Flash size and bootloader section sizes of the target, in KB. These must

-# match the target's total FLASH size and the bootloader size set in the

-# device's fuses.

-FLASH_SIZE_KB         = 128

-BOOT_SECTION_SIZE_KB  = 8

-

-# Bootloader address calculation formulas

-# Do not modify these macros, but rather modify the dependent values above.

-CALC_ADDRESS_IN_HEX   = $(shell printf "0x%X" $$(( $(1) )) )

-BOOT_START_OFFSET     = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024 )

-BOOT_SEC_OFFSET       = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) * 1024) - ($(strip $(1))) )

-

-# Bootloader linker section flags for relocating the API table sections to

-# known FLASH addresses - these should not normally be user-edited.

-BOOT_SECTION_LD_FLAG  = -Wl,--section-start=$(strip $(1))=$(call BOOT_SEC_OFFSET, $(3)) -Wl,--undefined=$(strip $(2))

-BOOT_API_LD_FLAGS     = $(call BOOT_SECTION_LD_FLAG, .apitable_trampolines, BootloaderAPI_Trampolines, 96)

-BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_jumptable,   BootloaderAPI_JumpTable,   32)

-BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_signatures,  BootloaderAPI_Signatures,  8)

-

-# Check if the bootloader needs an AUX section, located before the real bootloader section to store some of the

-# bootloader code. This is required for 32KB and smaller devices, where the actual bootloader is 6KB but the maximum

-# bootloader section size is 4KB. The actual usable application space will be reduced by 6KB for these devices.

-ifeq ($(BOOT_SECTION_SIZE_KB),8)

-  CC_FLAGS           += -DAUX_BOOT_SECTION_SIZE=0

-else

-  AUX_BOOT_SECTION_SIZE_KB = (6 - $(BOOT_SECTION_SIZE_KB))

-

-  CC_FLAGS           += -DAUX_BOOT_SECTION_SIZE='($(AUX_BOOT_SECTION_SIZE_KB) * 1024)'

-  LD_FLAGS           += -Wl,--section-start=.boot_aux=$(call BOOT_SEC_OFFSET, (($(BOOT_SECTION_SIZE_KB) + $(AUX_BOOT_SECTION_SIZE_KB)) * 1024 - 16))

-  LD_FLAGS           += $(call BOOT_SECTION_LD_FLAG, .boot_aux_trampoline, Boot_AUX_Trampoline, ($(BOOT_SECTION_SIZE_KB) + $(AUX_BOOT_SECTION_SIZE_KB)) * 1024)

-endif

-

-# Default target

-all:

-

-# Include LUFA build script makefiles

-include $(LUFA_PATH)/Build/lufa_core.mk

-include $(LUFA_PATH)/Build/lufa_sources.mk

-include $(LUFA_PATH)/Build/lufa_build.mk

-include $(LUFA_PATH)/Build/lufa_cppcheck.mk

-include $(LUFA_PATH)/Build/lufa_doxygen.mk

-include $(LUFA_PATH)/Build/lufa_avrdude.mk

-include $(LUFA_PATH)/Build/lufa_atprogram.mk

+#
+#             LUFA Library
+#     Copyright (C) Dean Camera, 2014.
+#
+#  dean [at] fourwalledcubicle [dot] com
+#           www.lufa-lib.org
+#
+# --------------------------------------
+#         LUFA Project Makefile.
+# --------------------------------------
+
+# Run "make help" for target help.
+
+MCU          = at90usb1287
+ARCH         = AVR8
+BOARD        = USBKEY
+F_CPU        = 8000000
+F_USB        = $(F_CPU)
+OPTIMIZATION = s
+TARGET       = BootloaderMassStorage
+SRC          = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S Lib/SCSI.c Lib/VirtualFAT.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)
+LUFA_PATH    = ../../LUFA
+CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START_OFFSET)
+LD_FLAGS     = -Wl,--section-start=.text=$(BOOT_START_OFFSET) $(BOOT_API_LD_FLAGS)
+
+# Flash size and bootloader section sizes of the target, in KB. These must
+# match the target's total FLASH size and the bootloader size set in the
+# device's fuses.
+FLASH_SIZE_KB         = 128
+BOOT_SECTION_SIZE_KB  = 8
+
+# Bootloader address calculation formulas
+# Do not modify these macros, but rather modify the dependent values above.
+CALC_ADDRESS_IN_HEX   = $(shell printf "0x%X" $$(( $(1) )) )
+BOOT_START_OFFSET     = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024 )
+BOOT_SEC_OFFSET       = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) * 1024) - ($(strip $(1))) )
+
+# Bootloader linker section flags for relocating the API table sections to
+# known FLASH addresses - these should not normally be user-edited.
+BOOT_SECTION_LD_FLAG  = -Wl,--section-start=$(strip $(1))=$(call BOOT_SEC_OFFSET, $(3)) -Wl,--undefined=$(strip $(2))
+BOOT_API_LD_FLAGS     = $(call BOOT_SECTION_LD_FLAG, .apitable_trampolines, BootloaderAPI_Trampolines, 96)
+BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_jumptable,   BootloaderAPI_JumpTable,   32)
+BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_signatures,  BootloaderAPI_Signatures,  8)
+
+# Check if the bootloader needs an AUX section, located before the real bootloader section to store some of the
+# bootloader code. This is required for 32KB and smaller devices, where the actual bootloader is 6KB but the maximum
+# bootloader section size is 4KB. The actual usable application space will be reduced by 6KB for these devices.
+ifeq ($(BOOT_SECTION_SIZE_KB),8)
+  CC_FLAGS           += -DAUX_BOOT_SECTION_SIZE=0
+else
+  AUX_BOOT_SECTION_SIZE_KB = (6 - $(BOOT_SECTION_SIZE_KB))
+
+  CC_FLAGS           += -DAUX_BOOT_SECTION_SIZE='($(AUX_BOOT_SECTION_SIZE_KB) * 1024)'
+  LD_FLAGS           += -Wl,--section-start=.boot_aux=$(call BOOT_SEC_OFFSET, (($(BOOT_SECTION_SIZE_KB) + $(AUX_BOOT_SECTION_SIZE_KB)) * 1024 - 16))
+  LD_FLAGS           += $(call BOOT_SECTION_LD_FLAG, .boot_aux_trampoline, Boot_AUX_Trampoline, ($(BOOT_SECTION_SIZE_KB) + $(AUX_BOOT_SECTION_SIZE_KB)) * 1024)
+endif
+
+# Default target
+all:
+
+# Include LUFA build script makefiles
+include $(LUFA_PATH)/Build/lufa_core.mk
+include $(LUFA_PATH)/Build/lufa_sources.mk
+include $(LUFA_PATH)/Build/lufa_build.mk
+include $(LUFA_PATH)/Build/lufa_cppcheck.mk
+include $(LUFA_PATH)/Build/lufa_doxygen.mk
+include $(LUFA_PATH)/Build/lufa_avrdude.mk
+include $(LUFA_PATH)/Build/lufa_atprogram.mk
diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/BootloaderAPITable.S b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/BootloaderAPITable.S
index ec499b74e5..88c51da825 100644
--- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/BootloaderAPITable.S
+++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/BootloaderAPITable.S
@@ -1,91 +1,91 @@
-/*

-             LUFA Library

-     Copyright (C) Dean Camera, 2014.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

-*/

-

-/*

-  Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com)

-

-  Permission to use, copy, modify, distribute, and sell this

-  software and its documentation for any purpose is hereby granted

-  without fee, provided that the above copyright notice appear in

-  all copies and that both that the copyright notice and this

-  permission notice and warranty disclaimer appear in supporting

-  documentation, and that the name of the author not be used in

-  advertising or publicity pertaining to distribution of the

-  software without specific, written prior permission.

-

-  The author disclaims all warranties with regard to this

-  software, including all implied warranties of merchantability

-  and fitness.  In no event shall the author be liable for any

-  special, indirect or consequential damages or any damages

-  whatsoever resulting from loss of use, data or profits, whether

-  in an action of contract, negligence or other tortious action,

-  arising out of or in connection with the use or performance of

-  this software.

-*/

-

-; Trampolines to actual API implementations if the target address is outside the

-; range of a rjmp instruction (can happen with large bootloader sections)

-.section .apitable_trampolines, "ax"

-.global BootloaderAPI_Trampolines

-BootloaderAPI_Trampolines:

-

-	BootloaderAPI_ErasePage_Trampoline:

-		jmp BootloaderAPI_ErasePage

-	BootloaderAPI_WritePage_Trampoline:

-		jmp BootloaderAPI_WritePage

-	BootloaderAPI_FillWord_Trampoline:

-		jmp BootloaderAPI_FillWord

-	BootloaderAPI_ReadSignature_Trampoline:

-		jmp BootloaderAPI_ReadSignature

-	BootloaderAPI_ReadFuse_Trampoline:

-		jmp BootloaderAPI_ReadFuse

-	BootloaderAPI_ReadLock_Trampoline:

-		jmp BootloaderAPI_ReadLock

-	BootloaderAPI_WriteLock_Trampoline:

-		jmp BootloaderAPI_WriteLock

-	BootloaderAPI_UNUSED1:

-		ret

-	BootloaderAPI_UNUSED2:

-		ret

-	BootloaderAPI_UNUSED3:

-		ret

-	BootloaderAPI_UNUSED4:

-		ret

-	BootloaderAPI_UNUSED5:

-		ret

-

-

-

-; API function jump table

-.section .apitable_jumptable, "ax"

-.global BootloaderAPI_JumpTable

-BootloaderAPI_JumpTable:

-

-	rjmp BootloaderAPI_ErasePage_Trampoline

-	rjmp BootloaderAPI_WritePage_Trampoline

-	rjmp BootloaderAPI_FillWord_Trampoline

-	rjmp BootloaderAPI_ReadSignature_Trampoline

-	rjmp BootloaderAPI_ReadFuse_Trampoline

-	rjmp BootloaderAPI_ReadLock_Trampoline

-	rjmp BootloaderAPI_WriteLock_Trampoline

-	rjmp BootloaderAPI_UNUSED1 ; UNUSED ENTRY 1

-	rjmp BootloaderAPI_UNUSED2 ; UNUSED ENTRY 2

-	rjmp BootloaderAPI_UNUSED3 ; UNUSED ENTRY 3

-	rjmp BootloaderAPI_UNUSED4 ; UNUSED ENTRY 4

-	rjmp BootloaderAPI_UNUSED5 ; UNUSED ENTRY 5

-

-

-

-; Bootloader table signatures and information

-.section .apitable_signatures, "ax"

-.global BootloaderAPI_Signatures

-BootloaderAPI_Signatures:

-

-	.long BOOT_START_ADDR ; Start address of the bootloader

-	.word 0xDF20 ; Signature for the Printer class bootloader

-	.word 0xDCFB ; Signature for a LUFA class bootloader

+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2014.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+; Trampolines to actual API implementations if the target address is outside the
+; range of a rjmp instruction (can happen with large bootloader sections)
+.section .apitable_trampolines, "ax"
+.global BootloaderAPI_Trampolines
+BootloaderAPI_Trampolines:
+
+	BootloaderAPI_ErasePage_Trampoline:
+		jmp BootloaderAPI_ErasePage
+	BootloaderAPI_WritePage_Trampoline:
+		jmp BootloaderAPI_WritePage
+	BootloaderAPI_FillWord_Trampoline:
+		jmp BootloaderAPI_FillWord
+	BootloaderAPI_ReadSignature_Trampoline:
+		jmp BootloaderAPI_ReadSignature
+	BootloaderAPI_ReadFuse_Trampoline:
+		jmp BootloaderAPI_ReadFuse
+	BootloaderAPI_ReadLock_Trampoline:
+		jmp BootloaderAPI_ReadLock
+	BootloaderAPI_WriteLock_Trampoline:
+		jmp BootloaderAPI_WriteLock
+	BootloaderAPI_UNUSED1:
+		ret
+	BootloaderAPI_UNUSED2:
+		ret
+	BootloaderAPI_UNUSED3:
+		ret
+	BootloaderAPI_UNUSED4:
+		ret
+	BootloaderAPI_UNUSED5:
+		ret
+
+
+
+; API function jump table
+.section .apitable_jumptable, "ax"
+.global BootloaderAPI_JumpTable
+BootloaderAPI_JumpTable:
+
+	rjmp BootloaderAPI_ErasePage_Trampoline
+	rjmp BootloaderAPI_WritePage_Trampoline
+	rjmp BootloaderAPI_FillWord_Trampoline
+	rjmp BootloaderAPI_ReadSignature_Trampoline
+	rjmp BootloaderAPI_ReadFuse_Trampoline
+	rjmp BootloaderAPI_ReadLock_Trampoline
+	rjmp BootloaderAPI_WriteLock_Trampoline
+	rjmp BootloaderAPI_UNUSED1 ; UNUSED ENTRY 1
+	rjmp BootloaderAPI_UNUSED2 ; UNUSED ENTRY 2
+	rjmp BootloaderAPI_UNUSED3 ; UNUSED ENTRY 3
+	rjmp BootloaderAPI_UNUSED4 ; UNUSED ENTRY 4
+	rjmp BootloaderAPI_UNUSED5 ; UNUSED ENTRY 5
+
+
+
+; Bootloader table signatures and information
+.section .apitable_signatures, "ax"
+.global BootloaderAPI_Signatures
+BootloaderAPI_Signatures:
+
+	.long BOOT_START_ADDR ; Start address of the bootloader
+	.word 0xDF20 ; Signature for the Printer class bootloader
+	.word 0xDCFB ; Signature for a LUFA class bootloader
diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/asf.xml b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/asf.xml
index 86a56911ed..b5c0c6b3a5 100644
--- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/asf.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/asf.xml
@@ -1,159 +1,159 @@
-<asf xmlversion="1.0">

-	<project caption="Printer Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.128_4" force-caption="true" workspace-name="lufa_printer_128kb_4kb_">

-		<require idref="lufa.bootloaders.printer"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb1287"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x1F000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="Printer Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.64_4" force-caption="true" workspace-name="lufa_printer_64kb_4kb_">

-		<require idref="lufa.bootloaders.printer"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb647"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0xF000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="Printer Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.32_4" force-caption="true" workspace-name="lufa_printer_32kb_4kb_">

-		<require idref="lufa.bootloaders.printer"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega32u4"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="Printer Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.16_4" force-caption="true" workspace-name="lufa_printer_16kb_4kb_">

-		<require idref="lufa.bootloaders.printer"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega16u2"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x3000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="Printer Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.8_4" force-caption="true" workspace-name="lufa_printer_8kb_4kb_">

-		<require idref="lufa.bootloaders.printer"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega8u2"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x1000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<module type="application" id="lufa.bootloaders.printer" caption="Printer Bootloader">

-		<info type="description" value="summary">

-		Printer Class Bootloader, capable of reprogramming a device by "printing" new HEX files to the virtual Plain-Text printer it creates when plugged into a host.

-		</info>

-

- 		<info type="gui-flag" value="move-to-root"/>

-

-		<info type="keyword" value="Technology">

-			<keyword value="Bootloaders"/>

-			<keyword value="USB Device"/>

-		</info>

-

-		<device-support-alias value="lufa_avr8"/>

-		<device-support-alias value="lufa_xmega"/>

-		<device-support-alias value="lufa_uc3"/>

-

-		<build type="include-path" value="."/>

-		<build type="c-source" value="BootloaderPrinter.c"/>

-		<build type="header-file" value="BootloaderPrinter.h"/>

-		<build type="c-source" value="Descriptors.c"/>

-		<build type="header-file" value="Descriptors.h"/>

-		<build type="c-source" value="BootloaderAPI.c"/>

-		<build type="header-file" value="BootloaderAPI.h"/>

-		<build type="asm-source" value="BootloaderAPITable.S"/>

-

-		<build type="module-config" subtype="path" value="Config"/>

-		<build type="header-file" value="Config/LUFAConfig.h"/>

-

-		<build type="distribute" subtype="user-file" value="doxyfile"/>

-		<build type="distribute" subtype="user-file" value="BootloaderPrinter.txt"/>

-

-		<require idref="lufa.common"/>

-		<require idref="lufa.platform"/>

-		<require idref="lufa.drivers.usb"/>

-		<require idref="lufa.drivers.board"/>

-		<require idref="lufa.drivers.board.leds"/>

-	</module>

-</asf>

+<asf xmlversion="1.0">
+	<project caption="Printer Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.128_4" force-caption="true" workspace-name="lufa_printer_128kb_4kb_">
+		<require idref="lufa.bootloaders.printer"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb1287"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x1F000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="Printer Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.64_4" force-caption="true" workspace-name="lufa_printer_64kb_4kb_">
+		<require idref="lufa.bootloaders.printer"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb647"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0xF000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="Printer Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.32_4" force-caption="true" workspace-name="lufa_printer_32kb_4kb_">
+		<require idref="lufa.bootloaders.printer"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega32u4"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="Printer Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.16_4" force-caption="true" workspace-name="lufa_printer_16kb_4kb_">
+		<require idref="lufa.bootloaders.printer"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega16u2"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x3000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="Printer Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.8_4" force-caption="true" workspace-name="lufa_printer_8kb_4kb_">
+		<require idref="lufa.bootloaders.printer"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega8u2"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x1000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<module type="application" id="lufa.bootloaders.printer" caption="Printer Bootloader">
+		<info type="description" value="summary">
+		Printer Class Bootloader, capable of reprogramming a device by "printing" new HEX files to the virtual Plain-Text printer it creates when plugged into a host.
+		</info>
+
+ 		<info type="gui-flag" value="move-to-root"/>
+
+		<info type="keyword" value="Technology">
+			<keyword value="Bootloaders"/>
+			<keyword value="USB Device"/>
+		</info>
+
+		<device-support-alias value="lufa_avr8"/>
+		<device-support-alias value="lufa_xmega"/>
+		<device-support-alias value="lufa_uc3"/>
+
+		<build type="include-path" value="."/>
+		<build type="c-source" value="BootloaderPrinter.c"/>
+		<build type="header-file" value="BootloaderPrinter.h"/>
+		<build type="c-source" value="Descriptors.c"/>
+		<build type="header-file" value="Descriptors.h"/>
+		<build type="c-source" value="BootloaderAPI.c"/>
+		<build type="header-file" value="BootloaderAPI.h"/>
+		<build type="asm-source" value="BootloaderAPITable.S"/>
+
+		<build type="module-config" subtype="path" value="Config"/>
+		<build type="header-file" value="Config/LUFAConfig.h"/>
+
+		<build type="distribute" subtype="user-file" value="doxyfile"/>
+		<build type="distribute" subtype="user-file" value="BootloaderPrinter.txt"/>
+
+		<require idref="lufa.common"/>
+		<require idref="lufa.platform"/>
+		<require idref="lufa.drivers.usb"/>
+		<require idref="lufa.drivers.board"/>
+		<require idref="lufa.drivers.board.leds"/>
+	</module>
+</asf>
diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/makefile b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/makefile
index 0716c3bbe8..0db035de3b 100644
--- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/makefile
+++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/makefile
@@ -1,55 +1,55 @@
-#

-#             LUFA Library

-#     Copyright (C) Dean Camera, 2014.

-#

-#  dean [at] fourwalledcubicle [dot] com

-#           www.lufa-lib.org

-#

-# --------------------------------------

-#         LUFA Project Makefile.

-# --------------------------------------

-

-# Run "make help" for target help.

-

-MCU          = at90usb1287

-ARCH         = AVR8

-BOARD        = USBKEY

-F_CPU        = 8000000

-F_USB        = $(F_CPU)

-OPTIMIZATION = s

-TARGET       = BootloaderPrinter

-SRC          = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)

-LUFA_PATH    = ../../LUFA

-CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START_OFFSET)

-LD_FLAGS     = -Wl,--section-start=.text=$(BOOT_START_OFFSET) $(BOOT_API_LD_FLAGS)

-

-# Flash size and bootloader section sizes of the target, in KB. These must

-# match the target's total FLASH size and the bootloader size set in the

-# device's fuses.

-FLASH_SIZE_KB         = 128

-BOOT_SECTION_SIZE_KB  = 8

-

-# Bootloader address calculation formulas

-# Do not modify these macros, but rather modify the dependent values above.

-CALC_ADDRESS_IN_HEX   = $(shell printf "0x%X" $$(( $(1) )) )

-BOOT_START_OFFSET     = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024 )

-BOOT_SEC_OFFSET       = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) * 1024) - ($(strip $(1))) )

-

-# Bootloader linker section flags for relocating the API table sections to

-# known FLASH addresses - these should not normally be user-edited.

-BOOT_SECTION_LD_FLAG  = -Wl,--section-start=$(strip $(1))=$(call BOOT_SEC_OFFSET, $(3)) -Wl,--undefined=$(strip $(2))

-BOOT_API_LD_FLAGS     = $(call BOOT_SECTION_LD_FLAG, .apitable_trampolines, BootloaderAPI_Trampolines, 96)

-BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_jumptable,   BootloaderAPI_JumpTable,   32)

-BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_signatures,  BootloaderAPI_Signatures,  8)

-

-# Default target

-all:

-

-# Include LUFA build script makefiles

-include $(LUFA_PATH)/Build/lufa_core.mk

-include $(LUFA_PATH)/Build/lufa_sources.mk

-include $(LUFA_PATH)/Build/lufa_build.mk

-include $(LUFA_PATH)/Build/lufa_cppcheck.mk

-include $(LUFA_PATH)/Build/lufa_doxygen.mk

-include $(LUFA_PATH)/Build/lufa_avrdude.mk

-include $(LUFA_PATH)/Build/lufa_atprogram.mk

+#
+#             LUFA Library
+#     Copyright (C) Dean Camera, 2014.
+#
+#  dean [at] fourwalledcubicle [dot] com
+#           www.lufa-lib.org
+#
+# --------------------------------------
+#         LUFA Project Makefile.
+# --------------------------------------
+
+# Run "make help" for target help.
+
+MCU          = at90usb1287
+ARCH         = AVR8
+BOARD        = USBKEY
+F_CPU        = 8000000
+F_USB        = $(F_CPU)
+OPTIMIZATION = s
+TARGET       = BootloaderPrinter
+SRC          = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)
+LUFA_PATH    = ../../LUFA
+CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START_OFFSET)
+LD_FLAGS     = -Wl,--section-start=.text=$(BOOT_START_OFFSET) $(BOOT_API_LD_FLAGS)
+
+# Flash size and bootloader section sizes of the target, in KB. These must
+# match the target's total FLASH size and the bootloader size set in the
+# device's fuses.
+FLASH_SIZE_KB         = 128
+BOOT_SECTION_SIZE_KB  = 8
+
+# Bootloader address calculation formulas
+# Do not modify these macros, but rather modify the dependent values above.
+CALC_ADDRESS_IN_HEX   = $(shell printf "0x%X" $$(( $(1) )) )
+BOOT_START_OFFSET     = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024 )
+BOOT_SEC_OFFSET       = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) * 1024) - ($(strip $(1))) )
+
+# Bootloader linker section flags for relocating the API table sections to
+# known FLASH addresses - these should not normally be user-edited.
+BOOT_SECTION_LD_FLAG  = -Wl,--section-start=$(strip $(1))=$(call BOOT_SEC_OFFSET, $(3)) -Wl,--undefined=$(strip $(2))
+BOOT_API_LD_FLAGS     = $(call BOOT_SECTION_LD_FLAG, .apitable_trampolines, BootloaderAPI_Trampolines, 96)
+BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_jumptable,   BootloaderAPI_JumpTable,   32)
+BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_signatures,  BootloaderAPI_Signatures,  8)
+
+# Default target
+all:
+
+# Include LUFA build script makefiles
+include $(LUFA_PATH)/Build/lufa_core.mk
+include $(LUFA_PATH)/Build/lufa_sources.mk
+include $(LUFA_PATH)/Build/lufa_build.mk
+include $(LUFA_PATH)/Build/lufa_cppcheck.mk
+include $(LUFA_PATH)/Build/lufa_doxygen.mk
+include $(LUFA_PATH)/Build/lufa_avrdude.mk
+include $(LUFA_PATH)/Build/lufa_atprogram.mk
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/Build/HID_EEPROM_Loader/makefile b/tmk_core/protocol/lufa/LUFA-git/LUFA/Build/HID_EEPROM_Loader/makefile
index 9fd188c936..e839ba6b1d 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/Build/HID_EEPROM_Loader/makefile
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/Build/HID_EEPROM_Loader/makefile
@@ -1,42 +1,42 @@
-#

-#             LUFA Library

-#     Copyright (C) Dean Camera, 2014.

-#

-#  dean [at] fourwalledcubicle [dot] com

-#           www.lufa-lib.org

-#

-# --------------------------------------

-#         LUFA Project Makefile.

-# --------------------------------------

-

-# Run "make help" for target help.

-

-MCU          = at90usb1287

-ARCH         = AVR8

-F_CPU        = 1000000

-F_USB        = $(F_CPU)

-OPTIMIZATION = s

-TARGET       = HID_EEPROM_Loader

-SRC          = $(TARGET).c

-LUFA_PATH    = ../../../LUFA

-CC_FLAGS     =

-LD_FLAGS     =

-OBJECT_FILES = InputEEData.o

-

-# Default target

-all:

-

-# Determine the AVR sub-architecture of the build main application object file

-FIND_AVR_SUBARCH = avr$(shell avr-objdump -f $(TARGET).o | grep architecture | cut -d':' -f3 | cut -d',' -f1)

-

-# Create a linkable object file with the input binary EEPROM data stored in the FLASH section

-InputEEData.o: InputEEData.bin $(TARGET).o $(MAKEFILE_LIST)

-	@echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a object file \"$@\"

-	avr-objcopy -I binary -O elf32-avr -B $(call FIND_AVR_SUBARCH) --rename-section .data=.progmem.data,contents,alloc,readonly,data $< $@

-

-# Include LUFA build script makefiles

-include $(LUFA_PATH)/Build/lufa_core.mk

-include $(LUFA_PATH)/Build/lufa_build.mk

-include $(LUFA_PATH)/Build/lufa_cppcheck.mk

-include $(LUFA_PATH)/Build/lufa_doxygen.mk

-include $(LUFA_PATH)/Build/lufa_hid.mk

+#
+#             LUFA Library
+#     Copyright (C) Dean Camera, 2014.
+#
+#  dean [at] fourwalledcubicle [dot] com
+#           www.lufa-lib.org
+#
+# --------------------------------------
+#         LUFA Project Makefile.
+# --------------------------------------
+
+# Run "make help" for target help.
+
+MCU          = at90usb1287
+ARCH         = AVR8
+F_CPU        = 1000000
+F_USB        = $(F_CPU)
+OPTIMIZATION = s
+TARGET       = HID_EEPROM_Loader
+SRC          = $(TARGET).c
+LUFA_PATH    = ../../../LUFA
+CC_FLAGS     =
+LD_FLAGS     =
+OBJECT_FILES = InputEEData.o
+
+# Default target
+all:
+
+# Determine the AVR sub-architecture of the build main application object file
+FIND_AVR_SUBARCH = avr$(shell avr-objdump -f $(TARGET).o | grep architecture | cut -d':' -f3 | cut -d',' -f1)
+
+# Create a linkable object file with the input binary EEPROM data stored in the FLASH section
+InputEEData.o: InputEEData.bin $(TARGET).o $(MAKEFILE_LIST)
+	@echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a object file \"$@\"
+	avr-objcopy -I binary -O elf32-avr -B $(call FIND_AVR_SUBARCH) --rename-section .data=.progmem.data,contents,alloc,readonly,data $< $@
+
+# Include LUFA build script makefiles
+include $(LUFA_PATH)/Build/lufa_core.mk
+include $(LUFA_PATH)/Build/lufa_build.mk
+include $(LUFA_PATH)/Build/lufa_cppcheck.mk
+include $(LUFA_PATH)/Build/lufa_doxygen.mk
+include $(LUFA_PATH)/Build/lufa_hid.mk
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/DeviceTemplate/asf.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/DeviceTemplate/asf.xml
index fd65db283f..e952714e16 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/DeviceTemplate/asf.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/DeviceTemplate/asf.xml
@@ -1,55 +1,55 @@
-<asf xmlversion="1.0">

-	<project caption="USB Device Template" id="lufa.templates.device.project.avr8">

-		<require idref="lufa.templates.device"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8_template"/>

-

-		<device-support value="at90usb1287"/>

-		<config name="lufa.drivers.board.name" value="usbkey"/>

-

-		<build type="define" name="F_CPU" value="8000000UL"/>

-		<build type="define" name="F_USB" value="8000000UL"/>

-	</project>

-

-	<project caption="USB Device Template" id="lufa.templates.device.project.xmega">

-		<require idref="lufa.templates.device"/>

-		<require idref="lufa.boards.dummy.xmega"/>

-		<generator value="as5_8_template"/>

-

-		<device-support value="atxmega256a3bu"/>

-		<config name="lufa.drivers.board.name" value="a3bu_xplained"/>

-

-		<build type="define" name="F_CPU" value="32000000UL"/>

-		<build type="define" name="F_USB" value="48000000UL"/>

-	</project>

-

-	<module type="application" id="lufa.templates.device" caption="USB Device Template">

-		<info type="description" value="summary">

-		Template for a LUFA USB device mode application.

-		</info>

-

- 		<info type="gui-flag" value="move-to-root"/>

-

-		<info type="keyword" value="Technology">

-			<keyword value="USB Device"/>

-			<keyword value="Template Projects"/>

-		</info>

-

-		<device-support-alias value="lufa_avr8"/>

-		<device-support-alias value="lufa_xmega"/>

-		<device-support-alias value="lufa_uc3"/>

-

-		<build type="c-source" value="DeviceApplication.c"/>

-		<build type="c-source" value="Descriptors.c"/>

-		<build type="header-file" value="DeviceApplication.h"/>

-		<build type="header-file" value="Descriptors.h"/>

-

-		<build type="module-config" subtype="path" value=".."/>

-		<build type="header-file" value="../LUFAConfig.h"/>

-

-		<require idref="lufa.common"/>

-		<require idref="lufa.platform"/>

-		<require idref="lufa.drivers.usb"/>

-		<require idref="lufa.drivers.board"/>

-	</module>

-</asf>

+<asf xmlversion="1.0">
+	<project caption="USB Device Template" id="lufa.templates.device.project.avr8">
+		<require idref="lufa.templates.device"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8_template"/>
+
+		<device-support value="at90usb1287"/>
+		<config name="lufa.drivers.board.name" value="usbkey"/>
+
+		<build type="define" name="F_CPU" value="8000000UL"/>
+		<build type="define" name="F_USB" value="8000000UL"/>
+	</project>
+
+	<project caption="USB Device Template" id="lufa.templates.device.project.xmega">
+		<require idref="lufa.templates.device"/>
+		<require idref="lufa.boards.dummy.xmega"/>
+		<generator value="as5_8_template"/>
+
+		<device-support value="atxmega256a3bu"/>
+		<config name="lufa.drivers.board.name" value="a3bu_xplained"/>
+
+		<build type="define" name="F_CPU" value="32000000UL"/>
+		<build type="define" name="F_USB" value="48000000UL"/>
+	</project>
+
+	<module type="application" id="lufa.templates.device" caption="USB Device Template">
+		<info type="description" value="summary">
+		Template for a LUFA USB device mode application.
+		</info>
+
+ 		<info type="gui-flag" value="move-to-root"/>
+
+		<info type="keyword" value="Technology">
+			<keyword value="USB Device"/>
+			<keyword value="Template Projects"/>
+		</info>
+
+		<device-support-alias value="lufa_avr8"/>
+		<device-support-alias value="lufa_xmega"/>
+		<device-support-alias value="lufa_uc3"/>
+
+		<build type="c-source" value="DeviceApplication.c"/>
+		<build type="c-source" value="Descriptors.c"/>
+		<build type="header-file" value="DeviceApplication.h"/>
+		<build type="header-file" value="Descriptors.h"/>
+
+		<build type="module-config" subtype="path" value=".."/>
+		<build type="header-file" value="../LUFAConfig.h"/>
+
+		<require idref="lufa.common"/>
+		<require idref="lufa.platform"/>
+		<require idref="lufa.drivers.usb"/>
+		<require idref="lufa.drivers.board"/>
+	</module>
+</asf>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/HostTemplate/asf.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/HostTemplate/asf.xml
index c1996ec711..c3860c056d 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/HostTemplate/asf.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/HostTemplate/asf.xml
@@ -1,41 +1,41 @@
-<asf xmlversion="1.0">

-	<project caption="USB Host Template" id="lufa.templates.host.project">

-		<require idref="lufa.templates.host"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8_template"/>

-

-		<device-support value="at90usb1287"/>

-		<config name="lufa.drivers.board.name" value="usbkey"/>

-

-		<build type="define" name="F_CPU" value="8000000UL"/>

-		<build type="define" name="F_USB" value="8000000UL"/>

-	</project>

-

-	<module type="application" id="lufa.templates.host" caption="USB Host Template">

-		<info type="description" value="summary">

-		Template for a LUFA USB host mode application.

-		</info>

-

- 		<info type="gui-flag" value="move-to-root"/>

-

-		<info type="keyword" value="Technology">

-			<keyword value="USB Host"/>

-			<keyword value="Template Projects"/>

-		</info>

-

-		<device-support-alias value="lufa_avr8"/>

-		<device-support-alias value="lufa_xmega"/>

-		<device-support-alias value="lufa_uc3"/>

-

-		<build type="c-source" value="HostApplication.c"/>

-		<build type="header-file" value="HostApplication.h"/>

-

-		<build type="module-config" subtype="path" value=".."/>

-		<build type="header-file" value="../LUFAConfig.h"/>

-

-		<require idref="lufa.common"/>

-		<require idref="lufa.platform"/>

-		<require idref="lufa.drivers.usb"/>

-		<require idref="lufa.drivers.board"/>

-	</module>

-</asf>

+<asf xmlversion="1.0">
+	<project caption="USB Host Template" id="lufa.templates.host.project">
+		<require idref="lufa.templates.host"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8_template"/>
+
+		<device-support value="at90usb1287"/>
+		<config name="lufa.drivers.board.name" value="usbkey"/>
+
+		<build type="define" name="F_CPU" value="8000000UL"/>
+		<build type="define" name="F_USB" value="8000000UL"/>
+	</project>
+
+	<module type="application" id="lufa.templates.host" caption="USB Host Template">
+		<info type="description" value="summary">
+		Template for a LUFA USB host mode application.
+		</info>
+
+ 		<info type="gui-flag" value="move-to-root"/>
+
+		<info type="keyword" value="Technology">
+			<keyword value="USB Host"/>
+			<keyword value="Template Projects"/>
+		</info>
+
+		<device-support-alias value="lufa_avr8"/>
+		<device-support-alias value="lufa_xmega"/>
+		<device-support-alias value="lufa_uc3"/>
+
+		<build type="c-source" value="HostApplication.c"/>
+		<build type="header-file" value="HostApplication.h"/>
+
+		<build type="module-config" subtype="path" value=".."/>
+		<build type="header-file" value="../LUFAConfig.h"/>
+
+		<require idref="lufa.common"/>
+		<require idref="lufa.platform"/>
+		<require idref="lufa.drivers.usb"/>
+		<require idref="lufa.drivers.board"/>
+	</module>
+</asf>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/DoxygenPages/BuildSystem.txt b/tmk_core/protocol/lufa/LUFA-git/LUFA/DoxygenPages/BuildSystem.txt
index 7ddfa1be3f..0ae1dd678f 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/DoxygenPages/BuildSystem.txt
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/DoxygenPages/BuildSystem.txt
@@ -1,975 +1,975 @@
-/** \file

- *

- *  This file contains special DoxyGen information for the generation of the main page and other special

- *  documentation pages. It is not a project source file.

- */

-

-/** \page Page_BuildSystem The LUFA Build System

- *

- *  \section Sec_BuildSystem_Overview Overview of the LUFA Build System

- *  The LUFA build system is an attempt at making a set of re-usable, modular build make files which

- *  can be referenced in a LUFA powered project, to minimize the amount of code required in an

- *  application makefile. The system is written in GNU Make, and each module is independent of

- *  one-another.

- *

- *  For details on the prerequisites needed for Linux and Windows machines to be able to use the LUFA

- *  build system, see \ref Sec_CompilingApps_Prerequisites.

- *

- *  To use a LUFA build system module, simply add an include to your project makefile. All user projects

- *  should at a minimum include \ref Page_BuildModule_CORE for base functionality:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_core.mk

- *  \endcode

- *

- *  Once included in your project makefile, the associated build module targets will be added to your

- *  project's build makefile targets automatically. To call a build target, run <tt>make {TARGET_NAME}</tt>

- *  from the command line, substituting in the appropriate target name.

- *

- *  \see \ref Sec_ConfiguringApps_AppMakefileParams for a copy of the sample LUFA project makefile.

- *

- *  Each build module may have one or more mandatory parameters (GNU Make variables) which <i>must</i>

- *  be supplied in the project makefile for the module to work, and one or more optional parameters which

- *  may be defined and which will assume a sensible default if not.

- *

- *  \section SSec_BuildSystem_Modules Available Modules

- *

- *  The following modules are included in this LUFA release:

- *

- *  \li \subpage Page_BuildModule_ATPROGRAM - Device Programming

- *  \li \subpage Page_BuildModule_AVRDUDE - Device Programming

- *  \li \subpage Page_BuildModule_BUILD - Compiling/Assembling/Linking

- *  \li \subpage Page_BuildModule_CORE - Core Build System Functions

- *  \li \subpage Page_BuildModule_CPPCHECK - Static Code Analysis

- *  \li \subpage Page_BuildModule_DFU - Device Programming

- *  \li \subpage Page_BuildModule_DOXYGEN - Automated Source Code Documentation

- *  \li \subpage Page_BuildModule_HID - Device Programming

- *  \li \subpage Page_BuildModule_SOURCES - LUFA Module Source Code Variables

- *

- *  If you have problems building using the LUFA build system, see \subpage Page_BuildTroubleshooting for resolution steps.

- */

-

- /** \page Page_BuildModule_BUILD The BUILD build module

- *

- *  The BUILD LUFA build system module, providing targets for the compilation,

- *  assembling and linking of an application from source code into binary files

- *  suitable for programming into a target device, using the GCC compiler.

- *

- *  To use this module in your application makefile, add the following code:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_build.mk

- *  \endcode

- *

- *  \section SSec_BuildModule_BUILD_Requirements Requirements

- *  This module requires the the architecture appropriate binaries of the GCC compiler are available in your

- *  system's <b>PATH</b> variable. The GCC compiler and associated toolchain is distributed in Atmel AVR Studio

- *  5.x and Atmel Studio 6.x installation directories, as well as in many third party distribution packages.

- *

- *  \section SSec_BuildModule_BUILD_Targets Targets

- *

- *  <table>

- *   <tr>

- *    <td><tt>size</tt></td>

- *    <td>Display size of the compiled application FLASH and SRAM segments.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>symbol-sizes</tt></td>

- *    <td>Display a size-sorted list of symbols from the compiled application, in decimal bytes.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>lib</tt></td>

- *    <td>Build and archive all source files into a library A binary file.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>all</tt></td>

- *    <td>Build and link the application into ELF debug and HEX binary files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>elf</tt></td>

- *    <td>Build and link the application into an ELF debug file.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>bin</tt></td>

- *    <td>Build and link the application and produce a BIN binary file.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>hex</tt></td>

- *    <td>Build and link the application and produce HEX and EEP binary files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>lss</tt></td>

- *    <td>Build and link the application and produce a LSS source code/assembly code mixed listing file.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>clean</tt></td>

- *    <td>Remove all intermediary files and binary output files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>mostlyclean</tt></td>

- *    <td>Remove all intermediary files but preserve any binary output files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt><i>&lt;filename&gt;</i>.s</tt></td>

- *    <td>Create an assembly listing of a given input C/C++ source file.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_BUILD_MandatoryParams Mandatory Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>TARGET</tt></td>

- *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>ARCH</tt></td>

- *    <td>Architecture of the target processor (see \ref Page_DeviceSupport).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>MCU</tt></td>

- *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>SRC</tt></td>

- *    <td>List of relative or absolute paths to the application C (.c), C++ (.cpp) and Assembly (.S) source files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>F_USB</tt></td>

- *    <td>Speed in Hz of the input clock frequency to the target's USB controller.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>LUFA_PATH</tt></td>

- *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_BUILD_OptionalParams Optional Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>BOARD</tt></td>

- *    <td>LUFA board hardware drivers to use (see \ref Page_DeviceSupport).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>OPTIMIZATION</tt></td>

- *    <td>Optimization level to use when compiling source files (see GCC manual).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>C_STANDARD</tt></td>

- *    <td>Version of the C standard to apply when compiling C++ source files (see GCC manual).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CPP_STANDARD</tt></td>

- *    <td>Version of the C++ standard to apply when compiling C++ source files (see GCC manual).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>DEBUG_FORMAT</tt></td>

- *    <td>Format of the debug information to embed in the generated object files (see GCC manual).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>DEBUG_LEVEL</tt></td>

- *    <td>Level of the debugging information to embed in the generated object files (see GCC manual).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>F_CPU</tt></td>

- *    <td>Speed of the processor CPU clock, in Hz.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>C_FLAGS</tt></td>

- *    <td>Flags to pass to the C compiler only, after the automatically generated flags.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CPP_FLAGS</tt></td>

- *    <td>Flags to pass to the C++ compiler only, after the automatically generated flags.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>ASM_FLAGS</tt></td>

- *    <td>Flags to pass to the assembler only, after the automatically generated flags.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CC_FLAGS</tt></td>

- *    <td>Common flags to pass to the C/C++ compiler and assembler, after the automatically generated flags.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>COMPILER_PATH</tt></td>

- *    <td>Directory where the C/C++ toolchain is located, if not available in the system <tt>PATH</tt>.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>LD_FLAGS</tt></td>

- *    <td>Flags to pass to the linker, after the automatically generated flags.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>LINKER_RELAXATIONS</tt></td>

- *    <td>Enables or disables linker relaxations when linking the application binary. This can reduce the total size

- *        of the application by replacing full \c CALL instructions with smaller \c RCALL instructions where possible.

- *        \note On some unpatched versions of binutils, this can cause link failures in some circumstances. If you

- *              receive a link error <tt>relocation truncated to fit: R_AVR_13_PCREL</tt>, disable this setting.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>OBJDIR</tt></td>

- *    <td>Directory to place the generated object and dependency files. If set to "." the same folder as the source file will be used.

- *        \note When this option is enabled, all source filenames <b>must</b> be unique.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>OBJECT_FILES</tt></td>

- *    <td>List of additional object files that should be linked into the resulting binary.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_BUILD_ProvidedVariables Module Provided Variables

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_BUILD_ProvidedMacros Module Provided Macros

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- */

-

-/** \page Page_BuildModule_CORE The CORE build module

- *

- *  The core LUFA build system module, providing common build system help and information targets.

- *

- *  To use this module in your application makefile, add the following code:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_core.mk

- *  \endcode

- *

- *  \section SSec_BuildModule_CORE_Requirements Requirements

- *  This module has no requirements outside a standard *nix shell like environment; the <tt>sh</tt>

- *  shell, GNU <tt>make</tt> and *nix CoreUtils (<tt>echo</tt>, <tt>printf</tt>, etc.).

- *

- *  \section SSec_BuildModule_CORE_Targets Targets

- *

- *  <table>

- *   <tr>

- *    <td><tt>help</tt></td>

- *    <td>Display build system help and configuration information.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>list_targets</tt></td>

- *    <td>List all available build targets from the build system.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>list_modules</tt></td>

- *    <td>List all available build modules from the build system.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>list_mandatory</tt></td>

- *    <td>List all mandatory parameters required by the included modules.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>list_optional</tt></td>

- *    <td>List all optional parameters required by the included modules.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>list_provided</tt></td>

- *    <td>List all variables provided by the included modules.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>list_macros</tt></td>

- *    <td>List all macros provided by the included modules.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_CORE_MandatoryParams Mandatory Parameters

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_CORE_OptionalParams Optional Parameters

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_CORE_ProvidedVariables Module Provided Variables

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_CORE_ProvidedMacros Module Provided Macros

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- */

-

-/** \page Page_BuildModule_ATPROGRAM The ATPROGRAM build module

- *

- *  The ATPROGRAM programming utility LUFA build system module, providing targets to reprogram an

- *  Atmel processor FLASH and EEPROM memories with a project's compiled binary output files.

- *

- *  To use this module in your application makefile, add the following code:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_atprogram.mk

- *  \endcode

- *

- *  \section SSec_BuildModule_ATPROGRAM_Requirements Requirements

- *  This module requires the <tt>atprogram.exe</tt> utility to be available in your system's <b>PATH</b>

- *  variable. The <tt>atprogram.exe</tt> utility is distributed in Atmel AVR Studio 5.x and Atmel Studio 6.x

- *  inside the application install folder's "\atbackend" subdirectory.

- *

- *  \section SSec_BuildModule_ATPROGRAM_Targets Targets

- *

- *  <table>

- *   <tr>

- *    <td><tt>atprogram</tt></td>

- *    <td>Program the device FLASH memory with the application's executable data.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>atprogram-ee</tt></td>

- *    <td>Program the device EEPROM memory with the application's EEPROM data.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_ATPROGRAM_MandatoryParams Mandatory Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>MCU</tt></td>

- *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>TARGET</tt></td>

- *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_ATPROGRAM_OptionalParams Optional Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>ATPROGRAM_PROGRAMMER</tt></td>

- *    <td>Name of the Atmel programmer or debugger tool to communicate with (e.g. <tt>jtagice3</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>ATPROGRAM_INTERFACE</tt></td>

- *    <td>Name of the programming interface to use when programming the target (e.g. <tt>spi</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>ATPROGRAM_PORT</tt></td>

- *    <td>Name of the communication port to use when when programming with a serially connected tool (e.g. <tt>COM2</tt>).</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_ATPROGRAM_ProvidedVariables Module Provided Variables

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_ATPROGRAM_ProvidedMacros Module Provided Macros

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- */

-

-/** \page Page_BuildModule_AVRDUDE The AVRDUDE build module

- *

- *  The AVRDUDE programming utility LUFA build system module, providing targets to reprogram an

- *  Atmel processor FLASH and EEPROM memories with a project's compiled binary output files.

- *

- *  To use this module in your application makefile, add the following code:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_avrdude.mk

- *  \endcode

- *

- *  \section SSec_BuildModule_AVRDUDE_Requirements Requirements

- *  This module requires the <tt>avrdude</tt> utility to be available in your system's <b>PATH</b>

- *  variable. The <tt>avrdude</tt> utility is distributed in the old WinAVR project releases for

- *  Windows (<a>http://winavr.sourceforge.net</a>) or can be installed on *nix systems via the project's

- *  source code (<a>https://savannah.nongnu.org/projects/avrdude</a>) or through the package manager.

- *

- *  \section SSec_BuildModule_AVRDUDE_Targets Targets

- *

- *  <table>

- *   <tr>

- *    <td><tt>avrdude</tt></td>

- *    <td>Program the device FLASH memory with the application's executable data.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>avrdude-ee</tt></td>

- *    <td>Program the device EEPROM memory with the application's EEPROM data.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_AVRDUDE_MandatoryParams Mandatory Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>MCU</tt></td>

- *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>TARGET</tt></td>

- *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_AVRDUDE_OptionalParams Optional Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>AVRDUDE_PROGRAMMER</tt></td>

- *    <td>Name of the programmer or debugger tool to communicate with (e.g. <tt>jtagicemkii</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>AVRDUDE_PORT</tt></td>

- *    <td>Name of the communication port to use when when programming with the connected tool (e.g. <tt>COM2</tt>, <tt>/dev/ttyUSB0</tt> or <tt>usb</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>AVRDUDE_FLAGS</tt></td>

- *    <td>Additional flags to pass to avrdude when programming, applied after the automatically generated flags.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_AVRDUDE_ProvidedVariables Module Provided Variables

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_AVRDUDE_ProvidedMacros Module Provided Macros

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- */

-

- /** \page Page_BuildModule_CPPCHECK The CPPCHECK build module

- *

- *  The CPPCHECK programming utility LUFA build system module, providing targets to statically

- *  analyze C and C++ source code for errors and performance/style issues.

- *

- *  To use this module in your application makefile, add the following code:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_cppcheck.mk

- *  \endcode

- *

- *  \section SSec_BuildModule_CPPCHECK_Requirements Requirements

- *  This module requires the <tt>cppcheck</tt> utility to be available in your system's <b>PATH</b>

- *  variable. The <tt>cppcheck</tt> utility is distributed through the project's home page

- *  (<a>http://cppcheck.sourceforge.net</a>) for Windows, and can be installed on *nix systems via

- *  the project's source code or through the package manager.

- *

- *  \section SSec_BuildModule_CPPCHECK_Targets Targets

- *

- *  <table>

- *   <tr>

- *    <td><tt>cppcheck</tt></td>

- *    <td>Statically analyze the project source code for issues.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>cppcheck-config</tt></td>

- *    <td>Check the <tt>cppcheck</tt> configuration - scan source code and warn about missing header files and other issues.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_CPPCHECK_MandatoryParams Mandatory Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>SRC</tt></td>

- *    <td>List of source files to statically analyze.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_CPPCHECK_OptionalParams Optional Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>CPPCHECK_INCLUDES</tt></td>

- *    <td>Path of extra directories to check when attemting to resolve C/C++ header file includes.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CPPCHECK_EXCLUDES</tt></td>

- *    <td>Paths or path fragments to exclude when analyzing.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CPPCHECK_MSG_TEMPLATE</tt></td>

- *    <td>Output message template to use when printing errors, warnings and information (see <tt>cppcheck</tt> documentation).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CPPCHECK_ENABLE</tt></td>

- *    <td>Analysis rule categories to enable (see <tt>cppcheck</tt> documentation).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CPPCHECK_SUPPRESS</tt></td>

- *    <td>Specific analysis rules to suppress (see <tt>cppcheck</tt> documentation).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CPPCHECK_FAIL_ON_WARNING</tt></td>

- *    <td>Set to <b>Y</b> to fail the analysis job with an error exit code if warnings are found, <b>N</b> to continue without failing.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CPPCHECK_QUIET</tt></td>

- *    <td>Set to <b>Y</b> to suppress all output except warnings and errors, <b>N</b> to show verbose output information.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CPPCHECK_FLAGS</tt></td>

- *    <td>Extra flags to pass to <tt>cppcheck</tt>, after the automatically generated flags.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_CPPCHECK_ProvidedVariables Module Provided Variables

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_CPPCHECK_ProvidedMacros Module Provided Macros

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- */

-

- /** \page Page_BuildModule_DFU The DFU build module

- *

- *  The DFU programming utility LUFA build system module, providing targets to reprogram an

- *  Atmel processor FLASH and EEPROM memories with a project's compiled binary output files.

- *  This module requires a DFU class bootloader to be running in the target, compatible with

- *  the DFU bootloader protocol as published by Atmel.

- *

- *  To use this module in your application makefile, add the following code:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_dfu.mk

- *  \endcode

- *

- *  \section SSec_BuildModule_DFU_Requirements Requirements

- *  This module requires either the <tt>batchisp</tt> utility from Atmel's FLIP utility, or the open

- *  source <tt>dfu-programmer</tt> utility (<a>http://dfu-programmer.sourceforge.net/</a>) to be

- *  available in your system's <b>PATH</b> variable. On *nix systems the <tt>dfu-programmer</tt> utility

- *  can be installed via the project's source code or through the package manager.

- *

- *  \section SSec_BuildModule_DFU_Targets Targets

- *

- *  <table>

- *   <tr>

- *    <td><tt>dfu</tt></td>

- *    <td>Program the device FLASH memory with the application's executable data using <tt>dfu-programmer</tt>.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>dfu-ee</tt></td>

- *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>dfu-programmer</tt>.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>flip</tt></td>

- *    <td>Program the device FLASH memory with the application's executable data using <tt>batchisp</tt>.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>flip-ee</tt></td>

- *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>batchisp</tt>.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_DFU_MandatoryParams Mandatory Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>MCU</tt></td>

- *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>TARGET</tt></td>

- *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_DFU_OptionalParams Optional Parameters

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_DFU_ProvidedVariables Module Provided Variables

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_DFU_ProvidedMacros Module Provided Macros

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- */

-

- /** \page Page_BuildModule_DOXYGEN The DOXYGEN build module

- *

- *  The DOXYGEN code documentation utility LUFA build system module, providing targets to generate

- *  project HTML and other format documentation from a set of source files that include special

- *  Doxygen comments.

- *

- *  To use this module in your application makefile, add the following code:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_doxygen.mk

- *  \endcode

- *

- *  \section SSec_BuildModule_DOXYGEN_Requirements Requirements

- *  This module requires the <tt>doxygen</tt> utility from the Doxygen website

- *  (<a>http://www.doxygen.org/</a>) to be available in your system's <b>PATH</b> variable. On *nix

- *  systems the <tt>doxygen</tt> utility can be installed via the project's source code or through

- *  the package manager.

- *

- *  \section SSec_BuildModule_DOXYGEN_Targets Targets

- *

- *  <table>

- *   <tr>

- *    <td><tt>doxygen</tt></td>

- *    <td>Generate project documentation.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>doxygen_create</tt></td>

- *    <td>Create a new Doxygen configuration file using the latest template.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>doxygen_upgrade</tt></td>

- *    <td>Upgrade an existing Doxygen configuration file to the latest template</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_DOXYGEN_MandatoryParams Mandatory Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>LUFA_PATH</tt></td>

- *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_DOXYGEN_OptionalParams Optional Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>DOXYGEN_CONF</tt></td>

- *    <td>Name and path of the base Doxygen configuration file for the project.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>DOXYGEN_FAIL_ON_WARNING</tt></td>

- *    <td>Set to <b>Y</b> to fail the generation with an error exit code if warnings are found other than unsupported configuration parameters, <b>N</b> to continue without failing.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>DOXYGEN_OVERRIDE_PARAMS</tt></td>

- *    <td>Extra Doxygen configuration parameters to apply, overriding the corresponding config entry in the project's configuration file (e.g. <tt>QUIET=YES</tt>).</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_DOXYGEN_ProvidedVariables Module Provided Variables

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_DOXYGEN_ProvidedMacros Module Provided Macros

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- */

-

- /** \page Page_BuildModule_HID The HID build module

- *

- *  The HID programming utility LUFA build system module, providing targets to reprogram an

- *  Atmel processor's FLASH memory with a project's compiled binary output file. This module

- *  requires a HID class bootloader to be running in the target, using a protocol compatible

- *  with the PJRC "HalfKay" protocol (<a>http://www.pjrc.com/teensy/halfkay_protocol.html</a>).

- *

- *  To use this module in your application makefile, add the following code:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_hid.mk

- *  \endcode

- *

- *  \section SSec_BuildModule_HID_Requirements Requirements

- *  This module requires either the <tt>hid_bootloader_cli</tt> utility from the included LUFA HID

- *  class bootloader API subdirectory, or the <tt>teensy_loader_cli</tt> utility from PJRC

- *  (<a>http://www.pjrc.com/teensy/loader_cli.html</a>) to be available in your system's <b>PATH</b>

- *  variable.

- *

- *  \section SSec_BuildModule_HID_Targets Targets

- *

- *  <table>

- *   <tr>

- *    <td><tt>hid</tt></td>

- *    <td>Program the device FLASH memory with the application's executable data using <tt>hid_bootloader_cli</tt>.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>hid-ee</tt></td>

- *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>hid_bootloader_cli</tt> and

- *        a temporary AVR application programmed into the target's FLASH.

- *        \note This will erase the currently loaded application in the target.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>teensy</tt></td>

- *    <td>Program the device FLASH memory with the application's executable data using <tt>teensy_loader_cli</tt>.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>teensy-ee</tt></td>

- *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>teensy_loader_cli</tt> and

- *        a temporary AVR application programmed into the target's FLASH.

- *        \note This will erase the currently loaded application in the target.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_HID_MandatoryParams Mandatory Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>MCU</tt></td>

- *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>TARGET</tt></td>

- *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_HID_OptionalParams Optional Parameters

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_HID_ProvidedVariables Module Provided Variables

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_HID_ProvidedMacros Module Provided Macros

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- */

-

- /** \page Page_BuildModule_SOURCES The SOURCES build module

- *

- *  The SOURCES LUFA build system module, providing variables listing the various LUFA source files

- *  required to be build by a project for a given LUFA module. This module gives a way to reference

- *  LUFA source files symbolically, so that changes to the library structure do not break the library

- *  makefile.

- *

- *  To use this module in your application makefile, add the following code:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_sources.mk

- *  \endcode

- *

- *  \section SSec_BuildModule_SOURCES_Requirements Requirements

- *  None.

- *

- *  \section SSec_BuildModule_SOURCES_Targets Targets

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_SOURCES_MandatoryParams Mandatory Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>LUFA_PATH</tt></td>

- *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>ARCH</tt></td>

- *    <td>Architecture of the target processor (see \ref Page_DeviceSupport).</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_SOURCES_OptionalParams Optional Parameters

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_SOURCES_ProvidedVariables Module Provided Variables

- *

- *  <table>

- *   <tr>

- *    <td><tt>LUFA_SRC_USB</tt></td>

- *    <td>List of LUFA USB driver source files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>LUFA_SRC_USBCLASS</tt></td>

- *    <td>List of LUFA USB Class driver source files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>LUFA_SRC_TEMPERATURE</tt></td>

- *    <td>List of LUFA temperature sensor driver source files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>LUFA_SRC_SERIAL</tt></td>

- *    <td>List of LUFA Serial U(S)ART driver source files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>LUFA_SRC_TWI</tt></td>

- *    <td>List of LUFA TWI driver source files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>LUFA_SRC_PLATFORM</tt></td>

- *    <td>List of LUFA architecture specific platform management source files.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_SOURCES_ProvidedMacros Module Provided Macros

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- */

-

-/** \page Page_BuildTroubleshooting Troubleshooting Information

- *

- *  LUFA uses a lot of advanced features of the AVR-GCC compiler, linker, and surrounding binaries. This can sometimes lead to problems compiling applications if one of these

- *  features is buggy in the version of the tools used in a build environment. Missing utilities and incorrectly set makefile configuration options can also result in different

- *  errors being produced when compilation or other operations are attempted. The table below lists a set of commonly encountered errors and their resolutions.

- *

- *  <table>

- *    <tr>

- *    <th>Problem</th>

- *    <th>Resolution</th>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>relocation truncated to fit: R_AVR_13_PCREL against symbol <i>{X}</i></tt></b>&quot; shown when compiling.</td>

- *    <td>Try compiling with the setting <tt>LINKER_RELAXATIONS=N</tt> in your LUFA Build System 2.0 makefile, or remove the line <tt>-Wl,--relax</tt>

- *        from other makefiles. Alternatively, make sure you have the latest version of the Atmel Toolchain installed for your system.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>error: ld terminated with signal 11 [Segmentation fault]</tt></b>&quot; shown when compiling.</td>

- *    <td>Try compiling with the setting <tt>DEBUG_LEVEL=2</tt> in your LUFA Build System 2.0 makefile, or make sure you are using <tt>binutils</tt> version 2.22 or later.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>EMERGENCY ABORT: INFINITE RECURSION DETECTED</tt></b>&quot; shown when compiling.</td>

- *    <td>Make sure you are using an up to date version of GNU Make when compiling. This error is a safety system added to the mid-level makefiles, to prevent an issue with

- *        GNU make or other variants of Make causing an infinitely recursive build.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>Unsupported architecture &quot;<i>{X}</i>&quot;</tt></b>&quot; shown when compiling.</td>

- *    <td>Ensure your makefile's <tt>ARCH</tt> setting is set to one of the architecture names (case-sensitive) supported by the version of LUFA you are compiling against.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>Makefile <i>{X}</i> value not set</tt></b>&quot; shown when compiling.</td>

- *    <td>The specified Makefile value was not configured in your project's makefile or on the command line, and the nominated setting is required by one or more LUFA

- *        build system modules. Define the value in your project makefile and try again.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>Makefile <i>{X}</i> option cannot be blank</tt></b>&quot; shown when compiling.</td>

- *    <td>The specified Makefile value was configured in your project's makefile or on the command line, but was set to an empty value. For the nominated configuration

- *        option, an empty value is not allowed. Define the nominated setting to a correct non-blank value and try again.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>Makefile <i>{X}</i> option must be Y or N</tt></b>&quot; shown when compiling.</td>

- *    <td>The specified Makefile value was configured in your project's makefile or on the command line, but was set to a value other than a Y (for "Yes") or "N" (for "No").

- *        This configuration option is required to be one of the aforementioned boolean values, and other values are invalid. Set this option to either Y or N and try again.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>Unknown input source file formats: <i>{X}</i></tt></b>&quot; shown when compiling.</td>

- *    <td>The nominated source files, specified in your project's makefile in the <tt>SRC</tt> configuration option, has an extension that the LUFA build system does not

- *        recognise. The file extensions are case sensitive, and must be one of the supported formats (<tt>*.c</tt>, <tt>*.cpp</tt> or <tt>*.S</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>Cannot build with OBJDIR parameter set - one or more object file name is not unique</tt></b>&quot; shown when compiling.</td>

- *    <td>When a project is built with a non-empty <tt>OBJDIR</tt> object directory name set, all input source files must have unique names, excluding extension and path.

- *        This means that input files that are named identically and differ only by their path or extension are invalid when this mode is used.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>Source file does not exist: <i>{X}</i></tt></b>&quot; shown when compiling.</td>

- *    <td>The nominated input source file, specified in the user project's <tt>SRC</tt> parameter, could not be found. Ensure the source file exists and the absolute or

- *        relative path given in the user project makefile is correct and try again.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>Doxygen configuration file <i>{X}</i> does not exist</tt></b>&quot; shown when upgrading a Doxygen configuration file.</td>

- *    <td>The nominated Doxygen configuration file, specified in the user project's <tt>DOXYGEN_CONF</tt> parameter, could not be found. Ensure the configuration file exists

- *        and the absolute or relative path given in the user project makefile is correct and try again, or run the appropriate makefile target to generate a new configuration

- *        file.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>avr-gcc: error: unrecognized option '<i>{X}</i>'</tt></b>&quot; shown when compiling.</td>

- *    <td>An unrecognised option was supplied to the compiler, usually in the <tt>C_FLAGS</tt>, <tt>CPP_FLAGS</tt>, <tt>ASM_FLAGS</tt> or <tt>CC_FLAGS</tt> configuration

- *        options. The nominated compiler switch may be invalid, or unsupported by the version of AVR-GCC on the host system. Remove the unrecognised flag if invalid, or

- *        upgrade to the latest AVR-GCC. If the option is a valid linker option, use the prefix "-Wl," to ensure it is passed to the linker correctly.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>makefile:{X}: {Y}.mk: No such file or directory</tt></b>&quot; shown when make is invoked.</td>

- *    <td>The path to the nominated makefile module was incorrect. This usually indicates that the makefile <tt>LUFA_PATH</tt> option is not set to a valid relative or

- *        absolute path to the LUFA library core.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>fatal error: LUFAConfig.h: No such file or directory</tt></b>&quot; shown when compiling.</td>

- *    <td>The <tt>USE_LUFA_CONFIG_HEADER</tt> compile time option was set in the user project makefile, but the user supplied <tt>LUFAConfig.h</tt> header could not be

- *        found. Ensure that the directory that contains this configuration file is correctly passed to the compiler via the -I switch in the makefile <tt>CC_FLAGS</tt>

- *        parameter.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>ld.exe: section .apitable_trampolines loaded at <i>{X}</i> overlaps section .text</tt></b>&quot; shown when compiling a bootloader.</td>

- *    <td>The bootloader is compiling too large for the given <tt>FLASH_SIZE_KB</tt> and <tt>BOOT_SECTION_SIZE_KB</tt> parameters set in the bootloader makefile. This

- *        usually indicates that these values are incorrect for the specified device the bootloader is targeting. If these values are correct, a newer version of the

- *        compiler may need to be used to ensure that the bootloader is built within the section size constraints of the target device.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>unknown MCU '<i>{X}</i>' specified</tt></b>&quot; shown when compiling.</td>

- *    <td>The specified microcontroller device model name set in the user application's makefile as the <tt>MCU</tt> parameter is incorrect, or unsupported by the

- *        version of the compiler being used. Make sure the model name is correct, or upgrade to the latest Atmel Toolchain to obtain newer device support.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>undefined reference to `<i>{X}</i>'</tt></b>&quot; shown when compiling.</td>

- *    <td>This is usually caused by a missing source file in the user application's <tt>SRC</tt> configuration parameter. If the indicated symbol is one from the LUFA

- *        library, you may be missing a LUFA source makefile module (see \ref Page_BuildModule_SOURCES).</td>

- *   </tr>

- *  </table>

- *

- *  For troubleshooting other errors you encounter, please see \ref Sec_ProjectHelp.

- */

+/** \file
+ *
+ *  This file contains special DoxyGen information for the generation of the main page and other special
+ *  documentation pages. It is not a project source file.
+ */
+
+/** \page Page_BuildSystem The LUFA Build System
+ *
+ *  \section Sec_BuildSystem_Overview Overview of the LUFA Build System
+ *  The LUFA build system is an attempt at making a set of re-usable, modular build make files which
+ *  can be referenced in a LUFA powered project, to minimize the amount of code required in an
+ *  application makefile. The system is written in GNU Make, and each module is independent of
+ *  one-another.
+ *
+ *  For details on the prerequisites needed for Linux and Windows machines to be able to use the LUFA
+ *  build system, see \ref Sec_CompilingApps_Prerequisites.
+ *
+ *  To use a LUFA build system module, simply add an include to your project makefile. All user projects
+ *  should at a minimum include \ref Page_BuildModule_CORE for base functionality:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_core.mk
+ *  \endcode
+ *
+ *  Once included in your project makefile, the associated build module targets will be added to your
+ *  project's build makefile targets automatically. To call a build target, run <tt>make {TARGET_NAME}</tt>
+ *  from the command line, substituting in the appropriate target name.
+ *
+ *  \see \ref Sec_ConfiguringApps_AppMakefileParams for a copy of the sample LUFA project makefile.
+ *
+ *  Each build module may have one or more mandatory parameters (GNU Make variables) which <i>must</i>
+ *  be supplied in the project makefile for the module to work, and one or more optional parameters which
+ *  may be defined and which will assume a sensible default if not.
+ *
+ *  \section SSec_BuildSystem_Modules Available Modules
+ *
+ *  The following modules are included in this LUFA release:
+ *
+ *  \li \subpage Page_BuildModule_ATPROGRAM - Device Programming
+ *  \li \subpage Page_BuildModule_AVRDUDE - Device Programming
+ *  \li \subpage Page_BuildModule_BUILD - Compiling/Assembling/Linking
+ *  \li \subpage Page_BuildModule_CORE - Core Build System Functions
+ *  \li \subpage Page_BuildModule_CPPCHECK - Static Code Analysis
+ *  \li \subpage Page_BuildModule_DFU - Device Programming
+ *  \li \subpage Page_BuildModule_DOXYGEN - Automated Source Code Documentation
+ *  \li \subpage Page_BuildModule_HID - Device Programming
+ *  \li \subpage Page_BuildModule_SOURCES - LUFA Module Source Code Variables
+ *
+ *  If you have problems building using the LUFA build system, see \subpage Page_BuildTroubleshooting for resolution steps.
+ */
+
+ /** \page Page_BuildModule_BUILD The BUILD build module
+ *
+ *  The BUILD LUFA build system module, providing targets for the compilation,
+ *  assembling and linking of an application from source code into binary files
+ *  suitable for programming into a target device, using the GCC compiler.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_build.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_BUILD_Requirements Requirements
+ *  This module requires the the architecture appropriate binaries of the GCC compiler are available in your
+ *  system's <b>PATH</b> variable. The GCC compiler and associated toolchain is distributed in Atmel AVR Studio
+ *  5.x and Atmel Studio 6.x installation directories, as well as in many third party distribution packages.
+ *
+ *  \section SSec_BuildModule_BUILD_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>size</tt></td>
+ *    <td>Display size of the compiled application FLASH and SRAM segments.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>symbol-sizes</tt></td>
+ *    <td>Display a size-sorted list of symbols from the compiled application, in decimal bytes.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>lib</tt></td>
+ *    <td>Build and archive all source files into a library A binary file.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>all</tt></td>
+ *    <td>Build and link the application into ELF debug and HEX binary files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>elf</tt></td>
+ *    <td>Build and link the application into an ELF debug file.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>bin</tt></td>
+ *    <td>Build and link the application and produce a BIN binary file.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>hex</tt></td>
+ *    <td>Build and link the application and produce HEX and EEP binary files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>lss</tt></td>
+ *    <td>Build and link the application and produce a LSS source code/assembly code mixed listing file.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>clean</tt></td>
+ *    <td>Remove all intermediary files and binary output files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>mostlyclean</tt></td>
+ *    <td>Remove all intermediary files but preserve any binary output files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt><i>&lt;filename&gt;</i>.s</tt></td>
+ *    <td>Create an assembly listing of a given input C/C++ source file.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_BUILD_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>TARGET</tt></td>
+ *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>ARCH</tt></td>
+ *    <td>Architecture of the target processor (see \ref Page_DeviceSupport).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>MCU</tt></td>
+ *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>SRC</tt></td>
+ *    <td>List of relative or absolute paths to the application C (.c), C++ (.cpp) and Assembly (.S) source files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>F_USB</tt></td>
+ *    <td>Speed in Hz of the input clock frequency to the target's USB controller.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LUFA_PATH</tt></td>
+ *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_BUILD_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>BOARD</tt></td>
+ *    <td>LUFA board hardware drivers to use (see \ref Page_DeviceSupport).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>OPTIMIZATION</tt></td>
+ *    <td>Optimization level to use when compiling source files (see GCC manual).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>C_STANDARD</tt></td>
+ *    <td>Version of the C standard to apply when compiling C++ source files (see GCC manual).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPP_STANDARD</tt></td>
+ *    <td>Version of the C++ standard to apply when compiling C++ source files (see GCC manual).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>DEBUG_FORMAT</tt></td>
+ *    <td>Format of the debug information to embed in the generated object files (see GCC manual).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>DEBUG_LEVEL</tt></td>
+ *    <td>Level of the debugging information to embed in the generated object files (see GCC manual).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>F_CPU</tt></td>
+ *    <td>Speed of the processor CPU clock, in Hz.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>C_FLAGS</tt></td>
+ *    <td>Flags to pass to the C compiler only, after the automatically generated flags.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPP_FLAGS</tt></td>
+ *    <td>Flags to pass to the C++ compiler only, after the automatically generated flags.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>ASM_FLAGS</tt></td>
+ *    <td>Flags to pass to the assembler only, after the automatically generated flags.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CC_FLAGS</tt></td>
+ *    <td>Common flags to pass to the C/C++ compiler and assembler, after the automatically generated flags.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>COMPILER_PATH</tt></td>
+ *    <td>Directory where the C/C++ toolchain is located, if not available in the system <tt>PATH</tt>.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LD_FLAGS</tt></td>
+ *    <td>Flags to pass to the linker, after the automatically generated flags.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LINKER_RELAXATIONS</tt></td>
+ *    <td>Enables or disables linker relaxations when linking the application binary. This can reduce the total size
+ *        of the application by replacing full \c CALL instructions with smaller \c RCALL instructions where possible.
+ *        \note On some unpatched versions of binutils, this can cause link failures in some circumstances. If you
+ *              receive a link error <tt>relocation truncated to fit: R_AVR_13_PCREL</tt>, disable this setting.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>OBJDIR</tt></td>
+ *    <td>Directory to place the generated object and dependency files. If set to "." the same folder as the source file will be used.
+ *        \note When this option is enabled, all source filenames <b>must</b> be unique.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>OBJECT_FILES</tt></td>
+ *    <td>List of additional object files that should be linked into the resulting binary.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_BUILD_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_BUILD_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+/** \page Page_BuildModule_CORE The CORE build module
+ *
+ *  The core LUFA build system module, providing common build system help and information targets.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_core.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_CORE_Requirements Requirements
+ *  This module has no requirements outside a standard *nix shell like environment; the <tt>sh</tt>
+ *  shell, GNU <tt>make</tt> and *nix CoreUtils (<tt>echo</tt>, <tt>printf</tt>, etc.).
+ *
+ *  \section SSec_BuildModule_CORE_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>help</tt></td>
+ *    <td>Display build system help and configuration information.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>list_targets</tt></td>
+ *    <td>List all available build targets from the build system.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>list_modules</tt></td>
+ *    <td>List all available build modules from the build system.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>list_mandatory</tt></td>
+ *    <td>List all mandatory parameters required by the included modules.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>list_optional</tt></td>
+ *    <td>List all optional parameters required by the included modules.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>list_provided</tt></td>
+ *    <td>List all variables provided by the included modules.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>list_macros</tt></td>
+ *    <td>List all macros provided by the included modules.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CORE_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CORE_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CORE_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CORE_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+/** \page Page_BuildModule_ATPROGRAM The ATPROGRAM build module
+ *
+ *  The ATPROGRAM programming utility LUFA build system module, providing targets to reprogram an
+ *  Atmel processor FLASH and EEPROM memories with a project's compiled binary output files.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_atprogram.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_ATPROGRAM_Requirements Requirements
+ *  This module requires the <tt>atprogram.exe</tt> utility to be available in your system's <b>PATH</b>
+ *  variable. The <tt>atprogram.exe</tt> utility is distributed in Atmel AVR Studio 5.x and Atmel Studio 6.x
+ *  inside the application install folder's "\atbackend" subdirectory.
+ *
+ *  \section SSec_BuildModule_ATPROGRAM_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>atprogram</tt></td>
+ *    <td>Program the device FLASH memory with the application's executable data.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>atprogram-ee</tt></td>
+ *    <td>Program the device EEPROM memory with the application's EEPROM data.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_ATPROGRAM_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>MCU</tt></td>
+ *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>TARGET</tt></td>
+ *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_ATPROGRAM_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>ATPROGRAM_PROGRAMMER</tt></td>
+ *    <td>Name of the Atmel programmer or debugger tool to communicate with (e.g. <tt>jtagice3</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>ATPROGRAM_INTERFACE</tt></td>
+ *    <td>Name of the programming interface to use when programming the target (e.g. <tt>spi</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>ATPROGRAM_PORT</tt></td>
+ *    <td>Name of the communication port to use when when programming with a serially connected tool (e.g. <tt>COM2</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_ATPROGRAM_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_ATPROGRAM_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+/** \page Page_BuildModule_AVRDUDE The AVRDUDE build module
+ *
+ *  The AVRDUDE programming utility LUFA build system module, providing targets to reprogram an
+ *  Atmel processor FLASH and EEPROM memories with a project's compiled binary output files.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_avrdude.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_AVRDUDE_Requirements Requirements
+ *  This module requires the <tt>avrdude</tt> utility to be available in your system's <b>PATH</b>
+ *  variable. The <tt>avrdude</tt> utility is distributed in the old WinAVR project releases for
+ *  Windows (<a>http://winavr.sourceforge.net</a>) or can be installed on *nix systems via the project's
+ *  source code (<a>https://savannah.nongnu.org/projects/avrdude</a>) or through the package manager.
+ *
+ *  \section SSec_BuildModule_AVRDUDE_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>avrdude</tt></td>
+ *    <td>Program the device FLASH memory with the application's executable data.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>avrdude-ee</tt></td>
+ *    <td>Program the device EEPROM memory with the application's EEPROM data.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_AVRDUDE_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>MCU</tt></td>
+ *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>TARGET</tt></td>
+ *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_AVRDUDE_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>AVRDUDE_PROGRAMMER</tt></td>
+ *    <td>Name of the programmer or debugger tool to communicate with (e.g. <tt>jtagicemkii</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>AVRDUDE_PORT</tt></td>
+ *    <td>Name of the communication port to use when when programming with the connected tool (e.g. <tt>COM2</tt>, <tt>/dev/ttyUSB0</tt> or <tt>usb</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>AVRDUDE_FLAGS</tt></td>
+ *    <td>Additional flags to pass to avrdude when programming, applied after the automatically generated flags.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_AVRDUDE_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_AVRDUDE_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+ /** \page Page_BuildModule_CPPCHECK The CPPCHECK build module
+ *
+ *  The CPPCHECK programming utility LUFA build system module, providing targets to statically
+ *  analyze C and C++ source code for errors and performance/style issues.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_cppcheck.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_CPPCHECK_Requirements Requirements
+ *  This module requires the <tt>cppcheck</tt> utility to be available in your system's <b>PATH</b>
+ *  variable. The <tt>cppcheck</tt> utility is distributed through the project's home page
+ *  (<a>http://cppcheck.sourceforge.net</a>) for Windows, and can be installed on *nix systems via
+ *  the project's source code or through the package manager.
+ *
+ *  \section SSec_BuildModule_CPPCHECK_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>cppcheck</tt></td>
+ *    <td>Statically analyze the project source code for issues.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>cppcheck-config</tt></td>
+ *    <td>Check the <tt>cppcheck</tt> configuration - scan source code and warn about missing header files and other issues.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CPPCHECK_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>SRC</tt></td>
+ *    <td>List of source files to statically analyze.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CPPCHECK_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>CPPCHECK_INCLUDES</tt></td>
+ *    <td>Path of extra directories to check when attemting to resolve C/C++ header file includes.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_EXCLUDES</tt></td>
+ *    <td>Paths or path fragments to exclude when analyzing.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_MSG_TEMPLATE</tt></td>
+ *    <td>Output message template to use when printing errors, warnings and information (see <tt>cppcheck</tt> documentation).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_ENABLE</tt></td>
+ *    <td>Analysis rule categories to enable (see <tt>cppcheck</tt> documentation).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_SUPPRESS</tt></td>
+ *    <td>Specific analysis rules to suppress (see <tt>cppcheck</tt> documentation).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_FAIL_ON_WARNING</tt></td>
+ *    <td>Set to <b>Y</b> to fail the analysis job with an error exit code if warnings are found, <b>N</b> to continue without failing.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_QUIET</tt></td>
+ *    <td>Set to <b>Y</b> to suppress all output except warnings and errors, <b>N</b> to show verbose output information.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_FLAGS</tt></td>
+ *    <td>Extra flags to pass to <tt>cppcheck</tt>, after the automatically generated flags.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CPPCHECK_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CPPCHECK_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+ /** \page Page_BuildModule_DFU The DFU build module
+ *
+ *  The DFU programming utility LUFA build system module, providing targets to reprogram an
+ *  Atmel processor FLASH and EEPROM memories with a project's compiled binary output files.
+ *  This module requires a DFU class bootloader to be running in the target, compatible with
+ *  the DFU bootloader protocol as published by Atmel.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_dfu.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_DFU_Requirements Requirements
+ *  This module requires either the <tt>batchisp</tt> utility from Atmel's FLIP utility, or the open
+ *  source <tt>dfu-programmer</tt> utility (<a>http://dfu-programmer.sourceforge.net/</a>) to be
+ *  available in your system's <b>PATH</b> variable. On *nix systems the <tt>dfu-programmer</tt> utility
+ *  can be installed via the project's source code or through the package manager.
+ *
+ *  \section SSec_BuildModule_DFU_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>dfu</tt></td>
+ *    <td>Program the device FLASH memory with the application's executable data using <tt>dfu-programmer</tt>.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>dfu-ee</tt></td>
+ *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>dfu-programmer</tt>.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>flip</tt></td>
+ *    <td>Program the device FLASH memory with the application's executable data using <tt>batchisp</tt>.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>flip-ee</tt></td>
+ *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>batchisp</tt>.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DFU_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>MCU</tt></td>
+ *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>TARGET</tt></td>
+ *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DFU_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DFU_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DFU_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+ /** \page Page_BuildModule_DOXYGEN The DOXYGEN build module
+ *
+ *  The DOXYGEN code documentation utility LUFA build system module, providing targets to generate
+ *  project HTML and other format documentation from a set of source files that include special
+ *  Doxygen comments.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_doxygen.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_DOXYGEN_Requirements Requirements
+ *  This module requires the <tt>doxygen</tt> utility from the Doxygen website
+ *  (<a>http://www.doxygen.org/</a>) to be available in your system's <b>PATH</b> variable. On *nix
+ *  systems the <tt>doxygen</tt> utility can be installed via the project's source code or through
+ *  the package manager.
+ *
+ *  \section SSec_BuildModule_DOXYGEN_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>doxygen</tt></td>
+ *    <td>Generate project documentation.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>doxygen_create</tt></td>
+ *    <td>Create a new Doxygen configuration file using the latest template.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>doxygen_upgrade</tt></td>
+ *    <td>Upgrade an existing Doxygen configuration file to the latest template</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DOXYGEN_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>LUFA_PATH</tt></td>
+ *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DOXYGEN_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>DOXYGEN_CONF</tt></td>
+ *    <td>Name and path of the base Doxygen configuration file for the project.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>DOXYGEN_FAIL_ON_WARNING</tt></td>
+ *    <td>Set to <b>Y</b> to fail the generation with an error exit code if warnings are found other than unsupported configuration parameters, <b>N</b> to continue without failing.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>DOXYGEN_OVERRIDE_PARAMS</tt></td>
+ *    <td>Extra Doxygen configuration parameters to apply, overriding the corresponding config entry in the project's configuration file (e.g. <tt>QUIET=YES</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DOXYGEN_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DOXYGEN_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+ /** \page Page_BuildModule_HID The HID build module
+ *
+ *  The HID programming utility LUFA build system module, providing targets to reprogram an
+ *  Atmel processor's FLASH memory with a project's compiled binary output file. This module
+ *  requires a HID class bootloader to be running in the target, using a protocol compatible
+ *  with the PJRC "HalfKay" protocol (<a>http://www.pjrc.com/teensy/halfkay_protocol.html</a>).
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_hid.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_HID_Requirements Requirements
+ *  This module requires either the <tt>hid_bootloader_cli</tt> utility from the included LUFA HID
+ *  class bootloader API subdirectory, or the <tt>teensy_loader_cli</tt> utility from PJRC
+ *  (<a>http://www.pjrc.com/teensy/loader_cli.html</a>) to be available in your system's <b>PATH</b>
+ *  variable.
+ *
+ *  \section SSec_BuildModule_HID_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>hid</tt></td>
+ *    <td>Program the device FLASH memory with the application's executable data using <tt>hid_bootloader_cli</tt>.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>hid-ee</tt></td>
+ *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>hid_bootloader_cli</tt> and
+ *        a temporary AVR application programmed into the target's FLASH.
+ *        \note This will erase the currently loaded application in the target.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>teensy</tt></td>
+ *    <td>Program the device FLASH memory with the application's executable data using <tt>teensy_loader_cli</tt>.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>teensy-ee</tt></td>
+ *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>teensy_loader_cli</tt> and
+ *        a temporary AVR application programmed into the target's FLASH.
+ *        \note This will erase the currently loaded application in the target.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_HID_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>MCU</tt></td>
+ *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>TARGET</tt></td>
+ *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_HID_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_HID_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_HID_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+ /** \page Page_BuildModule_SOURCES The SOURCES build module
+ *
+ *  The SOURCES LUFA build system module, providing variables listing the various LUFA source files
+ *  required to be build by a project for a given LUFA module. This module gives a way to reference
+ *  LUFA source files symbolically, so that changes to the library structure do not break the library
+ *  makefile.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_sources.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_SOURCES_Requirements Requirements
+ *  None.
+ *
+ *  \section SSec_BuildModule_SOURCES_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_SOURCES_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>LUFA_PATH</tt></td>
+ *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>ARCH</tt></td>
+ *    <td>Architecture of the target processor (see \ref Page_DeviceSupport).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_SOURCES_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_SOURCES_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>LUFA_SRC_USB</tt></td>
+ *    <td>List of LUFA USB driver source files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LUFA_SRC_USBCLASS</tt></td>
+ *    <td>List of LUFA USB Class driver source files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LUFA_SRC_TEMPERATURE</tt></td>
+ *    <td>List of LUFA temperature sensor driver source files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LUFA_SRC_SERIAL</tt></td>
+ *    <td>List of LUFA Serial U(S)ART driver source files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LUFA_SRC_TWI</tt></td>
+ *    <td>List of LUFA TWI driver source files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LUFA_SRC_PLATFORM</tt></td>
+ *    <td>List of LUFA architecture specific platform management source files.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_SOURCES_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+/** \page Page_BuildTroubleshooting Troubleshooting Information
+ *
+ *  LUFA uses a lot of advanced features of the AVR-GCC compiler, linker, and surrounding binaries. This can sometimes lead to problems compiling applications if one of these
+ *  features is buggy in the version of the tools used in a build environment. Missing utilities and incorrectly set makefile configuration options can also result in different
+ *  errors being produced when compilation or other operations are attempted. The table below lists a set of commonly encountered errors and their resolutions.
+ *
+ *  <table>
+ *    <tr>
+ *    <th>Problem</th>
+ *    <th>Resolution</th>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>relocation truncated to fit: R_AVR_13_PCREL against symbol <i>{X}</i></tt></b>&quot; shown when compiling.</td>
+ *    <td>Try compiling with the setting <tt>LINKER_RELAXATIONS=N</tt> in your LUFA Build System 2.0 makefile, or remove the line <tt>-Wl,--relax</tt>
+ *        from other makefiles. Alternatively, make sure you have the latest version of the Atmel Toolchain installed for your system.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>error: ld terminated with signal 11 [Segmentation fault]</tt></b>&quot; shown when compiling.</td>
+ *    <td>Try compiling with the setting <tt>DEBUG_LEVEL=2</tt> in your LUFA Build System 2.0 makefile, or make sure you are using <tt>binutils</tt> version 2.22 or later.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>EMERGENCY ABORT: INFINITE RECURSION DETECTED</tt></b>&quot; shown when compiling.</td>
+ *    <td>Make sure you are using an up to date version of GNU Make when compiling. This error is a safety system added to the mid-level makefiles, to prevent an issue with
+ *        GNU make or other variants of Make causing an infinitely recursive build.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Unsupported architecture &quot;<i>{X}</i>&quot;</tt></b>&quot; shown when compiling.</td>
+ *    <td>Ensure your makefile's <tt>ARCH</tt> setting is set to one of the architecture names (case-sensitive) supported by the version of LUFA you are compiling against.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Makefile <i>{X}</i> value not set</tt></b>&quot; shown when compiling.</td>
+ *    <td>The specified Makefile value was not configured in your project's makefile or on the command line, and the nominated setting is required by one or more LUFA
+ *        build system modules. Define the value in your project makefile and try again.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Makefile <i>{X}</i> option cannot be blank</tt></b>&quot; shown when compiling.</td>
+ *    <td>The specified Makefile value was configured in your project's makefile or on the command line, but was set to an empty value. For the nominated configuration
+ *        option, an empty value is not allowed. Define the nominated setting to a correct non-blank value and try again.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Makefile <i>{X}</i> option must be Y or N</tt></b>&quot; shown when compiling.</td>
+ *    <td>The specified Makefile value was configured in your project's makefile or on the command line, but was set to a value other than a Y (for "Yes") or "N" (for "No").
+ *        This configuration option is required to be one of the aforementioned boolean values, and other values are invalid. Set this option to either Y or N and try again.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Unknown input source file formats: <i>{X}</i></tt></b>&quot; shown when compiling.</td>
+ *    <td>The nominated source files, specified in your project's makefile in the <tt>SRC</tt> configuration option, has an extension that the LUFA build system does not
+ *        recognise. The file extensions are case sensitive, and must be one of the supported formats (<tt>*.c</tt>, <tt>*.cpp</tt> or <tt>*.S</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Cannot build with OBJDIR parameter set - one or more object file name is not unique</tt></b>&quot; shown when compiling.</td>
+ *    <td>When a project is built with a non-empty <tt>OBJDIR</tt> object directory name set, all input source files must have unique names, excluding extension and path.
+ *        This means that input files that are named identically and differ only by their path or extension are invalid when this mode is used.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Source file does not exist: <i>{X}</i></tt></b>&quot; shown when compiling.</td>
+ *    <td>The nominated input source file, specified in the user project's <tt>SRC</tt> parameter, could not be found. Ensure the source file exists and the absolute or
+ *        relative path given in the user project makefile is correct and try again.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Doxygen configuration file <i>{X}</i> does not exist</tt></b>&quot; shown when upgrading a Doxygen configuration file.</td>
+ *    <td>The nominated Doxygen configuration file, specified in the user project's <tt>DOXYGEN_CONF</tt> parameter, could not be found. Ensure the configuration file exists
+ *        and the absolute or relative path given in the user project makefile is correct and try again, or run the appropriate makefile target to generate a new configuration
+ *        file.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>avr-gcc: error: unrecognized option '<i>{X}</i>'</tt></b>&quot; shown when compiling.</td>
+ *    <td>An unrecognised option was supplied to the compiler, usually in the <tt>C_FLAGS</tt>, <tt>CPP_FLAGS</tt>, <tt>ASM_FLAGS</tt> or <tt>CC_FLAGS</tt> configuration
+ *        options. The nominated compiler switch may be invalid, or unsupported by the version of AVR-GCC on the host system. Remove the unrecognised flag if invalid, or
+ *        upgrade to the latest AVR-GCC. If the option is a valid linker option, use the prefix "-Wl," to ensure it is passed to the linker correctly.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>makefile:{X}: {Y}.mk: No such file or directory</tt></b>&quot; shown when make is invoked.</td>
+ *    <td>The path to the nominated makefile module was incorrect. This usually indicates that the makefile <tt>LUFA_PATH</tt> option is not set to a valid relative or
+ *        absolute path to the LUFA library core.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>fatal error: LUFAConfig.h: No such file or directory</tt></b>&quot; shown when compiling.</td>
+ *    <td>The <tt>USE_LUFA_CONFIG_HEADER</tt> compile time option was set in the user project makefile, but the user supplied <tt>LUFAConfig.h</tt> header could not be
+ *        found. Ensure that the directory that contains this configuration file is correctly passed to the compiler via the -I switch in the makefile <tt>CC_FLAGS</tt>
+ *        parameter.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>ld.exe: section .apitable_trampolines loaded at <i>{X}</i> overlaps section .text</tt></b>&quot; shown when compiling a bootloader.</td>
+ *    <td>The bootloader is compiling too large for the given <tt>FLASH_SIZE_KB</tt> and <tt>BOOT_SECTION_SIZE_KB</tt> parameters set in the bootloader makefile. This
+ *        usually indicates that these values are incorrect for the specified device the bootloader is targeting. If these values are correct, a newer version of the
+ *        compiler may need to be used to ensure that the bootloader is built within the section size constraints of the target device.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>unknown MCU '<i>{X}</i>' specified</tt></b>&quot; shown when compiling.</td>
+ *    <td>The specified microcontroller device model name set in the user application's makefile as the <tt>MCU</tt> parameter is incorrect, or unsupported by the
+ *        version of the compiler being used. Make sure the model name is correct, or upgrade to the latest Atmel Toolchain to obtain newer device support.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>undefined reference to `<i>{X}</i>'</tt></b>&quot; shown when compiling.</td>
+ *    <td>This is usually caused by a missing source file in the user application's <tt>SRC</tt> configuration parameter. If the indicated symbol is one from the LUFA
+ *        library, you may be missing a LUFA source makefile module (see \ref Page_BuildModule_SOURCES).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  For troubleshooting other errors you encounter, please see \ref Sec_ProjectHelp.
+ */
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/mshelp/placeholder.txt b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/mshelp/placeholder.txt
index 486e9a4270..a34fd58dfa 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/mshelp/placeholder.txt
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/mshelp/placeholder.txt
@@ -1 +1 @@
-Copy the Microsoft HV1 Docbook transform contents into this directory (i.e. with the XSLT files in the current folder). The HV1 transform proposal can be found at http://sourceforge.net/tracker/?func=detail&aid=3610290&group_id=21935&atid=373750 .

+Copy the Microsoft HV1 Docbook transform contents into this directory (i.e. with the XSLT files in the current folder). The HV1 transform proposal can be found at http://sourceforge.net/tracker/?func=detail&aid=3610290&group_id=21935&atid=373750 .
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/placeholder.txt b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/placeholder.txt
index c017acfd75..dd69b7e0bd 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/placeholder.txt
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/placeholder.txt
@@ -1 +1 @@
-Copy the Docbook XSLT docbook-xsl-1.78.1 release contents into this directory (i.e. with the root Docbook files in the current folder). The Docbook releases can be found at http://sourceforge.net/projects/docbook/files/docbook-xsl/ .

+Copy the Docbook XSLT docbook-xsl-1.78.1 release contents into this directory (i.e. with the root Docbook files in the current folder). The Docbook releases can be found at http://sourceforge.net/projects/docbook/files/docbook-xsl/ .
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_hv1_transform.xslt b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_hv1_transform.xslt
index ee8a38340d..8aa4a9413e 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_hv1_transform.xslt
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_hv1_transform.xslt
@@ -1,45 +1,45 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Docbook XML to Microsoft Help Viewer 1.0 transform file -->

-

-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

-

-	<xsl:import href="../Docbook/mshelp/docbook.xsl"/>

-

-	<xsl:output method="xml" indent="no"/>

-

-	<xsl:template match="emphasis[@role = 'keyword' or @role = 'keywordtype' or @role = 'keywordflow']">

-		<span class="hl-keyword" style="color: #0079C1">

-			<xsl:apply-templates/>

-		</span>

-	</xsl:template>

-

-	<xsl:template match="emphasis[@role = 'stringliteral' or @role = 'charliteral']">

-		<span class="hl-string" style="color: #800000">

-			<xsl:apply-templates/>

-		</span>

-	</xsl:template>

-

-	<xsl:template match="emphasis[@role = 'comment']">

-		<em class="hl-comment" style="color: #008000">

-			<xsl:apply-templates/>

-		</em>

-	</xsl:template>

-

-	<xsl:template match="emphasis[@role = 'preprocessor']">

-		<span class="hl-preprocessor" style="color: #A000A0">

-			<xsl:apply-templates/>

-		</span>

-	</xsl:template>

-

-	<xsl:template match="emphasis[@role = 'normal' and ancestor::programlisting]">

-		<xsl:apply-templates />

-	</xsl:template>

-

-</xsl:stylesheet>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Docbook XML to Microsoft Help Viewer 1.0 transform file -->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+	<xsl:import href="../Docbook/mshelp/docbook.xsl"/>
+
+	<xsl:output method="xml" indent="no"/>
+
+	<xsl:template match="emphasis[@role = 'keyword' or @role = 'keywordtype' or @role = 'keywordflow']">
+		<span class="hl-keyword" style="color: #0079C1">
+			<xsl:apply-templates/>
+		</span>
+	</xsl:template>
+
+	<xsl:template match="emphasis[@role = 'stringliteral' or @role = 'charliteral']">
+		<span class="hl-string" style="color: #800000">
+			<xsl:apply-templates/>
+		</span>
+	</xsl:template>
+
+	<xsl:template match="emphasis[@role = 'comment']">
+		<em class="hl-comment" style="color: #008000">
+			<xsl:apply-templates/>
+		</em>
+	</xsl:template>
+
+	<xsl:template match="emphasis[@role = 'preprocessor']">
+		<span class="hl-preprocessor" style="color: #A000A0">
+			<xsl:apply-templates/>
+		</span>
+	</xsl:template>
+
+	<xsl:template match="emphasis[@role = 'normal' and ancestor::programlisting]">
+		<xsl:apply-templates />
+	</xsl:template>
+
+</xsl:stylesheet>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_studio_help_styling.css b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_studio_help_styling.css
index 49eb7e9706..0b6ccbd8c1 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_studio_help_styling.css
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_studio_help_styling.css
@@ -1,53 +1,53 @@
-/*

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

-*/

-

-.programlisting {

- 	display: block;

- 	margin-left: 15px;

- 	padding: 10px;

- 	background-color: #f4f4f4;

- 	border: 1px solid #aaaaaa;

- 	font-family: "Consolas", "Courier New", sans-serif;

- }

-

- code {

- 	background-color: #f4f4f4;

- 	font-family: "Consolas", "Courier New", sans-serif;

- }

-

-.note, .warning, .tip {

-	display: block;

- 	margin-left: 15px;

- 	padding-left: 10px;

- 	padding-bottom: 5px;

- 	background-color: #f4f4f4;

- 	border: 1px solid #aaaaaa;

-}

-

-table {

-	border: 1px solid #aaaaaa;

-	border-collapse: collapse;

-	margin-left: 15px;

-	font-size: 10pt;

-}

-

-table thead {

- 	background-color: #f4f4f4;

-}

-

-table thead th {

-	padding: 5px;

-}

-

-table tbody td {

-	padding: 5px;

-}

-

-ul {

-	padding-left: 20px;

-}

+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+.programlisting {
+ 	display: block;
+ 	margin-left: 15px;
+ 	padding: 10px;
+ 	background-color: #f4f4f4;
+ 	border: 1px solid #aaaaaa;
+ 	font-family: "Consolas", "Courier New", sans-serif;
+ }
+
+ code {
+ 	background-color: #f4f4f4;
+ 	font-family: "Consolas", "Courier New", sans-serif;
+ }
+
+.note, .warning, .tip {
+	display: block;
+ 	margin-left: 15px;
+ 	padding-left: 10px;
+ 	padding-bottom: 5px;
+ 	background-color: #f4f4f4;
+ 	border: 1px solid #aaaaaa;
+}
+
+table {
+	border: 1px solid #aaaaaa;
+	border-collapse: collapse;
+	margin-left: 15px;
+	font-size: 10pt;
+}
+
+table thead {
+ 	background-color: #f4f4f4;
+}
+
+table thead th {
+	padding: 5px;
+}
+
+table tbody td {
+	padding: 5px;
+}
+
+ul {
+	padding-left: 20px;
+}
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/[Content_Types].xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/[Content_Types].xml
index 05ef8b6ba4..112d169942 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/[Content_Types].xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/[Content_Types].xml
@@ -1,13 +1,13 @@
-<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">

-	<Default Extension="vsixmanifest" ContentType="text/xml"/>

-	<Default Extension="cache" ContentType="text/xml"/>

-	<Default Extension="png" ContentType="application/octet-stream"/>

-	<Default Extension="txt" ContentType="text/plain"/>

-	<Default Extension="xml" ContentType="text/xml"/>

-	<Default Extension="zip" ContentType="application/octet-stream"/>

-	<Default Extension="dll" ContentType="application/octet-stream" />

-	<Default Extension="pkgdef" ContentType="text/plain" />

-	<Default Extension="htm" ContentType="text/html" />

-	<Default Extension="msha" ContentType="text/html" />

-	<Default Extension="mshc" ContentType="application/octet-stream"/>

-</Types>

+<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
+	<Default Extension="vsixmanifest" ContentType="text/xml"/>
+	<Default Extension="cache" ContentType="text/xml"/>
+	<Default Extension="png" ContentType="application/octet-stream"/>
+	<Default Extension="txt" ContentType="text/plain"/>
+	<Default Extension="xml" ContentType="text/xml"/>
+	<Default Extension="zip" ContentType="application/octet-stream"/>
+	<Default Extension="dll" ContentType="application/octet-stream" />
+	<Default Extension="pkgdef" ContentType="text/plain" />
+	<Default Extension="htm" ContentType="text/html" />
+	<Default Extension="msha" ContentType="text/html" />
+	<Default Extension="mshc" ContentType="application/octet-stream"/>
+</Types>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/asf-manifest.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/asf-manifest.xml
index 794fd689e1..bd969518a1 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/asf-manifest.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/asf-manifest.xml
@@ -1,18 +1,18 @@
-<AsfContentProvider Version="1.0.0">

-	<Identifier Id="0e160d5c-e331-48d9-850b-e0387912171b">

-		<Org>FourWalledCubicle</Org>

-		<ShortName>LUFA</ShortName>

-		<Author>Dean Camera</Author>

-		<Description/>

-		<FollowFolderStructure>True</FollowFolderStructure>

-	</Identifier>

-	<AsfContent Type="zip" Path="contents.zip">

-		<Content>

-			<Version>0</Version>

-			<HelpURL/>

-			<Locator/>

-			<DbXMLPath>content.xml.cache</DbXMLPath>

-			<Description/>

-		</Content>

-	</AsfContent>

-</AsfContentProvider>

+<AsfContentProvider Version="1.0.0">
+	<Identifier Id="0e160d5c-e331-48d9-850b-e0387912171b">
+		<Org>FourWalledCubicle</Org>
+		<ShortName>LUFA</ShortName>
+		<Author>Dean Camera</Author>
+		<Description/>
+		<FollowFolderStructure>True</FollowFolderStructure>
+	</Identifier>
+	<AsfContent Type="zip" Path="contents.zip">
+		<Content>
+			<Version>0</Version>
+			<HelpURL/>
+			<Locator/>
+			<DbXMLPath>content.xml.cache</DbXMLPath>
+			<Description/>
+		</Content>
+	</AsfContent>
+</AsfContentProvider>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/extension.vsixmanifest b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/extension.vsixmanifest
index ea6edeb258..8475017443 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/extension.vsixmanifest
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/extension.vsixmanifest
@@ -1,33 +1,33 @@
-<?xml version="1.0" encoding="utf-8"?>

-

-<Vsix xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2010">

-	<Identifier Id="FourWalledCubicle.LUFA.0e160d5c-e331-48d9-850b-e0387912171b">

-		<Name>LUFA Library</Name>

-		<Author>Dean Camera</Author>

-		<Version>0</Version>

-		<MoreInfoUrl>http://www.lufa-lib.org</MoreInfoUrl>

-		<Description xml:space="preserve">LUFA, the Lightweight USB Framework for AVRs.</Description>

-

-		<License>License.txt</License>

-		<Icon>LUFA_thumb.png</Icon>

-		<PreviewImage>LUFA.png</PreviewImage>

-

-		<SupportedProducts>

-			<IsolatedShell Version="6.1">AtmelStudio</IsolatedShell>

-			<IsolatedShell Version="6.2">AtmelStudio</IsolatedShell>

-		</SupportedProducts>

-

-		<SupportedFrameworkRuntimeEdition MinVersion="4.0" MaxVersion="4.5"/>

-		<Locale>1033</Locale>

-

-	    <AllUsers>false</AllUsers>

-	</Identifier>

-

-	<References/>

-

-	<Content>

-		<VsPackage>LUFA.pkgdef</VsPackage>

-	    <CustomExtension Type="MSHelp">helpcontentsetup.msha</CustomExtension>

-		<CustomExtension Type="asf-manifest">asf-manifest.xml</CustomExtension>

-	</Content>

-</Vsix>

+<?xml version="1.0" encoding="utf-8"?>
+
+<Vsix xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2010">
+	<Identifier Id="FourWalledCubicle.LUFA.0e160d5c-e331-48d9-850b-e0387912171b">
+		<Name>LUFA Library</Name>
+		<Author>Dean Camera</Author>
+		<Version>0</Version>
+		<MoreInfoUrl>http://www.lufa-lib.org</MoreInfoUrl>
+		<Description xml:space="preserve">LUFA, the Lightweight USB Framework for AVRs.</Description>
+
+		<License>License.txt</License>
+		<Icon>LUFA_thumb.png</Icon>
+		<PreviewImage>LUFA.png</PreviewImage>
+
+		<SupportedProducts>
+			<IsolatedShell Version="6.1">AtmelStudio</IsolatedShell>
+			<IsolatedShell Version="6.2">AtmelStudio</IsolatedShell>
+		</SupportedProducts>
+
+		<SupportedFrameworkRuntimeEdition MinVersion="4.0" MaxVersion="4.5"/>
+		<Locale>1033</Locale>
+
+	    <AllUsers>false</AllUsers>
+	</Identifier>
+
+	<References/>
+
+	<Content>
+		<VsPackage>LUFA.pkgdef</VsPackage>
+	    <CustomExtension Type="MSHelp">helpcontentsetup.msha</CustomExtension>
+		<CustomExtension Type="asf-manifest">asf-manifest.xml</CustomExtension>
+	</Content>
+</Vsix>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/generate_caches.py b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/generate_caches.py
index c51cff400d..eb4b71efdf 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/generate_caches.py
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/generate_caches.py
@@ -1,38 +1,38 @@
-"""

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

-"""

-

-import sys

-sys.path.append("ProjectGenerator")

-

-

-def show_message(message):

-    print("[Project Generator] %s" % message)

-    sys.stdout.flush()

-

-

-def main(lufa_root_path):

-    try:

-        from asf_avrstudio5_interface import PythonFacade

-    except ImportError:

-        print("Fatal Error: The ASF project generator is missing.")

-        return 1

-

-    p = PythonFacade(lufa_root_path)

-

-    show_message("Checking database sanity...")

-    p.check_extension_database_sanity(lufa_root_path)

-

-    show_message("Building cache files...")

-    p.generate_extension_cache_files(lufa_root_path)

-

-    show_message("Cache files created.")

-    return 0

-

-

-if __name__ == "__main__":

-    sys.exit(main(sys.argv[1]))

+"""
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+"""
+
+import sys
+sys.path.append("ProjectGenerator")
+
+
+def show_message(message):
+    print("[Project Generator] %s" % message)
+    sys.stdout.flush()
+
+
+def main(lufa_root_path):
+    try:
+        from asf_avrstudio5_interface import PythonFacade
+    except ImportError:
+        print("Fatal Error: The ASF project generator is missing.")
+        return 1
+
+    p = PythonFacade(lufa_root_path)
+
+    show_message("Checking database sanity...")
+    p.check_extension_database_sanity(lufa_root_path)
+
+    show_message("Building cache files...")
+    p.generate_extension_cache_files(lufa_root_path)
+
+    show_message("Cache files created.")
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv[1]))
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa.xml
index 28afdda587..86cfc0409d 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa.xml
@@ -1,96 +1,96 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<extension-container>

-		<extension uuid="0e160d5c-e331-48d9-850b-e0387912171b" org="FourWalledCubicle" shortname="LUFA" version="" fullname="Lightweight USB Framework for AVRs (LUFA)">

-			<author name="Dean Camera" website="http://www.lufa-lib.org/" email="dean@fourwalledcubicle.com"/>

-			<description>Lightweight USB Framework for AVRs (LUFA), a USB software stack/framework.</description>

-			<icon-image path="LUFA/DoxygenPages/Images/LUFA_thumb.png"/>

-			<preview-image path="LUFA/DoxygenPages/Images/LUFA.png"/>

-			<license caption="LUFA License" path="LUFA/License.txt"/>

-			<release-notes caption="LUFA Information" url="http://www.lufa-lib.org"/>

-			<online-help>

-				<index-page caption="LUFA Documentation" url="http://www.lufa-lib.org/documentation/"/>

-				<module-help-page scheme="append" baseurl="http://www.lufa-lib.org/documentation/"/>

-				<module-guide-page scheme="append" baseurl="http://www.lufa-lib.org/documentation/"/>

-			</online-help>

-			<dependencies/>

-		</extension>

-	</extension-container>

-

-	<asf>

-		<device-alias-map name="lufa_avr8">

-			<device-support value="at90usb82"/>

-			<device-support value="atmega8u2"/>

-			<device-support value="at90usb162"/>

-			<device-support value="atmega16u2"/>

-			<device-support value="atmega16u4"/>

-			<device-support value="atmega32u2"/>

-			<device-support value="atmega32u4"/>

-			<device-support value="at90usb646"/>

-			<device-support value="at90usb647"/>

-			<device-support value="at90usb1286"/>

-			<device-support value="at90usb1287"/>

-		</device-alias-map>

-

-		<device-alias-map name="lufa_xmega">

-			<device-support value="atxmega16a4u"/>

-			<device-support value="atxmega32a4u"/>

-			<device-support value="atxmega64a4u"/>

-			<device-support value="atxmega128a4u"/>

-			<device-support value="atxmega64a3u"/>

-			<device-support value="atxmega128a3u"/>

-			<device-support value="atxmega192a3u"/>

-			<device-support value="atxmega256a3u"/>

-			<device-support value="atxmega256a3bu"/>

-			<device-support value="atxmega128a1u"/>

-			<device-support value="atxmega64b3"/>

-			<device-support value="atxmega128b3"/>

-			<device-support value="atxmega64b1"/>

-			<device-support value="atxmega128b1"/>

-			<device-support value="atxmega64c3"/>

-			<device-support value="atxmega128c3"/>

-			<!-- <device-support value="atxmega192c3"/> Wait for ASFP-3339 merge and release before enabling -->

-			<device-support value="atxmega256c3"/>

-			<device-support value="atxmega384c3"/>

-			<device-support value="atxmega16c4"/>

-		</device-alias-map>

-

-		<device-alias-map name="lufa_uc3">

-			<device-support value="at32uc3a364"/>

-			<device-support value="at32uc3a364s"/>

-			<device-support value="at32uc3a464"/>

-			<device-support value="at32uc3a464s"/>

-			<device-support value="at32uc3b064"/>

-			<device-support value="at32uc3b164"/>

-			<device-support value="at32uc3a0128"/>

-			<device-support value="at32uc3a1128"/>

-			<device-support value="at32uc3a3128"/>

-			<device-support value="at32uc3a3128s"/>

-			<device-support value="at32uc3a4128"/>

-			<device-support value="at32uc3a4128s"/>

-			<device-support value="at32uc3b0128"/>

-			<device-support value="at32uc3b1128"/>

-			<device-support value="at32uc3a0256"/>

-			<device-support value="at32uc3a1256"/>

-			<device-support value="at32uc3a3256"/>

-			<device-support value="at32uc3a3256s"/>

-			<device-support value="at32uc3a4256"/>

-			<device-support value="at32uc3a4256s"/>

-			<device-support value="at32uc3b0256"/>

-			<device-support value="at32uc3b1256"/>

-			<device-support value="at32uc3a0512"/>

-			<device-support value="at32uc3a1512"/>

-			<device-support value="at32uc3b0512"/>

-			<device-support value="at32uc3b1512"/>

-		</device-alias-map>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<extension-container>
+		<extension uuid="0e160d5c-e331-48d9-850b-e0387912171b" org="FourWalledCubicle" shortname="LUFA" version="" fullname="Lightweight USB Framework for AVRs (LUFA)">
+			<author name="Dean Camera" website="http://www.lufa-lib.org/" email="dean@fourwalledcubicle.com"/>
+			<description>Lightweight USB Framework for AVRs (LUFA), a USB software stack/framework.</description>
+			<icon-image path="LUFA/DoxygenPages/Images/LUFA_thumb.png"/>
+			<preview-image path="LUFA/DoxygenPages/Images/LUFA.png"/>
+			<license caption="LUFA License" path="LUFA/License.txt"/>
+			<release-notes caption="LUFA Information" url="http://www.lufa-lib.org"/>
+			<online-help>
+				<index-page caption="LUFA Documentation" url="http://www.lufa-lib.org/documentation/"/>
+				<module-help-page scheme="append" baseurl="http://www.lufa-lib.org/documentation/"/>
+				<module-guide-page scheme="append" baseurl="http://www.lufa-lib.org/documentation/"/>
+			</online-help>
+			<dependencies/>
+		</extension>
+	</extension-container>
+
+	<asf>
+		<device-alias-map name="lufa_avr8">
+			<device-support value="at90usb82"/>
+			<device-support value="atmega8u2"/>
+			<device-support value="at90usb162"/>
+			<device-support value="atmega16u2"/>
+			<device-support value="atmega16u4"/>
+			<device-support value="atmega32u2"/>
+			<device-support value="atmega32u4"/>
+			<device-support value="at90usb646"/>
+			<device-support value="at90usb647"/>
+			<device-support value="at90usb1286"/>
+			<device-support value="at90usb1287"/>
+		</device-alias-map>
+
+		<device-alias-map name="lufa_xmega">
+			<device-support value="atxmega16a4u"/>
+			<device-support value="atxmega32a4u"/>
+			<device-support value="atxmega64a4u"/>
+			<device-support value="atxmega128a4u"/>
+			<device-support value="atxmega64a3u"/>
+			<device-support value="atxmega128a3u"/>
+			<device-support value="atxmega192a3u"/>
+			<device-support value="atxmega256a3u"/>
+			<device-support value="atxmega256a3bu"/>
+			<device-support value="atxmega128a1u"/>
+			<device-support value="atxmega64b3"/>
+			<device-support value="atxmega128b3"/>
+			<device-support value="atxmega64b1"/>
+			<device-support value="atxmega128b1"/>
+			<device-support value="atxmega64c3"/>
+			<device-support value="atxmega128c3"/>
+			<!-- <device-support value="atxmega192c3"/> Wait for ASFP-3339 merge and release before enabling -->
+			<device-support value="atxmega256c3"/>
+			<device-support value="atxmega384c3"/>
+			<device-support value="atxmega16c4"/>
+		</device-alias-map>
+
+		<device-alias-map name="lufa_uc3">
+			<device-support value="at32uc3a364"/>
+			<device-support value="at32uc3a364s"/>
+			<device-support value="at32uc3a464"/>
+			<device-support value="at32uc3a464s"/>
+			<device-support value="at32uc3b064"/>
+			<device-support value="at32uc3b164"/>
+			<device-support value="at32uc3a0128"/>
+			<device-support value="at32uc3a1128"/>
+			<device-support value="at32uc3a3128"/>
+			<device-support value="at32uc3a3128s"/>
+			<device-support value="at32uc3a4128"/>
+			<device-support value="at32uc3a4128s"/>
+			<device-support value="at32uc3b0128"/>
+			<device-support value="at32uc3b1128"/>
+			<device-support value="at32uc3a0256"/>
+			<device-support value="at32uc3a1256"/>
+			<device-support value="at32uc3a3256"/>
+			<device-support value="at32uc3a3256s"/>
+			<device-support value="at32uc3a4256"/>
+			<device-support value="at32uc3a4256s"/>
+			<device-support value="at32uc3b0256"/>
+			<device-support value="at32uc3b1256"/>
+			<device-support value="at32uc3a0512"/>
+			<device-support value="at32uc3a1512"/>
+			<device-support value="at32uc3b0512"/>
+			<device-support value="at32uc3b1512"/>
+		</device-alias-map>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_common.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_common.xml
index 9e17b188be..c2ef7af4c7 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_common.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_common.xml
@@ -1,34 +1,34 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<module type="service" id="lufa.common" caption="LUFA Common Infrastructure">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<info type="gui-flag" value="hidden"/>

-			<build type="doxygen-entry-point" value="Group_Common"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file" subtype="api" value="Version.h"/>

-			<build type="distribute" subtype="license" value="License.txt"/>

-

-			<build type="header-file" subtype="api" value="Common/Common.h"/>

-			<build type="header-file" value="Common/Architectures.h"/>

-			<build type="header-file" value="Common/ArchitectureSpecific.h"/>

-			<build type="header-file" value="Common/Attributes.h"/>

-			<build type="header-file" value="Common/BoardTypes.h"/>

-			<build type="header-file" value="Common/CompilerSpecific.h"/>

-			<build type="header-file" value="Common/Endianness.h"/>

-		</module>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<module type="service" id="lufa.common" caption="LUFA Common Infrastructure">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<info type="gui-flag" value="hidden"/>
+			<build type="doxygen-entry-point" value="Group_Common"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file" subtype="api" value="Version.h"/>
+			<build type="distribute" subtype="license" value="License.txt"/>
+
+			<build type="header-file" subtype="api" value="Common/Common.h"/>
+			<build type="header-file" value="Common/Architectures.h"/>
+			<build type="header-file" value="Common/ArchitectureSpecific.h"/>
+			<build type="header-file" value="Common/Attributes.h"/>
+			<build type="header-file" value="Common/BoardTypes.h"/>
+			<build type="header-file" value="Common/CompilerSpecific.h"/>
+			<build type="header-file" value="Common/Endianness.h"/>
+		</module>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board.xml
index 3677d20036..e150aa6458 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board.xml
@@ -1,114 +1,114 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<board id="lufa.boards.dummy.avr8" vendor="LUFA" caption="AVR8 Architecture">

-			<device-support value="mega"/>

-

-			<require idref="lufa.drivers.board"/>

-			<require idref="lufa.drivers.board.info"/>

-		</board>

-

-		<board id="lufa.boards.dummy.xmega" vendor="LUFA" caption="XMEGA Architecture">

-			<device-support value="xmega"/>

-

-			<require idref="lufa.drivers.board"/>

-			<require idref="lufa.drivers.board.info"/>

-		</board>

-

-		<board id="lufa.boards.dummy.uc3" vendor="LUFA" caption="UC3 Architecture">

-			<device-support value="uc3"/>

-

-			<require idref="lufa.drivers.board"/>

-			<require idref="lufa.drivers.board.info"/>

-		</board>

-

-		<module type="driver" id="lufa.drivers.board.info" caption="LUFA Board Hardware Information Driver">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_BoardInfo"/>

-

-			<require idref="lufa.common"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file"  subtype="api" value="Drivers/Board/Board.h"/>

-		</module>

-

-		<module type="driver" id="lufa.drivers.board.leds" caption="LUFA Board LED Driver">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_LEDs"/>

-

-			<require idref="lufa.common"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file"  subtype="api" value="Drivers/Board/LEDs.h"/>

-		</module>

-

-		<module type="driver" id="lufa.drivers.board.buttons" caption="LUFA Board Buttons Driver">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_Buttons"/>

-

-			<require idref="lufa.common"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file"  subtype="api" value="Drivers/Board/Buttons.h"/>

-		</module>

-

-		<module type="driver" id="lufa.drivers.board.dataflash" caption="LUFA Board Dataflash Driver">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_Dataflash"/>

-

-			<require idref="lufa.common"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file"  subtype="api" value="Drivers/Board/Dataflash.h"/>

-		</module>

-

-		<module type="driver" id="lufa.drivers.board.joystick" caption="LUFA Board Joystick Driver">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_Joystick"/>

-

-			<require idref="lufa.common"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file"  subtype="api" value="Drivers/Board/Joystick.h"/>

-		</module>

-

-		<module type="driver" id="lufa.drivers.board.temperature" caption="LUFA Board Temperature Sensor Driver">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_Temperature"/>

-

-			<require idref="lufa.common"/>

-			<require idref="lufa.drivers.peripheral.adc"/>

-

-			<build type="c-source"     value="Drivers/Board/Temperature.c"/>

-			<build type="include-path" value=".."/>

-			<build type="header-file"  subtype="api" value="Drivers/Board/Temperature.h"/>

-		</module>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<board id="lufa.boards.dummy.avr8" vendor="LUFA" caption="AVR8 Architecture">
+			<device-support value="mega"/>
+
+			<require idref="lufa.drivers.board"/>
+			<require idref="lufa.drivers.board.info"/>
+		</board>
+
+		<board id="lufa.boards.dummy.xmega" vendor="LUFA" caption="XMEGA Architecture">
+			<device-support value="xmega"/>
+
+			<require idref="lufa.drivers.board"/>
+			<require idref="lufa.drivers.board.info"/>
+		</board>
+
+		<board id="lufa.boards.dummy.uc3" vendor="LUFA" caption="UC3 Architecture">
+			<device-support value="uc3"/>
+
+			<require idref="lufa.drivers.board"/>
+			<require idref="lufa.drivers.board.info"/>
+		</board>
+
+		<module type="driver" id="lufa.drivers.board.info" caption="LUFA Board Hardware Information Driver">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_BoardInfo"/>
+
+			<require idref="lufa.common"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file"  subtype="api" value="Drivers/Board/Board.h"/>
+		</module>
+
+		<module type="driver" id="lufa.drivers.board.leds" caption="LUFA Board LED Driver">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_LEDs"/>
+
+			<require idref="lufa.common"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file"  subtype="api" value="Drivers/Board/LEDs.h"/>
+		</module>
+
+		<module type="driver" id="lufa.drivers.board.buttons" caption="LUFA Board Buttons Driver">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_Buttons"/>
+
+			<require idref="lufa.common"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file"  subtype="api" value="Drivers/Board/Buttons.h"/>
+		</module>
+
+		<module type="driver" id="lufa.drivers.board.dataflash" caption="LUFA Board Dataflash Driver">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_Dataflash"/>
+
+			<require idref="lufa.common"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file"  subtype="api" value="Drivers/Board/Dataflash.h"/>
+		</module>
+
+		<module type="driver" id="lufa.drivers.board.joystick" caption="LUFA Board Joystick Driver">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_Joystick"/>
+
+			<require idref="lufa.common"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file"  subtype="api" value="Drivers/Board/Joystick.h"/>
+		</module>
+
+		<module type="driver" id="lufa.drivers.board.temperature" caption="LUFA Board Temperature Sensor Driver">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_Temperature"/>
+
+			<require idref="lufa.common"/>
+			<require idref="lufa.drivers.peripheral.adc"/>
+
+			<build type="c-source"     value="Drivers/Board/Temperature.c"/>
+			<build type="include-path" value=".."/>
+			<build type="header-file"  subtype="api" value="Drivers/Board/Temperature.h"/>
+		</module>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board_names.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board_names.xml
index 4b099920b7..ab7e03e4e9 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board_names.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board_names.xml
@@ -1,853 +1,853 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<select-by-config id="lufa.drivers.board" name="lufa.drivers.board.name" default="none" caption="LUFA Board Support">

-			<info type="description" value="summary">

-				Board hardware (LEDs, Buttons, etc.) drivers for the preconfigured LUFA boards. Note that only the boards

-				compatible with the currently selected device will be shown.

-

-				To disable all hardware drivers silently, use NONE. To supply customer drivers, use USER (see manual).

-			</info>

-

-			<module type="driver" id="lufa.drivers.board#none" caption="Board Support - None">

-				<device-support value="avr"/>

-				<build type="define" name="BOARD" value="BOARD_NONE"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#user" caption="Board Support - User Supplied">

-				<device-support value="avr"/>

-				<build type="define" name="BOARD" value="BOARD_USER"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#adafruit_u4" caption="Board Support - ADAFRUITU4">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_ADAFRUITU4"/>

-

-				<device-support value="atmega32u4"/>

-				<build type="define" name="BOARD" value="BOARD_ADAFRUITU4"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/ADAFRUITU4/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/ADAFRUITU4/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#atavrusbrf01" caption="Board Support - ATAVRUSBRF01">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_ATAVRUSBRF01"/>

-

-				<device-support value="at90usb1287"/>

-				<build type="define" name="BOARD" value="BOARD_ATAVRUSBRF01"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/ATAVRUSBRF01/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/ATAVRUSBRF01/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/ATAVRUSBRF01/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#benito" caption="Board Support - BENITO">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_BENITO"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_BENITO"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/BENITO/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/BENITO/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/BENITO/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#big_multio" caption="Board Support - BIGMULTIO">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_BIGMULTIO"/>

-

-				<device-support value="atmega32u4"/>

-				<build type="define" name="BOARD" value="BOARD_BIGMULTIO"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/BIGMULTIO/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/BIGMULTIO/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#blackcat" caption="Board Support - BLACKCAT">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_BLACKCAT"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_BLACKCAT"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/BLACKCAT/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/BLACKCAT/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#bui" caption="Board Support - BUI">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_BUI"/>

-

-				<device-support value="at90usb646"/>

-				<build type="define" name="BOARD" value="BOARD_BUI"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/BUI/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/BUI/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#bumbleb" caption="Board Support - BUMBLEB">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_BUMBLEB"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_BUMBLEB"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.joystick"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/Joystick.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#culv3" caption="Board Support - CULV3">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_CULV3"/>

-

-				<device-support value="atmega32u4"/>

-				<build type="define" name="BOARD" value="BOARD_CULV3"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/CULV3/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/CULV3/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/CULV3/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#duce" caption="Board Support - DUCE">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_DUCE"/>

-

-				<device-support value="atmega32u2"/>

-				<build type="define" name="BOARD" value="BOARD_DUCE"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/DUCE/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/DUCE/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#evk527" caption="Board Support - EVK527">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK527"/>

-

-				<device-support value="atmega32u4"/>

-				<build type="define" name="BOARD" value="BOARD_EVK527"/>

-

-				<require idref="lufa.drivers.misc.at45db321c"/>

-				<require idref="lufa.drivers.peripheral.spi"/>

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.dataflash"/>

-				<require idref="lufa.drivers.board.joystick"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Dataflash.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Joystick.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/EVK527/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#jm_db_u2" caption="Board Support - JMDBU2">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_JMDBU2"/>

-

-				<device-support value="atmega32u2"/>

-				<build type="define" name="BOARD" value="BOARD_JMDBU2"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/JMDBU2/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/JMDBU2/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/JMDBU2/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#leonardo" caption="Board Support - LEONARDO">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_LEONARDO"/>

-

-				<device-support value="atmega32u4"/>

-				<build type="define" name="BOARD" value="BOARD_LEONARDO"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/LEONARDO/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/LEONARDO/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#maximus" caption="Board Support - MAXIMUS">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MAXIMUS"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_MAXIMUS"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MAXIMUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MAXIMUS/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#micropendous_32u2" caption="Board Support - MICROPENDOUS_32U2">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_32U2"/>

-

-				<device-support value="atmega32u2"/>

-				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_32U2"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/LEDs.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#micropendous_a" caption="Board Support - MICROPENDOUS_A">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_A"/>

-

-				<device-support value="at90usb1287"/>

-				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_A"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#micropendous_1" caption="Board Support - MICROPENDOUS_1">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_1"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_1"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#micropendous_2" caption="Board Support - MICROPENDOUS_2">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_2"/>

-

-				<device-support value="atmega32u4"/>

-				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_2"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#micropendous_3" caption="Board Support - MICROPENDOUS_3">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_3"/>

-

-				<device-support value="at90usb1287"/>

-				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_3"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#micropendous_4" caption="Board Support - MICROPENDOUS_4">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_4"/>

-

-				<device-support value="at90usb1287"/>

-				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_4"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#micropendous_dip" caption="Board Support - MICROPENDOUS_DIP">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_DIP"/>

-

-				<device-support value="at90usb1287"/>

-				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_DIP"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#micropendous_rev1" caption="Board Support - MICROPENDOUS_REV1">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_REV1"/>

-

-				<device-support value="at90usb1287"/>

-				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_REV1"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/LEDs.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#micropendous_rev2" caption="Board Support - MICROPENDOUS_REV2">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_REV2"/>

-

-				<device-support value="at90usb1287"/>

-				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_REV2"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/LEDs.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#microsin_162" caption="Board Support - MICROSIN162">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROSIN162"/>

-

-				<device-support value="atmega162"/>

-				<build type="define" name="BOARD" value="BOARD_MICROSIN162"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROSIN162/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROSIN162/LEDs.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROSIN162/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#minimus" caption="Board Support - MINIMUS">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MINIMUS"/>

-

-				<device-support value="atmega32u2"/>

-				<build type="define" name="BOARD" value="BOARD_MINIMUS"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MINIMUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MINIMUS/LEDs.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MINIMUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#multio" caption="Board Support - MULTIO">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MULTIO"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_MULTIO"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MULTIO/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MULTIO/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#olimex_162" caption="Board Support - OLIMEX162">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEX162"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_OLIMEX162"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX162/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX162/LEDs.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX162/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#olimex_32u4" caption="Board Support - OLIMEX32U4">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEX32U4"/>

-

-				<device-support value="atmega32u4"/>

-				<build type="define" name="BOARD" value="BOARD_OLIMEX32U4"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX32U4/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX32U4/LEDs.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX32U4/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#olimex_isp_mkii" caption="Board Support - OLIMEXISPMK2">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEXISPMK2"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_OLIMEXISPMK2"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXISPMK2/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXISPMK2/LEDs.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXISPMK2/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#olimex_t32u4" caption="Board Support - OLIMEX_T32U4">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEXT32U4"/>

-

-				<device-support value="atmega32u4"/>

-				<build type="define" name="BOARD" value="BOARD_OLIMEXT32U4"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXT32U4/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXT32U4/LEDs.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXT32U4/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#rzusbstick" caption="Board Support - RZUSBSTICK">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_RZUSBSTICK"/>

-

-				<device-support value="at90usb1287"/>

-				<build type="define" name="BOARD" value="BOARD_RZUSBSTICK"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/RZUSBSTICK/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/RZUSBSTICK/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#sparkfun_8u2" caption="Board Support - SPARKFUN8U2">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_SPARKFUN8U2"/>

-

-				<device-support value="atmega8u2"/>

-				<build type="define" name="BOARD" value="BOARD_SPARKFUN8U2"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/SPARKFUN8U2/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#stk525" caption="Board Support - STK525">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_STK525"/>

-

-				<device-support value="at90usb1287"/>

-				<device-support value="at90usb1286"/>

-				<device-support value="at90usb647"/>

-				<device-support value="at90usb646"/>

-				<build type="define" name="BOARD" value="BOARD_STK525"/>

-

-				<require idref="lufa.drivers.misc.at45db321c"/>

-				<require idref="lufa.drivers.peripheral.spi"/>

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.dataflash"/>

-				<require idref="lufa.drivers.board.joystick"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/STK525/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STK525/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STK525/Dataflash.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STK525/Joystick.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STK525/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#stk526" caption="Board Support - STK526">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_STK526"/>

-

-				<device-support value="at90usb162"/>

-				<device-support value="at90usb82"/>

-				<device-support value="atmega32u2"/>

-				<device-support value="atmega16u2"/>

-				<device-support value="atmega8u2"/>

-				<build type="define" name="BOARD" value="BOARD_STK526"/>

-

-				<require idref="lufa.drivers.misc.at45db642d"/>

-				<require idref="lufa.drivers.peripheral.spi"/>

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.dataflash"/>

-				<require idref="lufa.drivers.board.joystick"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/STK526/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STK526/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STK526/Dataflash.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STK526/Joystick.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STK526/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#teensy" caption="Board Support - TEENSY">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_TEENSY"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_TEENSY"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#teensy2" caption="Board Support - TEENSY2">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_TEENSY2"/>

-

-				<device-support value="at90usb646"/>

-				<build type="define" name="BOARD" value="BOARD_TEENSY2"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#tul" caption="Board Support - TUL">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_TUL"/>

-

-				<device-support value="atmega32u4"/>

-				<build type="define" name="BOARD" value="BOARD_TUL"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/TUL/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/TUL/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/TUL/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#udip" caption="Board Support - UDIP">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_UDIP"/>

-

-				<device-support value="atmega32u2"/>

-				<build type="define" name="BOARD" value="BOARD_UDIP"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/UDIP/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/UDIP/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/UDIP/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#uno" caption="Board Support - UNO">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_UNO"/>

-

-				<device-support value="atmega8u2"/>

-				<device-support value="atmega16u2"/>

-				<build type="define" name="BOARD" value="BOARD_UNO"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/UNO/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/UNO/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#usb2ax" caption="Board Support - USB2AX">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_USB2AX"/>

-

-				<device-support value="atmega32u2"/>

-				<build type="define" name="BOARD" value="BOARD_USB2AX"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#usb2ax_v3" caption="Board Support - USB2AX_V3">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_USB2AX_V3"/>

-

-				<device-support value="atmega32u2"/>

-				<build type="define" name="BOARD" value="BOARD_USB2AX_V3"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#usb2ax_v3_1" caption="Board Support - USB2AX_V31">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_USB2AX_V31"/>

-

-				<device-support value="atmega32u2"/>

-				<build type="define" name="BOARD" value="BOARD_USB2AX_V31"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#usbfoo" caption="Board Support - USBFOO">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_USBFOO"/>

-

-				<device-support value="atmega162"/>

-				<build type="define" name="BOARD" value="BOARD_USBFOO"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/USBFOO/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USBFOO/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USBFOO/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#usbkey" caption="Board Support - USBKEY">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_USBKEY"/>

-

-				<device-support value="at90usb1287"/>

-				<build type="define" name="BOARD" value="BOARD_USBKEY"/>

-

-				<require idref="lufa.drivers.misc.at45db642d"/>

-				<require idref="lufa.drivers.peripheral.spi"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.dataflash"/>

-				<require idref="lufa.drivers.board.joystick"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Dataflash.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Joystick.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#usbtiny_mkii" caption="Board Support - USBTINYMKII">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_USBTINYMKII"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_USBTINYMKII"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/USBTINYMKII/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USBTINYMKII/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USBTINYMKII/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#xplain_rev1" caption="Board Support - XPLAIN (HW Rev 1)">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_XPLAIN_REV1"/>

-

-				<device-support value="at90usb1287"/>

-

-				<require idref="lufa.drivers.misc.at45db642d"/>

-				<require idref="lufa.drivers.peripheral.spi"/>

-				<require idref="lufa.drivers.board.dataflash"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Dataflash.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_XPLAIN_REV1"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#xplain" caption="Board Support - XPLAIN (HW Rev 2+)">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_XPLAIN"/>

-

-				<device-support value="at90usb1287"/>

-

-				<require idref="lufa.drivers.misc.at45db642d"/>

-				<require idref="lufa.drivers.peripheral.spi"/>

-				<require idref="lufa.drivers.board.dataflash"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Dataflash.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_XPLAIN"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#a3bu_xplained" caption="Board Support - A3BU_XPLAINED">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_A3BU_XPLAINED"/>

-

-				<device-support value="atxmega256a3bu"/>

-

-				<require idref="lufa.drivers.misc.at45db642d"/>

-				<require idref="lufa.drivers.peripheral.usart_spi"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.dataflash"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/Board.h"/>

-				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/Dataflash.h"/>

-				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_A3BU_XPLAINED"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#b1_xplained" caption="Board Support - B1_XPLAINED">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_B1_XPLAINED"/>

-

-				<device-support value="atxmega128b1"/>

-

-				<require idref="lufa.drivers.misc.at45db642d"/>

-				<require idref="lufa.drivers.peripheral.usart_spi"/>

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.dataflash"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/Board.h"/>

-				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/Dataflash.h"/>

-				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_B1_XPLAINED"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#evk1100" caption="Board Support - EVK1100">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK1100"/>

-

-				<device-support value="at32uc3a0512"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.joystick"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/UC3/EVK1100/Board.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/EVK1100/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/EVK1100/Joystick.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/EVK1100/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_EVK1100"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#evk1101" caption="Board Support - EVK1101">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK1101"/>

-

-				<device-support value="at32uc3b0256"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.joystick"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/UC3/EVK1101/Board.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/EVK1101/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/EVK1101/Joystick.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/EVK1101/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_EVK1101"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#evk1104" caption="Board Support - EVK1104">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK1104"/>

-

-				<device-support value="at32uc3a3256"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/UC3/EVK1104/Board.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/EVK1104/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/EVK1104/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_EVK1104"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#uc3a3_xplained" caption="Board Support - UC3A3_XPLAINED">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_UC3_A3_XPLAINED"/>

-

-				<device-support value="at32uc3a3256"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/UC3/UC3A3_XPLAINED/Board.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/UC3A3_XPLAINED/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/UC3A3_XPLAINED/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_UC3A3_XPLAINED"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#stange_isp" caption="Board Support - STANGE_ISP">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_STANGE_ISP"/>

-

-				<device-support value="at90usb162"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/STANGE_ISP/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STANGE_ISP/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STANGE_ISP/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_STANGE_ISP"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#c3_xplained" caption="Board Support - C3_XPLAINED">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_C3_XPLAINED"/>

-

-				<device-support value="atxmega384c3"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/XMEGA/C3_XPLAINED/Board.h"/>

-				<build type="header-file" value="Drivers/Board/XMEGA/C3_XPLAINED/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_C3_XPLAINED"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#u2s" caption="Board Support - U2S">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_U2S"/>

-

-				<device-support value="atmega32u2"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/U2S/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/U2S/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/U2S/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_U2S"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#yun" caption="Board Support - YUN">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_YUN"/>

-

-				<device-support value="atmega32u4"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/YUN/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/YUN/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_YUN"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#yun" caption="Board Support - MICRO">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICRO"/>

-

-				<device-support value="atmega32u4"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICRO/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICRO/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_MICRO"/>

-			</module>

-		</select-by-config>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<select-by-config id="lufa.drivers.board" name="lufa.drivers.board.name" default="none" caption="LUFA Board Support">
+			<info type="description" value="summary">
+				Board hardware (LEDs, Buttons, etc.) drivers for the preconfigured LUFA boards. Note that only the boards
+				compatible with the currently selected device will be shown.
+
+				To disable all hardware drivers silently, use NONE. To supply customer drivers, use USER (see manual).
+			</info>
+
+			<module type="driver" id="lufa.drivers.board#none" caption="Board Support - None">
+				<device-support value="avr"/>
+				<build type="define" name="BOARD" value="BOARD_NONE"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#user" caption="Board Support - User Supplied">
+				<device-support value="avr"/>
+				<build type="define" name="BOARD" value="BOARD_USER"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#adafruit_u4" caption="Board Support - ADAFRUITU4">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_ADAFRUITU4"/>
+
+				<device-support value="atmega32u4"/>
+				<build type="define" name="BOARD" value="BOARD_ADAFRUITU4"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/ADAFRUITU4/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/ADAFRUITU4/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#atavrusbrf01" caption="Board Support - ATAVRUSBRF01">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_ATAVRUSBRF01"/>
+
+				<device-support value="at90usb1287"/>
+				<build type="define" name="BOARD" value="BOARD_ATAVRUSBRF01"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/ATAVRUSBRF01/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/ATAVRUSBRF01/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/ATAVRUSBRF01/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#benito" caption="Board Support - BENITO">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_BENITO"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_BENITO"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/BENITO/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/BENITO/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/BENITO/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#big_multio" caption="Board Support - BIGMULTIO">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_BIGMULTIO"/>
+
+				<device-support value="atmega32u4"/>
+				<build type="define" name="BOARD" value="BOARD_BIGMULTIO"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/BIGMULTIO/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/BIGMULTIO/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#blackcat" caption="Board Support - BLACKCAT">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_BLACKCAT"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_BLACKCAT"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/BLACKCAT/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/BLACKCAT/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#bui" caption="Board Support - BUI">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_BUI"/>
+
+				<device-support value="at90usb646"/>
+				<build type="define" name="BOARD" value="BOARD_BUI"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/BUI/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/BUI/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#bumbleb" caption="Board Support - BUMBLEB">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_BUMBLEB"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_BUMBLEB"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.joystick"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/Joystick.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#culv3" caption="Board Support - CULV3">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_CULV3"/>
+
+				<device-support value="atmega32u4"/>
+				<build type="define" name="BOARD" value="BOARD_CULV3"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/CULV3/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/CULV3/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/CULV3/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#duce" caption="Board Support - DUCE">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_DUCE"/>
+
+				<device-support value="atmega32u2"/>
+				<build type="define" name="BOARD" value="BOARD_DUCE"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/DUCE/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/DUCE/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#evk527" caption="Board Support - EVK527">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK527"/>
+
+				<device-support value="atmega32u4"/>
+				<build type="define" name="BOARD" value="BOARD_EVK527"/>
+
+				<require idref="lufa.drivers.misc.at45db321c"/>
+				<require idref="lufa.drivers.peripheral.spi"/>
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.dataflash"/>
+				<require idref="lufa.drivers.board.joystick"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Dataflash.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Joystick.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/EVK527/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#jm_db_u2" caption="Board Support - JMDBU2">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_JMDBU2"/>
+
+				<device-support value="atmega32u2"/>
+				<build type="define" name="BOARD" value="BOARD_JMDBU2"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/JMDBU2/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/JMDBU2/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/JMDBU2/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#leonardo" caption="Board Support - LEONARDO">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_LEONARDO"/>
+
+				<device-support value="atmega32u4"/>
+				<build type="define" name="BOARD" value="BOARD_LEONARDO"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/LEONARDO/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/LEONARDO/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#maximus" caption="Board Support - MAXIMUS">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MAXIMUS"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_MAXIMUS"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MAXIMUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MAXIMUS/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#micropendous_32u2" caption="Board Support - MICROPENDOUS_32U2">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_32U2"/>
+
+				<device-support value="atmega32u2"/>
+				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_32U2"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/LEDs.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#micropendous_a" caption="Board Support - MICROPENDOUS_A">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_A"/>
+
+				<device-support value="at90usb1287"/>
+				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_A"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#micropendous_1" caption="Board Support - MICROPENDOUS_1">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_1"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_1"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#micropendous_2" caption="Board Support - MICROPENDOUS_2">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_2"/>
+
+				<device-support value="atmega32u4"/>
+				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_2"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#micropendous_3" caption="Board Support - MICROPENDOUS_3">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_3"/>
+
+				<device-support value="at90usb1287"/>
+				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_3"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#micropendous_4" caption="Board Support - MICROPENDOUS_4">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_4"/>
+
+				<device-support value="at90usb1287"/>
+				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_4"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#micropendous_dip" caption="Board Support - MICROPENDOUS_DIP">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_DIP"/>
+
+				<device-support value="at90usb1287"/>
+				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_DIP"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#micropendous_rev1" caption="Board Support - MICROPENDOUS_REV1">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_REV1"/>
+
+				<device-support value="at90usb1287"/>
+				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_REV1"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/LEDs.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#micropendous_rev2" caption="Board Support - MICROPENDOUS_REV2">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_REV2"/>
+
+				<device-support value="at90usb1287"/>
+				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_REV2"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/LEDs.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#microsin_162" caption="Board Support - MICROSIN162">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROSIN162"/>
+
+				<device-support value="atmega162"/>
+				<build type="define" name="BOARD" value="BOARD_MICROSIN162"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROSIN162/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROSIN162/LEDs.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROSIN162/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#minimus" caption="Board Support - MINIMUS">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MINIMUS"/>
+
+				<device-support value="atmega32u2"/>
+				<build type="define" name="BOARD" value="BOARD_MINIMUS"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MINIMUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MINIMUS/LEDs.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MINIMUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#multio" caption="Board Support - MULTIO">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MULTIO"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_MULTIO"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MULTIO/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MULTIO/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#olimex_162" caption="Board Support - OLIMEX162">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEX162"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_OLIMEX162"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX162/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX162/LEDs.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX162/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#olimex_32u4" caption="Board Support - OLIMEX32U4">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEX32U4"/>
+
+				<device-support value="atmega32u4"/>
+				<build type="define" name="BOARD" value="BOARD_OLIMEX32U4"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX32U4/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX32U4/LEDs.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX32U4/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#olimex_isp_mkii" caption="Board Support - OLIMEXISPMK2">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEXISPMK2"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_OLIMEXISPMK2"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXISPMK2/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXISPMK2/LEDs.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXISPMK2/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#olimex_t32u4" caption="Board Support - OLIMEX_T32U4">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEXT32U4"/>
+
+				<device-support value="atmega32u4"/>
+				<build type="define" name="BOARD" value="BOARD_OLIMEXT32U4"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXT32U4/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXT32U4/LEDs.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXT32U4/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#rzusbstick" caption="Board Support - RZUSBSTICK">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_RZUSBSTICK"/>
+
+				<device-support value="at90usb1287"/>
+				<build type="define" name="BOARD" value="BOARD_RZUSBSTICK"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/RZUSBSTICK/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/RZUSBSTICK/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#sparkfun_8u2" caption="Board Support - SPARKFUN8U2">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_SPARKFUN8U2"/>
+
+				<device-support value="atmega8u2"/>
+				<build type="define" name="BOARD" value="BOARD_SPARKFUN8U2"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/SPARKFUN8U2/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#stk525" caption="Board Support - STK525">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_STK525"/>
+
+				<device-support value="at90usb1287"/>
+				<device-support value="at90usb1286"/>
+				<device-support value="at90usb647"/>
+				<device-support value="at90usb646"/>
+				<build type="define" name="BOARD" value="BOARD_STK525"/>
+
+				<require idref="lufa.drivers.misc.at45db321c"/>
+				<require idref="lufa.drivers.peripheral.spi"/>
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.dataflash"/>
+				<require idref="lufa.drivers.board.joystick"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/STK525/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STK525/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STK525/Dataflash.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STK525/Joystick.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STK525/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#stk526" caption="Board Support - STK526">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_STK526"/>
+
+				<device-support value="at90usb162"/>
+				<device-support value="at90usb82"/>
+				<device-support value="atmega32u2"/>
+				<device-support value="atmega16u2"/>
+				<device-support value="atmega8u2"/>
+				<build type="define" name="BOARD" value="BOARD_STK526"/>
+
+				<require idref="lufa.drivers.misc.at45db642d"/>
+				<require idref="lufa.drivers.peripheral.spi"/>
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.dataflash"/>
+				<require idref="lufa.drivers.board.joystick"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/STK526/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STK526/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STK526/Dataflash.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STK526/Joystick.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STK526/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#teensy" caption="Board Support - TEENSY">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_TEENSY"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_TEENSY"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#teensy2" caption="Board Support - TEENSY2">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_TEENSY2"/>
+
+				<device-support value="at90usb646"/>
+				<build type="define" name="BOARD" value="BOARD_TEENSY2"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#tul" caption="Board Support - TUL">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_TUL"/>
+
+				<device-support value="atmega32u4"/>
+				<build type="define" name="BOARD" value="BOARD_TUL"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/TUL/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/TUL/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/TUL/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#udip" caption="Board Support - UDIP">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_UDIP"/>
+
+				<device-support value="atmega32u2"/>
+				<build type="define" name="BOARD" value="BOARD_UDIP"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/UDIP/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/UDIP/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/UDIP/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#uno" caption="Board Support - UNO">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_UNO"/>
+
+				<device-support value="atmega8u2"/>
+				<device-support value="atmega16u2"/>
+				<build type="define" name="BOARD" value="BOARD_UNO"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/UNO/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/UNO/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#usb2ax" caption="Board Support - USB2AX">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_USB2AX"/>
+
+				<device-support value="atmega32u2"/>
+				<build type="define" name="BOARD" value="BOARD_USB2AX"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#usb2ax_v3" caption="Board Support - USB2AX_V3">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_USB2AX_V3"/>
+
+				<device-support value="atmega32u2"/>
+				<build type="define" name="BOARD" value="BOARD_USB2AX_V3"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#usb2ax_v3_1" caption="Board Support - USB2AX_V31">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_USB2AX_V31"/>
+
+				<device-support value="atmega32u2"/>
+				<build type="define" name="BOARD" value="BOARD_USB2AX_V31"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#usbfoo" caption="Board Support - USBFOO">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_USBFOO"/>
+
+				<device-support value="atmega162"/>
+				<build type="define" name="BOARD" value="BOARD_USBFOO"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/USBFOO/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USBFOO/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USBFOO/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#usbkey" caption="Board Support - USBKEY">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_USBKEY"/>
+
+				<device-support value="at90usb1287"/>
+				<build type="define" name="BOARD" value="BOARD_USBKEY"/>
+
+				<require idref="lufa.drivers.misc.at45db642d"/>
+				<require idref="lufa.drivers.peripheral.spi"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.dataflash"/>
+				<require idref="lufa.drivers.board.joystick"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Dataflash.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Joystick.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#usbtiny_mkii" caption="Board Support - USBTINYMKII">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_USBTINYMKII"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_USBTINYMKII"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/USBTINYMKII/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USBTINYMKII/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USBTINYMKII/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#xplain_rev1" caption="Board Support - XPLAIN (HW Rev 1)">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_XPLAIN_REV1"/>
+
+				<device-support value="at90usb1287"/>
+
+				<require idref="lufa.drivers.misc.at45db642d"/>
+				<require idref="lufa.drivers.peripheral.spi"/>
+				<require idref="lufa.drivers.board.dataflash"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Dataflash.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_XPLAIN_REV1"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#xplain" caption="Board Support - XPLAIN (HW Rev 2+)">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_XPLAIN"/>
+
+				<device-support value="at90usb1287"/>
+
+				<require idref="lufa.drivers.misc.at45db642d"/>
+				<require idref="lufa.drivers.peripheral.spi"/>
+				<require idref="lufa.drivers.board.dataflash"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Dataflash.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_XPLAIN"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#a3bu_xplained" caption="Board Support - A3BU_XPLAINED">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_A3BU_XPLAINED"/>
+
+				<device-support value="atxmega256a3bu"/>
+
+				<require idref="lufa.drivers.misc.at45db642d"/>
+				<require idref="lufa.drivers.peripheral.usart_spi"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.dataflash"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/Board.h"/>
+				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/Dataflash.h"/>
+				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_A3BU_XPLAINED"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#b1_xplained" caption="Board Support - B1_XPLAINED">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_B1_XPLAINED"/>
+
+				<device-support value="atxmega128b1"/>
+
+				<require idref="lufa.drivers.misc.at45db642d"/>
+				<require idref="lufa.drivers.peripheral.usart_spi"/>
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.dataflash"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/Board.h"/>
+				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/Dataflash.h"/>
+				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_B1_XPLAINED"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#evk1100" caption="Board Support - EVK1100">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK1100"/>
+
+				<device-support value="at32uc3a0512"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.joystick"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/UC3/EVK1100/Board.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/EVK1100/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/EVK1100/Joystick.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/EVK1100/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_EVK1100"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#evk1101" caption="Board Support - EVK1101">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK1101"/>
+
+				<device-support value="at32uc3b0256"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.joystick"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/UC3/EVK1101/Board.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/EVK1101/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/EVK1101/Joystick.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/EVK1101/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_EVK1101"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#evk1104" caption="Board Support - EVK1104">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK1104"/>
+
+				<device-support value="at32uc3a3256"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/UC3/EVK1104/Board.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/EVK1104/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/EVK1104/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_EVK1104"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#uc3a3_xplained" caption="Board Support - UC3A3_XPLAINED">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_UC3_A3_XPLAINED"/>
+
+				<device-support value="at32uc3a3256"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/UC3/UC3A3_XPLAINED/Board.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/UC3A3_XPLAINED/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/UC3A3_XPLAINED/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_UC3A3_XPLAINED"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#stange_isp" caption="Board Support - STANGE_ISP">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_STANGE_ISP"/>
+
+				<device-support value="at90usb162"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/STANGE_ISP/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STANGE_ISP/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STANGE_ISP/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_STANGE_ISP"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#c3_xplained" caption="Board Support - C3_XPLAINED">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_C3_XPLAINED"/>
+
+				<device-support value="atxmega384c3"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/XMEGA/C3_XPLAINED/Board.h"/>
+				<build type="header-file" value="Drivers/Board/XMEGA/C3_XPLAINED/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_C3_XPLAINED"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#u2s" caption="Board Support - U2S">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_U2S"/>
+
+				<device-support value="atmega32u2"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/U2S/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/U2S/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/U2S/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_U2S"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#yun" caption="Board Support - YUN">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_YUN"/>
+
+				<device-support value="atmega32u4"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/YUN/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/YUN/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_YUN"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#yun" caption="Board Support - MICRO">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICRO"/>
+
+				<device-support value="atmega32u4"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICRO/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICRO/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_MICRO"/>
+			</module>
+		</select-by-config>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_misc.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_misc.xml
index 8680ca2dff..4311ae87b7 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_misc.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_misc.xml
@@ -1,57 +1,57 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<module type="component" id="lufa.drivers.misc.at45db321c" caption="LUFA AT45DB321C Dataflash Commands">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_AT45DB321C"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file" subtype="api" value="Drivers/Misc/AT45DB321C.h"/>

-		</module>

-

-		<module type="component" id="lufa.drivers.misc.at45db642d" caption="LUFA AT45DB642D Dataflash Commands">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_AT45DB321C"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file" subtype="api" value="Drivers/Misc/AT45DB642D.h"/>

-		</module>

-

-		<module type="service" id="lufa.drivers.misc.ringbuffer" caption="LUFA Ring Buffer">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_RingBuff"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file" subtype="api" value="Drivers/Misc/RingBuffer.h"/>

-		</module>

-

-		<module type="service" id="lufa.drivers.misc.ansi" caption="LUFA ANSI Terminal Commands">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_Terminal"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file" subtype="api" value="Drivers/Misc/TerminalCodes.h"/>

-		</module>

-	</asf>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<module type="component" id="lufa.drivers.misc.at45db321c" caption="LUFA AT45DB321C Dataflash Commands">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_AT45DB321C"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file" subtype="api" value="Drivers/Misc/AT45DB321C.h"/>
+		</module>
+
+		<module type="component" id="lufa.drivers.misc.at45db642d" caption="LUFA AT45DB642D Dataflash Commands">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_AT45DB321C"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file" subtype="api" value="Drivers/Misc/AT45DB642D.h"/>
+		</module>
+
+		<module type="service" id="lufa.drivers.misc.ringbuffer" caption="LUFA Ring Buffer">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_RingBuff"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file" subtype="api" value="Drivers/Misc/RingBuffer.h"/>
+		</module>
+
+		<module type="service" id="lufa.drivers.misc.ansi" caption="LUFA ANSI Terminal Commands">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_Terminal"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file" subtype="api" value="Drivers/Misc/TerminalCodes.h"/>
+		</module>
+	</asf>
 </lufa>
\ No newline at end of file
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_peripheral.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_peripheral.xml
index 3a982e565f..76ea516dbc 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_peripheral.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_peripheral.xml
@@ -1,198 +1,198 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<select-by-device id="lufa.drivers.peripheral.usart" caption="LUFA USART Driver">

-			<module type="driver" id="lufa.drivers.peripheral.usart#avr8" caption="LUFA USART Driver - AVR8">

-				<device-support-alias value="lufa_avr8"/>

-

-				<build type="doxygen-entry-point" value="Group_Serial"/>

-

-				<require idref="lufa.common"/>

-				<require idref="lufa.drivers.misc.ansi"/>

-

-				<build type="c-source" value="Drivers/Peripheral/AVR8/Serial_AVR8.c"/>

-				<build type="header-file" value="Drivers/Peripheral/AVR8/Serial_AVR8.h"/>

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Drivers/Peripheral/Serial.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.usart#xmega" caption="LUFA USART Driver - AVR8">

-				<device-support-alias value="lufa_xmega"/>

-

-				<build type="doxygen-entry-point" value="Group_Serial"/>

-

-				<require idref="lufa.common"/>

-				<require idref="lufa.drivers.misc.ansi"/>

-

-				<build type="c-source" value="Drivers/Peripheral/XMEGA/Serial_XMEGA.c"/>

-				<build type="header-file" value="Drivers/Peripheral/XMEGA/Serial_XMEGA.h"/>

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Drivers/Peripheral/Serial.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.usart#uc3" caption="LUFA USART Driver - UC3">

-				<device-support-alias value="lufa_uc3"/>

-

-				<build type="doxygen-entry-point" value="Group_Serial"/>

-

-				<require idref="lufa.common"/>

-				<require idref="lufa.drivers.misc.ansi"/>

-

-				<info type="gui-flag" value="hidden"/>

-			</module>

-		</select-by-device>

-

-		<select-by-device id="lufa.drivers.peripheral.spi" caption="LUFA SPI Driver">

-			<module type="driver" id="lufa.drivers.peripheral.spi#avr8" caption="LUFA SPI Driver - AVR8">

-				<device-support-alias value="lufa_avr8"/>

-

-				<build type="doxygen-entry-point" value="Group_SPI"/>

-

-				<require idref="lufa.common"/>

-

-				<build type="header-file" value="Drivers/Peripheral/AVR8/SPI_AVR8.h"/>

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Drivers/Peripheral/SPI.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.spi#xmega" caption="LUFA SPI Driver - XMEGA">

-				<device-support-alias value="lufa_xmega"/>

-

-				<build type="doxygen-entry-point" value="Group_SPI"/>

-

-				<require idref="lufa.common"/>

-

-				<build type="header-file" value="Drivers/Peripheral/XMEGA/SPI_XMEGA.h"/>

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Drivers/Peripheral/SPI.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.spi#uc3" caption="LUFA SPI Driver - UC3">

-				<device-support-alias value="lufa_uc3"/>

-

-				<build type="doxygen-entry-point" value="Group_SPI"/>

-

-				<require idref="lufa.common"/>

-

-				<info type="gui-flag" value="hidden"/>

-			</module>

-		</select-by-device>

-

-		<select-by-device id="lufa.drivers.peripheral.usart_spi" caption="LUFA USART SPI Driver">

-			<module type="driver" id="lufa.drivers.peripheral.usart_spi#avr8" caption="LUFA USART SPI Driver - AVR8">

-				<device-support-alias value="lufa_avr8"/>

-

-				<build type="doxygen-entry-point" value="Group_SerialSPI"/>

-

-				<require idref="lufa.common"/>

-

-				<build type="header-file" value="Drivers/Peripheral/AVR8/SerialSPI_AVR8.h"/>

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api"  value="Drivers/Peripheral/SerialSPI.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.usart_spi#xmega" caption="LUFA USART SPI Driver - XMEGA">

-				<device-support-alias value="lufa_xmega"/>

-

-				<build type="doxygen-entry-point" value="Group_SerialSPI"/>

-

-				<require idref="lufa.common"/>

-

-				<build type="header-file" value="Drivers/Peripheral/XMEGA/SerialSPI_XMEGA.h"/>

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Drivers/Peripheral/SerialSPI.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.usart_spi#uc3" caption="LUFA USART SPI Driver - UC3">

-				<device-support-alias value="lufa_uc3"/>

-

-				<build type="doxygen-entry-point" value="Group_SerialSPI"/>

-

-				<require idref="lufa.common"/>

-

-				<info type="gui-flag" value="hidden"/>

-			</module>

-		</select-by-device>

-

-		<select-by-device id="lufa.drivers.peripheral.twi" caption="LUFA TWI Master Driver">

-			<module type="driver" id="lufa.drivers.peripheral.twi#avr8" caption="LUFA TWI Master Driver - AVR8">

-				<device-support-alias value="lufa_avr8"/>

-

-				<build type="doxygen-entry-point" value="Group_TWI"/>

-

-				<require idref="lufa.common"/>

-

-				<build type="c-source" value="Drivers/Peripheral/AVR8/TWI_AVR8.c"/>

-				<build type="header-file" value="Drivers/Peripheral/AVR8/TWI_AVR8.h"/>

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Drivers/Peripheral/TWI.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.twi#xmega" caption="LUFA TWI Master Driver - XMEGA">

-				<device-support-alias value="lufa_xmega"/>

-

-				<build type="doxygen-entry-point" value="Group_TWI"/>

-

-				<require idref="lufa.common"/>

-

-				<build type="c-source" value="Drivers/Peripheral/XMEGA/TWI_XMEGA.c"/>

-				<build type="header-file" value="Drivers/Peripheral/XMEGA/TWI_XMEGA.h"/>

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Drivers/Peripheral/TWI.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.twi#uc3" caption="LUFA TWI Master Driver - UC3">

-				<device-support-alias value="lufa_uc3"/>

-

-				<build type="doxygen-entry-point" value="Group_TWI"/>

-

-				<require idref="lufa.common"/>

-

-				<info type="gui-flag" value="hidden"/>

-			</module>

-		</select-by-device>

-

-		<select-by-device id="lufa.drivers.peripheral.adc" caption="LUFA ADC Driver">

-			<module type="driver" id="lufa.drivers.peripheral.adc#avr8" caption="LUFA ADC Driver - AVR8">

-				<device-support-alias value="lufa_avr8"/>

-

-				<build type="doxygen-entry-point" value="Group_ADC"/>

-

-				<require idref="lufa.common"/>

-

-				<build type="header-file" value="Drivers/Peripheral/AVR8/ADC_AVR8.h"/>

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Drivers/Peripheral/ADC.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.adc#xmega" caption="LUFA ADC Driver - XMEGA">

-				<device-support-alias value="lufa_xmega"/>

-

-				<build type="doxygen-entry-point" value="Group_ADC"/>

-

-				<require idref="lufa.common"/>

-

-				<info type="gui-flag" value="hidden"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.adc#uc3" caption="LUFA ADC Driver - UC3">

-				<device-support-alias value="lufa_uc3"/>

-

-				<build type="doxygen-entry-point" value="Group_ADC"/>

-

-				<require idref="lufa.common"/>

-

-				<info type="gui-flag" value="hidden"/>

-			</module>

-		</select-by-device>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<select-by-device id="lufa.drivers.peripheral.usart" caption="LUFA USART Driver">
+			<module type="driver" id="lufa.drivers.peripheral.usart#avr8" caption="LUFA USART Driver - AVR8">
+				<device-support-alias value="lufa_avr8"/>
+
+				<build type="doxygen-entry-point" value="Group_Serial"/>
+
+				<require idref="lufa.common"/>
+				<require idref="lufa.drivers.misc.ansi"/>
+
+				<build type="c-source" value="Drivers/Peripheral/AVR8/Serial_AVR8.c"/>
+				<build type="header-file" value="Drivers/Peripheral/AVR8/Serial_AVR8.h"/>
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Drivers/Peripheral/Serial.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.usart#xmega" caption="LUFA USART Driver - AVR8">
+				<device-support-alias value="lufa_xmega"/>
+
+				<build type="doxygen-entry-point" value="Group_Serial"/>
+
+				<require idref="lufa.common"/>
+				<require idref="lufa.drivers.misc.ansi"/>
+
+				<build type="c-source" value="Drivers/Peripheral/XMEGA/Serial_XMEGA.c"/>
+				<build type="header-file" value="Drivers/Peripheral/XMEGA/Serial_XMEGA.h"/>
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Drivers/Peripheral/Serial.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.usart#uc3" caption="LUFA USART Driver - UC3">
+				<device-support-alias value="lufa_uc3"/>
+
+				<build type="doxygen-entry-point" value="Group_Serial"/>
+
+				<require idref="lufa.common"/>
+				<require idref="lufa.drivers.misc.ansi"/>
+
+				<info type="gui-flag" value="hidden"/>
+			</module>
+		</select-by-device>
+
+		<select-by-device id="lufa.drivers.peripheral.spi" caption="LUFA SPI Driver">
+			<module type="driver" id="lufa.drivers.peripheral.spi#avr8" caption="LUFA SPI Driver - AVR8">
+				<device-support-alias value="lufa_avr8"/>
+
+				<build type="doxygen-entry-point" value="Group_SPI"/>
+
+				<require idref="lufa.common"/>
+
+				<build type="header-file" value="Drivers/Peripheral/AVR8/SPI_AVR8.h"/>
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Drivers/Peripheral/SPI.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.spi#xmega" caption="LUFA SPI Driver - XMEGA">
+				<device-support-alias value="lufa_xmega"/>
+
+				<build type="doxygen-entry-point" value="Group_SPI"/>
+
+				<require idref="lufa.common"/>
+
+				<build type="header-file" value="Drivers/Peripheral/XMEGA/SPI_XMEGA.h"/>
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Drivers/Peripheral/SPI.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.spi#uc3" caption="LUFA SPI Driver - UC3">
+				<device-support-alias value="lufa_uc3"/>
+
+				<build type="doxygen-entry-point" value="Group_SPI"/>
+
+				<require idref="lufa.common"/>
+
+				<info type="gui-flag" value="hidden"/>
+			</module>
+		</select-by-device>
+
+		<select-by-device id="lufa.drivers.peripheral.usart_spi" caption="LUFA USART SPI Driver">
+			<module type="driver" id="lufa.drivers.peripheral.usart_spi#avr8" caption="LUFA USART SPI Driver - AVR8">
+				<device-support-alias value="lufa_avr8"/>
+
+				<build type="doxygen-entry-point" value="Group_SerialSPI"/>
+
+				<require idref="lufa.common"/>
+
+				<build type="header-file" value="Drivers/Peripheral/AVR8/SerialSPI_AVR8.h"/>
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api"  value="Drivers/Peripheral/SerialSPI.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.usart_spi#xmega" caption="LUFA USART SPI Driver - XMEGA">
+				<device-support-alias value="lufa_xmega"/>
+
+				<build type="doxygen-entry-point" value="Group_SerialSPI"/>
+
+				<require idref="lufa.common"/>
+
+				<build type="header-file" value="Drivers/Peripheral/XMEGA/SerialSPI_XMEGA.h"/>
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Drivers/Peripheral/SerialSPI.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.usart_spi#uc3" caption="LUFA USART SPI Driver - UC3">
+				<device-support-alias value="lufa_uc3"/>
+
+				<build type="doxygen-entry-point" value="Group_SerialSPI"/>
+
+				<require idref="lufa.common"/>
+
+				<info type="gui-flag" value="hidden"/>
+			</module>
+		</select-by-device>
+
+		<select-by-device id="lufa.drivers.peripheral.twi" caption="LUFA TWI Master Driver">
+			<module type="driver" id="lufa.drivers.peripheral.twi#avr8" caption="LUFA TWI Master Driver - AVR8">
+				<device-support-alias value="lufa_avr8"/>
+
+				<build type="doxygen-entry-point" value="Group_TWI"/>
+
+				<require idref="lufa.common"/>
+
+				<build type="c-source" value="Drivers/Peripheral/AVR8/TWI_AVR8.c"/>
+				<build type="header-file" value="Drivers/Peripheral/AVR8/TWI_AVR8.h"/>
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Drivers/Peripheral/TWI.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.twi#xmega" caption="LUFA TWI Master Driver - XMEGA">
+				<device-support-alias value="lufa_xmega"/>
+
+				<build type="doxygen-entry-point" value="Group_TWI"/>
+
+				<require idref="lufa.common"/>
+
+				<build type="c-source" value="Drivers/Peripheral/XMEGA/TWI_XMEGA.c"/>
+				<build type="header-file" value="Drivers/Peripheral/XMEGA/TWI_XMEGA.h"/>
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Drivers/Peripheral/TWI.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.twi#uc3" caption="LUFA TWI Master Driver - UC3">
+				<device-support-alias value="lufa_uc3"/>
+
+				<build type="doxygen-entry-point" value="Group_TWI"/>
+
+				<require idref="lufa.common"/>
+
+				<info type="gui-flag" value="hidden"/>
+			</module>
+		</select-by-device>
+
+		<select-by-device id="lufa.drivers.peripheral.adc" caption="LUFA ADC Driver">
+			<module type="driver" id="lufa.drivers.peripheral.adc#avr8" caption="LUFA ADC Driver - AVR8">
+				<device-support-alias value="lufa_avr8"/>
+
+				<build type="doxygen-entry-point" value="Group_ADC"/>
+
+				<require idref="lufa.common"/>
+
+				<build type="header-file" value="Drivers/Peripheral/AVR8/ADC_AVR8.h"/>
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Drivers/Peripheral/ADC.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.adc#xmega" caption="LUFA ADC Driver - XMEGA">
+				<device-support-alias value="lufa_xmega"/>
+
+				<build type="doxygen-entry-point" value="Group_ADC"/>
+
+				<require idref="lufa.common"/>
+
+				<info type="gui-flag" value="hidden"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.adc#uc3" caption="LUFA ADC Driver - UC3">
+				<device-support-alias value="lufa_uc3"/>
+
+				<build type="doxygen-entry-point" value="Group_ADC"/>
+
+				<require idref="lufa.common"/>
+
+				<info type="gui-flag" value="hidden"/>
+			</module>
+		</select-by-device>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb.xml
index 7ff4b39492..263c411dff 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb.xml
@@ -1,32 +1,32 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<module type="driver" id="lufa.drivers.usb" caption="LUFA USB Driver">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_USB"/>

-

-			<build type="define" name="USE_LUFA_CONFIG_HEADER" value=""/>

-			<build type="module-config" subtype="path" value="CodeTemplates"/>

-			<build type="module-config" subtype="required-header-file" value="LUFAConfig.h"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file" subtype="api" value="Drivers/USB/USB.h"/>

-

-			<require idref="lufa.common"/>

-			<require idref="lufa.drivers.usb.class"/>

-			<require idref="lufa.drivers.usb.core"/>

-		</module>

-	</asf>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<module type="driver" id="lufa.drivers.usb" caption="LUFA USB Driver">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_USB"/>
+
+			<build type="define" name="USE_LUFA_CONFIG_HEADER" value=""/>
+			<build type="module-config" subtype="path" value="CodeTemplates"/>
+			<build type="module-config" subtype="required-header-file" value="LUFAConfig.h"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file" subtype="api" value="Drivers/USB/USB.h"/>
+
+			<require idref="lufa.common"/>
+			<require idref="lufa.drivers.usb.class"/>
+			<require idref="lufa.drivers.usb.core"/>
+		</module>
+	</asf>
 </lufa>
\ No newline at end of file
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_class.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_class.xml
index cd18bf10e7..67ab760d33 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_class.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_class.xml
@@ -1,32 +1,32 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<module type="service" id="lufa.drivers.usb.class" caption="LUFA USB Class Drivers">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<info type="gui-flag" value="hidden"/>

-			<build type="doxygen-entry-point" value="Group_USBClassDrivers"/>

-

-			<require idref="lufa.drivers.usb.class.android"/>

-			<require idref="lufa.drivers.usb.class.audio"/>

-			<require idref="lufa.drivers.usb.class.cdc"/>

-			<require idref="lufa.drivers.usb.class.hid"/>

-			<require idref="lufa.drivers.usb.class.ms"/>

-			<require idref="lufa.drivers.usb.class.midi"/>

-			<require idref="lufa.drivers.usb.class.printer"/>

-			<require idref="lufa.drivers.usb.class.rndis"/>

-			<require idref="lufa.drivers.usb.class.si"/>

-		</module>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<module type="service" id="lufa.drivers.usb.class" caption="LUFA USB Class Drivers">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<info type="gui-flag" value="hidden"/>
+			<build type="doxygen-entry-point" value="Group_USBClassDrivers"/>
+
+			<require idref="lufa.drivers.usb.class.android"/>
+			<require idref="lufa.drivers.usb.class.audio"/>
+			<require idref="lufa.drivers.usb.class.cdc"/>
+			<require idref="lufa.drivers.usb.class.hid"/>
+			<require idref="lufa.drivers.usb.class.ms"/>
+			<require idref="lufa.drivers.usb.class.midi"/>
+			<require idref="lufa.drivers.usb.class.printer"/>
+			<require idref="lufa.drivers.usb.class.rndis"/>
+			<require idref="lufa.drivers.usb.class.si"/>
+		</module>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core.xml
index 58f8917ef4..58a0b388f6 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core.xml
@@ -1,85 +1,85 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<module type="driver" id="lufa.drivers.usb.core.common" caption="LUFA USB Core Driver - Common">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_USBManagement"/>

-

-			<info type="gui-flag" value="hidden"/>

-

-			<build type="header-file" value="Drivers/USB/Core/Device.h"/>

-			<build type="header-file" value="Drivers/USB/Core/Endpoint.h"/>

-			<build type="header-file" value="Drivers/USB/Core/Host.h"/>

-			<build type="header-file" value="Drivers/USB/Core/Pipe.h"/>

-			<build type="header-file" value="Drivers/USB/Core/OTG.h"/>

-			<build type="header-file" value="Drivers/USB/Core/USBController.h"/>

-			<build type="header-file" value="Drivers/USB/Core/USBInterrupt.h"/>

-			<build type="header-file" value="Drivers/USB/Core/EndpointStream.h"/>

-			<build type="header-file" value="Drivers/USB/Core/PipeStream.h"/>

-	        <build type="c-source"    value="Drivers/USB/Core/ConfigDescriptors.c"/>

-			<build type="header-file" value="Drivers/USB/Core/ConfigDescriptors.h"/>

-	        <build type="c-source"    value="Drivers/USB/Core/DeviceStandardReq.c"/>

-			<build type="header-file" value="Drivers/USB/Core/DeviceStandardReq.h"/>

-	        <build type="c-source"    value="Drivers/USB/Core/Events.c"/>

-			<build type="header-file" value="Drivers/USB/Core/Events.h"/>

-	        <build type="c-source"    value="Drivers/USB/Core/HostStandardReq.c"/>

-			<build type="header-file" value="Drivers/USB/Core/HostStandardReq.h"/>

-	        <build type="c-source"    value="Drivers/USB/Core/USBTask.c"/>

-			<build type="header-file" value="Drivers/USB/Core/USBTask.h"/>

-			<build type="header-file" value="Drivers/USB/Core/USBMode.h"/>

-			<build type="header-file" value="Drivers/USB/Core/StdDescriptors.h"/>

-			<build type="header-file" value="Drivers/USB/Core/StdRequestType.h"/>

-

-	        <build type="c-source"    value="Drivers/USB/Class/Common/HIDParser.c"/>

-	        <build type="header-file" value="Drivers/USB/Class/Common/HIDParser.h"/>

-	        <build type="header-file" value="Drivers/USB/Class/Common/HIDReportData.h"/>

-	    </module>

-

-		<select-by-device id="lufa.drivers.usb.core" caption="LUFA USB Core Driver">

-			<module type="driver" id="lufa.drivers.usb.core#avr8" caption="LUFA USB Core Driver - AVR8">

-				<device-support-alias value="lufa_avr8"/>

-

-				<info type="gui-flag" value="hidden"/>

-

-				<build type="doxygen-entry-point" value="Group_USBManagement_AVR8"/>

-

-				<require idref="lufa.drivers.usb.core.common"/>

-				<require idref="lufa.drivers.usb.core.avr8"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.usb.core#xmega" caption="LUFA USB Core Driver - XMEGA">

-				<device-support-alias value="lufa_xmega"/>

-

-				<info type="gui-flag" value="hidden"/>

-

-				<build type="doxygen-entry-point" value="Group_USBManagement_XMEGA"/>

-

-				<require idref="lufa.drivers.usb.core.common"/>

-				<require idref="lufa.drivers.usb.core.xmega"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.usb.core#uc3" caption="LUFA USB Core Driver - UC3">

-				<device-support-alias value="lufa_uc3"/>

-

-				<info type="gui-flag" value="hidden"/>

-

-				<build type="doxygen-entry-point" value="Group_USBManagement_UC3"/>

-

-				<require idref="lufa.drivers.usb.core.common"/>

-				<require idref="lufa.drivers.usb.core.uc3"/>

-			</module>

-		</select-by-device>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<module type="driver" id="lufa.drivers.usb.core.common" caption="LUFA USB Core Driver - Common">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_USBManagement"/>
+
+			<info type="gui-flag" value="hidden"/>
+
+			<build type="header-file" value="Drivers/USB/Core/Device.h"/>
+			<build type="header-file" value="Drivers/USB/Core/Endpoint.h"/>
+			<build type="header-file" value="Drivers/USB/Core/Host.h"/>
+			<build type="header-file" value="Drivers/USB/Core/Pipe.h"/>
+			<build type="header-file" value="Drivers/USB/Core/OTG.h"/>
+			<build type="header-file" value="Drivers/USB/Core/USBController.h"/>
+			<build type="header-file" value="Drivers/USB/Core/USBInterrupt.h"/>
+			<build type="header-file" value="Drivers/USB/Core/EndpointStream.h"/>
+			<build type="header-file" value="Drivers/USB/Core/PipeStream.h"/>
+	        <build type="c-source"    value="Drivers/USB/Core/ConfigDescriptors.c"/>
+			<build type="header-file" value="Drivers/USB/Core/ConfigDescriptors.h"/>
+	        <build type="c-source"    value="Drivers/USB/Core/DeviceStandardReq.c"/>
+			<build type="header-file" value="Drivers/USB/Core/DeviceStandardReq.h"/>
+	        <build type="c-source"    value="Drivers/USB/Core/Events.c"/>
+			<build type="header-file" value="Drivers/USB/Core/Events.h"/>
+	        <build type="c-source"    value="Drivers/USB/Core/HostStandardReq.c"/>
+			<build type="header-file" value="Drivers/USB/Core/HostStandardReq.h"/>
+	        <build type="c-source"    value="Drivers/USB/Core/USBTask.c"/>
+			<build type="header-file" value="Drivers/USB/Core/USBTask.h"/>
+			<build type="header-file" value="Drivers/USB/Core/USBMode.h"/>
+			<build type="header-file" value="Drivers/USB/Core/StdDescriptors.h"/>
+			<build type="header-file" value="Drivers/USB/Core/StdRequestType.h"/>
+
+	        <build type="c-source"    value="Drivers/USB/Class/Common/HIDParser.c"/>
+	        <build type="header-file" value="Drivers/USB/Class/Common/HIDParser.h"/>
+	        <build type="header-file" value="Drivers/USB/Class/Common/HIDReportData.h"/>
+	    </module>
+
+		<select-by-device id="lufa.drivers.usb.core" caption="LUFA USB Core Driver">
+			<module type="driver" id="lufa.drivers.usb.core#avr8" caption="LUFA USB Core Driver - AVR8">
+				<device-support-alias value="lufa_avr8"/>
+
+				<info type="gui-flag" value="hidden"/>
+
+				<build type="doxygen-entry-point" value="Group_USBManagement_AVR8"/>
+
+				<require idref="lufa.drivers.usb.core.common"/>
+				<require idref="lufa.drivers.usb.core.avr8"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.usb.core#xmega" caption="LUFA USB Core Driver - XMEGA">
+				<device-support-alias value="lufa_xmega"/>
+
+				<info type="gui-flag" value="hidden"/>
+
+				<build type="doxygen-entry-point" value="Group_USBManagement_XMEGA"/>
+
+				<require idref="lufa.drivers.usb.core.common"/>
+				<require idref="lufa.drivers.usb.core.xmega"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.usb.core#uc3" caption="LUFA USB Core Driver - UC3">
+				<device-support-alias value="lufa_uc3"/>
+
+				<info type="gui-flag" value="hidden"/>
+
+				<build type="doxygen-entry-point" value="Group_USBManagement_UC3"/>
+
+				<require idref="lufa.drivers.usb.core.common"/>
+				<require idref="lufa.drivers.usb.core.uc3"/>
+			</module>
+		</select-by-device>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_avr8.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_avr8.xml
index 166b9257aa..4688f05f91 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_avr8.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_avr8.xml
@@ -1,43 +1,43 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<module type="driver" id="lufa.drivers.usb.core.avr8" caption="LUFA USB Core Driver for AVR8">

-			<device-support-alias value="lufa_avr8"/>

-

-			<info type="gui-flag" value="hidden"/>

-

-			<build type="doxygen-entry-point" value="Group_USBManagement_AVR8"/>

-

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_W.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Endpoint_RW.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Pipe_RW.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/Device_AVR8.c"/>

-			<build type="header-file" value="Drivers/USB/Core/AVR8/Device_AVR8.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/Endpoint_AVR8.c"/>

-			<build type="header-file" value="Drivers/USB/Core/AVR8/Endpoint_AVR8.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/Host_AVR8.c"/>

-			<build type="header-file" value="Drivers/USB/Core/AVR8/Host_AVR8.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/Pipe_AVR8.c"/>

-			<build type="header-file" value="Drivers/USB/Core/AVR8/Pipe_AVR8.h"/>

-			<build type="header-file" value="Drivers/USB/Core/AVR8/OTG_AVR8.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/USBController_AVR8.c"/>

-			<build type="header-file" value="Drivers/USB/Core/AVR8/USBController_AVR8.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c"/>

-			<build type="header-file" value="Drivers/USB/Core/AVR8/USBInterrupt_AVR8.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/EndpointStream_AVR8.c"/>

-			<build type="header-file" value="Drivers/USB/Core/AVR8/EndpointStream_AVR8.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/PipeStream_AVR8.c"/>

-			<build type="header-file" value="Drivers/USB/Core/AVR8/PipeStream_AVR8.h"/>

-		</module>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<module type="driver" id="lufa.drivers.usb.core.avr8" caption="LUFA USB Core Driver for AVR8">
+			<device-support-alias value="lufa_avr8"/>
+
+			<info type="gui-flag" value="hidden"/>
+
+			<build type="doxygen-entry-point" value="Group_USBManagement_AVR8"/>
+
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_W.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Endpoint_RW.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Pipe_RW.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/Device_AVR8.c"/>
+			<build type="header-file" value="Drivers/USB/Core/AVR8/Device_AVR8.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/Endpoint_AVR8.c"/>
+			<build type="header-file" value="Drivers/USB/Core/AVR8/Endpoint_AVR8.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/Host_AVR8.c"/>
+			<build type="header-file" value="Drivers/USB/Core/AVR8/Host_AVR8.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/Pipe_AVR8.c"/>
+			<build type="header-file" value="Drivers/USB/Core/AVR8/Pipe_AVR8.h"/>
+			<build type="header-file" value="Drivers/USB/Core/AVR8/OTG_AVR8.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/USBController_AVR8.c"/>
+			<build type="header-file" value="Drivers/USB/Core/AVR8/USBController_AVR8.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c"/>
+			<build type="header-file" value="Drivers/USB/Core/AVR8/USBInterrupt_AVR8.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/EndpointStream_AVR8.c"/>
+			<build type="header-file" value="Drivers/USB/Core/AVR8/EndpointStream_AVR8.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/PipeStream_AVR8.c"/>
+			<build type="header-file" value="Drivers/USB/Core/AVR8/PipeStream_AVR8.h"/>
+		</module>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_uc3.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_uc3.xml
index 7e0540cda7..2e7185f24a 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_uc3.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_uc3.xml
@@ -1,42 +1,42 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<module type="driver" id="lufa.drivers.usb.core.uc3" caption="LUFA USB Core Driver for UC3">

-			<device-support-alias value="lufa_uc3"/>

-

-			<info type="gui-flag" value="hidden"/>

-

-			<build type="doxygen-entry-point" value="Group_USBManagement_UC3"/>

-

-			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_R.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_W.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Endpoint_RW.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Pipe_RW.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/Device_UC3.c"/>

-			<build type="header-file" value="Drivers/USB/Core/UC3/Device_UC3.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/Endpoint_UC3.c"/>

-			<build type="header-file" value="Drivers/USB/Core/UC3/Endpoint_UC3.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/Host_UC3.c"/>

-			<build type="header-file" value="Drivers/USB/Core/UC3/Host_UC3.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/Pipe_UC3.c"/>

-			<build type="header-file" value="Drivers/USB/Core/UC3/Pipe_UC3.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/USBController_UC3.c"/>

-			<build type="header-file" value="Drivers/USB/Core/UC3/USBController_UC3.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/USBInterrupt_UC3.c"/>

-			<build type="header-file" value="Drivers/USB/Core/UC3/USBInterrupt_UC3.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/EndpointStream_UC3.c"/>

-			<build type="header-file" value="Drivers/USB/Core/UC3/EndpointStream_UC3.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/PipeStream_UC3.c"/>

-			<build type="header-file" value="Drivers/USB/Core/UC3/PipeStream_UC3.h"/>

-		</module>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<module type="driver" id="lufa.drivers.usb.core.uc3" caption="LUFA USB Core Driver for UC3">
+			<device-support-alias value="lufa_uc3"/>
+
+			<info type="gui-flag" value="hidden"/>
+
+			<build type="doxygen-entry-point" value="Group_USBManagement_UC3"/>
+
+			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_R.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_W.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Endpoint_RW.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Pipe_RW.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/Device_UC3.c"/>
+			<build type="header-file" value="Drivers/USB/Core/UC3/Device_UC3.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/Endpoint_UC3.c"/>
+			<build type="header-file" value="Drivers/USB/Core/UC3/Endpoint_UC3.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/Host_UC3.c"/>
+			<build type="header-file" value="Drivers/USB/Core/UC3/Host_UC3.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/Pipe_UC3.c"/>
+			<build type="header-file" value="Drivers/USB/Core/UC3/Pipe_UC3.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/USBController_UC3.c"/>
+			<build type="header-file" value="Drivers/USB/Core/UC3/USBController_UC3.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/USBInterrupt_UC3.c"/>
+			<build type="header-file" value="Drivers/USB/Core/UC3/USBInterrupt_UC3.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/EndpointStream_UC3.c"/>
+			<build type="header-file" value="Drivers/USB/Core/UC3/EndpointStream_UC3.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/PipeStream_UC3.c"/>
+			<build type="header-file" value="Drivers/USB/Core/UC3/PipeStream_UC3.h"/>
+		</module>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_xmega.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_xmega.xml
index 9e9f4f6a1d..c79a0f5b52 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_xmega.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_xmega.xml
@@ -1,36 +1,36 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<module type="driver" id="lufa.drivers.usb.core.xmega" caption="LUFA USB Core Driver for XMEGA">

-			<device-support-alias value="lufa_xmega"/>

-

-			<info type="gui-flag" value="hidden"/>

-

-			<build type="doxygen-entry-point" value="Group_USBManagement_XMEGA"/>

-

-			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Device_XMEGA.c"/>

-			<build type="header-file" value="Drivers/USB/Core/XMEGA/Device_XMEGA.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c"/>

-			<build type="header-file" value="Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Pipe_XMEGA.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/XMEGA/USBController_XMEGA.c"/>

-			<build type="header-file" value="Drivers/USB/Core/XMEGA/USBController_XMEGA.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c"/>

-			<build type="header-file" value="Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.c"/>

-			<build type="header-file" value="Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.h"/>

-		</module>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<module type="driver" id="lufa.drivers.usb.core.xmega" caption="LUFA USB Core Driver for XMEGA">
+			<device-support-alias value="lufa_xmega"/>
+
+			<info type="gui-flag" value="hidden"/>
+
+			<build type="doxygen-entry-point" value="Group_USBManagement_XMEGA"/>
+
+			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Device_XMEGA.c"/>
+			<build type="header-file" value="Drivers/USB/Core/XMEGA/Device_XMEGA.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c"/>
+			<build type="header-file" value="Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Pipe_XMEGA.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/XMEGA/USBController_XMEGA.c"/>
+			<build type="header-file" value="Drivers/USB/Core/XMEGA/USBController_XMEGA.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c"/>
+			<build type="header-file" value="Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.c"/>
+			<build type="header-file" value="Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.h"/>
+		</module>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform.xml
index 02c7463ee5..4ee51f6ee0 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform.xml
@@ -1,60 +1,60 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<select-by-device id="lufa.platform" caption="LUFA Platform Specific Support">

-			<module type="service" id="lufa.platform#avr8" caption="LUFA Platform Specific Support - AVR8">

-				<device-support-alias value="lufa_avr8"/>

-

-				<build type="define" name="ARCH" value="ARCH_AVR8"/>

-

-				<build type="doxygen-entry-point" value="Group_PlatformDrivers"/>

-

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Platform/Platform.h"/>

-

-				<require idref="lufa.common"/>

-			</module>

-

-			<module type="service" id="lufa.platform#xmega" caption="LUFA Platform Specific Support - XMEGA">

-				<device-support-alias value="lufa_xmega"/>

-

-				<build type="define" name="ARCH" value="ARCH_XMEGA"/>

-

-				<build type="doxygen-entry-point" value="Group_PlatformDrivers"/>

-

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Platform/Platform.h"/>

-

-				<build type="distribute" value="Platform/XMEGA/XMEGAExperimentalInfo.txt" subtype="license"/>

-

-				<require idref="lufa.platform.xmega"/>

-				<require idref="lufa.common"/>

-			</module>

-

-			<module type="service" id="lufa.platform#uc3" caption="LUFA Platform Specific Support - UC3">

-				<device-support-alias value="lufa_uc3"/>

-

-				<build type="define" name="ARCH" value="ARCH_UC3"/>

-

-				<build type="doxygen-entry-point" value="Group_PlatformDrivers"/>

-

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Platform/Platform.h"/>

-

-				<build type="distribute" value="Platform/UC3/UC3ExperimentalInfo.txt" subtype="license"/>

-

-				<require idref="lufa.platform.uc3"/>

-				<require idref="lufa.common"/>

-			</module>

-		</select-by-device>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<select-by-device id="lufa.platform" caption="LUFA Platform Specific Support">
+			<module type="service" id="lufa.platform#avr8" caption="LUFA Platform Specific Support - AVR8">
+				<device-support-alias value="lufa_avr8"/>
+
+				<build type="define" name="ARCH" value="ARCH_AVR8"/>
+
+				<build type="doxygen-entry-point" value="Group_PlatformDrivers"/>
+
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Platform/Platform.h"/>
+
+				<require idref="lufa.common"/>
+			</module>
+
+			<module type="service" id="lufa.platform#xmega" caption="LUFA Platform Specific Support - XMEGA">
+				<device-support-alias value="lufa_xmega"/>
+
+				<build type="define" name="ARCH" value="ARCH_XMEGA"/>
+
+				<build type="doxygen-entry-point" value="Group_PlatformDrivers"/>
+
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Platform/Platform.h"/>
+
+				<build type="distribute" value="Platform/XMEGA/XMEGAExperimentalInfo.txt" subtype="license"/>
+
+				<require idref="lufa.platform.xmega"/>
+				<require idref="lufa.common"/>
+			</module>
+
+			<module type="service" id="lufa.platform#uc3" caption="LUFA Platform Specific Support - UC3">
+				<device-support-alias value="lufa_uc3"/>
+
+				<build type="define" name="ARCH" value="ARCH_UC3"/>
+
+				<build type="doxygen-entry-point" value="Group_PlatformDrivers"/>
+
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Platform/Platform.h"/>
+
+				<build type="distribute" value="Platform/UC3/UC3ExperimentalInfo.txt" subtype="license"/>
+
+				<require idref="lufa.platform.uc3"/>
+				<require idref="lufa.common"/>
+			</module>
+		</select-by-device>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_uc3.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_uc3.xml
index a488c4b83d..98017b08ad 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_uc3.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_uc3.xml
@@ -1,26 +1,26 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<module type="driver" id="lufa.platform.uc3" caption="LUFA UC3 Platform Drivers">

-			<device-support-alias value="lufa_uc3"/>

-

-			<info type="gui-flag" value="hidden"/>

-

-			<build type="doxygen-entry-point" value="Group_PlatformDrivers_UC3"/>

-

-			<build type="header-file" value="Platform/UC3/ClockManagement.h"/>

-			<build type="header-file" value="Platform/UC3/InterruptManagement.h"/>

-			<build type="c-source" value="Platform/UC3/InterruptManagement.c"/>

-			<build type="asm-source" value="Platform/UC3/Exception.S"/>

-		</module>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<module type="driver" id="lufa.platform.uc3" caption="LUFA UC3 Platform Drivers">
+			<device-support-alias value="lufa_uc3"/>
+
+			<info type="gui-flag" value="hidden"/>
+
+			<build type="doxygen-entry-point" value="Group_PlatformDrivers_UC3"/>
+
+			<build type="header-file" value="Platform/UC3/ClockManagement.h"/>
+			<build type="header-file" value="Platform/UC3/InterruptManagement.h"/>
+			<build type="c-source" value="Platform/UC3/InterruptManagement.c"/>
+			<build type="asm-source" value="Platform/UC3/Exception.S"/>
+		</module>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_xmega.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_xmega.xml
index 1674a77b02..e613fe5206 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_xmega.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_xmega.xml
@@ -1,23 +1,23 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf xmlversion="1.0">

-		<module type="driver" id="lufa.platform.xmega" caption="LUFA XMEGA Platform Drivers">

-			<device-support-alias value="lufa_xmega"/>

-

-			<info type="gui-flag" value="hidden"/>

-

-			<build type="doxygen-entry-point" value="Group_PlatformDrivers_XMEGA"/>

-

-			<build type="header-file" value="Platform/XMEGA/ClockManagement.h"/>

-		</module>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf xmlversion="1.0">
+		<module type="driver" id="lufa.platform.xmega" caption="LUFA XMEGA Platform Drivers">
+			<device-support-alias value="lufa_xmega"/>
+
+			<info type="gui-flag" value="hidden"/>
+
+			<build type="doxygen-entry-point" value="Group_PlatformDrivers_XMEGA"/>
+
+			<build type="header-file" value="Platform/XMEGA/ClockManagement.h"/>
+		</module>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_toolchain.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_toolchain.xml
index 031c8a2be6..a76b6d0d3b 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_toolchain.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_toolchain.xml
@@ -1,43 +1,43 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<select-by-device id="common.utils.toolchain_config" caption="Toolchain configuration defaults">

-			<module type="build-specific" id="common.utils.toolchain_config#avr" caption="Toolchain configuration defaults for 8-bit AVR">

-				<info type="gui-flag" value="hidden"/>

-				<device-support value="avr"/>

-

-				<toolchain-config name="avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned" value="True" toolchain="avrgcc"/>

-				<toolchain-config name="avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned" value="True" toolchain="avrgcc"/>

-				<toolchain-config name="avrgcc.compiler.optimization.OtherFlags" value="-fdata-sections" toolchain="avrgcc"/>

-				<toolchain-config name="avrgcc.compiler.optimization.PrepareFunctionsForGarbageCollection" value="True" toolchain="avrgcc"/>

-				<toolchain-config name="avrgcc.compiler.warnings.AllWarnings" value="True" toolchain="avrgcc"/>

-				<toolchain-config name="avrgcc.compiler.miscellaneous.OtherFlags" value="-mrelax -std=gnu99 -fno-strict-aliasing -fno-jump-tables" toolchain="avrgcc"/>

-				<toolchain-config name="avrgcc.linker.optimization.GarbageCollectUnusedSections" value="True" toolchain="avrgcc"/>

-				<toolchain-config name="avrgcc.linker.optimization.RelaxBranches" value="True" toolchain="avrgcc"/>

-			</module>

-		</select-by-device>

-

-		<module type="build-specific" id="common.utils.toolchain_config#uc3" caption="Toolchain configuration defaults for 32-bit AVR">

-			<info type="gui-flag" value="hidden"/>

-			<device-support value="uc3"/>

-

-			<toolchain-config name="avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned" value="True" toolchain="avr32gcc"/>

-			<toolchain-config name="avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned" value="True" toolchain="avr32gcc"/>

-			<toolchain-config name="avr32gcc.compiler.optimization.OtherFlags" value="-fdata-sections" toolchain="avr32gcc"/>

-			<toolchain-config name="avr32gcc.compiler.optimization.PrepareFunctionsForGarbageCollection" value="True" toolchain="avr32gcc"/>

-			<toolchain-config name="avr32gcc.compiler.warnings.AllWarnings" value="True" toolchain="avr32gcc"/>

-			<toolchain-config name="avr32gcc.compiler.miscellaneous.OtherFlags" value="-mrelax -std=gnu99 -fno-strict-aliasing -mno-cond-exec-before-reload" toolchain="avr32gcc"/>

-			<toolchain-config name="avr32gcc.linker.optimization.GarbageCollectUnusedSections" value="True" toolchain="avr32gcc"/>

-			<toolchain-config name="avr32gcc.linker.optimization.RelaxBranches" value="True" toolchain="avr32gcc"/>

-		</module>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<select-by-device id="common.utils.toolchain_config" caption="Toolchain configuration defaults">
+			<module type="build-specific" id="common.utils.toolchain_config#avr" caption="Toolchain configuration defaults for 8-bit AVR">
+				<info type="gui-flag" value="hidden"/>
+				<device-support value="avr"/>
+
+				<toolchain-config name="avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned" value="True" toolchain="avrgcc"/>
+				<toolchain-config name="avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned" value="True" toolchain="avrgcc"/>
+				<toolchain-config name="avrgcc.compiler.optimization.OtherFlags" value="-fdata-sections" toolchain="avrgcc"/>
+				<toolchain-config name="avrgcc.compiler.optimization.PrepareFunctionsForGarbageCollection" value="True" toolchain="avrgcc"/>
+				<toolchain-config name="avrgcc.compiler.warnings.AllWarnings" value="True" toolchain="avrgcc"/>
+				<toolchain-config name="avrgcc.compiler.miscellaneous.OtherFlags" value="-mrelax -std=gnu99 -fno-strict-aliasing -fno-jump-tables" toolchain="avrgcc"/>
+				<toolchain-config name="avrgcc.linker.optimization.GarbageCollectUnusedSections" value="True" toolchain="avrgcc"/>
+				<toolchain-config name="avrgcc.linker.optimization.RelaxBranches" value="True" toolchain="avrgcc"/>
+			</module>
+		</select-by-device>
+
+		<module type="build-specific" id="common.utils.toolchain_config#uc3" caption="Toolchain configuration defaults for 32-bit AVR">
+			<info type="gui-flag" value="hidden"/>
+			<device-support value="uc3"/>
+
+			<toolchain-config name="avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned" value="True" toolchain="avr32gcc"/>
+			<toolchain-config name="avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned" value="True" toolchain="avr32gcc"/>
+			<toolchain-config name="avr32gcc.compiler.optimization.OtherFlags" value="-fdata-sections" toolchain="avr32gcc"/>
+			<toolchain-config name="avr32gcc.compiler.optimization.PrepareFunctionsForGarbageCollection" value="True" toolchain="avr32gcc"/>
+			<toolchain-config name="avr32gcc.compiler.warnings.AllWarnings" value="True" toolchain="avr32gcc"/>
+			<toolchain-config name="avr32gcc.compiler.miscellaneous.OtherFlags" value="-mrelax -std=gnu99 -fno-strict-aliasing -mno-cond-exec-before-reload" toolchain="avr32gcc"/>
+			<toolchain-config name="avr32gcc.linker.optimization.GarbageCollectUnusedSections" value="True" toolchain="avr32gcc"/>
+			<toolchain-config name="avr32gcc.linker.optimization.RelaxBranches" value="True" toolchain="avr32gcc"/>
+		</module>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/adafruit_ble.cpp b/tmk_core/protocol/lufa/adafruit_ble.cpp
new file mode 100644
index 0000000000..fd6edd42cf
--- /dev/null
+++ b/tmk_core/protocol/lufa/adafruit_ble.cpp
@@ -0,0 +1,805 @@
+#include "adafruit_ble.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <alloca.h>
+#include <util/delay.h>
+#include <util/atomic.h>
+#include "debug.h"
+#include "pincontrol.h"
+#include "timer.h"
+#include "action_util.h"
+#include "ringbuffer.hpp"
+#include <string.h>
+
+// These are the pin assignments for the 32u4 boards.
+// You may define them to something else in your config.h
+// if yours is wired up differently.
+#ifndef AdafruitBleResetPin
+#define AdafruitBleResetPin D4
+#endif
+
+#ifndef AdafruitBleCSPin
+#define AdafruitBleCSPin    B4
+#endif
+
+#ifndef AdafruitBleIRQPin
+#define AdafruitBleIRQPin   E6
+#endif
+
+
+#define SAMPLE_BATTERY
+#define ConnectionUpdateInterval 1000 /* milliseconds */
+
+static struct {
+  bool is_connected;
+  bool initialized;
+  bool configured;
+
+#define ProbedEvents 1
+#define UsingEvents 2
+  bool event_flags;
+
+#ifdef SAMPLE_BATTERY
+  uint16_t last_battery_update;
+  uint32_t vbat;
+#endif
+  uint16_t last_connection_update;
+} state;
+
+// Commands are encoded using SDEP and sent via SPI
+// https://github.com/adafruit/Adafruit_BluefruitLE_nRF51/blob/master/SDEP.md
+
+#define SdepMaxPayload 16
+struct sdep_msg {
+  uint8_t type;
+  uint8_t cmd_low;
+  uint8_t cmd_high;
+  struct __attribute__((packed)) {
+    uint8_t len:7;
+    uint8_t more:1;
+  };
+  uint8_t payload[SdepMaxPayload];
+} __attribute__((packed));
+
+// The recv latency is relatively high, so when we're hammering keys quickly,
+// we want to avoid waiting for the responses in the matrix loop.  We maintain
+// a short queue for that.  Since there is quite a lot of space overhead for
+// the AT command representation wrapped up in SDEP, we queue the minimal
+// information here.
+
+enum queue_type {
+  QTKeyReport, // 1-byte modifier + 6-byte key report
+  QTConsumer,  // 16-bit key code
+#ifdef MOUSE_ENABLE
+  QTMouseMove, // 4-byte mouse report
+#endif
+};
+
+struct queue_item {
+  enum queue_type queue_type;
+  uint16_t added;
+  union __attribute__((packed)) {
+    struct __attribute__((packed)) {
+      uint8_t modifier;
+      uint8_t keys[6];
+    } key;
+
+    uint16_t consumer;
+    struct __attribute__((packed)) {
+      int8_t x, y, scroll, pan;
+    } mousemove;
+  };
+};
+
+// Items that we wish to send
+static RingBuffer<queue_item, 40> send_buf;
+// Pending response; while pending, we can't send any more requests.
+// This records the time at which we sent the command for which we
+// are expecting a response.
+static RingBuffer<uint16_t, 2> resp_buf;
+
+static bool process_queue_item(struct queue_item *item, uint16_t timeout);
+
+enum sdep_type {
+  SdepCommand = 0x10,
+  SdepResponse = 0x20,
+  SdepAlert = 0x40,
+  SdepError = 0x80,
+  SdepSlaveNotReady = 0xfe, // Try again later
+  SdepSlaveOverflow = 0xff, // You read more data than is available
+};
+
+enum ble_cmd {
+  BleInitialize = 0xbeef,
+  BleAtWrapper = 0x0a00,
+  BleUartTx = 0x0a01,
+  BleUartRx = 0x0a02,
+};
+
+enum ble_system_event_bits {
+  BleSystemConnected = 0,
+  BleSystemDisconnected = 1,
+  BleSystemUartRx = 8,
+  BleSystemMidiRx = 10,
+};
+
+// The SDEP.md file says 2MHz but the web page and the sample driver
+// both use 4MHz
+#define SpiBusSpeed 4000000
+
+#define SdepTimeout 150 /* milliseconds */
+#define SdepShortTimeout 10 /* milliseconds */
+#define SdepBackOff 25 /* microseconds */
+#define BatteryUpdateInterval 10000 /* milliseconds */
+
+static bool at_command(const char *cmd, char *resp, uint16_t resplen,
+                       bool verbose, uint16_t timeout = SdepTimeout);
+static bool at_command_P(const char *cmd, char *resp, uint16_t resplen,
+                         bool verbose = false);
+
+struct SPI_Settings {
+  uint8_t spcr, spsr;
+};
+
+static struct SPI_Settings spi;
+
+// Initialize 4Mhz MSBFIRST MODE0
+void SPI_init(struct SPI_Settings *spi) {
+  spi->spcr = _BV(SPE) | _BV(MSTR);
+  spi->spsr = _BV(SPI2X);
+
+  static_assert(SpiBusSpeed == F_CPU / 2, "hard coded at 4Mhz");
+
+  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+    // Ensure that SS is OUTPUT High
+    digitalWrite(B0, PinLevelHigh);
+    pinMode(B0, PinDirectionOutput);
+
+    SPCR |= _BV(MSTR);
+    SPCR |= _BV(SPE);
+    pinMode(B1 /* SCK */, PinDirectionOutput);
+    pinMode(B2 /* MOSI */, PinDirectionOutput);
+  }
+}
+
+static inline void SPI_begin(struct SPI_Settings*spi) {
+  SPCR = spi->spcr;
+  SPSR = spi->spsr;
+}
+
+static inline uint8_t SPI_TransferByte(uint8_t data) {
+  SPDR = data;
+  asm volatile("nop");
+  while (!(SPSR & _BV(SPIF))) {
+    ; // wait
+  }
+  return SPDR;
+}
+
+static inline void spi_send_bytes(const uint8_t *buf, uint8_t len) {
+  if (len == 0) return;
+  const uint8_t *end = buf + len;
+  while (buf < end) {
+    SPDR = *buf;
+    while (!(SPSR & _BV(SPIF))) {
+      ; // wait
+    }
+    ++buf;
+  }
+}
+
+static inline uint16_t spi_read_byte(void) {
+  return SPI_TransferByte(0x00 /* dummy */);
+}
+
+static inline void spi_recv_bytes(uint8_t *buf, uint8_t len) {
+  const uint8_t *end = buf + len;
+  if (len == 0) return;
+  while (buf < end) {
+    SPDR = 0; // write a dummy to initiate read
+    while (!(SPSR & _BV(SPIF))) {
+      ; // wait
+    }
+    *buf = SPDR;
+    ++buf;
+  }
+}
+
+#if 0
+static void dump_pkt(const struct sdep_msg *msg) {
+  print("pkt: type=");
+  print_hex8(msg->type);
+  print(" cmd=");
+  print_hex8(msg->cmd_high);
+  print_hex8(msg->cmd_low);
+  print(" len=");
+  print_hex8(msg->len);
+  print(" more=");
+  print_hex8(msg->more);
+  print("\n");
+}
+#endif
+
+// Send a single SDEP packet
+static bool sdep_send_pkt(const struct sdep_msg *msg, uint16_t timeout) {
+  SPI_begin(&spi);
+
+  digitalWrite(AdafruitBleCSPin, PinLevelLow);
+  uint16_t timerStart = timer_read();
+  bool success = false;
+  bool ready = false;
+
+  do {
+    ready = SPI_TransferByte(msg->type) != SdepSlaveNotReady;
+    if (ready) {
+      break;
+    }
+
+    // Release it and let it initialize
+    digitalWrite(AdafruitBleCSPin, PinLevelHigh);
+    _delay_us(SdepBackOff);
+    digitalWrite(AdafruitBleCSPin, PinLevelLow);
+  } while (timer_elapsed(timerStart) < timeout);
+
+  if (ready) {
+    // Slave is ready; send the rest of the packet
+    spi_send_bytes(&msg->cmd_low,
+                   sizeof(*msg) - (1 + sizeof(msg->payload)) + msg->len);
+    success = true;
+  }
+
+  digitalWrite(AdafruitBleCSPin, PinLevelHigh);
+
+  return success;
+}
+
+static inline void sdep_build_pkt(struct sdep_msg *msg, uint16_t command,
+                                  const uint8_t *payload, uint8_t len,
+                                  bool moredata) {
+  msg->type = SdepCommand;
+  msg->cmd_low = command & 0xff;
+  msg->cmd_high = command >> 8;
+  msg->len = len;
+  msg->more = (moredata && len == SdepMaxPayload) ? 1 : 0;
+
+  static_assert(sizeof(*msg) == 20, "msg is correctly packed");
+
+  memcpy(msg->payload, payload, len);
+}
+
+// Read a single SDEP packet
+static bool sdep_recv_pkt(struct sdep_msg *msg, uint16_t timeout) {
+  bool success = false;
+  uint16_t timerStart = timer_read();
+  bool ready = false;
+
+  do {
+    ready = digitalRead(AdafruitBleIRQPin);
+    if (ready) {
+      break;
+    }
+    _delay_us(1);
+  } while (timer_elapsed(timerStart) < timeout);
+
+  if (ready) {
+    SPI_begin(&spi);
+
+    digitalWrite(AdafruitBleCSPin, PinLevelLow);
+
+    do {
+      // Read the command type, waiting for the data to be ready
+      msg->type = spi_read_byte();
+      if (msg->type == SdepSlaveNotReady || msg->type == SdepSlaveOverflow) {
+        // Release it and let it initialize
+        digitalWrite(AdafruitBleCSPin, PinLevelHigh);
+        _delay_us(SdepBackOff);
+        digitalWrite(AdafruitBleCSPin, PinLevelLow);
+        continue;
+      }
+
+      // Read the rest of the header
+      spi_recv_bytes(&msg->cmd_low, sizeof(*msg) - (1 + sizeof(msg->payload)));
+
+      // and get the payload if there is any
+      if (msg->len <= SdepMaxPayload) {
+        spi_recv_bytes(msg->payload, msg->len);
+      }
+      success = true;
+      break;
+    } while (timer_elapsed(timerStart) < timeout);
+
+    digitalWrite(AdafruitBleCSPin, PinLevelHigh);
+  }
+  return success;
+}
+
+static void resp_buf_read_one(bool greedy) {
+  uint16_t last_send;
+  if (!resp_buf.peek(last_send)) {
+    return;
+  }
+
+  if (digitalRead(AdafruitBleIRQPin)) {
+    struct sdep_msg msg;
+
+again:
+    if (sdep_recv_pkt(&msg, SdepTimeout)) {
+      if (!msg.more) {
+        // We got it; consume this entry
+        resp_buf.get(last_send);
+        dprintf("recv latency %dms\n", TIMER_DIFF_16(timer_read(), last_send));
+      }
+
+      if (greedy && resp_buf.peek(last_send) && digitalRead(AdafruitBleIRQPin)) {
+        goto again;
+      }
+    }
+
+  } else if (timer_elapsed(last_send) > SdepTimeout * 2) {
+    dprintf("waiting_for_result: timeout, resp_buf size %d\n",
+            (int)resp_buf.size());
+
+    // Timed out: consume this entry
+    resp_buf.get(last_send);
+  }
+}
+
+static void send_buf_send_one(uint16_t timeout = SdepTimeout) {
+  struct queue_item item;
+
+  // Don't send anything more until we get an ACK
+  if (!resp_buf.empty()) {
+    return;
+  }
+
+  if (!send_buf.peek(item)) {
+    return;
+  }
+  if (process_queue_item(&item, timeout)) {
+    // commit that peek
+    send_buf.get(item);
+    dprintf("send_buf_send_one: have %d remaining\n", (int)send_buf.size());
+  } else {
+    dprint("failed to send, will retry\n");
+    _delay_ms(SdepTimeout);
+    resp_buf_read_one(true);
+  }
+}
+
+static void resp_buf_wait(const char *cmd) {
+  bool didPrint = false;
+  while (!resp_buf.empty()) {
+    if (!didPrint) {
+      dprintf("wait on buf for %s\n", cmd);
+      didPrint = true;
+    }
+    resp_buf_read_one(true);
+  }
+}
+
+static bool ble_init(void) {
+  state.initialized = false;
+  state.configured = false;
+  state.is_connected = false;
+
+  pinMode(AdafruitBleIRQPin, PinDirectionInput);
+  pinMode(AdafruitBleCSPin, PinDirectionOutput);
+  digitalWrite(AdafruitBleCSPin, PinLevelHigh);
+
+  SPI_init(&spi);
+
+  // Perform a hardware reset
+  pinMode(AdafruitBleResetPin, PinDirectionOutput);
+  digitalWrite(AdafruitBleResetPin, PinLevelHigh);
+  digitalWrite(AdafruitBleResetPin, PinLevelLow);
+  _delay_ms(10);
+  digitalWrite(AdafruitBleResetPin, PinLevelHigh);
+
+  _delay_ms(1000); // Give it a second to initialize
+
+  state.initialized = true;
+  return state.initialized;
+}
+
+static inline uint8_t min(uint8_t a, uint8_t b) {
+  return a < b ? a : b;
+}
+
+static bool read_response(char *resp, uint16_t resplen, bool verbose) {
+  char *dest = resp;
+  char *end = dest + resplen;
+
+  while (true) {
+    struct sdep_msg msg;
+
+    if (!sdep_recv_pkt(&msg, 2 * SdepTimeout)) {
+      dprint("sdep_recv_pkt failed\n");
+      return false;
+    }
+
+    if (msg.type != SdepResponse) {
+      *resp = 0;
+      return false;
+    }
+
+    uint8_t len = min(msg.len, end - dest);
+    if (len > 0) {
+      memcpy(dest, msg.payload, len);
+      dest += len;
+    }
+
+    if (!msg.more) {
+      // No more data is expected!
+      break;
+    }
+  }
+
+  // Ensure the response is NUL terminated
+  *dest = 0;
+
+  // "Parse" the result text; we want to snip off the trailing OK or ERROR line
+  // Rewind past the possible trailing CRLF so that we can strip it
+  --dest;
+  while (dest > resp && (dest[0] == '\n' || dest[0] == '\r')) {
+    *dest = 0;
+    --dest;
+  }
+
+  // Look back for start of preceeding line
+  char *last_line = strrchr(resp, '\n');
+  if (last_line) {
+    ++last_line;
+  } else {
+    last_line = resp;
+  }
+
+  bool success = false;
+  static const char kOK[] PROGMEM = "OK";
+
+  success = !strcmp_P(last_line, kOK );
+
+  if (verbose || !success) {
+    dprintf("result: %s\n", resp);
+  }
+  return success;
+}
+
+static bool at_command(const char *cmd, char *resp, uint16_t resplen,
+                       bool verbose, uint16_t timeout) {
+  const char *end = cmd + strlen(cmd);
+  struct sdep_msg msg;
+
+  if (verbose) {
+    dprintf("ble send: %s\n", cmd);
+  }
+
+  if (resp) {
+    // They want to decode the response, so we need to flush and wait
+    // for all pending I/O to finish before we start this one, so
+    // that we don't confuse the results
+    resp_buf_wait(cmd);
+    *resp = 0;
+  }
+
+  // Fragment the command into a series of SDEP packets
+  while (end - cmd > SdepMaxPayload) {
+    sdep_build_pkt(&msg, BleAtWrapper, (uint8_t *)cmd, SdepMaxPayload, true);
+    if (!sdep_send_pkt(&msg, timeout)) {
+      return false;
+    }
+    cmd += SdepMaxPayload;
+  }
+
+  sdep_build_pkt(&msg, BleAtWrapper, (uint8_t *)cmd, end - cmd, false);
+  if (!sdep_send_pkt(&msg, timeout)) {
+    return false;
+  }
+
+  if (resp == NULL) {
+    auto now = timer_read();
+    while (!resp_buf.enqueue(now)) {
+      resp_buf_read_one(false);
+    }
+    auto later = timer_read();
+    if (TIMER_DIFF_16(later, now) > 0) {
+      dprintf("waited %dms for resp_buf\n", TIMER_DIFF_16(later, now));
+    }
+    return true;
+  }
+
+  return read_response(resp, resplen, verbose);
+}
+
+bool at_command_P(const char *cmd, char *resp, uint16_t resplen, bool verbose) {
+  auto cmdbuf = (char *)alloca(strlen_P(cmd) + 1);
+  strcpy_P(cmdbuf, cmd);
+  return at_command(cmdbuf, resp, resplen, verbose);
+}
+
+bool adafruit_ble_is_connected(void) {
+  return state.is_connected;
+}
+
+bool adafruit_ble_enable_keyboard(void) {
+  char resbuf[128];
+
+  if (!state.initialized && !ble_init()) {
+    return false;
+  }
+
+  state.configured = false;
+
+  // Disable command echo
+  static const char kEcho[] PROGMEM = "ATE=0";
+  // Make the advertised name match the keyboard
+  static const char kGapDevName[] PROGMEM =
+      "AT+GAPDEVNAME=" STR(PRODUCT) " " STR(DESCRIPTION);
+  // Turn on keyboard support
+  static const char kHidEnOn[] PROGMEM = "AT+BLEHIDEN=1";
+
+  // Adjust intervals to improve latency.  This causes the "central"
+  // system (computer/tablet) to poll us every 10-30 ms.  We can't
+  // set a smaller value than 10ms, and 30ms seems to be the natural
+  // processing time on my macbook.  Keeping it constrained to that
+  // feels reasonable to type to.
+  static const char kGapIntervals[] PROGMEM = "AT+GAPINTERVALS=10,30,,";
+
+  // Reset the device so that it picks up the above changes
+  static const char kATZ[] PROGMEM = "ATZ";
+
+  // Turn down the power level a bit
+  static const char kPower[] PROGMEM = "AT+BLEPOWERLEVEL=-12";
+  static PGM_P const configure_commands[] PROGMEM = {
+    kEcho,
+    kGapIntervals,
+    kGapDevName,
+    kHidEnOn,
+    kPower,
+    kATZ,
+  };
+
+  uint8_t i;
+  for (i = 0; i < sizeof(configure_commands) / sizeof(configure_commands[0]);
+       ++i) {
+    PGM_P cmd;
+    memcpy_P(&cmd, configure_commands + i, sizeof(cmd));
+
+    if (!at_command_P(cmd, resbuf, sizeof(resbuf))) {
+      dprintf("failed BLE command: %S: %s\n", cmd, resbuf);
+      goto fail;
+    }
+  }
+
+  state.configured = true;
+
+  // Check connection status in a little while; allow the ATZ time
+  // to kick in.
+  state.last_connection_update = timer_read();
+fail:
+  return state.configured;
+}
+
+static void set_connected(bool connected) {
+  if (connected != state.is_connected) {
+    if (connected) {
+      print("****** BLE CONNECT!!!!\n");
+    } else {
+      print("****** BLE DISCONNECT!!!!\n");
+    }
+    state.is_connected = connected;
+
+    // TODO: if modifiers are down on the USB interface and
+    // we cut over to BLE or vice versa, they will remain stuck.
+    // This feels like a good point to do something like clearing
+    // the keyboard and/or generating a fake all keys up message.
+    // However, I've noticed that it takes a couple of seconds
+    // for macOS to to start recognizing key presses after BLE
+    // is in the connected state, so I worry that doing that
+    // here may not be good enough.
+  }
+}
+
+void adafruit_ble_task(void) {
+  char resbuf[48];
+
+  if (!state.configured && !adafruit_ble_enable_keyboard()) {
+    return;
+  }
+  resp_buf_read_one(true);
+  send_buf_send_one(SdepShortTimeout);
+
+  if (resp_buf.empty() && (state.event_flags & UsingEvents) &&
+      digitalRead(AdafruitBleIRQPin)) {
+    // Must be an event update
+    if (at_command_P(PSTR("AT+EVENTSTATUS"), resbuf, sizeof(resbuf))) {
+      uint32_t mask = strtoul(resbuf, NULL, 16);
+
+      if (mask & BleSystemConnected) {
+        set_connected(true);
+      } else if (mask & BleSystemDisconnected) {
+        set_connected(false);
+      }
+    }
+  }
+
+  if (timer_elapsed(state.last_connection_update) > ConnectionUpdateInterval) {
+    bool shouldPoll = true;
+    if (!(state.event_flags & ProbedEvents)) {
+      // Request notifications about connection status changes.
+      // This only works in SPIFRIEND firmware > 0.6.7, which is why
+      // we check for this conditionally here.
+      // Note that at the time of writing, HID reports only work correctly
+      // with Apple products on firmware version 0.6.7!
+      // https://forums.adafruit.com/viewtopic.php?f=8&t=104052
+      if (at_command_P(PSTR("AT+EVENTENABLE=0x1"), resbuf, sizeof(resbuf))) {
+        at_command_P(PSTR("AT+EVENTENABLE=0x2"), resbuf, sizeof(resbuf));
+        state.event_flags |= UsingEvents;
+      }
+      state.event_flags |= ProbedEvents;
+
+      // leave shouldPoll == true so that we check at least once
+      // before relying solely on events
+    } else {
+      shouldPoll = false;
+    }
+
+    static const char kGetConn[] PROGMEM = "AT+GAPGETCONN";
+    state.last_connection_update = timer_read();
+
+    if (at_command_P(kGetConn, resbuf, sizeof(resbuf))) {
+      set_connected(atoi(resbuf));
+    }
+  }
+
+#ifdef SAMPLE_BATTERY
+  // I don't know if this really does anything useful yet; the reported
+  // voltage level always seems to be around 3200mV.  We may want to just rip
+  // this code out.
+  if (timer_elapsed(state.last_battery_update) > BatteryUpdateInterval &&
+      resp_buf.empty()) {
+    state.last_battery_update = timer_read();
+
+    if (at_command_P(PSTR("AT+HWVBAT"), resbuf, sizeof(resbuf))) {
+      state.vbat = atoi(resbuf);
+    }
+  }
+#endif
+}
+
+static bool process_queue_item(struct queue_item *item, uint16_t timeout) {
+  char cmdbuf[48];
+  char fmtbuf[64];
+
+  // Arrange to re-check connection after keys have settled
+  state.last_connection_update = timer_read();
+
+#if 1
+  if (TIMER_DIFF_16(state.last_connection_update, item->added) > 0) {
+    dprintf("send latency %dms\n",
+            TIMER_DIFF_16(state.last_connection_update, item->added));
+  }
+#endif
+
+  switch (item->queue_type) {
+    case QTKeyReport:
+      strcpy_P(fmtbuf,
+          PSTR("AT+BLEKEYBOARDCODE=%02x-00-%02x-%02x-%02x-%02x-%02x-%02x"));
+      snprintf(cmdbuf, sizeof(cmdbuf), fmtbuf, item->key.modifier,
+               item->key.keys[0], item->key.keys[1], item->key.keys[2],
+               item->key.keys[3], item->key.keys[4], item->key.keys[5]);
+      return at_command(cmdbuf, NULL, 0, true, timeout);
+
+    case QTConsumer:
+      strcpy_P(fmtbuf, PSTR("AT+BLEHIDCONTROLKEY=0x%04x"));
+      snprintf(cmdbuf, sizeof(cmdbuf), fmtbuf, item->consumer);
+      return at_command(cmdbuf, NULL, 0, true, timeout);
+
+#ifdef MOUSE_ENABLE
+    case QTMouseMove:
+      strcpy_P(fmtbuf, PSTR("AT+BLEHIDMOUSEMOVE=%d,%d,%d,%d"));
+      snprintf(cmdbuf, sizeof(cmdbuf), fmtbuf, item->mousemove.x,
+          item->mousemove.y, item->mousemove.scroll, item->mousemove.pan);
+      return at_command(cmdbuf, NULL, 0, true, timeout);
+#endif
+    default:
+      return true;
+  }
+}
+
+bool adafruit_ble_send_keys(uint8_t hid_modifier_mask, uint8_t *keys,
+                            uint8_t nkeys) {
+  struct queue_item item;
+  bool didWait = false;
+
+  item.queue_type = QTKeyReport;
+  item.key.modifier = hid_modifier_mask;
+  item.added = timer_read();
+
+  while (nkeys >= 0) {
+    item.key.keys[0] = keys[0];
+    item.key.keys[1] = nkeys >= 1 ? keys[1] : 0;
+    item.key.keys[2] = nkeys >= 2 ? keys[2] : 0;
+    item.key.keys[3] = nkeys >= 3 ? keys[3] : 0;
+    item.key.keys[4] = nkeys >= 4 ? keys[4] : 0;
+    item.key.keys[5] = nkeys >= 5 ? keys[5] : 0;
+
+    if (!send_buf.enqueue(item)) {
+      if (!didWait) {
+        dprint("wait for buf space\n");
+        didWait = true;
+      }
+      send_buf_send_one();
+      continue;
+    }
+
+    if (nkeys <= 6) {
+      return true;
+    }
+
+    nkeys -= 6;
+    keys += 6;
+  }
+
+  return true;
+}
+
+bool adafruit_ble_send_consumer_key(uint16_t keycode, int hold_duration) {
+  struct queue_item item;
+
+  item.queue_type = QTConsumer;
+  item.consumer = keycode;
+
+  while (!send_buf.enqueue(item)) {
+    send_buf_send_one();
+  }
+  return true;
+}
+
+#ifdef MOUSE_ENABLE
+bool adafruit_ble_send_mouse_move(int8_t x, int8_t y, int8_t scroll,
+                                  int8_t pan) {
+  struct queue_item item;
+
+  item.queue_type = QTMouseMove;
+  item.mousemove.x = x;
+  item.mousemove.y = y;
+  item.mousemove.scroll = scroll;
+  item.mousemove.pan = pan;
+
+  while (!send_buf.enqueue(item)) {
+    send_buf_send_one();
+  }
+  return true;
+}
+#endif
+
+uint32_t adafruit_ble_read_battery_voltage(void) {
+  return state.vbat;
+}
+
+bool adafruit_ble_set_mode_leds(bool on) {
+  if (!state.configured) {
+    return false;
+  }
+
+  // The "mode" led is the red blinky one
+  at_command_P(on ? PSTR("AT+HWMODELED=1") : PSTR("AT+HWMODELED=0"), NULL, 0);
+
+  // Pin 19 is the blue "connected" LED; turn that off too.
+  // When turning LEDs back on, don't turn that LED on if we're
+  // not connected, as that would be confusing.
+  at_command_P(on && state.is_connected ? PSTR("AT+HWGPIO=19,1")
+                                        : PSTR("AT+HWGPIO=19,0"),
+               NULL, 0);
+  return true;
+}
+
+// https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le/ble-generic#at-plus-blepowerlevel
+bool adafruit_ble_set_power_level(int8_t level) {
+  char cmd[46];
+  if (!state.configured) {
+    return false;
+  }
+  snprintf(cmd, sizeof(cmd), "AT+BLEPOWERLEVEL=%d", level);
+  return at_command(cmd, NULL, 0, false);
+}
diff --git a/tmk_core/protocol/lufa/adafruit_ble.h b/tmk_core/protocol/lufa/adafruit_ble.h
new file mode 100644
index 0000000000..351fd55ae9
--- /dev/null
+++ b/tmk_core/protocol/lufa/adafruit_ble.h
@@ -0,0 +1,60 @@
+/* Bluetooth Low Energy Protocol for QMK.
+ * Author: Wez Furlong, 2016
+ * Supports the Adafruit BLE board built around the nRF51822 chip.
+ */
+#pragma once
+#ifdef ADAFRUIT_BLE_ENABLE
+#include <stdbool.h>
+#include <stdint.h>
+#include <string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Instruct the module to enable HID keyboard support and reset */
+extern bool adafruit_ble_enable_keyboard(void);
+
+/* Query to see if the BLE module is connected */
+extern bool adafruit_ble_query_is_connected(void);
+
+/* Returns true if we believe that the BLE module is connected.
+ * This uses our cached understanding that is maintained by
+ * calling ble_task() periodically. */
+extern bool adafruit_ble_is_connected(void);
+
+/* Call this periodically to process BLE-originated things */
+extern void adafruit_ble_task(void);
+
+/* Generates keypress events for a set of keys.
+ * The hid modifier mask specifies the state of the modifier keys for
+ * this set of keys.
+ * Also sends a key release indicator, so that the keys do not remain
+ * held down. */
+extern bool adafruit_ble_send_keys(uint8_t hid_modifier_mask, uint8_t *keys,
+                                   uint8_t nkeys);
+
+/* Send a consumer keycode, holding it down for the specified duration
+ * (milliseconds) */
+extern bool adafruit_ble_send_consumer_key(uint16_t keycode, int hold_duration);
+
+#ifdef MOUSE_ENABLE
+/* Send a mouse/wheel movement report.
+ * The parameters are signed and indicate positive of negative direction
+ * change. */
+extern bool adafruit_ble_send_mouse_move(int8_t x, int8_t y, int8_t scroll,
+                                         int8_t pan);
+#endif
+
+/* Compute battery voltage by reading an analog pin.
+ * Returns the integer number of millivolts */
+extern uint32_t adafruit_ble_read_battery_voltage(void);
+
+extern bool adafruit_ble_set_mode_leds(bool on);
+extern bool adafruit_ble_set_power_level(int8_t level);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // ADAFRUIT_BLE_ENABLE
diff --git a/tmk_core/protocol/lufa/descriptor.c b/tmk_core/protocol/lufa/descriptor.c
index 850a20fdb3..feeea76df0 100644
--- a/tmk_core/protocol/lufa/descriptor.c
+++ b/tmk_core/protocol/lufa/descriptor.c
@@ -40,6 +40,9 @@
 #include "report.h"
 #include "descriptor.h"
 
+#ifndef USB_MAX_POWER_CONSUMPTION
+#define USB_MAX_POWER_CONSUMPTION 500
+#endif
 
 /*******************************************************************************
  * HID Report Descriptors
@@ -141,9 +144,9 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] =
     HID_RI_COLLECTION(8, 0x01), /* Application */
         HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM),
         HID_RI_LOGICAL_MINIMUM(16, 0x0001),
-        HID_RI_LOGICAL_MAXIMUM(16, 0x00B7),
-        HID_RI_USAGE_MINIMUM(16, 0x0001), /* System Power Down */
-        HID_RI_USAGE_MAXIMUM(16, 0x00B7), /* System Display LCD Autoscale */
+        HID_RI_LOGICAL_MAXIMUM(16, 0x0003),
+        HID_RI_USAGE_MINIMUM(16, 0x0081), /* System Power Down */
+        HID_RI_USAGE_MAXIMUM(16, 0x0083), /* System Wake Up */
         HID_RI_REPORT_SIZE(8, 16),
         HID_RI_REPORT_COUNT(8, 1),
         HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
@@ -164,6 +167,28 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] =
 };
 #endif
 
+#ifdef RAW_ENABLE
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM RawReport[] =
+{
+    HID_RI_USAGE_PAGE(16, 0xFF60), /* Vendor Page 0xFF60 */
+    HID_RI_USAGE(8, 0x61), /* Vendor Usage 0x61 */
+    HID_RI_COLLECTION(8, 0x01), /* Application */
+        HID_RI_USAGE(8, 0x62), /* Vendor Usage 0x62 */
+        HID_RI_LOGICAL_MINIMUM(8, 0x00),
+        HID_RI_LOGICAL_MAXIMUM(16, 0x00FF),
+        HID_RI_REPORT_COUNT(8, RAW_EPSIZE),
+        HID_RI_REPORT_SIZE(8, 0x08),
+        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
+        HID_RI_USAGE(8, 0x63), /* Vendor Usage 0x63 */
+        HID_RI_LOGICAL_MINIMUM(8, 0x00),
+        HID_RI_LOGICAL_MAXIMUM(16, 0x00FF),
+        HID_RI_REPORT_COUNT(8, RAW_EPSIZE),
+        HID_RI_REPORT_SIZE(8, 0x08),
+        HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
+    HID_RI_END_COLLECTION(0),
+};
+#endif
+
 #ifdef CONSOLE_ENABLE
 const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] =
 {
@@ -231,9 +256,15 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
     .Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},
 
     .USBSpecification       = VERSION_BCD(1,1,0),
+#if VIRTSER_ENABLE
+    .Class                  = USB_CSCP_IADDeviceClass,
+    .SubClass               = USB_CSCP_IADDeviceSubclass,
+    .Protocol               = USB_CSCP_IADDeviceProtocol,
+#else
     .Class                  = USB_CSCP_NoDeviceClass,
     .SubClass               = USB_CSCP_NoDeviceSubclass,
     .Protocol               = USB_CSCP_NoDeviceProtocol,
+#endif
 
     .Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE,
 
@@ -266,7 +297,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
 
             .ConfigAttributes       = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_REMOTEWAKEUP),
 
-            .MaxPowerConsumption    = USB_CONFIG_POWER_MA(500)
+            .MaxPowerConsumption    = USB_CONFIG_POWER_MA(USB_MAX_POWER_CONSUMPTION)
         },
 
     /*
@@ -393,6 +424,58 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
         },
 #endif
 
+		/*
+	     * Raw
+	     */
+	#ifdef RAW_ENABLE
+	    .Raw_Interface =
+	        {
+	            .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+	            .InterfaceNumber        = RAW_INTERFACE,
+	            .AlternateSetting       = 0x00,
+
+	            .TotalEndpoints         = 2,
+
+	            .Class                  = HID_CSCP_HIDClass,
+	            .SubClass               = HID_CSCP_NonBootSubclass,
+	            .Protocol               = HID_CSCP_NonBootProtocol,
+
+	            .InterfaceStrIndex      = NO_DESCRIPTOR
+	        },
+
+	    .Raw_HID =
+	        {
+	            .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
+
+	            .HIDSpec                = VERSION_BCD(1,1,1),
+	            .CountryCode            = 0x00,
+	            .TotalReportDescriptors = 1,
+	            .HIDReportType          = HID_DTYPE_Report,
+	            .HIDReportLength        = sizeof(RawReport)
+	        },
+
+	    .Raw_INEndpoint =
+	        {
+	            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+	            .EndpointAddress        = (ENDPOINT_DIR_IN | RAW_IN_EPNUM),
+	            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+	            .EndpointSize           = RAW_EPSIZE,
+	            .PollingIntervalMS      = 0x01
+	        },
+
+	    .Raw_OUTEndpoint =
+	        {
+	            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+	            .EndpointAddress        = (ENDPOINT_DIR_OUT | RAW_OUT_EPNUM),
+	            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+	            .EndpointSize           = RAW_EPSIZE,
+	            .PollingIntervalMS      = 0x01
+	        },
+	#endif
+
     /*
      * Console
      */
@@ -643,7 +726,110 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
 
             .TotalEmbeddedJacks       = 0x01,
             .AssociatedJackID         = {0x03}
-        }
+        },
+#endif
+
+#ifdef VIRTSER_ENABLE
+    .CDC_Interface_Association =
+            {
+                    .Header                 = {.Size = sizeof(USB_Descriptor_Interface_Association_t), .Type = DTYPE_InterfaceAssociation},
+
+                    .FirstInterfaceIndex    = CCI_INTERFACE,
+                    .TotalInterfaces        = 2,
+
+                    .Class                  = CDC_CSCP_CDCClass,
+                    .SubClass               = CDC_CSCP_ACMSubclass,
+                    .Protocol               = CDC_CSCP_ATCommandProtocol,
+
+                    .IADStrIndex            = NO_DESCRIPTOR,
+            },
+
+    .CDC_CCI_Interface =
+            {
+                    .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+                    .InterfaceNumber        = CCI_INTERFACE,
+                    .AlternateSetting       = 0,
+
+                    .TotalEndpoints         = 1,
+
+                    .Class                  = CDC_CSCP_CDCClass,
+                    .SubClass               = CDC_CSCP_ACMSubclass,
+                    .Protocol               = CDC_CSCP_ATCommandProtocol,
+
+                    .InterfaceStrIndex      = NO_DESCRIPTOR
+            },
+
+    .CDC_Functional_Header =
+            {
+                    .Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface},
+                    .Subtype                = 0x00,
+
+                    .CDCSpecification       = VERSION_BCD(1,1,0),
+            },
+
+    .CDC_Functional_ACM =
+            {
+                    .Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface},
+                    .Subtype                = 0x02,
+
+                    .Capabilities           = 0x02,
+            },
+
+    .CDC_Functional_Union =
+            {
+                    .Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface},
+                    .Subtype                = 0x06,
+
+                    .MasterInterfaceNumber  = CCI_INTERFACE,
+                    .SlaveInterfaceNumber   = CDI_INTERFACE,
+            },
+
+    .CDC_NotificationEndpoint =
+            {
+                    .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+                    .EndpointAddress        = CDC_NOTIFICATION_EPADDR,
+                    .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+                    .EndpointSize           = CDC_NOTIFICATION_EPSIZE,
+                    .PollingIntervalMS      = 0xFF
+            },
+
+    .CDC_DCI_Interface =
+            {
+                    .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+                    .InterfaceNumber        = CDI_INTERFACE,
+                    .AlternateSetting       = 0,
+
+                    .TotalEndpoints         = 2,
+
+                    .Class                  = CDC_CSCP_CDCDataClass,
+                    .SubClass               = CDC_CSCP_NoDataSubclass,
+                    .Protocol               = CDC_CSCP_NoDataProtocol,
+
+                    .InterfaceStrIndex      = NO_DESCRIPTOR
+            },
+
+    .CDC_DataOutEndpoint =
+            {
+                    .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+                    .EndpointAddress        = CDC_OUT_EPADDR,
+                    .Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+                    .EndpointSize           = CDC_EPSIZE,
+                    .PollingIntervalMS      = 0x05
+            },
+
+    .CDC_DataInEndpoint =
+            {
+                    .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+                    .EndpointAddress        = CDC_IN_EPADDR,
+                    .Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+                    .EndpointSize           = CDC_EPSIZE,
+                    .PollingIntervalMS      = 0x05
+            },
 #endif
 };
 
@@ -736,6 +922,12 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
                 Size    = sizeof(USB_HID_Descriptor_HID_t);
                 break;
 #endif
+#ifdef RAW_ENABLE
+            case RAW_INTERFACE:
+                Address = &ConfigurationDescriptor.Raw_HID;
+                Size    = sizeof(USB_HID_Descriptor_HID_t);
+                break;
+#endif
 #ifdef CONSOLE_ENABLE
             case CONSOLE_INTERFACE:
                 Address = &ConfigurationDescriptor.Console_HID;
@@ -768,6 +960,12 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
                 Size    = sizeof(ExtrakeyReport);
                 break;
 #endif
+#ifdef RAW_ENABLE
+            case RAW_INTERFACE:
+                Address = &RawReport;
+                Size    = sizeof(RawReport);
+                break;
+#endif
 #ifdef CONSOLE_ENABLE
             case CONSOLE_INTERFACE:
                 Address = &ConsoleReport;
diff --git a/tmk_core/protocol/lufa/descriptor.h b/tmk_core/protocol/lufa/descriptor.h
index 4fd81a0e87..24ce420e6a 100644
--- a/tmk_core/protocol/lufa/descriptor.h
+++ b/tmk_core/protocol/lufa/descriptor.h
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2012,2013 Jun Wako <wakojun@gmail.com>
  * This file is based on:
  *     LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse
@@ -71,6 +71,14 @@ typedef struct
     USB_Descriptor_Endpoint_t             Extrakey_INEndpoint;
 #endif
 
+#ifdef RAW_ENABLE
+    // Raw HID Interface
+    USB_Descriptor_Interface_t            Raw_Interface;
+    USB_HID_Descriptor_HID_t              Raw_HID;
+    USB_Descriptor_Endpoint_t             Raw_INEndpoint;
+    USB_Descriptor_Endpoint_t             Raw_OUTEndpoint;
+#endif
+
 #ifdef CONSOLE_ENABLE
     // Console HID Interface
     USB_Descriptor_Interface_t            Console_Interface;
@@ -104,6 +112,21 @@ typedef struct
       USB_MIDI_Descriptor_Jack_Endpoint_t       MIDI_Out_Jack_Endpoint_SPC;
 #endif
 
+#ifdef VIRTSER_ENABLE
+        USB_Descriptor_Interface_Association_t   CDC_Interface_Association;
+
+	// CDC Control Interface
+	USB_Descriptor_Interface_t               CDC_CCI_Interface;
+	USB_CDC_Descriptor_FunctionalHeader_t    CDC_Functional_Header;
+	USB_CDC_Descriptor_FunctionalACM_t       CDC_Functional_ACM;
+	USB_CDC_Descriptor_FunctionalUnion_t     CDC_Functional_Union;
+	USB_Descriptor_Endpoint_t                CDC_NotificationEndpoint;
+
+	// CDC Data Interface
+	USB_Descriptor_Interface_t               CDC_DCI_Interface;
+	USB_Descriptor_Endpoint_t                CDC_DataOutEndpoint;
+	USB_Descriptor_Endpoint_t                CDC_DataInEndpoint;
+#endif
 } USB_Descriptor_Configuration_t;
 
 
@@ -114,18 +137,24 @@ typedef struct
 #   define MOUSE_INTERFACE          (KEYBOARD_INTERFACE + 1)
 #else
 #   define MOUSE_INTERFACE          KEYBOARD_INTERFACE
-#endif 
+#endif
 
 #ifdef EXTRAKEY_ENABLE
 #   define EXTRAKEY_INTERFACE       (MOUSE_INTERFACE + 1)
 #else
 #   define EXTRAKEY_INTERFACE       MOUSE_INTERFACE
-#endif 
+#endif
+
+#ifdef RAW_ENABLE
+#   define RAW_INTERFACE        	(EXTRAKEY_INTERFACE + 1)
+#else
+#   define RAW_INTERFACE        	EXTRAKEY_INTERFACE
+#endif
 
 #ifdef CONSOLE_ENABLE
-#   define CONSOLE_INTERFACE        (EXTRAKEY_INTERFACE + 1)
+#   define CONSOLE_INTERFACE        (RAW_INTERFACE + 1)
 #else
-#   define CONSOLE_INTERFACE        EXTRAKEY_INTERFACE
+#   define CONSOLE_INTERFACE        RAW_INTERFACE
 #endif
 
 #ifdef NKRO_ENABLE
@@ -141,15 +170,22 @@ typedef struct
 #   define AS_INTERFACE           NKRO_INTERFACE
 #endif
 
+#ifdef VIRTSER_ENABLE
+#   define CCI_INTERFACE         (AS_INTERFACE + 1)
+#   define CDI_INTERFACE         (AS_INTERFACE + 2)
+#else
+#   define CDI_INTERFACE         AS_INTERFACE
+#endif
+
 /* nubmer of interfaces */
-#define TOTAL_INTERFACES            AS_INTERFACE + 1
+#define TOTAL_INTERFACES            (CDI_INTERFACE + 1)
 
 
 // Endopoint number and size
 #define KEYBOARD_IN_EPNUM           1
 
 #ifdef MOUSE_ENABLE
-#   define MOUSE_IN_EPNUM           (KEYBOARD_IN_EPNUM + 1) 
+#   define MOUSE_IN_EPNUM           (KEYBOARD_IN_EPNUM + 1)
 #else
 #   define MOUSE_IN_EPNUM           KEYBOARD_IN_EPNUM
 #endif
@@ -157,15 +193,22 @@ typedef struct
 #ifdef EXTRAKEY_ENABLE
 #   define EXTRAKEY_IN_EPNUM        (MOUSE_IN_EPNUM + 1)
 #else
-#   define EXTRAKEY_IN_EPNUM        MOUSE_IN_EPNUM 
+#   define EXTRAKEY_IN_EPNUM        MOUSE_IN_EPNUM
+#endif
+
+#ifdef RAW_ENABLE
+#   define RAW_IN_EPNUM         (EXTRAKEY_IN_EPNUM + 1)
+#   define RAW_OUT_EPNUM        (EXTRAKEY_IN_EPNUM + 2)
+#else
+#   define RAW_OUT_EPNUM        EXTRAKEY_IN_EPNUM
 #endif
 
 #ifdef CONSOLE_ENABLE
-#   define CONSOLE_IN_EPNUM         (EXTRAKEY_IN_EPNUM + 1)
-#   define CONSOLE_OUT_EPNUM        (EXTRAKEY_IN_EPNUM + 1)
-//#   define CONSOLE_OUT_EPNUM        (EXTRAKEY_IN_EPNUM + 2)
+#   define CONSOLE_IN_EPNUM         (RAW_OUT_EPNUM + 1)
+//#   define CONSOLE_OUT_EPNUM        (RAW_OUT_EPNUM + 2)
+#   define CONSOLE_OUT_EPNUM        (RAW_OUT_EPNUM + 1)
 #else
-#   define CONSOLE_OUT_EPNUM        EXTRAKEY_IN_EPNUM
+#   define CONSOLE_OUT_EPNUM        RAW_OUT_EPNUM
 #endif
 
 #ifdef NKRO_ENABLE
@@ -180,19 +223,34 @@ typedef struct
 #   define MIDI_STREAM_OUT_EPNUM    (NKRO_IN_EPNUM + 2)
 #   define MIDI_STREAM_IN_EPADDR    (ENDPOINT_DIR_IN | MIDI_STREAM_IN_EPNUM)
 #   define MIDI_STREAM_OUT_EPADDR   (ENDPOINT_DIR_OUT | MIDI_STREAM_OUT_EPNUM)
+#else
+#   define MIDI_STREAM_OUT_EPNUM     NKRO_IN_EPNUM
 #endif
 
+#ifdef VIRTSER_ENABLE
+#   define CDC_NOTIFICATION_EPNUM   (MIDI_STREAM_OUT_EPNUM + 1)
+#   define CDC_IN_EPNUM		    (MIDI_STREAM_OUT_EPNUM + 2)
+#   define CDC_OUT_EPNUM		    (MIDI_STREAM_OUT_EPNUM + 3)
+#   define CDC_NOTIFICATION_EPADDR        (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM)
+#   define CDC_IN_EPADDR                  (ENDPOINT_DIR_IN | CDC_IN_EPNUM)
+#   define CDC_OUT_EPADDR                  (ENDPOINT_DIR_OUT | CDC_OUT_EPNUM)
+#else
+#   define CDC_OUT_EPNUM	MIDI_STREAM_OUT_EPNUM
+#endif
 
-#if defined(__AVR_ATmega32U2__) && MIDI_STREAM_OUT_EPADDR > 4
-# error "Endpoints are not available enough to support all functions. Remove some in Makefile.(MOUSEKEY, EXTRAKEY, CONSOLE, NKRO, MIDI)"
+#if defined(__AVR_ATmega32U2__) && CDC_OUT_EPNUM > 4
+# error "Endpoints are not available enough to support all functions. Remove some in Makefile.(MOUSEKEY, EXTRAKEY, CONSOLE, NKRO, MIDI, SERIAL)"
 #endif
 
 #define KEYBOARD_EPSIZE             8
 #define MOUSE_EPSIZE                8
 #define EXTRAKEY_EPSIZE             8
+#define RAW_EPSIZE              	32
 #define CONSOLE_EPSIZE              32
-#define NKRO_EPSIZE                 16
+#define NKRO_EPSIZE                 32
 #define MIDI_STREAM_EPSIZE          64
+#define CDC_NOTIFICATION_EPSIZE     8
+#define CDC_EPSIZE                  16
 
 
 uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index 9ca55dbc9d..ba49284c9b 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -51,6 +51,16 @@
 
 #include "descriptor.h"
 #include "lufa.h"
+#include "quantum.h"
+#include <util/atomic.h>
+#include "outputselect.h"
+
+#ifdef NKRO_ENABLE
+  #include "keycode_config.h"
+
+  extern keymap_config_t keymap_config;
+#endif
+
 
 #ifdef AUDIO_ENABLE
     #include <audio.h>
@@ -59,6 +69,25 @@
 #ifdef BLUETOOTH_ENABLE
     #include "bluetooth.h"
 #endif
+#ifdef ADAFRUIT_BLE_ENABLE
+    #include "adafruit_ble.h"
+#endif
+
+#ifdef VIRTSER_ENABLE
+    #include "virtser.h"
+#endif
+
+#if (defined(RGB_MIDI) | defined(RGBLIGHT_ANIMATIONS)) & defined(RGBLIGHT_ENABLE)
+    #include "rgblight.h"
+#endif
+
+#ifdef MIDI_ENABLE
+  #include "sysex_tools.h"
+#endif
+
+#ifdef RAW_ENABLE
+	#include "raw_hid.h"
+#endif
 
 uint8_t keyboard_idle = 0;
 /* 0: Boot Protocol, 1: Report Protocol(default) */
@@ -68,9 +97,9 @@ static uint8_t keyboard_led_stats = 0;
 static report_keyboard_t keyboard_report_sent;
 
 #ifdef MIDI_ENABLE
-void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2);
-void usb_get_midi(MidiDevice * device);
-void midi_usb_init(MidiDevice * device);
+static void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2);
+static void usb_get_midi(MidiDevice * device);
+static void midi_usb_init(MidiDevice * device);
 #endif
 
 /* Host driver */
@@ -127,6 +156,108 @@ USB_ClassInfo_MIDI_Device_t USB_MIDI_Interface =
 #define SYS_COMMON_3 0x30
 #endif
 
+#ifdef VIRTSER_ENABLE
+USB_ClassInfo_CDC_Device_t cdc_device =
+{
+  .Config =
+  {
+    .ControlInterfaceNumber = CCI_INTERFACE,
+    .DataINEndpoint         =
+    {
+      .Address		= CDC_IN_EPADDR,
+      .Size		= CDC_EPSIZE,
+      .Banks		= 1,
+    },
+    .DataOUTEndpoint	    =
+    {
+      .Address		= CDC_OUT_EPADDR,
+      .Size		= CDC_EPSIZE,
+      .Banks		= 1,
+    },
+    .NotificationEndpoint   =
+    {
+      .Address		= CDC_NOTIFICATION_EPADDR,
+      .Size		= CDC_NOTIFICATION_EPSIZE,
+      .Banks		= 1,
+    },
+  },
+};
+#endif
+
+#ifdef RAW_ENABLE
+
+void raw_hid_send( uint8_t *data, uint8_t length )
+{
+	// TODO: implement variable size packet
+	if ( length != RAW_EPSIZE )
+	{
+		return;
+	}
+
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	{
+		return;
+	}
+
+	// TODO: decide if we allow calls to raw_hid_send() in the middle
+	// of other endpoint usage.
+	uint8_t ep = Endpoint_GetCurrentEndpoint();
+
+	Endpoint_SelectEndpoint(RAW_IN_EPNUM);
+
+	// Check to see if the host is ready to accept another packet
+	if (Endpoint_IsINReady())
+	{
+		// Write data
+		Endpoint_Write_Stream_LE(data, RAW_EPSIZE, NULL);
+		// Finalize the stream transfer to send the last packet
+		Endpoint_ClearIN();
+	}
+
+	Endpoint_SelectEndpoint(ep);
+}
+
+__attribute__ ((weak))
+void raw_hid_receive( uint8_t *data, uint8_t length )
+{
+	// Users should #include "raw_hid.h" in their own code
+	// and implement this function there. Leave this as weak linkage
+	// so users can opt to not handle data coming in.
+}
+
+static void raw_hid_task(void)
+{
+	// Create a temporary buffer to hold the read in data from the host
+	uint8_t data[RAW_EPSIZE];
+	bool data_read = false;
+
+	// Device must be connected and configured for the task to run
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	return;
+
+	Endpoint_SelectEndpoint(RAW_OUT_EPNUM);
+
+	// Check to see if a packet has been sent from the host
+	if (Endpoint_IsOUTReceived())
+	{
+		// Check to see if the packet contains data
+		if (Endpoint_IsReadWriteAllowed())
+		{
+			/* Read data */
+			Endpoint_Read_Stream_LE(data, sizeof(data), NULL);
+			data_read = true;
+		}
+
+		// Finalize the stream transfer to receive the last packet
+		Endpoint_ClearOUT();
+
+		if ( data_read )
+		{
+			raw_hid_receive( data, sizeof(data) );
+		}
+	}
+}
+#endif
 
 /*******************************************************************************
  * Console
@@ -246,10 +377,14 @@ void EVENT_USB_Device_WakeUp()
 #endif
 }
 
+
+
 #ifdef CONSOLE_ENABLE
 static bool console_flush = false;
 #define CONSOLE_FLUSH_SET(b)   do { \
-    uint8_t sreg = SREG; cli(); console_flush = b; SREG = sreg; \
+  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {\
+    console_flush = b; \
+  } \
 } while (0)
 
 // called every 1ms
@@ -263,6 +398,7 @@ void EVENT_USB_Device_StartOfFrame(void)
     Console_Task();
     console_flush = false;
 }
+
 #endif
 
 /** Event handler for the USB_ConfigurationChanged event.
@@ -291,6 +427,14 @@ void EVENT_USB_Device_ConfigurationChanged(void)
                                      EXTRAKEY_EPSIZE, ENDPOINT_BANK_SINGLE);
 #endif
 
+#ifdef RAW_ENABLE
+    /* Setup Raw HID Report Endpoints */
+    ConfigSuccess &= ENDPOINT_CONFIG(RAW_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+									 RAW_EPSIZE, ENDPOINT_BANK_SINGLE);
+    ConfigSuccess &= ENDPOINT_CONFIG(RAW_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
+									 RAW_EPSIZE, ENDPOINT_BANK_SINGLE);
+#endif
+
 #ifdef CONSOLE_ENABLE
     /* Setup Console HID Report Endpoints */
     ConfigSuccess &= ENDPOINT_CONFIG(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
@@ -311,6 +455,12 @@ void EVENT_USB_Device_ConfigurationChanged(void)
     ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_IN_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE);
     ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_OUT_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE);
 #endif
+
+#ifdef VIRTSER_ENABLE
+    ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPADDR, EP_TYPE_INTERRUPT, CDC_NOTIFICATION_EPSIZE, ENDPOINT_BANK_SINGLE);
+    ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC_OUT_EPADDR, EP_TYPE_BULK, CDC_EPSIZE, ENDPOINT_BANK_SINGLE);
+    ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC_IN_EPADDR, EP_TYPE_BULK, CDC_EPSIZE, ENDPOINT_BANK_SINGLE);
+#endif
 }
 
 /*
@@ -432,6 +582,10 @@ void EVENT_USB_Device_ControlRequest(void)
 
             break;
     }
+
+#ifdef VIRTSER_ENABLE
+    CDC_Device_ProcessControlRequest(&cdc_device);
+#endif
 }
 
 /*******************************************************************************
@@ -444,22 +598,31 @@ static uint8_t keyboard_leds(void)
 
 static void send_keyboard(report_keyboard_t *report)
 {
+    uint8_t timeout = 255;
+    uint8_t where = where_to_send();
 
 #ifdef BLUETOOTH_ENABLE
-    bluefruit_serial_send(0xFD);
-    for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) {
-        bluefruit_serial_send(report->raw[i]);
+    if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) {
+        bluefruit_serial_send(0xFD);
+        for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) {
+            bluefruit_serial_send(report->raw[i]);
+        }
     }
 #endif
 
-    uint8_t timeout = 255;
+#ifdef ADAFRUIT_BLE_ENABLE
+    if (where == OUTPUT_ADAFRUIT_BLE) {
+      adafruit_ble_send_keys(report->mods, report->keys, sizeof(report->keys));
+    }
+#endif
 
-    if (USB_DeviceState != DEVICE_STATE_Configured)
-        return;
+    if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) {
+      return;
+    }
 
     /* Select the Keyboard Report Endpoint */
 #ifdef NKRO_ENABLE
-    if (keyboard_protocol && keyboard_nkro) {
+    if (keyboard_protocol && keymap_config.nkro) {
         /* Report protocol - NKRO */
         Endpoint_SelectEndpoint(NKRO_IN_EPNUM);
 
@@ -493,23 +656,33 @@ static void send_keyboard(report_keyboard_t *report)
 static void send_mouse(report_mouse_t *report)
 {
 #ifdef MOUSE_ENABLE
+    uint8_t timeout = 255;
+    uint8_t where = where_to_send();
 
 #ifdef BLUETOOTH_ENABLE
-    bluefruit_serial_send(0xFD);
-    bluefruit_serial_send(0x00);
-    bluefruit_serial_send(0x03);
-    bluefruit_serial_send(report->buttons);
-    bluefruit_serial_send(report->x);
-    bluefruit_serial_send(report->y);
-    bluefruit_serial_send(report->v); // should try sending the wheel v here
-    bluefruit_serial_send(report->h); // should try sending the wheel h here
-    bluefruit_serial_send(0x00);
+    if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) {
+        bluefruit_serial_send(0xFD);
+        bluefruit_serial_send(0x00);
+        bluefruit_serial_send(0x03);
+        bluefruit_serial_send(report->buttons);
+        bluefruit_serial_send(report->x);
+        bluefruit_serial_send(report->y);
+        bluefruit_serial_send(report->v); // should try sending the wheel v here
+        bluefruit_serial_send(report->h); // should try sending the wheel h here
+        bluefruit_serial_send(0x00);
+    }
 #endif
 
-    uint8_t timeout = 255;
+#ifdef ADAFRUIT_BLE_ENABLE
+    if (where == OUTPUT_ADAFRUIT_BLE) {
+      // FIXME: mouse buttons
+      adafruit_ble_send_mouse_move(report->x, report->y, report->v, report->h);
+    }
+#endif
 
-    if (USB_DeviceState != DEVICE_STATE_Configured)
-        return;
+    if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) {
+      return;
+    }
 
     /* Select the Mouse Report Endpoint */
     Endpoint_SelectEndpoint(MOUSE_IN_EPNUM);
@@ -535,7 +708,7 @@ static void send_system(uint16_t data)
 
     report_extra_t r = {
         .report_id = REPORT_ID_SYSTEM,
-        .usage = data
+        .usage = data - SYSTEM_POWER_DOWN + 1
     };
     Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM);
 
@@ -549,27 +722,36 @@ static void send_system(uint16_t data)
 
 static void send_consumer(uint16_t data)
 {
+    uint8_t timeout = 255;
+    uint8_t where = where_to_send();
 
 #ifdef BLUETOOTH_ENABLE
-    static uint16_t last_data = 0;
-    if (data == last_data) return;
-    last_data = data;
-    uint16_t bitmap = CONSUMER2BLUEFRUIT(data);
-    bluefruit_serial_send(0xFD);
-    bluefruit_serial_send(0x00);
-    bluefruit_serial_send(0x02);
-    bluefruit_serial_send((bitmap>>8)&0xFF);
-    bluefruit_serial_send(bitmap&0xFF);
-    bluefruit_serial_send(0x00);
-    bluefruit_serial_send(0x00);
-    bluefruit_serial_send(0x00);
-    bluefruit_serial_send(0x00);
+    if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) {
+        static uint16_t last_data = 0;
+        if (data == last_data) return;
+        last_data = data;
+        uint16_t bitmap = CONSUMER2BLUEFRUIT(data);
+        bluefruit_serial_send(0xFD);
+        bluefruit_serial_send(0x00);
+        bluefruit_serial_send(0x02);
+        bluefruit_serial_send((bitmap>>8)&0xFF);
+        bluefruit_serial_send(bitmap&0xFF);
+        bluefruit_serial_send(0x00);
+        bluefruit_serial_send(0x00);
+        bluefruit_serial_send(0x00);
+        bluefruit_serial_send(0x00);
+    }
 #endif
 
-    uint8_t timeout = 255;
+#ifdef ADAFRUIT_BLE_ENABLE
+    if (where == OUTPUT_ADAFRUIT_BLE) {
+      adafruit_ble_send_consumer_key(data, 0);
+    }
+#endif
 
-    if (USB_DeviceState != DEVICE_STATE_Configured)
-        return;
+    if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) {
+      return;
+    }
 
     report_extra_t r = {
         .report_id = REPORT_ID_CONSUMER,
@@ -659,7 +841,7 @@ int8_t sendchar(uint8_t c)
  ******************************************************************************/
 
 #ifdef MIDI_ENABLE
-void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2) {
+static void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2) {
   MIDI_EventPacket_t event;
   event.Data1 = byte0;
   event.Data2 = byte1;
@@ -719,7 +901,7 @@ void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byt
   USB_USBTask();
 }
 
-void usb_get_midi(MidiDevice * device) {
+static void usb_get_midi(MidiDevice * device) {
   MIDI_EventPacket_t event;
   while (MIDI_Device_ReceiveEventPacket(&USB_MIDI_Interface, &event)) {
 
@@ -749,12 +931,12 @@ void usb_get_midi(MidiDevice * device) {
   USB_USBTask();
 }
 
-void midi_usb_init(MidiDevice * device){
+static void midi_usb_init(MidiDevice * device){
   midi_device_init(device);
   midi_device_set_send_func(device, usb_send_func);
   midi_device_set_pre_input_process_func(device, usb_get_midi);
 
-  SetupHardware();
+  // SetupHardware();
   sei();
 }
 
@@ -827,6 +1009,61 @@ void MIDI_Task(void)
 
 #endif
 
+/*******************************************************************************
+ * VIRTUAL SERIAL
+ ******************************************************************************/
+
+#ifdef VIRTSER_ENABLE
+void virtser_init(void)
+{
+  cdc_device.State.ControlLineStates.DeviceToHost = CDC_CONTROL_LINE_IN_DSR ;
+  CDC_Device_SendControlLineStateChange(&cdc_device);
+}
+
+void virtser_recv(uint8_t c) __attribute__ ((weak));
+void virtser_recv(uint8_t c)
+{
+  // Ignore by default
+}
+
+void virtser_task(void)
+{
+  uint16_t count = CDC_Device_BytesReceived(&cdc_device);
+  uint8_t ch;
+  if (count)
+  {
+    ch = CDC_Device_ReceiveByte(&cdc_device);
+    virtser_recv(ch);
+  }
+}
+void virtser_send(const uint8_t byte)
+{
+  uint8_t timeout = 255;
+  uint8_t ep = Endpoint_GetCurrentEndpoint();
+
+  if (cdc_device.State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR)
+  {
+    /* IN packet */
+    Endpoint_SelectEndpoint(cdc_device.Config.DataINEndpoint.Address);
+
+    if (!Endpoint_IsEnabled() || !Endpoint_IsConfigured()) {
+        Endpoint_SelectEndpoint(ep);
+        return;
+    }
+
+    while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40);
+
+    Endpoint_Write_8(byte);
+    CDC_Device_Flush(&cdc_device);
+
+    if (Endpoint_IsINReady()) {
+      Endpoint_ClearIN();
+    }
+
+    Endpoint_SelectEndpoint(ep);
+  }
+}
+#endif
 
 /*******************************************************************************
  * main
@@ -918,9 +1155,13 @@ int main(void)
     sleep_led_init();
 #endif
 
+#ifdef VIRTSER_ENABLE
+    virtser_init();
+#endif
+
     print("Keyboard start.\n");
     while (1) {
-        #ifndef BLUETOOTH_ENABLE
+        #if !defined(BLUETOOTH_ENABLE) && !defined(ADAFRUIT_BLE_ENABLE)
         while (USB_DeviceState == DEVICE_STATE_Suspended) {
             print("[s]");
             suspend_power_down();
@@ -930,15 +1171,34 @@ int main(void)
         }
         #endif
 
+        keyboard_task();
+
 #ifdef MIDI_ENABLE
         midi_device_process(&midi_device);
         // MIDI_Task();
 #endif
-        keyboard_task();
+
+#if defined(RGBLIGHT_ANIMATIONS) & defined(RGBLIGHT_ENABLE)
+        rgblight_task();
+#endif
+
+#ifdef ADAFRUIT_BLE_ENABLE
+        adafruit_ble_task();
+#endif
+
+#ifdef VIRTSER_ENABLE
+        virtser_task();
+        CDC_Device_USBTask(&cdc_device);
+#endif
+
+#ifdef RAW_ENABLE
+        raw_hid_task();
+#endif
 
 #if !defined(INTERRUPT_CONTROL_ENDPOINT)
         USB_USBTask();
 #endif
+
     }
 }
 
@@ -963,15 +1223,50 @@ void fallthrough_callback(MidiDevice * device,
 #endif
 }
 
+
 void cc_callback(MidiDevice * device,
     uint8_t chan, uint8_t num, uint8_t val) {
   //sending it back on the next channel
-  midi_send_cc(device, (chan + 1) % 16, num, val);
+  // midi_send_cc(device, (chan + 1) % 16, num, val);
 }
 
-void sysex_callback(MidiDevice * device,
-    uint16_t start, uint8_t length, uint8_t * data) {
-  for (int i = 0; i < length; i++)
-    midi_send_cc(device, 15, 0x7F & data[i], 0x7F & (start + i));
+#ifdef API_SYSEX_ENABLE
+uint8_t midi_buffer[MIDI_SYSEX_BUFFER] = {0};
+#endif
+
+void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t * data) {
+    #ifdef API_SYSEX_ENABLE
+        // SEND_STRING("\n");
+        // send_word(start);
+        // SEND_STRING(": ");
+        // Don't store the header
+        int16_t pos = start - 4;
+        for (uint8_t place = 0; place < length; place++) {
+            // send_byte(*data);
+            if (pos >= 0) {
+                if (*data == 0xF7) {
+                    // SEND_STRING("\nRD: ");
+                    // for (uint8_t i = 0; i < start + place + 1; i++){
+                    //     send_byte(midi_buffer[i]);
+                    // SEND_STRING(" ");
+                    // }
+                    const unsigned decoded_length = sysex_decoded_length(pos);
+                    uint8_t decoded[API_SYSEX_MAX_SIZE];
+                    sysex_decode(decoded, midi_buffer, pos);
+                    process_api(decoded_length, decoded);
+                    return;
+                }
+                else if (pos >= MIDI_SYSEX_BUFFER) {
+                    return;
+                }
+                midi_buffer[pos] = *data;
+            }
+            // SEND_STRING(" ");
+            data++;
+            pos++;
+        }
+    #endif
 }
+
+
 #endif
diff --git a/tmk_core/protocol/lufa/lufa.h b/tmk_core/protocol/lufa/lufa.h
index aad08d6407..a049fd43c9 100644
--- a/tmk_core/protocol/lufa/lufa.h
+++ b/tmk_core/protocol/lufa/lufa.h
@@ -68,8 +68,19 @@ typedef struct {
 } __attribute__ ((packed)) report_extra_t;
 
 #ifdef MIDI_ENABLE
-void MIDI_Task(void);
-MidiDevice midi_device;
+  void MIDI_Task(void);
+  MidiDevice midi_device;
+#endif
+
+#ifdef API_ENABLE
+  #include "api.h"
+#endif
+
+#ifdef API_SYSEX_ENABLE
+  #include "api_sysex.h"
+  // Allocate space for encoding overhead.
+  //The header and terminator are not stored to save a few bytes of precious ram
+  #define MIDI_SYSEX_BUFFER (API_SYSEX_MAX_SIZE + API_SYSEX_MAX_SIZE / 7 + (API_SYSEX_MAX_SIZE % 7 ? 1 : 0))
 #endif
 
 // #if LUFA_VERSION_INTEGER < 0x120730
diff --git a/tmk_core/protocol/lufa/outputselect.c b/tmk_core/protocol/lufa/outputselect.c
new file mode 100644
index 0000000000..5d2457bfff
--- /dev/null
+++ b/tmk_core/protocol/lufa/outputselect.c
@@ -0,0 +1,56 @@
+/*
+Copyright 2017 Priyadi Iman Nurcahyo
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "lufa.h"
+#include "outputselect.h"
+#ifdef ADAFRUIT_BLE_ENABLE
+    #include "adafruit_ble.h"
+#endif
+
+uint8_t desired_output = OUTPUT_DEFAULT;
+
+void set_output(uint8_t output) {
+    set_output_user(output);
+    desired_output = output;
+}
+
+__attribute__((weak))
+void set_output_user(uint8_t output) {
+}
+
+uint8_t auto_detect_output(void) {
+    if (USB_DeviceState == DEVICE_STATE_Configured) {
+        return OUTPUT_USB;
+    }
+
+#ifdef ADAFRUIT_BLE_ENABLE
+    if (adafruit_ble_is_connected()) {
+        return OUTPUT_ADAFRUIT_BLE;
+    }
+#endif
+
+#ifdef BLUETOOTH_ENABLE
+    return OUTPUT_BLUETOOTH; // should check if BT is connected here
+#endif
+
+    return OUTPUT_NONE;
+}
+
+uint8_t where_to_send(void) {
+    if (desired_output == OUTPUT_AUTO) {
+        return auto_detect_output();
+    }
+    return desired_output;
+}
+
diff --git a/tmk_core/protocol/lufa/outputselect.h b/tmk_core/protocol/lufa/outputselect.h
new file mode 100644
index 0000000000..79b4dd35dd
--- /dev/null
+++ b/tmk_core/protocol/lufa/outputselect.h
@@ -0,0 +1,41 @@
+/*
+Copyright 2017 Priyadi Iman Nurcahyo
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+enum outputs {
+    OUTPUT_AUTO,
+
+    OUTPUT_NONE,
+    OUTPUT_USB,
+    OUTPUT_BLUETOOTH,
+    OUTPUT_ADAFRUIT_BLE,
+
+    // backward compatibility
+    OUTPUT_USB_AND_BT
+};
+
+/**
+ * backward compatibility for BLUETOOTH_ENABLE, send to BT and USB by default
+ */
+#ifndef OUTPUT_DEFAULT
+    #ifdef BLUETOOTH_ENABLE
+        #define OUTPUT_DEFAULT OUTPUT_USB_AND_BT
+    #else
+        #define OUTPUT_DEFAULT OUTPUT_AUTO
+    #endif
+#endif
+
+void set_output(uint8_t output);
+void set_output_user(uint8_t output);
+uint8_t auto_detect_output(void);
+uint8_t where_to_send(void);
\ No newline at end of file
diff --git a/tmk_core/protocol/lufa/ringbuffer.hpp b/tmk_core/protocol/lufa/ringbuffer.hpp
new file mode 100644
index 0000000000..70a3c4881d
--- /dev/null
+++ b/tmk_core/protocol/lufa/ringbuffer.hpp
@@ -0,0 +1,66 @@
+#pragma once
+// A simple ringbuffer holding Size elements of type T
+template <typename T, uint8_t Size>
+class RingBuffer {
+ protected:
+  T buf_[Size];
+  uint8_t head_{0}, tail_{0};
+ public:
+  inline uint8_t nextPosition(uint8_t position) {
+    return (position + 1) % Size;
+  }
+
+  inline uint8_t prevPosition(uint8_t position) {
+    if (position == 0) {
+      return Size - 1;
+    }
+    return position - 1;
+  }
+
+  inline bool enqueue(const T &item) {
+    static_assert(Size > 1, "RingBuffer size must be > 1");
+    uint8_t next = nextPosition(head_);
+    if (next == tail_) {
+      // Full
+      return false;
+    }
+
+    buf_[head_] = item;
+    head_ = next;
+    return true;
+  }
+
+  inline bool get(T &dest, bool commit = true) {
+    auto tail = tail_;
+    if (tail == head_) {
+      // No more data
+      return false;
+    }
+
+    dest = buf_[tail];
+    tail = nextPosition(tail);
+
+    if (commit) {
+      tail_ = tail;
+    }
+    return true;
+  }
+
+  inline bool empty() const { return head_ == tail_; }
+
+  inline uint8_t size() const {
+    int diff = head_ - tail_;
+    if (diff >= 0) {
+      return diff;
+    }
+    return Size + diff;
+  }
+
+  inline T& front() {
+    return buf_[tail_];
+  }
+
+  inline bool peek(T &item) {
+    return get(item, false);
+  }
+};
diff --git a/tmk_core/protocol/midi.mk b/tmk_core/protocol/midi.mk
index c85ae42ff2..4855b23d30 100644
--- a/tmk_core/protocol/midi.mk
+++ b/tmk_core/protocol/midi.mk
@@ -4,6 +4,7 @@ SRC += midi.c \
 	   midi_device.c \
 	   bytequeue/bytequeue.c \
 	   bytequeue/interrupt_setting.c \
+	   sysex_tools.c \
 	   $(LUFA_SRC_USBCLASS)
 
 VPATH += $(TMK_PATH)/$(MIDI_DIR)
\ No newline at end of file
diff --git a/tmk_core/protocol/midi/Config/LUFAConfig.h b/tmk_core/protocol/midi/Config/LUFAConfig.h
index fa9404498f..a1d7482672 100755
--- a/tmk_core/protocol/midi/Config/LUFAConfig.h
+++ b/tmk_core/protocol/midi/Config/LUFAConfig.h
@@ -1,93 +1,93 @@
-/*

-             LUFA Library

-     Copyright (C) Dean Camera, 2012.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

-*/

-

-/*

-  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)

-

-  Permission to use, copy, modify, distribute, and sell this

-  software and its documentation for any purpose is hereby granted

-  without fee, provided that the above copyright notice appear in

-  all copies and that both that the copyright notice and this

-  permission notice and warranty disclaimer appear in supporting

-  documentation, and that the name of the author not be used in

-  advertising or publicity pertaining to distribution of the

-  software without specific, written prior permission.

-

-  The author disclaim all warranties with regard to this

-  software, including all implied warranties of merchantability

-  and fitness.  In no event shall the author be liable for any

-  special, indirect or consequential damages or any damages

-  whatsoever resulting from loss of use, data or profits, whether

-  in an action of contract, negligence or other tortious action,

-  arising out of or in connection with the use or performance of

-  this software.

-*/

-

-/** \file

- *  \brief LUFA Library Configuration Header File

- *

- *  This header file is used to configure LUFA's compile time options,

- *  as an alternative to the compile time constants supplied through

- *  a makefile.

- *

- *  For information on what each token does, refer to the LUFA

- *  manual section "Summary of Compile Tokens".

- */

-

-#ifndef _LUFA_CONFIG_H_

-#define _LUFA_CONFIG_H_

-

-	#if (ARCH == ARCH_AVR8)

-

-		/* Non-USB Related Configuration Tokens: */

-//		#define DISABLE_TERMINAL_CODES

-

-		/* USB Class Driver Related Tokens: */

-//		#define HID_HOST_BOOT_PROTOCOL_ONLY

-//		#define HID_STATETABLE_STACK_DEPTH       {Insert Value Here}

-//		#define HID_USAGE_STACK_DEPTH            {Insert Value Here}

-//		#define HID_MAX_COLLECTIONS              {Insert Value Here}

-//		#define HID_MAX_REPORTITEMS              {Insert Value Here}

-//		#define HID_MAX_REPORT_IDS               {Insert Value Here}

-//		#define NO_CLASS_DRIVER_AUTOFLUSH

-

-		/* General USB Driver Related Tokens: */

-//		#define ORDERED_EP_CONFIG

-		#define USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)

-		#define USB_DEVICE_ONLY

-//		#define USB_HOST_ONLY

-//		#define USB_STREAM_TIMEOUT_MS            {Insert Value Here}

-//		#define NO_LIMITED_CONTROLLER_CONNECT

-//		#define NO_SOF_EVENTS

-

-		/* USB Device Mode Driver Related Tokens: */

-//		#define USE_RAM_DESCRIPTORS

-		#define USE_FLASH_DESCRIPTORS

-//		#define USE_EEPROM_DESCRIPTORS

-//		#define NO_INTERNAL_SERIAL

-		#define FIXED_CONTROL_ENDPOINT_SIZE      8

-//		#define DEVICE_STATE_AS_GPIOR            {Insert Value Here}

-		#define FIXED_NUM_CONFIGURATIONS         1

-//		#define CONTROL_ONLY_DEVICE

-//		#define INTERRUPT_CONTROL_ENDPOINT

-//		#define NO_DEVICE_REMOTE_WAKEUP

-//		#define NO_DEVICE_SELF_POWER

-

-		/* USB Host Mode Driver Related Tokens: */

-//		#define HOST_STATE_AS_GPIOR              {Insert Value Here}

-//		#define USB_HOST_TIMEOUT_MS              {Insert Value Here}

-//		#define HOST_DEVICE_SETTLE_DELAY_MS	     {Insert Value Here}

-//      #define NO_AUTO_VBUS_MANAGEMENT

-//      #define INVERTED_VBUS_ENABLE_LINE

-

-	#else

-

-		#error Unsupported architecture for this LUFA configuration file.

-

-	#endif

-#endif

+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2012.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaim all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief LUFA Library Configuration Header File
+ *
+ *  This header file is used to configure LUFA's compile time options,
+ *  as an alternative to the compile time constants supplied through
+ *  a makefile.
+ *
+ *  For information on what each token does, refer to the LUFA
+ *  manual section "Summary of Compile Tokens".
+ */
+
+#ifndef _LUFA_CONFIG_H_
+#define _LUFA_CONFIG_H_
+
+	#if (ARCH == ARCH_AVR8)
+
+		/* Non-USB Related Configuration Tokens: */
+//		#define DISABLE_TERMINAL_CODES
+
+		/* USB Class Driver Related Tokens: */
+//		#define HID_HOST_BOOT_PROTOCOL_ONLY
+//		#define HID_STATETABLE_STACK_DEPTH       {Insert Value Here}
+//		#define HID_USAGE_STACK_DEPTH            {Insert Value Here}
+//		#define HID_MAX_COLLECTIONS              {Insert Value Here}
+//		#define HID_MAX_REPORTITEMS              {Insert Value Here}
+//		#define HID_MAX_REPORT_IDS               {Insert Value Here}
+//		#define NO_CLASS_DRIVER_AUTOFLUSH
+
+		/* General USB Driver Related Tokens: */
+//		#define ORDERED_EP_CONFIG
+		#define USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)
+		#define USB_DEVICE_ONLY
+//		#define USB_HOST_ONLY
+//		#define USB_STREAM_TIMEOUT_MS            {Insert Value Here}
+//		#define NO_LIMITED_CONTROLLER_CONNECT
+//		#define NO_SOF_EVENTS
+
+		/* USB Device Mode Driver Related Tokens: */
+//		#define USE_RAM_DESCRIPTORS
+		#define USE_FLASH_DESCRIPTORS
+//		#define USE_EEPROM_DESCRIPTORS
+//		#define NO_INTERNAL_SERIAL
+		#define FIXED_CONTROL_ENDPOINT_SIZE      8
+//		#define DEVICE_STATE_AS_GPIOR            {Insert Value Here}
+		#define FIXED_NUM_CONFIGURATIONS         1
+//		#define CONTROL_ONLY_DEVICE
+//		#define INTERRUPT_CONTROL_ENDPOINT
+//		#define NO_DEVICE_REMOTE_WAKEUP
+//		#define NO_DEVICE_SELF_POWER
+
+		/* USB Host Mode Driver Related Tokens: */
+//		#define HOST_STATE_AS_GPIOR              {Insert Value Here}
+//		#define USB_HOST_TIMEOUT_MS              {Insert Value Here}
+//		#define HOST_DEVICE_SETTLE_DELAY_MS	     {Insert Value Here}
+//      #define NO_AUTO_VBUS_MANAGEMENT
+//      #define INVERTED_VBUS_ENABLE_LINE
+
+	#else
+
+		#error Unsupported architecture for this LUFA configuration file.
+
+	#endif
+#endif
diff --git a/tmk_core/protocol/pjrc/usb.c b/tmk_core/protocol/pjrc/usb.c
index 1e6ba8719a..09efbe0762 100644
--- a/tmk_core/protocol/pjrc/usb.c
+++ b/tmk_core/protocol/pjrc/usb.c
@@ -1,17 +1,17 @@
 /* USB Keyboard Plus Debug Channel Example for Teensy USB Development Board
  * http://www.pjrc.com/teensy/usb_keyboard.html
  * Copyright (c) 2009 PJRC.COM, LLC
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
  * in the Software without restriction, including without limitation the rights
  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  * copies of the Software, and to permit persons to whom the Software is
  * furnished to do so, subject to the following conditions:
- * 
+ *
  * The above copyright notice and this permission notice shall be included in
  * all copies or substantial portions of the Software.
- * 
+ *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -41,6 +41,12 @@
 #include "action.h"
 #include "action_util.h"
 
+#ifdef NKRO_ENABLE
+  #include "keycode_config.h"
+
+  extern keymap_config_t keymap_config;
+#endif
+
 
 /**************************************************************************
  *
@@ -694,7 +700,7 @@ ISR(USB_GEN_vect)
 		}
                 /* TODO: should keep IDLE rate on each keyboard interface */
 #ifdef NKRO_ENABLE
-		if (!keyboard_nkro && keyboard_idle && (++div4 & 3) == 0) {
+		if (!keymap_config.nkro && keyboard_idle && (++div4 & 3) == 0) {
 #else
 		if (keyboard_idle && (++div4 & 3) == 0) {
 #endif
@@ -881,7 +887,7 @@ ISR(USB_COM_vect)
 #endif
                     if (bmRequestType == 0x00 && wValue == DEVICE_REMOTE_WAKEUP) {
                         if (bRequest == SET_FEATURE) {
-                            remote_wakeup = true;   
+                            remote_wakeup = true;
                         } else {
                             remote_wakeup = false;
                         }
@@ -932,7 +938,7 @@ ISR(USB_COM_vect)
 				if (bRequest == HID_SET_PROTOCOL) {
 					keyboard_protocol = wValue;
 #ifdef NKRO_ENABLE
-                                        keyboard_nkro = !!keyboard_protocol;
+                                        keymap_config.nkro = !!keyboard_protocol;
 #endif
                                         clear_keyboard();
 					//usb_wait_in_ready();
diff --git a/tmk_core/protocol/pjrc/usb_keyboard.c b/tmk_core/protocol/pjrc/usb_keyboard.c
index 4b87b5d7b5..05f4797340 100644
--- a/tmk_core/protocol/pjrc/usb_keyboard.c
+++ b/tmk_core/protocol/pjrc/usb_keyboard.c
@@ -30,6 +30,12 @@
 #include "util.h"
 #include "host.h"
 
+#ifdef NKRO_ENABLE
+  #include "keycode_config.h"
+
+  extern keymap_config_t keymap_config;
+#endif
+
 
 // protocol setting from the host.  We use exactly the same report
 // either way, so this variable only stores the setting since we
@@ -56,7 +62,7 @@ int8_t usb_keyboard_send_report(report_keyboard_t *report)
     int8_t result = 0;
 
 #ifdef NKRO_ENABLE
-    if (keyboard_nkro)
+    if (keymap_config.nkro)
         result = send_report(report, KBD2_ENDPOINT, 0, KBD2_SIZE);
     else
 #endif
diff --git a/tmk_core/protocol/ps2_mouse.c b/tmk_core/protocol/ps2_mouse.c
index c3e8b3c1c3..d9ccbecb43 100644
--- a/tmk_core/protocol/ps2_mouse.c
+++ b/tmk_core/protocol/ps2_mouse.c
@@ -18,60 +18,59 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include <stdbool.h>
 #include<avr/io.h>
 #include<util/delay.h>
-#include "ps2.h"
 #include "ps2_mouse.h"
-#include "report.h"
 #include "host.h"
 #include "timer.h"
 #include "print.h"
+#include "report.h"
 #include "debug.h"
+#include "ps2.h"
 
+/* ============================= MACROS ============================ */
 
 static report_mouse_t mouse_report = {};
 
+static inline void ps2_mouse_print_report(report_mouse_t *mouse_report);
+static inline void ps2_mouse_convert_report_to_hid(report_mouse_t *mouse_report);
+static inline void ps2_mouse_clear_report(report_mouse_t *mouse_report);
+static inline void ps2_mouse_enable_scrolling(void);
+static inline void ps2_mouse_scroll_button_task(report_mouse_t *mouse_report);
 
-static void print_usb_data(void);
-
+/* ============================= IMPLEMENTATION ============================ */
 
 /* supports only 3 button mouse at this time */
-uint8_t ps2_mouse_init(void) {
-    uint8_t rcv;
-
+void ps2_mouse_init(void) {
     ps2_host_init();
 
-    _delay_ms(1000);    // wait for powering up
+    _delay_ms(PS2_MOUSE_INIT_DELAY);    // wait for powering up
 
-    // send Reset
-    rcv = ps2_host_send(0xFF);
-    print("ps2_mouse_init: send Reset: ");
-    phex(rcv); phex(ps2_error); print("\n");
+    PS2_MOUSE_SEND(PS2_MOUSE_RESET, "ps2_mouse_init: sending reset");
 
-    // read completion code of BAT
-    rcv = ps2_host_recv_response();
-    print("ps2_mouse_init: read BAT: ");
-    phex(rcv); phex(ps2_error); print("\n");
+    PS2_MOUSE_RECEIVE("ps2_mouse_init: read BAT");
+    PS2_MOUSE_RECEIVE("ps2_mouse_init: read DevID");
 
-    // read Device ID
-    rcv = ps2_host_recv_response();
-    print("ps2_mouse_init: read DevID: ");
-    phex(rcv); phex(ps2_error); print("\n");
+#ifdef PS2_MOUSE_USE_REMOTE_MODE
+    ps2_mouse_set_remote_mode();
+#else
+    ps2_mouse_enable_data_reporting();
+#endif
+
+#ifdef PS2_MOUSE_ENABLE_SCROLLING
+    ps2_mouse_enable_scrolling();
+#endif
 
-    // send Set Remote mode
-    rcv = ps2_host_send(0xF0);
-    print("ps2_mouse_init: send 0xF0: ");
-    phex(rcv); phex(ps2_error); print("\n");
+#ifdef PS2_MOUSE_USE_2_1_SCALING
+    ps2_mouse_set_scaling_2_1();
+#endif
 
-    return 0;
+    ps2_mouse_init_user();
 }
 
-#define X_IS_NEG  (mouse_report.buttons & (1<<PS2_MOUSE_X_SIGN))
-#define Y_IS_NEG  (mouse_report.buttons & (1<<PS2_MOUSE_Y_SIGN))
-#define X_IS_OVF  (mouse_report.buttons & (1<<PS2_MOUSE_X_OVFLW))
-#define Y_IS_OVF  (mouse_report.buttons & (1<<PS2_MOUSE_Y_OVFLW))
-void ps2_mouse_task(void)
-{
-    enum { SCROLL_NONE, SCROLL_BTN, SCROLL_SENT };
-    static uint8_t scroll_state = SCROLL_NONE;
+__attribute__((weak))
+void ps2_mouse_init_user(void) {
+}
+
+void ps2_mouse_task(void) {
     static uint8_t buttons_prev = 0;
 
     /* receives packet from mouse */
@@ -79,142 +78,169 @@ void ps2_mouse_task(void)
     rcv = ps2_host_send(PS2_MOUSE_READ_DATA);
     if (rcv == PS2_ACK) {
         mouse_report.buttons = ps2_host_recv_response();
-        mouse_report.x = ps2_host_recv_response();
-        mouse_report.y = ps2_host_recv_response();
+        mouse_report.x = ps2_host_recv_response() * PS2_MOUSE_X_MULTIPLIER;
+        mouse_report.y = ps2_host_recv_response() * PS2_MOUSE_Y_MULTIPLIER;
+#ifdef PS2_MOUSE_ENABLE_SCROLLING
+        mouse_report.v = -(ps2_host_recv_response() & PS2_MOUSE_SCROLL_MASK) * PS2_MOUSE_V_MULTIPLIER;
+#endif
     } else {
         if (debug_mouse) print("ps2_mouse: fail to get mouse packet\n");
         return;
     }
-        xprintf("%ud ", timer_read());
-        print("ps2_mouse raw: [");
-        phex(mouse_report.buttons); print("|");
-        print_hex8((uint8_t)mouse_report.x); print(" ");
-        print_hex8((uint8_t)mouse_report.y); print("]\n");
 
     /* if mouse moves or buttons state changes */
-    if (mouse_report.x || mouse_report.y ||
+    if (mouse_report.x || mouse_report.y || mouse_report.v ||
             ((mouse_report.buttons ^ buttons_prev) & PS2_MOUSE_BTN_MASK)) {
-
-#ifdef PS2_MOUSE_DEBUG
-        print("ps2_mouse raw: [");
-        phex(mouse_report.buttons); print("|");
-        print_hex8((uint8_t)mouse_report.x); print(" ");
-        print_hex8((uint8_t)mouse_report.y); print("]\n");
+#ifdef PS2_MOUSE_DEBUG_RAW
+        // Used to debug raw ps2 bytes from mouse
+        ps2_mouse_print_report(&mouse_report);
 #endif
-
         buttons_prev = mouse_report.buttons;
+        ps2_mouse_convert_report_to_hid(&mouse_report);
+#if PS2_MOUSE_SCROLL_BTN_MASK
+        ps2_mouse_scroll_button_task(&mouse_report);
+#endif
+#ifdef PS2_MOUSE_DEBUG_HID
+        // Used to debug the bytes sent to the host
+        ps2_mouse_print_report(&mouse_report);
+#endif
+        host_mouse_send(&mouse_report);
+    }
+    
+    ps2_mouse_clear_report(&mouse_report);
+}
 
-        // PS/2 mouse data is '9-bit integer'(-256 to 255) which is comprised of sign-bit and 8-bit value.
-        // bit: 8    7 ... 0
-        //      sign \8-bit/
-        //
-        // Meanwhile USB HID mouse indicates 8bit data(-127 to 127), note that -128 is not used.
-        //
-        // This converts PS/2 data into HID value. Use only -127-127 out of PS/2 9-bit.
-        mouse_report.x = X_IS_NEG ?
-                          ((!X_IS_OVF && -127 <= mouse_report.x && mouse_report.x <= -1) ?  mouse_report.x : -127) :
-                          ((!X_IS_OVF && 0 <= mouse_report.x && mouse_report.x <= 127) ? mouse_report.x : 127);
-        mouse_report.y = Y_IS_NEG ?
-                          ((!Y_IS_OVF && -127 <= mouse_report.y && mouse_report.y <= -1) ?  mouse_report.y : -127) :
-                          ((!Y_IS_OVF && 0 <= mouse_report.y && mouse_report.y <= 127) ? mouse_report.y : 127);
+void ps2_mouse_disable_data_reporting(void) {
+    PS2_MOUSE_SEND(PS2_MOUSE_DISABLE_DATA_REPORTING, "ps2 mouse disable data reporting"); 
+}
 
-        // remove sign and overflow flags
-        mouse_report.buttons &= PS2_MOUSE_BTN_MASK;
+void ps2_mouse_enable_data_reporting(void) {
+    PS2_MOUSE_SEND(PS2_MOUSE_ENABLE_DATA_REPORTING, "ps2 mouse enable data reporting");
+}
 
-        // invert coordinate of y to conform to USB HID mouse
-        mouse_report.y = -mouse_report.y;
+void ps2_mouse_set_remote_mode(void) { 
+    PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_REMOTE_MODE, "ps2 mouse set remote mode"); 
+    ps2_mouse_mode = PS2_MOUSE_REMOTE_MODE;
+}
 
+void ps2_mouse_set_stream_mode(void) { 
+    PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_STREAM_MODE, "ps2 mouse set stream mode"); 
+    ps2_mouse_mode = PS2_MOUSE_STREAM_MODE;
+}
 
-#if PS2_MOUSE_SCROLL_BTN_MASK
-        static uint16_t scroll_button_time = 0;
-        if ((mouse_report.buttons & (PS2_MOUSE_SCROLL_BTN_MASK)) == (PS2_MOUSE_SCROLL_BTN_MASK)) {
-            if (scroll_state == SCROLL_NONE) {
-                scroll_button_time = timer_read();
-                scroll_state = SCROLL_BTN;
-            }
-
-            // doesn't send Scroll Button
-            //mouse_report.buttons &= ~(PS2_MOUSE_SCROLL_BTN_MASK);
-
-            if (mouse_report.x || mouse_report.y) {
-                scroll_state = SCROLL_SENT;
-
-                mouse_report.v = -mouse_report.y/(PS2_MOUSE_SCROLL_DIVISOR_V);
-                mouse_report.h =  mouse_report.x/(PS2_MOUSE_SCROLL_DIVISOR_H);
-                mouse_report.x = 0;
-                mouse_report.y = 0;
-                //host_mouse_send(&mouse_report);
-            }
+void ps2_mouse_set_scaling_2_1(void) {
+    PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_SCALING_2_1, "ps2 mouse set scaling 2:1"); 
+}
+
+void ps2_mouse_set_scaling_1_1(void) {
+    PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_SCALING_1_1, "ps2 mouse set scaling 1:1"); 
+}
+
+void ps2_mouse_set_resolution(ps2_mouse_resolution_t resolution) {
+    PS2_MOUSE_SET_SAFE(PS2_MOUSE_SET_RESOLUTION, resolution, "ps2 mouse set resolution");
+}
+
+void ps2_mouse_set_sample_rate(ps2_mouse_sample_rate_t sample_rate) {
+    PS2_MOUSE_SET_SAFE(PS2_MOUSE_SET_SAMPLE_RATE, sample_rate, "ps2 mouse set sample rate");
+}
+
+/* ============================= HELPERS ============================ */
+
+#define X_IS_NEG  (mouse_report->buttons & (1<<PS2_MOUSE_X_SIGN))
+#define Y_IS_NEG  (mouse_report->buttons & (1<<PS2_MOUSE_Y_SIGN))
+#define X_IS_OVF  (mouse_report->buttons & (1<<PS2_MOUSE_X_OVFLW))
+#define Y_IS_OVF  (mouse_report->buttons & (1<<PS2_MOUSE_Y_OVFLW))
+static inline void ps2_mouse_convert_report_to_hid(report_mouse_t *mouse_report) {
+    // PS/2 mouse data is '9-bit integer'(-256 to 255) which is comprised of sign-bit and 8-bit value.
+    // bit: 8    7 ... 0
+    //      sign \8-bit/
+    //
+    // Meanwhile USB HID mouse indicates 8bit data(-127 to 127), note that -128 is not used.
+    //
+    // This converts PS/2 data into HID value. Use only -127-127 out of PS/2 9-bit.
+    mouse_report->x = X_IS_NEG ?
+        ((!X_IS_OVF && -127 <= mouse_report->x && mouse_report->x <= -1) ?  mouse_report->x : -127) :
+        ((!X_IS_OVF && 0 <= mouse_report->x && mouse_report->x <= 127) ? mouse_report->x : 127);
+    mouse_report->y = Y_IS_NEG ?
+        ((!Y_IS_OVF && -127 <= mouse_report->y && mouse_report->y <= -1) ?  mouse_report->y : -127) :
+        ((!Y_IS_OVF && 0 <= mouse_report->y && mouse_report->y <= 127) ? mouse_report->y : 127);
+
+    // remove sign and overflow flags
+    mouse_report->buttons &= PS2_MOUSE_BTN_MASK;
+
+    // invert coordinate of y to conform to USB HID mouse
+    mouse_report->y = -mouse_report->y;
+}
+
+static inline void ps2_mouse_clear_report(report_mouse_t *mouse_report) {
+    mouse_report->x = 0;
+    mouse_report->y = 0;
+    mouse_report->v = 0;
+    mouse_report->h = 0;
+    mouse_report->buttons = 0;
+}
+
+static inline void ps2_mouse_print_report(report_mouse_t *mouse_report) {
+    if (!debug_mouse) return;
+    print("ps2_mouse: [");
+    phex(mouse_report->buttons); print("|");
+    print_hex8((uint8_t)mouse_report->x); print(" ");
+    print_hex8((uint8_t)mouse_report->y); print(" ");
+    print_hex8((uint8_t)mouse_report->v); print(" ");
+    print_hex8((uint8_t)mouse_report->h); print("]\n");
+}
+
+static inline void ps2_mouse_enable_scrolling(void) {
+    PS2_MOUSE_SEND(PS2_MOUSE_SET_SAMPLE_RATE, "Initiaing scroll wheel enable: Set sample rate");
+    PS2_MOUSE_SEND(200, "200");
+    PS2_MOUSE_SEND(PS2_MOUSE_SET_SAMPLE_RATE, "Set sample rate");
+    PS2_MOUSE_SEND(100, "100");
+    PS2_MOUSE_SEND(PS2_MOUSE_SET_SAMPLE_RATE, "Set sample rate");
+    PS2_MOUSE_SEND(80, "80");
+    PS2_MOUSE_SEND(PS2_MOUSE_GET_DEVICE_ID, "Finished enabling scroll wheel");
+    _delay_ms(20);
+}
+
+#define PRESS_SCROLL_BUTTONS    mouse_report->buttons |= (PS2_MOUSE_SCROLL_BTN_MASK)
+#define RELEASE_SCROLL_BUTTONS  mouse_report->buttons &= ~(PS2_MOUSE_SCROLL_BTN_MASK)
+static inline void ps2_mouse_scroll_button_task(report_mouse_t *mouse_report) {
+    static enum { 
+        SCROLL_NONE, 
+        SCROLL_BTN, 
+        SCROLL_SENT,
+    } scroll_state = SCROLL_NONE;
+    static uint16_t scroll_button_time = 0;
+
+    if (PS2_MOUSE_SCROLL_BTN_MASK == (mouse_report->buttons & (PS2_MOUSE_SCROLL_BTN_MASK))) {
+        // All scroll buttons are pressed
+
+        if (scroll_state == SCROLL_NONE) {
+            scroll_button_time = timer_read();
+            scroll_state = SCROLL_BTN;
         }
-        else if ((mouse_report.buttons & (PS2_MOUSE_SCROLL_BTN_MASK)) == 0) {
+
+        // If the mouse has moved, update the report to scroll instead of move the mouse
+        if (mouse_report->x || mouse_report->y) {
+            scroll_state = SCROLL_SENT;
+            mouse_report->v = -mouse_report->y/(PS2_MOUSE_SCROLL_DIVISOR_V);
+            mouse_report->h =  mouse_report->x/(PS2_MOUSE_SCROLL_DIVISOR_H);
+            mouse_report->x = 0;
+            mouse_report->y = 0;
+        }
+    } else if (0 == (PS2_MOUSE_SCROLL_BTN_MASK & mouse_report->buttons)) {
+        // None of the scroll buttons are pressed 
+
 #if PS2_MOUSE_SCROLL_BTN_SEND
-            if (scroll_state == SCROLL_BTN &&
-                    TIMER_DIFF_16(timer_read(), scroll_button_time) < PS2_MOUSE_SCROLL_BTN_SEND) {
-                // send Scroll Button(down and up at once) when not scrolled
-                mouse_report.buttons |= (PS2_MOUSE_SCROLL_BTN_MASK);
-                host_mouse_send(&mouse_report);
-                _delay_ms(100);
-                mouse_report.buttons &= ~(PS2_MOUSE_SCROLL_BTN_MASK);
-            }
-#endif
-            scroll_state = SCROLL_NONE;
+        if (scroll_state == SCROLL_BTN 
+                && timer_elapsed(scroll_button_time) < PS2_MOUSE_SCROLL_BTN_SEND) {
+            PRESS_SCROLL_BUTTONS;
+            host_mouse_send(mouse_report);
+            _delay_ms(100);
+            RELEASE_SCROLL_BUTTONS;
         }
-        // doesn't send Scroll Button
-        mouse_report.buttons &= ~(PS2_MOUSE_SCROLL_BTN_MASK);
 #endif
-
-
-        host_mouse_send(&mouse_report);
-        print_usb_data();
+        scroll_state = SCROLL_NONE;
     }
-    // clear report
-    mouse_report.x = 0;
-    mouse_report.y = 0;
-    mouse_report.v = 0;
-    mouse_report.h = 0;
-    mouse_report.buttons = 0;
-}
 
-static void print_usb_data(void)
-{
-    if (!debug_mouse) return;
-    print("ps2_mouse usb: [");
-    phex(mouse_report.buttons); print("|");
-    print_hex8((uint8_t)mouse_report.x); print(" ");
-    print_hex8((uint8_t)mouse_report.y); print(" ");
-    print_hex8((uint8_t)mouse_report.v); print(" ");
-    print_hex8((uint8_t)mouse_report.h); print("]\n");
-}
-
-
-/* PS/2 Mouse Synopsis
- * http://www.computer-engineering.org/ps2mouse/
- *
- * Command:
- * 0xFF: Reset
- * 0xF6: Set Defaults Sampling; rate=100, resolution=4cnt/mm, scaling=1:1, reporting=disabled
- * 0xF5: Disable Data Reporting
- * 0xF4: Enable Data Reporting
- * 0xF3: Set Sample Rate
- * 0xF2: Get Device ID
- * 0xF0: Set Remote Mode
- * 0xEB: Read Data
- * 0xEA: Set Stream Mode
- * 0xE9: Status Request
- * 0xE8: Set Resolution
- * 0xE7: Set Scaling 2:1
- * 0xE6: Set Scaling 1:1
- *
- * Mode:
- * Stream Mode: devices sends the data when it changs its state
- * Remote Mode: host polls the data periodically
- *
- * This code uses Remote Mode and polls the data with Read Data(0xEB).
- *
- * Data format:
- * byte|7       6       5       4       3       2       1       0
- * ----+--------------------------------------------------------------
- *    0|Yovflw  Xovflw  Ysign   Xsign   1       Middle  Right   Left
- *    1|                    X movement
- *    2|                    Y movement
- */
+    RELEASE_SCROLL_BUTTONS;
+}
diff --git a/tmk_core/protocol/ps2_mouse.h b/tmk_core/protocol/ps2_mouse.h
index 27d9790d43..eeeffe4d80 100644
--- a/tmk_core/protocol/ps2_mouse.h
+++ b/tmk_core/protocol/ps2_mouse.h
@@ -19,16 +19,62 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define  PS2_MOUSE_H
 
 #include <stdbool.h>
+#include "debug.h"
 
-#define PS2_MOUSE_READ_DATA     0xEB
+#define PS2_MOUSE_SEND(command, message) \
+do { \
+   __attribute__ ((unused)) uint8_t rcv = ps2_host_send(command); \
+   if (debug_mouse) { \
+        print((message)); \
+        xprintf(" command: %X, result: %X, error: %X \n", command, rcv, ps2_error); \
+    } \
+} while(0)
+
+#define PS2_MOUSE_SEND_SAFE(command, message) \
+do { \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_disable_data_reporting(); \
+    } \
+    PS2_MOUSE_SEND(command, message); \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_enable_data_reporting(); \
+    } \
+} while(0)
+
+#define PS2_MOUSE_SET_SAFE(command, value, message) \
+do { \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_disable_data_reporting(); \
+    } \
+    PS2_MOUSE_SEND(command, message); \
+    PS2_MOUSE_SEND(value, "Sending value"); \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_enable_data_reporting(); \
+    } \
+} while(0)
+
+#define PS2_MOUSE_RECEIVE(message) \
+do { \
+   __attribute__ ((unused)) uint8_t rcv = ps2_host_recv_response(); \
+   if (debug_mouse) { \
+        print((message)); \
+        xprintf(" result: %X, error: %X \n", rcv, ps2_error); \
+    } \
+} while(0)
+
+__attribute__ ((unused))
+static enum ps2_mouse_mode_e {
+    PS2_MOUSE_STREAM_MODE,
+    PS2_MOUSE_REMOTE_MODE,
+} ps2_mouse_mode = PS2_MOUSE_STREAM_MODE;
 
 /*
  * Data format:
  * byte|7       6       5       4       3       2       1       0
- * ----+--------------------------------------------------------------
- *    0|Yovflw  Xovflw  Ysign   Xsign   1       Middle  Right   Left
- *    1|                    X movement(0-255)
- *    2|                    Y movement(0-255)
+ * ----+----------------------------------------------------------------
+ *    0|[Yovflw][Xovflw][Ysign ][Xsign ][ 1    ][Middle][Right ][Left  ]
+ *    1|[                    X movement(0-255)                         ]
+ *    2|[                    Y movement(0-255)                         ]
  */
 #define PS2_MOUSE_BTN_MASK      0x07
 #define PS2_MOUSE_BTN_LEFT      0
@@ -39,10 +85,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define PS2_MOUSE_X_OVFLW       6
 #define PS2_MOUSE_Y_OVFLW       7
 
-
-/*
- * Scroll by mouse move with pressing button
- */
 /* mouse button to start scrolling; set 0 to disable scroll */
 #ifndef PS2_MOUSE_SCROLL_BTN_MASK
 #define PS2_MOUSE_SCROLL_BTN_MASK       (1<<PS2_MOUSE_BTN_MIDDLE)
@@ -58,9 +100,79 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #ifndef PS2_MOUSE_SCROLL_DIVISOR_H
 #define PS2_MOUSE_SCROLL_DIVISOR_H      2
 #endif
+/* multiply reported mouse values by these */
+#ifndef PS2_MOUSE_X_MULTIPLIER
+#define PS2_MOUSE_X_MULTIPLIER          1
+#endif
+#ifndef PS2_MOUSE_Y_MULTIPLIER
+#define PS2_MOUSE_Y_MULTIPLIER          1
+#endif
+#ifndef PS2_MOUSE_V_MULTIPLIER
+#define PS2_MOUSE_V_MULTIPLIER          1
+#endif
+/* For some mice this will need to be 0x0F */
+#ifndef PS2_MOUSE_SCROLL_MASK       
+#define PS2_MOUSE_SCROLL_MASK           0xFF 
+#endif
+#ifndef PS2_MOUSE_INIT_DELAY
+#define PS2_MOUSE_INIT_DELAY            1000
+#endif
 
+enum ps2_mouse_command_e {
+    PS2_MOUSE_RESET = 0xFF,
+    PS2_MOUSE_RESEND = 0xFE,
+    PS2_MOSUE_SET_DEFAULTS = 0xF6,
+    PS2_MOUSE_DISABLE_DATA_REPORTING = 0xF5,
+    PS2_MOUSE_ENABLE_DATA_REPORTING = 0xF4,
+    PS2_MOUSE_SET_SAMPLE_RATE = 0xF3,
+    PS2_MOUSE_GET_DEVICE_ID = 0xF2,
+    PS2_MOUSE_SET_REMOTE_MODE = 0xF0,
+    PS2_MOUSE_SET_WRAP_MODE = 0xEC,
+    PS2_MOUSE_READ_DATA = 0xEB,
+    PS2_MOUSE_SET_STREAM_MODE = 0xEA,
+    PS2_MOUSE_STATUS_REQUEST = 0xE9,
+    PS2_MOUSE_SET_RESOLUTION = 0xE8,
+    PS2_MOUSE_SET_SCALING_2_1 = 0xE7,
+    PS2_MOUSE_SET_SCALING_1_1 = 0xE6,
+};
+
+typedef enum ps2_mouse_resolution_e {
+    PS2_MOUSE_1_COUNT_MM,
+    PS2_MOUSE_2_COUNT_MM,
+    PS2_MOUSE_4_COUNT_MM,
+    PS2_MOUSE_8_COUNT_MM,   
+} ps2_mouse_resolution_t;
+
+typedef enum ps2_mouse_sample_rate_e {
+    PS2_MOUSE_10_SAMPLES_SEC = 10,
+    PS2_MOUSE_20_SAMPLES_SEC = 20,
+    PS2_MOUSE_40_SAMPLES_SEC = 40,
+    PS2_MOUSE_60_SAMPLES_SEC = 60,
+    PS2_MOUSE_80_SAMPLES_SEC = 80,
+    PS2_MOUSE_100_SAMPLES_SEC = 100,
+    PS2_MOUSE_200_SAMPLES_SEC = 200,
+} ps2_mouse_sample_rate_t;
+
+void ps2_mouse_init(void);
+
+void ps2_mouse_init_user(void);
 
-uint8_t ps2_mouse_init(void);
 void ps2_mouse_task(void);
 
+void ps2_mouse_disable_data_reporting(void);
+
+void ps2_mouse_enable_data_reporting(void);
+
+void ps2_mouse_set_remote_mode(void);
+
+void ps2_mouse_set_stream_mode(void);
+
+void ps2_mouse_set_scaling_2_1(void);
+
+void ps2_mouse_set_scaling_1_1(void);
+
+void ps2_mouse_set_resolution(ps2_mouse_resolution_t resolution);
+
+void ps2_mouse_set_sample_rate(ps2_mouse_sample_rate_t sample_rate);
+
 #endif
diff --git a/tmk_core/protocol/vusb.mk b/tmk_core/protocol/vusb.mk
index 3cba3f71a3..897b833e1a 100644
--- a/tmk_core/protocol/vusb.mk
+++ b/tmk_core/protocol/vusb.mk
@@ -18,4 +18,5 @@ endif
 
 
 # Search Path
-VPATH += $(TMK_DIR)/protocol/vusb:$(TMK_DIR)/protocol/vusb/usbdrv
+VPATH += $(TMK_PATH)/$(VUSB_DIR)
+VPATH += $(TMK_PATH)/$(VUSB_DIR)/usbdrv
diff --git a/tmk_core/protocol/vusb/main.c b/tmk_core/protocol/vusb/main.c
index 8e4a266e9b..f6a0c7e9a4 100644
--- a/tmk_core/protocol/vusb/main.c
+++ b/tmk_core/protocol/vusb/main.c
@@ -48,8 +48,12 @@ int main(void)
     uint16_t last_timer = timer_read();
 #endif
 
+#ifdef CLKPR
+    // avoid unintentional changes of clock frequency in devices that have a
+    // clock prescaler
     CLKPR = 0x80, CLKPR = 0;
-#ifndef PS2_USE_USART
+#endif
+#ifndef NO_UART
     uart_init(UART_BAUD_RATE);
 #endif
 
diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c
index eaa1c512d8..022ac6f6bd 100644
--- a/tmk_core/protocol/vusb/vusb.c
+++ b/tmk_core/protocol/vusb/vusb.c
@@ -15,6 +15,8 @@ You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+#include <avr/eeprom.h>
+#include <avr/wdt.h>
 #include <stdint.h>
 #include "usbdrv.h"
 #include "usbconfig.h"
@@ -24,6 +26,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "debug.h"
 #include "host_driver.h"
 #include "vusb.h"
+#include "bootloader.h"
 
 
 static uint8_t vusb_keyboard_leds = 0;
@@ -163,6 +166,7 @@ static struct {
     uint16_t        len;
     enum {
         NONE,
+        BOOTLOADER,
         SET_LED
     }               kind;
 } last_req;
@@ -193,6 +197,11 @@ usbRequest_t    *rq = (void *)data;
                 debug("SET_LED: ");
                 last_req.kind = SET_LED;
                 last_req.len = rq->wLength.word;
+#ifdef BOOTLOADER_SIZE
+            } else if(rq->wValue.word == 0x0301) {
+                last_req.kind = BOOTLOADER;
+                last_req.len = rq->wLength.word;
+#endif
             }
             return USB_NO_MSG; // to get data in usbFunctionWrite
         } else {
@@ -220,6 +229,11 @@ uchar usbFunctionWrite(uchar *data, uchar len)
             last_req.len = 0;
             return 1;
             break;
+        case BOOTLOADER:
+            usbDeviceDisconnect();
+            bootloader_jump();
+            return 1;
+            break;
         case NONE:
         default:
             return -1;
@@ -266,7 +280,7 @@ const PROGMEM uchar keyboard_hid_report[] = {
     0x95, 0x06,          //   Report Count (6),
     0x75, 0x08,          //   Report Size (8),
     0x15, 0x00,          //   Logical Minimum (0),
-    0x25, 0xFF, 0x00     //   Logical Maximum(255),
+    0x26, 0xFF, 0x00,    //   Logical Maximum(255),
     0x05, 0x07,          //   Usage Page (Key Codes),
     0x19, 0x00,          //   Usage Minimum (0),
     0x29, 0xFF,          //   Usage Maximum (255),
@@ -336,7 +350,7 @@ const PROGMEM uchar mouse_hid_report[] = {
     0xa1, 0x01,                    // COLLECTION (Application)
     0x85, REPORT_ID_SYSTEM,        //   REPORT_ID (2)
     0x15, 0x01,                    //   LOGICAL_MINIMUM (0x1)
-    0x25, 0xb7, 0x00               //   LOGICAL_MAXIMUM (0xb7)
+    0x26, 0xb7, 0x00,              //   LOGICAL_MAXIMUM (0xb7)
     0x19, 0x01,                    //   USAGE_MINIMUM (0x1)
     0x29, 0xb7,                    //   USAGE_MAXIMUM (0xb7)
     0x75, 0x10,                    //   REPORT_SIZE (16)
@@ -481,11 +495,11 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq)
             /* interface index */
             switch (rq->wIndex.word) {
                 case 0:
-                    usbMsgPtr = keyboard_hid_report;
+                    usbMsgPtr = (unsigned char *)keyboard_hid_report;
                     len = sizeof(keyboard_hid_report);
                     break;
                 case 1:
-                    usbMsgPtr = mouse_hid_report;
+                    usbMsgPtr = (unsigned char *)mouse_hid_report;
                     len = sizeof(mouse_hid_report);
                     break;
             }