From 99145a8d7c88d9af065cfb7f5e8507d5b65ff811 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Thu, 26 Feb 2009 05:48:47 +0000
Subject: [PATCH] Makefiles and library modified to add a new F_CLOCK constant
 to give the unprescaled master input clock frequency, so that the correct PLL
 mask can be determined even when the CPU (F_CPU) clock rate is prescaled
 outside the normal input range of the PLL.

Started to clean up the AVRISP Programmer project code, donated by Opendous Inc.
---
 Bootloaders/CDC/BootloaderCDC.c               |   4 +-
 Bootloaders/CDC/BootloaderCDC.h               |   4 +-
 Bootloaders/CDC/makefile                      |  22 +-
 Bootloaders/DFU/makefile                      |  24 +-
 Bootloaders/TeensyHID/makefile                |  24 +-
 Demos/AudioInput/makefile                     |  19 +-
 Demos/AudioOutput/makefile                    |  19 +-
 Demos/BluetoothHost/makefile                  |  20 +-
 Demos/CDC/makefile                            |  19 +-
 Demos/CDCHost/makefile                        |  19 +-
 Demos/DualCDC/makefile                        |  19 +-
 Demos/Joystick/makefile                       |  19 +-
 Demos/Keyboard/makefile                       |  19 +-
 Demos/KeyboardFullInt/makefile                |  19 +-
 Demos/KeyboardHost/makefile                   |  19 +-
 Demos/KeyboardHostViaInt/makefile             |  19 +-
 Demos/KeyboardHostWithParser/makefile         |  19 +-
 Demos/KeyboardMouse/makefile                  |  19 +-
 Demos/KeyboardViaInt/makefile                 |  19 +-
 Demos/MIDI/makefile                           |  21 +-
 Demos/MassStorage/makefile                    |  19 +-
 Demos/MassStorageHost/makefile                |  19 +-
 Demos/Mouse/makefile                          |  19 +-
 Demos/MouseFullInt/makefile                   |  19 +-
 Demos/MouseHost/makefile                      |  19 +-
 Demos/MouseHostViaInt/makefile                |  19 +-
 Demos/MouseHostWithParser/makefile            |  19 +-
 Demos/MouseViaInt/makefile                    |  19 +-
 Demos/RNDISEthernet/makefile                  |  20 +-
 Demos/StillImageHost/makefile                 |  19 +-
 Demos/TestApp/makefile                        |  17 +-
 Demos/USBtoSerial/makefile                    |  19 +-
 LUFA/ChangeLog.txt                            |   2 +
 LUFA/Drivers/USB/LowLevel/LowLevel.h          |   9 +-
 LUFA/GettingStarted.txt                       |  16 +-
 LUFA/MigrationInformation.txt                 |   8 +
 .../AVRISP_Programmer/AVRISP_Programmer.c     | 214 ++++--------------
 .../AVRISP_Programmer/AVRISP_Programmer.h     |   2 +-
 Projects/AVRISP_Programmer/makefile           |  19 +-
 Projects/Magstripe/makefile                   |  19 +-
 40 files changed, 632 insertions(+), 250 deletions(-)

diff --git a/Bootloaders/CDC/BootloaderCDC.c b/Bootloaders/CDC/BootloaderCDC.c
index 654eabd22..54c7b7e49 100644
--- a/Bootloaders/CDC/BootloaderCDC.c
+++ b/Bootloaders/CDC/BootloaderCDC.c
@@ -207,7 +207,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
  *
  *  \param Command  Single character AVR910 protocol command indicating what memory operation to perform
  */
-static void ProgramReadWriteMemoryBlock(const uint8_t Command)
+static void ReadWriteMemoryBlock(const uint8_t Command)
 {
 	uint16_t BlockSize;
 	char     MemoryType;
@@ -503,7 +503,7 @@ TASK(CDC_Task)
 		else if ((Command == 'B') || (Command == 'g'))
 		{
 			/* Delegate the block write/read to a seperate function for clarity */
-			ProgramReadWriteMemoryBlock(Command);
+			ReadWriteMemoryBlock(Command);
 		}
 		else if (Command == 'R')
 		{
diff --git a/Bootloaders/CDC/BootloaderCDC.h b/Bootloaders/CDC/BootloaderCDC.h
index 0d8f1e3d8..a6e77550c 100644
--- a/Bootloaders/CDC/BootloaderCDC.h
+++ b/Bootloaders/CDC/BootloaderCDC.h
@@ -127,9 +127,9 @@
 
 	/* Function Prototypes: */
 		#if defined(INCLUDE_FROM_BOOTLOADERCDC_C) || defined(__DOXYGEN__)
-			static void ProgramReadWriteMemoryBlock(const uint8_t Command);
+			static void    ReadWriteMemoryBlock(const uint8_t Command);
 			static uint8_t FetchNextCommandByte(void);
-			static void WriteNextResponseByte(const uint8_t Response);
+			static void    WriteNextResponseByte(const uint8_t Response);
 		#endif
 
 #endif
diff --git a/Bootloaders/CDC/makefile b/Bootloaders/CDC/makefile
index 3fa8ad4ff..5045cc686 100644
--- a/Bootloaders/CDC/makefile
+++ b/Bootloaders/CDC/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -162,9 +176,11 @@ BOOT_START = 0x1E000
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DSTATIC_ENDPOINT_CONFIGURATION
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
-CDEFS += -DUSE_RAM_DESCRIPTORS -DBOOT_START_ADDR=$(BOOT_START)UL -DFIXED_CONTROL_ENDPOINT_SIZE=8 -DUSE_SINGLE_DEVICE_CONFIGURATION
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSB_DEVICE_ONLY -DUSE_NONSTANDARD_DESCRIPTOR_NAMES
+CDEFS += -DSTATIC_ENDPOINT_CONFIGURATION -DFIXED_CONTROL_ENDPOINT_SIZE=8
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS += -DUSE_RAM_DESCRIPTORS -DBOOT_START_ADDR=$(BOOT_START)UL -DUSE_SINGLE_DEVICE_CONFIGURATION
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Bootloaders/DFU/makefile b/Bootloaders/DFU/makefile
index 5a8e4eeed..5a26b7e3e 100644
--- a/Bootloaders/DFU/makefile
+++ b/Bootloaders/DFU/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -162,10 +176,12 @@ BOOT_START = 0x1E000
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DSTATIC_ENDPOINT_CONFIGURATION
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
-CDEFS += -DUSE_RAM_DESCRIPTORS -DBOOT_START_ADDR=$(BOOT_START)UL -DFIXED_CONTROL_ENDPOINT_SIZE=32 -DUSE_SINGLE_DEVICE_CONFIGURATION
-CDEFS += -DNO_CLEARSET_FEATURE_REQUEST
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSB_DEVICE_ONLY -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_CLEARSET_FEATURE_REQUEST
+CDEFS += -DSTATIC_ENDPOINT_CONFIGURATION -DFIXED_CONTROL_ENDPOINT_SIZE=32
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS += -DUSE_RAM_DESCRIPTORS -DBOOT_START_ADDR=$(BOOT_START)UL -DUSE_SINGLE_DEVICE_CONFIGURATION
+
 
 # Place -D or -U options here for ASM sources
 ADEFS = -DF_CPU=$(F_CPU)
diff --git a/Bootloaders/TeensyHID/makefile b/Bootloaders/TeensyHID/makefile
index 92dd8b9b3..a815e01b4 100644
--- a/Bootloaders/TeensyHID/makefile
+++ b/Bootloaders/TeensyHID/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -162,10 +176,12 @@ BOOT_START = 0xC000
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DSTATIC_ENDPOINT_CONFIGURATION
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
-CDEFS += -DUSE_RAM_DESCRIPTORS -DBOOT_START_ADDR=$(BOOT_START)UL -DFIXED_CONTROL_ENDPOINT_SIZE=8 -DUSE_SINGLE_DEVICE_CONFIGURATION
-CDEFS += -DNO_CLEARSET_FEATURE_REQUEST
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSB_DEVICE_ONLY -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_CLEARSET_FEATURE_REQUES
+CDEFS += -DSTATIC_ENDPOINT_CONFIGURATION -DFIXED_CONTROL_ENDPOINT_SIZE=8
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS += -DUSE_RAM_DESCRIPTORS -DBOOT_START_ADDR=$(BOOT_START)UL -DUSE_SINGLE_DEVICE_CONFIGURATION
+
 
 # Place -D or -U options here for ASM sources
 ADEFS = -DF_CPU=$(F_CPU)
diff --git a/Demos/AudioInput/makefile b/Demos/AudioInput/makefile
index 5906650f5..51f6cc5b8 100644
--- a/Demos/AudioInput/makefile
+++ b/Demos/AudioInput/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -159,8 +173,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/AudioOutput/makefile b/Demos/AudioOutput/makefile
index 46d7100ef..6c2ee3230 100644
--- a/Demos/AudioOutput/makefile
+++ b/Demos/AudioOutput/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -159,8 +173,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/BluetoothHost/makefile b/Demos/BluetoothHost/makefile
index b82a8ace4..189c84e1c 100644
--- a/Demos/BluetoothHost/makefile
+++ b/Demos/BluetoothHost/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -166,9 +180,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES
-CDEFS += -DUSB_HOST_ONLY -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
-CDEFS += -DNO_STREAM_CALLBACKS
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DUSB_HOST_ONLY -DNO_STREAM_CALLBACKS
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 # Place -D or -U options here for ASM sources
 ADEFS = -DF_CPU=$(F_CPU)
diff --git a/Demos/CDC/makefile b/Demos/CDC/makefile
index b2bc1e269..9b0e5bdd6 100644
--- a/Demos/CDC/makefile
+++ b/Demos/CDC/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -159,8 +173,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/CDCHost/makefile b/Demos/CDCHost/makefile
index 1152a891a..d1e4cb990 100644
--- a/Demos/CDCHost/makefile
+++ b/Demos/CDCHost/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -162,8 +176,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_HOST_ONLY -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DUSB_HOST_ONLY -DNO_STREAM_CALLBACKS
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/DualCDC/makefile b/Demos/DualCDC/makefile
index 50d8efea1..01ab60997 100644
--- a/Demos/DualCDC/makefile
+++ b/Demos/DualCDC/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -159,8 +173,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/Joystick/makefile b/Demos/Joystick/makefile
index 0802e2d53..a29a2d380 100644
--- a/Demos/Joystick/makefile
+++ b/Demos/Joystick/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -159,8 +173,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/Keyboard/makefile b/Demos/Keyboard/makefile
index b2a3bee0f..681f729e2 100644
--- a/Demos/Keyboard/makefile
+++ b/Demos/Keyboard/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -159,8 +173,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/KeyboardFullInt/makefile b/Demos/KeyboardFullInt/makefile
index 20fcc1315..b1f7f890f 100644
--- a/Demos/KeyboardFullInt/makefile
+++ b/Demos/KeyboardFullInt/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -158,8 +172,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/KeyboardHost/makefile b/Demos/KeyboardHost/makefile
index 5140e7d98..7ff737e51 100644
--- a/Demos/KeyboardHost/makefile
+++ b/Demos/KeyboardHost/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -162,8 +176,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_HOST_ONLY -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DUSB_HOST_ONLY -DNO_STREAM_CALLBACKS
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/KeyboardHostViaInt/makefile b/Demos/KeyboardHostViaInt/makefile
index 9cd332e5a..a8b3f23e6 100644
--- a/Demos/KeyboardHostViaInt/makefile
+++ b/Demos/KeyboardHostViaInt/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -162,8 +176,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_HOST_ONLY -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DUSB_HOST_ONLY -DNO_STREAM_CALLBACKS
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/KeyboardHostWithParser/makefile b/Demos/KeyboardHostWithParser/makefile
index 3082b8e9b..ea768b4e4 100644
--- a/Demos/KeyboardHostWithParser/makefile
+++ b/Demos/KeyboardHostWithParser/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -164,8 +178,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_HOST_ONLY -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DUSB_HOST_ONLY -DNO_STREAM_CALLBACKS
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/KeyboardMouse/makefile b/Demos/KeyboardMouse/makefile
index ceae7dc58..7c26d2cf2 100644
--- a/Demos/KeyboardMouse/makefile
+++ b/Demos/KeyboardMouse/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -159,8 +173,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/KeyboardViaInt/makefile b/Demos/KeyboardViaInt/makefile
index f1cb7a569..ff225b35c 100644
--- a/Demos/KeyboardViaInt/makefile
+++ b/Demos/KeyboardViaInt/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -159,8 +173,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/MIDI/makefile b/Demos/MIDI/makefile
index 63f051306..c5cc048d8 100644
--- a/Demos/MIDI/makefile
+++ b/Demos/MIDI/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -159,8 +173,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
@@ -464,7 +479,7 @@ end:
 
 # Display size of file.
 HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
-EELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
+ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
 MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
 FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
 
diff --git a/Demos/MassStorage/makefile b/Demos/MassStorage/makefile
index 82e10908c..2f17228af 100644
--- a/Demos/MassStorage/makefile
+++ b/Demos/MassStorage/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -161,8 +175,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/MassStorageHost/makefile b/Demos/MassStorageHost/makefile
index 2379c3856..fb04798e8 100644
--- a/Demos/MassStorageHost/makefile
+++ b/Demos/MassStorageHost/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -163,8 +177,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_HOST_ONLY -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_HOST_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/Mouse/makefile b/Demos/Mouse/makefile
index 329423f5d..0f20dca63 100644
--- a/Demos/Mouse/makefile
+++ b/Demos/Mouse/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -159,8 +173,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/MouseFullInt/makefile b/Demos/MouseFullInt/makefile
index 317fc315d..fe8551698 100644
--- a/Demos/MouseFullInt/makefile
+++ b/Demos/MouseFullInt/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -159,8 +173,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/MouseHost/makefile b/Demos/MouseHost/makefile
index b387efe34..6e8688f10 100644
--- a/Demos/MouseHost/makefile
+++ b/Demos/MouseHost/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -162,8 +176,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_HOST_ONLY -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_HOST_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/MouseHostViaInt/makefile b/Demos/MouseHostViaInt/makefile
index 0f8cae300..f2b86e12f 100644
--- a/Demos/MouseHostViaInt/makefile
+++ b/Demos/MouseHostViaInt/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -162,8 +176,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_HOST_ONLY -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_HOST_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/MouseHostWithParser/makefile b/Demos/MouseHostWithParser/makefile
index d9fcb1bc7..3eec44b36 100644
--- a/Demos/MouseHostWithParser/makefile
+++ b/Demos/MouseHostWithParser/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -164,8 +178,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_HOST_ONLY -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_HOST_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/MouseViaInt/makefile b/Demos/MouseViaInt/makefile
index 0316b912d..571d1f606 100644
--- a/Demos/MouseViaInt/makefile
+++ b/Demos/MouseViaInt/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -159,8 +173,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/RNDISEthernet/makefile b/Demos/RNDISEthernet/makefile
index 840b9d8d5..ba1588af6 100644
--- a/Demos/RNDISEthernet/makefile
+++ b/Demos/RNDISEthernet/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -171,8 +185,10 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+
 CDEFS += -DNO_DECODE_ETHERNET -DNO_DECODE_ARP -DNO_DECODE_ICMP -DNO_DECODE_IP -DNO_DECODE_TCP -DNO_DECODE_UDP -DNO_DECODE_DHCP
 
 
diff --git a/Demos/StillImageHost/makefile b/Demos/StillImageHost/makefile
index f2aee82e2..63e328ac4 100644
--- a/Demos/StillImageHost/makefile
+++ b/Demos/StillImageHost/makefile
@@ -89,6 +89,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -162,8 +176,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_HOST_ONLY -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_HOST_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Demos/TestApp/makefile b/Demos/TestApp/makefile
index 9d9b5fd6a..befc0e6fc 100644
--- a/Demos/TestApp/makefile
+++ b/Demos/TestApp/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -167,7 +181,8 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES
 CDEFS += -DNUM_BLOCKS=100 -DBLOCK_SIZE=8 -DNUM_HANDLES=20
 
 
diff --git a/Demos/USBtoSerial/makefile b/Demos/USBtoSerial/makefile
index 58c12b9ef..6703102bb 100644
--- a/Demos/USBtoSerial/makefile
+++ b/Demos/USBtoSerial/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -161,8 +175,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/LUFA/ChangeLog.txt b/LUFA/ChangeLog.txt
index fd21b3f10..af15a964d 100644
--- a/LUFA/ChangeLog.txt
+++ b/LUFA/ChangeLog.txt
@@ -21,6 +21,8 @@
   *  - Fixed KeyboardMouse demo discarding the wIndex value in the REQ_GetReport request
   *  - USBtoSerial demo now discards all Rx data when not connected to a USB host, rather than buffering characters for transmission
   *    next time the device is attached to a host.
+  *  - Added new F_CLOCK compile time constant to the library and makefiles, to give the raw input clock (used to feed the PLL before any
+  *    clock prescaling is performed) frequency, so that the PLL prescale mask can be determined
   *
   *  \section Sec_ChangeLog090209 Version 090209
   *
diff --git a/LUFA/Drivers/USB/LowLevel/LowLevel.h b/LUFA/Drivers/USB/LowLevel/LowLevel.h
index faafbd7bf..9721baca0 100644
--- a/LUFA/Drivers/USB/LowLevel/LowLevel.h
+++ b/LUFA/Drivers/USB/LowLevel/LowLevel.h
@@ -66,7 +66,12 @@
 		#endif
 
 	/* Preprocessor Checks and Defines: */
-		#if (F_CPU == 8000000)
+		#if !defined(F_CLOCK)
+			#error F_CLOCK is not defined. You must device F_CLOCK to the frequency of the unprescaled input clock in your project makefile.
+			#define F_CLOCK 0
+		#endif
+	
+		#if (F_CLOCK == 8000000)
 			#if (defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__))
 				#define USB_PLL_PSC                0
 			#elif (defined(__AVR_AT90USB646__)  || defined(__AVR_AT90USB647__)  || \
@@ -76,7 +81,7 @@
 			#elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))
 				#define USB_PLL_PSC                0
 			#endif
-		#elif (F_CPU == 16000000)
+		#elif (F_CLOCK == 16000000)
 			#if (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_ATmega32U6__))
 				#define USB_PLL_PSC                ((1 << PLLP2) | (1 << PLLP1))
 			#elif (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__))
diff --git a/LUFA/GettingStarted.txt b/LUFA/GettingStarted.txt
index 0fe3f50b9..a88a82533 100644
--- a/LUFA/GettingStarted.txt
+++ b/LUFA/GettingStarted.txt
@@ -57,14 +57,22 @@
  *  directory into a /Board/ folder inside the application directory, and the stub driver completed with the appropriate code to drive the
  *  custom board's hardware.
  *
- *  \subsection SSec_F_CPU The F_CPU Parameter
- *  This parameter indicates the target AVR's master clock frequency, in Hz. Consult your AVR model's datasheet for allowable clock frequencies
- *  if the USB interface is to be operational.
+ *  \subsection SSec_F_CLOCK The F_CLOCK Parameter
+ *  This parameter indicates the target AVR's input clock frequency, in Hz. This is the actual clock input, before any prescaling is performed. In the
+ *  USB AVR architecture, the input clock before any prescaling is fed directly to the PLL subsystem, and thus the PLL is derived directly from the
+ *  clock input. The PLL then feeds the USB and other sections of the AVR with the correct upscaled frequencies required for those sections to function.
  *
- *  <b>Note that this value does not actually *alter* the AVR's clock frequency</b>, it is just a way to indicate to the library the clock frequency
+ *  <b>Note that this value does not actually *alter* the AVR's input clock frequency</b>, it is just a way to indicate to the library the clock frequency
  *  of the AVR as set by the AVR's fuses. If this value does not reflect the actual running frequency of the AVR, incorrect operation of one of more
  *  library components will ocurr.
  *
+ *  \subsection SSec_F_CPU The F_CPU Parameter
+ *  This parameter indicates the target AVR's master CPU clock frequency, in Hz.
+ *
+ *  <b>Note that this value does not actually *alter* the AVR's CPU clock frequency</b>, it is just a way to indicate to the library the clock frequency
+ *  of the AVR core as set by the AVR's fuses. If this value does not reflect the actual running frequency of the AVR, incorrect operation of one of more
+ *  library components will ocurr.
+ *
  *  \subsection SSec_CDEFS The CDEFS Parameter
  *  Most applications will actually have multiple CDEF lines, which are concatenated together with the "+=" operator. This ensures that large
  *  numbers of configuration options remain readable by splitting up groups of options into seperate lines.
diff --git a/LUFA/MigrationInformation.txt b/LUFA/MigrationInformation.txt
index 1cdb55ae7..cd23da332 100644
--- a/LUFA/MigrationInformation.txt
+++ b/LUFA/MigrationInformation.txt
@@ -12,6 +12,14 @@
  *
  * \section Sec_MigrationXXXXXX Migrating from 090209 to XXXXXX
  *
+ *  <b>All</b>
+ *    - LUFA projects must now give the raw input clock frequency (before any prescaling) as a compile time constant "F_CLOCK",
+ *      defined in the project makefile and passed to the compiler via the -D switch.
+ *    - The makefile EEPROM programming targets for FLIP and dfu-programmer no longer program in the FLASH data in addition to the
+ *      EEPROM data into the device. If both are to be programmed, both the EEPROM and FLASH programming targets must be called.
+ *
+ *  <b>Library Demos</b>
+ *    - The USBtoSerial demo now discards all data when not connected to a host, rather than buffering it for later transmission.
  *
  * \section Sec_Migration090209 Migrating from 081217 to 090209
  *
diff --git a/Projects/AVRISP_Programmer/AVRISP_Programmer.c b/Projects/AVRISP_Programmer/AVRISP_Programmer.c
index 4dc18cd62..9ba3c0e7e 100644
--- a/Projects/AVRISP_Programmer/AVRISP_Programmer.c
+++ b/Projects/AVRISP_Programmer/AVRISP_Programmer.c
@@ -116,7 +116,7 @@ BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
 #define AVRDEVCODE02	0x56 /* ATtiny15 */
 #define AVRDEVCODE03	0x5E /* ATtiny261 */
 #define AVRDEVCODE04	0x76 /* ATmega8 */
-#define AVRDEVCODE05	0x74 /*ATmega16 */
+#define AVRDEVCODE05	0x74 /* ATmega16 */
 #define AVRDEVCODE06	0x72 /* ATmega32 */
 #define AVRDEVCODE07	0x45 /* ATmega64 */
 #define AVRDEVCODE08	0x74 /* ATmega644 */
@@ -155,20 +155,8 @@ RingBuff_t Tx_Buffer;
 /** Flag to indicate if the USART is currently transmitting data from the Rx_Buffer circular buffer. */
 volatile bool Transmitting = false;
 
-
 /* some global variables used throughout */
-uint8_t tempIOreg = 0;
-uint8_t tempIOreg2 = 0;
-uint8_t tempIOreg3 = 0;
-uint8_t tempIOreg4 = 0;
-uint8_t dataWidth = 0;
-uint8_t firstRun = 1;
-uint8_t deviceCode = 0;
-uint8_t tempByte = 0;
 uint16_t currAddress = 0;
-uint16_t timerval = 0;
-
-
 
 /** Main program entry point. This routine configures the hardware required by the application, then
     starts the scheduler to run the application tasks.
@@ -185,9 +173,7 @@ int main(void)
 	/* Hardware Initialization */
 	LEDs_Init();
 	ReconfigureSPI();
-    // prepare PortB
-	DDRB = 0;
-	PORTB = 0;
+
 	DDRC |= ((1 << PC2) | (1 << PC4) | (1 << PC5) | (1 << PC6) | (1 << PC7)); //AT90USBxx2
 	// PC2 is also used for RESET, so set it HIGH initially - note 'P' command sets it to LOW (Active)
 	PORTC |= ((1 << PC2) | (1 << PC4) | (1 << PC5) | (1 << PC6) | (1 << PC7)); //AT90USBxx2
@@ -198,15 +184,7 @@ int main(void)
 	PORTB |= (1 << PB0);
     // make sure DataFlash devices to not interfere - deselect them by setting PE0 and PE1 HIGH:
     PORTE = 0xFF;
-    DDRE = 0xFF;
-
-	// initialize Timer1 for use in delay function
-	TCCR1A = 0;
-	//TCCR1B = (1 << CS10); // no prescaling, use CLK
-	TCCR1B = ((1 << CS12) | (1 << CS10)); // prescale by CLK/1024
-	// 8MHz/1024 = 7813 ticks per second --> ~8 ticks per millisecond (ms)
-	timerval = TCNT1; // start timer1
-
+    DDRE  = 0xFF;
 
 	/* Ringbuffer Initialization */
 	Buffer_Initialize(&Rx_Buffer);
@@ -320,17 +298,6 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
 		case REQ_SetControlLineState:
 			if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
 			{
-#if 0
-				/* NOTE: Here you can read in the line state mask from the host, to get the current state of the output handshake
-				         lines. The mask is read in from the wValue parameter, and can be masked against the CONTROL_LINE_OUT_* masks
-				         to determine the RTS and DTR line states using the following code:
-				*/
-
-				uint16_t wIndex = Endpoint_Read_Word_LE();
-					
-				// Do something with the given line states in wIndex
-#endif
-				
 				/* Acknowedge the SETUP packet, ready for data transfer */
 				Endpoint_ClearSetupReceived();
 				
@@ -347,30 +314,6 @@ TASK(CDC_Task)
 {
 	if (USB_IsConnected)
 	{
-#if 0
-		/* NOTE: Here you can use the notification endpoint to send back line state changes to the host, for the special RS-232
-				 handshake signal lines (and some error states), via the CONTROL_LINE_IN_* masks and the following code:
-		*/
-
-		USB_Notification_Header_t Notification = (USB_Notification_Header_t)
-			{
-				NotificationType: (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),
-				Notification:     NOTIF_SerialState,
-				wValue:           0,
-				wIndex:           0,
-				wLength:          sizeof(uint16_t),
-			};
-			
-		uint16_t LineStateMask;
-		
-		// Set LineStateMask here to a mask of CONTROL_LINE_IN_* masks to set the input handshake line states to send to the host
-		
-		Endpoint_SelectEndpoint(CDC_NOTIFICATION_EPNUM);
-		Endpoint_Write_Stream_LE(&Notification, sizeof(Notification));
-		Endpoint_Write_Stream_LE(&LineStateMask, sizeof(LineStateMask));
-		Endpoint_ClearCurrentBank();
-#endif
-
 		/* Select the Serial Rx Endpoint */
 		Endpoint_SelectEndpoint(CDC_RX_EPNUM);
 		
@@ -385,72 +328,41 @@ TASK(CDC_Task)
 				/* Store each character from the endpoint */
 				Buffer_StoreElement(&Rx_Buffer, Endpoint_Read_Byte());
 
-
-
-
-                /* Each time there is an element, check which comand should be
-	                run and if enough data is available to run that command.
-	                There are 1-byte, 2-byte, 3-byte, 4-byte commands, and 5-byte commands
-	                Remember that the "which command" byte counts as 1 */
-                if (Rx_Buffer.Elements == 0) {
-	                // do nothing, wait for data
-                } else {
-	                tempByte = Buffer_PeekElement(&Rx_Buffer); // peek at first element
-
-		                /* make sure the issued command and associated data are all ready */
-	                if (Rx_Buffer.Elements == 1) { // zero data byte command
-		                if ((tempByte == 'P') | (tempByte == 'a') | (tempByte == 'm') |
-		                (tempByte == 'R') | (tempByte == 'd') | (tempByte == 'e') |
-		                (tempByte == 'L') | (tempByte == 's') | (tempByte == 't') | 
-		                (tempByte == 'S') | (tempByte == 'V') | (tempByte == 'v') |
-		                (tempByte == 'p') | (tempByte == 'F')) {
-                    	processHostSPIRequest(); // command has enough data, process it
-		                }
-	                } else if (Rx_Buffer.Elements == 2) { // one data byte command
-		                if ((tempByte == 'T') | (tempByte == 'c') | (tempByte == 'C') |
-			                (tempByte == 'D') | (tempByte == 'l') | (tempByte == 'f') |
-			                (tempByte == 'x') | (tempByte == 'y')) {
-			                processHostSPIRequest(); // command has enough data, process it
-		                }
-	                } else if (Rx_Buffer.Elements == 3) { // two data byte command
-		                if ((tempByte == 'A') | (tempByte == 'Z')) {
-			                processHostSPIRequest(); // command has enough data, process it
-		                }
-	                } else if (Rx_Buffer.Elements == 4) { // three data byte command
-		                if ((tempByte == ':')) {
-                    	processHostSPIRequest(); // command has enough data, process it
-		                }
-	                } else if (Rx_Buffer.Elements == 5) { // four data byte command
-		                if ((tempByte == '.')) {
-			                processHostSPIRequest(); // command has enough data, process it
-		                }
-	                } else {
-		                // do nothing
-	                }
+                /* Run the given command once enough data is available. */
+                if (Rx_Buffer.Elements)
+				{
+					const uint8_t ZeroDataByteCommands[]  = {'P', 'a', 'm', 'R', 'd', 'e', 'L', 's', 't', 'S', 'V', 'v', 'p', 'F'};
+					const uint8_t OneDataByteCommands[]   = {'T', 'c', 'C', 'D', 'l', 'f', 'x', 'y'};
+					const uint8_t TwoDataByteCommands[]   = {'A', 'Z'};
+					const uint8_t ThreeDataByteCommands[] = {':'};
+					const uint8_t FourDataByteCommands[]  = {'.'};
+					
+					const struct
+					{
+						const uint8_t  TotalCommands;
+						const uint8_t* CommandBytes;
+					} AVR910Commands[] = {{sizeof(ZeroDataByteCommands),  ZeroDataByteCommands},
+					                      {sizeof(OneDataByteCommands),   OneDataByteCommands},
+					                      {sizeof(TwoDataByteCommands),   TwoDataByteCommands},
+					                      {sizeof(ThreeDataByteCommands), ThreeDataByteCommands},
+					                      {sizeof(FourDataByteCommands),  FourDataByteCommands}};
+					
+					/* Determine the data length of the issued command */
+					uint8_t CommandDataLength = (Rx_Buffer.Elements - 1);
+					
+					/* Loop through each of the possible command bytes allowable from the given command data length */
+					for (uint8_t CurrentCommand = 0; CurrentCommand < AVR910Commands[CommandDataLength].TotalCommands; CurrentCommand++)
+					{
+						/* If issues command matches an allowable command, process it */
+						if (Buffer_PeekElement(&Rx_Buffer) == AVR910Commands[CommandDataLength].CommandBytes[CurrentCommand])
+						  processHostSPIRequest();
+					}
                 }
-
-
-
 			}
 			
 			/* Clear the endpoint buffer */
 			Endpoint_ClearCurrentBank();
 		}
-		
-		/* Check if Rx buffer contains data */
-		if (Rx_Buffer.Elements)
-		{
-			/* Initiate the transmission of the buffer contents if USART idle */
-			if (!(Transmitting))
-			{
-				Transmitting = true;
-				/* The following flushes the receive buffer to prepare for new data and commands */
-				/* Need to flush the buffer as the command byte which is peeked above needs to be */
-				/*  dealt with, otherwise the command bytes will overflow the buffer eventually */
-				//Buffer_GetElement(&Rx_Buffer); // works also
-				Buffer_Initialize(&Rx_Buffer);
-			}
-		}
 
 		/* Select the Serial Tx Endpoint */
 		Endpoint_SelectEndpoint(CDC_TX_EPNUM);
@@ -484,12 +396,10 @@ TASK(CDC_Task)
 	}
 }
 
-
-
 /** Function to manage status updates to the user. This is done via LEDs on the given board, if available, but may be changed to
-    log to a serial port, or anything else that is suitable for status updates.
+ *  log to a serial port, or anything else that is suitable for status updates.
  *
-    \param CurrentStatus  Current status of the system, from the USBtoSerial_StatusCodes_t enum
+ *  \param CurrentStatus  Current status of the system, from the USBtoSerial_StatusCodes_t enum
  */
 void UpdateStatus(uint8_t CurrentStatus)
 {
@@ -513,22 +423,12 @@ void UpdateStatus(uint8_t CurrentStatus)
 	LEDs_SetAllLEDs(LEDMask);
 }
 
-
 /** Reconfigures SPI to match the current serial port settings issued by the host. */
 void ReconfigureSPI(void)
 {
 	uint8_t SPCRmask = (1 << SPE) | (1 << MSTR); // always enable SPI as Master
 	uint8_t SPSRmask = 0;
 
-	/* Determine data width */
-	if (LineCoding.ParityType == Parity_Odd) {
-		dataWidth = 16;
-	} else if (LineCoding.ParityType == Parity_Even) {
-		dataWidth = 32;
-	} else if (LineCoding.ParityType == Parity_None) {
-		dataWidth = 8;
-	}
-
 	/* Determine stop bits - 1.5 stop bits is set as 1 stop bit due to hardware limitations */
 	/* For SPI, determine whether format is LSB or MSB */
 	if (LineCoding.CharFormat == TwoStopBits) {	
@@ -579,14 +479,6 @@ void ReconfigureSPI(void)
 
 	SPCR = SPCRmask;
 	SPSR = SPSRmask;
-
-	// only read if first run
-	if (firstRun) {
-		tempIOreg = SPSR; //need to read to initiliaze
-		tempIOreg = SPDR; //need to read to initiliaze
-		firstRun = 0;
-	}
-
 }
 
 
@@ -642,20 +534,20 @@ void processHostSPIRequest(void) {
 		//PORTB = 0; // set clock to zero
 		RESETPORT = (1 << RESETPIN); // set RESET pin on target to 1
 		RESETPORT2 = (1 << RESETPIN2);
-		delay_ms(DELAY_SHORT);
+		_delay_ms(DELAY_SHORT);
 		//RESETPORT = (RESETPORT & ~(1 << RESETPIN)); // set RESET pin on target to 0 - Active
 		RESETPORT = 0x00;
 		RESETPORT2 = 0;
-		delay_ms(DELAY_SHORT);
+		_delay_ms(DELAY_SHORT);
 		SPI_SendByte(0xAC);
 		SPI_SendByte(0x53);
 		SPI_SendByte(0x00);
 		SPI_SendByte(0x00);
-		delay_ms(DELAY_VERYSHORT);
+		_delay_ms(DELAY_VERYSHORT);
 		Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
 
 	} else if (firstByte == 'T') { // Select device type
-		deviceCode = Buffer_GetElement(&Rx_Buffer); // set device type
+		Buffer_GetElement(&Rx_Buffer); // set device type
 		Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
 
 	} else if (firstByte == 'a') { // Report autoincrement address
@@ -675,7 +567,7 @@ void processHostSPIRequest(void) {
 		SPI_SendByte((currAddress >> 8)); // high byte
 		SPI_SendByte((currAddress)); // low byte
 		SPI_SendByte(readByte1); // data
-		delay_ms(DELAY_MEDIUM); // certain MCUs require a delay of about 24585 cycles
+		_delay_ms(DELAY_MEDIUM); // certain MCUs require a delay of about 24585 cycles
 		Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
 
 	} else if (firstByte == 'C') { // Write program memory, high byte
@@ -694,7 +586,7 @@ void processHostSPIRequest(void) {
 		SPI_SendByte((currAddress >> 8)); // high byte
 		SPI_SendByte((currAddress)); // low byte
 		SPI_SendByte(0x00);
-		delay_ms(DELAY_LONG);
+		_delay_ms(DELAY_LONG);
 		Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
 
 	} else if (firstByte == 'R') { // Read Program Memory
@@ -719,7 +611,7 @@ void processHostSPIRequest(void) {
 		SPI_SendByte((currAddress >> 8)); // high byte
 		SPI_SendByte((currAddress)); // low byte
 		SPI_SendByte(readByte1); // data
-		delay_ms(DELAY_MEDIUM);
+		_delay_ms(DELAY_MEDIUM);
 		currAddress++; // increment currAddress
 		Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
 
@@ -738,7 +630,7 @@ void processHostSPIRequest(void) {
 		SPI_SendByte(0x80);
 		SPI_SendByte(0x04);
 		SPI_SendByte(0x00);
-		delay_ms(DELAY_LONG);
+		_delay_ms(DELAY_LONG);
 		Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
 
 	} else if (firstByte == 'l') { // write lock bits
@@ -748,7 +640,7 @@ void processHostSPIRequest(void) {
 		SPI_SendByte(((0x06 & readByte1) | 0xE0)); // TODO - is this correct???
 		SPI_SendByte(0x00);
 		SPI_SendByte(0x00);
-		delay_ms(DELAY_MEDIUM);
+		_delay_ms(DELAY_MEDIUM);
 		Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
 
 	} else if (firstByte == 'f') { // write fuse bits
@@ -840,7 +732,7 @@ void processHostSPIRequest(void) {
 		SPI_SendByte(readByte3);
 		readByte1 = SPI_TransferByte(0x00);
 		Buffer_StoreElement(&Tx_Buffer, readByte1);
-		delay_ms(DELAY_MEDIUM);
+		_delay_ms(DELAY_MEDIUM);
 		Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
 
 	} else if (firstByte == '.') { // New Universal Command
@@ -854,7 +746,7 @@ void processHostSPIRequest(void) {
 		SPI_SendByte(readByte3);
 		readByte1 = SPI_TransferByte(readByte4);
 		Buffer_StoreElement(&Tx_Buffer, readByte1);
-		delay_ms(DELAY_MEDIUM);
+		_delay_ms(DELAY_MEDIUM);
 		Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
 
 	} else if (firstByte == 'Z') { // Special test command
@@ -868,19 +760,3 @@ void processHostSPIRequest(void) {
 	}
 }
 
-
-void delay_ms(uint8_t dly) {
-	uint16_t endtime = 0;
-
-	endtime = TCNT1;
-	if (endtime > 63486) {
-		endtime = (dly * DELAY_MULTIPLE);
-	} else {
-		endtime += (dly * DELAY_MULTIPLE);
-	}
-
-	timerval = TCNT1;
-	while (timerval < endtime) {
-		timerval = TCNT1;
-	}
-}
diff --git a/Projects/AVRISP_Programmer/AVRISP_Programmer.h b/Projects/AVRISP_Programmer/AVRISP_Programmer.h
index e78ba2935..4c98d6bf3 100644
--- a/Projects/AVRISP_Programmer/AVRISP_Programmer.h
+++ b/Projects/AVRISP_Programmer/AVRISP_Programmer.h
@@ -37,6 +37,7 @@
 #define _AVRISP_PROGRAMMER_H_
 
 	/* Includes: */
+		#include <util/delay.h>
 		#include <avr/io.h>
 		#include <avr/wdt.h>
 		#include <avr/interrupt.h>
@@ -189,6 +190,5 @@
 		void ReconfigureSPI(void);
 		void UpdateStatus(uint8_t CurrentStatus);
 		void processHostSPIRequest(void);
-		void delay_ms(uint8_t dly);
 
 #endif
diff --git a/Projects/AVRISP_Programmer/makefile b/Projects/AVRISP_Programmer/makefile
index d6617dc7e..f8d75b658 100644
--- a/Projects/AVRISP_Programmer/makefile
+++ b/Projects/AVRISP_Programmer/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 8000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -161,8 +175,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 
 # Place -D or -U options here for ASM sources
diff --git a/Projects/Magstripe/makefile b/Projects/Magstripe/makefile
index 2ea5536fb..109976090 100644
--- a/Projects/Magstripe/makefile
+++ b/Projects/Magstripe/makefile
@@ -90,6 +90,20 @@ BOARD  = USBKEY
 F_CPU = 16000000
 
 
+# Input clock frequency.
+#     This will define a symbol, F_CLOCK, in all source code files equal to the 
+#     input clock frequency (before any prescaling is performed). This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_CLOCK = 8000000
+
+
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
 
@@ -160,8 +174,9 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS  = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 CDEFS += -DMAG_T1_CLOCK="(1 << 0)"
 CDEFS += -DMAG_T1_DATA="(1 << 1)"
-- 
GitLab