]> jspc29.x-matter.uni-frankfurt.de Git - coral.git/commitdiff
this way relative mode works, very dirty code stuff
authorMichael Wiebusch <stratomaster@gmx.net>
Sat, 5 Oct 2013 20:57:21 +0000 (22:57 +0200)
committerMichael Wiebusch <stratomaster@gmx.net>
Sat, 5 Oct 2013 20:57:21 +0000 (22:57 +0200)
26 files changed:
firmware/Config/LUFAConfig.h [new file with mode: 0644]
firmware/Descriptors.c [new file with mode: 0644]
firmware/Descriptors.d [new file with mode: 0644]
firmware/Descriptors.h [new file with mode: 0644]
firmware/Descriptors.o [new file with mode: 0644]
firmware/Doxygen.conf [new file with mode: 0644]
firmware/LUFA USBtoSerial.inf [new file with mode: 0644]
firmware/TM1001A.c [new file with mode: 0644]
firmware/TM1001A.c~ [new file with mode: 0644]
firmware/USBtoSerial.c [new file with mode: 0644]
firmware/USBtoSerial.c~ [new file with mode: 0644]
firmware/USBtoSerial.d [new file with mode: 0644]
firmware/USBtoSerial.eep [new file with mode: 0644]
firmware/USBtoSerial.elf [new file with mode: 0755]
firmware/USBtoSerial.h [new file with mode: 0644]
firmware/USBtoSerial.hex [new file with mode: 0644]
firmware/USBtoSerial.lss [new file with mode: 0644]
firmware/USBtoSerial.map [new file with mode: 0644]
firmware/USBtoSerial.o [new file with mode: 0644]
firmware/USBtoSerial.sym [new file with mode: 0644]
firmware/USBtoSerial.txt [new file with mode: 0644]
firmware/asf.xml [new file with mode: 0644]
firmware/makefile [new file with mode: 0644]
firmware/makefile~ [new file with mode: 0644]
firmware/rfm70.c [new file with mode: 0644]
firmware/rfm70.h [new file with mode: 0644]

diff --git a/firmware/Config/LUFAConfig.h b/firmware/Config/LUFAConfig.h
new file mode 100644 (file)
index 0000000..3fbf1f1
--- /dev/null
@@ -0,0 +1,93 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2013.\r
+\r
+  dean [at] fourwalledcubicle [dot] com\r
+           www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+  Copyright 2013  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this\r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in\r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting\r
+  documentation, and that the name of the author not be used in\r
+  advertising or publicity pertaining to distribution of the\r
+  software without specific, written prior permission.\r
+\r
+  The author disclaims all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+/** \file\r
+ *  \brief LUFA Library Configuration Header File\r
+ *\r
+ *  This header file is used to configure LUFA's compile time options,\r
+ *  as an alternative to the compile time constants supplied through\r
+ *  a makefile.\r
+ *\r
+ *  For information on what each token does, refer to the LUFA\r
+ *  manual section "Summary of Compile Tokens".\r
+ */\r
+\r
+#ifndef _LUFA_CONFIG_H_\r
+#define _LUFA_CONFIG_H_\r
+\r
+       #if (ARCH == ARCH_AVR8)\r
+\r
+               /* Non-USB Related Configuration Tokens: */\r
+//             #define DISABLE_TERMINAL_CODES\r
+\r
+               /* USB Class Driver Related Tokens: */\r
+//             #define HID_HOST_BOOT_PROTOCOL_ONLY\r
+//             #define HID_STATETABLE_STACK_DEPTH       {Insert Value Here}\r
+//             #define HID_USAGE_STACK_DEPTH            {Insert Value Here}\r
+//             #define HID_MAX_COLLECTIONS              {Insert Value Here}\r
+//             #define HID_MAX_REPORTITEMS              {Insert Value Here}\r
+//             #define HID_MAX_REPORT_IDS               {Insert Value Here}\r
+//             #define NO_CLASS_DRIVER_AUTOFLUSH\r
+\r
+               /* General USB Driver Related Tokens: */\r
+//             #define ORDERED_EP_CONFIG\r
+               #define USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)\r
+               #define USB_DEVICE_ONLY\r
+//             #define USB_HOST_ONLY\r
+//             #define USB_STREAM_TIMEOUT_MS            {Insert Value Here}\r
+//             #define NO_LIMITED_CONTROLLER_CONNECT\r
+//             #define NO_SOF_EVENTS\r
+\r
+               /* USB Device Mode Driver Related Tokens: */\r
+//             #define USE_RAM_DESCRIPTORS\r
+               #define USE_FLASH_DESCRIPTORS\r
+//             #define USE_EEPROM_DESCRIPTORS\r
+//             #define NO_INTERNAL_SERIAL\r
+               #define FIXED_CONTROL_ENDPOINT_SIZE      8\r
+               #define DEVICE_STATE_AS_GPIOR            0\r
+               #define FIXED_NUM_CONFIGURATIONS         1\r
+//             #define CONTROL_ONLY_DEVICE\r
+               #define INTERRUPT_CONTROL_ENDPOINT\r
+//             #define NO_DEVICE_REMOTE_WAKEUP\r
+//             #define NO_DEVICE_SELF_POWER\r
+\r
+               /* USB Host Mode Driver Related Tokens: */\r
+//             #define HOST_STATE_AS_GPIOR              0\r
+//             #define USB_HOST_TIMEOUT_MS              {Insert Value Here}\r
+//             #define HOST_DEVICE_SETTLE_DELAY_MS          {Insert Value Here}\r
+//             #define NO_AUTO_VBUS_MANAGEMENT\r
+//             #define INVERTED_VBUS_ENABLE_LINE\r
+\r
+       #else\r
+\r
+               #error Unsupported architecture for this LUFA configuration file.\r
+\r
+       #endif\r
+#endif\r
diff --git a/firmware/Descriptors.c b/firmware/Descriptors.c
new file mode 100644 (file)
index 0000000..765b281
--- /dev/null
@@ -0,0 +1,260 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2013.\r
+\r
+  dean [at] fourwalledcubicle [dot] com\r
+           www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+  Copyright 2013  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this\r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in\r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting\r
+  documentation, and that the name of the author not be used in\r
+  advertising or publicity pertaining to distribution of the\r
+  software without specific, written prior permission.\r
+\r
+  The author disclaims all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+/** \file\r
+ *\r
+ *  USB Device Descriptors, for library use when in USB device mode. Descriptors are special\r
+ *  computer-readable structures which the host requests upon device enumeration, to determine\r
+ *  the device's capabilities and functions.\r
+ */\r
+\r
+#include "Descriptors.h"\r
+\r
+\r
+/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall\r
+ *  device characteristics, including the supported USB version, control endpoint size and the\r
+ *  number of device configurations. The descriptor is read out by the USB host when the enumeration\r
+ *  process begins.\r
+ */\r
+const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =\r
+{\r
+       .Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},\r
+\r
+       .USBSpecification       = VERSION_BCD(01.10),\r
+       .Class                  = CDC_CSCP_CDCClass,\r
+       .SubClass               = CDC_CSCP_NoSpecificSubclass,\r
+       .Protocol               = CDC_CSCP_NoSpecificProtocol,\r
+\r
+       .Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE,\r
+\r
+       .VendorID               = 0x03EB,\r
+       .ProductID              = 0x204B,\r
+       .ReleaseNumber          = VERSION_BCD(00.01),\r
+\r
+       .ManufacturerStrIndex   = 0x01,\r
+       .ProductStrIndex        = 0x02,\r
+       .SerialNumStrIndex      = USE_INTERNAL_SERIAL,\r
+\r
+       .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS\r
+};\r
+\r
+/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage\r
+ *  of the device in one of its supported configurations, including information about any device interfaces\r
+ *  and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting\r
+ *  a configuration so that the host may correctly communicate with the USB device.\r
+ */\r
+const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =\r
+{\r
+       .Config =\r
+               {\r
+                       .Header                 = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},\r
+\r
+                       .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t),\r
+                       .TotalInterfaces        = 2,\r
+\r
+                       .ConfigurationNumber    = 1,\r
+                       .ConfigurationStrIndex  = NO_DESCRIPTOR,\r
+\r
+                       .ConfigAttributes       = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_SELFPOWERED),\r
+\r
+                       .MaxPowerConsumption    = USB_CONFIG_POWER_MA(100)\r
+               },\r
+\r
+       .CDC_CCI_Interface =\r
+               {\r
+                       .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},\r
+\r
+                       .InterfaceNumber        = 0,\r
+                       .AlternateSetting       = 0,\r
+\r
+                       .TotalEndpoints         = 1,\r
+\r
+                       .Class                  = CDC_CSCP_CDCClass,\r
+                       .SubClass               = CDC_CSCP_ACMSubclass,\r
+                       .Protocol               = CDC_CSCP_ATCommandProtocol,\r
+\r
+                       .InterfaceStrIndex      = NO_DESCRIPTOR\r
+               },\r
+\r
+       .CDC_Functional_Header =\r
+               {\r
+                       .Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface},\r
+                       .Subtype                = CDC_DSUBTYPE_CSInterface_Header,\r
+\r
+                       .CDCSpecification       = VERSION_BCD(01.10),\r
+               },\r
+\r
+       .CDC_Functional_ACM =\r
+               {\r
+                       .Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface},\r
+                       .Subtype                = CDC_DSUBTYPE_CSInterface_ACM,\r
+\r
+                       .Capabilities           = 0x06,\r
+               },\r
+\r
+       .CDC_Functional_Union =\r
+               {\r
+                       .Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface},\r
+                       .Subtype                = CDC_DSUBTYPE_CSInterface_Union,\r
+\r
+                       .MasterInterfaceNumber  = 0,\r
+                       .SlaveInterfaceNumber   = 1,\r
+               },\r
+\r
+       .CDC_NotificationEndpoint =\r
+               {\r
+                       .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},\r
+\r
+                       .EndpointAddress        = CDC_NOTIFICATION_EPADDR,\r
+                       .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),\r
+                       .EndpointSize           = CDC_NOTIFICATION_EPSIZE,\r
+                       .PollingIntervalMS      = 0xFF\r
+               },\r
+\r
+       .CDC_DCI_Interface =\r
+               {\r
+                       .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},\r
+\r
+                       .InterfaceNumber        = 1,\r
+                       .AlternateSetting       = 0,\r
+\r
+                       .TotalEndpoints         = 2,\r
+\r
+                       .Class                  = CDC_CSCP_CDCDataClass,\r
+                       .SubClass               = CDC_CSCP_NoDataSubclass,\r
+                       .Protocol               = CDC_CSCP_NoDataProtocol,\r
+\r
+                       .InterfaceStrIndex      = NO_DESCRIPTOR\r
+               },\r
+\r
+       .CDC_DataOutEndpoint =\r
+               {\r
+                       .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},\r
+\r
+                       .EndpointAddress        = CDC_RX_EPADDR,\r
+                       .Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),\r
+                       .EndpointSize           = CDC_TXRX_EPSIZE,\r
+                       .PollingIntervalMS      = 0x05\r
+               },\r
+\r
+       .CDC_DataInEndpoint =\r
+               {\r
+                       .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},\r
+\r
+                       .EndpointAddress        = CDC_TX_EPADDR,\r
+                       .Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),\r
+                       .EndpointSize           = CDC_TXRX_EPSIZE,\r
+                       .PollingIntervalMS      = 0x05\r
+               }\r
+};\r
+\r
+/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests\r
+ *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate\r
+ *  via the language ID table available at USB.org what languages the device supports for its string descriptors.\r
+ */\r
+const USB_Descriptor_String_t PROGMEM LanguageString =\r
+{\r
+       .Header                 = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String},\r
+\r
+       .UnicodeString          = {LANGUAGE_ID_ENG}\r
+};\r
+\r
+/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable\r
+ *  form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device\r
+ *  Descriptor.\r
+ */\r
+const USB_Descriptor_String_t PROGMEM ManufacturerString =\r
+{\r
+       .Header                 = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String},\r
+\r
+       .UnicodeString          = L"Dean Camera"\r
+};\r
+\r
+/** Product descriptor string. This is a Unicode string containing the product's details in human readable form,\r
+ *  and is read out upon request by the host when the appropriate string ID is requested, listed in the Device\r
+ *  Descriptor.\r
+ */\r
+const USB_Descriptor_String_t PROGMEM ProductString =\r
+{\r
+       .Header                 = {.Size = USB_STRING_LEN(22), .Type = DTYPE_String},\r
+\r
+       .UnicodeString          = L"LUFA USB-RS232 Adapter"\r
+};\r
+\r
+/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"\r
+ *  documentation) by the application code so that the address and size of a requested descriptor can be given\r
+ *  to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function\r
+ *  is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the\r
+ *  USB host.\r
+ */\r
+uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,\r
+                                    const uint8_t wIndex,\r
+                                    const void** const DescriptorAddress)\r
+{\r
+       const uint8_t  DescriptorType   = (wValue >> 8);\r
+       const uint8_t  DescriptorNumber = (wValue & 0xFF);\r
+\r
+       const void* Address = NULL;\r
+       uint16_t    Size    = NO_DESCRIPTOR;\r
+\r
+       switch (DescriptorType)\r
+       {\r
+               case DTYPE_Device:\r
+                       Address = &DeviceDescriptor;\r
+                       Size    = sizeof(USB_Descriptor_Device_t);\r
+                       break;\r
+               case DTYPE_Configuration:\r
+                       Address = &ConfigurationDescriptor;\r
+                       Size    = sizeof(USB_Descriptor_Configuration_t);\r
+                       break;\r
+               case DTYPE_String:\r
+                       switch (DescriptorNumber)\r
+                       {\r
+                               case 0x00:\r
+                                       Address = &LanguageString;\r
+                                       Size    = pgm_read_byte(&LanguageString.Header.Size);\r
+                                       break;\r
+                               case 0x01:\r
+                                       Address = &ManufacturerString;\r
+                                       Size    = pgm_read_byte(&ManufacturerString.Header.Size);\r
+                                       break;\r
+                               case 0x02:\r
+                                       Address = &ProductString;\r
+                                       Size    = pgm_read_byte(&ProductString.Header.Size);\r
+                                       break;\r
+                       }\r
+\r
+                       break;\r
+       }\r
+\r
+       *DescriptorAddress = Address;\r
+       return Size;\r
+}\r
+\r
diff --git a/firmware/Descriptors.d b/firmware/Descriptors.d
new file mode 100644 (file)
index 0000000..6168db3
--- /dev/null
@@ -0,0 +1,270 @@
+Descriptors.o: Descriptors.c Descriptors.h \
+ ../../LUFA/../LUFA/Drivers/USB/USB.h \
+ ../../LUFA/../LUFA/Drivers/USB/../../Common/Common.h \
+ ../../LUFA/../LUFA/Drivers/USB/../../Common/Architectures.h \
+ ../../LUFA/../LUFA/Drivers/USB/../../Common/BoardTypes.h \
+ ../../LUFA/../LUFA/Drivers/USB/../../Common/ArchitectureSpecific.h \
+ ../../LUFA/../LUFA/Drivers/USB/../../Common/CompilerSpecific.h \
+ ../../LUFA/../LUFA/Drivers/USB/../../Common/Attributes.h \
+ Config/LUFAConfig.h \
+ ../../LUFA/../LUFA/Drivers/USB/../../Common/Endianness.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/USBMode.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/../../../Common/Common.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/USBTask.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/USBMode.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/USBController.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../../../../Common/Common.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBMode.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Events.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../../../../Common/Common.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBMode.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBTask.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBInterrupt.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/USBInterrupt_AVR8.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../../../../Common/Common.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../USBMode.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../Events.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../USBController.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Device.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../StdDescriptors.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Events.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBInterrupt.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Endpoint.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/Endpoint_AVR8.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../USBTask.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../USBInterrupt.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/Device_AVR8.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../StdDescriptors.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../Endpoint.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Endpoint.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../DeviceStandardReq.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../StdRequestType.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBTask.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBController.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../EndpointStream.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/EndpointStream_AVR8.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/Events.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/StdRequestType.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/StdDescriptors.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/DeviceStandardReq.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/Events.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/StdDescriptors.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/ConfigDescriptors.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/HostStandardReq.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/USBController.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/USBInterrupt.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/Device.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/Endpoint.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/DeviceStandardReq.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/EndpointStream.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/AndroidAccessoryClass.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/../Core/USBMode.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/AudioClass.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/AudioClassDevice.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../../USB.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/AudioClassCommon.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/../../Core/StdDescriptors.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/CDCClass.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/CDCClassDevice.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/CDCClassCommon.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/HIDClass.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/HIDClassDevice.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/HIDClassCommon.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/HIDParser.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/../../../../Common/Common.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/HIDReportData.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/HIDClassCommon.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/MassStorageClass.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/MassStorageClassCommon.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/MIDIClass.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/MIDIClassCommon.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/AudioClassCommon.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/PrinterClass.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/RNDISClass.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/RNDISClassCommon.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/CDCClassCommon.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/StillImageClass.h
+
+Descriptors.h:
+
+../../LUFA/../LUFA/Drivers/USB/USB.h:
+
+../../LUFA/../LUFA/Drivers/USB/../../Common/Common.h:
+
+../../LUFA/../LUFA/Drivers/USB/../../Common/Architectures.h:
+
+../../LUFA/../LUFA/Drivers/USB/../../Common/BoardTypes.h:
+
+../../LUFA/../LUFA/Drivers/USB/../../Common/ArchitectureSpecific.h:
+
+../../LUFA/../LUFA/Drivers/USB/../../Common/CompilerSpecific.h:
+
+../../LUFA/../LUFA/Drivers/USB/../../Common/Attributes.h:
+
+Config/LUFAConfig.h:
+
+../../LUFA/../LUFA/Drivers/USB/../../Common/Endianness.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/USBMode.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/../../../Common/Common.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/USBTask.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/USBMode.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/USBController.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../../../../Common/Common.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBMode.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Events.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../../../../Common/Common.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBMode.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBTask.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBInterrupt.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/USBInterrupt_AVR8.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../../../../Common/Common.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../USBMode.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../Events.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../USBController.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Device.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../StdDescriptors.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Events.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBInterrupt.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Endpoint.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/Endpoint_AVR8.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../USBTask.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../USBInterrupt.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/Device_AVR8.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../StdDescriptors.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../Endpoint.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Endpoint.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../DeviceStandardReq.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../StdRequestType.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBTask.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBController.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../EndpointStream.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/EndpointStream_AVR8.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/Events.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/StdRequestType.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/StdDescriptors.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/DeviceStandardReq.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/Events.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/StdDescriptors.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/ConfigDescriptors.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/HostStandardReq.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/USBController.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/USBInterrupt.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/Device.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/Endpoint.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/DeviceStandardReq.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/EndpointStream.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/AndroidAccessoryClass.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/../Core/USBMode.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/AudioClass.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/AudioClassDevice.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../../USB.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/AudioClassCommon.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/../../Core/StdDescriptors.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/CDCClass.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/CDCClassDevice.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/CDCClassCommon.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/HIDClass.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/HIDClassDevice.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/HIDClassCommon.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/HIDParser.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/../../../../Common/Common.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/HIDReportData.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/HIDClassCommon.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/MassStorageClass.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/MassStorageClassCommon.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/MIDIClass.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/MIDIClassCommon.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/AudioClassCommon.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/PrinterClass.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/RNDISClass.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/RNDISClassCommon.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/CDCClassCommon.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/StillImageClass.h:
diff --git a/firmware/Descriptors.h b/firmware/Descriptors.h
new file mode 100644 (file)
index 0000000..b237a79
--- /dev/null
@@ -0,0 +1,89 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2013.\r
+\r
+  dean [at] fourwalledcubicle [dot] com\r
+           www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+  Copyright 2013  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this\r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in\r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting\r
+  documentation, and that the name of the author not be used in\r
+  advertising or publicity pertaining to distribution of the\r
+  software without specific, written prior permission.\r
+\r
+  The author disclaims all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+/** \file\r
+ *\r
+ *  Header file for Descriptors.c.\r
+ */\r
+\r
+#ifndef _DESCRIPTORS_H_\r
+#define _DESCRIPTORS_H_\r
+\r
+       /* Includes: */\r
+               #include <avr/pgmspace.h>\r
+\r
+               #include <LUFA/Drivers/USB/USB.h>\r
+\r
+       /* Macros: */\r
+               /** Endpoint address of the CDC device-to-host notification IN endpoint. */\r
+               #define CDC_NOTIFICATION_EPADDR        (ENDPOINT_DIR_IN  | 2)\r
+\r
+               /** Endpoint address of the CDC device-to-host data IN endpoint. */\r
+               #define CDC_TX_EPADDR                  (ENDPOINT_DIR_IN  | 3)\r
+\r
+               /** Endpoint address of the CDC host-to-device data OUT endpoint. */\r
+               #define CDC_RX_EPADDR                  (ENDPOINT_DIR_OUT | 4)\r
+\r
+               /** Size in bytes of the CDC device-to-host notification IN endpoint. */\r
+               #define CDC_NOTIFICATION_EPSIZE        8\r
+\r
+               /** Size in bytes of the CDC data IN and OUT endpoints. */\r
+               #define CDC_TXRX_EPSIZE                16\r
+\r
+       /* Type Defines: */\r
+               /** Type define for the device configuration descriptor structure. This must be defined in the\r
+                *  application code, as the configuration descriptor contains several sub-descriptors which\r
+                *  vary between devices, and which describe the device's usage to the host.\r
+                */\r
+               typedef struct\r
+               {\r
+                       USB_Descriptor_Configuration_Header_t    Config;\r
+\r
+                       // CDC Command Interface\r
+                       USB_Descriptor_Interface_t               CDC_CCI_Interface;\r
+                       USB_CDC_Descriptor_FunctionalHeader_t    CDC_Functional_Header;\r
+                       USB_CDC_Descriptor_FunctionalACM_t       CDC_Functional_ACM;\r
+                       USB_CDC_Descriptor_FunctionalUnion_t     CDC_Functional_Union;\r
+                       USB_Descriptor_Endpoint_t                CDC_NotificationEndpoint;\r
+\r
+                       // CDC Data Interface\r
+                       USB_Descriptor_Interface_t               CDC_DCI_Interface;\r
+                       USB_Descriptor_Endpoint_t                CDC_DataOutEndpoint;\r
+                       USB_Descriptor_Endpoint_t                CDC_DataInEndpoint;\r
+               } USB_Descriptor_Configuration_t;\r
+\r
+       /* Function Prototypes: */\r
+               uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,\r
+                                                   const uint8_t wIndex,\r
+                                                   const void** const DescriptorAddress)\r
+                                                   ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);\r
+\r
+#endif\r
+\r
diff --git a/firmware/Descriptors.o b/firmware/Descriptors.o
new file mode 100644 (file)
index 0000000..11ded1e
Binary files /dev/null and b/firmware/Descriptors.o differ
diff --git a/firmware/Doxygen.conf b/firmware/Doxygen.conf
new file mode 100644 (file)
index 0000000..cce7bd1
--- /dev/null
@@ -0,0 +1,1883 @@
+# Doxyfile 1.8.3.1\r
+\r
+# This file describes the settings to be used by the documentation system\r
+# doxygen (www.doxygen.org) for a project.\r
+#\r
+# All text after a hash (#) is considered a comment and will be ignored.\r
+# The format is:\r
+#       TAG = value [value, ...]\r
+# For lists items can also be appended using:\r
+#       TAG += value [value, ...]\r
+# Values that contain spaces should be placed between quotes (" ").\r
+\r
+#---------------------------------------------------------------------------\r
+# Project related configuration options\r
+#---------------------------------------------------------------------------\r
+\r
+# This tag specifies the encoding used for all characters in the config file\r
+# that follow. The default is UTF-8 which is also the encoding used for all\r
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the\r
+# iconv built into libc) for the transcoding. See\r
+# http://www.gnu.org/software/libiconv for the list of possible encodings.\r
+\r
+DOXYFILE_ENCODING      = UTF-8\r
+\r
+# The PROJECT_NAME tag is a single word (or sequence of words) that should\r
+# identify the project. Note that if you do not use Doxywizard you need\r
+# to put quotes around the project name if it contains spaces.\r
+\r
+PROJECT_NAME           = "LUFA Library - USB to Serial Device Project"\r
+\r
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.\r
+# This could be handy for archiving the generated documentation or\r
+# if some version control system is used.\r
+\r
+PROJECT_NUMBER         =\r
+\r
+# Using the PROJECT_BRIEF tag one can provide an optional one line description\r
+# for a project that appears at the top of each page and should give viewer\r
+# a quick idea about the purpose of the project. Keep the description short.\r
+\r
+PROJECT_BRIEF          =\r
+\r
+# With the PROJECT_LOGO tag one can specify an logo or icon that is\r
+# included in the documentation. The maximum height of the logo should not\r
+# exceed 55 pixels and the maximum width should not exceed 200 pixels.\r
+# Doxygen will copy the logo to the output directory.\r
+\r
+PROJECT_LOGO           =\r
+\r
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)\r
+# base path where the generated documentation will be put.\r
+# If a relative path is entered, it will be relative to the location\r
+# where doxygen was started. If left blank the current directory will be used.\r
+\r
+OUTPUT_DIRECTORY       = ./Documentation/\r
+\r
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create\r
+# 4096 sub-directories (in 2 levels) under the output directory of each output\r
+# format and will distribute the generated files over these directories.\r
+# Enabling this option can be useful when feeding doxygen a huge amount of\r
+# source files, where putting all generated files in the same directory would\r
+# otherwise cause performance problems for the file system.\r
+\r
+CREATE_SUBDIRS         = NO\r
+\r
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all\r
+# documentation generated by doxygen is written. Doxygen will use this\r
+# information to generate all constant output in the proper language.\r
+# The default language is English, other supported languages are:\r
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,\r
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,\r
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English\r
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,\r
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,\r
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.\r
+\r
+OUTPUT_LANGUAGE        = English\r
+\r
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will\r
+# include brief member descriptions after the members that are listed in\r
+# the file and class documentation (similar to JavaDoc).\r
+# Set to NO to disable this.\r
+\r
+BRIEF_MEMBER_DESC      = YES\r
+\r
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend\r
+# the brief description of a member or function before the detailed description.\r
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\r
+# brief descriptions will be completely suppressed.\r
+\r
+REPEAT_BRIEF           = YES\r
+\r
+# This tag implements a quasi-intelligent brief description abbreviator\r
+# that is used to form the text in various listings. Each string\r
+# in this list, if found as the leading text of the brief description, will be\r
+# stripped from the text and the result after processing the whole list, is\r
+# used as the annotated text. Otherwise, the brief description is used as-is.\r
+# If left blank, the following values are used ("$name" is automatically\r
+# replaced with the name of the entity): "The $name class" "The $name widget"\r
+# "The $name file" "is" "provides" "specifies" "contains"\r
+# "represents" "a" "an" "the"\r
+\r
+ABBREVIATE_BRIEF       = "The $name class" \\r
+                         "The $name widget" \\r
+                         "The $name file" \\r
+                         is \\r
+                         provides \\r
+                         specifies \\r
+                         contains \\r
+                         represents \\r
+                         a \\r
+                         an \\r
+                         the\r
+\r
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\r
+# Doxygen will generate a detailed section even if there is only a brief\r
+# description.\r
+\r
+ALWAYS_DETAILED_SEC    = NO\r
+\r
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all\r
+# inherited members of a class in the documentation of that class as if those\r
+# members were ordinary class members. Constructors, destructors and assignment\r
+# operators of the base classes will not be shown.\r
+\r
+INLINE_INHERITED_MEMB  = NO\r
+\r
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full\r
+# path before files name in the file list and in the header files. If set\r
+# to NO the shortest path that makes the file name unique will be used.\r
+\r
+FULL_PATH_NAMES        = YES\r
+\r
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag\r
+# can be used to strip a user-defined part of the path. Stripping is\r
+# only done if one of the specified strings matches the left-hand part of\r
+# the path. The tag can be used to show relative paths in the file list.\r
+# If left blank the directory from which doxygen is run is used as the\r
+# path to strip. Note that you specify absolute paths here, but also\r
+# relative paths, which will be relative from the directory where doxygen is\r
+# started.\r
+\r
+STRIP_FROM_PATH        =\r
+\r
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of\r
+# the path mentioned in the documentation of a class, which tells\r
+# the reader which header file to include in order to use a class.\r
+# If left blank only the name of the header file containing the class\r
+# definition is used. Otherwise one should specify the include paths that\r
+# are normally passed to the compiler using the -I flag.\r
+\r
+STRIP_FROM_INC_PATH    =\r
+\r
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter\r
+# (but less readable) file names. This can be useful if your file system\r
+# doesn't support long names like on DOS, Mac, or CD-ROM.\r
+\r
+SHORT_NAMES            = YES\r
+\r
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen\r
+# will interpret the first line (until the first dot) of a JavaDoc-style\r
+# comment as the brief description. If set to NO, the JavaDoc\r
+# comments will behave just like regular Qt-style comments\r
+# (thus requiring an explicit @brief command for a brief description.)\r
+\r
+JAVADOC_AUTOBRIEF      = NO\r
+\r
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will\r
+# interpret the first line (until the first dot) of a Qt-style\r
+# comment as the brief description. If set to NO, the comments\r
+# will behave just like regular Qt-style comments (thus requiring\r
+# an explicit \brief command for a brief description.)\r
+\r
+QT_AUTOBRIEF           = NO\r
+\r
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen\r
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///\r
+# comments) as a brief description. This used to be the default behaviour.\r
+# The new default is to treat a multi-line C++ comment block as a detailed\r
+# description. Set this tag to YES if you prefer the old behaviour instead.\r
+\r
+MULTILINE_CPP_IS_BRIEF = NO\r
+\r
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented\r
+# member inherits the documentation from any documented member that it\r
+# re-implements.\r
+\r
+INHERIT_DOCS           = YES\r
+\r
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce\r
+# a new page for each member. If set to NO, the documentation of a member will\r
+# be part of the file/class/namespace that contains it.\r
+\r
+SEPARATE_MEMBER_PAGES  = NO\r
+\r
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.\r
+# Doxygen uses this value to replace tabs by spaces in code fragments.\r
+\r
+TAB_SIZE               = 4\r
+\r
+# This tag can be used to specify a number of aliases that acts\r
+# as commands in the documentation. An alias has the form "name=value".\r
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to\r
+# put the command \sideeffect (or @sideeffect) in the documentation, which\r
+# will result in a user-defined paragraph with heading "Side Effects:".\r
+# You can put \n's in the value part of an alias to insert newlines.\r
+\r
+ALIASES                =\r
+\r
+# This tag can be used to specify a number of word-keyword mappings (TCL only).\r
+# A mapping has the form "name=value". For example adding\r
+# "class=itcl::class" will allow you to use the command class in the\r
+# itcl::class meaning.\r
+\r
+TCL_SUBST              =\r
+\r
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C\r
+# sources only. Doxygen will then generate output that is more tailored for C.\r
+# For instance, some of the names that are used will be different. The list\r
+# of all members will be omitted, etc.\r
+\r
+OPTIMIZE_OUTPUT_FOR_C  = YES\r
+\r
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java\r
+# sources only. Doxygen will then generate output that is more tailored for\r
+# Java. For instance, namespaces will be presented as packages, qualified\r
+# scopes will look different, etc.\r
+\r
+OPTIMIZE_OUTPUT_JAVA   = NO\r
+\r
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran\r
+# sources only. Doxygen will then generate output that is more tailored for\r
+# Fortran.\r
+\r
+OPTIMIZE_FOR_FORTRAN   = NO\r
+\r
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL\r
+# sources. Doxygen will then generate output that is tailored for\r
+# VHDL.\r
+\r
+OPTIMIZE_OUTPUT_VHDL   = NO\r
+\r
+# Doxygen selects the parser to use depending on the extension of the files it\r
+# parses. With this tag you can assign which parser to use for a given\r
+# extension. Doxygen has a built-in mapping, but you can override or extend it\r
+# using this tag. The format is ext=language, where ext is a file extension,\r
+# and language is one of the parsers supported by doxygen: IDL, Java,\r
+# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C,\r
+# C++. For instance to make doxygen treat .inc files as Fortran files (default\r
+# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note\r
+# that for custom extensions you also need to set FILE_PATTERNS otherwise the\r
+# files are not read by doxygen.\r
+\r
+EXTENSION_MAPPING      =\r
+\r
+# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all\r
+# comments according to the Markdown format, which allows for more readable\r
+# documentation. See http://daringfireball.net/projects/markdown/ for details.\r
+# The output of markdown processing is further processed by doxygen, so you\r
+# can mix doxygen, HTML, and XML commands with Markdown formatting.\r
+# Disable only in case of backward compatibilities issues.\r
+\r
+MARKDOWN_SUPPORT       = NO\r
+\r
+# When enabled doxygen tries to link words that correspond to documented classes,\r
+# or namespaces to their corresponding documentation. Such a link can be\r
+# prevented in individual cases by by putting a % sign in front of the word or\r
+# globally by setting AUTOLINK_SUPPORT to NO.\r
+\r
+AUTOLINK_SUPPORT       = YES\r
+\r
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want\r
+# to include (a tag file for) the STL sources as input, then you should\r
+# set this tag to YES in order to let doxygen match functions declarations and\r
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.\r
+# func(std::string) {}). This also makes the inheritance and collaboration\r
+# diagrams that involve STL classes more complete and accurate.\r
+\r
+BUILTIN_STL_SUPPORT    = NO\r
+\r
+# If you use Microsoft's C++/CLI language, you should set this option to YES to\r
+# enable parsing support.\r
+\r
+CPP_CLI_SUPPORT        = NO\r
+\r
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.\r
+# Doxygen will parse them like normal C++ but will assume all classes use public\r
+# instead of private inheritance when no explicit protection keyword is present.\r
+\r
+SIP_SUPPORT            = NO\r
+\r
+# For Microsoft's IDL there are propget and propput attributes to indicate\r
+# getter and setter methods for a property. Setting this option to YES (the\r
+# default) will make doxygen replace the get and set methods by a property in\r
+# the documentation. This will only work if the methods are indeed getting or\r
+# setting a simple type. If this is not the case, or you want to show the\r
+# methods anyway, you should set this option to NO.\r
+\r
+IDL_PROPERTY_SUPPORT   = YES\r
+\r
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC\r
+# tag is set to YES, then doxygen will reuse the documentation of the first\r
+# member in the group (if any) for the other members of the group. By default\r
+# all members of a group must be documented explicitly.\r
+\r
+DISTRIBUTE_GROUP_DOC   = NO\r
+\r
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of\r
+# the same type (for instance a group of public functions) to be put as a\r
+# subgroup of that type (e.g. under the Public Functions section). Set it to\r
+# NO to prevent subgrouping. Alternatively, this can be done per class using\r
+# the \nosubgrouping command.\r
+\r
+SUBGROUPING            = YES\r
+\r
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and\r
+# unions are shown inside the group in which they are included (e.g. using\r
+# @ingroup) instead of on a separate page (for HTML and Man pages) or\r
+# section (for LaTeX and RTF).\r
+\r
+INLINE_GROUPED_CLASSES = NO\r
+\r
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and\r
+# unions with only public data fields will be shown inline in the documentation\r
+# of the scope in which they are defined (i.e. file, namespace, or group\r
+# documentation), provided this scope is documented. If set to NO (the default),\r
+# structs, classes, and unions are shown on a separate page (for HTML and Man\r
+# pages) or section (for LaTeX and RTF).\r
+\r
+INLINE_SIMPLE_STRUCTS  = NO\r
+\r
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum\r
+# is documented as struct, union, or enum with the name of the typedef. So\r
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct\r
+# with name TypeT. When disabled the typedef will appear as a member of a file,\r
+# namespace, or class. And the struct will be named TypeS. This can typically\r
+# be useful for C code in case the coding convention dictates that all compound\r
+# types are typedef'ed and only the typedef is referenced, never the tag name.\r
+\r
+TYPEDEF_HIDES_STRUCT   = NO\r
+\r
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to\r
+# determine which symbols to keep in memory and which to flush to disk.\r
+# When the cache is full, less often used symbols will be written to disk.\r
+# For small to medium size projects (<1000 input files) the default value is\r
+# probably good enough. For larger projects a too small cache size can cause\r
+# doxygen to be busy swapping symbols to and from disk most of the time\r
+# causing a significant performance penalty.\r
+# If the system has enough physical memory increasing the cache will improve the\r
+# performance by keeping more symbols in memory. Note that the value works on\r
+# a logarithmic scale so increasing the size by one will roughly double the\r
+# memory usage. The cache size is given by this formula:\r
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,\r
+# corresponding to a cache size of 2^16 = 65536 symbols.\r
+\r
+SYMBOL_CACHE_SIZE      = 0\r
+\r
+# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be\r
+# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given\r
+# their name and scope. Since this can be an expensive process and often the\r
+# same symbol appear multiple times in the code, doxygen keeps a cache of\r
+# pre-resolved symbols. If the cache is too small doxygen will become slower.\r
+# If the cache is too large, memory is wasted. The cache size is given by this\r
+# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0,\r
+# corresponding to a cache size of 2^16 = 65536 symbols.\r
+\r
+LOOKUP_CACHE_SIZE      = 0\r
+\r
+#---------------------------------------------------------------------------\r
+# Build related configuration options\r
+#---------------------------------------------------------------------------\r
+\r
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in\r
+# documentation are documented, even if no documentation was available.\r
+# Private class members and static file members will be hidden unless\r
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES\r
+\r
+EXTRACT_ALL            = YES\r
+\r
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class\r
+# will be included in the documentation.\r
+\r
+EXTRACT_PRIVATE        = YES\r
+\r
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal\r
+# scope will be included in the documentation.\r
+\r
+EXTRACT_PACKAGE        = NO\r
+\r
+# If the EXTRACT_STATIC tag is set to YES all static members of a file\r
+# will be included in the documentation.\r
+\r
+EXTRACT_STATIC         = YES\r
+\r
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)\r
+# defined locally in source files will be included in the documentation.\r
+# If set to NO only classes defined in header files are included.\r
+\r
+EXTRACT_LOCAL_CLASSES  = YES\r
+\r
+# This flag is only useful for Objective-C code. When set to YES local\r
+# methods, which are defined in the implementation section but not in\r
+# the interface are included in the documentation.\r
+# If set to NO (the default) only methods in the interface are included.\r
+\r
+EXTRACT_LOCAL_METHODS  = NO\r
+\r
+# If this flag is set to YES, the members of anonymous namespaces will be\r
+# extracted and appear in the documentation as a namespace called\r
+# 'anonymous_namespace{file}', where file will be replaced with the base\r
+# name of the file that contains the anonymous namespace. By default\r
+# anonymous namespaces are hidden.\r
+\r
+EXTRACT_ANON_NSPACES   = NO\r
+\r
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all\r
+# undocumented members of documented classes, files or namespaces.\r
+# If set to NO (the default) these members will be included in the\r
+# various overviews, but no documentation section is generated.\r
+# This option has no effect if EXTRACT_ALL is enabled.\r
+\r
+HIDE_UNDOC_MEMBERS     = NO\r
+\r
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all\r
+# undocumented classes that are normally visible in the class hierarchy.\r
+# If set to NO (the default) these classes will be included in the various\r
+# overviews. This option has no effect if EXTRACT_ALL is enabled.\r
+\r
+HIDE_UNDOC_CLASSES     = NO\r
+\r
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all\r
+# friend (class|struct|union) declarations.\r
+# If set to NO (the default) these declarations will be included in the\r
+# documentation.\r
+\r
+HIDE_FRIEND_COMPOUNDS  = NO\r
+\r
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any\r
+# documentation blocks found inside the body of a function.\r
+# If set to NO (the default) these blocks will be appended to the\r
+# function's detailed documentation block.\r
+\r
+HIDE_IN_BODY_DOCS      = NO\r
+\r
+# The INTERNAL_DOCS tag determines if documentation\r
+# that is typed after a \internal command is included. If the tag is set\r
+# to NO (the default) then the documentation will be excluded.\r
+# Set it to YES to include the internal documentation.\r
+\r
+INTERNAL_DOCS          = NO\r
+\r
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate\r
+# file names in lower-case letters. If set to YES upper-case letters are also\r
+# allowed. This is useful if you have classes or files whose names only differ\r
+# in case and if your file system supports case sensitive file names. Windows\r
+# and Mac users are advised to set this option to NO.\r
+\r
+CASE_SENSE_NAMES       = NO\r
+\r
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen\r
+# will show members with their full class and namespace scopes in the\r
+# documentation. If set to YES the scope will be hidden.\r
+\r
+HIDE_SCOPE_NAMES       = NO\r
+\r
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen\r
+# will put a list of the files that are included by a file in the documentation\r
+# of that file.\r
+\r
+SHOW_INCLUDE_FILES     = YES\r
+\r
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen\r
+# will list include files with double quotes in the documentation\r
+# rather than with sharp brackets.\r
+\r
+FORCE_LOCAL_INCLUDES   = NO\r
+\r
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]\r
+# is inserted in the documentation for inline members.\r
+\r
+INLINE_INFO            = YES\r
+\r
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen\r
+# will sort the (detailed) documentation of file and class members\r
+# alphabetically by member name. If set to NO the members will appear in\r
+# declaration order.\r
+\r
+SORT_MEMBER_DOCS       = YES\r
+\r
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the\r
+# brief documentation of file, namespace and class members alphabetically\r
+# by member name. If set to NO (the default) the members will appear in\r
+# declaration order.\r
+\r
+SORT_BRIEF_DOCS        = NO\r
+\r
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen\r
+# will sort the (brief and detailed) documentation of class members so that\r
+# constructors and destructors are listed first. If set to NO (the default)\r
+# the constructors will appear in the respective orders defined by\r
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.\r
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO\r
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.\r
+\r
+SORT_MEMBERS_CTORS_1ST = NO\r
+\r
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the\r
+# hierarchy of group names into alphabetical order. If set to NO (the default)\r
+# the group names will appear in their defined order.\r
+\r
+SORT_GROUP_NAMES       = NO\r
+\r
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be\r
+# sorted by fully-qualified names, including namespaces. If set to\r
+# NO (the default), the class list will be sorted only by class name,\r
+# not including the namespace part.\r
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\r
+# Note: This option applies only to the class list, not to the\r
+# alphabetical list.\r
+\r
+SORT_BY_SCOPE_NAME     = NO\r
+\r
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to\r
+# do proper type resolution of all parameters of a function it will reject a\r
+# match between the prototype and the implementation of a member function even\r
+# if there is only one candidate or it is obvious which candidate to choose\r
+# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen\r
+# will still accept a match between prototype and implementation in such cases.\r
+\r
+STRICT_PROTO_MATCHING  = NO\r
+\r
+# The GENERATE_TODOLIST tag can be used to enable (YES) or\r
+# disable (NO) the todo list. This list is created by putting \todo\r
+# commands in the documentation.\r
+\r
+GENERATE_TODOLIST      = NO\r
+\r
+# The GENERATE_TESTLIST tag can be used to enable (YES) or\r
+# disable (NO) the test list. This list is created by putting \test\r
+# commands in the documentation.\r
+\r
+GENERATE_TESTLIST      = NO\r
+\r
+# The GENERATE_BUGLIST tag can be used to enable (YES) or\r
+# disable (NO) the bug list. This list is created by putting \bug\r
+# commands in the documentation.\r
+\r
+GENERATE_BUGLIST       = NO\r
+\r
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or\r
+# disable (NO) the deprecated list. This list is created by putting\r
+# \deprecated commands in the documentation.\r
+\r
+GENERATE_DEPRECATEDLIST= YES\r
+\r
+# The ENABLED_SECTIONS tag can be used to enable conditional\r
+# documentation sections, marked by \if section-label ... \endif\r
+# and \cond section-label ... \endcond blocks.\r
+\r
+ENABLED_SECTIONS       =\r
+\r
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines\r
+# the initial value of a variable or macro consists of for it to appear in\r
+# the documentation. If the initializer consists of more lines than specified\r
+# here it will be hidden. Use a value of 0 to hide initializers completely.\r
+# The appearance of the initializer of individual variables and macros in the\r
+# documentation can be controlled using \showinitializer or \hideinitializer\r
+# command in the documentation regardless of this setting.\r
+\r
+MAX_INITIALIZER_LINES  = 30\r
+\r
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated\r
+# at the bottom of the documentation of classes and structs. If set to YES the\r
+# list will mention the files that were used to generate the documentation.\r
+\r
+SHOW_USED_FILES        = YES\r
+\r
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.\r
+# This will remove the Files entry from the Quick Index and from the\r
+# Folder Tree View (if specified). The default is YES.\r
+\r
+SHOW_FILES             = YES\r
+\r
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the\r
+# Namespaces page.\r
+# This will remove the Namespaces entry from the Quick Index\r
+# and from the Folder Tree View (if specified). The default is YES.\r
+\r
+SHOW_NAMESPACES        = YES\r
+\r
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that\r
+# doxygen should invoke to get the current version for each file (typically from\r
+# the version control system). Doxygen will invoke the program by executing (via\r
+# popen()) the command <command> <input-file>, where <command> is the value of\r
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file\r
+# provided by doxygen. Whatever the program writes to standard output\r
+# is used as the file version. See the manual for examples.\r
+\r
+FILE_VERSION_FILTER    =\r
+\r
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed\r
+# by doxygen. The layout file controls the global structure of the generated\r
+# output files in an output format independent way. To create the layout file\r
+# that represents doxygen's defaults, run doxygen with the -l option.\r
+# You can optionally specify a file name after the option, if omitted\r
+# DoxygenLayout.xml will be used as the name of the layout file.\r
+\r
+LAYOUT_FILE            =\r
+\r
+# The CITE_BIB_FILES tag can be used to specify one or more bib files\r
+# containing the references data. This must be a list of .bib files. The\r
+# .bib extension is automatically appended if omitted. Using this command\r
+# requires the bibtex tool to be installed. See also\r
+# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style\r
+# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this\r
+# feature you need bibtex and perl available in the search path. Do not use\r
+# file names with spaces, bibtex cannot handle them.\r
+\r
+CITE_BIB_FILES         =\r
+\r
+#---------------------------------------------------------------------------\r
+# configuration options related to warning and progress messages\r
+#---------------------------------------------------------------------------\r
+\r
+# The QUIET tag can be used to turn on/off the messages that are generated\r
+# by doxygen. Possible values are YES and NO. If left blank NO is used.\r
+\r
+QUIET                  = YES\r
+\r
+# The WARNINGS tag can be used to turn on/off the warning messages that are\r
+# generated by doxygen. Possible values are YES and NO. If left blank\r
+# NO is used.\r
+\r
+WARNINGS               = YES\r
+\r
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings\r
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will\r
+# automatically be disabled.\r
+\r
+WARN_IF_UNDOCUMENTED   = YES\r
+\r
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for\r
+# potential errors in the documentation, such as not documenting some\r
+# parameters in a documented function, or documenting parameters that\r
+# don't exist or using markup commands wrongly.\r
+\r
+WARN_IF_DOC_ERROR      = YES\r
+\r
+# The WARN_NO_PARAMDOC option can be enabled to get warnings for\r
+# functions that are documented, but have no documentation for their parameters\r
+# or return value. If set to NO (the default) doxygen will only warn about\r
+# wrong or incomplete parameter documentation, but not about the absence of\r
+# documentation.\r
+\r
+WARN_NO_PARAMDOC       = YES\r
+\r
+# The WARN_FORMAT tag determines the format of the warning messages that\r
+# doxygen can produce. The string should contain the $file, $line, and $text\r
+# tags, which will be replaced by the file and line number from which the\r
+# warning originated and the warning text. Optionally the format may contain\r
+# $version, which will be replaced by the version of the file (if it could\r
+# be obtained via FILE_VERSION_FILTER)\r
+\r
+WARN_FORMAT            = "$file:$line: $text"\r
+\r
+# The WARN_LOGFILE tag can be used to specify a file to which warning\r
+# and error messages should be written. If left blank the output is written\r
+# to stderr.\r
+\r
+WARN_LOGFILE           =\r
+\r
+#---------------------------------------------------------------------------\r
+# configuration options related to the input files\r
+#---------------------------------------------------------------------------\r
+\r
+# The INPUT tag can be used to specify the files and/or directories that contain\r
+# documented source files. You may enter file names like "myfile.cpp" or\r
+# directories like "/usr/src/myproject". Separate the files or directories\r
+# with spaces.\r
+\r
+INPUT                  = ./\r
+\r
+# This tag can be used to specify the character encoding of the source files\r
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is\r
+# also the default input encoding. Doxygen uses libiconv (or the iconv built\r
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for\r
+# the list of possible encodings.\r
+\r
+INPUT_ENCODING         = UTF-8\r
+\r
+# If the value of the INPUT tag contains directories, you can use the\r
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\r
+# and *.h) to filter out the source-files in the directories. If left\r
+# blank the following patterns are tested:\r
+# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh\r
+# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py\r
+# *.f90 *.f *.for *.vhd *.vhdl\r
+\r
+FILE_PATTERNS          = *.h \\r
+                         *.c \\r
+                         *.txt\r
+\r
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories\r
+# should be searched for input files as well. Possible values are YES and NO.\r
+# If left blank NO is used.\r
+\r
+RECURSIVE              = YES\r
+\r
+# The EXCLUDE tag can be used to specify files and/or directories that should be\r
+# excluded from the INPUT source files. This way you can easily exclude a\r
+# subdirectory from a directory tree whose root is specified with the INPUT tag.\r
+# Note that relative paths are relative to the directory from which doxygen is\r
+# run.\r
+\r
+EXCLUDE                = Documentation/\r
+\r
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or\r
+# directories that are symbolic links (a Unix file system feature) are excluded\r
+# from the input.\r
+\r
+EXCLUDE_SYMLINKS       = NO\r
+\r
+# If the value of the INPUT tag contains directories, you can use the\r
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\r
+# certain files from those directories. Note that the wildcards are matched\r
+# against the file with absolute path, so to exclude all test directories\r
+# for example use the pattern */test/*\r
+\r
+EXCLUDE_PATTERNS       =\r
+\r
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names\r
+# (namespaces, classes, functions, etc.) that should be excluded from the\r
+# output. The symbol name can be a fully qualified name, a word, or if the\r
+# wildcard * is used, a substring. Examples: ANamespace, AClass,\r
+# AClass::ANamespace, ANamespace::*Test\r
+\r
+EXCLUDE_SYMBOLS        = __* \\r
+                         INCLUDE_FROM_*\r
+\r
+# The EXAMPLE_PATH tag can be used to specify one or more files or\r
+# directories that contain example code fragments that are included (see\r
+# the \include command).\r
+\r
+EXAMPLE_PATH           =\r
+\r
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the\r
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\r
+# and *.h) to filter out the source-files in the directories. If left\r
+# blank all files are included.\r
+\r
+EXAMPLE_PATTERNS       = *\r
+\r
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be\r
+# searched for input files to be used with the \include or \dontinclude\r
+# commands irrespective of the value of the RECURSIVE tag.\r
+# Possible values are YES and NO. If left blank NO is used.\r
+\r
+EXAMPLE_RECURSIVE      = NO\r
+\r
+# The IMAGE_PATH tag can be used to specify one or more files or\r
+# directories that contain image that are included in the documentation (see\r
+# the \image command).\r
+\r
+IMAGE_PATH             =\r
+\r
+# The INPUT_FILTER tag can be used to specify a program that doxygen should\r
+# invoke to filter for each input file. Doxygen will invoke the filter program\r
+# by executing (via popen()) the command <filter> <input-file>, where <filter>\r
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an\r
+# input file. Doxygen will then use the output that the filter program writes\r
+# to standard output.\r
+# If FILTER_PATTERNS is specified, this tag will be\r
+# ignored.\r
+\r
+INPUT_FILTER           =\r
+\r
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern\r
+# basis.\r
+# Doxygen will compare the file name with each pattern and apply the\r
+# filter if there is a match.\r
+# The filters are a list of the form:\r
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further\r
+# info on how filters are used. If FILTER_PATTERNS is empty or if\r
+# non of the patterns match the file name, INPUT_FILTER is applied.\r
+\r
+FILTER_PATTERNS        =\r
+\r
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using\r
+# INPUT_FILTER) will be used to filter the input files when producing source\r
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).\r
+\r
+FILTER_SOURCE_FILES    = NO\r
+\r
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file\r
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any)\r
+# and it is also possible to disable source filtering for a specific pattern\r
+# using *.ext= (so without naming a filter). This option only has effect when\r
+# FILTER_SOURCE_FILES is enabled.\r
+\r
+FILTER_SOURCE_PATTERNS =\r
+\r
+# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that\r
+# is part of the input, its contents will be placed on the main page (index.html).\r
+# This can be useful if you have a project on for instance GitHub and want reuse\r
+# the introduction page also for the doxygen output.\r
+\r
+USE_MDFILE_AS_MAINPAGE =\r
+\r
+#---------------------------------------------------------------------------\r
+# configuration options related to source browsing\r
+#---------------------------------------------------------------------------\r
+\r
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will\r
+# be generated. Documented entities will be cross-referenced with these sources.\r
+# Note: To get rid of all source code in the generated output, make sure also\r
+# VERBATIM_HEADERS is set to NO.\r
+\r
+SOURCE_BROWSER         = NO\r
+\r
+# Setting the INLINE_SOURCES tag to YES will include the body\r
+# of functions and classes directly in the documentation.\r
+\r
+INLINE_SOURCES         = NO\r
+\r
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct\r
+# doxygen to hide any special comment blocks from generated source code\r
+# fragments. Normal C, C++ and Fortran comments will always remain visible.\r
+\r
+STRIP_CODE_COMMENTS    = YES\r
+\r
+# If the REFERENCED_BY_RELATION tag is set to YES\r
+# then for each documented function all documented\r
+# functions referencing it will be listed.\r
+\r
+REFERENCED_BY_RELATION = NO\r
+\r
+# If the REFERENCES_RELATION tag is set to YES\r
+# then for each documented function all documented entities\r
+# called/used by that function will be listed.\r
+\r
+REFERENCES_RELATION    = NO\r
+\r
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)\r
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from\r
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will\r
+# link to the source code.\r
+# Otherwise they will link to the documentation.\r
+\r
+REFERENCES_LINK_SOURCE = NO\r
+\r
+# If the USE_HTAGS tag is set to YES then the references to source code\r
+# will point to the HTML generated by the htags(1) tool instead of doxygen\r
+# built-in source browser. The htags tool is part of GNU's global source\r
+# tagging system (see http://www.gnu.org/software/global/global.html). You\r
+# will need version 4.8.6 or higher.\r
+\r
+USE_HTAGS              = NO\r
+\r
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen\r
+# will generate a verbatim copy of the header file for each class for\r
+# which an include is specified. Set to NO to disable this.\r
+\r
+VERBATIM_HEADERS       = NO\r
+\r
+#---------------------------------------------------------------------------\r
+# configuration options related to the alphabetical class index\r
+#---------------------------------------------------------------------------\r
+\r
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index\r
+# of all compounds will be generated. Enable this if the project\r
+# contains a lot of classes, structs, unions or interfaces.\r
+\r
+ALPHABETICAL_INDEX     = YES\r
+\r
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then\r
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns\r
+# in which this list will be split (can be a number in the range [1..20])\r
+\r
+COLS_IN_ALPHA_INDEX    = 5\r
+\r
+# In case all classes in a project start with a common prefix, all\r
+# classes will be put under the same header in the alphabetical index.\r
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that\r
+# should be ignored while generating the index headers.\r
+\r
+IGNORE_PREFIX          =\r
+\r
+#---------------------------------------------------------------------------\r
+# configuration options related to the HTML output\r
+#---------------------------------------------------------------------------\r
+\r
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will\r
+# generate HTML output.\r
+\r
+GENERATE_HTML          = YES\r
+\r
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.\r
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be\r
+# put in front of it. If left blank `html' will be used as the default path.\r
+\r
+HTML_OUTPUT            = html\r
+\r
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for\r
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank\r
+# doxygen will generate files with .html extension.\r
+\r
+HTML_FILE_EXTENSION    = .html\r
+\r
+# The HTML_HEADER tag can be used to specify a personal HTML header for\r
+# each generated HTML page. If it is left blank doxygen will generate a\r
+# standard header. Note that when using a custom header you are responsible\r
+#  for the proper inclusion of any scripts and style sheets that doxygen\r
+# needs, which is dependent on the configuration options used.\r
+# It is advised to generate a default header using "doxygen -w html\r
+# header.html footer.html stylesheet.css YourConfigFile" and then modify\r
+# that header. Note that the header is subject to change so you typically\r
+# have to redo this when upgrading to a newer version of doxygen or when\r
+# changing the value of configuration settings such as GENERATE_TREEVIEW!\r
+\r
+HTML_HEADER            =\r
+\r
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for\r
+# each generated HTML page. If it is left blank doxygen will generate a\r
+# standard footer.\r
+\r
+HTML_FOOTER            =\r
+\r
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading\r
+# style sheet that is used by each HTML page. It can be used to\r
+# fine-tune the look of the HTML output. If left blank doxygen will\r
+# generate a default style sheet. Note that it is recommended to use\r
+# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this\r
+# tag will in the future become obsolete.\r
+\r
+HTML_STYLESHEET        =\r
+\r
+# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional\r
+# user-defined cascading style sheet that is included after the standard\r
+# style sheets created by doxygen. Using this option one can overrule\r
+# certain style aspects. This is preferred over using HTML_STYLESHEET\r
+# since it does not replace the standard style sheet and is therefor more\r
+# robust against future updates. Doxygen will copy the style sheet file to\r
+# the output directory.\r
+\r
+HTML_EXTRA_STYLESHEET  =\r
+\r
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\r
+# other source files which should be copied to the HTML output directory. Note\r
+# that these files will be copied to the base HTML output directory. Use the\r
+# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\r
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that\r
+# the files will be copied as-is; there are no commands or markers available.\r
+\r
+HTML_EXTRA_FILES       =\r
+\r
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.\r
+# Doxygen will adjust the colors in the style sheet and background images\r
+# according to this color. Hue is specified as an angle on a colorwheel,\r
+# see http://en.wikipedia.org/wiki/Hue for more information.\r
+# For instance the value 0 represents red, 60 is yellow, 120 is green,\r
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.\r
+# The allowed range is 0 to 359.\r
+\r
+HTML_COLORSTYLE_HUE    = 220\r
+\r
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of\r
+# the colors in the HTML output. For a value of 0 the output will use\r
+# grayscales only. A value of 255 will produce the most vivid colors.\r
+\r
+HTML_COLORSTYLE_SAT    = 100\r
+\r
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to\r
+# the luminance component of the colors in the HTML output. Values below\r
+# 100 gradually make the output lighter, whereas values above 100 make\r
+# the output darker. The value divided by 100 is the actual gamma applied,\r
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,\r
+# and 100 does not change the gamma.\r
+\r
+HTML_COLORSTYLE_GAMMA  = 80\r
+\r
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML\r
+# page will contain the date and time when the page was generated. Setting\r
+# this to NO can help when comparing the output of multiple runs.\r
+\r
+HTML_TIMESTAMP         = NO\r
+\r
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML\r
+# documentation will contain sections that can be hidden and shown after the\r
+# page has loaded.\r
+\r
+HTML_DYNAMIC_SECTIONS  = YES\r
+\r
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of\r
+# entries shown in the various tree structured indices initially; the user\r
+# can expand and collapse entries dynamically later on. Doxygen will expand\r
+# the tree to such a level that at most the specified number of entries are\r
+# visible (unless a fully collapsed tree already exceeds this amount).\r
+# So setting the number of entries 1 will produce a full collapsed tree by\r
+# default. 0 is a special value representing an infinite number of entries\r
+# and will result in a full expanded tree by default.\r
+\r
+HTML_INDEX_NUM_ENTRIES = 100\r
+\r
+# If the GENERATE_DOCSET tag is set to YES, additional index files\r
+# will be generated that can be used as input for Apple's Xcode 3\r
+# integrated development environment, introduced with OSX 10.5 (Leopard).\r
+# To create a documentation set, doxygen will generate a Makefile in the\r
+# HTML output directory. Running make will produce the docset in that\r
+# directory and running "make install" will install the docset in\r
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find\r
+# it at startup.\r
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html\r
+# for more information.\r
+\r
+GENERATE_DOCSET        = NO\r
+\r
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the\r
+# feed. A documentation feed provides an umbrella under which multiple\r
+# documentation sets from a single provider (such as a company or product suite)\r
+# can be grouped.\r
+\r
+DOCSET_FEEDNAME        = "Doxygen generated docs"\r
+\r
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that\r
+# should uniquely identify the documentation set bundle. This should be a\r
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen\r
+# will append .docset to the name.\r
+\r
+DOCSET_BUNDLE_ID       = org.doxygen.Project\r
+\r
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely\r
+# identify the documentation publisher. This should be a reverse domain-name\r
+# style string, e.g. com.mycompany.MyDocSet.documentation.\r
+\r
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher\r
+\r
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.\r
+\r
+DOCSET_PUBLISHER_NAME  = Publisher\r
+\r
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files\r
+# will be generated that can be used as input for tools like the\r
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)\r
+# of the generated HTML documentation.\r
+\r
+GENERATE_HTMLHELP      = NO\r
+\r
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can\r
+# be used to specify the file name of the resulting .chm file. You\r
+# can add a path in front of the file if the result should not be\r
+# written to the html output directory.\r
+\r
+CHM_FILE               =\r
+\r
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can\r
+# be used to specify the location (absolute path including file name) of\r
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run\r
+# the HTML help compiler on the generated index.hhp.\r
+\r
+HHC_LOCATION           =\r
+\r
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag\r
+# controls if a separate .chi index file is generated (YES) or that\r
+# it should be included in the master .chm file (NO).\r
+\r
+GENERATE_CHI           = NO\r
+\r
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING\r
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file\r
+# content.\r
+\r
+CHM_INDEX_ENCODING     =\r
+\r
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag\r
+# controls whether a binary table of contents is generated (YES) or a\r
+# normal table of contents (NO) in the .chm file.\r
+\r
+BINARY_TOC             = NO\r
+\r
+# The TOC_EXPAND flag can be set to YES to add extra items for group members\r
+# to the contents of the HTML help documentation and to the tree view.\r
+\r
+TOC_EXPAND             = YES\r
+\r
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and\r
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated\r
+# that can be used as input for Qt's qhelpgenerator to generate a\r
+# Qt Compressed Help (.qch) of the generated HTML documentation.\r
+\r
+GENERATE_QHP           = NO\r
+\r
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can\r
+# be used to specify the file name of the resulting .qch file.\r
+# The path specified is relative to the HTML output folder.\r
+\r
+QCH_FILE               =\r
+\r
+# The QHP_NAMESPACE tag specifies the namespace to use when generating\r
+# Qt Help Project output. For more information please see\r
+# http://doc.trolltech.com/qthelpproject.html#namespace\r
+\r
+QHP_NAMESPACE          = org.doxygen.Project\r
+\r
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating\r
+# Qt Help Project output. For more information please see\r
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders\r
+\r
+QHP_VIRTUAL_FOLDER     = doc\r
+\r
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to\r
+# add. For more information please see\r
+# http://doc.trolltech.com/qthelpproject.html#custom-filters\r
+\r
+QHP_CUST_FILTER_NAME   =\r
+\r
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the\r
+# custom filter to add. For more information please see\r
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">\r
+# Qt Help Project / Custom Filters</a>.\r
+\r
+QHP_CUST_FILTER_ATTRS  =\r
+\r
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this\r
+# project's\r
+# filter section matches.\r
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">\r
+# Qt Help Project / Filter Attributes</a>.\r
+\r
+QHP_SECT_FILTER_ATTRS  =\r
+\r
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can\r
+# be used to specify the location of Qt's qhelpgenerator.\r
+# If non-empty doxygen will try to run qhelpgenerator on the generated\r
+# .qhp file.\r
+\r
+QHG_LOCATION           =\r
+\r
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files\r
+#  will be generated, which together with the HTML files, form an Eclipse help\r
+# plugin. To install this plugin and make it available under the help contents\r
+# menu in Eclipse, the contents of the directory containing the HTML and XML\r
+# files needs to be copied into the plugins directory of eclipse. The name of\r
+# the directory within the plugins directory should be the same as\r
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before\r
+# the help appears.\r
+\r
+GENERATE_ECLIPSEHELP   = NO\r
+\r
+# A unique identifier for the eclipse help plugin. When installing the plugin\r
+# the directory name containing the HTML and XML files should also have\r
+# this name.\r
+\r
+ECLIPSE_DOC_ID         = org.doxygen.Project\r
+\r
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)\r
+# at top of each HTML page. The value NO (the default) enables the index and\r
+# the value YES disables it. Since the tabs have the same information as the\r
+# navigation tree you can set this option to NO if you already set\r
+# GENERATE_TREEVIEW to YES.\r
+\r
+DISABLE_INDEX          = YES\r
+\r
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\r
+# structure should be generated to display hierarchical information.\r
+# If the tag value is set to YES, a side panel will be generated\r
+# containing a tree-like index structure (just like the one that\r
+# is generated for HTML Help). For this to work a browser that supports\r
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).\r
+# Windows users are probably better off using the HTML help feature.\r
+# Since the tree basically has the same information as the tab index you\r
+# could consider to set DISABLE_INDEX to NO when enabling this option.\r
+\r
+GENERATE_TREEVIEW      = YES\r
+\r
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values\r
+# (range [0,1..20]) that doxygen will group on one line in the generated HTML\r
+# documentation. Note that a value of 0 will completely suppress the enum\r
+# values from appearing in the overview section.\r
+\r
+ENUM_VALUES_PER_LINE   = 1\r
+\r
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be\r
+# used to set the initial width (in pixels) of the frame in which the tree\r
+# is shown.\r
+\r
+TREEVIEW_WIDTH         = 250\r
+\r
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open\r
+# links to external symbols imported via tag files in a separate window.\r
+\r
+EXT_LINKS_IN_WINDOW    = NO\r
+\r
+# Use this tag to change the font size of Latex formulas included\r
+# as images in the HTML documentation. The default is 10. Note that\r
+# when you change the font size after a successful doxygen run you need\r
+# to manually remove any form_*.png images from the HTML output directory\r
+# to force them to be regenerated.\r
+\r
+FORMULA_FONTSIZE       = 10\r
+\r
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images\r
+# generated for formulas are transparent PNGs. Transparent PNGs are\r
+# not supported properly for IE 6.0, but are supported on all modern browsers.\r
+# Note that when changing this option you need to delete any form_*.png files\r
+# in the HTML output before the changes have effect.\r
+\r
+FORMULA_TRANSPARENT    = YES\r
+\r
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax\r
+# (see http://www.mathjax.org) which uses client side Javascript for the\r
+# rendering instead of using prerendered bitmaps. Use this if you do not\r
+# have LaTeX installed or if you want to formulas look prettier in the HTML\r
+# output. When enabled you may also need to install MathJax separately and\r
+# configure the path to it using the MATHJAX_RELPATH option.\r
+\r
+USE_MATHJAX            = NO\r
+\r
+# When MathJax is enabled you can set the default output format to be used for\r
+# thA MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and\r
+# SVG. The default value is HTML-CSS, which is slower, but has the best\r
+# compatibility.\r
+\r
+MATHJAX_FORMAT         = HTML-CSS\r
+\r
+# When MathJax is enabled you need to specify the location relative to the\r
+# HTML output directory using the MATHJAX_RELPATH option. The destination\r
+# directory should contain the MathJax.js script. For instance, if the mathjax\r
+# directory is located at the same level as the HTML output directory, then\r
+# MATHJAX_RELPATH should be ../mathjax. The default value points to\r
+# the MathJax Content Delivery Network so you can quickly see the result without\r
+# installing MathJax.\r
+# However, it is strongly recommended to install a local\r
+# copy of MathJax from http://www.mathjax.org before deployment.\r
+\r
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest\r
+\r
+# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension\r
+# names that should be enabled during MathJax rendering.\r
+\r
+MATHJAX_EXTENSIONS     =\r
+\r
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box\r
+# for the HTML output. The underlying search engine uses javascript\r
+# and DHTML and should work on any modern browser. Note that when using\r
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets\r
+# (GENERATE_DOCSET) there is already a search function so this one should\r
+# typically be disabled. For large projects the javascript based search engine\r
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.\r
+\r
+SEARCHENGINE           = NO\r
+\r
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be\r
+# implemented using a web server instead of a web client using Javascript.\r
+# There are two flavours of web server based search depending on the\r
+# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for\r
+# searching and an index file used by the script. When EXTERNAL_SEARCH is\r
+# enabled the indexing and searching needs to be provided by external tools.\r
+# See the manual for details.\r
+\r
+SERVER_BASED_SEARCH    = NO\r
+\r
+# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP\r
+# script for searching. Instead the search results are written to an XML file\r
+# which needs to be processed by an external indexer. Doxygen will invoke an\r
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain\r
+# the search results. Doxygen ships with an example indexer (doxyindexer) and\r
+# search engine (doxysearch.cgi) which are based on the open source search engine\r
+# library Xapian. See the manual for configuration details.\r
+\r
+EXTERNAL_SEARCH        = NO\r
+\r
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server\r
+# which will returned the search results when EXTERNAL_SEARCH is enabled.\r
+# Doxygen ships with an example search engine (doxysearch) which is based on\r
+# the open source search engine library Xapian. See the manual for configuration\r
+# details.\r
+\r
+SEARCHENGINE_URL       =\r
+\r
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed\r
+# search data is written to a file for indexing by an external tool. With the\r
+# SEARCHDATA_FILE tag the name of this file can be specified.\r
+\r
+SEARCHDATA_FILE        = searchdata.xml\r
+\r
+# When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the\r
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is\r
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple\r
+# projects and redirect the results back to the right project.\r
+\r
+EXTERNAL_SEARCH_ID     =\r
+\r
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen\r
+# projects other than the one defined by this configuration file, but that are\r
+# all added to the same external search index. Each project needs to have a\r
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id\r
+# of to a relative location where the documentation can be found.\r
+# The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ...\r
+\r
+EXTRA_SEARCH_MAPPINGS  =\r
+\r
+#---------------------------------------------------------------------------\r
+# configuration options related to the LaTeX output\r
+#---------------------------------------------------------------------------\r
+\r
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will\r
+# generate Latex output.\r
+\r
+GENERATE_LATEX         = NO\r
+\r
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.\r
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be\r
+# put in front of it. If left blank `latex' will be used as the default path.\r
+\r
+LATEX_OUTPUT           = latex\r
+\r
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be\r
+# invoked. If left blank `latex' will be used as the default command name.\r
+# Note that when enabling USE_PDFLATEX this option is only used for\r
+# generating bitmaps for formulas in the HTML output, but not in the\r
+# Makefile that is written to the output directory.\r
+\r
+LATEX_CMD_NAME         = latex\r
+\r
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to\r
+# generate index for LaTeX. If left blank `makeindex' will be used as the\r
+# default command name.\r
+\r
+MAKEINDEX_CMD_NAME     = makeindex\r
+\r
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact\r
+# LaTeX documents. This may be useful for small projects and may help to\r
+# save some trees in general.\r
+\r
+COMPACT_LATEX          = NO\r
+\r
+# The PAPER_TYPE tag can be used to set the paper type that is used\r
+# by the printer. Possible values are: a4, letter, legal and\r
+# executive. If left blank a4wide will be used.\r
+\r
+PAPER_TYPE             = a4wide\r
+\r
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX\r
+# packages that should be included in the LaTeX output.\r
+\r
+EXTRA_PACKAGES         =\r
+\r
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for\r
+# the generated latex document. The header should contain everything until\r
+# the first chapter. If it is left blank doxygen will generate a\r
+# standard header. Notice: only use this tag if you know what you are doing!\r
+\r
+LATEX_HEADER           =\r
+\r
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for\r
+# the generated latex document. The footer should contain everything after\r
+# the last chapter. If it is left blank doxygen will generate a\r
+# standard footer. Notice: only use this tag if you know what you are doing!\r
+\r
+LATEX_FOOTER           =\r
+\r
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated\r
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will\r
+# contain links (just like the HTML output) instead of page references\r
+# This makes the output suitable for online browsing using a pdf viewer.\r
+\r
+PDF_HYPERLINKS         = YES\r
+\r
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of\r
+# plain latex in the generated Makefile. Set this option to YES to get a\r
+# higher quality PDF documentation.\r
+\r
+USE_PDFLATEX           = YES\r
+\r
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.\r
+# command to the generated LaTeX files. This will instruct LaTeX to keep\r
+# running if errors occur, instead of asking the user for help.\r
+# This option is also used when generating formulas in HTML.\r
+\r
+LATEX_BATCHMODE        = NO\r
+\r
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not\r
+# include the index chapters (such as File Index, Compound Index, etc.)\r
+# in the output.\r
+\r
+LATEX_HIDE_INDICES     = NO\r
+\r
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include\r
+# source code with syntax highlighting in the LaTeX output.\r
+# Note that which sources are shown also depends on other settings\r
+# such as SOURCE_BROWSER.\r
+\r
+LATEX_SOURCE_CODE      = NO\r
+\r
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the\r
+# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See\r
+# http://en.wikipedia.org/wiki/BibTeX for more info.\r
+\r
+LATEX_BIB_STYLE        = plain\r
+\r
+#---------------------------------------------------------------------------\r
+# configuration options related to the RTF output\r
+#---------------------------------------------------------------------------\r
+\r
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output\r
+# The RTF output is optimized for Word 97 and may not look very pretty with\r
+# other RTF readers or editors.\r
+\r
+GENERATE_RTF           = NO\r
+\r
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.\r
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be\r
+# put in front of it. If left blank `rtf' will be used as the default path.\r
+\r
+RTF_OUTPUT             = rtf\r
+\r
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact\r
+# RTF documents. This may be useful for small projects and may help to\r
+# save some trees in general.\r
+\r
+COMPACT_RTF            = NO\r
+\r
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated\r
+# will contain hyperlink fields. The RTF file will\r
+# contain links (just like the HTML output) instead of page references.\r
+# This makes the output suitable for online browsing using WORD or other\r
+# programs which support those fields.\r
+# Note: wordpad (write) and others do not support links.\r
+\r
+RTF_HYPERLINKS         = NO\r
+\r
+# Load style sheet definitions from file. Syntax is similar to doxygen's\r
+# config file, i.e. a series of assignments. You only have to provide\r
+# replacements, missing definitions are set to their default value.\r
+\r
+RTF_STYLESHEET_FILE    =\r
+\r
+# Set optional variables used in the generation of an rtf document.\r
+# Syntax is similar to doxygen's config file.\r
+\r
+RTF_EXTENSIONS_FILE    =\r
+\r
+#---------------------------------------------------------------------------\r
+# configuration options related to the man page output\r
+#---------------------------------------------------------------------------\r
+\r
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will\r
+# generate man pages\r
+\r
+GENERATE_MAN           = NO\r
+\r
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.\r
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be\r
+# put in front of it. If left blank `man' will be used as the default path.\r
+\r
+MAN_OUTPUT             = man\r
+\r
+# The MAN_EXTENSION tag determines the extension that is added to\r
+# the generated man pages (default is the subroutine's section .3)\r
+\r
+MAN_EXTENSION          = .3\r
+\r
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,\r
+# then it will generate one additional man file for each entity\r
+# documented in the real man page(s). These additional files\r
+# only source the real man page, but without them the man command\r
+# would be unable to find the correct page. The default is NO.\r
+\r
+MAN_LINKS              = NO\r
+\r
+#---------------------------------------------------------------------------\r
+# configuration options related to the XML output\r
+#---------------------------------------------------------------------------\r
+\r
+# If the GENERATE_XML tag is set to YES Doxygen will\r
+# generate an XML file that captures the structure of\r
+# the code including all documentation.\r
+\r
+GENERATE_XML           = NO\r
+\r
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.\r
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be\r
+# put in front of it. If left blank `xml' will be used as the default path.\r
+\r
+XML_OUTPUT             = xml\r
+\r
+# The XML_SCHEMA tag can be used to specify an XML schema,\r
+# which can be used by a validating XML parser to check the\r
+# syntax of the XML files.\r
+\r
+XML_SCHEMA             =\r
+\r
+# The XML_DTD tag can be used to specify an XML DTD,\r
+# which can be used by a validating XML parser to check the\r
+# syntax of the XML files.\r
+\r
+XML_DTD                =\r
+\r
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will\r
+# dump the program listings (including syntax highlighting\r
+# and cross-referencing information) to the XML output. Note that\r
+# enabling this will significantly increase the size of the XML output.\r
+\r
+XML_PROGRAMLISTING     = YES\r
+\r
+#---------------------------------------------------------------------------\r
+# configuration options for the AutoGen Definitions output\r
+#---------------------------------------------------------------------------\r
+\r
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will\r
+# generate an AutoGen Definitions (see autogen.sf.net) file\r
+# that captures the structure of the code including all\r
+# documentation. Note that this feature is still experimental\r
+# and incomplete at the moment.\r
+\r
+GENERATE_AUTOGEN_DEF   = NO\r
+\r
+#---------------------------------------------------------------------------\r
+# configuration options related to the Perl module output\r
+#---------------------------------------------------------------------------\r
+\r
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will\r
+# generate a Perl module file that captures the structure of\r
+# the code including all documentation. Note that this\r
+# feature is still experimental and incomplete at the\r
+# moment.\r
+\r
+GENERATE_PERLMOD       = NO\r
+\r
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate\r
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able\r
+# to generate PDF and DVI output from the Perl module output.\r
+\r
+PERLMOD_LATEX          = NO\r
+\r
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be\r
+# nicely formatted so it can be parsed by a human reader.\r
+# This is useful\r
+# if you want to understand what is going on.\r
+# On the other hand, if this\r
+# tag is set to NO the size of the Perl module output will be much smaller\r
+# and Perl will parse it just the same.\r
+\r
+PERLMOD_PRETTY         = YES\r
+\r
+# The names of the make variables in the generated doxyrules.make file\r
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.\r
+# This is useful so different doxyrules.make files included by the same\r
+# Makefile don't overwrite each other's variables.\r
+\r
+PERLMOD_MAKEVAR_PREFIX =\r
+\r
+#---------------------------------------------------------------------------\r
+# Configuration options related to the preprocessor\r
+#---------------------------------------------------------------------------\r
+\r
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will\r
+# evaluate all C-preprocessor directives found in the sources and include\r
+# files.\r
+\r
+ENABLE_PREPROCESSING   = YES\r
+\r
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro\r
+# names in the source code. If set to NO (the default) only conditional\r
+# compilation will be performed. Macro expansion can be done in a controlled\r
+# way by setting EXPAND_ONLY_PREDEF to YES.\r
+\r
+MACRO_EXPANSION        = YES\r
+\r
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES\r
+# then the macro expansion is limited to the macros specified with the\r
+# PREDEFINED and EXPAND_AS_DEFINED tags.\r
+\r
+EXPAND_ONLY_PREDEF     = YES\r
+\r
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files\r
+# pointed to by INCLUDE_PATH will be searched when a #include is found.\r
+\r
+SEARCH_INCLUDES        = YES\r
+\r
+# The INCLUDE_PATH tag can be used to specify one or more directories that\r
+# contain include files that are not input files but should be processed by\r
+# the preprocessor.\r
+\r
+INCLUDE_PATH           =\r
+\r
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard\r
+# patterns (like *.h and *.hpp) to filter out the header-files in the\r
+# directories. If left blank, the patterns specified with FILE_PATTERNS will\r
+# be used.\r
+\r
+INCLUDE_FILE_PATTERNS  =\r
+\r
+# The PREDEFINED tag can be used to specify one or more macro names that\r
+# are defined before the preprocessor is started (similar to the -D option of\r
+# gcc). The argument of the tag is a list of macros of the form: name\r
+# or name=definition (no spaces). If the definition and the = are\r
+# omitted =1 is assumed. To prevent a macro definition from being\r
+# undefined via #undef or recursively expanded use the := operator\r
+# instead of the = operator.\r
+\r
+PREDEFINED             = __DOXYGEN__ \\r
+                         PROGMEM\r
+\r
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then\r
+# this tag can be used to specify a list of macro names that should be expanded.\r
+# The macro definition that is found in the sources will be used.\r
+# Use the PREDEFINED tag if you want to use a different macro definition that\r
+# overrules the definition found in the source code.\r
+\r
+EXPAND_AS_DEFINED      =\r
+\r
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then\r
+# doxygen's preprocessor will remove all references to function-like macros\r
+# that are alone on a line, have an all uppercase name, and do not end with a\r
+# semicolon, because these will confuse the parser if not removed.\r
+\r
+SKIP_FUNCTION_MACROS   = YES\r
+\r
+#---------------------------------------------------------------------------\r
+# Configuration::additions related to external references\r
+#---------------------------------------------------------------------------\r
+\r
+# The TAGFILES option can be used to specify one or more tagfiles. For each\r
+# tag file the location of the external documentation should be added. The\r
+# format of a tag file without this location is as follows:\r
+#\r
+# TAGFILES = file1 file2 ...\r
+# Adding location for the tag files is done as follows:\r
+#\r
+# TAGFILES = file1=loc1 "file2 = loc2" ...\r
+# where "loc1" and "loc2" can be relative or absolute paths\r
+# or URLs. Note that each tag file must have a unique name (where the name does\r
+# NOT include the path). If a tag file is not located in the directory in which\r
+# doxygen is run, you must also specify the path to the tagfile here.\r
+\r
+TAGFILES               =\r
+\r
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create\r
+# a tag file that is based on the input files it reads.\r
+\r
+GENERATE_TAGFILE       =\r
+\r
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed\r
+# in the class index. If set to NO only the inherited external classes\r
+# will be listed.\r
+\r
+ALLEXTERNALS           = NO\r
+\r
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed\r
+# in the modules index. If set to NO, only the current project's groups will\r
+# be listed.\r
+\r
+EXTERNAL_GROUPS        = YES\r
+\r
+# The PERL_PATH should be the absolute path and name of the perl script\r
+# interpreter (i.e. the result of `which perl').\r
+\r
+PERL_PATH              = /usr/bin/perl\r
+\r
+#---------------------------------------------------------------------------\r
+# Configuration options related to the dot tool\r
+#---------------------------------------------------------------------------\r
+\r
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will\r
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base\r
+# or super classes. Setting the tag to NO turns the diagrams off. Note that\r
+# this option also works with HAVE_DOT disabled, but it is recommended to\r
+# install and use dot, since it yields more powerful graphs.\r
+\r
+CLASS_DIAGRAMS         = NO\r
+\r
+# You can define message sequence charts within doxygen comments using the \msc\r
+# command. Doxygen will then run the mscgen tool (see\r
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the\r
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where\r
+# the mscgen tool resides. If left empty the tool is assumed to be found in the\r
+# default search path.\r
+\r
+MSCGEN_PATH            =\r
+\r
+# If set to YES, the inheritance and collaboration graphs will hide\r
+# inheritance and usage relations if the target is undocumented\r
+# or is not a class.\r
+\r
+HIDE_UNDOC_RELATIONS   = YES\r
+\r
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is\r
+# available from the path. This tool is part of Graphviz, a graph visualization\r
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section\r
+# have no effect if this option is set to NO (the default)\r
+\r
+HAVE_DOT               = NO\r
+\r
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is\r
+# allowed to run in parallel. When set to 0 (the default) doxygen will\r
+# base this on the number of processors available in the system. You can set it\r
+# explicitly to a value larger than 0 to get control over the balance\r
+# between CPU load and processing speed.\r
+\r
+DOT_NUM_THREADS        = 0\r
+\r
+# By default doxygen will use the Helvetica font for all dot files that\r
+# doxygen generates. When you want a differently looking font you can specify\r
+# the font name using DOT_FONTNAME. You need to make sure dot is able to find\r
+# the font, which can be done by putting it in a standard location or by setting\r
+# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the\r
+# directory containing the font.\r
+\r
+DOT_FONTNAME           = FreeSans\r
+\r
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.\r
+# The default size is 10pt.\r
+\r
+DOT_FONTSIZE           = 10\r
+\r
+# By default doxygen will tell dot to use the Helvetica font.\r
+# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to\r
+# set the path where dot can find it.\r
+\r
+DOT_FONTPATH           =\r
+\r
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen\r
+# will generate a graph for each documented class showing the direct and\r
+# indirect inheritance relations. Setting this tag to YES will force the\r
+# CLASS_DIAGRAMS tag to NO.\r
+\r
+CLASS_GRAPH            = NO\r
+\r
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen\r
+# will generate a graph for each documented class showing the direct and\r
+# indirect implementation dependencies (inheritance, containment, and\r
+# class references variables) of the class with other documented classes.\r
+\r
+COLLABORATION_GRAPH    = NO\r
+\r
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen\r
+# will generate a graph for groups, showing the direct groups dependencies\r
+\r
+GROUP_GRAPHS           = NO\r
+\r
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and\r
+# collaboration diagrams in a style similar to the OMG's Unified Modeling\r
+# Language.\r
+\r
+UML_LOOK               = NO\r
+\r
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside\r
+# the class node. If there are many fields or methods and many nodes the\r
+# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS\r
+# threshold limits the number of items for each type to make the size more\r
+# managable. Set this to 0 for no limit. Note that the threshold may be\r
+# exceeded by 50% before the limit is enforced.\r
+\r
+UML_LIMIT_NUM_FIELDS   = 10\r
+\r
+# If set to YES, the inheritance and collaboration graphs will show the\r
+# relations between templates and their instances.\r
+\r
+TEMPLATE_RELATIONS     = NO\r
+\r
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT\r
+# tags are set to YES then doxygen will generate a graph for each documented\r
+# file showing the direct and indirect include dependencies of the file with\r
+# other documented files.\r
+\r
+INCLUDE_GRAPH          = NO\r
+\r
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and\r
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each\r
+# documented header file showing the documented files that directly or\r
+# indirectly include this file.\r
+\r
+INCLUDED_BY_GRAPH      = NO\r
+\r
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then\r
+# doxygen will generate a call dependency graph for every global function\r
+# or class method. Note that enabling this option will significantly increase\r
+# the time of a run. So in most cases it will be better to enable call graphs\r
+# for selected functions only using the \callgraph command.\r
+\r
+CALL_GRAPH             = NO\r
+\r
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then\r
+# doxygen will generate a caller dependency graph for every global function\r
+# or class method. Note that enabling this option will significantly increase\r
+# the time of a run. So in most cases it will be better to enable caller\r
+# graphs for selected functions only using the \callergraph command.\r
+\r
+CALLER_GRAPH           = NO\r
+\r
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen\r
+# will generate a graphical hierarchy of all classes instead of a textual one.\r
+\r
+GRAPHICAL_HIERARCHY    = NO\r
+\r
+# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES\r
+# then doxygen will show the dependencies a directory has on other directories\r
+# in a graphical way. The dependency relations are determined by the #include\r
+# relations between the files in the directories.\r
+\r
+DIRECTORY_GRAPH        = NO\r
+\r
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\r
+# generated by dot. Possible values are svg, png, jpg, or gif.\r
+# If left blank png will be used. If you choose svg you need to set\r
+# HTML_FILE_EXTENSION to xhtml in order to make the SVG files\r
+# visible in IE 9+ (other browsers do not have this requirement).\r
+\r
+DOT_IMAGE_FORMAT       = png\r
+\r
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to\r
+# enable generation of interactive SVG images that allow zooming and panning.\r
+# Note that this requires a modern browser other than Internet Explorer.\r
+# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you\r
+# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files\r
+# visible. Older versions of IE do not have SVG support.\r
+\r
+INTERACTIVE_SVG        = NO\r
+\r
+# The tag DOT_PATH can be used to specify the path where the dot tool can be\r
+# found. If left blank, it is assumed the dot tool can be found in the path.\r
+\r
+DOT_PATH               =\r
+\r
+# The DOTFILE_DIRS tag can be used to specify one or more directories that\r
+# contain dot files that are included in the documentation (see the\r
+# \dotfile command).\r
+\r
+DOTFILE_DIRS           =\r
+\r
+# The MSCFILE_DIRS tag can be used to specify one or more directories that\r
+# contain msc files that are included in the documentation (see the\r
+# \mscfile command).\r
+\r
+MSCFILE_DIRS           =\r
+\r
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of\r
+# nodes that will be shown in the graph. If the number of nodes in a graph\r
+# becomes larger than this value, doxygen will truncate the graph, which is\r
+# visualized by representing a node as a red box. Note that doxygen if the\r
+# number of direct children of the root node in a graph is already larger than\r
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note\r
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.\r
+\r
+DOT_GRAPH_MAX_NODES    = 15\r
+\r
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the\r
+# graphs generated by dot. A depth value of 3 means that only nodes reachable\r
+# from the root by following a path via at most 3 edges will be shown. Nodes\r
+# that lay further from the root node will be omitted. Note that setting this\r
+# option to 1 or 2 may greatly reduce the computation time needed for large\r
+# code bases. Also note that the size of a graph can be further restricted by\r
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\r
+\r
+MAX_DOT_GRAPH_DEPTH    = 2\r
+\r
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent\r
+# background. This is disabled by default, because dot on Windows does not\r
+# seem to support this out of the box. Warning: Depending on the platform used,\r
+# enabling this option may lead to badly anti-aliased labels on the edges of\r
+# a graph (i.e. they become hard to read).\r
+\r
+DOT_TRANSPARENT        = YES\r
+\r
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output\r
+# files in one run (i.e. multiple -o and -T options on the command line). This\r
+# makes dot run faster, but since only newer versions of dot (>1.8.10)\r
+# support this, this feature is disabled by default.\r
+\r
+DOT_MULTI_TARGETS      = NO\r
+\r
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will\r
+# generate a legend page explaining the meaning of the various boxes and\r
+# arrows in the dot generated graphs.\r
+\r
+GENERATE_LEGEND        = YES\r
+\r
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will\r
+# remove the intermediate dot files that are used to generate\r
+# the various graphs.\r
+\r
+DOT_CLEANUP            = YES\r
diff --git a/firmware/LUFA USBtoSerial.inf b/firmware/LUFA USBtoSerial.inf
new file mode 100644 (file)
index 0000000..86a39e0
--- /dev/null
@@ -0,0 +1,63 @@
+;************************************************************
+; Windows USB CDC ACM Setup File
+; Copyright (c) 2000 Microsoft Corporation
+;************************************************************
+
+[Version]
+Signature="$Windows NT$"
+Class=Ports
+ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
+Provider=%MFGNAME%
+DriverVer=7/1/2012,10.0.0.0
+
+[Manufacturer]
+%MFGNAME%=DeviceList, NTx86, NTamd64, NTia64
+
+[SourceDisksNames]
+
+[SourceDisksFiles]
+
+[DestinationDirs]
+DefaultDestDir=12
+
+[DriverInstall]
+Include=mdmcpq.inf
+CopyFiles=FakeModemCopyFileSection
+AddReg=DriverInstall.AddReg
+
+[DriverInstall.Services]
+Include=mdmcpq.inf
+AddService=usbser, 0x00000002, LowerFilter_Service_Inst
+
+[DriverInstall.AddReg]
+HKR,,EnumPropPages32,,"msports.dll,SerialPortPropPageProvider"
+
+;------------------------------------------------------------------------------
+;  Vendor and Product ID Definitions
+;------------------------------------------------------------------------------
+; When developing your USB device, the VID and PID used in the PC side
+; application program and the firmware on the microcontroller must match.
+; Modify the below line to use your VID and PID.  Use the format as shown below.
+; Note: One INF file can be used for multiple devices with different VID and PIDs.
+; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line.
+;------------------------------------------------------------------------------
+[DeviceList]
+%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204B
+
+[DeviceList.NTx86]
+%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204B
+
+[DeviceList.NTamd64]
+%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204B
+
+[DeviceList.NTia64]
+%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204B
+
+;------------------------------------------------------------------------------
+;  String Definitions
+;------------------------------------------------------------------------------
+;Modify these strings to customize your device
+;------------------------------------------------------------------------------
+[Strings]
+MFGNAME="http://www.lufa-lib.org"
+DESCRIPTION="LUFA USB to Serial"
\ No newline at end of file
diff --git a/firmware/TM1001A.c b/firmware/TM1001A.c
new file mode 100644 (file)
index 0000000..fa5d2c0
--- /dev/null
@@ -0,0 +1,357 @@
+// This code is based on the work of Frank H. (franky1969) from the
+// Mikrocontroller.net forum.
+// I modified the code thusly that it runs on an ATMega8 with more than 8 MHz
+// (make use of the counter 0 overflow interrupt to count to numbers greater
+// than 255) and added a set of functions that make your life easy,
+// i.e. spare you the work of crawling through the ADB register documentation yourself.
+//
+// You cannot use counter 0 for any other thing when using the touchpad!
+//
+// Have fun! - Michael W. (acidbourbon)
+//
+// acidbourbon.wordpress.com
+// June 2013
+
+
+// define here the port and the pin where you cave connected
+// the ADB (I/O) line from your TM1001A touchpad
+#define ADB_BIT (1<<0)
+#define ADB_PIN PIND
+#define ADB_POUT PORTD
+#define ADB_PDIR DDRD
+
+// when touchpad is in keypad mode the next two defines set the number
+// of rows and columns of the
+#define PAD_ROWS 2
+#define PAD_COLS 3
+
+
+
+
+
+
+
+
+
+
+
+#define TAKT F_CPU
+
+//Bits Makro
+#define BITS(H,L)  (0b##H ##L)
+
+#define MIN_ABS_X 150
+#define MAX_ABS_X 1450
+#define MIN_ABS_Y 210
+#define MAX_ABS_Y 1130
+
+#define PAD_WIDTH (MAX_ABS_X-MIN_ABS_X)
+#define PAD_HEIGHT (MAX_ABS_Y-MIN_ABS_Y)
+#define PAD_COL_WIDTH (PAD_WIDTH/PAD_COLS)
+#define PAD_ROW_HEIGHT (PAD_HEIGHT/PAD_ROWS)
+
+//Vorteiler Timer 0 und 1 bei 2313, 8515, Mega8 (nicht Timer 2)
+#define TIMER_VT_1_B BITS(0000,0001)  
+#define TIMER_VT_8_B BITS(0000,0010)  
+#define TIMER_VT_64_B BITS(0000,0011)
+#define TIMER_VT_256_B BITS(0000,0100)
+#define TIMER_VT_1024_B BITS(0000,0101)
+
+#define TIMER_VT_1 1  
+#define TIMER_VT_8 8  
+#define TIMER_VT_64 64
+#define TIMER_VT_256 256
+#define TIMER_VT_1024 1024
+
+
+
+typedef unsigned char u08;
+typedef unsigned short int u16;
+
+#define COM_TALK0 BITS(0011,1100) //Adresse 3, Talk, Register0
+#define COM_TALK1 BITS(0011,1101) //Adresse 3, Talk, Register1
+#define COM_LISTEN1 BITS(0011,1001) //Adresse 3, Listen, Register1
+#define COM_TALK2 BITS(0011,1110) //Adresse 3, Talk, Register2
+#define COM_TALK3 BITS(0011,1111) //Adresse 3, Talk, Register3
+#define COM_LISTEN3 BITS(0011,1011) //Adresse 3, Listen, Register3
+#define MAX_ADB 9
+u08 adb_werte[MAX_ADB];
+u08 t0ovfcount;
+volatile u08 adb_data_length;
+
+
+ISR( TIMER0_OVF_vect) {
+       t0ovfcount++;
+}
+
+uint16_t t0ext(void) {
+       return (t0ovfcount * 256 + (u16) TCNT0); // return current counter value
+       // plus number of already passed counter cycles times 256
+}
+
+void t0rst(void) {
+       TCNT0 = 0; // set counter to zero
+       t0ovfcount = 0; // set overflow counter to zero
+
+}
+
+
+
+// ADB Register auslesen / schreiben 
+// Rückgabe Anzahl der Empfangenen Daten 
+// Befehl in adb_werte[0]. Empfangene bzw. zu sendende Daten in adb_werte[1 bis 8]
+
+
+
+
+u08 adb(void) {
+       u08 bitpos;
+       u08 z_byte;
+       u08 anzahl_out;
+       //Teilerwerte TC0
+#define ADB_VORTEILER_A TIMER_VT_64
+#define ADB_VORTEILER_A_BIT TIMER_VT_64_B
+#define ADB_VORTEILER_B TIMER_VT_8
+#define ADB_VORTEILER_B_BIT TIMER_VT_8_B
+#define ADB_IMPULS_LANG TAKT/ADB_VORTEILER_B*65/1000000 //97
+#define ADB_IMPULS_KURZ TAKT/ADB_VORTEILER_B*35/1000000        //52
+#define ADB_IMPULS_ATT TAKT/ADB_VORTEILER_A*570/1000000 // 106
+       //#define ADB_IMPULS_SYNC TAKT/ADB_VORTEILER_B*70/1000000
+#define ADB_IMPULS_TLT TAKT/ADB_VORTEILER_B*250/1000000 // !!! 375 mach das mit anderem prescaler
+//     #define ADB_IMPULS_TLT TAKT/ADB_VORTEILER_A*31/1000000 // modified
+       //#define ADB_IMPULS_PAUSE TAKT/ADB_VORTEILER_B*200/1000000
+
+       //Attention Signal
+       TCCR0B = ADB_VORTEILER_A_BIT;
+       t0rst(); //  TCNT0 = 0; // Zähler auf null setzen
+       ADB_PDIR |= ADB_BIT; // Ausgang 0
+       ADB_POUT &= ~ADB_BIT;
+       while (t0ext() < ADB_IMPULS_ATT)
+               ; // Warteschleife
+
+       TCCR0B = ADB_VORTEILER_B_BIT; // ab hier alles im schnellen modus
+
+       anzahl_out = 1; // Mindestens Befehl übertragen
+       z_byte = 0;
+       do {
+               // START BIT (1)
+               t0rst(); //  TCNT0 = 0;
+               ADB_PDIR |= ADB_BIT; // Ausgang 0
+               ADB_POUT &= ~ADB_BIT;
+               while (t0ext() < ADB_IMPULS_KURZ)
+                       ;
+               ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
+               ADB_POUT |= ADB_BIT;
+               while (t0ext() < ADB_IMPULS_KURZ + ADB_IMPULS_LANG)
+                       ;
+
+               for (; z_byte < anzahl_out; z_byte++) {
+                       for (bitpos = 128; bitpos; bitpos >>= 1) { //Daten ausgeben
+                               t0rst(); //  TCNT0 = 0;
+                               ADB_PDIR |= ADB_BIT; // Ausgang 0
+                               ADB_POUT &= ~ADB_BIT;
+                               if (adb_werte[z_byte] & bitpos)
+                                       while (t0ext() < ADB_IMPULS_KURZ)
+                                               ;
+                               else
+                                       while (t0ext() < ADB_IMPULS_LANG)
+                                               ;
+                               ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
+                               ADB_POUT |= ADB_BIT;
+                               while (t0ext() < ADB_IMPULS_KURZ + ADB_IMPULS_LANG)
+                                       ;
+                       }
+               }
+               // STOP BIT (0)
+               t0rst(); //  TCNT0 = 0;
+               ADB_PDIR |= ADB_BIT; // Ausgang 0
+               ADB_POUT &= ~ADB_BIT;
+               while (t0ext() < ADB_IMPULS_LANG)
+                       ;
+               ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
+               ADB_POUT |= ADB_BIT;
+               while (t0ext() < ADB_IMPULS_KURZ + ADB_IMPULS_LANG)
+                       ;
+
+               // Entscheidung, ob noch weitere Daten übertragen werden
+               if (adb_werte[0] == COM_LISTEN3)
+                       anzahl_out = 2 + 1;
+               else if (adb_werte[0] == COM_LISTEN1)
+                       anzahl_out = 8 + 1;
+               else
+                       z_byte = 8;
+       } while (z_byte < 2);
+
+       // Warten auf Rückgabewerte sonst Abbruch
+       // TCCR0 = ADB_VORTEILER_A_BIT; // micha modifikation
+       t0rst(); //  TCNT0 = 0;
+
+       do {
+               if (t0ext() > ADB_IMPULS_TLT) {
+                       return (0);
+               }
+       } while (ADB_PIN & ADB_BIT);
+       while (!(ADB_PIN & ADB_BIT))
+               ; // Start Bit
+
+       z_byte = 1;
+       while (z_byte < MAX_ADB) {
+               adb_werte[z_byte] = 0;
+               for (bitpos = 128; bitpos; bitpos >>= 1) { //Bits einlesen
+                       //TCCR0 = ADB_VORTEILER_B_BIT; //micha modifikation
+                       t0rst(); //  TCNT0 = 0;
+                       // Abbruch wenn keine weiteren Bytes übertragen werden.
+                       do {
+                               if (t0ext() > ADB_IMPULS_KURZ + ADB_IMPULS_LANG) {
+                                       return (z_byte - 1);
+                               }
+                       } while (ADB_PIN & ADB_BIT);
+                       t0rst(); //  TCNT0 = 0;
+                       while (!(ADB_PIN & ADB_BIT))
+                               ;
+                       if (t0ext() < (ADB_IMPULS_KURZ + ADB_IMPULS_LANG) / 2)
+                               adb_werte[z_byte] += bitpos;
+               }
+               z_byte++;
+       }
+       return (z_byte - 1);
+}
+
+void touchpad_init(void) {
+       // Eingänge
+       ADB_PDIR &= ~ADB_BIT;
+
+       // Pull Up einschalten
+       ADB_POUT |= ADB_BIT;
+
+       //enable timer0 interrupt
+       TIMSK0 |= (1 << TOIE0);
+}
+
+uint8_t touchpad_read(void) {
+       adb_werte[0] = COM_TALK0;
+       adb_data_length = adb();
+       return adb_data_length;
+}
+
+void touchpad_set_abs_mode(void) {
+       // Auf Absolutmodus umschalten
+       adb_werte[0] = COM_LISTEN3;
+       adb_werte[1] = BITS(0110,0011);
+       adb_werte[2] = 4; //CDM Modus
+       adb();
+
+       adb_werte[0] = COM_TALK1;
+       adb(); // Werte holen
+
+       adb_werte[0] = COM_LISTEN1;
+       adb_werte[7] = 0x00; //Absolutmodus
+       adb();
+}
+
+void touchpad_set_rel_mode_100dpi(void) {
+       // Auf Relativmodus umschalten
+       adb_werte[0] = COM_LISTEN3;
+       adb_werte[1] = BITS(0110,0011);
+       adb_werte[2] = 1; //default modus: 100 dpi mouse
+       adb();
+
+}
+
+void touchpad_set_rel_mode_200dpi(void) {
+       // Auf Relativmodus umschalten
+       adb_werte[0] = COM_LISTEN3;
+       adb_werte[1] = BITS(0110,0011);
+       adb_werte[2] = 2; //200 dpi mouse
+       adb();
+
+}
+
+uint8_t z_pressure(void) {
+       return ((adb_werte[5] & 0b01110000) >> 1) | (adb_werte[5] & 0b00000111);
+}
+
+uint16_t x_abs(void) {
+       return ((adb_werte[4] & 0b111) << 10) | ((adb_werte[3] & 0b111) << 7)
+                       | (adb_werte[2] & 0b01111111);
+}
+
+uint16_t y_abs(void) {
+       return ((adb_werte[4] & 0b01110000) << 6)
+                       | ((adb_werte[3] & 0b01110000) << 3) | (adb_werte[1] & 0b01111111);
+}
+
+int8_t delta_y(void) {
+       if(adb_data_length ==0) {
+               return 0;
+       }
+       if (adb_werte[1] & 0b01000000) {
+               return -((128 - adb_werte[1]) & 0b00111111);
+       } else {
+               return adb_werte[1] & 0b00111111;
+       }
+}
+
+int8_t delta_x(void) {
+       if(adb_data_length ==0) {
+               return 0;
+       }
+       if (adb_werte[2] & 0b01000000) {
+               return -((128 - adb_werte[2]) & 0b00111111);
+       } else {
+               return adb_werte[2] & 0b00111111;
+       }
+}
+/*
+uint8_t touchpad_button_pressed(void){
+       static uint8_t button_status=0;
+
+       if(adb_data_length ==0) {
+               return button_status;
+       }
+       if(adb_werte[1]&0b10000000){
+               button_status=1;
+               return 1;
+       }else{
+               button_status=0;
+               return 0;
+       }
+
+}
+*/
+
+uint8_t decode_field(void) {
+       static uint8_t last_pressure = 0;
+       uint8_t pressure, i, j;
+       uint8_t return_val = 0;
+       static uint16_t x_mem, y_mem;
+       uint16_t x, y;
+
+       pressure = z_pressure();
+       x = x_abs();
+       y = y_abs();
+
+       if (x) {
+               x_mem = x;
+       } else {
+               x = x_mem;
+       }
+
+       if (y) {
+               y_mem = y;
+       } else {
+               y = y_mem;
+       }
+
+       if ((pressure == 0) && (last_pressure > 0)) {
+
+               i = (y - MIN_ABS_Y) / PAD_ROW_HEIGHT;
+               j = (x - MIN_ABS_X) / PAD_COL_WIDTH;
+
+               return_val = i * PAD_COLS + j + 1;
+
+       }
+
+       last_pressure = pressure;
+       return return_val;
+}
diff --git a/firmware/TM1001A.c~ b/firmware/TM1001A.c~
new file mode 100644 (file)
index 0000000..2436f67
--- /dev/null
@@ -0,0 +1,357 @@
+// This code is based on the work of Frank H. (franky1969) from the
+// Mikrocontroller.net forum.
+// I modified the code thusly that it runs on an ATMega8 with more than 8 MHz
+// (make use of the counter 0 overflow interrupt to count to numbers greater
+// than 255) and added a set of functions that make your life easy,
+// i.e. spare you the work of crawling through the ADB register documentation yourself.
+//
+// You cannot use counter 0 for any other thing when using the touchpad!
+//
+// Have fun! - Michael W. (acidbourbon)
+//
+// acidbourbon.wordpress.com
+// June 2013
+
+
+// define here the port and the pin where you cave connected
+// the ADB (I/O) line from your TM1001A touchpad
+#define ADB_BIT (1<<0)
+#define ADB_PIN PIND
+#define ADB_POUT PORTD
+#define ADB_PDIR DDRD
+
+// when touchpad is in keypad mode the next two defines set the number
+// of rows and columns of the
+#define PAD_ROWS 2
+#define PAD_COLS 3
+
+
+
+
+
+
+
+
+
+
+
+#define TAKT F_CPU
+
+//Bits Makro
+#define BITS(H,L)  (0b##H ##L)
+
+#define MIN_ABS_X 150
+#define MAX_ABS_X 1450
+#define MIN_ABS_Y 210
+#define MAX_ABS_Y 1130
+
+#define PAD_WIDTH (MAX_ABS_X-MIN_ABS_X)
+#define PAD_HEIGHT (MAX_ABS_Y-MIN_ABS_Y)
+#define PAD_COL_WIDTH (PAD_WIDTH/PAD_COLS)
+#define PAD_ROW_HEIGHT (PAD_HEIGHT/PAD_ROWS)
+
+//Vorteiler Timer 0 und 1 bei 2313, 8515, Mega8 (nicht Timer 2)
+#define TIMER_VT_1_B BITS(0000,0001)  
+#define TIMER_VT_8_B BITS(0000,0010)  
+#define TIMER_VT_64_B BITS(0000,0011)
+#define TIMER_VT_256_B BITS(0000,0100)
+#define TIMER_VT_1024_B BITS(0000,0101)
+
+#define TIMER_VT_1 1  
+#define TIMER_VT_8 8  
+#define TIMER_VT_64 64
+#define TIMER_VT_256 256
+#define TIMER_VT_1024 1024
+
+
+
+typedef unsigned char u08;
+typedef unsigned short int u16;
+
+#define COM_TALK0 BITS(0011,1100) //Adresse 3, Talk, Register0
+#define COM_TALK1 BITS(0011,1101) //Adresse 3, Talk, Register1
+#define COM_LISTEN1 BITS(0011,1001) //Adresse 3, Listen, Register1
+#define COM_TALK2 BITS(0011,1110) //Adresse 3, Talk, Register2
+#define COM_TALK3 BITS(0011,1111) //Adresse 3, Talk, Register3
+#define COM_LISTEN3 BITS(0011,1011) //Adresse 3, Listen, Register3
+#define MAX_ADB 9
+u08 adb_werte[MAX_ADB];
+u08 t0ovfcount;
+volatile u08 adb_data_length;
+
+
+ISR( TIMER3_OVF_vect) {
+       t0ovfcount++;
+}
+
+uint16_t t0ext(void) {
+       return (t0ovfcount * 256 + (u16) TCNT0); // return current counter value
+       // plus number of already passed counter cycles times 256
+}
+
+void t0rst(void) {
+       TCNT0 = 0; // set counter to zero
+       t0ovfcount = 0; // set overflow counter to zero
+
+}
+
+
+
+// ADB Register auslesen / schreiben 
+// Rückgabe Anzahl der Empfangenen Daten 
+// Befehl in adb_werte[0]. Empfangene bzw. zu sendende Daten in adb_werte[1 bis 8]
+
+
+
+
+u08 adb(void) {
+       u08 bitpos;
+       u08 z_byte;
+       u08 anzahl_out;
+       //Teilerwerte TC0
+#define ADB_VORTEILER_A TIMER_VT_64
+#define ADB_VORTEILER_A_BIT TIMER_VT_64_B
+#define ADB_VORTEILER_B TIMER_VT_8
+#define ADB_VORTEILER_B_BIT TIMER_VT_8_B
+#define ADB_IMPULS_LANG TAKT/ADB_VORTEILER_B*65/1000000 //97
+#define ADB_IMPULS_KURZ TAKT/ADB_VORTEILER_B*35/1000000        //52
+#define ADB_IMPULS_ATT TAKT/ADB_VORTEILER_A*570/1000000 // 106
+       //#define ADB_IMPULS_SYNC TAKT/ADB_VORTEILER_B*70/1000000
+#define ADB_IMPULS_TLT TAKT/ADB_VORTEILER_B*250/1000000 // !!! 375 mach das mit anderem prescaler
+//     #define ADB_IMPULS_TLT TAKT/ADB_VORTEILER_A*31/1000000 // modified
+       //#define ADB_IMPULS_PAUSE TAKT/ADB_VORTEILER_B*200/1000000
+
+       //Attention Signal
+       TCCR0B = ADB_VORTEILER_A_BIT;
+       t0rst(); //  TCNT0 = 0; // Zähler auf null setzen
+       ADB_PDIR |= ADB_BIT; // Ausgang 0
+       ADB_POUT &= ~ADB_BIT;
+       while (t0ext() < ADB_IMPULS_ATT)
+               ; // Warteschleife
+
+       TCCR0B = ADB_VORTEILER_B_BIT; // ab hier alles im schnellen modus
+
+       anzahl_out = 1; // Mindestens Befehl übertragen
+       z_byte = 0;
+       do {
+               // START BIT (1)
+               t0rst(); //  TCNT0 = 0;
+               ADB_PDIR |= ADB_BIT; // Ausgang 0
+               ADB_POUT &= ~ADB_BIT;
+               while (t0ext() < ADB_IMPULS_KURZ)
+                       ;
+               ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
+               ADB_POUT |= ADB_BIT;
+               while (t0ext() < ADB_IMPULS_KURZ + ADB_IMPULS_LANG)
+                       ;
+
+               for (; z_byte < anzahl_out; z_byte++) {
+                       for (bitpos = 128; bitpos; bitpos >>= 1) { //Daten ausgeben
+                               t0rst(); //  TCNT0 = 0;
+                               ADB_PDIR |= ADB_BIT; // Ausgang 0
+                               ADB_POUT &= ~ADB_BIT;
+                               if (adb_werte[z_byte] & bitpos)
+                                       while (t0ext() < ADB_IMPULS_KURZ)
+                                               ;
+                               else
+                                       while (t0ext() < ADB_IMPULS_LANG)
+                                               ;
+                               ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
+                               ADB_POUT |= ADB_BIT;
+                               while (t0ext() < ADB_IMPULS_KURZ + ADB_IMPULS_LANG)
+                                       ;
+                       }
+               }
+               // STOP BIT (0)
+               t0rst(); //  TCNT0 = 0;
+               ADB_PDIR |= ADB_BIT; // Ausgang 0
+               ADB_POUT &= ~ADB_BIT;
+               while (t0ext() < ADB_IMPULS_LANG)
+                       ;
+               ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
+               ADB_POUT |= ADB_BIT;
+               while (t0ext() < ADB_IMPULS_KURZ + ADB_IMPULS_LANG)
+                       ;
+
+               // Entscheidung, ob noch weitere Daten übertragen werden
+               if (adb_werte[0] == COM_LISTEN3)
+                       anzahl_out = 2 + 1;
+               else if (adb_werte[0] == COM_LISTEN1)
+                       anzahl_out = 8 + 1;
+               else
+                       z_byte = 8;
+       } while (z_byte < 2);
+
+       // Warten auf Rückgabewerte sonst Abbruch
+       // TCCR0 = ADB_VORTEILER_A_BIT; // micha modifikation
+       t0rst(); //  TCNT0 = 0;
+
+       do {
+               if (t0ext() > ADB_IMPULS_TLT) {
+                       return (0);
+               }
+       } while (ADB_PIN & ADB_BIT);
+       while (!(ADB_PIN & ADB_BIT))
+               ; // Start Bit
+
+       z_byte = 1;
+       while (z_byte < MAX_ADB) {
+               adb_werte[z_byte] = 0;
+               for (bitpos = 128; bitpos; bitpos >>= 1) { //Bits einlesen
+                       //TCCR0 = ADB_VORTEILER_B_BIT; //micha modifikation
+                       t0rst(); //  TCNT0 = 0;
+                       // Abbruch wenn keine weiteren Bytes übertragen werden.
+                       do {
+                               if (t0ext() > ADB_IMPULS_KURZ + ADB_IMPULS_LANG) {
+                                       return (z_byte - 1);
+                               }
+                       } while (ADB_PIN & ADB_BIT);
+                       t0rst(); //  TCNT0 = 0;
+                       while (!(ADB_PIN & ADB_BIT))
+                               ;
+                       if (t0ext() < (ADB_IMPULS_KURZ + ADB_IMPULS_LANG) / 2)
+                               adb_werte[z_byte] += bitpos;
+               }
+               z_byte++;
+       }
+       return (z_byte - 1);
+}
+
+void touchpad_init(void) {
+       // Eingänge
+       ADB_PDIR &= ~ADB_BIT;
+
+       // Pull Up einschalten
+       ADB_POUT |= ADB_BIT;
+
+       //enable timer0 interrupt
+       TIMSK0 |= (1 << TOIE0);
+}
+
+uint8_t touchpad_read(void) {
+       adb_werte[0] = COM_TALK0;
+       adb_data_length = adb();
+       return adb_data_length;
+}
+
+void touchpad_set_abs_mode(void) {
+       // Auf Absolutmodus umschalten
+       adb_werte[0] = COM_LISTEN3;
+       adb_werte[1] = BITS(0110,0011);
+       adb_werte[2] = 4; //CDM Modus
+       adb();
+
+       adb_werte[0] = COM_TALK1;
+       adb(); // Werte holen
+
+       adb_werte[0] = COM_LISTEN1;
+       adb_werte[7] = 0x00; //Absolutmodus
+       adb();
+}
+
+void touchpad_set_rel_mode_100dpi(void) {
+       // Auf Relativmodus umschalten
+       adb_werte[0] = COM_LISTEN3;
+       adb_werte[1] = BITS(0110,0011);
+       adb_werte[2] = 1; //default modus: 100 dpi mouse
+       adb();
+
+}
+
+void touchpad_set_rel_mode_200dpi(void) {
+       // Auf Relativmodus umschalten
+       adb_werte[0] = COM_LISTEN3;
+       adb_werte[1] = BITS(0110,0011);
+       adb_werte[2] = 2; //200 dpi mouse
+       adb();
+
+}
+
+uint8_t z_pressure(void) {
+       return ((adb_werte[5] & 0b01110000) >> 1) | (adb_werte[5] & 0b00000111);
+}
+
+uint16_t x_abs(void) {
+       return ((adb_werte[4] & 0b111) << 10) | ((adb_werte[3] & 0b111) << 7)
+                       | (adb_werte[2] & 0b01111111);
+}
+
+uint16_t y_abs(void) {
+       return ((adb_werte[4] & 0b01110000) << 6)
+                       | ((adb_werte[3] & 0b01110000) << 3) | (adb_werte[1] & 0b01111111);
+}
+
+int8_t delta_y(void) {
+       if(adb_data_length ==0) {
+               return 0;
+       }
+       if (adb_werte[1] & 0b01000000) {
+               return -((128 - adb_werte[1]) & 0b00111111);
+       } else {
+               return adb_werte[1] & 0b00111111;
+       }
+}
+
+int8_t delta_x(void) {
+       if(adb_data_length ==0) {
+               return 0;
+       }
+       if (adb_werte[2] & 0b01000000) {
+               return -((128 - adb_werte[2]) & 0b00111111);
+       } else {
+               return adb_werte[2] & 0b00111111;
+       }
+}
+/*
+uint8_t touchpad_button_pressed(void){
+       static uint8_t button_status=0;
+
+       if(adb_data_length ==0) {
+               return button_status;
+       }
+       if(adb_werte[1]&0b10000000){
+               button_status=1;
+               return 1;
+       }else{
+               button_status=0;
+               return 0;
+       }
+
+}
+*/
+
+uint8_t decode_field(void) {
+       static uint8_t last_pressure = 0;
+       uint8_t pressure, i, j;
+       uint8_t return_val = 0;
+       static uint16_t x_mem, y_mem;
+       uint16_t x, y;
+
+       pressure = z_pressure();
+       x = x_abs();
+       y = y_abs();
+
+       if (x) {
+               x_mem = x;
+       } else {
+               x = x_mem;
+       }
+
+       if (y) {
+               y_mem = y;
+       } else {
+               y = y_mem;
+       }
+
+       if ((pressure == 0) && (last_pressure > 0)) {
+
+               i = (y - MIN_ABS_Y) / PAD_ROW_HEIGHT;
+               j = (x - MIN_ABS_X) / PAD_COL_WIDTH;
+
+               return_val = i * PAD_COLS + j + 1;
+
+       }
+
+       last_pressure = pressure;
+       return return_val;
+}
diff --git a/firmware/USBtoSerial.c b/firmware/USBtoSerial.c
new file mode 100644 (file)
index 0000000..3cd194c
--- /dev/null
@@ -0,0 +1,480 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2013.\r
+\r
+  dean [at] fourwalledcubicle [dot] com\r
+           www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+  Copyright 2013  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this\r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in\r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting\r
+  documentation, and that the name of the author not be used in\r
+  advertising or publicity pertaining to distribution of the\r
+  software without specific, written prior permission.\r
+\r
+  The author disclaims all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+/** \file\r
+ *\r
+ *  Main source file for the USBtoSerial project. This file contains the main tasks of\r
+ *  the project and is responsible for the initial application hardware configuration.\r
+ */\r
+#define F_CPU 16e6\r
+\r
+#include "USBtoSerial.h"\r
+#include <util/delay.h>\r
+#include "TM1001A.c"\r
+// #include "rfm70.c"\r
+\r
+/** Circular buffer to hold data from the host before it is sent to the device via the serial port. */\r
+static RingBuffer_t USBtoUSART_Buffer;\r
+\r
+/** Underlying data buffer for \ref USBtoUSART_Buffer, where the stored bytes are located. */\r
+static uint8_t      USBtoUSART_Buffer_Data[128];\r
+\r
+/** Circular buffer to hold data from the serial port before it is sent to the host. */\r
+static RingBuffer_t USARTtoUSB_Buffer;\r
+\r
+/** Underlying data buffer for \ref USARTtoUSB_Buffer, where the stored bytes are located. */\r
+static uint8_t      USARTtoUSB_Buffer_Data[128];\r
+\r
+/** LUFA CDC Class driver interface configuration and state information. This structure is\r
+ *  passed to all CDC Class driver functions, so that multiple instances of the same class\r
+ *  within a device can be differentiated from one another.\r
+ */\r
+USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =\r
+       {\r
+               .Config =\r
+                       {\r
+                               .ControlInterfaceNumber         = 0,\r
+                               .DataINEndpoint                 =\r
+                                       {\r
+                                               .Address                = CDC_TX_EPADDR,\r
+                                               .Size                   = CDC_TXRX_EPSIZE,\r
+                                               .Banks                  = 1,\r
+                                       },\r
+                               .DataOUTEndpoint                =\r
+                                       {\r
+                                               .Address                = CDC_RX_EPADDR,\r
+                                               .Size                   = CDC_TXRX_EPSIZE,\r
+                                               .Banks                  = 1,\r
+                                       },\r
+                               .NotificationEndpoint           =\r
+                                       {\r
+                                               .Address                = CDC_NOTIFICATION_EPADDR,\r
+                                               .Size                   = CDC_NOTIFICATION_EPSIZE,\r
+                                               .Banks                  = 1,\r
+                                       },\r
+                       },\r
+       };\r
+\r
+\r
+\r
+\r
+\r
+void Usb2SerialTask(void) {\r
+  \r
+    /* Only try to read in bytes from the CDC interface if the transmit buffer is not full */\r
+    if (!(RingBuffer_IsFull(&USBtoUSART_Buffer)))\r
+    {\r
+      int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);\r
+\r
+      /* Read bytes from the USB OUT endpoint into the USART transmit buffer */\r
+      if (!(ReceivedByte < 0))\r
+        RingBuffer_Insert(&USBtoUSART_Buffer, ReceivedByte);\r
+    }\r
+\r
+    /* Check if the UART receive buffer flush timer has expired or the buffer is nearly full */\r
+    uint16_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer);\r
+    if (BufferCount)\r
+    {\r
+      Endpoint_SelectEndpoint(VirtualSerial_CDC_Interface.Config.DataINEndpoint.Address);\r
+\r
+      /* Check if a packet is already enqueued to the host - if so, we shouldn't try to send more data\r
+       * until it completes as there is a chance nothing is listening and a lengthy timeout could occur */\r
+      if (Endpoint_IsINReady())\r
+      {\r
+        /* Never send more than one bank size less one byte to the host at a time, so that we don't block\r
+         * while a Zero Length Packet (ZLP) to terminate the transfer is sent if the host isn't listening */\r
+        uint8_t BytesToSend = MIN(BufferCount, (CDC_TXRX_EPSIZE - 1));\r
+\r
+        /* Read bytes from the USART receive buffer into the USB IN endpoint */\r
+        while (BytesToSend--)\r
+        {\r
+          /* Try to send the next byte of data to the host, abort if there is an error without dequeuing */\r
+          if (CDC_Device_SendByte(&VirtualSerial_CDC_Interface,\r
+                      RingBuffer_Peek(&USARTtoUSB_Buffer)) != ENDPOINT_READYWAIT_NoError)\r
+          {\r
+            break;\r
+          }\r
+\r
+          /* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */\r
+          RingBuffer_Remove(&USARTtoUSB_Buffer);\r
+        }\r
+      }\r
+    }\r
+\r
+    /* Load the next byte from the USART transmit buffer into the USART */\r
+    if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) {\r
+      Serial_SendByte(RingBuffer_Remove(&USBtoUSART_Buffer));\r
+//      dummy = RingBuffer_Remove(&USBtoUSART_Buffer);\r
+//      sendPayload(&dummy,1,0);\r
+    }\r
+    CDC_Device_USBTask(&VirtualSerial_CDC_Interface);\r
+    USB_USBTask();\r
+  \r
+}\r
+\r
+\r
+\r
+/** Configures the board hardware and chip peripherals for the demo's functionality. */\r
+void SetupHardware(void)\r
+{\r
+       /* Disable watchdog if enabled by bootloader/fuses */\r
+       MCUSR &= ~(1 << WDRF);\r
+       wdt_disable();\r
+\r
+       /* Disable clock division */\r
+       clock_prescale_set(clock_div_1);\r
+\r
+       /* Hardware Initialization */\r
+//     LEDs_Init();\r
+       USB_Init();\r
+}\r
+\r
+/** Event handler for the library USB Connection event. */\r
+void EVENT_USB_Device_Connect(void)\r
+{\r
+//     LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);\r
+}\r
+\r
+/** Event handler for the library USB Disconnection event. */\r
+void EVENT_USB_Device_Disconnect(void)\r
+{\r
+//     LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);\r
+}\r
+\r
+/** Event handler for the library USB Configuration Changed event. */\r
+void EVENT_USB_Device_ConfigurationChanged(void)\r
+{\r
+       bool ConfigSuccess = true;\r
+\r
+       ConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface);\r
+\r
+//     LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);\r
+}\r
+\r
+/** Event handler for the library USB Control Request reception event. */\r
+void EVENT_USB_Device_ControlRequest(void)\r
+{\r
+       CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface);\r
+}\r
+\r
+/** ISR to manage the reception of data from the serial port, placing received bytes into a circular buffer\r
+ *  for later transmission to the host.\r
+ */\r
+ISR(USART1_RX_vect, ISR_BLOCK)\r
+{\r
+       uint8_t ReceivedByte = UDR1;\r
+\r
+       if (USB_DeviceState == DEVICE_STATE_Configured)\r
+         RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte);\r
+}\r
+\r
+/** Event handler for the CDC Class driver Line Encoding Changed event.\r
+ *\r
+ *  \param[in] CDCInterfaceInfo  Pointer to the CDC class interface configuration structure being referenced\r
+ */\r
+void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)\r
+{\r
+       uint8_t ConfigMask = 0;\r
+\r
+       switch (CDCInterfaceInfo->State.LineEncoding.ParityType)\r
+       {\r
+               case CDC_PARITY_Odd:\r
+                       ConfigMask = ((1 << UPM11) | (1 << UPM10));\r
+                       break;\r
+               case CDC_PARITY_Even:\r
+                       ConfigMask = (1 << UPM11);\r
+                       break;\r
+       }\r
+\r
+       if (CDCInterfaceInfo->State.LineEncoding.CharFormat == CDC_LINEENCODING_TwoStopBits)\r
+         ConfigMask |= (1 << USBS1);\r
+\r
+       switch (CDCInterfaceInfo->State.LineEncoding.DataBits)\r
+       {\r
+               case 6:\r
+                       ConfigMask |= (1 << UCSZ10);\r
+                       break;\r
+               case 7:\r
+                       ConfigMask |= (1 << UCSZ11);\r
+                       break;\r
+               case 8:\r
+                       ConfigMask |= ((1 << UCSZ11) | (1 << UCSZ10));\r
+                       break;\r
+       }\r
+\r
+       /* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */\r
+       UCSR1B = 0;\r
+       UCSR1A = 0;\r
+       UCSR1C = 0;\r
+\r
+       /* Set the new baud rate before configuring the USART */\r
+       UBRR1  = SERIAL_2X_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS);\r
+\r
+       /* Reconfigure the USART in double speed mode for a wider baud rate range at the expense of accuracy */\r
+       UCSR1C = ConfigMask;\r
+       UCSR1A = (1 << U2X1);\r
+       UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1));\r
+}\r
+\r
+\r
+\r
+\r
+void uart_putc(unsigned char data)\r
+{\r
+\r
+      if (USB_DeviceState == DEVICE_STATE_Configured){\r
+        RingBuffer_Insert(&USARTtoUSB_Buffer, data);\r
+      }\r
+  \r
+}\r
+\r
+void uart_puts(const char *s )\r
+{\r
+    while (*s) \r
+      uart_putc(*s++);\r
+\r
+}/* uart_puts */\r
+\r
+\r
+// convert an unsigned integer to string\r
+void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) {\r
+  int8_t i; // schleifenzähler\r
+\r
+  string[no_digits] = '\0'; // String Terminator\r
+  for (i = (no_digits - 1); i >= 0; i--) {\r
+    if (zahl == 0 && i < (no_digits - 1)) {\r
+      string[i] = ' ';\r
+    } else {\r
+      string[i] = (zahl % 10) + '0';\r
+    } // Modulo rechnen, dann den ASCII-Code von '0' addieren\r
+    zahl /= 10;\r
+  }\r
+\r
+}\r
+\r
+/** Main program entry point. This routine contains the overall program flow, including initial\r
+ *  setup of all components and the main program loop.\r
+ */\r
+int main(void)\r
+{\r
+  char dummy;\r
+  uint8_t field_val = 0;\r
+  SetupHardware();\r
+\r
+\r
+\r
+  RingBuffer_InitBuffer(&USBtoUSART_Buffer, USBtoUSART_Buffer_Data, sizeof(USBtoUSART_Buffer_Data));\r
+  RingBuffer_InitBuffer(&USARTtoUSB_Buffer, USARTtoUSB_Buffer_Data, sizeof(USARTtoUSB_Buffer_Data));\r
+\r
+//   LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);\r
+  GlobalInterruptEnable();\r
+\r
+  touchpad_init(); // you need to call this to setup the I/O pin!\r
+  sei();\r
+  _delay_ms(500);\r
+\r
+\r
+// setup rfm70 transceiver\r
+\r
+//  Begin();\r
+// \r
+//  setMode(0);// set mode t\r
+//  setChannel(8);\r
+//  _delay_ms(1000);\r
+//  sendPayload("eins",4, 0);\r
+//  _delay_ms(1000);\r
+\r
+\r
+// end\r
+  \r
+  uint8_t loopcounter=0;\r
+\r
+  char stringbuffer[16];\r
+//   for (;;) { // the eternal loop\r
+//     \r
+//     Usb2SerialTask();\r
+//     loopcounter++;\r
+//     if(loopcounter == 0){\r
+//       uart_puts("blah\r\n");\r
+// //       if (USB_DeviceState == DEVICE_STATE_Configured){\r
+// //         RingBuffer_Insert(&USARTtoUSB_Buffer, 'b');\r
+// //       }\r
+//     }\r
+//     \r
+//   }\r
+  \r
+  \r
+  \r
+  \r
+  \r
+//######################################################################\r
+// uncomment desired demo mode here!\r
+\r
+#define DEMO_MODE KEYPAD_MODE\r
+//#define DEMO_MODE ABSOLUTE_MODE\r
+//#define DEMO_MODE RELATIVE_MODE\r
+//######################################################################\r
+\r
+// #if DEMO_MODE == KEYPAD_MODE\r
+  // begin of keypad mode demo block\r
+  // current configuration is: 3 colums, 2 rows => 6 touch buttons\r
+  // this can be changed by the PAD_ROWS/PAD_COLS defines in the TM1001A.c file\r
+\r
+  //   -------------------------\r
+  //   | back  |  up   | enter |\r
+  //   -------------------------\r
+  //   | left  |  down | right |\r
+  //   -------------------------\r
+\r
+  uart_puts("you selected the keypad demo modus:\n\r");\r
+  uint8_t x, y = 0;\r
+  int8_t dx, dy = 0;\r
+//   touchpad_set_abs_mode(); // keypad functionality uses the "absolute mode"\r
+  while (1) {\r
+    Usb2SerialTask();\r
+    loopcounter++;\r
+    if(loopcounter) {\r
+      continue;\r
+    }\r
+// //     uart_puts("c");\r
+//     _delay_ms(20);\r
+\r
+    dummy=touchpad_read(); // read values from the touchpad\r
+    my_uitoa(dummy,stringbuffer,4);// x_abs returns current x position of your finger\r
+    uart_puts("data_length: ");\r
+    uart_puts(stringbuffer);\r
+    uart_puts(" x_pos: ");\r
+    my_uitoa(delta_x(),stringbuffer,4);// x_abs returns current x position of your finger\r
+    uart_puts(stringbuffer);\r
+//     uart_puts("\r");\r
+//     field_val = decode_field(); // decode_field returns the number of the\r
+//     // touch button that was pressed last. or zero if nothing happened\r
+// \r
+//     switch (field_val) {\r
+// \r
+//     case 4:\r
+//       uart_puts("left\n\r");\r
+//       break;\r
+//     case 6:\r
+//       uart_puts("right\n\r");\r
+//       break;\r
+//     case 2:\r
+//       uart_puts("up\n\r");\r
+//       break;\r
+//     case 5:\r
+//       uart_puts("down\n\r");\r
+//       break;\r
+//     case 1:\r
+//       uart_puts("back\n\r");\r
+//       break;\r
+//     case 3:\r
+//       uart_puts("enter\n\r");\r
+//       break;\r
+//     default:\r
+//       break;\r
+//     }\r
+// \r
+//   }\r
+  // end of keypad mode demo block\r
+\r
+// #elif DEMO_MODE == ABSOLUTE_MODE\r
+  // begin of keypad mode demo block\r
+//   uart_puts("you selected the absolute position demo modus:\n\r");\r
+//   touchpad_set_abs_mode();// tell the touchpad you want to use it in the "absolute mode"\r
+//   while (1) {\r
+// \r
+//     _delay_ms(20);\r
+// \r
+//     touchpad_read(); // read data from the touchpad\r
+//     uart_puts("x_pos: ");\r
+//     my_uitoa(x_abs(),stringbuffer,4);// x_abs returns current x position of your finger\r
+//     uart_puts(stringbuffer);\r
+//     uart_puts("\ty_pos: ");\r
+//     my_uitoa(y_abs(),stringbuffer,4);// y_abs returns current y position of your finger\r
+//     uart_puts(stringbuffer);\r
+//     uart_puts("\tz_pressure: ");// z_pressure returns current "pressure" (contact area) of your finger\r
+//     my_uitoa(z_pressure(),stringbuffer,4);\r
+//     uart_puts(stringbuffer);\r
+//     uart_puts("\r");\r
+// \r
+//   }\r
+//   // end of absolute mode demo block\r
+// \r
+// // #elif DEMO_MODE == RELATIVE_MODE\r
+//   // begin of relative mode demo block\r
+//   uart_puts("you selected the relative position demo modus:\n\r");\r
+//   touchpad_set_rel_mode_100dpi();// use touchpad in relative mode\r
+// //  touchpad_set_rel_mode_200dpi(); // uncomment this line if you want double resolution\r
+//   uint8_t x, y = 0;\r
+//   int8_t dx, dy = 0;\r
+// \r
+//   while (1) {\r
+// \r
+//     _delay_ms(20);\r
+// \r
+//     touchpad_read(); // read data from touchpad\r
+\r
+    dx = delta_x();// returns the amount your finger has moved in x direction since last readout\r
+    dy = delta_y();// returns the amount your finger has moved in y direction since last readout\r
+\r
+    // increment/decrement some dummy variables with the\r
+    if (x + dx > 255) {\r
+      x = 255;\r
+    } else if (x + dx < 0) {\r
+      x = 0;\r
+    } else {\r
+      x = (x + dx);\r
+    }\r
+\r
+    if (y + dy > 255) {\r
+      y = 255;\r
+    } else if (y + dy < 0) {\r
+      y = 0;\r
+    } else {\r
+      y = (y + dy);\r
+    }\r
+\r
+    uart_puts("x_pos: ");\r
+    my_uitoa(x, stringbuffer, 4);\r
+    uart_puts(stringbuffer);\r
+    uart_puts("\ty_pos: ");\r
+    my_uitoa(y, stringbuffer, 4);\r
+    uart_puts(stringbuffer);\r
+    uart_puts("\r");\r
+\r
+//   }\r
+  // end of relative mode demo block\r
+\r
+// #endif\r
+\r
+}\r
+\r
+\r
+} // end of main
\ No newline at end of file
diff --git a/firmware/USBtoSerial.c~ b/firmware/USBtoSerial.c~
new file mode 100644 (file)
index 0000000..3cd194c
--- /dev/null
@@ -0,0 +1,480 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2013.\r
+\r
+  dean [at] fourwalledcubicle [dot] com\r
+           www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+  Copyright 2013  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this\r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in\r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting\r
+  documentation, and that the name of the author not be used in\r
+  advertising or publicity pertaining to distribution of the\r
+  software without specific, written prior permission.\r
+\r
+  The author disclaims all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+/** \file\r
+ *\r
+ *  Main source file for the USBtoSerial project. This file contains the main tasks of\r
+ *  the project and is responsible for the initial application hardware configuration.\r
+ */\r
+#define F_CPU 16e6\r
+\r
+#include "USBtoSerial.h"\r
+#include <util/delay.h>\r
+#include "TM1001A.c"\r
+// #include "rfm70.c"\r
+\r
+/** Circular buffer to hold data from the host before it is sent to the device via the serial port. */\r
+static RingBuffer_t USBtoUSART_Buffer;\r
+\r
+/** Underlying data buffer for \ref USBtoUSART_Buffer, where the stored bytes are located. */\r
+static uint8_t      USBtoUSART_Buffer_Data[128];\r
+\r
+/** Circular buffer to hold data from the serial port before it is sent to the host. */\r
+static RingBuffer_t USARTtoUSB_Buffer;\r
+\r
+/** Underlying data buffer for \ref USARTtoUSB_Buffer, where the stored bytes are located. */\r
+static uint8_t      USARTtoUSB_Buffer_Data[128];\r
+\r
+/** LUFA CDC Class driver interface configuration and state information. This structure is\r
+ *  passed to all CDC Class driver functions, so that multiple instances of the same class\r
+ *  within a device can be differentiated from one another.\r
+ */\r
+USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =\r
+       {\r
+               .Config =\r
+                       {\r
+                               .ControlInterfaceNumber         = 0,\r
+                               .DataINEndpoint                 =\r
+                                       {\r
+                                               .Address                = CDC_TX_EPADDR,\r
+                                               .Size                   = CDC_TXRX_EPSIZE,\r
+                                               .Banks                  = 1,\r
+                                       },\r
+                               .DataOUTEndpoint                =\r
+                                       {\r
+                                               .Address                = CDC_RX_EPADDR,\r
+                                               .Size                   = CDC_TXRX_EPSIZE,\r
+                                               .Banks                  = 1,\r
+                                       },\r
+                               .NotificationEndpoint           =\r
+                                       {\r
+                                               .Address                = CDC_NOTIFICATION_EPADDR,\r
+                                               .Size                   = CDC_NOTIFICATION_EPSIZE,\r
+                                               .Banks                  = 1,\r
+                                       },\r
+                       },\r
+       };\r
+\r
+\r
+\r
+\r
+\r
+void Usb2SerialTask(void) {\r
+  \r
+    /* Only try to read in bytes from the CDC interface if the transmit buffer is not full */\r
+    if (!(RingBuffer_IsFull(&USBtoUSART_Buffer)))\r
+    {\r
+      int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);\r
+\r
+      /* Read bytes from the USB OUT endpoint into the USART transmit buffer */\r
+      if (!(ReceivedByte < 0))\r
+        RingBuffer_Insert(&USBtoUSART_Buffer, ReceivedByte);\r
+    }\r
+\r
+    /* Check if the UART receive buffer flush timer has expired or the buffer is nearly full */\r
+    uint16_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer);\r
+    if (BufferCount)\r
+    {\r
+      Endpoint_SelectEndpoint(VirtualSerial_CDC_Interface.Config.DataINEndpoint.Address);\r
+\r
+      /* Check if a packet is already enqueued to the host - if so, we shouldn't try to send more data\r
+       * until it completes as there is a chance nothing is listening and a lengthy timeout could occur */\r
+      if (Endpoint_IsINReady())\r
+      {\r
+        /* Never send more than one bank size less one byte to the host at a time, so that we don't block\r
+         * while a Zero Length Packet (ZLP) to terminate the transfer is sent if the host isn't listening */\r
+        uint8_t BytesToSend = MIN(BufferCount, (CDC_TXRX_EPSIZE - 1));\r
+\r
+        /* Read bytes from the USART receive buffer into the USB IN endpoint */\r
+        while (BytesToSend--)\r
+        {\r
+          /* Try to send the next byte of data to the host, abort if there is an error without dequeuing */\r
+          if (CDC_Device_SendByte(&VirtualSerial_CDC_Interface,\r
+                      RingBuffer_Peek(&USARTtoUSB_Buffer)) != ENDPOINT_READYWAIT_NoError)\r
+          {\r
+            break;\r
+          }\r
+\r
+          /* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */\r
+          RingBuffer_Remove(&USARTtoUSB_Buffer);\r
+        }\r
+      }\r
+    }\r
+\r
+    /* Load the next byte from the USART transmit buffer into the USART */\r
+    if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) {\r
+      Serial_SendByte(RingBuffer_Remove(&USBtoUSART_Buffer));\r
+//      dummy = RingBuffer_Remove(&USBtoUSART_Buffer);\r
+//      sendPayload(&dummy,1,0);\r
+    }\r
+    CDC_Device_USBTask(&VirtualSerial_CDC_Interface);\r
+    USB_USBTask();\r
+  \r
+}\r
+\r
+\r
+\r
+/** Configures the board hardware and chip peripherals for the demo's functionality. */\r
+void SetupHardware(void)\r
+{\r
+       /* Disable watchdog if enabled by bootloader/fuses */\r
+       MCUSR &= ~(1 << WDRF);\r
+       wdt_disable();\r
+\r
+       /* Disable clock division */\r
+       clock_prescale_set(clock_div_1);\r
+\r
+       /* Hardware Initialization */\r
+//     LEDs_Init();\r
+       USB_Init();\r
+}\r
+\r
+/** Event handler for the library USB Connection event. */\r
+void EVENT_USB_Device_Connect(void)\r
+{\r
+//     LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);\r
+}\r
+\r
+/** Event handler for the library USB Disconnection event. */\r
+void EVENT_USB_Device_Disconnect(void)\r
+{\r
+//     LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);\r
+}\r
+\r
+/** Event handler for the library USB Configuration Changed event. */\r
+void EVENT_USB_Device_ConfigurationChanged(void)\r
+{\r
+       bool ConfigSuccess = true;\r
+\r
+       ConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface);\r
+\r
+//     LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);\r
+}\r
+\r
+/** Event handler for the library USB Control Request reception event. */\r
+void EVENT_USB_Device_ControlRequest(void)\r
+{\r
+       CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface);\r
+}\r
+\r
+/** ISR to manage the reception of data from the serial port, placing received bytes into a circular buffer\r
+ *  for later transmission to the host.\r
+ */\r
+ISR(USART1_RX_vect, ISR_BLOCK)\r
+{\r
+       uint8_t ReceivedByte = UDR1;\r
+\r
+       if (USB_DeviceState == DEVICE_STATE_Configured)\r
+         RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte);\r
+}\r
+\r
+/** Event handler for the CDC Class driver Line Encoding Changed event.\r
+ *\r
+ *  \param[in] CDCInterfaceInfo  Pointer to the CDC class interface configuration structure being referenced\r
+ */\r
+void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)\r
+{\r
+       uint8_t ConfigMask = 0;\r
+\r
+       switch (CDCInterfaceInfo->State.LineEncoding.ParityType)\r
+       {\r
+               case CDC_PARITY_Odd:\r
+                       ConfigMask = ((1 << UPM11) | (1 << UPM10));\r
+                       break;\r
+               case CDC_PARITY_Even:\r
+                       ConfigMask = (1 << UPM11);\r
+                       break;\r
+       }\r
+\r
+       if (CDCInterfaceInfo->State.LineEncoding.CharFormat == CDC_LINEENCODING_TwoStopBits)\r
+         ConfigMask |= (1 << USBS1);\r
+\r
+       switch (CDCInterfaceInfo->State.LineEncoding.DataBits)\r
+       {\r
+               case 6:\r
+                       ConfigMask |= (1 << UCSZ10);\r
+                       break;\r
+               case 7:\r
+                       ConfigMask |= (1 << UCSZ11);\r
+                       break;\r
+               case 8:\r
+                       ConfigMask |= ((1 << UCSZ11) | (1 << UCSZ10));\r
+                       break;\r
+       }\r
+\r
+       /* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */\r
+       UCSR1B = 0;\r
+       UCSR1A = 0;\r
+       UCSR1C = 0;\r
+\r
+       /* Set the new baud rate before configuring the USART */\r
+       UBRR1  = SERIAL_2X_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS);\r
+\r
+       /* Reconfigure the USART in double speed mode for a wider baud rate range at the expense of accuracy */\r
+       UCSR1C = ConfigMask;\r
+       UCSR1A = (1 << U2X1);\r
+       UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1));\r
+}\r
+\r
+\r
+\r
+\r
+void uart_putc(unsigned char data)\r
+{\r
+\r
+      if (USB_DeviceState == DEVICE_STATE_Configured){\r
+        RingBuffer_Insert(&USARTtoUSB_Buffer, data);\r
+      }\r
+  \r
+}\r
+\r
+void uart_puts(const char *s )\r
+{\r
+    while (*s) \r
+      uart_putc(*s++);\r
+\r
+}/* uart_puts */\r
+\r
+\r
+// convert an unsigned integer to string\r
+void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) {\r
+  int8_t i; // schleifenzähler\r
+\r
+  string[no_digits] = '\0'; // String Terminator\r
+  for (i = (no_digits - 1); i >= 0; i--) {\r
+    if (zahl == 0 && i < (no_digits - 1)) {\r
+      string[i] = ' ';\r
+    } else {\r
+      string[i] = (zahl % 10) + '0';\r
+    } // Modulo rechnen, dann den ASCII-Code von '0' addieren\r
+    zahl /= 10;\r
+  }\r
+\r
+}\r
+\r
+/** Main program entry point. This routine contains the overall program flow, including initial\r
+ *  setup of all components and the main program loop.\r
+ */\r
+int main(void)\r
+{\r
+  char dummy;\r
+  uint8_t field_val = 0;\r
+  SetupHardware();\r
+\r
+\r
+\r
+  RingBuffer_InitBuffer(&USBtoUSART_Buffer, USBtoUSART_Buffer_Data, sizeof(USBtoUSART_Buffer_Data));\r
+  RingBuffer_InitBuffer(&USARTtoUSB_Buffer, USARTtoUSB_Buffer_Data, sizeof(USARTtoUSB_Buffer_Data));\r
+\r
+//   LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);\r
+  GlobalInterruptEnable();\r
+\r
+  touchpad_init(); // you need to call this to setup the I/O pin!\r
+  sei();\r
+  _delay_ms(500);\r
+\r
+\r
+// setup rfm70 transceiver\r
+\r
+//  Begin();\r
+// \r
+//  setMode(0);// set mode t\r
+//  setChannel(8);\r
+//  _delay_ms(1000);\r
+//  sendPayload("eins",4, 0);\r
+//  _delay_ms(1000);\r
+\r
+\r
+// end\r
+  \r
+  uint8_t loopcounter=0;\r
+\r
+  char stringbuffer[16];\r
+//   for (;;) { // the eternal loop\r
+//     \r
+//     Usb2SerialTask();\r
+//     loopcounter++;\r
+//     if(loopcounter == 0){\r
+//       uart_puts("blah\r\n");\r
+// //       if (USB_DeviceState == DEVICE_STATE_Configured){\r
+// //         RingBuffer_Insert(&USARTtoUSB_Buffer, 'b');\r
+// //       }\r
+//     }\r
+//     \r
+//   }\r
+  \r
+  \r
+  \r
+  \r
+  \r
+//######################################################################\r
+// uncomment desired demo mode here!\r
+\r
+#define DEMO_MODE KEYPAD_MODE\r
+//#define DEMO_MODE ABSOLUTE_MODE\r
+//#define DEMO_MODE RELATIVE_MODE\r
+//######################################################################\r
+\r
+// #if DEMO_MODE == KEYPAD_MODE\r
+  // begin of keypad mode demo block\r
+  // current configuration is: 3 colums, 2 rows => 6 touch buttons\r
+  // this can be changed by the PAD_ROWS/PAD_COLS defines in the TM1001A.c file\r
+\r
+  //   -------------------------\r
+  //   | back  |  up   | enter |\r
+  //   -------------------------\r
+  //   | left  |  down | right |\r
+  //   -------------------------\r
+\r
+  uart_puts("you selected the keypad demo modus:\n\r");\r
+  uint8_t x, y = 0;\r
+  int8_t dx, dy = 0;\r
+//   touchpad_set_abs_mode(); // keypad functionality uses the "absolute mode"\r
+  while (1) {\r
+    Usb2SerialTask();\r
+    loopcounter++;\r
+    if(loopcounter) {\r
+      continue;\r
+    }\r
+// //     uart_puts("c");\r
+//     _delay_ms(20);\r
+\r
+    dummy=touchpad_read(); // read values from the touchpad\r
+    my_uitoa(dummy,stringbuffer,4);// x_abs returns current x position of your finger\r
+    uart_puts("data_length: ");\r
+    uart_puts(stringbuffer);\r
+    uart_puts(" x_pos: ");\r
+    my_uitoa(delta_x(),stringbuffer,4);// x_abs returns current x position of your finger\r
+    uart_puts(stringbuffer);\r
+//     uart_puts("\r");\r
+//     field_val = decode_field(); // decode_field returns the number of the\r
+//     // touch button that was pressed last. or zero if nothing happened\r
+// \r
+//     switch (field_val) {\r
+// \r
+//     case 4:\r
+//       uart_puts("left\n\r");\r
+//       break;\r
+//     case 6:\r
+//       uart_puts("right\n\r");\r
+//       break;\r
+//     case 2:\r
+//       uart_puts("up\n\r");\r
+//       break;\r
+//     case 5:\r
+//       uart_puts("down\n\r");\r
+//       break;\r
+//     case 1:\r
+//       uart_puts("back\n\r");\r
+//       break;\r
+//     case 3:\r
+//       uart_puts("enter\n\r");\r
+//       break;\r
+//     default:\r
+//       break;\r
+//     }\r
+// \r
+//   }\r
+  // end of keypad mode demo block\r
+\r
+// #elif DEMO_MODE == ABSOLUTE_MODE\r
+  // begin of keypad mode demo block\r
+//   uart_puts("you selected the absolute position demo modus:\n\r");\r
+//   touchpad_set_abs_mode();// tell the touchpad you want to use it in the "absolute mode"\r
+//   while (1) {\r
+// \r
+//     _delay_ms(20);\r
+// \r
+//     touchpad_read(); // read data from the touchpad\r
+//     uart_puts("x_pos: ");\r
+//     my_uitoa(x_abs(),stringbuffer,4);// x_abs returns current x position of your finger\r
+//     uart_puts(stringbuffer);\r
+//     uart_puts("\ty_pos: ");\r
+//     my_uitoa(y_abs(),stringbuffer,4);// y_abs returns current y position of your finger\r
+//     uart_puts(stringbuffer);\r
+//     uart_puts("\tz_pressure: ");// z_pressure returns current "pressure" (contact area) of your finger\r
+//     my_uitoa(z_pressure(),stringbuffer,4);\r
+//     uart_puts(stringbuffer);\r
+//     uart_puts("\r");\r
+// \r
+//   }\r
+//   // end of absolute mode demo block\r
+// \r
+// // #elif DEMO_MODE == RELATIVE_MODE\r
+//   // begin of relative mode demo block\r
+//   uart_puts("you selected the relative position demo modus:\n\r");\r
+//   touchpad_set_rel_mode_100dpi();// use touchpad in relative mode\r
+// //  touchpad_set_rel_mode_200dpi(); // uncomment this line if you want double resolution\r
+//   uint8_t x, y = 0;\r
+//   int8_t dx, dy = 0;\r
+// \r
+//   while (1) {\r
+// \r
+//     _delay_ms(20);\r
+// \r
+//     touchpad_read(); // read data from touchpad\r
+\r
+    dx = delta_x();// returns the amount your finger has moved in x direction since last readout\r
+    dy = delta_y();// returns the amount your finger has moved in y direction since last readout\r
+\r
+    // increment/decrement some dummy variables with the\r
+    if (x + dx > 255) {\r
+      x = 255;\r
+    } else if (x + dx < 0) {\r
+      x = 0;\r
+    } else {\r
+      x = (x + dx);\r
+    }\r
+\r
+    if (y + dy > 255) {\r
+      y = 255;\r
+    } else if (y + dy < 0) {\r
+      y = 0;\r
+    } else {\r
+      y = (y + dy);\r
+    }\r
+\r
+    uart_puts("x_pos: ");\r
+    my_uitoa(x, stringbuffer, 4);\r
+    uart_puts(stringbuffer);\r
+    uart_puts("\ty_pos: ");\r
+    my_uitoa(y, stringbuffer, 4);\r
+    uart_puts(stringbuffer);\r
+    uart_puts("\r");\r
+\r
+//   }\r
+  // end of relative mode demo block\r
+\r
+// #endif\r
+\r
+}\r
+\r
+\r
+} // end of main
\ No newline at end of file
diff --git a/firmware/USBtoSerial.d b/firmware/USBtoSerial.d
new file mode 100644 (file)
index 0000000..27289d5
--- /dev/null
@@ -0,0 +1,307 @@
+USBtoSerial.o: USBtoSerial.c USBtoSerial.h Descriptors.h \
+ ../../LUFA/../LUFA/Drivers/USB/USB.h \
+ ../../LUFA/../LUFA/Drivers/USB/../../Common/Common.h \
+ ../../LUFA/../LUFA/Drivers/USB/../../Common/Architectures.h \
+ ../../LUFA/../LUFA/Drivers/USB/../../Common/BoardTypes.h \
+ ../../LUFA/../LUFA/Drivers/USB/../../Common/ArchitectureSpecific.h \
+ ../../LUFA/../LUFA/Drivers/USB/../../Common/CompilerSpecific.h \
+ ../../LUFA/../LUFA/Drivers/USB/../../Common/Attributes.h \
+ Config/LUFAConfig.h \
+ ../../LUFA/../LUFA/Drivers/USB/../../Common/Endianness.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/USBMode.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/../../../Common/Common.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/USBTask.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/USBMode.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/USBController.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../../../../Common/Common.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBMode.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Events.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../../../../Common/Common.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBMode.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBTask.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBInterrupt.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/USBInterrupt_AVR8.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../../../../Common/Common.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../USBMode.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../Events.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../USBController.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Device.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../StdDescriptors.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Events.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBInterrupt.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Endpoint.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/Endpoint_AVR8.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../USBTask.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../USBInterrupt.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/Device_AVR8.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../StdDescriptors.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../Endpoint.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Endpoint.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../DeviceStandardReq.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../StdRequestType.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBTask.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBController.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../EndpointStream.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/EndpointStream_AVR8.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/Events.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/StdRequestType.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/StdDescriptors.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/DeviceStandardReq.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/Events.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/StdDescriptors.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/ConfigDescriptors.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/HostStandardReq.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/USBController.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/USBInterrupt.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/Device.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/Endpoint.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/DeviceStandardReq.h \
+ ../../LUFA/../LUFA/Drivers/USB/Core/EndpointStream.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/AndroidAccessoryClass.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/../Core/USBMode.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/AudioClass.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/AudioClassDevice.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../../USB.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/AudioClassCommon.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/../../Core/StdDescriptors.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/CDCClass.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/CDCClassDevice.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/CDCClassCommon.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/HIDClass.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/HIDClassDevice.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/HIDClassCommon.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/HIDParser.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/../../../../Common/Common.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/HIDReportData.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/HIDClassCommon.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/MassStorageClass.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/MassStorageClassCommon.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/MIDIClass.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/MIDIClassCommon.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/AudioClassCommon.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/PrinterClass.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/RNDISClass.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/RNDISClassCommon.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/CDCClassCommon.h \
+ ../../LUFA/../LUFA/Drivers/USB/Class/StillImageClass.h \
+ ../../LUFA/../LUFA/Drivers/Board/LEDs.h \
+ ../../LUFA/../LUFA/Drivers/Board/../../Common/Common.h \
+ ../../LUFA/../LUFA/Drivers/Board/AVR8/USBKEY/LEDs.h \
+ ../../LUFA/../LUFA/Drivers/Board/AVR8/USBKEY/../../../../Common/Common.h \
+ ../../LUFA/../LUFA/Drivers/Peripheral/Serial.h \
+ ../../LUFA/../LUFA/Drivers/Peripheral/../../Common/Common.h \
+ ../../LUFA/../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.h \
+ ../../LUFA/../LUFA/Drivers/Peripheral/AVR8/../../../Common/Common.h \
+ ../../LUFA/../LUFA/Drivers/Peripheral/AVR8/../../Misc/TerminalCodes.h \
+ ../../LUFA/../LUFA/Drivers/Misc/RingBuffer.h \
+ ../../LUFA/../LUFA/Drivers/Misc/../../Common/Common.h TM1001A.c
+
+USBtoSerial.h:
+
+Descriptors.h:
+
+../../LUFA/../LUFA/Drivers/USB/USB.h:
+
+../../LUFA/../LUFA/Drivers/USB/../../Common/Common.h:
+
+../../LUFA/../LUFA/Drivers/USB/../../Common/Architectures.h:
+
+../../LUFA/../LUFA/Drivers/USB/../../Common/BoardTypes.h:
+
+../../LUFA/../LUFA/Drivers/USB/../../Common/ArchitectureSpecific.h:
+
+../../LUFA/../LUFA/Drivers/USB/../../Common/CompilerSpecific.h:
+
+../../LUFA/../LUFA/Drivers/USB/../../Common/Attributes.h:
+
+Config/LUFAConfig.h:
+
+../../LUFA/../LUFA/Drivers/USB/../../Common/Endianness.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/USBMode.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/../../../Common/Common.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/USBTask.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/USBMode.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/USBController.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../../../../Common/Common.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBMode.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Events.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../../../../Common/Common.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBMode.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBTask.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBInterrupt.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/USBInterrupt_AVR8.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../../../../Common/Common.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../USBMode.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../Events.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../USBController.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Device.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../StdDescriptors.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Events.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBInterrupt.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Endpoint.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/Endpoint_AVR8.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../USBTask.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../USBInterrupt.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/Device_AVR8.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../StdDescriptors.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/../Endpoint.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../Endpoint.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../DeviceStandardReq.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../StdRequestType.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBTask.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../USBController.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../EndpointStream.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/AVR8/../AVR8/EndpointStream_AVR8.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/Events.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/StdRequestType.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/StdDescriptors.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/DeviceStandardReq.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/Events.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/StdDescriptors.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/ConfigDescriptors.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/HostStandardReq.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/USBController.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/USBInterrupt.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/Device.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/Endpoint.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/DeviceStandardReq.h:
+
+../../LUFA/../LUFA/Drivers/USB/Core/EndpointStream.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/AndroidAccessoryClass.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/../Core/USBMode.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/AudioClass.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/AudioClassDevice.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../../USB.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/AudioClassCommon.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/../../Core/StdDescriptors.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/CDCClass.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/CDCClassDevice.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/CDCClassCommon.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/HIDClass.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/HIDClassDevice.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/HIDClassCommon.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/HIDParser.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/../../../../Common/Common.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/HIDReportData.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/HIDClassCommon.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/MassStorageClass.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/MassStorageClassCommon.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/MIDIClass.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/MIDIClassCommon.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/AudioClassCommon.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/PrinterClass.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/RNDISClass.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/RNDISClassCommon.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/Device/../Common/CDCClassCommon.h:
+
+../../LUFA/../LUFA/Drivers/USB/Class/StillImageClass.h:
+
+../../LUFA/../LUFA/Drivers/Board/LEDs.h:
+
+../../LUFA/../LUFA/Drivers/Board/../../Common/Common.h:
+
+../../LUFA/../LUFA/Drivers/Board/AVR8/USBKEY/LEDs.h:
+
+../../LUFA/../LUFA/Drivers/Board/AVR8/USBKEY/../../../../Common/Common.h:
+
+../../LUFA/../LUFA/Drivers/Peripheral/Serial.h:
+
+../../LUFA/../LUFA/Drivers/Peripheral/../../Common/Common.h:
+
+../../LUFA/../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.h:
+
+../../LUFA/../LUFA/Drivers/Peripheral/AVR8/../../../Common/Common.h:
+
+../../LUFA/../LUFA/Drivers/Peripheral/AVR8/../../Misc/TerminalCodes.h:
+
+../../LUFA/../LUFA/Drivers/Misc/RingBuffer.h:
+
+../../LUFA/../LUFA/Drivers/Misc/../../Common/Common.h:
+
+TM1001A.c:
diff --git a/firmware/USBtoSerial.eep b/firmware/USBtoSerial.eep
new file mode 100644 (file)
index 0000000..1996e8f
--- /dev/null
@@ -0,0 +1 @@
+:00000001FF\r
diff --git a/firmware/USBtoSerial.elf b/firmware/USBtoSerial.elf
new file mode 100755 (executable)
index 0000000..913ff39
Binary files /dev/null and b/firmware/USBtoSerial.elf differ
diff --git a/firmware/USBtoSerial.h b/firmware/USBtoSerial.h
new file mode 100644 (file)
index 0000000..7a210f0
--- /dev/null
@@ -0,0 +1,76 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2013.\r
+\r
+  dean [at] fourwalledcubicle [dot] com\r
+           www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+  Copyright 2013  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this\r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in\r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting\r
+  documentation, and that the name of the author not be used in\r
+  advertising or publicity pertaining to distribution of the\r
+  software without specific, written prior permission.\r
+\r
+  The author disclaims all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+/** \file\r
+ *\r
+ *  Header file for USBtoSerial.c.\r
+ */\r
+\r
+#ifndef _USB_SERIAL_H_\r
+#define _USB_SERIAL_H_\r
+\r
+       /* Includes: */\r
+               #include <avr/io.h>\r
+               #include <avr/wdt.h>\r
+               #include <avr/interrupt.h>\r
+               #include <avr/power.h>\r
+\r
+               #include "Descriptors.h"\r
+\r
+               #include <LUFA/Drivers/Board/LEDs.h>\r
+               #include <LUFA/Drivers/Peripheral/Serial.h>\r
+               #include <LUFA/Drivers/Misc/RingBuffer.h>\r
+               #include <LUFA/Drivers/USB/USB.h>\r
+\r
+       /* Macros: */\r
+               /** LED mask for the library LED driver, to indicate that the USB interface is not ready. */\r
+               #define LEDMASK_USB_NOTREADY      LEDS_LED1\r
+\r
+               /** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */\r
+               #define LEDMASK_USB_ENUMERATING  (LEDS_LED2 | LEDS_LED3)\r
+\r
+               /** LED mask for the library LED driver, to indicate that the USB interface is ready. */\r
+               #define LEDMASK_USB_READY        (LEDS_LED2 | LEDS_LED4)\r
+\r
+               /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */\r
+               #define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3)\r
+\r
+       /* Function Prototypes: */\r
+               void SetupHardware(void);\r
+\r
+               void EVENT_USB_Device_Connect(void);\r
+               void EVENT_USB_Device_Disconnect(void);\r
+               void EVENT_USB_Device_ConfigurationChanged(void);\r
+               void EVENT_USB_Device_ControlRequest(void);\r
+\r
+               void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo);\r
+\r
+#endif\r
+\r
diff --git a/firmware/USBtoSerial.hex b/firmware/USBtoSerial.hex
new file mode 100644 (file)
index 0000000..040d61e
--- /dev/null
@@ -0,0 +1,394 @@
+:100000009AC00000B4C00000B2C00000B0C0000040\r
+:10001000AEC00000ACC00000AAC00000A8C0000034\r
+:10002000A6C00000A4C00000A2C0000052C600008C\r
+:10003000F4C600009CC000009AC0000098C00000F8\r
+:1000400096C0000094C0000092C0000090C0000064\r
+:100050008EC00000D6C000008AC00000A6C200000A\r
+:1000600086C0000084C0000082C0000080C0000084\r
+:100070007EC000007CC000007AC0000078C0000094\r
+:1000800076C0000074C0000072C0000070C00000A4\r
+:100090006EC000006CC000001201100102000008D8\r
+:1000A000EB034B2001000102DC0109023E000201CA\r
+:1000B00000C0320904000001020201000524001002\r
+:1000C0000104240206052406000107058203080036\r
+:1000D000FF09040100020A000000070504021000E5\r
+:1000E00005070583021000050403090418034400F2\r
+:1000F000650061006E002000430061006D00650036\r
+:100100007200610000002E034C00550046004100C3\r
+:1001100020005500530042002D00520053003200D1\r
+:100120003300320020004100640061007000740060\r
+:1001300065007200000011241FBECFEFD4E0DEBFC7\r
+:10014000CDBF11E0A0E0B1E0E6E1F8E102C005902A\r
+:100150000D92AE36B107D9F712E0AEE6B1E001C0BC\r
+:100160001D92A23AB107E1F72DD30C94090C48CFA8\r
+:10017000FC01A081B1816C93808191810196918372\r
+:100180008083268137818217930721F484819581AA\r
+:10019000918380832FB7F894828593850196938706\r
+:1001A00082872FBF0895FC01A281B3818D91B38313\r
+:1001B000A28326813781A217B30721F424813581D8\r
+:1001C000338322839FB7F8942285338521503040B2\r
+:1001D000338722879FBF0895FC012FB7F89471835E\r
+:1001E0006083738362837583648360587F4F7783F2\r
+:1001F000668380E890E091878087138612862FBF00\r
+:1002000008951F920F920FB60F9211248F93809131\r
+:1002100094028F5F809394028F910F900FBE0F9086\r
+:100220001F90189586B53091940220E0280F311D5B\r
+:10023000C901089516BC109294020895DF92EF92BE\r
+:10024000FF920F931F93CF93DF9383E085BDF2DF7F\r
+:10025000509A5898E7DFBC0180E090E00E94310B93\r
+:1002600020E030E84EE053E40E94990A87FDF2CF87\r
+:1002700082E085BDDD24D39410E0DCDF509A5898ED\r
+:10028000D1DFBC0180E090E00E94310B20E030E043\r
+:100290004CE852E40E94990A87FDF2CF5098589A90\r
+:1002A000C1DFBC0180E090E00E94310B20E030E033\r
+:1002B00048E453E40E94990A87FDF2CF41C0C8E0A8\r
+:1002C000D0E000E8E12EFF248BE892E0E80EF91E72\r
+:1002D000B1DF509A5898F7018081802379F0A2DF2E\r
+:1002E000BC0180E090E00E94310B20E030E04CE85F\r
+:1002F00052E40E94990A87FDF2CF0EC093DFBC0141\r
+:1003000080E090E00E94310B20E030E042E053E4D6\r
+:100310000E94990A87FDF2CF5098589A83DFBC015A\r
+:1003200080E090E00E94310B20E030E048E453E4AC\r
+:100330000E94990A87FDF2CF0695219749F61F5F23\r
+:100340001D1508F4BCCF76DF509A58986BDFBC01BE\r
+:1003500080E090E00E94310B20E030E042E053E486\r
+:100360000E94990A87FDF2CF5098589A5BDFBC0132\r
+:1003700080E090E00E94310B20E030E048E453E45C\r
+:100380000E94990A87FDF2CF80918B028B3329F06E\r
+:10039000893341F429E0D22E02C093E0D92E1130E6\r
+:1003A00009F46BCF47DF3EDFBC0180E090E00E94A4\r
+:1003B000310B20E030E04AEF53E40E94E30B1816C3\r
+:1003C0000CF442C04899EFCF489BFECFCCE8D2E076\r
+:1003D00011E001C0182F188288E0E82EF12C00E807\r
+:1003E00029DF20DFBC0180E090E00E94310B20E09B\r
+:1003F00030E048E453E40E94E30B181614F4115063\r
+:1004000024C04899EECF16DF489BFECF0BDFBC011E\r
+:1004100080E090E00E94310B20E030E048EC52E4B4\r
+:100420000E94990A87FF03C08881800F8883069500\r
+:100430000894E108F108E114F10491F6812F8F5F2F\r
+:100440002196893039F601C010E0812FDF91CF91DC\r
+:100450001F910F91FF90EF90DF9008955098589A58\r
+:10046000EEE6F0E080818160808308958CE38093E4\r
+:100470008B02E4DE8093950280919502089580912D\r
+:100480009502882351F080918C0286FF04C08195EB\r
+:100490008F73819508958F73089580E008958091FA\r
+:1004A0009502882351F080918D0286FF04C08195CA\r
+:1004B0008F73819508958F73089580E008951F9339\r
+:1004C0008FB7F89420917801309179018FBF809196\r
+:1004D0007601909177012817390749F080E591E07E\r
+:1004E00095D7BC0197FD03C08EE691E041DE2FB7A2\r
+:1004F000F89480910402909105022FBF009701F1BA\r
+:10050000209151012F702093E9002091E80020FFF5\r
+:1005100017C08031910510F08FE090E0182F0EC0C9\r
+:10052000E091FC01F091FD0180E591E06081FDD654\r
+:100530001150882329F48AEF91E035DE112381F7E9\r
+:100540002FB7F89480917801909179012FBF00978F\r
+:1005500049F08EE691E027DE9091C80095FFFCCF30\r
+:100560008093CE0080E591E03AD7F4D51F910895AD\r
+:1005700084B7877F84BF88E10FB6F89480936000CA\r
+:10058000109260000FBE90E080E80FB6F894809360\r
+:100590006100909361000FBE8DC30895089580E5BA\r
+:1005A00091E09FC680E591E0F0C51F920F920FB6D3\r
+:1005B0000F9211242F933F934F935F936F937F93E9\r
+:1005C0008F939F93AF93BF93EF93FF936091CE0070\r
+:1005D0008EB3843019F48AEF91E0CADDFF91EF9178\r
+:1005E000BF91AF919F918F917F916F915F914F914B\r
+:1005F0003F912F910F900FBE0F901F9018958F92E3\r
+:100600009F92AF92BF92CF92DF92EF92FF921F9391\r
+:10061000FC01A18DA150A23028F4B0E0A559BE4F35\r
+:100620001C9101C010E0808D823009F41860828D29\r
+:10063000873031F0883031F0863029F4126003C001\r
+:10064000146001C016601092C9001092C800109288\r
+:10065000CA00C488D588E688F788C701B601969590\r
+:10066000879577956795FDD720E034E244EF59E40C\r
+:10067000FCD64B015C01C701B601F3D79B01AC016D\r
+:10068000C501B4015AD720E030E040E85FE3ECD682\r
+:10069000BCD77093CD006093CC001093CA0082E069\r
+:1006A0008093C80088E98093C9001F91FF90EF9064\r
+:1006B000DF90CF90BF90AF909F908F900895682F5C\r
+:1006C0008EB3843019F48AEF91E052CD0895EF9201\r
+:1006D000FF92CF93DF93E82EE7017E01F92EE70129\r
+:1006E00001C0EDDF89918823E1F7DF91CF91FF9081\r
+:1006F000EF9008952F923F924F925F926F927F9268\r
+:100700008F929F92AF92BF92CF92DF92EF92FF9221\r
+:100710000F931F93CF93DF937B018C01822F90E087\r
+:10072000FA01E80FF91F1082D22EDA944D2C5524CD\r
+:1007300047FC5094EA01C40DD51DAA24BB24BAE09D\r
+:100740006B2E712C812C912C1C01089421083108EE\r
+:10075000A0E2CA2E22C0E114F1040105110541F402\r
+:10076000C501840D951D8215930514F4C88208C037\r
+:10077000C801B701A40193010E94E70B605D688383\r
+:10078000C801B701A40193010E94E70B79018A0116\r
+:10079000DA9421970894A108B108D7FEDCCFDF9145\r
+:1007A000CF911F910F91FF90EF90DF90CF90BF906E\r
+:1007B000AF909F908F907F906F905F904F903F9001\r
+:1007C0002F900895CF92DF92EF92FF920F931F9395\r
+:1007D000DF93CF93CDB7DEB760970FB6F894DEBF47\r
+:1007E0000FBECDBFC5DE8EE691E06AE771E0F4DCB6\r
+:1007F0008AEF91E066E072E0EFDC78942FDE789487\r
+:100800008FEF99E6A8E181509040A040E1F700C049\r
+:10081000000080E091E05BDFFF24DD248E010F5FAC\r
+:100820001F4F4DDED394E9F721DE682F70E080E0A2\r
+:1008300090E0A80124E05EDF86E291E048DFC80195\r
+:1008400046DF84E391E043DF2ADE682F772767FDE8\r
+:100850007095872F972FA80124E04CDFC80137DF60\r
+:100860001EDEC82E0CDE2C2D332727FD30952E0DD5\r
+:10087000311D2F3F310509F024F437FD05C0EC0C84\r
+:1008800004C0EE24EA9401C0EE24282F332727FD6C\r
+:1008900030952F0D311D2F3F310509F024F437FD20\r
+:1008A00005C0F80E04C0FF24FA9401C0FF248DE3B4\r
+:1008B00091E00DDF6E2D70E080E090E0A80124E073\r
+:1008C00019DFC80104DF85E491E001DF6F2D70E0DE\r
+:1008D00080E090E0A80124E00DDFC801F8DE8EE49E\r
+:1008E00091E0F5DE9ECF923029F0933041F09130C7\r
+:1008F000E9F417C02EE330E0EAEAF0E01BC08130F3\r
+:1009000041F0813018F0823089F406C0E8EEF0E062\r
+:1009100005C0ECEEF0E002C0E6E0F1E0249130E04A\r
+:1009200009C022E130E0E8E9F0E004C020E030E076\r
+:10093000E0E0F0E0DA011196FC93EE93C90108952E\r
+:10094000282F392FF9018091A0029091A1028617DA\r
+:10095000970718F4BC0120E034C061157105D9F780\r
+:100960008091E8008E778093E800F5CF8EB38823DE\r
+:10097000E9F18530B9F18091E80083FD35C08091BF\r
+:10098000E80082FD29C08091E80080FF1AC08091B4\r
+:10099000F20090E006C021912093F1006150704078\r
+:1009A00001966115710519F088309105A0F321E0D9\r
+:1009B0008830910509F020E08091E8008E778093DF\r
+:1009C000E8006115710591F6222381F605C08EB30A\r
+:1009D000882361F0853061F08091E80082FFF7CFD5\r
+:1009E00080E0089583E0089581E0089582E008950D\r
+:1009F00083E00895E82FF92F8091A0029091A10241\r
+:100A00008617970718F4BC0120E036C06115710500\r
+:100A1000D9F78091E8008E778093E800F5CF8EB308\r
+:100A2000882309F43EC08530C1F18091E80083FD40\r
+:100A300036C08091E80082FD2AC08091E80080FFE6\r
+:100A40001BC08091F20090E007C024912093F10038\r
+:100A500031966150704001966115710519F088302A\r
+:100A6000910598F321E08830910509F020E080910C\r
+:100A7000E8008E778093E8006115710581F62223E6\r
+:100A800071F605C08EB3882361F0853061F08091E6\r
+:100A9000E80082FFF7CF80E0089583E0089581E0C9\r
+:100AA000089582E0089583E00895982F2CC0292F9F\r
+:100AB0002F702093E900981739F07091EC00209185\r
+:100AC000ED005091F00003C0242F762F50E021FF5D\r
+:100AD00019C03091EB003E7F3093EB003091ED0078\r
+:100AE0003D7F3093ED003091EB0031603093EB00AF\r
+:100AF0007093EC002093ED005093F0002091EE00F5\r
+:100B000027FF08C09F5F953090F28F708093E900B7\r
+:100B100081E0089580E00895EF92FF920F931F9374\r
+:100B2000CF93DF93162FE82EE7017E01F92EE70120\r
+:100B300000E02AC09881992329F16B81E981FA812B\r
+:100B40002C81892F8F70853018F56295660F660F9E\r
+:100B5000607C991F9927991F692B223010F096E02D\r
+:100B600001C092E028E030E040E003C04F5F220F78\r
+:100B7000331F2E173F07D0F34295407F492B95DF57\r
+:100B8000882331F00F5F25960117A0F281E001C0A4\r
+:100B900080E0DF91CF911F910F91FF90EF9008952A\r
+:100BA00080919A0287FF11C003C08EB38823B1F0F1\r
+:100BB0008091E80082FFF9CF8091E8008B778093E5\r
+:100BC000E80008958EB3882349F08091E80080FF03\r
+:100BD000F9CF8091E8008E778093E80008958091A6\r
+:100BE000E4009091E50044E62091EC0020FF25C050\r
+:100BF0002091E80020FD15C02EB32223A1F025305E\r
+:100C0000A1F02091EB0025FD12C02091E40030916D\r
+:100C1000E5002817390741F3442359F04150C90131\r
+:100C2000E3CF80E0089582E0089583E0089581E0B5\r
+:100C3000089584E0089580E008952091E80022FF5F\r
+:100C4000DBCFF9CF40D042D08091D8008F7780930E\r
+:100C5000D8008091D80080688093D8008091D80017\r
+:100C60008F7D8093D80084E089BD86E089BD09B47A\r
+:100C700000FEFDCF1EBA10929602109298021092BA\r
+:100C8000970280E060E042E010DF8091E1008E7F1B\r
+:100C90008093E1008091E20081608093E200809186\r
+:100CA000E20088608093E2008091E0008E7F809374\r
+:100CB000E0000895E3E6F0E080818E7F808381E0AC\r
+:100CC00080939902BFCF1092E20008951092E10044\r
+:100CD00008951F920F920FB60F9211242F933F93F6\r
+:100CE0004F935F936F937F938F939F93AF93BF9334\r
+:100CF000EF93FF938091E10082FF0AC08091E200B0\r
+:100D000082FF06C08091E1008B7F8093E10021D2B9\r
+:100D10008091E10080FF16C08091E20080FF12C048\r
+:100D20008091E2008E7F8093E2008091E2008061FA\r
+:100D30008093E2008091D80080628093D80019BC33\r
+:100D40001EBA2CDC8091E10084FF2CC08091E2006F\r
+:100D500084FF28C084E089BD86E089BD09B400FE17\r
+:100D6000FDCF8091D8008F7D8093D8008091E100E5\r
+:100D70008F7E8093E1008091E2008F7E8093E2007D\r
+:100D80008091E20081608093E20080919602882346\r
+:100D900021F48091E30087FF02C084E001C081E07C\r
+:100DA0008EBBFBDB8091E10083FF26C08091E200D7\r
+:100DB00083FF22C08091E100877F8093E10082E081\r
+:100DC0008EBB109296028091E1008E7F8093E100AD\r
+:100DD0008091E2008E7F8093E2008091E20080614A\r
+:100DE0008093E20080E060E042E05FDE8091F0000E\r
+:100DF00088608093F000ADD1FF91EF91BF91AF91EA\r
+:100E00009F918F917F916F915F914F913F912F9122\r
+:100E10000F900FBE0F901F9018951F920F920FB654\r
+:100E20000F9211241F932F933F934F935F936F93D0\r
+:100E30007F938F939F93AF93BF93EF93FF93109103\r
+:100E4000E9001F708091EC001092E9008091F000A1\r
+:100E5000877F8093F00078941BD01092E9008091F6\r
+:100E6000F00088608093F0001093E900FF91EF910B\r
+:100E7000BF91AF919F918F917F916F915F914F91B2\r
+:100E80003F912F911F910F900FBE0F901F901895BB\r
+:100E90001F93DF93CF93CDB7DEB7AC970FB6F8941F\r
+:100EA000DEBF0FBECDBFEAE9F2E08091F100819391\r
+:100EB00022E0E23AF207C9F775DB8091E80083FF90\r
+:100EC00030C180919A0220919B02253009F484C0A0\r
+:100ED000263040F42130A1F1213070F0233009F0A8\r
+:100EE00020C12EC0283009F4EFC0293009F4FEC01B\r
+:100EF000263009F016C192C0803821F0823809F0FE\r
+:100F000010C108C08091970290919802992371F0C6\r
+:100F100082600CC080919E028F708093E900909156\r
+:100F2000EB0081E095FF80E01092E9009091E800ED\r
+:100F3000977F9093E8008093F1001092F100CFC06A\r
+:100F4000882319F0823009F0ECC090E08F71907026\r
+:100F5000009729F08230910509F0E3C00BC0809121\r
+:100F60009C02813009F0DDC0233009F080E08093DD\r
+:100F700098022CC080919C02882341F520919E020A\r
+:100F80002F7009F4CEC02093E9008091EB0080FF20\r
+:100F90001DC080919B02833021F48091EB00806220\r
+:100FA00013C08091EB0080618093EB0081E090E0C2\r
+:100FB00002C0880F991F2A95E2F78093EA001092E9\r
+:100FC000EA008091EB0088608093EB001092E900CA\r
+:100FD0008091E800877F86C0882309F0A2C0109125\r
+:100FE0009C021F778091E3008078812B8093E3003F\r
+:100FF0008091E800877F8093E800D2DD8091E8004F\r
+:1010000080FFFCCF8091E30080688093E300112390\r
+:1010100011F083E001C082E08EBB83C08058823033\r
+:1010200008F07FC080919C0290919D0223E08C3D4E\r
+:10103000920791F583E08C838AE28B835FB7F89403\r
+:10104000DE01159680E090E04EE061E2E42FF0E0F2\r
+:1010500060935700E49180FF03C0E295EF704F5F0B\r
+:10106000EF702E2F30E0EA3018F0295C3F4F02C0BD\r
+:10107000205D3F4F2D933D9301968431910531F7CB\r
+:101080005FBF8091E800877F8093E800CE010396E0\r
+:101090006AE270E055DC12C060919E02AE014F5FC3\r
+:1010A0005F4F21DCBC01009709F43BC08091E80050\r
+:1010B000877F8093E80089819A819CDC8091E80099\r
+:1010C0008B778093E8002DC0803859F58091E80037\r
+:1010D000877F8093E800809196028093F100809151\r
+:1010E000E8008E778093E8005BDD1BC08823C9F49D\r
+:1010F00090919C029230A8F48091E800877F8093C1\r
+:10110000E800909396024CDD80919602882321F4AA\r
+:101110008091E30087FF02C084E001C081E08EBBC4\r
+:101120003EDA8091E80083FF0AC08091E800877F63\r
+:101130008093E8008091EB0080628093EB00AC9696\r
+:101140000FB6F894DEBF0FBECDBFCF91DF911F91D8\r
+:10115000089508951F938EB38823A9F08091E90024\r
+:101160008F709091EC0090FF02C010E801C010E079\r
+:10117000182B1092E9008091E80083FF01C088DEFF\r
+:101180001F701093E9001F910895CF93DF93EC0136\r
+:101190008091E80083FFA2C0888190E020919E02A8\r
+:1011A00030919F022817390709F098C080919B025F\r
+:1011B000813269F0823220F4803209F08FC03CC065\r
+:1011C000823209F46AC0833209F088C079C0809104\r
+:1011D0009A02813A09F082C08091E800877F80936B\r
+:1011E000E8008091E80080FFFCCF8C899D89AE8962\r
+:1011F000BF898093F100292F3A2F4B2F5527209339\r
+:10120000F1009D01442755272093F1008B2F99274A\r
+:10121000AA27BB278093F100888D8093F100898DE8\r
+:101220008093F1008A8D8093F1008091E8008E77A1\r
+:101230008093E800B5DC52C080919A02813209F0B7\r
+:101240004DC08091E800877F8093E80004C08EB392\r
+:10125000882309F443C08091E80082FFF8CF3091E1\r
+:10126000F1002091F1009091F1008091F1003C8B10\r
+:101270002D8B9E8B8F8B8091F100888F8091F10058\r
+:10128000898F8091F1008A8F8091E8008B7780931D\r
+:10129000E80086DCCE01B3D921C080919A02813268\r
+:1012A000E9F48091E800877F8093E80079DC809101\r
+:1012B0009C0290919D02998B888BCE01D4D00EC058\r
+:1012C00080919A02813251F48091E800877F809367\r
+:1012D000E80066DCCE0160919C02C5D0DF91CF9121\r
+:1012E0000895CF93DF93EC014096FC018BE0DF0182\r
+:1012F0001D928A95E9F782E08C83898783E08E8747\r
+:10130000CE01019661E008DC882359F0CE010696F3\r
+:1013100061E002DC882329F0CE010B9661E0FCDB62\r
+:1013200001C080E0DF91CF910895DF93CF930F92BA\r
+:10133000CDB7DEB7FC018EB38430F9F4248935894A\r
+:10134000468957892115310541055105B1F0818143\r
+:101350008F708093E9008091E80085FD0AC080913C\r
+:10136000E8008E778093E800698339DC69818823FF\r
+:1013700029F46093F10080E001C082E00F90CF91EA\r
+:10138000DF910895FC018EB3843019F524893589E5\r
+:10139000468957892115310541055105D1F08181D3\r
+:1013A0008F708093E9008091F2008823A1F09091E2\r
+:1013B000E8008091E8008E778093E80095FD0DC0ED\r
+:1013C0000EDC882359F49091E8009E779093E80012\r
+:1013D000089582E0089580E0089580E008952EB396\r
+:1013E000243099F4FC0124893589468957892115CF\r
+:1013F00031054105510549F021812F702093E90005\r
+:101400002091E80020FF01C0BDCF0895FC018EB3FC\r
+:10141000843029F524893589468957892115310574\r
+:1014200041055105E1F086818F708093E90080913C\r
+:10143000E80082FF14C08091F200882321F02091FF\r
+:10144000F10030E002C02FEF3FEF8091F2008823DF\r
+:1014500041F48091E8008B778093E80002C02FEF81\r
+:101460003FEFC901089508955058BB27AA270ED011\r
+:1014700070C161D130F066D120F031F49F3F11F49A\r
+:101480001EF456C10EF4E095E7FB4CC1E92F72D172\r
+:1014900080F3BA17620773078407950718F071F491\r
+:1014A0009EF58AC10EF4E0950B2EBA2FA02D0B01EC\r
+:1014B000B90190010C01CA01A0011124FF27591B99\r
+:1014C00099F0593F50F4503E68F11A16F040A22F9F\r
+:1014D000232F342F4427585FF3CF46953795279510\r
+:1014E000A795F0405395C9F77EF41F16BA0B620B0F\r
+:1014F000730B840BBAF09150A1F0FF0FBB1F661F56\r
+:10150000771F881FC2F70EC0BA0F621F731F841F98\r
+:1015100048F4879577956795B795F7959E3F08F0BE\r
+:10152000B3CF9395880F08F09927EE0F979587957D\r
+:101530000895D4D008F481E008950CD00AC102D1F6\r
+:1015400040F0F9D030F021F45F3F19F0EBC05111B9\r
+:1015500034C1EEC00FD198F39923C9F35523B1F3E9\r
+:10156000951B550BBB27AA2762177307840738F012\r
+:101570009F5F5F4F220F331F441FAA1FA9F333D071\r
+:101580000E2E3AF0E0E830D091505040E695001C25\r
+:10159000CAF729D0FE2F27D0660F771F881FBB1FE1\r
+:1015A000261737074807AB07B0E809F0BB0B802DBB\r
+:1015B000BF01FF2793585F4F2AF09E3F510568F007\r
+:1015C000B1C0FBC05F3FECF3983EDCF386957795A6\r
+:1015D0006795B795F7959F5FC9F7880F911D969509\r
+:1015E000879597F90895E1E0660F771F881FBB1F65\r
+:1015F000621773078407BA0720F0621B730B840B12\r
+:10160000BA0BEE1F88F7E0950895BCD088F09F577D\r
+:1016100090F0B92F9927B751A0F0D1F0660F771F3E\r
+:10162000881F991F1AF0BA95C9F712C0B13081F01E\r
+:10163000C3D0B1E00895C0C0672F782F8827B85F66\r
+:1016400039F0B93FCCF3869577956795B395D9F77F\r
+:101650003EF490958095709561957F4F8F4F9F4F89\r
+:101660000895E89409C097FB3EF490958095709595\r
+:1016700061957F4F8F4F9F4F9923A9F0F92F96E9DE\r
+:10168000BB279395F695879577956795B795F11153\r
+:10169000F8CFFAF4BB0F11F460FF1BC06F5F7F4FF0\r
+:1016A0008F4F9F4F16C0882311F096E911C0772302\r
+:1016B00021F09EE8872F762F05C0662371F096E80B\r
+:1016C000862F70E060E02AF09A95660F771F881FDA\r
+:1016D000DAF7880F9695879597F90895990F00087E\r
+:1016E000550FAA0BE0E8FEEF16161706E807F907F4\r
+:1016F000C0F012161306E407F50798F0621B730B8F\r
+:10170000840B950B39F40A2661F0232B242B252B0F\r
+:1017100021F408950A2609F4A140A6958FEF811DB2\r
+:10172000811D089597F99F6780E870E060E0089553\r
+:101730009FEF80EC089500240A94161617061806E9\r
+:101740000906089500240A941216130614060506C5\r
+:101750000895092E0394000C11F4882352F0BB0F56\r
+:1017600040F4BF2B11F460FF04C06F5F7F4F8F4FB9\r
+:101770009F4F089557FD9058440F551F59F05F3FF4\r
+:1017800071F04795880F97FB991F61F09F3F79F0A3\r
+:1017900087950895121613061406551FF2CF469525\r
+:1017A000F1DF08C0161617061806991FF1CF8695A7\r
+:1017B0007105610508940895E894BB27662777278B\r
+:1017C000CB0197F908958ADF08F48FEF0895A1E21D\r
+:1017D0001A2EAA1BBB1BFD010DC0AA1FBB1FEE1FAB\r
+:1017E000FF1FA217B307E407F50720F0A21BB30BF6\r
+:1017F000E40BF50B661F771F881F991F1A9469F772\r
+:1018000060957095809590959B01AC01BD01CF01CD\r
+:061810000895F894FFCFDB\r
+:10181600796F752073656C6563746564207468659B\r
+:10182600206B65797061642064656D6F206D6F64EF\r
+:1018360075733A0A0D00646174615F6C656E677456\r
+:10184600683A200020785F706F733A2000785F70E6\r
+:101856006F733A200009795F706F733A20000D00AC\r
+:10186600008310000001041000000182080000013E\r
+:0E187600000000000000000000000030200014\r
+:00000001FF\r
diff --git a/firmware/USBtoSerial.lss b/firmware/USBtoSerial.lss
new file mode 100644 (file)
index 0000000..e0c487b
--- /dev/null
@@ -0,0 +1,5748 @@
+
+USBtoSerial.elf:     file format elf32-avr
+
+Sections:
+Idx Name          Size      VMA       LMA       File off  Algn
+  0 .data         0000006e  00800100  00001816  000018aa  2**0
+                  CONTENTS, ALLOC, LOAD, DATA
+  1 .text         00001816  00000000  00000000  00000094  2**1
+                  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  2 .bss          00000134  0080016e  0080016e  00001918  2**0
+                  ALLOC
+  3 .stab         0000228c  00000000  00000000  00001918  2**2
+                  CONTENTS, READONLY, DEBUGGING
+  4 .stabstr      0000044f  00000000  00000000  00003ba4  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  5 .debug_aranges 00000538  00000000  00000000  00003ff3  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  6 .debug_pubnames 00000e11  00000000  00000000  0000452b  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  7 .debug_info   00008cae  00000000  00000000  0000533c  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  8 .debug_abbrev 000021b9  00000000  00000000  0000dfea  2**0
+                  CONTENTS, READONLY, DEBUGGING
+  9 .debug_line   000075f0  00000000  00000000  000101a3  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 10 .debug_frame  00000830  00000000  00000000  00017794  2**2
+                  CONTENTS, READONLY, DEBUGGING
+ 11 .debug_str    00003bf7  00000000  00000000  00017fc4  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 12 .debug_loc    0000464d  00000000  00000000  0001bbbb  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 13 .debug_pubtypes 00001111  00000000  00000000  00020208  2**0
+                  CONTENTS, READONLY, DEBUGGING
+ 14 .debug_ranges 00000790  00000000  00000000  00021319  2**0
+                  CONTENTS, READONLY, DEBUGGING
+
+Disassembly of section .text:
+
+00000000 <__vectors>:
+                       BytesInTransfer++;
+               }
+       }
+
+       return ENDPOINT_RWSTREAM_NoError;
+}
+       0:      9a c0           rjmp    .+308           ; 0x136 <__ctors_end>
+       #if defined(USB_CAN_BE_BOTH)
+       USB_CurrentMode = USB_MODE_None;
+       #endif
+
+       USB_IsInitialized = false;
+}
+       2:      00 00           nop
+       4:      b4 c0           rjmp    .+360           ; 0x16e <__bad_interrupt>
+       6:      00 00           nop
+       8:      b2 c0           rjmp    .+356           ; 0x16e <__bad_interrupt>
+       a:      00 00           nop
+       c:      b0 c0           rjmp    .+352           ; 0x16e <__bad_interrupt>
+       e:      00 00           nop
+      10:      ae c0           rjmp    .+348           ; 0x16e <__bad_interrupt>
+      12:      00 00           nop
+      14:      ac c0           rjmp    .+344           ; 0x16e <__bad_interrupt>
+      16:      00 00           nop
+      18:      aa c0           rjmp    .+340           ; 0x16e <__bad_interrupt>
+      1a:      00 00           nop
+      1c:      a8 c0           rjmp    .+336           ; 0x16e <__bad_interrupt>
+      1e:      00 00           nop
+      20:      a6 c0           rjmp    .+332           ; 0x16e <__bad_interrupt>
+      22:      00 00           nop
+      24:      a4 c0           rjmp    .+328           ; 0x16e <__bad_interrupt>
+      26:      00 00           nop
+      28:      a2 c0           rjmp    .+324           ; 0x16e <__bad_interrupt>
+      2a:      00 00           nop
+      2c:      52 c6           rjmp    .+3236          ; 0xcd2 <__vector_11>
+      2e:      00 00           nop
+      30:      f4 c6           rjmp    .+3560          ; 0xe1a <__vector_12>
+      32:      00 00           nop
+      34:      9c c0           rjmp    .+312           ; 0x16e <__bad_interrupt>
+      36:      00 00           nop
+      38:      9a c0           rjmp    .+308           ; 0x16e <__bad_interrupt>
+      3a:      00 00           nop
+      3c:      98 c0           rjmp    .+304           ; 0x16e <__bad_interrupt>
+      3e:      00 00           nop
+      40:      96 c0           rjmp    .+300           ; 0x16e <__bad_interrupt>
+      42:      00 00           nop
+      44:      94 c0           rjmp    .+296           ; 0x16e <__bad_interrupt>
+      46:      00 00           nop
+      48:      92 c0           rjmp    .+292           ; 0x16e <__bad_interrupt>
+      4a:      00 00           nop
+      4c:      90 c0           rjmp    .+288           ; 0x16e <__bad_interrupt>
+      4e:      00 00           nop
+      50:      8e c0           rjmp    .+284           ; 0x16e <__bad_interrupt>
+      52:      00 00           nop
+      54:      d6 c0           rjmp    .+428           ; 0x202 <__vector_21>
+      56:      00 00           nop
+      58:      8a c0           rjmp    .+276           ; 0x16e <__bad_interrupt>
+      5a:      00 00           nop
+      5c:      a6 c2           rjmp    .+1356          ; 0x5aa <__vector_23>
+      5e:      00 00           nop
+      60:      86 c0           rjmp    .+268           ; 0x16e <__bad_interrupt>
+      62:      00 00           nop
+      64:      84 c0           rjmp    .+264           ; 0x16e <__bad_interrupt>
+      66:      00 00           nop
+      68:      82 c0           rjmp    .+260           ; 0x16e <__bad_interrupt>
+      6a:      00 00           nop
+      6c:      80 c0           rjmp    .+256           ; 0x16e <__bad_interrupt>
+      6e:      00 00           nop
+      70:      7e c0           rjmp    .+252           ; 0x16e <__bad_interrupt>
+      72:      00 00           nop
+      74:      7c c0           rjmp    .+248           ; 0x16e <__bad_interrupt>
+      76:      00 00           nop
+      78:      7a c0           rjmp    .+244           ; 0x16e <__bad_interrupt>
+      7a:      00 00           nop
+      7c:      78 c0           rjmp    .+240           ; 0x16e <__bad_interrupt>
+      7e:      00 00           nop
+      80:      76 c0           rjmp    .+236           ; 0x16e <__bad_interrupt>
+      82:      00 00           nop
+      84:      74 c0           rjmp    .+232           ; 0x16e <__bad_interrupt>
+      86:      00 00           nop
+      88:      72 c0           rjmp    .+228           ; 0x16e <__bad_interrupt>
+      8a:      00 00           nop
+      8c:      70 c0           rjmp    .+224           ; 0x16e <__bad_interrupt>
+      8e:      00 00           nop
+      90:      6e c0           rjmp    .+220           ; 0x16e <__bad_interrupt>
+      92:      00 00           nop
+      94:      6c c0           rjmp    .+216           ; 0x16e <__bad_interrupt>
+      96:      00 00           nop
+
+00000098 <DeviceDescriptor>:
+      98:      12 01 10 01 02 00 00 08 eb 03 4b 20 01 00 01 02     ..........K ....
+      a8:      dc 01                                               ..
+
+000000aa <ConfigurationDescriptor>:
+      aa:      09 02 3e 00 02 01 00 c0 32 09 04 00 00 01 02 02     ..>.....2.......
+      ba:      01 00 05 24 00 10 01 04 24 02 06 05 24 06 00 01     ...$....$...$...
+      ca:      07 05 82 03 08 00 ff 09 04 01 00 02 0a 00 00 00     ................
+      da:      07 05 04 02 10 00 05 07 05 83 02 10 00 05           ..............
+
+000000e8 <LanguageString>:
+      e8:      04 03 09 04                                         ....
+
+000000ec <ManufacturerString>:
+      ec:      18 03 44 00 65 00 61 00 6e 00 20 00 43 00 61 00     ..D.e.a.n. .C.a.
+      fc:      6d 00 65 00 72 00 61 00 00 00                       m.e.r.a...
+
+00000106 <ProductString>:
+     106:      2e 03 4c 00 55 00 46 00 41 00 20 00 55 00 53 00     ..L.U.F.A. .U.S.
+     116:      42 00 2d 00 52 00 53 00 32 00 33 00 32 00 20 00     B.-.R.S.2.3.2. .
+     126:      41 00 64 00 61 00 70 00 74 00 65 00 72 00 00 00     A.d.a.p.t.e.r...
+
+00000136 <__ctors_end>:
+     136:      11 24           eor     r1, r1
+     138:      1f be           out     0x3f, r1        ; 63
+     13a:      cf ef           ldi     r28, 0xFF       ; 255
+     13c:      d4 e0           ldi     r29, 0x04       ; 4
+     13e:      de bf           out     0x3e, r29       ; 62
+     140:      cd bf           out     0x3d, r28       ; 61
+
+00000142 <__do_copy_data>:
+     142:      11 e0           ldi     r17, 0x01       ; 1
+     144:      a0 e0           ldi     r26, 0x00       ; 0
+     146:      b1 e0           ldi     r27, 0x01       ; 1
+     148:      e6 e1           ldi     r30, 0x16       ; 22
+     14a:      f8 e1           ldi     r31, 0x18       ; 24
+     14c:      02 c0           rjmp    .+4             ; 0x152 <__do_copy_data+0x10>
+     14e:      05 90           lpm     r0, Z+
+     150:      0d 92           st      X+, r0
+     152:      ae 36           cpi     r26, 0x6E       ; 110
+     154:      b1 07           cpc     r27, r17
+     156:      d9 f7           brne    .-10            ; 0x14e <__do_copy_data+0xc>
+
+00000158 <__do_clear_bss>:
+     158:      12 e0           ldi     r17, 0x02       ; 2
+     15a:      ae e6           ldi     r26, 0x6E       ; 110
+     15c:      b1 e0           ldi     r27, 0x01       ; 1
+     15e:      01 c0           rjmp    .+2             ; 0x162 <.do_clear_bss_start>
+
+00000160 <.do_clear_bss_loop>:
+     160:      1d 92           st      X+, r1
+
+00000162 <.do_clear_bss_start>:
+     162:      a2 3a           cpi     r26, 0xA2       ; 162
+     164:      b1 07           cpc     r27, r17
+     166:      e1 f7           brne    .-8             ; 0x160 <.do_clear_bss_loop>
+     168:      2d d3           rcall   .+1626          ; 0x7c4 <main>
+     16a:      0c 94 09 0c     jmp     0x1812  ; 0x1812 <_exit>
+
+0000016e <__bad_interrupt>:
+     16e:      48 cf           rjmp    .-368           ; 0x0 <__vectors>
+
+00000170 <RingBuffer_Insert>:
+                *  \param[in]     Data    Data element to insert into the buffer.
+                */
+               static inline void RingBuffer_Insert(RingBuffer_t* Buffer, const uint8_t Data) ATTR_NON_NULL_PTR_ARG(1);
+               static inline void RingBuffer_Insert(RingBuffer_t* Buffer, const uint8_t Data)
+               {
+                       GCC_FORCE_POINTER_ACCESS(Buffer);
+     170:      fc 01           movw    r30, r24
+
+                       *Buffer->In = Data;
+     172:      a0 81           ld      r26, Z
+     174:      b1 81           ldd     r27, Z+1        ; 0x01
+     176:      6c 93           st      X, r22
+
+                       if (++Buffer->In == Buffer->End)
+     178:      80 81           ld      r24, Z
+     17a:      91 81           ldd     r25, Z+1        ; 0x01
+     17c:      01 96           adiw    r24, 0x01       ; 1
+     17e:      91 83           std     Z+1, r25        ; 0x01
+     180:      80 83           st      Z, r24
+     182:      26 81           ldd     r18, Z+6        ; 0x06
+     184:      37 81           ldd     r19, Z+7        ; 0x07
+     186:      82 17           cp      r24, r18
+     188:      93 07           cpc     r25, r19
+     18a:      21 f4           brne    .+8             ; 0x194 <RingBuffer_Insert+0x24>
+                         Buffer->In = Buffer->Start;
+     18c:      84 81           ldd     r24, Z+4        ; 0x04
+     18e:      95 81           ldd     r25, Z+5        ; 0x05
+     190:      91 83           std     Z+1, r25        ; 0x01
+     192:      80 83           st      Z, r24
+                       static inline uint_reg_t GetGlobalInterruptMask(void)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               return SREG;
+     194:      2f b7           in      r18, 0x3f       ; 63
+                       static inline void GlobalInterruptDisable(void)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               cli();
+     196:      f8 94           cli
+
+                       uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+                       GlobalInterruptDisable();
+
+                       Buffer->Count++;
+     198:      82 85           ldd     r24, Z+10       ; 0x0a
+     19a:      93 85           ldd     r25, Z+11       ; 0x0b
+     19c:      01 96           adiw    r24, 0x01       ; 1
+     19e:      93 87           std     Z+11, r25       ; 0x0b
+     1a0:      82 87           std     Z+10, r24       ; 0x0a
+                       static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               SREG = GlobalIntState;
+     1a2:      2f bf           out     0x3f, r18       ; 63
+
+                       SetGlobalInterruptMask(CurrentGlobalInt);
+               }
+     1a4:      08 95           ret
+
+000001a6 <RingBuffer_Remove>:
+                *  \return Next data element stored in the buffer.
+                */
+               static inline uint8_t RingBuffer_Remove(RingBuffer_t* Buffer) ATTR_NON_NULL_PTR_ARG(1);
+               static inline uint8_t RingBuffer_Remove(RingBuffer_t* Buffer)
+               {
+                       GCC_FORCE_POINTER_ACCESS(Buffer);
+     1a6:      fc 01           movw    r30, r24
+
+                       uint8_t Data = *Buffer->Out;
+     1a8:      a2 81           ldd     r26, Z+2        ; 0x02
+     1aa:      b3 81           ldd     r27, Z+3        ; 0x03
+     1ac:      8d 91           ld      r24, X+
+
+                       if (++Buffer->Out == Buffer->End)
+     1ae:      b3 83           std     Z+3, r27        ; 0x03
+     1b0:      a2 83           std     Z+2, r26        ; 0x02
+     1b2:      26 81           ldd     r18, Z+6        ; 0x06
+     1b4:      37 81           ldd     r19, Z+7        ; 0x07
+     1b6:      a2 17           cp      r26, r18
+     1b8:      b3 07           cpc     r27, r19
+     1ba:      21 f4           brne    .+8             ; 0x1c4 <RingBuffer_Remove+0x1e>
+                         Buffer->Out = Buffer->Start;
+     1bc:      24 81           ldd     r18, Z+4        ; 0x04
+     1be:      35 81           ldd     r19, Z+5        ; 0x05
+     1c0:      33 83           std     Z+3, r19        ; 0x03
+     1c2:      22 83           std     Z+2, r18        ; 0x02
+                       static inline uint_reg_t GetGlobalInterruptMask(void)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               return SREG;
+     1c4:      9f b7           in      r25, 0x3f       ; 63
+                       static inline void GlobalInterruptDisable(void)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               cli();
+     1c6:      f8 94           cli
+
+                       uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+                       GlobalInterruptDisable();
+
+                       Buffer->Count--;
+     1c8:      22 85           ldd     r18, Z+10       ; 0x0a
+     1ca:      33 85           ldd     r19, Z+11       ; 0x0b
+     1cc:      21 50           subi    r18, 0x01       ; 1
+     1ce:      30 40           sbci    r19, 0x00       ; 0
+     1d0:      33 87           std     Z+11, r19       ; 0x0b
+     1d2:      22 87           std     Z+10, r18       ; 0x0a
+                       static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               SREG = GlobalIntState;
+     1d4:      9f bf           out     0x3f, r25       ; 63
+
+                       SetGlobalInterruptMask(CurrentGlobalInt);
+
+                       return Data;
+               }
+     1d6:      08 95           ret
+
+000001d8 <RingBuffer_InitBuffer.clone.0>:
+                                                        const uint16_t Size) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+               static inline void RingBuffer_InitBuffer(RingBuffer_t* Buffer,
+                                                        uint8_t* const DataPtr,
+                                                        const uint16_t Size)
+               {
+                       GCC_FORCE_POINTER_ACCESS(Buffer);
+     1d8:      fc 01           movw    r30, r24
+                       static inline uint_reg_t GetGlobalInterruptMask(void)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               return SREG;
+     1da:      2f b7           in      r18, 0x3f       ; 63
+                       static inline void GlobalInterruptDisable(void)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               cli();
+     1dc:      f8 94           cli
+
+                       uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+                       GlobalInterruptDisable();
+
+                       Buffer->In     = DataPtr;
+     1de:      71 83           std     Z+1, r23        ; 0x01
+     1e0:      60 83           st      Z, r22
+                       Buffer->Out    = DataPtr;
+     1e2:      73 83           std     Z+3, r23        ; 0x03
+     1e4:      62 83           std     Z+2, r22        ; 0x02
+                       Buffer->Start  = &DataPtr[0];
+     1e6:      75 83           std     Z+5, r23        ; 0x05
+     1e8:      64 83           std     Z+4, r22        ; 0x04
+                       Buffer->End    = &DataPtr[Size];
+     1ea:      60 58           subi    r22, 0x80       ; 128
+     1ec:      7f 4f           sbci    r23, 0xFF       ; 255
+     1ee:      77 83           std     Z+7, r23        ; 0x07
+     1f0:      66 83           std     Z+6, r22        ; 0x06
+                       Buffer->Size   = Size;
+     1f2:      80 e8           ldi     r24, 0x80       ; 128
+     1f4:      90 e0           ldi     r25, 0x00       ; 0
+     1f6:      91 87           std     Z+9, r25        ; 0x09
+     1f8:      80 87           std     Z+8, r24        ; 0x08
+                       Buffer->Count  = 0;
+     1fa:      13 86           std     Z+11, r1        ; 0x0b
+     1fc:      12 86           std     Z+10, r1        ; 0x0a
+                       static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               SREG = GlobalIntState;
+     1fe:      2f bf           out     0x3f, r18       ; 63
+
+                       SetGlobalInterruptMask(CurrentGlobalInt);
+               }
+     200:      08 95           ret
+
+00000202 <__vector_21>:
+u08 adb_werte[MAX_ADB];
+u08 t0ovfcount;
+volatile u08 adb_data_length;
+
+
+ISR( TIMER0_OVF_vect) {
+     202:      1f 92           push    r1
+     204:      0f 92           push    r0
+     206:      0f b6           in      r0, 0x3f        ; 63
+     208:      0f 92           push    r0
+     20a:      11 24           eor     r1, r1
+     20c:      8f 93           push    r24
+       t0ovfcount++;
+     20e:      80 91 94 02     lds     r24, 0x0294
+     212:      8f 5f           subi    r24, 0xFF       ; 255
+     214:      80 93 94 02     sts     0x0294, r24
+}
+     218:      8f 91           pop     r24
+     21a:      0f 90           pop     r0
+     21c:      0f be           out     0x3f, r0        ; 63
+     21e:      0f 90           pop     r0
+     220:      1f 90           pop     r1
+     222:      18 95           reti
+
+00000224 <t0ext>:
+
+uint16_t t0ext(void) {
+       return (t0ovfcount * 256 + (u16) TCNT0); // return current counter value
+     224:      86 b5           in      r24, 0x26       ; 38
+     226:      30 91 94 02     lds     r19, 0x0294
+     22a:      20 e0           ldi     r18, 0x00       ; 0
+     22c:      28 0f           add     r18, r24
+     22e:      31 1d           adc     r19, r1
+       // plus number of already passed counter cycles times 256
+}
+     230:      c9 01           movw    r24, r18
+     232:      08 95           ret
+
+00000234 <t0rst>:
+
+void t0rst(void) {
+       TCNT0 = 0; // set counter to zero
+     234:      16 bc           out     0x26, r1        ; 38
+       t0ovfcount = 0; // set overflow counter to zero
+     236:      10 92 94 02     sts     0x0294, r1
+
+}
+     23a:      08 95           ret
+
+0000023c <adb>:
+// Befehl in adb_werte[0]. Empfangene bzw. zu sendende Daten in adb_werte[1 bis 8]
+
+
+
+
+u08 adb(void) {
+     23c:      df 92           push    r13
+     23e:      ef 92           push    r14
+     240:      ff 92           push    r15
+     242:      0f 93           push    r16
+     244:      1f 93           push    r17
+     246:      cf 93           push    r28
+     248:      df 93           push    r29
+#define ADB_IMPULS_TLT TAKT/ADB_VORTEILER_B*250/1000000 // !!! 375 mach das mit anderem prescaler
+//     #define ADB_IMPULS_TLT TAKT/ADB_VORTEILER_A*31/1000000 // modified
+       //#define ADB_IMPULS_PAUSE TAKT/ADB_VORTEILER_B*200/1000000
+
+       //Attention Signal
+       TCCR0B = ADB_VORTEILER_A_BIT;
+     24a:      83 e0           ldi     r24, 0x03       ; 3
+     24c:      85 bd           out     0x25, r24       ; 37
+       t0rst(); //  TCNT0 = 0; // Zähler auf null setzen
+     24e:      f2 df           rcall   .-28            ; 0x234 <t0rst>
+       ADB_PDIR |= ADB_BIT; // Ausgang 0
+     250:      50 9a           sbi     0x0a, 0 ; 10
+       ADB_POUT &= ~ADB_BIT;
+     252:      58 98           cbi     0x0b, 0 ; 11
+       while (t0ext() < ADB_IMPULS_ATT)
+     254:      e7 df           rcall   .-50            ; 0x224 <t0ext>
+     256:      bc 01           movw    r22, r24
+     258:      80 e0           ldi     r24, 0x00       ; 0
+     25a:      90 e0           ldi     r25, 0x00       ; 0
+     25c:      0e 94 31 0b     call    0x1662  ; 0x1662 <__floatunsisf>
+     260:      20 e0           ldi     r18, 0x00       ; 0
+     262:      30 e8           ldi     r19, 0x80       ; 128
+     264:      4e e0           ldi     r20, 0x0E       ; 14
+     266:      53 e4           ldi     r21, 0x43       ; 67
+     268:      0e 94 99 0a     call    0x1532  ; 0x1532 <__cmpsf2>
+     26c:      87 fd           sbrc    r24, 7
+     26e:      f2 cf           rjmp    .-28            ; 0x254 <adb+0x18>
+               ; // Warteschleife
+
+       TCCR0B = ADB_VORTEILER_B_BIT; // ab hier alles im schnellen modus
+     270:      82 e0           ldi     r24, 0x02       ; 2
+     272:      85 bd           out     0x25, r24       ; 37
+
+       anzahl_out = 1; // Mindestens Befehl übertragen
+     274:      dd 24           eor     r13, r13
+     276:      d3 94           inc     r13
+       z_byte = 0;
+     278:      10 e0           ldi     r17, 0x00       ; 0
+       do {
+               // START BIT (1)
+               t0rst(); //  TCNT0 = 0;
+     27a:      dc df           rcall   .-72            ; 0x234 <t0rst>
+               ADB_PDIR |= ADB_BIT; // Ausgang 0
+     27c:      50 9a           sbi     0x0a, 0 ; 10
+               ADB_POUT &= ~ADB_BIT;
+     27e:      58 98           cbi     0x0b, 0 ; 11
+               while (t0ext() < ADB_IMPULS_KURZ)
+     280:      d1 df           rcall   .-94            ; 0x224 <t0ext>
+     282:      bc 01           movw    r22, r24
+     284:      80 e0           ldi     r24, 0x00       ; 0
+     286:      90 e0           ldi     r25, 0x00       ; 0
+     288:      0e 94 31 0b     call    0x1662  ; 0x1662 <__floatunsisf>
+     28c:      20 e0           ldi     r18, 0x00       ; 0
+     28e:      30 e0           ldi     r19, 0x00       ; 0
+     290:      4c e8           ldi     r20, 0x8C       ; 140
+     292:      52 e4           ldi     r21, 0x42       ; 66
+     294:      0e 94 99 0a     call    0x1532  ; 0x1532 <__cmpsf2>
+     298:      87 fd           sbrc    r24, 7
+     29a:      f2 cf           rjmp    .-28            ; 0x280 <adb+0x44>
+                       ;
+               ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
+     29c:      50 98           cbi     0x0a, 0 ; 10
+               ADB_POUT |= ADB_BIT;
+     29e:      58 9a           sbi     0x0b, 0 ; 11
+               while (t0ext() < ADB_IMPULS_KURZ + ADB_IMPULS_LANG)
+     2a0:      c1 df           rcall   .-126           ; 0x224 <t0ext>
+     2a2:      bc 01           movw    r22, r24
+     2a4:      80 e0           ldi     r24, 0x00       ; 0
+     2a6:      90 e0           ldi     r25, 0x00       ; 0
+     2a8:      0e 94 31 0b     call    0x1662  ; 0x1662 <__floatunsisf>
+     2ac:      20 e0           ldi     r18, 0x00       ; 0
+     2ae:      30 e0           ldi     r19, 0x00       ; 0
+     2b0:      48 e4           ldi     r20, 0x48       ; 72
+     2b2:      53 e4           ldi     r21, 0x43       ; 67
+     2b4:      0e 94 99 0a     call    0x1532  ; 0x1532 <__cmpsf2>
+     2b8:      87 fd           sbrc    r24, 7
+     2ba:      f2 cf           rjmp    .-28            ; 0x2a0 <adb+0x64>
+     2bc:      41 c0           rjmp    .+130           ; 0x340 <adb+0x104>
+                       ;
+
+               for (; z_byte < anzahl_out; z_byte++) {
+     2be:      c8 e0           ldi     r28, 0x08       ; 8
+     2c0:      d0 e0           ldi     r29, 0x00       ; 0
+     2c2:      00 e8           ldi     r16, 0x80       ; 128
+                       for (bitpos = 128; bitpos; bitpos >>= 1) { //Daten ausgeben
+                               t0rst(); //  TCNT0 = 0;
+                               ADB_PDIR |= ADB_BIT; // Ausgang 0
+                               ADB_POUT &= ~ADB_BIT;
+                               if (adb_werte[z_byte] & bitpos)
+     2c4:      e1 2e           mov     r14, r17
+     2c6:      ff 24           eor     r15, r15
+     2c8:      8b e8           ldi     r24, 0x8B       ; 139
+     2ca:      92 e0           ldi     r25, 0x02       ; 2
+     2cc:      e8 0e           add     r14, r24
+     2ce:      f9 1e           adc     r15, r25
+               while (t0ext() < ADB_IMPULS_KURZ + ADB_IMPULS_LANG)
+                       ;
+
+               for (; z_byte < anzahl_out; z_byte++) {
+                       for (bitpos = 128; bitpos; bitpos >>= 1) { //Daten ausgeben
+                               t0rst(); //  TCNT0 = 0;
+     2d0:      b1 df           rcall   .-158           ; 0x234 <t0rst>
+                               ADB_PDIR |= ADB_BIT; // Ausgang 0
+     2d2:      50 9a           sbi     0x0a, 0 ; 10
+                               ADB_POUT &= ~ADB_BIT;
+     2d4:      58 98           cbi     0x0b, 0 ; 11
+                               if (adb_werte[z_byte] & bitpos)
+     2d6:      f7 01           movw    r30, r14
+     2d8:      80 81           ld      r24, Z
+     2da:      80 23           and     r24, r16
+     2dc:      79 f0           breq    .+30            ; 0x2fc <adb+0xc0>
+                                       while (t0ext() < ADB_IMPULS_KURZ)
+     2de:      a2 df           rcall   .-188           ; 0x224 <t0ext>
+     2e0:      bc 01           movw    r22, r24
+     2e2:      80 e0           ldi     r24, 0x00       ; 0
+     2e4:      90 e0           ldi     r25, 0x00       ; 0
+     2e6:      0e 94 31 0b     call    0x1662  ; 0x1662 <__floatunsisf>
+     2ea:      20 e0           ldi     r18, 0x00       ; 0
+     2ec:      30 e0           ldi     r19, 0x00       ; 0
+     2ee:      4c e8           ldi     r20, 0x8C       ; 140
+     2f0:      52 e4           ldi     r21, 0x42       ; 66
+     2f2:      0e 94 99 0a     call    0x1532  ; 0x1532 <__cmpsf2>
+     2f6:      87 fd           sbrc    r24, 7
+     2f8:      f2 cf           rjmp    .-28            ; 0x2de <adb+0xa2>
+     2fa:      0e c0           rjmp    .+28            ; 0x318 <adb+0xdc>
+                                               ;
+                               else
+                                       while (t0ext() < ADB_IMPULS_LANG)
+     2fc:      93 df           rcall   .-218           ; 0x224 <t0ext>
+     2fe:      bc 01           movw    r22, r24
+     300:      80 e0           ldi     r24, 0x00       ; 0
+     302:      90 e0           ldi     r25, 0x00       ; 0
+     304:      0e 94 31 0b     call    0x1662  ; 0x1662 <__floatunsisf>
+     308:      20 e0           ldi     r18, 0x00       ; 0
+     30a:      30 e0           ldi     r19, 0x00       ; 0
+     30c:      42 e0           ldi     r20, 0x02       ; 2
+     30e:      53 e4           ldi     r21, 0x43       ; 67
+     310:      0e 94 99 0a     call    0x1532  ; 0x1532 <__cmpsf2>
+     314:      87 fd           sbrc    r24, 7
+     316:      f2 cf           rjmp    .-28            ; 0x2fc <adb+0xc0>
+                                               ;
+                               ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
+     318:      50 98           cbi     0x0a, 0 ; 10
+                               ADB_POUT |= ADB_BIT;
+     31a:      58 9a           sbi     0x0b, 0 ; 11
+                               while (t0ext() < ADB_IMPULS_KURZ + ADB_IMPULS_LANG)
+     31c:      83 df           rcall   .-250           ; 0x224 <t0ext>
+     31e:      bc 01           movw    r22, r24
+     320:      80 e0           ldi     r24, 0x00       ; 0
+     322:      90 e0           ldi     r25, 0x00       ; 0
+     324:      0e 94 31 0b     call    0x1662  ; 0x1662 <__floatunsisf>
+     328:      20 e0           ldi     r18, 0x00       ; 0
+     32a:      30 e0           ldi     r19, 0x00       ; 0
+     32c:      48 e4           ldi     r20, 0x48       ; 72
+     32e:      53 e4           ldi     r21, 0x43       ; 67
+     330:      0e 94 99 0a     call    0x1532  ; 0x1532 <__cmpsf2>
+     334:      87 fd           sbrc    r24, 7
+     336:      f2 cf           rjmp    .-28            ; 0x31c <adb+0xe0>
+               ADB_POUT |= ADB_BIT;
+               while (t0ext() < ADB_IMPULS_KURZ + ADB_IMPULS_LANG)
+                       ;
+
+               for (; z_byte < anzahl_out; z_byte++) {
+                       for (bitpos = 128; bitpos; bitpos >>= 1) { //Daten ausgeben
+     338:      06 95           lsr     r16
+     33a:      21 97           sbiw    r28, 0x01       ; 1
+     33c:      49 f6           brne    .-110           ; 0x2d0 <adb+0x94>
+               ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
+               ADB_POUT |= ADB_BIT;
+               while (t0ext() < ADB_IMPULS_KURZ + ADB_IMPULS_LANG)
+                       ;
+
+               for (; z_byte < anzahl_out; z_byte++) {
+     33e:      1f 5f           subi    r17, 0xFF       ; 255
+     340:      1d 15           cp      r17, r13
+     342:      08 f4           brcc    .+2             ; 0x346 <adb+0x10a>
+     344:      bc cf           rjmp    .-136           ; 0x2be <adb+0x82>
+                               while (t0ext() < ADB_IMPULS_KURZ + ADB_IMPULS_LANG)
+                                       ;
+                       }
+               }
+               // STOP BIT (0)
+               t0rst(); //  TCNT0 = 0;
+     346:      76 df           rcall   .-276           ; 0x234 <t0rst>
+               ADB_PDIR |= ADB_BIT; // Ausgang 0
+     348:      50 9a           sbi     0x0a, 0 ; 10
+               ADB_POUT &= ~ADB_BIT;
+     34a:      58 98           cbi     0x0b, 0 ; 11
+               while (t0ext() < ADB_IMPULS_LANG)
+     34c:      6b df           rcall   .-298           ; 0x224 <t0ext>
+     34e:      bc 01           movw    r22, r24
+     350:      80 e0           ldi     r24, 0x00       ; 0
+     352:      90 e0           ldi     r25, 0x00       ; 0
+     354:      0e 94 31 0b     call    0x1662  ; 0x1662 <__floatunsisf>
+     358:      20 e0           ldi     r18, 0x00       ; 0
+     35a:      30 e0           ldi     r19, 0x00       ; 0
+     35c:      42 e0           ldi     r20, 0x02       ; 2
+     35e:      53 e4           ldi     r21, 0x43       ; 67
+     360:      0e 94 99 0a     call    0x1532  ; 0x1532 <__cmpsf2>
+     364:      87 fd           sbrc    r24, 7
+     366:      f2 cf           rjmp    .-28            ; 0x34c <adb+0x110>
+                       ;
+               ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
+     368:      50 98           cbi     0x0a, 0 ; 10
+               ADB_POUT |= ADB_BIT;
+     36a:      58 9a           sbi     0x0b, 0 ; 11
+               while (t0ext() < ADB_IMPULS_KURZ + ADB_IMPULS_LANG)
+     36c:      5b df           rcall   .-330           ; 0x224 <t0ext>
+     36e:      bc 01           movw    r22, r24
+     370:      80 e0           ldi     r24, 0x00       ; 0
+     372:      90 e0           ldi     r25, 0x00       ; 0
+     374:      0e 94 31 0b     call    0x1662  ; 0x1662 <__floatunsisf>
+     378:      20 e0           ldi     r18, 0x00       ; 0
+     37a:      30 e0           ldi     r19, 0x00       ; 0
+     37c:      48 e4           ldi     r20, 0x48       ; 72
+     37e:      53 e4           ldi     r21, 0x43       ; 67
+     380:      0e 94 99 0a     call    0x1532  ; 0x1532 <__cmpsf2>
+     384:      87 fd           sbrc    r24, 7
+     386:      f2 cf           rjmp    .-28            ; 0x36c <adb+0x130>
+                       ;
+
+               // Entscheidung, ob noch weitere Daten übertragen werden
+               if (adb_werte[0] == COM_LISTEN3)
+     388:      80 91 8b 02     lds     r24, 0x028B
+     38c:      8b 33           cpi     r24, 0x3B       ; 59
+     38e:      29 f0           breq    .+10            ; 0x39a <adb+0x15e>
+                       anzahl_out = 2 + 1;
+               else if (adb_werte[0] == COM_LISTEN1)
+     390:      89 33           cpi     r24, 0x39       ; 57
+     392:      41 f4           brne    .+16            ; 0x3a4 <adb+0x168>
+                       anzahl_out = 8 + 1;
+     394:      29 e0           ldi     r18, 0x09       ; 9
+     396:      d2 2e           mov     r13, r18
+     398:      02 c0           rjmp    .+4             ; 0x39e <adb+0x162>
+               while (t0ext() < ADB_IMPULS_KURZ + ADB_IMPULS_LANG)
+                       ;
+
+               // Entscheidung, ob noch weitere Daten übertragen werden
+               if (adb_werte[0] == COM_LISTEN3)
+                       anzahl_out = 2 + 1;
+     39a:      93 e0           ldi     r25, 0x03       ; 3
+     39c:      d9 2e           mov     r13, r25
+               else if (adb_werte[0] == COM_LISTEN1)
+                       anzahl_out = 8 + 1;
+               else
+                       z_byte = 8;
+       } while (z_byte < 2);
+     39e:      11 30           cpi     r17, 0x01       ; 1
+     3a0:      09 f4           brne    .+2             ; 0x3a4 <adb+0x168>
+     3a2:      6b cf           rjmp    .-298           ; 0x27a <adb+0x3e>
+
+       // Warten auf Rückgabewerte sonst Abbruch
+       // TCCR0 = ADB_VORTEILER_A_BIT; // micha modifikation
+       t0rst(); //  TCNT0 = 0;
+     3a4:      47 df           rcall   .-370           ; 0x234 <t0rst>
+
+       do {
+               if (t0ext() > ADB_IMPULS_TLT) {
+     3a6:      3e df           rcall   .-388           ; 0x224 <t0ext>
+     3a8:      bc 01           movw    r22, r24
+     3aa:      80 e0           ldi     r24, 0x00       ; 0
+     3ac:      90 e0           ldi     r25, 0x00       ; 0
+     3ae:      0e 94 31 0b     call    0x1662  ; 0x1662 <__floatunsisf>
+     3b2:      20 e0           ldi     r18, 0x00       ; 0
+     3b4:      30 e0           ldi     r19, 0x00       ; 0
+     3b6:      4a ef           ldi     r20, 0xFA       ; 250
+     3b8:      53 e4           ldi     r21, 0x43       ; 67
+     3ba:      0e 94 e3 0b     call    0x17c6  ; 0x17c6 <__gesf2>
+     3be:      18 16           cp      r1, r24
+     3c0:      0c f4           brge    .+2             ; 0x3c4 <adb+0x188>
+     3c2:      42 c0           rjmp    .+132           ; 0x448 <adb+0x20c>
+                       return (0);
+               }
+       } while (ADB_PIN & ADB_BIT);
+     3c4:      48 99           sbic    0x09, 0 ; 9
+     3c6:      ef cf           rjmp    .-34            ; 0x3a6 <adb+0x16a>
+       while (!(ADB_PIN & ADB_BIT))
+     3c8:      48 9b           sbis    0x09, 0 ; 9
+     3ca:      fe cf           rjmp    .-4             ; 0x3c8 <adb+0x18c>
+     3cc:      cc e8           ldi     r28, 0x8C       ; 140
+     3ce:      d2 e0           ldi     r29, 0x02       ; 2
+     3d0:      11 e0           ldi     r17, 0x01       ; 1
+     3d2:      01 c0           rjmp    .+2             ; 0x3d6 <adb+0x19a>
+                       while (!(ADB_PIN & ADB_BIT))
+                               ;
+                       if (t0ext() < (ADB_IMPULS_KURZ + ADB_IMPULS_LANG) / 2)
+                               adb_werte[z_byte] += bitpos;
+               }
+               z_byte++;
+     3d4:      18 2f           mov     r17, r24
+       while (!(ADB_PIN & ADB_BIT))
+               ; // Start Bit
+
+       z_byte = 1;
+       while (z_byte < MAX_ADB) {
+               adb_werte[z_byte] = 0;
+     3d6:      18 82           st      Y, r1
+     3d8:      88 e0           ldi     r24, 0x08       ; 8
+     3da:      e8 2e           mov     r14, r24
+     3dc:      f1 2c           mov     r15, r1
+               for (bitpos = 128; bitpos; bitpos >>= 1) { //Bits einlesen
+     3de:      00 e8           ldi     r16, 0x80       ; 128
+                       //TCCR0 = ADB_VORTEILER_B_BIT; //micha modifikation
+                       t0rst(); //  TCNT0 = 0;
+     3e0:      29 df           rcall   .-430           ; 0x234 <t0rst>
+                       // Abbruch wenn keine weiteren Bytes übertragen werden.
+                       do {
+                               if (t0ext() > ADB_IMPULS_KURZ + ADB_IMPULS_LANG) {
+     3e2:      20 df           rcall   .-448           ; 0x224 <t0ext>
+     3e4:      bc 01           movw    r22, r24
+     3e6:      80 e0           ldi     r24, 0x00       ; 0
+     3e8:      90 e0           ldi     r25, 0x00       ; 0
+     3ea:      0e 94 31 0b     call    0x1662  ; 0x1662 <__floatunsisf>
+     3ee:      20 e0           ldi     r18, 0x00       ; 0
+     3f0:      30 e0           ldi     r19, 0x00       ; 0
+     3f2:      48 e4           ldi     r20, 0x48       ; 72
+     3f4:      53 e4           ldi     r21, 0x43       ; 67
+     3f6:      0e 94 e3 0b     call    0x17c6  ; 0x17c6 <__gesf2>
+     3fa:      18 16           cp      r1, r24
+     3fc:      14 f4           brge    .+4             ; 0x402 <adb+0x1c6>
+                                       return (z_byte - 1);
+     3fe:      11 50           subi    r17, 0x01       ; 1
+     400:      24 c0           rjmp    .+72            ; 0x44a <adb+0x20e>
+                               }
+                       } while (ADB_PIN & ADB_BIT);
+     402:      48 99           sbic    0x09, 0 ; 9
+     404:      ee cf           rjmp    .-36            ; 0x3e2 <adb+0x1a6>
+                       t0rst(); //  TCNT0 = 0;
+     406:      16 df           rcall   .-468           ; 0x234 <t0rst>
+                       while (!(ADB_PIN & ADB_BIT))
+     408:      48 9b           sbis    0x09, 0 ; 9
+     40a:      fe cf           rjmp    .-4             ; 0x408 <adb+0x1cc>
+                               ;
+                       if (t0ext() < (ADB_IMPULS_KURZ + ADB_IMPULS_LANG) / 2)
+     40c:      0b df           rcall   .-490           ; 0x224 <t0ext>
+     40e:      bc 01           movw    r22, r24
+     410:      80 e0           ldi     r24, 0x00       ; 0
+     412:      90 e0           ldi     r25, 0x00       ; 0
+     414:      0e 94 31 0b     call    0x1662  ; 0x1662 <__floatunsisf>
+     418:      20 e0           ldi     r18, 0x00       ; 0
+     41a:      30 e0           ldi     r19, 0x00       ; 0
+     41c:      48 ec           ldi     r20, 0xC8       ; 200
+     41e:      52 e4           ldi     r21, 0x42       ; 66
+     420:      0e 94 99 0a     call    0x1532  ; 0x1532 <__cmpsf2>
+     424:      87 ff           sbrs    r24, 7
+     426:      03 c0           rjmp    .+6             ; 0x42e <adb+0x1f2>
+                               adb_werte[z_byte] += bitpos;
+     428:      88 81           ld      r24, Y
+     42a:      80 0f           add     r24, r16
+     42c:      88 83           st      Y, r24
+               ; // Start Bit
+
+       z_byte = 1;
+       while (z_byte < MAX_ADB) {
+               adb_werte[z_byte] = 0;
+               for (bitpos = 128; bitpos; bitpos >>= 1) { //Bits einlesen
+     42e:      06 95           lsr     r16
+     430:      08 94           sec
+     432:      e1 08           sbc     r14, r1
+     434:      f1 08           sbc     r15, r1
+     436:      e1 14           cp      r14, r1
+     438:      f1 04           cpc     r15, r1
+     43a:      91 f6           brne    .-92            ; 0x3e0 <adb+0x1a4>
+                       while (!(ADB_PIN & ADB_BIT))
+                               ;
+                       if (t0ext() < (ADB_IMPULS_KURZ + ADB_IMPULS_LANG) / 2)
+                               adb_werte[z_byte] += bitpos;
+               }
+               z_byte++;
+     43c:      81 2f           mov     r24, r17
+     43e:      8f 5f           subi    r24, 0xFF       ; 255
+     440:      21 96           adiw    r28, 0x01       ; 1
+       } while (ADB_PIN & ADB_BIT);
+       while (!(ADB_PIN & ADB_BIT))
+               ; // Start Bit
+
+       z_byte = 1;
+       while (z_byte < MAX_ADB) {
+     442:      89 30           cpi     r24, 0x09       ; 9
+     444:      39 f6           brne    .-114           ; 0x3d4 <adb+0x198>
+     446:      01 c0           rjmp    .+2             ; 0x44a <adb+0x20e>
+       // TCCR0 = ADB_VORTEILER_A_BIT; // micha modifikation
+       t0rst(); //  TCNT0 = 0;
+
+       do {
+               if (t0ext() > ADB_IMPULS_TLT) {
+                       return (0);
+     448:      10 e0           ldi     r17, 0x00       ; 0
+                               adb_werte[z_byte] += bitpos;
+               }
+               z_byte++;
+       }
+       return (z_byte - 1);
+}
+     44a:      81 2f           mov     r24, r17
+     44c:      df 91           pop     r29
+     44e:      cf 91           pop     r28
+     450:      1f 91           pop     r17
+     452:      0f 91           pop     r16
+     454:      ff 90           pop     r15
+     456:      ef 90           pop     r14
+     458:      df 90           pop     r13
+     45a:      08 95           ret
+
+0000045c <touchpad_init>:
+
+void touchpad_init(void) {
+       // Eingänge
+       ADB_PDIR &= ~ADB_BIT;
+     45c:      50 98           cbi     0x0a, 0 ; 10
+
+       // Pull Up einschalten
+       ADB_POUT |= ADB_BIT;
+     45e:      58 9a           sbi     0x0b, 0 ; 11
+
+       //enable timer0 interrupt
+       TIMSK0 |= (1 << TOIE0);
+     460:      ee e6           ldi     r30, 0x6E       ; 110
+     462:      f0 e0           ldi     r31, 0x00       ; 0
+     464:      80 81           ld      r24, Z
+     466:      81 60           ori     r24, 0x01       ; 1
+     468:      80 83           st      Z, r24
+}
+     46a:      08 95           ret
+
+0000046c <touchpad_read>:
+
+uint8_t touchpad_read(void) {
+       adb_werte[0] = COM_TALK0;
+     46c:      8c e3           ldi     r24, 0x3C       ; 60
+     46e:      80 93 8b 02     sts     0x028B, r24
+       adb_data_length = adb();
+     472:      e4 de           rcall   .-568           ; 0x23c <adb>
+     474:      80 93 95 02     sts     0x0295, r24
+       return adb_data_length;
+     478:      80 91 95 02     lds     r24, 0x0295
+}
+     47c:      08 95           ret
+
+0000047e <delta_y>:
+       return ((adb_werte[4] & 0b01110000) << 6)
+                       | ((adb_werte[3] & 0b01110000) << 3) | (adb_werte[1] & 0b01111111);
+}
+
+int8_t delta_y(void) {
+       if(adb_data_length ==0) {
+     47e:      80 91 95 02     lds     r24, 0x0295
+     482:      88 23           and     r24, r24
+     484:      51 f0           breq    .+20            ; 0x49a <delta_y+0x1c>
+               return 0;
+       }
+       if (adb_werte[1] & 0b01000000) {
+     486:      80 91 8c 02     lds     r24, 0x028C
+     48a:      86 ff           sbrs    r24, 6
+     48c:      04 c0           rjmp    .+8             ; 0x496 <delta_y+0x18>
+               return -((128 - adb_werte[1]) & 0b00111111);
+     48e:      81 95           neg     r24
+     490:      8f 73           andi    r24, 0x3F       ; 63
+     492:      81 95           neg     r24
+     494:      08 95           ret
+       } else {
+               return adb_werte[1] & 0b00111111;
+     496:      8f 73           andi    r24, 0x3F       ; 63
+     498:      08 95           ret
+                       | ((adb_werte[3] & 0b01110000) << 3) | (adb_werte[1] & 0b01111111);
+}
+
+int8_t delta_y(void) {
+       if(adb_data_length ==0) {
+               return 0;
+     49a:      80 e0           ldi     r24, 0x00       ; 0
+       if (adb_werte[1] & 0b01000000) {
+               return -((128 - adb_werte[1]) & 0b00111111);
+       } else {
+               return adb_werte[1] & 0b00111111;
+       }
+}
+     49c:      08 95           ret
+
+0000049e <delta_x>:
+
+int8_t delta_x(void) {
+       if(adb_data_length ==0) {
+     49e:      80 91 95 02     lds     r24, 0x0295
+     4a2:      88 23           and     r24, r24
+     4a4:      51 f0           breq    .+20            ; 0x4ba <delta_x+0x1c>
+               return 0;
+       }
+       if (adb_werte[2] & 0b01000000) {
+     4a6:      80 91 8d 02     lds     r24, 0x028D
+     4aa:      86 ff           sbrs    r24, 6
+     4ac:      04 c0           rjmp    .+8             ; 0x4b6 <delta_x+0x18>
+               return -((128 - adb_werte[2]) & 0b00111111);
+     4ae:      81 95           neg     r24
+     4b0:      8f 73           andi    r24, 0x3F       ; 63
+     4b2:      81 95           neg     r24
+     4b4:      08 95           ret
+       } else {
+               return adb_werte[2] & 0b00111111;
+     4b6:      8f 73           andi    r24, 0x3F       ; 63
+     4b8:      08 95           ret
+       }
+}
+
+int8_t delta_x(void) {
+       if(adb_data_length ==0) {
+               return 0;
+     4ba:      80 e0           ldi     r24, 0x00       ; 0
+       if (adb_werte[2] & 0b01000000) {
+               return -((128 - adb_werte[2]) & 0b00111111);
+       } else {
+               return adb_werte[2] & 0b00111111;
+       }
+}
+     4bc:      08 95           ret
+
+000004be <Usb2SerialTask>:
+
+
+
+
+
+void Usb2SerialTask(void) {
+     4be:      1f 93           push    r17
+                       static inline uint_reg_t GetGlobalInterruptMask(void)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               return SREG;
+     4c0:      8f b7           in      r24, 0x3f       ; 63
+                       static inline void GlobalInterruptDisable(void)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               cli();
+     4c2:      f8 94           cli
+                       uint16_t Count;
+
+                       uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+                       GlobalInterruptDisable();
+
+                       Count = Buffer->Count;
+     4c4:      20 91 78 01     lds     r18, 0x0178
+     4c8:      30 91 79 01     lds     r19, 0x0179
+                       static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               SREG = GlobalIntState;
+     4cc:      8f bf           out     0x3f, r24       ; 63
+  
+    /* Only try to read in bytes from the CDC interface if the transmit buffer is not full */
+    if (!(RingBuffer_IsFull(&USBtoUSART_Buffer)))
+     4ce:      80 91 76 01     lds     r24, 0x0176
+     4d2:      90 91 77 01     lds     r25, 0x0177
+     4d6:      28 17           cp      r18, r24
+     4d8:      39 07           cpc     r19, r25
+     4da:      49 f0           breq    .+18            ; 0x4ee <Usb2SerialTask+0x30>
+    {
+      int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
+     4dc:      80 e5           ldi     r24, 0x50       ; 80
+     4de:      91 e0           ldi     r25, 0x01       ; 1
+     4e0:      95 d7           rcall   .+3882          ; 0x140c <CDC_Device_ReceiveByte>
+     4e2:      bc 01           movw    r22, r24
+
+      /* Read bytes from the USB OUT endpoint into the USART transmit buffer */
+      if (!(ReceivedByte < 0))
+     4e4:      97 fd           sbrc    r25, 7
+     4e6:      03 c0           rjmp    .+6             ; 0x4ee <Usb2SerialTask+0x30>
+        RingBuffer_Insert(&USBtoUSART_Buffer, ReceivedByte);
+     4e8:      8e e6           ldi     r24, 0x6E       ; 110
+     4ea:      91 e0           ldi     r25, 0x01       ; 1
+     4ec:      41 de           rcall   .-894           ; 0x170 <RingBuffer_Insert>
+                       static inline uint_reg_t GetGlobalInterruptMask(void)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               return SREG;
+     4ee:      2f b7           in      r18, 0x3f       ; 63
+                       static inline void GlobalInterruptDisable(void)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               cli();
+     4f0:      f8 94           cli
+     4f2:      80 91 04 02     lds     r24, 0x0204
+     4f6:      90 91 05 02     lds     r25, 0x0205
+                       static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               SREG = GlobalIntState;
+     4fa:      2f bf           out     0x3f, r18       ; 63
+    }
+
+    /* Check if the UART receive buffer flush timer has expired or the buffer is nearly full */
+    uint16_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer);
+    if (BufferCount)
+     4fc:      00 97           sbiw    r24, 0x00       ; 0
+     4fe:      01 f1           breq    .+64            ; 0x540 <__stack+0x41>
+                        */
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UENUM = (Address & ENDPOINT_EPNUM_MASK);
+     500:      20 91 51 01     lds     r18, 0x0151
+     504:      2f 70           andi    r18, 0x0F       ; 15
+     506:      20 93 e9 00     sts     0x00E9, r18
+                        *  \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsINReady(void)
+                       {
+                               return ((UEINTX & (1 << TXINI)) ? true : false);
+     50a:      20 91 e8 00     lds     r18, 0x00E8
+    {
+      Endpoint_SelectEndpoint(VirtualSerial_CDC_Interface.Config.DataINEndpoint.Address);
+
+      /* Check if a packet is already enqueued to the host - if so, we shouldn't try to send more data
+       * until it completes as there is a chance nothing is listening and a lengthy timeout could occur */
+      if (Endpoint_IsINReady())
+     50e:      20 ff           sbrs    r18, 0
+     510:      17 c0           rjmp    .+46            ; 0x540 <__stack+0x41>
+      {
+        /* Never send more than one bank size less one byte to the host at a time, so that we don't block
+         * while a Zero Length Packet (ZLP) to terminate the transfer is sent if the host isn't listening */
+        uint8_t BytesToSend = MIN(BufferCount, (CDC_TXRX_EPSIZE - 1));
+     512:      80 31           cpi     r24, 0x10       ; 16
+     514:      91 05           cpc     r25, r1
+     516:      10 f0           brcs    .+4             ; 0x51c <__stack+0x1d>
+     518:      8f e0           ldi     r24, 0x0F       ; 15
+     51a:      90 e0           ldi     r25, 0x00       ; 0
+     51c:      18 2f           mov     r17, r24
+
+        /* Read bytes from the USART receive buffer into the USB IN endpoint */
+        while (BytesToSend--)
+     51e:      0e c0           rjmp    .+28            ; 0x53c <__stack+0x3d>
+                *  \return Next data element stored in the buffer.
+                */
+               static inline uint8_t RingBuffer_Peek(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+               static inline uint8_t RingBuffer_Peek(RingBuffer_t* const Buffer)
+               {
+                       return *Buffer->Out;
+     520:      e0 91 fc 01     lds     r30, 0x01FC
+     524:      f0 91 fd 01     lds     r31, 0x01FD
+        {
+          /* Try to send the next byte of data to the host, abort if there is an error without dequeuing */
+          if (CDC_Device_SendByte(&VirtualSerial_CDC_Interface,
+     528:      80 e5           ldi     r24, 0x50       ; 80
+     52a:      91 e0           ldi     r25, 0x01       ; 1
+     52c:      60 81           ld      r22, Z
+     52e:      fd d6           rcall   .+3578          ; 0x132a <CDC_Device_SendByte>
+     530:      11 50           subi    r17, 0x01       ; 1
+     532:      88 23           and     r24, r24
+     534:      29 f4           brne    .+10            ; 0x540 <__stack+0x41>
+          {
+            break;
+          }
+
+          /* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */
+          RingBuffer_Remove(&USARTtoUSB_Buffer);
+     536:      8a ef           ldi     r24, 0xFA       ; 250
+     538:      91 e0           ldi     r25, 0x01       ; 1
+     53a:      35 de           rcall   .-918           ; 0x1a6 <RingBuffer_Remove>
+        /* Never send more than one bank size less one byte to the host at a time, so that we don't block
+         * while a Zero Length Packet (ZLP) to terminate the transfer is sent if the host isn't listening */
+        uint8_t BytesToSend = MIN(BufferCount, (CDC_TXRX_EPSIZE - 1));
+
+        /* Read bytes from the USART receive buffer into the USB IN endpoint */
+        while (BytesToSend--)
+     53c:      11 23           and     r17, r17
+     53e:      81 f7           brne    .-32            ; 0x520 <__stack+0x21>
+                       static inline uint_reg_t GetGlobalInterruptMask(void)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               return SREG;
+     540:      2f b7           in      r18, 0x3f       ; 63
+                       static inline void GlobalInterruptDisable(void)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               cli();
+     542:      f8 94           cli
+                       uint16_t Count;
+
+                       uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+                       GlobalInterruptDisable();
+
+                       Count = Buffer->Count;
+     544:      80 91 78 01     lds     r24, 0x0178
+     548:      90 91 79 01     lds     r25, 0x0179
+                       static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               SREG = GlobalIntState;
+     54c:      2f bf           out     0x3f, r18       ; 63
+        }
+      }
+    }
+
+    /* Load the next byte from the USART transmit buffer into the USART */
+    if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) {
+     54e:      00 97           sbiw    r24, 0x00       ; 0
+     550:      49 f0           breq    .+18            ; 0x564 <__stack+0x65>
+      Serial_SendByte(RingBuffer_Remove(&USBtoUSART_Buffer));
+     552:      8e e6           ldi     r24, 0x6E       ; 110
+     554:      91 e0           ldi     r25, 0x01       ; 1
+     556:      27 de           rcall   .-946           ; 0x1a6 <RingBuffer_Remove>
+                        *  \param[in] DataByte  Byte to transmit through the USART.
+                        */
+                       static inline void Serial_SendByte(const char DataByte) ATTR_ALWAYS_INLINE;
+                       static inline void Serial_SendByte(const char DataByte)
+                       {
+                               while (!(UCSR1A & (1 << UDRE1)));
+     558:      90 91 c8 00     lds     r25, 0x00C8
+     55c:      95 ff           sbrs    r25, 5
+     55e:      fc cf           rjmp    .-8             ; 0x558 <__stack+0x59>
+                               UDR1 = DataByte;
+     560:      80 93 ce 00     sts     0x00CE, r24
+//      dummy = RingBuffer_Remove(&USBtoUSART_Buffer);
+//      sendPayload(&dummy,1,0);
+    }
+    CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
+     564:      80 e5           ldi     r24, 0x50       ; 80
+     566:      91 e0           ldi     r25, 0x01       ; 1
+     568:      3a d7           rcall   .+3700          ; 0x13de <CDC_Device_USBTask>
+    USB_USBTask();
+     56a:      f4 d5           rcall   .+3048          ; 0x1154 <USB_USBTask>
+  
+}
+     56c:      1f 91           pop     r17
+     56e:      08 95           ret
+
+00000570 <SetupHardware>:
+
+/** Configures the board hardware and chip peripherals for the demo's functionality. */
+void SetupHardware(void)
+{
+       /* Disable watchdog if enabled by bootloader/fuses */
+       MCUSR &= ~(1 << WDRF);
+     570:      84 b7           in      r24, 0x34       ; 52
+     572:      87 7f           andi    r24, 0xF7       ; 247
+     574:      84 bf           out     0x34, r24       ; 52
+       wdt_disable();
+     576:      88 e1           ldi     r24, 0x18       ; 24
+     578:      0f b6           in      r0, 0x3f        ; 63
+     57a:      f8 94           cli
+     57c:      80 93 60 00     sts     0x0060, r24
+     580:      10 92 60 00     sts     0x0060, r1
+     584:      0f be           out     0x3f, r0        ; 63
+The type of x is clock_div_t.
+*/
+void clock_prescale_set(clock_div_t __x)
+{
+    uint8_t __tmp = _BV(CLKPCE);
+    __asm__ __volatile__ (
+     586:      90 e0           ldi     r25, 0x00       ; 0
+     588:      80 e8           ldi     r24, 0x80       ; 128
+     58a:      0f b6           in      r0, 0x3f        ; 63
+     58c:      f8 94           cli
+     58e:      80 93 61 00     sts     0x0061, r24
+     592:      90 93 61 00     sts     0x0061, r25
+     596:      0f be           out     0x3f, r0        ; 63
+       clock_prescale_set(clock_div_1);
+
+       /* Hardware Initialization */
+//     LEDs_Init();
+       USB_Init();
+}
+     598:      8d c3           rjmp    .+1818          ; 0xcb4 <USB_Init>
+
+0000059a <EVENT_USB_Device_Connect>:
+
+/** Event handler for the library USB Connection event. */
+void EVENT_USB_Device_Connect(void)
+{
+//     LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
+}
+     59a:      08 95           ret
+
+0000059c <EVENT_USB_Device_Disconnect>:
+
+/** Event handler for the library USB Disconnection event. */
+void EVENT_USB_Device_Disconnect(void)
+{
+//     LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
+}
+     59c:      08 95           ret
+
+0000059e <EVENT_USB_Device_ConfigurationChanged>:
+/** Event handler for the library USB Configuration Changed event. */
+void EVENT_USB_Device_ConfigurationChanged(void)
+{
+       bool ConfigSuccess = true;
+
+       ConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface);
+     59e:      80 e5           ldi     r24, 0x50       ; 80
+     5a0:      91 e0           ldi     r25, 0x01       ; 1
+
+//     LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
+}
+     5a2:      9f c6           rjmp    .+3390          ; 0x12e2 <CDC_Device_ConfigureEndpoints>
+
+000005a4 <EVENT_USB_Device_ControlRequest>:
+
+/** Event handler for the library USB Control Request reception event. */
+void EVENT_USB_Device_ControlRequest(void)
+{
+       CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface);
+     5a4:      80 e5           ldi     r24, 0x50       ; 80
+     5a6:      91 e0           ldi     r25, 0x01       ; 1
+}
+     5a8:      f0 c5           rjmp    .+3040          ; 0x118a <CDC_Device_ProcessControlRequest>
+
+000005aa <__vector_23>:
+
+/** ISR to manage the reception of data from the serial port, placing received bytes into a circular buffer
+ *  for later transmission to the host.
+ */
+ISR(USART1_RX_vect, ISR_BLOCK)
+{
+     5aa:      1f 92           push    r1
+     5ac:      0f 92           push    r0
+     5ae:      0f b6           in      r0, 0x3f        ; 63
+     5b0:      0f 92           push    r0
+     5b2:      11 24           eor     r1, r1
+     5b4:      2f 93           push    r18
+     5b6:      3f 93           push    r19
+     5b8:      4f 93           push    r20
+     5ba:      5f 93           push    r21
+     5bc:      6f 93           push    r22
+     5be:      7f 93           push    r23
+     5c0:      8f 93           push    r24
+     5c2:      9f 93           push    r25
+     5c4:      af 93           push    r26
+     5c6:      bf 93           push    r27
+     5c8:      ef 93           push    r30
+     5ca:      ff 93           push    r31
+       uint8_t ReceivedByte = UDR1;
+     5cc:      60 91 ce 00     lds     r22, 0x00CE
+
+       if (USB_DeviceState == DEVICE_STATE_Configured)
+     5d0:      8e b3           in      r24, 0x1e       ; 30
+     5d2:      84 30           cpi     r24, 0x04       ; 4
+     5d4:      19 f4           brne    .+6             ; 0x5dc <__vector_23+0x32>
+         RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte);
+     5d6:      8a ef           ldi     r24, 0xFA       ; 250
+     5d8:      91 e0           ldi     r25, 0x01       ; 1
+     5da:      ca dd           rcall   .-1132          ; 0x170 <RingBuffer_Insert>
+}
+     5dc:      ff 91           pop     r31
+     5de:      ef 91           pop     r30
+     5e0:      bf 91           pop     r27
+     5e2:      af 91           pop     r26
+     5e4:      9f 91           pop     r25
+     5e6:      8f 91           pop     r24
+     5e8:      7f 91           pop     r23
+     5ea:      6f 91           pop     r22
+     5ec:      5f 91           pop     r21
+     5ee:      4f 91           pop     r20
+     5f0:      3f 91           pop     r19
+     5f2:      2f 91           pop     r18
+     5f4:      0f 90           pop     r0
+     5f6:      0f be           out     0x3f, r0        ; 63
+     5f8:      0f 90           pop     r0
+     5fa:      1f 90           pop     r1
+     5fc:      18 95           reti
+
+000005fe <EVENT_CDC_Device_LineEncodingChanged>:
+/** Event handler for the CDC Class driver Line Encoding Changed event.
+ *
+ *  \param[in] CDCInterfaceInfo  Pointer to the CDC class interface configuration structure being referenced
+ */
+void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+{
+     5fe:      8f 92           push    r8
+     600:      9f 92           push    r9
+     602:      af 92           push    r10
+     604:      bf 92           push    r11
+     606:      cf 92           push    r12
+     608:      df 92           push    r13
+     60a:      ef 92           push    r14
+     60c:      ff 92           push    r15
+     60e:      1f 93           push    r17
+     610:      fc 01           movw    r30, r24
+       uint8_t ConfigMask = 0;
+
+       switch (CDCInterfaceInfo->State.LineEncoding.ParityType)
+     612:      a1 8d           ldd     r26, Z+25       ; 0x19
+     614:      a1 50           subi    r26, 0x01       ; 1
+     616:      a2 30           cpi     r26, 0x02       ; 2
+     618:      28 f4           brcc    .+10            ; 0x624 <EVENT_CDC_Device_LineEncodingChanged+0x26>
+     61a:      b0 e0           ldi     r27, 0x00       ; 0
+     61c:      a5 59           subi    r26, 0x95       ; 149
+     61e:      be 4f           sbci    r27, 0xFE       ; 254
+     620:      1c 91           ld      r17, X
+     622:      01 c0           rjmp    .+2             ; 0x626 <EVENT_CDC_Device_LineEncodingChanged+0x28>
+     624:      10 e0           ldi     r17, 0x00       ; 0
+               case CDC_PARITY_Even:
+                       ConfigMask = (1 << UPM11);
+                       break;
+       }
+
+       if (CDCInterfaceInfo->State.LineEncoding.CharFormat == CDC_LINEENCODING_TwoStopBits)
+     626:      80 8d           ldd     r24, Z+24       ; 0x18
+     628:      82 30           cpi     r24, 0x02       ; 2
+     62a:      09 f4           brne    .+2             ; 0x62e <EVENT_CDC_Device_LineEncodingChanged+0x30>
+         ConfigMask |= (1 << USBS1);
+     62c:      18 60           ori     r17, 0x08       ; 8
+
+       switch (CDCInterfaceInfo->State.LineEncoding.DataBits)
+     62e:      82 8d           ldd     r24, Z+26       ; 0x1a
+     630:      87 30           cpi     r24, 0x07       ; 7
+     632:      31 f0           breq    .+12            ; 0x640 <EVENT_CDC_Device_LineEncodingChanged+0x42>
+     634:      88 30           cpi     r24, 0x08       ; 8
+     636:      31 f0           breq    .+12            ; 0x644 <EVENT_CDC_Device_LineEncodingChanged+0x46>
+     638:      86 30           cpi     r24, 0x06       ; 6
+     63a:      29 f4           brne    .+10            ; 0x646 <EVENT_CDC_Device_LineEncodingChanged+0x48>
+       {
+               case 6:
+                       ConfigMask |= (1 << UCSZ10);
+     63c:      12 60           ori     r17, 0x02       ; 2
+                       break;
+     63e:      03 c0           rjmp    .+6             ; 0x646 <EVENT_CDC_Device_LineEncodingChanged+0x48>
+               case 7:
+                       ConfigMask |= (1 << UCSZ11);
+     640:      14 60           ori     r17, 0x04       ; 4
+                       break;
+     642:      01 c0           rjmp    .+2             ; 0x646 <EVENT_CDC_Device_LineEncodingChanged+0x48>
+               case 8:
+                       ConfigMask |= ((1 << UCSZ11) | (1 << UCSZ10));
+     644:      16 60           ori     r17, 0x06       ; 6
+                       break;
+       }
+
+       /* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */
+       UCSR1B = 0;
+     646:      10 92 c9 00     sts     0x00C9, r1
+       UCSR1A = 0;
+     64a:      10 92 c8 00     sts     0x00C8, r1
+       UCSR1C = 0;
+     64e:      10 92 ca 00     sts     0x00CA, r1
+
+       /* Set the new baud rate before configuring the USART */
+       UBRR1  = SERIAL_2X_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS);
+     652:      c4 88           ldd     r12, Z+20       ; 0x14
+     654:      d5 88           ldd     r13, Z+21       ; 0x15
+     656:      e6 88           ldd     r14, Z+22       ; 0x16
+     658:      f7 88           ldd     r15, Z+23       ; 0x17
+     65a:      c7 01           movw    r24, r14
+     65c:      b6 01           movw    r22, r12
+     65e:      96 95           lsr     r25
+     660:      87 95           ror     r24
+     662:      77 95           ror     r23
+     664:      67 95           ror     r22
+     666:      fd d7           rcall   .+4090          ; 0x1662 <__floatunsisf>
+     668:      20 e0           ldi     r18, 0x00       ; 0
+     66a:      34 e2           ldi     r19, 0x24       ; 36
+     66c:      44 ef           ldi     r20, 0xF4       ; 244
+     66e:      59 e4           ldi     r21, 0x49       ; 73
+     670:      fc d6           rcall   .+3576          ; 0x146a <__addsf3>
+     672:      4b 01           movw    r8, r22
+     674:      5c 01           movw    r10, r24
+     676:      c7 01           movw    r24, r14
+     678:      b6 01           movw    r22, r12
+     67a:      f3 d7           rcall   .+4070          ; 0x1662 <__floatunsisf>
+     67c:      9b 01           movw    r18, r22
+     67e:      ac 01           movw    r20, r24
+     680:      c5 01           movw    r24, r10
+     682:      b4 01           movw    r22, r8
+     684:      5a d7           rcall   .+3764          ; 0x153a <__divsf3>
+     686:      20 e0           ldi     r18, 0x00       ; 0
+     688:      30 e0           ldi     r19, 0x00       ; 0
+     68a:      40 e8           ldi     r20, 0x80       ; 128
+     68c:      5f e3           ldi     r21, 0x3F       ; 63
+     68e:      ec d6           rcall   .+3544          ; 0x1468 <__subsf3>
+     690:      bc d7           rcall   .+3960          ; 0x160a <__fixunssfsi>
+     692:      70 93 cd 00     sts     0x00CD, r23
+     696:      60 93 cc 00     sts     0x00CC, r22
+
+       /* Reconfigure the USART in double speed mode for a wider baud rate range at the expense of accuracy */
+       UCSR1C = ConfigMask;
+     69a:      10 93 ca 00     sts     0x00CA, r17
+       UCSR1A = (1 << U2X1);
+     69e:      82 e0           ldi     r24, 0x02       ; 2
+     6a0:      80 93 c8 00     sts     0x00C8, r24
+       UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1));
+     6a4:      88 e9           ldi     r24, 0x98       ; 152
+     6a6:      80 93 c9 00     sts     0x00C9, r24
+}
+     6aa:      1f 91           pop     r17
+     6ac:      ff 90           pop     r15
+     6ae:      ef 90           pop     r14
+     6b0:      df 90           pop     r13
+     6b2:      cf 90           pop     r12
+     6b4:      bf 90           pop     r11
+     6b6:      af 90           pop     r10
+     6b8:      9f 90           pop     r9
+     6ba:      8f 90           pop     r8
+     6bc:      08 95           ret
+
+000006be <uart_putc>:
+
+
+
+
+void uart_putc(unsigned char data)
+{
+     6be:      68 2f           mov     r22, r24
+
+      if (USB_DeviceState == DEVICE_STATE_Configured){
+     6c0:      8e b3           in      r24, 0x1e       ; 30
+     6c2:      84 30           cpi     r24, 0x04       ; 4
+     6c4:      19 f4           brne    .+6             ; 0x6cc <uart_putc+0xe>
+        RingBuffer_Insert(&USARTtoUSB_Buffer, data);
+     6c6:      8a ef           ldi     r24, 0xFA       ; 250
+     6c8:      91 e0           ldi     r25, 0x01       ; 1
+     6ca:      52 cd           rjmp    .-1372          ; 0x170 <RingBuffer_Insert>
+     6cc:      08 95           ret
+
+000006ce <uart_puts>:
+      }
+  
+}
+
+void uart_puts(const char *s )
+{
+     6ce:      ef 92           push    r14
+     6d0:      ff 92           push    r15
+     6d2:      cf 93           push    r28
+     6d4:      df 93           push    r29
+     6d6:      e8 2e           mov     r14, r24
+     6d8:      e7 01           movw    r28, r14
+     6da:      7e 01           movw    r14, r28
+     6dc:      f9 2e           mov     r15, r25
+     6de:      e7 01           movw    r28, r14
+    while (*s) 
+     6e0:      01 c0           rjmp    .+2             ; 0x6e4 <uart_puts+0x16>
+      uart_putc(*s++);
+     6e2:      ed df           rcall   .-38            ; 0x6be <uart_putc>
+  
+}
+
+void uart_puts(const char *s )
+{
+    while (*s) 
+     6e4:      89 91           ld      r24, Y+
+     6e6:      88 23           and     r24, r24
+     6e8:      e1 f7           brne    .-8             ; 0x6e2 <uart_puts+0x14>
+      uart_putc(*s++);
+
+}/* uart_puts */
+     6ea:      df 91           pop     r29
+     6ec:      cf 91           pop     r28
+     6ee:      ff 90           pop     r15
+     6f0:      ef 90           pop     r14
+     6f2:      08 95           ret
+
+000006f4 <my_uitoa>:
+
+
+// convert an unsigned integer to string
+void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) {
+     6f4:      2f 92           push    r2
+     6f6:      3f 92           push    r3
+     6f8:      4f 92           push    r4
+     6fa:      5f 92           push    r5
+     6fc:      6f 92           push    r6
+     6fe:      7f 92           push    r7
+     700:      8f 92           push    r8
+     702:      9f 92           push    r9
+     704:      af 92           push    r10
+     706:      bf 92           push    r11
+     708:      cf 92           push    r12
+     70a:      df 92           push    r13
+     70c:      ef 92           push    r14
+     70e:      ff 92           push    r15
+     710:      0f 93           push    r16
+     712:      1f 93           push    r17
+     714:      cf 93           push    r28
+     716:      df 93           push    r29
+     718:      7b 01           movw    r14, r22
+     71a:      8c 01           movw    r16, r24
+  int8_t i; // schleifenzähler
+
+  string[no_digits] = '\0'; // String Terminator
+     71c:      82 2f           mov     r24, r18
+     71e:      90 e0           ldi     r25, 0x00       ; 0
+     720:      fa 01           movw    r30, r20
+     722:      e8 0f           add     r30, r24
+     724:      f9 1f           adc     r31, r25
+     726:      10 82           st      Z, r1
+  for (i = (no_digits - 1); i >= 0; i--) {
+     728:      d2 2e           mov     r13, r18
+     72a:      da 94           dec     r13
+
+}/* uart_puts */
+
+
+// convert an unsigned integer to string
+void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) {
+     72c:      4d 2c           mov     r4, r13
+     72e:      55 24           eor     r5, r5
+     730:      47 fc           sbrc    r4, 7
+     732:      50 94           com     r5
+     734:      ea 01           movw    r28, r20
+     736:      c4 0d           add     r28, r4
+     738:      d5 1d           adc     r29, r5
+  int8_t i; // schleifenzähler
+
+  string[no_digits] = '\0'; // String Terminator
+  for (i = (no_digits - 1); i >= 0; i--) {
+     73a:      aa 24           eor     r10, r10
+     73c:      bb 24           eor     r11, r11
+    if (zahl == 0 && i < (no_digits - 1)) {
+      string[i] = ' ';
+    } else {
+      string[i] = (zahl % 10) + '0';
+     73e:      ba e0           ldi     r27, 0x0A       ; 10
+     740:      6b 2e           mov     r6, r27
+     742:      71 2c           mov     r7, r1
+     744:      81 2c           mov     r8, r1
+     746:      91 2c           mov     r9, r1
+void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) {
+  int8_t i; // schleifenzähler
+
+  string[no_digits] = '\0'; // String Terminator
+  for (i = (no_digits - 1); i >= 0; i--) {
+    if (zahl == 0 && i < (no_digits - 1)) {
+     748:      1c 01           movw    r2, r24
+     74a:      08 94           sec
+     74c:      21 08           sbc     r2, r1
+     74e:      31 08           sbc     r3, r1
+      string[i] = ' ';
+     750:      a0 e2           ldi     r26, 0x20       ; 32
+     752:      ca 2e           mov     r12, r26
+// convert an unsigned integer to string
+void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) {
+  int8_t i; // schleifenzähler
+
+  string[no_digits] = '\0'; // String Terminator
+  for (i = (no_digits - 1); i >= 0; i--) {
+     754:      22 c0           rjmp    .+68            ; 0x79a <my_uitoa+0xa6>
+    if (zahl == 0 && i < (no_digits - 1)) {
+     756:      e1 14           cp      r14, r1
+     758:      f1 04           cpc     r15, r1
+     75a:      01 05           cpc     r16, r1
+     75c:      11 05           cpc     r17, r1
+     75e:      41 f4           brne    .+16            ; 0x770 <my_uitoa+0x7c>
+
+}/* uart_puts */
+
+
+// convert an unsigned integer to string
+void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) {
+     760:      c5 01           movw    r24, r10
+     762:      84 0d           add     r24, r4
+     764:      95 1d           adc     r25, r5
+  int8_t i; // schleifenzähler
+
+  string[no_digits] = '\0'; // String Terminator
+  for (i = (no_digits - 1); i >= 0; i--) {
+    if (zahl == 0 && i < (no_digits - 1)) {
+     766:      82 15           cp      r24, r2
+     768:      93 05           cpc     r25, r3
+     76a:      14 f4           brge    .+4             ; 0x770 <my_uitoa+0x7c>
+      string[i] = ' ';
+     76c:      c8 82           st      Y, r12
+     76e:      08 c0           rjmp    .+16            ; 0x780 <my_uitoa+0x8c>
+    } else {
+      string[i] = (zahl % 10) + '0';
+     770:      c8 01           movw    r24, r16
+     772:      b7 01           movw    r22, r14
+     774:      a4 01           movw    r20, r8
+     776:      93 01           movw    r18, r6
+     778:      0e 94 e7 0b     call    0x17ce  ; 0x17ce <__udivmodsi4>
+     77c:      60 5d           subi    r22, 0xD0       ; 208
+     77e:      68 83           st      Y, r22
+    } // Modulo rechnen, dann den ASCII-Code von '0' addieren
+    zahl /= 10;
+     780:      c8 01           movw    r24, r16
+     782:      b7 01           movw    r22, r14
+     784:      a4 01           movw    r20, r8
+     786:      93 01           movw    r18, r6
+     788:      0e 94 e7 0b     call    0x17ce  ; 0x17ce <__udivmodsi4>
+     78c:      79 01           movw    r14, r18
+     78e:      8a 01           movw    r16, r20
+// convert an unsigned integer to string
+void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) {
+  int8_t i; // schleifenzähler
+
+  string[no_digits] = '\0'; // String Terminator
+  for (i = (no_digits - 1); i >= 0; i--) {
+     790:      da 94           dec     r13
+     792:      21 97           sbiw    r28, 0x01       ; 1
+     794:      08 94           sec
+     796:      a1 08           sbc     r10, r1
+     798:      b1 08           sbc     r11, r1
+     79a:      d7 fe           sbrs    r13, 7
+     79c:      dc cf           rjmp    .-72            ; 0x756 <my_uitoa+0x62>
+      string[i] = (zahl % 10) + '0';
+    } // Modulo rechnen, dann den ASCII-Code von '0' addieren
+    zahl /= 10;
+  }
+
+}
+     79e:      df 91           pop     r29
+     7a0:      cf 91           pop     r28
+     7a2:      1f 91           pop     r17
+     7a4:      0f 91           pop     r16
+     7a6:      ff 90           pop     r15
+     7a8:      ef 90           pop     r14
+     7aa:      df 90           pop     r13
+     7ac:      cf 90           pop     r12
+     7ae:      bf 90           pop     r11
+     7b0:      af 90           pop     r10
+     7b2:      9f 90           pop     r9
+     7b4:      8f 90           pop     r8
+     7b6:      7f 90           pop     r7
+     7b8:      6f 90           pop     r6
+     7ba:      5f 90           pop     r5
+     7bc:      4f 90           pop     r4
+     7be:      3f 90           pop     r3
+     7c0:      2f 90           pop     r2
+     7c2:      08 95           ret
+
+000007c4 <main>:
+
+/** Main program entry point. This routine contains the overall program flow, including initial
+ *  setup of all components and the main program loop.
+ */
+int main(void)
+{
+     7c4:      cf 92           push    r12
+     7c6:      df 92           push    r13
+     7c8:      ef 92           push    r14
+     7ca:      ff 92           push    r15
+     7cc:      0f 93           push    r16
+     7ce:      1f 93           push    r17
+     7d0:      df 93           push    r29
+     7d2:      cf 93           push    r28
+     7d4:      cd b7           in      r28, 0x3d       ; 61
+     7d6:      de b7           in      r29, 0x3e       ; 62
+     7d8:      60 97           sbiw    r28, 0x10       ; 16
+     7da:      0f b6           in      r0, 0x3f        ; 63
+     7dc:      f8 94           cli
+     7de:      de bf           out     0x3e, r29       ; 62
+     7e0:      0f be           out     0x3f, r0        ; 63
+     7e2:      cd bf           out     0x3d, r28       ; 61
+  char dummy;
+  uint8_t field_val = 0;
+  SetupHardware();
+     7e4:      c5 de           rcall   .-630           ; 0x570 <SetupHardware>
+
+
+
+  RingBuffer_InitBuffer(&USBtoUSART_Buffer, USBtoUSART_Buffer_Data, sizeof(USBtoUSART_Buffer_Data));
+     7e6:      8e e6           ldi     r24, 0x6E       ; 110
+     7e8:      91 e0           ldi     r25, 0x01       ; 1
+     7ea:      6a e7           ldi     r22, 0x7A       ; 122
+     7ec:      71 e0           ldi     r23, 0x01       ; 1
+     7ee:      f4 dc           rcall   .-1560          ; 0x1d8 <RingBuffer_InitBuffer.clone.0>
+  RingBuffer_InitBuffer(&USARTtoUSB_Buffer, USARTtoUSB_Buffer_Data, sizeof(USARTtoUSB_Buffer_Data));
+     7f0:      8a ef           ldi     r24, 0xFA       ; 250
+     7f2:      91 e0           ldi     r25, 0x01       ; 1
+     7f4:      66 e0           ldi     r22, 0x06       ; 6
+     7f6:      72 e0           ldi     r23, 0x02       ; 2
+     7f8:      ef dc           rcall   .-1570          ; 0x1d8 <RingBuffer_InitBuffer.clone.0>
+                       static inline void GlobalInterruptEnable(void)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               sei();
+     7fa:      78 94           sei
+
+//   LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
+  GlobalInterruptEnable();
+
+  touchpad_init(); // you need to call this to setup the I/O pin!
+     7fc:      2f de           rcall   .-930           ; 0x45c <touchpad_init>
+  sei();
+     7fe:      78 94           sei
+       #else
+               //round up by default
+               __ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
+       #endif
+
+       __builtin_avr_delay_cycles(__ticks_dc);
+     800:      8f ef           ldi     r24, 0xFF       ; 255
+     802:      99 e6           ldi     r25, 0x69       ; 105
+     804:      a8 e1           ldi     r26, 0x18       ; 24
+     806:      81 50           subi    r24, 0x01       ; 1
+     808:      90 40           sbci    r25, 0x00       ; 0
+     80a:      a0 40           sbci    r26, 0x00       ; 0
+     80c:      e1 f7           brne    .-8             ; 0x806 <main+0x42>
+     80e:      00 c0           rjmp    .+0             ; 0x810 <main+0x4c>
+     810:      00 00           nop
+  //   | back  |  up   | enter |
+  //   -------------------------
+  //   | left  |  down | right |
+  //   -------------------------
+
+  uart_puts("you selected the keypad demo modus:\n\r");
+     812:      80 e0           ldi     r24, 0x00       ; 0
+     814:      91 e0           ldi     r25, 0x01       ; 1
+     816:      5b df           rcall   .-330           ; 0x6ce <uart_puts>
+  uint8_t x, y = 0;
+     818:      ff 24           eor     r15, r15
+//  _delay_ms(1000);
+
+
+// end
+  
+  uint8_t loopcounter=0;
+     81a:      dd 24           eor     r13, r13
+    }
+// //     uart_puts("c");
+//     _delay_ms(20);
+
+    dummy=touchpad_read(); // read values from the touchpad
+    my_uitoa(dummy,stringbuffer,4);// x_abs returns current x position of your finger
+     81c:      8e 01           movw    r16, r28
+     81e:      0f 5f           subi    r16, 0xFF       ; 255
+     820:      1f 4f           sbci    r17, 0xFF       ; 255
+  uart_puts("you selected the keypad demo modus:\n\r");
+  uint8_t x, y = 0;
+  int8_t dx, dy = 0;
+//   touchpad_set_abs_mode(); // keypad functionality uses the "absolute mode"
+  while (1) {
+    Usb2SerialTask();
+     822:      4d de           rcall   .-870           ; 0x4be <Usb2SerialTask>
+    loopcounter++;
+     824:      d3 94           inc     r13
+    if(loopcounter) {
+     826:      e9 f7           brne    .-6             ; 0x822 <main+0x5e>
+      continue;
+    }
+// //     uart_puts("c");
+//     _delay_ms(20);
+
+    dummy=touchpad_read(); // read values from the touchpad
+     828:      21 de           rcall   .-958           ; 0x46c <touchpad_read>
+    my_uitoa(dummy,stringbuffer,4);// x_abs returns current x position of your finger
+     82a:      68 2f           mov     r22, r24
+     82c:      70 e0           ldi     r23, 0x00       ; 0
+     82e:      80 e0           ldi     r24, 0x00       ; 0
+     830:      90 e0           ldi     r25, 0x00       ; 0
+     832:      a8 01           movw    r20, r16
+     834:      24 e0           ldi     r18, 0x04       ; 4
+     836:      5e df           rcall   .-324           ; 0x6f4 <my_uitoa>
+    uart_puts("data_length: ");
+     838:      86 e2           ldi     r24, 0x26       ; 38
+     83a:      91 e0           ldi     r25, 0x01       ; 1
+     83c:      48 df           rcall   .-368           ; 0x6ce <uart_puts>
+    uart_puts(stringbuffer);
+     83e:      c8 01           movw    r24, r16
+     840:      46 df           rcall   .-372           ; 0x6ce <uart_puts>
+    uart_puts(" x_pos: ");
+     842:      84 e3           ldi     r24, 0x34       ; 52
+     844:      91 e0           ldi     r25, 0x01       ; 1
+     846:      43 df           rcall   .-378           ; 0x6ce <uart_puts>
+    my_uitoa(delta_x(),stringbuffer,4);// x_abs returns current x position of your finger
+     848:      2a de           rcall   .-940           ; 0x49e <delta_x>
+     84a:      68 2f           mov     r22, r24
+     84c:      77 27           eor     r23, r23
+     84e:      67 fd           sbrc    r22, 7
+     850:      70 95           com     r23
+     852:      87 2f           mov     r24, r23
+     854:      97 2f           mov     r25, r23
+     856:      a8 01           movw    r20, r16
+     858:      24 e0           ldi     r18, 0x04       ; 4
+     85a:      4c df           rcall   .-360           ; 0x6f4 <my_uitoa>
+    uart_puts(stringbuffer);
+     85c:      c8 01           movw    r24, r16
+     85e:      37 df           rcall   .-402           ; 0x6ce <uart_puts>
+// 
+//     _delay_ms(20);
+// 
+//     touchpad_read(); // read data from touchpad
+
+    dx = delta_x();// returns the amount your finger has moved in x direction since last readout
+     860:      1e de           rcall   .-964           ; 0x49e <delta_x>
+     862:      c8 2e           mov     r12, r24
+    dy = delta_y();// returns the amount your finger has moved in y direction since last readout
+     864:      0c de           rcall   .-1000          ; 0x47e <delta_y>
+
+    // increment/decrement some dummy variables with the
+    if (x + dx > 255) {
+     866:      2c 2d           mov     r18, r12
+     868:      33 27           eor     r19, r19
+     86a:      27 fd           sbrc    r18, 7
+     86c:      30 95           com     r19
+     86e:      2e 0d           add     r18, r14
+     870:      31 1d           adc     r19, r1
+     872:      2f 3f           cpi     r18, 0xFF       ; 255
+     874:      31 05           cpc     r19, r1
+     876:      09 f0           breq    .+2             ; 0x87a <main+0xb6>
+     878:      24 f4           brge    .+8             ; 0x882 <main+0xbe>
+      x = 255;
+    } else if (x + dx < 0) {
+     87a:      37 fd           sbrc    r19, 7
+     87c:      05 c0           rjmp    .+10            ; 0x888 <main+0xc4>
+      x = 0;
+    } else {
+      x = (x + dx);
+     87e:      ec 0c           add     r14, r12
+     880:      04 c0           rjmp    .+8             ; 0x88a <main+0xc6>
+    dx = delta_x();// returns the amount your finger has moved in x direction since last readout
+    dy = delta_y();// returns the amount your finger has moved in y direction since last readout
+
+    // increment/decrement some dummy variables with the
+    if (x + dx > 255) {
+      x = 255;
+     882:      ee 24           eor     r14, r14
+     884:      ea 94           dec     r14
+     886:      01 c0           rjmp    .+2             ; 0x88a <main+0xc6>
+    } else if (x + dx < 0) {
+      x = 0;
+     888:      ee 24           eor     r14, r14
+    } else {
+      x = (x + dx);
+    }
+
+    if (y + dy > 255) {
+     88a:      28 2f           mov     r18, r24
+     88c:      33 27           eor     r19, r19
+     88e:      27 fd           sbrc    r18, 7
+     890:      30 95           com     r19
+     892:      2f 0d           add     r18, r15
+     894:      31 1d           adc     r19, r1
+     896:      2f 3f           cpi     r18, 0xFF       ; 255
+     898:      31 05           cpc     r19, r1
+     89a:      09 f0           breq    .+2             ; 0x89e <main+0xda>
+     89c:      24 f4           brge    .+8             ; 0x8a6 <main+0xe2>
+      y = 255;
+    } else if (y + dy < 0) {
+     89e:      37 fd           sbrc    r19, 7
+     8a0:      05 c0           rjmp    .+10            ; 0x8ac <main+0xe8>
+      y = 0;
+    } else {
+      y = (y + dy);
+     8a2:      f8 0e           add     r15, r24
+     8a4:      04 c0           rjmp    .+8             ; 0x8ae <main+0xea>
+    } else {
+      x = (x + dx);
+    }
+
+    if (y + dy > 255) {
+      y = 255;
+     8a6:      ff 24           eor     r15, r15
+     8a8:      fa 94           dec     r15
+     8aa:      01 c0           rjmp    .+2             ; 0x8ae <main+0xea>
+    } else if (y + dy < 0) {
+      y = 0;
+     8ac:      ff 24           eor     r15, r15
+    } else {
+      y = (y + dy);
+    }
+
+    uart_puts("x_pos: ");
+     8ae:      8d e3           ldi     r24, 0x3D       ; 61
+     8b0:      91 e0           ldi     r25, 0x01       ; 1
+     8b2:      0d df           rcall   .-486           ; 0x6ce <uart_puts>
+    my_uitoa(x, stringbuffer, 4);
+     8b4:      6e 2d           mov     r22, r14
+     8b6:      70 e0           ldi     r23, 0x00       ; 0
+     8b8:      80 e0           ldi     r24, 0x00       ; 0
+     8ba:      90 e0           ldi     r25, 0x00       ; 0
+     8bc:      a8 01           movw    r20, r16
+     8be:      24 e0           ldi     r18, 0x04       ; 4
+     8c0:      19 df           rcall   .-462           ; 0x6f4 <my_uitoa>
+    uart_puts(stringbuffer);
+     8c2:      c8 01           movw    r24, r16
+     8c4:      04 df           rcall   .-504           ; 0x6ce <uart_puts>
+    uart_puts("\ty_pos: ");
+     8c6:      85 e4           ldi     r24, 0x45       ; 69
+     8c8:      91 e0           ldi     r25, 0x01       ; 1
+     8ca:      01 df           rcall   .-510           ; 0x6ce <uart_puts>
+    my_uitoa(y, stringbuffer, 4);
+     8cc:      6f 2d           mov     r22, r15
+     8ce:      70 e0           ldi     r23, 0x00       ; 0
+     8d0:      80 e0           ldi     r24, 0x00       ; 0
+     8d2:      90 e0           ldi     r25, 0x00       ; 0
+     8d4:      a8 01           movw    r20, r16
+     8d6:      24 e0           ldi     r18, 0x04       ; 4
+     8d8:      0d df           rcall   .-486           ; 0x6f4 <my_uitoa>
+    uart_puts(stringbuffer);
+     8da:      c8 01           movw    r24, r16
+     8dc:      f8 de           rcall   .-528           ; 0x6ce <uart_puts>
+    uart_puts("\r");
+     8de:      8e e4           ldi     r24, 0x4E       ; 78
+     8e0:      91 e0           ldi     r25, 0x01       ; 1
+     8e2:      f5 de           rcall   .-534           ; 0x6ce <uart_puts>
+     8e4:      9e cf           rjmp    .-196           ; 0x822 <main+0x5e>
+
+000008e6 <CALLBACK_USB_GetDescriptor>:
+       const uint8_t  DescriptorNumber = (wValue & 0xFF);
+
+       const void* Address = NULL;
+       uint16_t    Size    = NO_DESCRIPTOR;
+
+       switch (DescriptorType)
+     8e6:      92 30           cpi     r25, 0x02       ; 2
+     8e8:      29 f0           breq    .+10            ; 0x8f4 <CALLBACK_USB_GetDescriptor+0xe>
+     8ea:      93 30           cpi     r25, 0x03       ; 3
+     8ec:      41 f0           breq    .+16            ; 0x8fe <CALLBACK_USB_GetDescriptor+0x18>
+     8ee:      91 30           cpi     r25, 0x01       ; 1
+     8f0:      e9 f4           brne    .+58            ; 0x92c <CALLBACK_USB_GetDescriptor+0x46>
+     8f2:      17 c0           rjmp    .+46            ; 0x922 <CALLBACK_USB_GetDescriptor+0x3c>
+                       Address = &DeviceDescriptor;
+                       Size    = sizeof(USB_Descriptor_Device_t);
+                       break;
+               case DTYPE_Configuration:
+                       Address = &ConfigurationDescriptor;
+                       Size    = sizeof(USB_Descriptor_Configuration_t);
+     8f4:      2e e3           ldi     r18, 0x3E       ; 62
+     8f6:      30 e0           ldi     r19, 0x00       ; 0
+               case DTYPE_Device:
+                       Address = &DeviceDescriptor;
+                       Size    = sizeof(USB_Descriptor_Device_t);
+                       break;
+               case DTYPE_Configuration:
+                       Address = &ConfigurationDescriptor;
+     8f8:      ea ea           ldi     r30, 0xAA       ; 170
+     8fa:      f0 e0           ldi     r31, 0x00       ; 0
+                       Size    = sizeof(USB_Descriptor_Configuration_t);
+                       break;
+     8fc:      1b c0           rjmp    .+54            ; 0x934 <CALLBACK_USB_GetDescriptor+0x4e>
+               case DTYPE_String:
+                       switch (DescriptorNumber)
+     8fe:      81 30           cpi     r24, 0x01       ; 1
+     900:      41 f0           breq    .+16            ; 0x912 <CALLBACK_USB_GetDescriptor+0x2c>
+     902:      81 30           cpi     r24, 0x01       ; 1
+     904:      18 f0           brcs    .+6             ; 0x90c <CALLBACK_USB_GetDescriptor+0x26>
+     906:      82 30           cpi     r24, 0x02       ; 2
+     908:      89 f4           brne    .+34            ; 0x92c <CALLBACK_USB_GetDescriptor+0x46>
+     90a:      06 c0           rjmp    .+12            ; 0x918 <CALLBACK_USB_GetDescriptor+0x32>
+                       {
+                               case 0x00:
+                                       Address = &LanguageString;
+                                       Size    = pgm_read_byte(&LanguageString.Header.Size);
+     90c:      e8 ee           ldi     r30, 0xE8       ; 232
+     90e:      f0 e0           ldi     r31, 0x00       ; 0
+     910:      05 c0           rjmp    .+10            ; 0x91c <CALLBACK_USB_GetDescriptor+0x36>
+                                       break;
+                               case 0x01:
+                                       Address = &ManufacturerString;
+                                       Size    = pgm_read_byte(&ManufacturerString.Header.Size);
+     912:      ec ee           ldi     r30, 0xEC       ; 236
+     914:      f0 e0           ldi     r31, 0x00       ; 0
+     916:      02 c0           rjmp    .+4             ; 0x91c <CALLBACK_USB_GetDescriptor+0x36>
+                                       break;
+                               case 0x02:
+                                       Address = &ProductString;
+                                       Size    = pgm_read_byte(&ProductString.Header.Size);
+     918:      e6 e0           ldi     r30, 0x06       ; 6
+     91a:      f1 e0           ldi     r31, 0x01       ; 1
+     91c:      24 91           lpm     r18, Z+
+     91e:      30 e0           ldi     r19, 0x00       ; 0
+                                       break;
+     920:      09 c0           rjmp    .+18            ; 0x934 <CALLBACK_USB_GetDescriptor+0x4e>
+
+       switch (DescriptorType)
+       {
+               case DTYPE_Device:
+                       Address = &DeviceDescriptor;
+                       Size    = sizeof(USB_Descriptor_Device_t);
+     922:      22 e1           ldi     r18, 0x12       ; 18
+     924:      30 e0           ldi     r19, 0x00       ; 0
+       uint16_t    Size    = NO_DESCRIPTOR;
+
+       switch (DescriptorType)
+       {
+               case DTYPE_Device:
+                       Address = &DeviceDescriptor;
+     926:      e8 e9           ldi     r30, 0x98       ; 152
+     928:      f0 e0           ldi     r31, 0x00       ; 0
+     92a:      04 c0           rjmp    .+8             ; 0x934 <CALLBACK_USB_GetDescriptor+0x4e>
+{
+       const uint8_t  DescriptorType   = (wValue >> 8);
+       const uint8_t  DescriptorNumber = (wValue & 0xFF);
+
+       const void* Address = NULL;
+       uint16_t    Size    = NO_DESCRIPTOR;
+     92c:      20 e0           ldi     r18, 0x00       ; 0
+     92e:      30 e0           ldi     r19, 0x00       ; 0
+                                    const void** const DescriptorAddress)
+{
+       const uint8_t  DescriptorType   = (wValue >> 8);
+       const uint8_t  DescriptorNumber = (wValue & 0xFF);
+
+       const void* Address = NULL;
+     930:      e0 e0           ldi     r30, 0x00       ; 0
+     932:      f0 e0           ldi     r31, 0x00       ; 0
+                       }
+
+                       break;
+       }
+
+       *DescriptorAddress = Address;
+     934:      da 01           movw    r26, r20
+     936:      11 96           adiw    r26, 0x01       ; 1
+     938:      fc 93           st      X, r31
+     93a:      ee 93           st      -X, r30
+       return Size;
+}
+     93c:      c9 01           movw    r24, r18
+     93e:      08 95           ret
+
+00000940 <Endpoint_Write_Control_Stream_LE>:
+#if defined(TEMPLATE_FUNC_NAME)
+
+uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer,
+                            uint16_t Length)
+{
+       uint8_t* DataStream     = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
+     940:      28 2f           mov     r18, r24
+     942:      39 2f           mov     r19, r25
+     944:      f9 01           movw    r30, r18
+       bool     LastPacketFull = false;
+
+       if (Length > USB_ControlRequest.wLength)
+     946:      80 91 a0 02     lds     r24, 0x02A0
+     94a:      90 91 a1 02     lds     r25, 0x02A1
+     94e:      86 17           cp      r24, r22
+     950:      97 07           cpc     r25, r23
+     952:      18 f4           brcc    .+6             ; 0x95a <Endpoint_Write_Control_Stream_LE+0x1a>
+     954:      bc 01           movw    r22, r24
+     956:      20 e0           ldi     r18, 0x00       ; 0
+     958:      34 c0           rjmp    .+104           ; 0x9c2 <Endpoint_Write_Control_Stream_LE+0x82>
+         Length = USB_ControlRequest.wLength;
+       else if (!(Length))
+     95a:      61 15           cp      r22, r1
+     95c:      71 05           cpc     r23, r1
+     95e:      d9 f7           brne    .-10            ; 0x956 <Endpoint_Write_Control_Stream_LE+0x16>
+                        */
+                       static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearIN(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UEINTX &= ~((1 << TXINI) | (1 << FIFOCON));
+     960:      80 91 e8 00     lds     r24, 0x00E8
+     964:      8e 77           andi    r24, 0x7E       ; 126
+     966:      80 93 e8 00     sts     0x00E8, r24
+     96a:      f5 cf           rjmp    .-22            ; 0x956 <Endpoint_Write_Control_Stream_LE+0x16>
+         Endpoint_ClearIN();
+
+       while (Length || LastPacketFull)
+       {
+               uint8_t USB_DeviceState_LCL = USB_DeviceState;
+     96c:      8e b3           in      r24, 0x1e       ; 30
+
+               if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+     96e:      88 23           and     r24, r24
+     970:      e9 f1           breq    .+122           ; 0x9ec <Endpoint_Write_Control_Stream_LE+0xac>
+                 return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+               else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+     972:      85 30           cpi     r24, 0x05       ; 5
+     974:      b9 f1           breq    .+110           ; 0x9e4 <Endpoint_Write_Control_Stream_LE+0xa4>
+                        *  \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsSETUPReceived(void)
+                       {
+                               return ((UEINTX & (1 << RXSTPI)) ? true : false);
+     976:      80 91 e8 00     lds     r24, 0x00E8
+                 return ENDPOINT_RWCSTREAM_BusSuspended;
+               else if (Endpoint_IsSETUPReceived())
+     97a:      83 fd           sbrc    r24, 3
+     97c:      35 c0           rjmp    .+106           ; 0x9e8 <Endpoint_Write_Control_Stream_LE+0xa8>
+                        *  \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsOUTReceived(void)
+                       {
+                               return ((UEINTX & (1 << RXOUTI)) ? true : false);
+     97e:      80 91 e8 00     lds     r24, 0x00E8
+                 return ENDPOINT_RWCSTREAM_HostAborted;
+               else if (Endpoint_IsOUTReceived())
+     982:      82 fd           sbrc    r24, 2
+     984:      29 c0           rjmp    .+82            ; 0x9d8 <Endpoint_Write_Control_Stream_LE+0x98>
+                        *  \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsINReady(void)
+                       {
+                               return ((UEINTX & (1 << TXINI)) ? true : false);
+     986:      80 91 e8 00     lds     r24, 0x00E8
+                 break;
+
+               if (Endpoint_IsINReady())
+     98a:      80 ff           sbrs    r24, 0
+     98c:      1a c0           rjmp    .+52            ; 0x9c2 <Endpoint_Write_Control_Stream_LE+0x82>
+                               #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+                                       return UEBCX;
+                               #elif defined(USB_SERIES_4_AVR)
+                                       return (((uint16_t)UEBCHX << 8) | UEBCLX);
+                               #elif defined(USB_SERIES_2_AVR)
+                                       return UEBCLX;
+     98e:      80 91 f2 00     lds     r24, 0x00F2
+     992:      90 e0           ldi     r25, 0x00       ; 0
+               {
+                       uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint();
+
+                       while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize))
+     994:      06 c0           rjmp    .+12            ; 0x9a2 <Endpoint_Write_Control_Stream_LE+0x62>
+                       {
+                               TEMPLATE_TRANSFER_BYTE(DataStream);
+     996:      21 91           ld      r18, Z+
+                        *  \param[in] Data  Data to write into the the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_Write_8(const uint8_t Data)
+                       {
+                               UEDATX = Data;
+     998:      20 93 f1 00     sts     0x00F1, r18
+                               TEMPLATE_BUFFER_MOVE(DataStream, 1);
+                               Length--;
+     99c:      61 50           subi    r22, 0x01       ; 1
+     99e:      70 40           sbci    r23, 0x00       ; 0
+                               BytesInEndpoint++;
+     9a0:      01 96           adiw    r24, 0x01       ; 1
+
+               if (Endpoint_IsINReady())
+               {
+                       uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint();
+
+                       while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize))
+     9a2:      61 15           cp      r22, r1
+     9a4:      71 05           cpc     r23, r1
+     9a6:      19 f0           breq    .+6             ; 0x9ae <Endpoint_Write_Control_Stream_LE+0x6e>
+     9a8:      88 30           cpi     r24, 0x08       ; 8
+     9aa:      91 05           cpc     r25, r1
+     9ac:      a0 f3           brcs    .-24            ; 0x996 <Endpoint_Write_Control_Stream_LE+0x56>
+                               TEMPLATE_BUFFER_MOVE(DataStream, 1);
+                               Length--;
+                               BytesInEndpoint++;
+                       }
+
+                       LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize);
+     9ae:      21 e0           ldi     r18, 0x01       ; 1
+     9b0:      88 30           cpi     r24, 0x08       ; 8
+     9b2:      91 05           cpc     r25, r1
+     9b4:      09 f0           breq    .+2             ; 0x9b8 <Endpoint_Write_Control_Stream_LE+0x78>
+     9b6:      20 e0           ldi     r18, 0x00       ; 0
+                        */
+                       static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearIN(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UEINTX &= ~((1 << TXINI) | (1 << FIFOCON));
+     9b8:      80 91 e8 00     lds     r24, 0x00E8
+     9bc:      8e 77           andi    r24, 0x7E       ; 126
+     9be:      80 93 e8 00     sts     0x00E8, r24
+       if (Length > USB_ControlRequest.wLength)
+         Length = USB_ControlRequest.wLength;
+       else if (!(Length))
+         Endpoint_ClearIN();
+
+       while (Length || LastPacketFull)
+     9c2:      61 15           cp      r22, r1
+     9c4:      71 05           cpc     r23, r1
+     9c6:      91 f6           brne    .-92            ; 0x96c <Endpoint_Write_Control_Stream_LE+0x2c>
+     9c8:      22 23           and     r18, r18
+     9ca:      81 f6           brne    .-96            ; 0x96c <Endpoint_Write_Control_Stream_LE+0x2c>
+     9cc:      05 c0           rjmp    .+10            ; 0x9d8 <Endpoint_Write_Control_Stream_LE+0x98>
+               }
+       }
+
+       while (!(Endpoint_IsOUTReceived()))
+       {
+               uint8_t USB_DeviceState_LCL = USB_DeviceState;
+     9ce:      8e b3           in      r24, 0x1e       ; 30
+
+               if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+     9d0:      88 23           and     r24, r24
+     9d2:      61 f0           breq    .+24            ; 0x9ec <Endpoint_Write_Control_Stream_LE+0xac>
+                 return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+               else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+     9d4:      85 30           cpi     r24, 0x05       ; 5
+     9d6:      61 f0           breq    .+24            ; 0x9f0 <Endpoint_Write_Control_Stream_LE+0xb0>
+                        *  \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsOUTReceived(void)
+                       {
+                               return ((UEINTX & (1 << RXOUTI)) ? true : false);
+     9d8:      80 91 e8 00     lds     r24, 0x00E8
+                       LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize);
+                       Endpoint_ClearIN();
+               }
+       }
+
+       while (!(Endpoint_IsOUTReceived()))
+     9dc:      82 ff           sbrs    r24, 2
+     9de:      f7 cf           rjmp    .-18            ; 0x9ce <Endpoint_Write_Control_Stream_LE+0x8e>
+                 return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+               else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+                 return ENDPOINT_RWCSTREAM_BusSuspended;
+       }
+
+       return ENDPOINT_RWCSTREAM_NoError;
+     9e0:      80 e0           ldi     r24, 0x00       ; 0
+     9e2:      08 95           ret
+               uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+               if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+                 return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+               else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+                 return ENDPOINT_RWCSTREAM_BusSuspended;
+     9e4:      83 e0           ldi     r24, 0x03       ; 3
+     9e6:      08 95           ret
+               else if (Endpoint_IsSETUPReceived())
+                 return ENDPOINT_RWCSTREAM_HostAborted;
+     9e8:      81 e0           ldi     r24, 0x01       ; 1
+     9ea:      08 95           ret
+       while (!(Endpoint_IsOUTReceived()))
+       {
+               uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+               if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+                 return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+     9ec:      82 e0           ldi     r24, 0x02       ; 2
+     9ee:      08 95           ret
+               else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+                 return ENDPOINT_RWCSTREAM_BusSuspended;
+     9f0:      83 e0           ldi     r24, 0x03       ; 3
+       }
+
+       return ENDPOINT_RWCSTREAM_NoError;
+}
+     9f2:      08 95           ret
+
+000009f4 <Endpoint_Write_Control_PStream_LE>:
+#if defined(TEMPLATE_FUNC_NAME)
+
+uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer,
+                            uint16_t Length)
+{
+       uint8_t* DataStream     = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
+     9f4:      e8 2f           mov     r30, r24
+     9f6:      f9 2f           mov     r31, r25
+       bool     LastPacketFull = false;
+
+       if (Length > USB_ControlRequest.wLength)
+     9f8:      80 91 a0 02     lds     r24, 0x02A0
+     9fc:      90 91 a1 02     lds     r25, 0x02A1
+     a00:      86 17           cp      r24, r22
+     a02:      97 07           cpc     r25, r23
+     a04:      18 f4           brcc    .+6             ; 0xa0c <Endpoint_Write_Control_PStream_LE+0x18>
+     a06:      bc 01           movw    r22, r24
+     a08:      20 e0           ldi     r18, 0x00       ; 0
+     a0a:      36 c0           rjmp    .+108           ; 0xa78 <Endpoint_Write_Control_PStream_LE+0x84>
+         Length = USB_ControlRequest.wLength;
+       else if (!(Length))
+     a0c:      61 15           cp      r22, r1
+     a0e:      71 05           cpc     r23, r1
+     a10:      d9 f7           brne    .-10            ; 0xa08 <Endpoint_Write_Control_PStream_LE+0x14>
+                        */
+                       static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearIN(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UEINTX &= ~((1 << TXINI) | (1 << FIFOCON));
+     a12:      80 91 e8 00     lds     r24, 0x00E8
+     a16:      8e 77           andi    r24, 0x7E       ; 126
+     a18:      80 93 e8 00     sts     0x00E8, r24
+     a1c:      f5 cf           rjmp    .-22            ; 0xa08 <Endpoint_Write_Control_PStream_LE+0x14>
+         Endpoint_ClearIN();
+
+       while (Length || LastPacketFull)
+       {
+               uint8_t USB_DeviceState_LCL = USB_DeviceState;
+     a1e:      8e b3           in      r24, 0x1e       ; 30
+
+               if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+     a20:      88 23           and     r24, r24
+     a22:      09 f4           brne    .+2             ; 0xa26 <Endpoint_Write_Control_PStream_LE+0x32>
+     a24:      3e c0           rjmp    .+124           ; 0xaa2 <Endpoint_Write_Control_PStream_LE+0xae>
+                 return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+               else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+     a26:      85 30           cpi     r24, 0x05       ; 5
+     a28:      c1 f1           breq    .+112           ; 0xa9a <Endpoint_Write_Control_PStream_LE+0xa6>
+                        *  \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsSETUPReceived(void)
+                       {
+                               return ((UEINTX & (1 << RXSTPI)) ? true : false);
+     a2a:      80 91 e8 00     lds     r24, 0x00E8
+                 return ENDPOINT_RWCSTREAM_BusSuspended;
+               else if (Endpoint_IsSETUPReceived())
+     a2e:      83 fd           sbrc    r24, 3
+     a30:      36 c0           rjmp    .+108           ; 0xa9e <Endpoint_Write_Control_PStream_LE+0xaa>
+                        *  \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsOUTReceived(void)
+                       {
+                               return ((UEINTX & (1 << RXOUTI)) ? true : false);
+     a32:      80 91 e8 00     lds     r24, 0x00E8
+                 return ENDPOINT_RWCSTREAM_HostAborted;
+               else if (Endpoint_IsOUTReceived())
+     a36:      82 fd           sbrc    r24, 2
+     a38:      2a c0           rjmp    .+84            ; 0xa8e <Endpoint_Write_Control_PStream_LE+0x9a>
+                        *  \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsINReady(void)
+                       {
+                               return ((UEINTX & (1 << TXINI)) ? true : false);
+     a3a:      80 91 e8 00     lds     r24, 0x00E8
+                 break;
+
+               if (Endpoint_IsINReady())
+     a3e:      80 ff           sbrs    r24, 0
+     a40:      1b c0           rjmp    .+54            ; 0xa78 <Endpoint_Write_Control_PStream_LE+0x84>
+                               #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+                                       return UEBCX;
+                               #elif defined(USB_SERIES_4_AVR)
+                                       return (((uint16_t)UEBCHX << 8) | UEBCLX);
+                               #elif defined(USB_SERIES_2_AVR)
+                                       return UEBCLX;
+     a42:      80 91 f2 00     lds     r24, 0x00F2
+     a46:      90 e0           ldi     r25, 0x00       ; 0
+               {
+                       uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint();
+
+                       while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize))
+     a48:      07 c0           rjmp    .+14            ; 0xa58 <Endpoint_Write_Control_PStream_LE+0x64>
+                       {
+                               TEMPLATE_TRANSFER_BYTE(DataStream);
+     a4a:      24 91           lpm     r18, Z+
+                        *  \param[in] Data  Data to write into the the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_Write_8(const uint8_t Data)
+                       {
+                               UEDATX = Data;
+     a4c:      20 93 f1 00     sts     0x00F1, r18
+                               TEMPLATE_BUFFER_MOVE(DataStream, 1);
+     a50:      31 96           adiw    r30, 0x01       ; 1
+                               Length--;
+     a52:      61 50           subi    r22, 0x01       ; 1
+     a54:      70 40           sbci    r23, 0x00       ; 0
+                               BytesInEndpoint++;
+     a56:      01 96           adiw    r24, 0x01       ; 1
+
+               if (Endpoint_IsINReady())
+               {
+                       uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint();
+
+                       while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize))
+     a58:      61 15           cp      r22, r1
+     a5a:      71 05           cpc     r23, r1
+     a5c:      19 f0           breq    .+6             ; 0xa64 <Endpoint_Write_Control_PStream_LE+0x70>
+     a5e:      88 30           cpi     r24, 0x08       ; 8
+     a60:      91 05           cpc     r25, r1
+     a62:      98 f3           brcs    .-26            ; 0xa4a <Endpoint_Write_Control_PStream_LE+0x56>
+                               TEMPLATE_BUFFER_MOVE(DataStream, 1);
+                               Length--;
+                               BytesInEndpoint++;
+                       }
+
+                       LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize);
+     a64:      21 e0           ldi     r18, 0x01       ; 1
+     a66:      88 30           cpi     r24, 0x08       ; 8
+     a68:      91 05           cpc     r25, r1
+     a6a:      09 f0           breq    .+2             ; 0xa6e <Endpoint_Write_Control_PStream_LE+0x7a>
+     a6c:      20 e0           ldi     r18, 0x00       ; 0
+                        */
+                       static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearIN(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UEINTX &= ~((1 << TXINI) | (1 << FIFOCON));
+     a6e:      80 91 e8 00     lds     r24, 0x00E8
+     a72:      8e 77           andi    r24, 0x7E       ; 126
+     a74:      80 93 e8 00     sts     0x00E8, r24
+       if (Length > USB_ControlRequest.wLength)
+         Length = USB_ControlRequest.wLength;
+       else if (!(Length))
+         Endpoint_ClearIN();
+
+       while (Length || LastPacketFull)
+     a78:      61 15           cp      r22, r1
+     a7a:      71 05           cpc     r23, r1
+     a7c:      81 f6           brne    .-96            ; 0xa1e <Endpoint_Write_Control_PStream_LE+0x2a>
+     a7e:      22 23           and     r18, r18
+     a80:      71 f6           brne    .-100           ; 0xa1e <Endpoint_Write_Control_PStream_LE+0x2a>
+     a82:      05 c0           rjmp    .+10            ; 0xa8e <Endpoint_Write_Control_PStream_LE+0x9a>
+               }
+       }
+
+       while (!(Endpoint_IsOUTReceived()))
+       {
+               uint8_t USB_DeviceState_LCL = USB_DeviceState;
+     a84:      8e b3           in      r24, 0x1e       ; 30
+
+               if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+     a86:      88 23           and     r24, r24
+     a88:      61 f0           breq    .+24            ; 0xaa2 <Endpoint_Write_Control_PStream_LE+0xae>
+                 return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+               else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+     a8a:      85 30           cpi     r24, 0x05       ; 5
+     a8c:      61 f0           breq    .+24            ; 0xaa6 <Endpoint_Write_Control_PStream_LE+0xb2>
+                        *  \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsOUTReceived(void)
+                       {
+                               return ((UEINTX & (1 << RXOUTI)) ? true : false);
+     a8e:      80 91 e8 00     lds     r24, 0x00E8
+                       LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize);
+                       Endpoint_ClearIN();
+               }
+       }
+
+       while (!(Endpoint_IsOUTReceived()))
+     a92:      82 ff           sbrs    r24, 2
+     a94:      f7 cf           rjmp    .-18            ; 0xa84 <Endpoint_Write_Control_PStream_LE+0x90>
+                 return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+               else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+                 return ENDPOINT_RWCSTREAM_BusSuspended;
+       }
+
+       return ENDPOINT_RWCSTREAM_NoError;
+     a96:      80 e0           ldi     r24, 0x00       ; 0
+     a98:      08 95           ret
+               uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+               if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+                 return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+               else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+                 return ENDPOINT_RWCSTREAM_BusSuspended;
+     a9a:      83 e0           ldi     r24, 0x03       ; 3
+     a9c:      08 95           ret
+               else if (Endpoint_IsSETUPReceived())
+                 return ENDPOINT_RWCSTREAM_HostAborted;
+     a9e:      81 e0           ldi     r24, 0x01       ; 1
+     aa0:      08 95           ret
+       while (!(Endpoint_IsOUTReceived()))
+       {
+               uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+               if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+                 return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+     aa2:      82 e0           ldi     r24, 0x02       ; 2
+     aa4:      08 95           ret
+               else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+                 return ENDPOINT_RWCSTREAM_BusSuspended;
+     aa6:      83 e0           ldi     r24, 0x03       ; 3
+       }
+
+       return ENDPOINT_RWCSTREAM_NoError;
+}
+     aa8:      08 95           ret
+
+00000aaa <Endpoint_ConfigureEndpoint_Prv>:
+       UECFG0X = UECFG0XData;
+       UECFG1X = UECFG1XData;
+
+       return Endpoint_IsConfigured();
+#else
+       for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
+     aaa:      98 2f           mov     r25, r24
+     aac:      2c c0           rjmp    .+88            ; 0xb06 <Endpoint_ConfigureEndpoint_Prv+0x5c>
+                        */
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UENUM = (Address & ENDPOINT_EPNUM_MASK);
+     aae:      29 2f           mov     r18, r25
+     ab0:      2f 70           andi    r18, 0x0F       ; 15
+     ab2:      20 93 e9 00     sts     0x00E9, r18
+               uint8_t UECFG1XTemp;
+               uint8_t UEIENXTemp;
+
+               Endpoint_SelectEndpoint(EPNum);
+
+               if (EPNum == Number)
+     ab6:      98 17           cp      r25, r24
+     ab8:      39 f0           breq    .+14            ; 0xac8 <Endpoint_ConfigureEndpoint_Prv+0x1e>
+                       UECFG1XTemp = UECFG1XData;
+                       UEIENXTemp  = 0;
+               }
+               else
+               {
+                       UECFG0XTemp = UECFG0X;
+     aba:      70 91 ec 00     lds     r23, 0x00EC
+                       UECFG1XTemp = UECFG1X;
+     abe:      20 91 ed 00     lds     r18, 0x00ED
+                       UEIENXTemp  = UEIENX;
+     ac2:      50 91 f0 00     lds     r21, 0x00F0
+     ac6:      03 c0           rjmp    .+6             ; 0xace <Endpoint_ConfigureEndpoint_Prv+0x24>
+               Endpoint_SelectEndpoint(EPNum);
+
+               if (EPNum == Number)
+               {
+                       UECFG0XTemp = UECFG0XData;
+                       UECFG1XTemp = UECFG1XData;
+     ac8:      24 2f           mov     r18, r20
+
+               Endpoint_SelectEndpoint(EPNum);
+
+               if (EPNum == Number)
+               {
+                       UECFG0XTemp = UECFG0XData;
+     aca:      76 2f           mov     r23, r22
+                       UECFG1XTemp = UECFG1XData;
+                       UEIENXTemp  = 0;
+     acc:      50 e0           ldi     r21, 0x00       ; 0
+                       UECFG0XTemp = UECFG0X;
+                       UECFG1XTemp = UECFG1X;
+                       UEIENXTemp  = UEIENX;
+               }
+
+               if (!(UECFG1XTemp & (1 << ALLOC)))
+     ace:      21 ff           sbrs    r18, 1
+     ad0:      19 c0           rjmp    .+50            ; 0xb04 <Endpoint_ConfigureEndpoint_Prv+0x5a>
+                        *  to and from a host.
+                        */
+                       static inline void Endpoint_DisableEndpoint(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_DisableEndpoint(void)
+                       {
+                               UECONX &= ~(1 << EPEN);
+     ad2:      30 91 eb 00     lds     r19, 0x00EB
+     ad6:      3e 7f           andi    r19, 0xFE       ; 254
+     ad8:      30 93 eb 00     sts     0x00EB, r19
+                 continue;
+
+               Endpoint_DisableEndpoint();
+               UECFG1X &= ~(1 << ALLOC);
+     adc:      30 91 ed 00     lds     r19, 0x00ED
+     ae0:      3d 7f           andi    r19, 0xFD       ; 253
+     ae2:      30 93 ed 00     sts     0x00ED, r19
+                        *  \note Endpoints must first be configured properly via \ref Endpoint_ConfigureEndpoint().
+                        */
+                       static inline void Endpoint_EnableEndpoint(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_EnableEndpoint(void)
+                       {
+                               UECONX |= (1 << EPEN);
+     ae6:      30 91 eb 00     lds     r19, 0x00EB
+     aea:      31 60           ori     r19, 0x01       ; 1
+     aec:      30 93 eb 00     sts     0x00EB, r19
+
+               Endpoint_EnableEndpoint();
+               UECFG0X = UECFG0XTemp;
+     af0:      70 93 ec 00     sts     0x00EC, r23
+               UECFG1X = UECFG1XTemp;
+     af4:      20 93 ed 00     sts     0x00ED, r18
+               UEIENX  = UEIENXTemp;
+     af8:      50 93 f0 00     sts     0x00F0, r21
+                        *  \return Boolean \c true if the currently selected endpoint has been configured, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsConfigured(void)
+                       {
+                               return ((UESTA0X & (1 << CFGOK)) ? true : false);
+     afc:      20 91 ee 00     lds     r18, 0x00EE
+
+               if (!(Endpoint_IsConfigured()))
+     b00:      27 ff           sbrs    r18, 7
+     b02:      08 c0           rjmp    .+16            ; 0xb14 <Endpoint_ConfigureEndpoint_Prv+0x6a>
+       UECFG0X = UECFG0XData;
+       UECFG1X = UECFG1XData;
+
+       return Endpoint_IsConfigured();
+#else
+       for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
+     b04:      9f 5f           subi    r25, 0xFF       ; 255
+     b06:      95 30           cpi     r25, 0x05       ; 5
+     b08:      90 f2           brcs    .-92            ; 0xaae <Endpoint_ConfigureEndpoint_Prv+0x4>
+                        */
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UENUM = (Address & ENDPOINT_EPNUM_MASK);
+     b0a:      8f 70           andi    r24, 0x0F       ; 15
+     b0c:      80 93 e9 00     sts     0x00E9, r24
+               if (!(Endpoint_IsConfigured()))
+                 return false;
+       }
+
+       Endpoint_SelectEndpoint(Number);
+       return true;
+     b10:      81 e0           ldi     r24, 0x01       ; 1
+     b12:      08 95           ret
+               UECFG0X = UECFG0XTemp;
+               UECFG1X = UECFG1XTemp;
+               UEIENX  = UEIENXTemp;
+
+               if (!(Endpoint_IsConfigured()))
+                 return false;
+     b14:      80 e0           ldi     r24, 0x00       ; 0
+       }
+
+       Endpoint_SelectEndpoint(Number);
+       return true;
+#endif
+}
+     b16:      08 95           ret
+
+00000b18 <Endpoint_ConfigureEndpointTable>:
+uint8_t USB_Device_ControlEndpointSize = ENDPOINT_CONTROLEP_DEFAULT_SIZE;
+#endif
+
+bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table,
+                                     const uint8_t Entries)
+{
+     b18:      ef 92           push    r14
+     b1a:      ff 92           push    r15
+     b1c:      0f 93           push    r16
+     b1e:      1f 93           push    r17
+     b20:      cf 93           push    r28
+     b22:      df 93           push    r29
+     b24:      16 2f           mov     r17, r22
+       {
+               if (!(Table[i].Address))
+                 continue;
+       
+               if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks)))
+                 return false;
+     b26:      e8 2e           mov     r14, r24
+     b28:      e7 01           movw    r28, r14
+     b2a:      7e 01           movw    r14, r28
+     b2c:      f9 2e           mov     r15, r25
+     b2e:      e7 01           movw    r28, r14
+#endif
+
+bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table,
+                                     const uint8_t Entries)
+{
+       for (uint8_t i = 0; i < Entries; i++)
+     b30:      00 e0           ldi     r16, 0x00       ; 0
+     b32:      2a c0           rjmp    .+84            ; 0xb88 <Endpoint_ConfigureEndpointTable+0x70>
+       {
+               if (!(Table[i].Address))
+     b34:      98 81           ld      r25, Y
+     b36:      99 23           and     r25, r25
+     b38:      29 f1           breq    .+74            ; 0xb84 <Endpoint_ConfigureEndpointTable+0x6c>
+                 continue;
+       
+               if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks)))
+     b3a:      6b 81           ldd     r22, Y+3        ; 0x03
+     b3c:      e9 81           ldd     r30, Y+1        ; 0x01
+     b3e:      fa 81           ldd     r31, Y+2        ; 0x02
+     b40:      2c 81           ldd     r18, Y+4        ; 0x04
+                       static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address,
+                                                                     const uint8_t Type,
+                                                                     const uint16_t Size,
+                                                                     const uint8_t Banks)
+                       {
+                               uint8_t Number = (Address & ENDPOINT_EPNUM_MASK);
+     b42:      89 2f           mov     r24, r25
+     b44:      8f 70           andi    r24, 0x0F       ; 15
+
+                               if (Number >= ENDPOINT_TOTAL_ENDPOINTS)
+     b46:      85 30           cpi     r24, 0x05       ; 5
+     b48:      18 f5           brcc    .+70            ; 0xb90 <Endpoint_ConfigureEndpointTable+0x78>
+                                 return false;
+
+                               return Endpoint_ConfigureEndpoint_Prv(Number,
+                                                                     ((Type << EPTYPE0) | ((Address & ENDPOINT_DIR_IN) ? (1 << EPDIR) : 0)),
+     b4a:      62 95           swap    r22
+     b4c:      66 0f           add     r22, r22
+     b4e:      66 0f           add     r22, r22
+     b50:      60 7c           andi    r22, 0xC0       ; 192
+     b52:      99 1f           adc     r25, r25
+     b54:      99 27           eor     r25, r25
+     b56:      99 1f           adc     r25, r25
+                               uint8_t Number = (Address & ENDPOINT_EPNUM_MASK);
+
+                               if (Number >= ENDPOINT_TOTAL_ENDPOINTS)
+                                 return false;
+
+                               return Endpoint_ConfigureEndpoint_Prv(Number,
+     b58:      69 2b           or      r22, r25
+     b5a:      22 30           cpi     r18, 0x02       ; 2
+     b5c:      10 f0           brcs    .+4             ; 0xb62 <Endpoint_ConfigureEndpointTable+0x4a>
+     b5e:      96 e0           ldi     r25, 0x06       ; 6
+     b60:      01 c0           rjmp    .+2             ; 0xb64 <Endpoint_ConfigureEndpointTable+0x4c>
+     b62:      92 e0           ldi     r25, 0x02       ; 2
+                       static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST
+                                                                                              ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes)
+                       {
+                               uint8_t  MaskVal    = 0;
+                               uint16_t CheckBytes = 8;
+     b64:      28 e0           ldi     r18, 0x08       ; 8
+     b66:      30 e0           ldi     r19, 0x00       ; 0
+               /* Inline Functions: */
+                       static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST
+                                                                                              ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes)
+                       {
+                               uint8_t  MaskVal    = 0;
+     b68:      40 e0           ldi     r20, 0x00       ; 0
+     b6a:      03 c0           rjmp    .+6             ; 0xb72 <Endpoint_ConfigureEndpointTable+0x5a>
+                               uint16_t CheckBytes = 8;
+
+                               while (CheckBytes < Bytes)
+                               {
+                                       MaskVal++;
+     b6c:      4f 5f           subi    r20, 0xFF       ; 255
+                                       CheckBytes <<= 1;
+     b6e:      22 0f           add     r18, r18
+     b70:      33 1f           adc     r19, r19
+                       static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes)
+                       {
+                               uint8_t  MaskVal    = 0;
+                               uint16_t CheckBytes = 8;
+
+                               while (CheckBytes < Bytes)
+     b72:      2e 17           cp      r18, r30
+     b74:      3f 07           cpc     r19, r31
+     b76:      d0 f3           brcs    .-12            ; 0xb6c <Endpoint_ConfigureEndpointTable+0x54>
+                               {
+                                       MaskVal++;
+                                       CheckBytes <<= 1;
+                               }
+
+                               return (MaskVal << EPSIZE0);
+     b78:      42 95           swap    r20
+     b7a:      40 7f           andi    r20, 0xF0       ; 240
+                               uint8_t Number = (Address & ENDPOINT_EPNUM_MASK);
+
+                               if (Number >= ENDPOINT_TOTAL_ENDPOINTS)
+                                 return false;
+
+                               return Endpoint_ConfigureEndpoint_Prv(Number,
+     b7c:      49 2b           or      r20, r25
+     b7e:      95 df           rcall   .-214           ; 0xaaa <Endpoint_ConfigureEndpoint_Prv>
+     b80:      88 23           and     r24, r24
+     b82:      31 f0           breq    .+12            ; 0xb90 <Endpoint_ConfigureEndpointTable+0x78>
+#endif
+
+bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table,
+                                     const uint8_t Entries)
+{
+       for (uint8_t i = 0; i < Entries; i++)
+     b84:      0f 5f           subi    r16, 0xFF       ; 255
+     b86:      25 96           adiw    r28, 0x05       ; 5
+     b88:      01 17           cp      r16, r17
+     b8a:      a0 f2           brcs    .-88            ; 0xb34 <Endpoint_ConfigureEndpointTable+0x1c>
+       
+               if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks)))
+                 return false;
+       }
+       
+       return true;
+     b8c:      81 e0           ldi     r24, 0x01       ; 1
+     b8e:      01 c0           rjmp    .+2             ; 0xb92 <Endpoint_ConfigureEndpointTable+0x7a>
+       {
+               if (!(Table[i].Address))
+                 continue;
+       
+               if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks)))
+                 return false;
+     b90:      80 e0           ldi     r24, 0x00       ; 0
+       }
+       
+       return true;
+}
+     b92:      df 91           pop     r29
+     b94:      cf 91           pop     r28
+     b96:      1f 91           pop     r17
+     b98:      0f 91           pop     r16
+     b9a:      ff 90           pop     r15
+     b9c:      ef 90           pop     r14
+     b9e:      08 95           ret
+
+00000ba0 <Endpoint_ClearStatusStage>:
+       }
+}
+
+void Endpoint_ClearStatusStage(void)
+{
+       if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST)
+     ba0:      80 91 9a 02     lds     r24, 0x029A
+     ba4:      87 ff           sbrs    r24, 7
+     ba6:      11 c0           rjmp    .+34            ; 0xbca <Endpoint_ClearStatusStage+0x2a>
+     ba8:      03 c0           rjmp    .+6             ; 0xbb0 <Endpoint_ClearStatusStage+0x10>
+       {
+               while (!(Endpoint_IsOUTReceived()))
+               {
+                       if (USB_DeviceState == DEVICE_STATE_Unattached)
+     baa:      8e b3           in      r24, 0x1e       ; 30
+     bac:      88 23           and     r24, r24
+     bae:      b1 f0           breq    .+44            ; 0xbdc <Endpoint_ClearStatusStage+0x3c>
+                        *  \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsOUTReceived(void)
+                       {
+                               return ((UEINTX & (1 << RXOUTI)) ? true : false);
+     bb0:      80 91 e8 00     lds     r24, 0x00E8
+
+void Endpoint_ClearStatusStage(void)
+{
+       if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST)
+       {
+               while (!(Endpoint_IsOUTReceived()))
+     bb4:      82 ff           sbrs    r24, 2
+     bb6:      f9 cf           rjmp    .-14            ; 0xbaa <Endpoint_ClearStatusStage+0xa>
+                        */
+                       static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearOUT(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UEINTX &= ~((1 << RXOUTI) | (1 << FIFOCON));
+     bb8:      80 91 e8 00     lds     r24, 0x00E8
+     bbc:      8b 77           andi    r24, 0x7B       ; 123
+     bbe:      80 93 e8 00     sts     0x00E8, r24
+     bc2:      08 95           ret
+       }
+       else
+       {
+               while (!(Endpoint_IsINReady()))
+               {
+                       if (USB_DeviceState == DEVICE_STATE_Unattached)
+     bc4:      8e b3           in      r24, 0x1e       ; 30
+     bc6:      88 23           and     r24, r24
+     bc8:      49 f0           breq    .+18            ; 0xbdc <Endpoint_ClearStatusStage+0x3c>
+                        *  \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsINReady(void)
+                       {
+                               return ((UEINTX & (1 << TXINI)) ? true : false);
+     bca:      80 91 e8 00     lds     r24, 0x00E8
+
+               Endpoint_ClearOUT();
+       }
+       else
+       {
+               while (!(Endpoint_IsINReady()))
+     bce:      80 ff           sbrs    r24, 0
+     bd0:      f9 cf           rjmp    .-14            ; 0xbc4 <Endpoint_ClearStatusStage+0x24>
+                        */
+                       static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearIN(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UEINTX &= ~((1 << TXINI) | (1 << FIFOCON));
+     bd2:      80 91 e8 00     lds     r24, 0x00E8
+     bd6:      8e 77           andi    r24, 0x7E       ; 126
+     bd8:      80 93 e8 00     sts     0x00E8, r24
+     bdc:      08 95           ret
+
+00000bde <Endpoint_WaitUntilReady>:
+                        *  \return Current USB frame number from the USB controller.
+                        */
+                       static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+                       static inline uint16_t USB_Device_GetFrameNumber(void)
+                       {
+                               return UDFNUM;
+     bde:      80 91 e4 00     lds     r24, 0x00E4
+     be2:      90 91 e5 00     lds     r25, 0x00E5
+
+#if !defined(CONTROL_ONLY_DEVICE)
+uint8_t Endpoint_WaitUntilReady(void)
+{
+       #if (USB_STREAM_TIMEOUT_MS < 0xFF)
+       uint8_t  TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
+     be6:      44 e6           ldi     r20, 0x64       ; 100
+                        *  \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask.
+                        */
+                       static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Endpoint_GetEndpointDirection(void)
+                       {
+                               return (UECFG0X & (1 << EPDIR)) ? ENDPOINT_DIR_IN : ENDPOINT_DIR_OUT;
+     be8:      20 91 ec 00     lds     r18, 0x00EC
+     bec:      20 ff           sbrs    r18, 0
+     bee:      25 c0           rjmp    .+74            ; 0xc3a <Endpoint_WaitUntilReady+0x5c>
+                        *  \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsINReady(void)
+                       {
+                               return ((UEINTX & (1 << TXINI)) ? true : false);
+     bf0:      20 91 e8 00     lds     r18, 0x00E8
+
+       for (;;)
+       {
+               if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN)
+               {
+                       if (Endpoint_IsINReady())
+     bf4:      20 fd           sbrc    r18, 0
+     bf6:      15 c0           rjmp    .+42            ; 0xc22 <Endpoint_WaitUntilReady+0x44>
+               {
+                       if (Endpoint_IsOUTReceived())
+                         return ENDPOINT_READYWAIT_NoError;
+               }
+
+               uint8_t USB_DeviceState_LCL = USB_DeviceState;
+     bf8:      2e b3           in      r18, 0x1e       ; 30
+
+               if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+     bfa:      22 23           and     r18, r18
+     bfc:      a1 f0           breq    .+40            ; 0xc26 <Endpoint_WaitUntilReady+0x48>
+                 return ENDPOINT_READYWAIT_DeviceDisconnected;
+               else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+     bfe:      25 30           cpi     r18, 0x05       ; 5
+     c00:      a1 f0           breq    .+40            ; 0xc2a <Endpoint_WaitUntilReady+0x4c>
+                        *  \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsStalled(void)
+                       {
+                               return ((UECONX & (1 << STALLRQ)) ? true : false);
+     c02:      20 91 eb 00     lds     r18, 0x00EB
+                 return ENDPOINT_READYWAIT_BusSuspended;
+               else if (Endpoint_IsStalled())
+     c06:      25 fd           sbrc    r18, 5
+     c08:      12 c0           rjmp    .+36            ; 0xc2e <Endpoint_WaitUntilReady+0x50>
+     c0a:      20 91 e4 00     lds     r18, 0x00E4
+     c0e:      30 91 e5 00     lds     r19, 0x00E5
+                 return ENDPOINT_READYWAIT_EndpointStalled;
+
+               uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber();
+
+               if (CurrentFrameNumber != PreviousFrameNumber)
+     c12:      28 17           cp      r18, r24
+     c14:      39 07           cpc     r19, r25
+     c16:      41 f3           breq    .-48            ; 0xbe8 <Endpoint_WaitUntilReady+0xa>
+               {
+                       PreviousFrameNumber = CurrentFrameNumber;
+
+                       if (!(TimeoutMSRem--))
+     c18:      44 23           and     r20, r20
+     c1a:      59 f0           breq    .+22            ; 0xc32 <Endpoint_WaitUntilReady+0x54>
+     c1c:      41 50           subi    r20, 0x01       ; 1
+     c1e:      c9 01           movw    r24, r18
+     c20:      e3 cf           rjmp    .-58            ; 0xbe8 <Endpoint_WaitUntilReady+0xa>
+       for (;;)
+       {
+               if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN)
+               {
+                       if (Endpoint_IsINReady())
+                         return ENDPOINT_READYWAIT_NoError;
+     c22:      80 e0           ldi     r24, 0x00       ; 0
+     c24:      08 95           ret
+               }
+
+               uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+               if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+                 return ENDPOINT_READYWAIT_DeviceDisconnected;
+     c26:      82 e0           ldi     r24, 0x02       ; 2
+     c28:      08 95           ret
+               else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+                 return ENDPOINT_READYWAIT_BusSuspended;
+     c2a:      83 e0           ldi     r24, 0x03       ; 3
+     c2c:      08 95           ret
+               else if (Endpoint_IsStalled())
+                 return ENDPOINT_READYWAIT_EndpointStalled;
+     c2e:      81 e0           ldi     r24, 0x01       ; 1
+     c30:      08 95           ret
+               if (CurrentFrameNumber != PreviousFrameNumber)
+               {
+                       PreviousFrameNumber = CurrentFrameNumber;
+
+                       if (!(TimeoutMSRem--))
+                         return ENDPOINT_READYWAIT_Timeout;
+     c32:      84 e0           ldi     r24, 0x04       ; 4
+     c34:      08 95           ret
+                         return ENDPOINT_READYWAIT_NoError;
+               }
+               else
+               {
+                       if (Endpoint_IsOUTReceived())
+                         return ENDPOINT_READYWAIT_NoError;
+     c36:      80 e0           ldi     r24, 0x00       ; 0
+
+                       if (!(TimeoutMSRem--))
+                         return ENDPOINT_READYWAIT_Timeout;
+               }
+       }
+}
+     c38:      08 95           ret
+                        *  \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsOUTReceived(void)
+                       {
+                               return ((UEINTX & (1 << RXOUTI)) ? true : false);
+     c3a:      20 91 e8 00     lds     r18, 0x00E8
+                       if (Endpoint_IsINReady())
+                         return ENDPOINT_READYWAIT_NoError;
+               }
+               else
+               {
+                       if (Endpoint_IsOUTReceived())
+     c3e:      22 ff           sbrs    r18, 2
+     c40:      db cf           rjmp    .-74            ; 0xbf8 <Endpoint_WaitUntilReady+0x1a>
+     c42:      f9 cf           rjmp    .-14            ; 0xc36 <Endpoint_WaitUntilReady+0x58>
+
+00000c44 <USB_ResetInterface>:
+{
+       #if defined(USB_CAN_BE_BOTH)
+       bool UIDModeSelectEnabled = ((UHWCON & (1 << UIDE)) != 0);
+       #endif
+
+       USB_INT_DisableAllInterrupts();
+     c44:      40 d0           rcall   .+128           ; 0xcc6 <USB_INT_DisableAllInterrupts>
+       USB_INT_ClearAllInterrupts();
+     c46:      42 d0           rcall   .+132           ; 0xccc <USB_INT_ClearAllInterrupts>
+                       }
+
+                       static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Controller_Reset(void)
+                       {
+                               USBCON &= ~(1 << USBE);
+     c48:      80 91 d8 00     lds     r24, 0x00D8
+     c4c:      8f 77           andi    r24, 0x7F       ; 127
+     c4e:      80 93 d8 00     sts     0x00D8, r24
+                               USBCON |=  (1 << USBE);
+     c52:      80 91 d8 00     lds     r24, 0x00D8
+     c56:      80 68           ori     r24, 0x80       ; 128
+     c58:      80 93 d8 00     sts     0x00D8, r24
+                       }
+
+                       static inline void USB_CLK_Unfreeze(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_CLK_Unfreeze(void)
+                       {
+                               USBCON &= ~(1 << FRZCLK);
+     c5c:      80 91 d8 00     lds     r24, 0x00D8
+     c60:      8f 7d           andi    r24, 0xDF       ; 223
+     c62:      80 93 d8 00     sts     0x00D8, r24
+
+               /* Inline Functions: */
+                       static inline void USB_PLL_On(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_PLL_On(void)
+                       {
+                               PLLCSR = USB_PLL_PSC;
+     c66:      84 e0           ldi     r24, 0x04       ; 4
+     c68:      89 bd           out     0x29, r24       ; 41
+                               PLLCSR = (USB_PLL_PSC | (1 << PLLE));
+     c6a:      86 e0           ldi     r24, 0x06       ; 6
+     c6c:      89 bd           out     0x29, r24       ; 41
+
+               if (!(USB_Options & USB_OPT_MANUAL_PLL))
+               {
+                       #if defined(USB_SERIES_2_AVR)
+                       USB_PLL_On();
+                       while (!(USB_PLL_IsReady()));
+     c6e:      09 b4           in      r0, 0x29        ; 41
+     c70:      00 fe           sbrs    r0, 0
+     c72:      fd cf           rjmp    .-6             ; 0xc6e <USB_ResetInterface+0x2a>
+}
+
+#if defined(USB_CAN_BE_DEVICE)
+static void USB_Init_Device(void)
+{
+       USB_DeviceState                 = DEVICE_STATE_Unattached;
+     c74:      1e ba           out     0x1e, r1        ; 30
+       USB_Device_ConfigurationNumber  = 0;
+     c76:      10 92 96 02     sts     0x0296, r1
+
+       #if !defined(NO_DEVICE_REMOTE_WAKEUP)
+       USB_Device_RemoteWakeupEnabled  = false;
+     c7a:      10 92 98 02     sts     0x0298, r1
+       #endif
+
+       #if !defined(NO_DEVICE_SELF_POWER)
+       USB_Device_CurrentlySelfPowered = false;
+     c7e:      10 92 97 02     sts     0x0297, r1
+                               uint8_t Number = (Address & ENDPOINT_EPNUM_MASK);
+
+                               if (Number >= ENDPOINT_TOTAL_ENDPOINTS)
+                                 return false;
+
+                               return Endpoint_ConfigureEndpoint_Prv(Number,
+     c82:      80 e0           ldi     r24, 0x00       ; 0
+     c84:      60 e0           ldi     r22, 0x00       ; 0
+     c86:      42 e0           ldi     r20, 0x02       ; 2
+     c88:      10 df           rcall   .-480           ; 0xaaa <Endpoint_ConfigureEndpoint_Prv>
+                                       #if defined(USB_CAN_BE_DEVICE)
+                                       case USB_INT_WAKEUPI:
+                                               UDINT  &= ~(1 << WAKEUPI);
+                                               break;
+                                       case USB_INT_SUSPI:
+                                               UDINT  &= ~(1 << SUSPI);
+     c8a:      80 91 e1 00     lds     r24, 0x00E1
+     c8e:      8e 7f           andi    r24, 0xFE       ; 254
+     c90:      80 93 e1 00     sts     0x00E1, r24
+                                       #if defined(USB_CAN_BE_DEVICE)
+                                       case USB_INT_WAKEUPI:
+                                               UDIEN  |= (1 << WAKEUPE);
+                                               break;
+                                       case USB_INT_SUSPI:
+                                               UDIEN  |= (1 << SUSPE);
+     c94:      80 91 e2 00     lds     r24, 0x00E2
+     c98:      81 60           ori     r24, 0x01       ; 1
+     c9a:      80 93 e2 00     sts     0x00E2, r24
+                                               break;
+                                       case USB_INT_EORSTI:
+                                               UDIEN  |= (1 << EORSTE);
+     c9e:      80 91 e2 00     lds     r24, 0x00E2
+     ca2:      88 60           ori     r24, 0x08       ; 8
+     ca4:      80 93 e2 00     sts     0x00E2, r24
+                        *  register and despite the datasheet making no mention of its requirement in host mode.
+                        */
+                       static inline void USB_Attach(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Attach(void)
+                       {
+                               UDCON  &= ~(1 << DETACH);
+     ca8:      80 91 e0 00     lds     r24, 0x00E0
+     cac:      8e 7f           andi    r24, 0xFE       ; 254
+     cae:      80 93 e0 00     sts     0x00E0, r24
+       }
+
+       #if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+       USB_OTGPAD_On();
+       #endif
+}
+     cb2:      08 95           ret
+
+00000cb4 <USB_Init>:
+                       static inline void USB_REG_On(void)
+                       {
+                       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+                               UHWCON |=  (1 << UVREGE);
+                       #else
+                               REGCR  &= ~(1 << REGDIS);
+     cb4:      e3 e6           ldi     r30, 0x63       ; 99
+     cb6:      f0 e0           ldi     r31, 0x00       ; 0
+     cb8:      80 81           ld      r24, Z
+     cba:      8e 7f           andi    r24, 0xFE       ; 254
+     cbc:      80 83           st      Z, r24
+               UHWCON &= ~(1 << UIDE);
+               USB_CurrentMode = Mode;
+       }
+       #endif
+
+       USB_IsInitialized = true;
+     cbe:      81 e0           ldi     r24, 0x01       ; 1
+     cc0:      80 93 99 02     sts     0x0299, r24
+
+       USB_ResetInterface();
+}
+     cc4:      bf cf           rjmp    .-130           ; 0xc44 <USB_ResetInterface>
+
+00000cc6 <USB_INT_DisableAllInterrupts>:
+       #if defined(USB_CAN_BE_HOST)
+       UHIEN   = 0;
+       #endif
+
+       #if defined(USB_CAN_BE_DEVICE)
+       UDIEN   = 0;
+     cc6:      10 92 e2 00     sts     0x00E2, r1
+       #endif
+}
+     cca:      08 95           ret
+
+00000ccc <USB_INT_ClearAllInterrupts>:
+       #if defined(USB_CAN_BE_HOST)
+       UHINT  = 0;
+       #endif
+
+       #if defined(USB_CAN_BE_DEVICE)
+       UDINT  = 0;
+     ccc:      10 92 e1 00     sts     0x00E1, r1
+       #endif
+}
+     cd0:      08 95           ret
+
+00000cd2 <__vector_11>:
+
+ISR(USB_GEN_vect, ISR_BLOCK)
+{
+     cd2:      1f 92           push    r1
+     cd4:      0f 92           push    r0
+     cd6:      0f b6           in      r0, 0x3f        ; 63
+     cd8:      0f 92           push    r0
+     cda:      11 24           eor     r1, r1
+     cdc:      2f 93           push    r18
+     cde:      3f 93           push    r19
+     ce0:      4f 93           push    r20
+     ce2:      5f 93           push    r21
+     ce4:      6f 93           push    r22
+     ce6:      7f 93           push    r23
+     ce8:      8f 93           push    r24
+     cea:      9f 93           push    r25
+     cec:      af 93           push    r26
+     cee:      bf 93           push    r27
+     cf0:      ef 93           push    r30
+     cf2:      ff 93           push    r31
+                                       case USB_INT_SUSPI:
+                                               return (UDINT  & (1 << SUSPI));
+                                       case USB_INT_EORSTI:
+                                               return (UDINT  & (1 << EORSTI));
+                                       case USB_INT_SOFI:
+                                               return (UDINT  & (1 << SOFI));
+     cf4:      80 91 e1 00     lds     r24, 0x00E1
+       #if defined(USB_CAN_BE_DEVICE)
+       #if !defined(NO_SOF_EVENTS)
+       if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI))
+     cf8:      82 ff           sbrs    r24, 2
+     cfa:      0a c0           rjmp    .+20            ; 0xd10 <__vector_11+0x3e>
+                                       case USB_INT_SUSPI:
+                                               return (UDIEN  & (1 << SUSPE));
+                                       case USB_INT_EORSTI:
+                                               return (UDIEN  & (1 << EORSTE));
+                                       case USB_INT_SOFI:
+                                               return (UDIEN  & (1 << SOFE));
+     cfc:      80 91 e2 00     lds     r24, 0x00E2
+     d00:      82 ff           sbrs    r24, 2
+     d02:      06 c0           rjmp    .+12            ; 0xd10 <__vector_11+0x3e>
+                                               break;
+                                       case USB_INT_EORSTI:
+                                               UDINT  &= ~(1 << EORSTI);
+                                               break;
+                                       case USB_INT_SOFI:
+                                               UDINT  &= ~(1 << SOFI);
+     d04:      80 91 e1 00     lds     r24, 0x00E1
+     d08:      8b 7f           andi    r24, 0xFB       ; 251
+     d0a:      80 93 e1 00     sts     0x00E1, r24
+       {
+               USB_INT_Clear(USB_INT_SOFI);
+
+               EVENT_USB_Device_StartOfFrame();
+     d0e:      21 d2           rcall   .+1090          ; 0x1152 <USB_Event_Stub>
+                                       #endif
+                                       #if defined(USB_CAN_BE_DEVICE)
+                                       case USB_INT_WAKEUPI:
+                                               return (UDINT  & (1 << WAKEUPI));
+                                       case USB_INT_SUSPI:
+                                               return (UDINT  & (1 << SUSPI));
+     d10:      80 91 e1 00     lds     r24, 0x00E1
+                       EVENT_USB_Device_Disconnect();
+               }
+       }
+       #endif
+
+       if (USB_INT_HasOccurred(USB_INT_SUSPI) && USB_INT_IsEnabled(USB_INT_SUSPI))
+     d14:      80 ff           sbrs    r24, 0
+     d16:      16 c0           rjmp    .+44            ; 0xd44 <__vector_11+0x72>
+                                       #endif
+                                       #if defined(USB_CAN_BE_DEVICE)
+                                       case USB_INT_WAKEUPI:
+                                               return (UDIEN  & (1 << WAKEUPE));
+                                       case USB_INT_SUSPI:
+                                               return (UDIEN  & (1 << SUSPE));
+     d18:      80 91 e2 00     lds     r24, 0x00E2
+     d1c:      80 ff           sbrs    r24, 0
+     d1e:      12 c0           rjmp    .+36            ; 0xd44 <__vector_11+0x72>
+                                       #if defined(USB_CAN_BE_DEVICE)
+                                       case USB_INT_WAKEUPI:
+                                               UDIEN  &= ~(1 << WAKEUPE);
+                                               break;
+                                       case USB_INT_SUSPI:
+                                               UDIEN  &= ~(1 << SUSPE);
+     d20:      80 91 e2 00     lds     r24, 0x00E2
+     d24:      8e 7f           andi    r24, 0xFE       ; 254
+     d26:      80 93 e2 00     sts     0x00E2, r24
+                                               USBCON |= (1 << IDTE);
+                                               break;
+                                       #endif
+                                       #if defined(USB_CAN_BE_DEVICE)
+                                       case USB_INT_WAKEUPI:
+                                               UDIEN  |= (1 << WAKEUPE);
+     d2a:      80 91 e2 00     lds     r24, 0x00E2
+     d2e:      80 61           ori     r24, 0x10       ; 16
+     d30:      80 93 e2 00     sts     0x00E2, r24
+                       #endif
+
+                       static inline void USB_CLK_Freeze(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_CLK_Freeze(void)
+                       {
+                               USBCON |=  (1 << FRZCLK);
+     d34:      80 91 d8 00     lds     r24, 0x00D8
+     d38:      80 62           ori     r24, 0x20       ; 32
+     d3a:      80 93 d8 00     sts     0x00D8, r24
+                       }
+
+                       static inline void USB_PLL_Off(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_PLL_Off(void)
+                       {
+                               PLLCSR = 0;
+     d3e:      19 bc           out     0x29, r1        ; 41
+
+               if (!(USB_Options & USB_OPT_MANUAL_PLL))
+                 USB_PLL_Off();
+
+               #if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT)
+               USB_DeviceState = DEVICE_STATE_Unattached;
+     d40:      1e ba           out     0x1e, r1        ; 30
+               EVENT_USB_Device_Disconnect();
+     d42:      2c dc           rcall   .-1960          ; 0x59c <EVENT_USB_Device_Disconnect>
+                                       case USB_INT_IDTI:
+                                               return (USBINT & (1 << IDTI));
+                                       #endif
+                                       #if defined(USB_CAN_BE_DEVICE)
+                                       case USB_INT_WAKEUPI:
+                                               return (UDINT  & (1 << WAKEUPI));
+     d44:      80 91 e1 00     lds     r24, 0x00E1
+               USB_DeviceState = DEVICE_STATE_Suspended;
+               EVENT_USB_Device_Suspend();
+               #endif
+       }
+
+       if (USB_INT_HasOccurred(USB_INT_WAKEUPI) && USB_INT_IsEnabled(USB_INT_WAKEUPI))
+     d48:      84 ff           sbrs    r24, 4
+     d4a:      2c c0           rjmp    .+88            ; 0xda4 <__vector_11+0xd2>
+                                       case USB_INT_IDTI:
+                                               return (USBCON & (1 << IDTE));
+                                       #endif
+                                       #if defined(USB_CAN_BE_DEVICE)
+                                       case USB_INT_WAKEUPI:
+                                               return (UDIEN  & (1 << WAKEUPE));
+     d4c:      80 91 e2 00     lds     r24, 0x00E2
+     d50:      84 ff           sbrs    r24, 4
+     d52:      28 c0           rjmp    .+80            ; 0xda4 <__vector_11+0xd2>
+
+               /* Inline Functions: */
+                       static inline void USB_PLL_On(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_PLL_On(void)
+                       {
+                               PLLCSR = USB_PLL_PSC;
+     d54:      84 e0           ldi     r24, 0x04       ; 4
+     d56:      89 bd           out     0x29, r24       ; 41
+                               PLLCSR = (USB_PLL_PSC | (1 << PLLE));
+     d58:      86 e0           ldi     r24, 0x06       ; 6
+     d5a:      89 bd           out     0x29, r24       ; 41
+       {
+               if (!(USB_Options & USB_OPT_MANUAL_PLL))
+               {
+                       USB_PLL_On();
+                       while (!(USB_PLL_IsReady()));
+     d5c:      09 b4           in      r0, 0x29        ; 41
+     d5e:      00 fe           sbrs    r0, 0
+     d60:      fd cf           rjmp    .-6             ; 0xd5c <__vector_11+0x8a>
+                       }
+
+                       static inline void USB_CLK_Unfreeze(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_CLK_Unfreeze(void)
+                       {
+                               USBCON &= ~(1 << FRZCLK);
+     d62:      80 91 d8 00     lds     r24, 0x00D8
+     d66:      8f 7d           andi    r24, 0xDF       ; 223
+     d68:      80 93 d8 00     sts     0x00D8, r24
+                                               USBINT &= ~(1 << IDTI);
+                                               break;
+                                       #endif
+                                       #if defined(USB_CAN_BE_DEVICE)
+                                       case USB_INT_WAKEUPI:
+                                               UDINT  &= ~(1 << WAKEUPI);
+     d6c:      80 91 e1 00     lds     r24, 0x00E1
+     d70:      8f 7e           andi    r24, 0xEF       ; 239
+     d72:      80 93 e1 00     sts     0x00E1, r24
+                                               USBCON &= ~(1 << IDTE);
+                                               break;
+                                       #endif
+                                       #if defined(USB_CAN_BE_DEVICE)
+                                       case USB_INT_WAKEUPI:
+                                               UDIEN  &= ~(1 << WAKEUPE);
+     d76:      80 91 e2 00     lds     r24, 0x00E2
+     d7a:      8f 7e           andi    r24, 0xEF       ; 239
+     d7c:      80 93 e2 00     sts     0x00E2, r24
+                                       #if defined(USB_CAN_BE_DEVICE)
+                                       case USB_INT_WAKEUPI:
+                                               UDIEN  |= (1 << WAKEUPE);
+                                               break;
+                                       case USB_INT_SUSPI:
+                                               UDIEN  |= (1 << SUSPE);
+     d80:      80 91 e2 00     lds     r24, 0x00E2
+     d84:      81 60           ori     r24, 0x01       ; 1
+     d86:      80 93 e2 00     sts     0x00E2, r24
+               USB_INT_Clear(USB_INT_WAKEUPI);
+
+               USB_INT_Disable(USB_INT_WAKEUPI);
+               USB_INT_Enable(USB_INT_SUSPI);
+
+               if (USB_Device_ConfigurationNumber)
+     d8a:      80 91 96 02     lds     r24, 0x0296
+     d8e:      88 23           and     r24, r24
+     d90:      21 f4           brne    .+8             ; 0xd9a <__vector_11+0xc8>
+                       }
+
+                       static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+                       static inline bool USB_Device_IsAddressSet(void)
+                       {
+                               return (UDADDR & (1 << ADDEN));
+     d92:      80 91 e3 00     lds     r24, 0x00E3
+                 USB_DeviceState = DEVICE_STATE_Configured;
+               else
+                 USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered;
+     d96:      87 ff           sbrs    r24, 7
+     d98:      02 c0           rjmp    .+4             ; 0xd9e <__vector_11+0xcc>
+     d9a:      84 e0           ldi     r24, 0x04       ; 4
+     d9c:      01 c0           rjmp    .+2             ; 0xda0 <__vector_11+0xce>
+     d9e:      81 e0           ldi     r24, 0x01       ; 1
+     da0:      8e bb           out     0x1e, r24       ; 30
+
+               #if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT)
+               EVENT_USB_Device_Connect();
+     da2:      fb db           rcall   .-2058          ; 0x59a <EVENT_USB_Device_Connect>
+                                       case USB_INT_WAKEUPI:
+                                               return (UDINT  & (1 << WAKEUPI));
+                                       case USB_INT_SUSPI:
+                                               return (UDINT  & (1 << SUSPI));
+                                       case USB_INT_EORSTI:
+                                               return (UDINT  & (1 << EORSTI));
+     da4:      80 91 e1 00     lds     r24, 0x00E1
+               #else
+               EVENT_USB_Device_WakeUp();
+               #endif
+       }
+
+       if (USB_INT_HasOccurred(USB_INT_EORSTI) && USB_INT_IsEnabled(USB_INT_EORSTI))
+     da8:      83 ff           sbrs    r24, 3
+     daa:      26 c0           rjmp    .+76            ; 0xdf8 <__vector_11+0x126>
+                                       case USB_INT_WAKEUPI:
+                                               return (UDIEN  & (1 << WAKEUPE));
+                                       case USB_INT_SUSPI:
+                                               return (UDIEN  & (1 << SUSPE));
+                                       case USB_INT_EORSTI:
+                                               return (UDIEN  & (1 << EORSTE));
+     dac:      80 91 e2 00     lds     r24, 0x00E2
+     db0:      83 ff           sbrs    r24, 3
+     db2:      22 c0           rjmp    .+68            ; 0xdf8 <__vector_11+0x126>
+                                               break;
+                                       case USB_INT_SUSPI:
+                                               UDINT  &= ~(1 << SUSPI);
+                                               break;
+                                       case USB_INT_EORSTI:
+                                               UDINT  &= ~(1 << EORSTI);
+     db4:      80 91 e1 00     lds     r24, 0x00E1
+     db8:      87 7f           andi    r24, 0xF7       ; 247
+     dba:      80 93 e1 00     sts     0x00E1, r24
+       {
+               USB_INT_Clear(USB_INT_EORSTI);
+
+               USB_DeviceState                = DEVICE_STATE_Default;
+     dbe:      82 e0           ldi     r24, 0x02       ; 2
+     dc0:      8e bb           out     0x1e, r24       ; 30
+               USB_Device_ConfigurationNumber = 0;
+     dc2:      10 92 96 02     sts     0x0296, r1
+                                       #if defined(USB_CAN_BE_DEVICE)
+                                       case USB_INT_WAKEUPI:
+                                               UDINT  &= ~(1 << WAKEUPI);
+                                               break;
+                                       case USB_INT_SUSPI:
+                                               UDINT  &= ~(1 << SUSPI);
+     dc6:      80 91 e1 00     lds     r24, 0x00E1
+     dca:      8e 7f           andi    r24, 0xFE       ; 254
+     dcc:      80 93 e1 00     sts     0x00E1, r24
+                                       #if defined(USB_CAN_BE_DEVICE)
+                                       case USB_INT_WAKEUPI:
+                                               UDIEN  &= ~(1 << WAKEUPE);
+                                               break;
+                                       case USB_INT_SUSPI:
+                                               UDIEN  &= ~(1 << SUSPE);
+     dd0:      80 91 e2 00     lds     r24, 0x00E2
+     dd4:      8e 7f           andi    r24, 0xFE       ; 254
+     dd6:      80 93 e2 00     sts     0x00E2, r24
+                                               USBCON |= (1 << IDTE);
+                                               break;
+                                       #endif
+                                       #if defined(USB_CAN_BE_DEVICE)
+                                       case USB_INT_WAKEUPI:
+                                               UDIEN  |= (1 << WAKEUPE);
+     dda:      80 91 e2 00     lds     r24, 0x00E2
+     dde:      80 61           ori     r24, 0x10       ; 16
+     de0:      80 93 e2 00     sts     0x00E2, r24
+                               uint8_t Number = (Address & ENDPOINT_EPNUM_MASK);
+
+                               if (Number >= ENDPOINT_TOTAL_ENDPOINTS)
+                                 return false;
+
+                               return Endpoint_ConfigureEndpoint_Prv(Number,
+     de4:      80 e0           ldi     r24, 0x00       ; 0
+     de6:      60 e0           ldi     r22, 0x00       ; 0
+     de8:      42 e0           ldi     r20, 0x02       ; 2
+     dea:      5f de           rcall   .-834           ; 0xaaa <Endpoint_ConfigureEndpoint_Prv>
+                                               break;
+                                       case USB_INT_SOFI:
+                                               UDIEN  |= (1 << SOFE);
+                                               break;
+                                       case USB_INT_RXSTPI:
+                                               UEIENX |= (1 << RXSTPE);
+     dec:      80 91 f0 00     lds     r24, 0x00F0
+     df0:      88 60           ori     r24, 0x08       ; 8
+     df2:      80 93 f0 00     sts     0x00F0, r24
+
+               #if defined(INTERRUPT_CONTROL_ENDPOINT)
+               USB_INT_Enable(USB_INT_RXSTPI);
+               #endif
+
+               EVENT_USB_Device_Reset();
+     df6:      ad d1           rcall   .+858           ; 0x1152 <USB_Event_Stub>
+               USB_ResetInterface();
+
+               EVENT_USB_UIDChange();
+       }
+       #endif
+}
+     df8:      ff 91           pop     r31
+     dfa:      ef 91           pop     r30
+     dfc:      bf 91           pop     r27
+     dfe:      af 91           pop     r26
+     e00:      9f 91           pop     r25
+     e02:      8f 91           pop     r24
+     e04:      7f 91           pop     r23
+     e06:      6f 91           pop     r22
+     e08:      5f 91           pop     r21
+     e0a:      4f 91           pop     r20
+     e0c:      3f 91           pop     r19
+     e0e:      2f 91           pop     r18
+     e10:      0f 90           pop     r0
+     e12:      0f be           out     0x3f, r0        ; 63
+     e14:      0f 90           pop     r0
+     e16:      1f 90           pop     r1
+     e18:      18 95           reti
+
+00000e1a <__vector_12>:
+
+#if defined(INTERRUPT_CONTROL_ENDPOINT) && defined(USB_CAN_BE_DEVICE)
+ISR(USB_COM_vect, ISR_BLOCK)
+{
+     e1a:      1f 92           push    r1
+     e1c:      0f 92           push    r0
+     e1e:      0f b6           in      r0, 0x3f        ; 63
+     e20:      0f 92           push    r0
+     e22:      11 24           eor     r1, r1
+     e24:      1f 93           push    r17
+     e26:      2f 93           push    r18
+     e28:      3f 93           push    r19
+     e2a:      4f 93           push    r20
+     e2c:      5f 93           push    r21
+     e2e:      6f 93           push    r22
+     e30:      7f 93           push    r23
+     e32:      8f 93           push    r24
+     e34:      9f 93           push    r25
+     e36:      af 93           push    r26
+     e38:      bf 93           push    r27
+     e3a:      ef 93           push    r30
+     e3c:      ff 93           push    r31
+                        */
+                       static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Endpoint_GetCurrentEndpoint(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       return ((UENUM & ENDPOINT_EPNUM_MASK) | Endpoint_GetEndpointDirection());
+     e3e:      10 91 e9 00     lds     r17, 0x00E9
+     e42:      1f 70           andi    r17, 0x0F       ; 15
+                        *  \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask.
+                        */
+                       static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Endpoint_GetEndpointDirection(void)
+                       {
+                               return (UECFG0X & (1 << EPDIR)) ? ENDPOINT_DIR_IN : ENDPOINT_DIR_OUT;
+     e44:      80 91 ec 00     lds     r24, 0x00EC
+                        */
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UENUM = (Address & ENDPOINT_EPNUM_MASK);
+     e48:      10 92 e9 00     sts     0x00E9, r1
+                                               break;
+                                       case USB_INT_SOFI:
+                                               UDIEN  &= ~(1 << SOFE);
+                                               break;
+                                       case USB_INT_RXSTPI:
+                                               UEIENX &= ~(1 << RXSTPE);
+     e4c:      80 91 f0 00     lds     r24, 0x00F0
+     e50:      87 7f           andi    r24, 0xF7       ; 247
+     e52:      80 93 f0 00     sts     0x00F0, r24
+                       static inline void GlobalInterruptEnable(void)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               sei();
+     e56:      78 94           sei
+       Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
+       USB_INT_Disable(USB_INT_RXSTPI);
+
+       GlobalInterruptEnable();
+
+       USB_Device_ProcessControlRequest();
+     e58:      1b d0           rcall   .+54            ; 0xe90 <USB_Device_ProcessControlRequest>
+     e5a:      10 92 e9 00     sts     0x00E9, r1
+                                               break;
+                                       case USB_INT_SOFI:
+                                               UDIEN  |= (1 << SOFE);
+                                               break;
+                                       case USB_INT_RXSTPI:
+                                               UEIENX |= (1 << RXSTPE);
+     e5e:      80 91 f0 00     lds     r24, 0x00F0
+     e62:      88 60           ori     r24, 0x08       ; 8
+     e64:      80 93 f0 00     sts     0x00F0, r24
+     e68:      10 93 e9 00     sts     0x00E9, r17
+
+       Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
+       USB_INT_Enable(USB_INT_RXSTPI);
+       Endpoint_SelectEndpoint(PrevSelectedEndpoint);
+}
+     e6c:      ff 91           pop     r31
+     e6e:      ef 91           pop     r30
+     e70:      bf 91           pop     r27
+     e72:      af 91           pop     r26
+     e74:      9f 91           pop     r25
+     e76:      8f 91           pop     r24
+     e78:      7f 91           pop     r23
+     e7a:      6f 91           pop     r22
+     e7c:      5f 91           pop     r21
+     e7e:      4f 91           pop     r20
+     e80:      3f 91           pop     r19
+     e82:      2f 91           pop     r18
+     e84:      1f 91           pop     r17
+     e86:      0f 90           pop     r0
+     e88:      0f be           out     0x3f, r0        ; 63
+     e8a:      0f 90           pop     r0
+     e8c:      1f 90           pop     r1
+     e8e:      18 95           reti
+
+00000e90 <USB_Device_ProcessControlRequest>:
+#if !defined(NO_DEVICE_REMOTE_WAKEUP)
+bool    USB_Device_RemoteWakeupEnabled;
+#endif
+
+void USB_Device_ProcessControlRequest(void)
+{
+     e90:      1f 93           push    r17
+     e92:      df 93           push    r29
+     e94:      cf 93           push    r28
+     e96:      cd b7           in      r28, 0x3d       ; 61
+     e98:      de b7           in      r29, 0x3e       ; 62
+     e9a:      ac 97           sbiw    r28, 0x2c       ; 44
+     e9c:      0f b6           in      r0, 0x3f        ; 63
+     e9e:      f8 94           cli
+     ea0:      de bf           out     0x3e, r29       ; 62
+     ea2:      0f be           out     0x3f, r0        ; 63
+     ea4:      cd bf           out     0x3d, r28       ; 61
+       USB_ControlRequest.bRequest      = Endpoint_Read_8();
+       USB_ControlRequest.wValue        = Endpoint_Read_16_LE();
+       USB_ControlRequest.wIndex        = Endpoint_Read_16_LE();
+       USB_ControlRequest.wLength       = Endpoint_Read_16_LE();
+       #else
+       uint8_t* RequestHeader = (uint8_t*)&USB_ControlRequest;
+     ea6:      ea e9           ldi     r30, 0x9A       ; 154
+     ea8:      f2 e0           ldi     r31, 0x02       ; 2
+                        *  \return Next byte in the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline uint8_t Endpoint_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Endpoint_Read_8(void)
+                       {
+                               return UEDATX;
+     eaa:      80 91 f1 00     lds     r24, 0x00F1
+
+       for (uint8_t RequestHeaderByte = 0; RequestHeaderByte < sizeof(USB_Request_Header_t); RequestHeaderByte++)
+         *(RequestHeader++) = Endpoint_Read_8();
+     eae:      81 93           st      Z+, r24
+       USB_ControlRequest.wIndex        = Endpoint_Read_16_LE();
+       USB_ControlRequest.wLength       = Endpoint_Read_16_LE();
+       #else
+       uint8_t* RequestHeader = (uint8_t*)&USB_ControlRequest;
+
+       for (uint8_t RequestHeaderByte = 0; RequestHeaderByte < sizeof(USB_Request_Header_t); RequestHeaderByte++)
+     eb0:      22 e0           ldi     r18, 0x02       ; 2
+     eb2:      e2 3a           cpi     r30, 0xA2       ; 162
+     eb4:      f2 07           cpc     r31, r18
+     eb6:      c9 f7           brne    .-14            ; 0xeaa <USB_Device_ProcessControlRequest+0x1a>
+         *(RequestHeader++) = Endpoint_Read_8();
+       #endif
+
+       EVENT_USB_Device_ControlRequest();
+     eb8:      75 db           rcall   .-2326          ; 0x5a4 <EVENT_USB_Device_ControlRequest>
+                        *  \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsSETUPReceived(void)
+                       {
+                               return ((UEINTX & (1 << RXSTPI)) ? true : false);
+     eba:      80 91 e8 00     lds     r24, 0x00E8
+
+       if (Endpoint_IsSETUPReceived())
+     ebe:      83 ff           sbrs    r24, 3
+     ec0:      30 c1           rjmp    .+608           ; 0x1122 <USB_Device_ProcessControlRequest+0x292>
+       {
+               uint8_t bmRequestType = USB_ControlRequest.bmRequestType;
+     ec2:      80 91 9a 02     lds     r24, 0x029A
+
+               switch (USB_ControlRequest.bRequest)
+     ec6:      20 91 9b 02     lds     r18, 0x029B
+     eca:      25 30           cpi     r18, 0x05       ; 5
+     ecc:      09 f4           brne    .+2             ; 0xed0 <USB_Device_ProcessControlRequest+0x40>
+     ece:      84 c0           rjmp    .+264           ; 0xfd8 <USB_Device_ProcessControlRequest+0x148>
+     ed0:      26 30           cpi     r18, 0x06       ; 6
+     ed2:      40 f4           brcc    .+16            ; 0xee4 <USB_Device_ProcessControlRequest+0x54>
+     ed4:      21 30           cpi     r18, 0x01       ; 1
+     ed6:      a1 f1           breq    .+104           ; 0xf40 <USB_Device_ProcessControlRequest+0xb0>
+     ed8:      21 30           cpi     r18, 0x01       ; 1
+     eda:      70 f0           brcs    .+28            ; 0xef8 <USB_Device_ProcessControlRequest+0x68>
+     edc:      23 30           cpi     r18, 0x03       ; 3
+     ede:      09 f0           breq    .+2             ; 0xee2 <USB_Device_ProcessControlRequest+0x52>
+     ee0:      20 c1           rjmp    .+576           ; 0x1122 <USB_Device_ProcessControlRequest+0x292>
+     ee2:      2e c0           rjmp    .+92            ; 0xf40 <USB_Device_ProcessControlRequest+0xb0>
+     ee4:      28 30           cpi     r18, 0x08       ; 8
+     ee6:      09 f4           brne    .+2             ; 0xeea <USB_Device_ProcessControlRequest+0x5a>
+     ee8:      ef c0           rjmp    .+478           ; 0x10c8 <USB_Device_ProcessControlRequest+0x238>
+     eea:      29 30           cpi     r18, 0x09       ; 9
+     eec:      09 f4           brne    .+2             ; 0xef0 <USB_Device_ProcessControlRequest+0x60>
+     eee:      fe c0           rjmp    .+508           ; 0x10ec <USB_Device_ProcessControlRequest+0x25c>
+     ef0:      26 30           cpi     r18, 0x06       ; 6
+     ef2:      09 f0           breq    .+2             ; 0xef6 <USB_Device_ProcessControlRequest+0x66>
+     ef4:      16 c1           rjmp    .+556           ; 0x1122 <USB_Device_ProcessControlRequest+0x292>
+     ef6:      92 c0           rjmp    .+292           ; 0x101c <USB_Device_ProcessControlRequest+0x18c>
+               {
+                       case REQ_GetStatus:
+                               if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) ||
+     ef8:      80 38           cpi     r24, 0x80       ; 128
+     efa:      21 f0           breq    .+8             ; 0xf04 <USB_Device_ProcessControlRequest+0x74>
+     efc:      82 38           cpi     r24, 0x82       ; 130
+     efe:      09 f0           breq    .+2             ; 0xf02 <USB_Device_ProcessControlRequest+0x72>
+     f00:      10 c1           rjmp    .+544           ; 0x1122 <USB_Device_ProcessControlRequest+0x292>
+     f02:      08 c0           rjmp    .+16            ; 0xf14 <USB_Device_ProcessControlRequest+0x84>
+       Endpoint_ClearOUT();
+}
+
+static void USB_Device_GetStatus(void)
+{
+       uint8_t CurrentStatus = 0;
+     f04:      80 91 97 02     lds     r24, 0x0297
+                       if (USB_Device_CurrentlySelfPowered)
+                         CurrentStatus |= FEATURE_SELFPOWERED_ENABLED;
+                       #endif
+
+                       #if !defined(NO_DEVICE_REMOTE_WAKEUP)
+                       if (USB_Device_RemoteWakeupEnabled)
+     f08:      90 91 98 02     lds     r25, 0x0298
+     f0c:      99 23           and     r25, r25
+     f0e:      71 f0           breq    .+28            ; 0xf2c <USB_Device_ProcessControlRequest+0x9c>
+                         CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED;
+     f10:      82 60           ori     r24, 0x02       ; 2
+     f12:      0c c0           rjmp    .+24            ; 0xf2c <USB_Device_ProcessControlRequest+0x9c>
+                        */
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UENUM = (Address & ENDPOINT_EPNUM_MASK);
+     f14:      80 91 9e 02     lds     r24, 0x029E
+     f18:      8f 70           andi    r24, 0x0F       ; 15
+     f1a:      80 93 e9 00     sts     0x00E9, r24
+                        *  \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsStalled(void)
+                       {
+                               return ((UECONX & (1 << STALLRQ)) ? true : false);
+     f1e:      90 91 eb 00     lds     r25, 0x00EB
+                       break;
+               case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT):
+                       #if !defined(CONTROL_ONLY_DEVICE)
+                       Endpoint_SelectEndpoint((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK);
+
+                       CurrentStatus = Endpoint_IsStalled();
+     f22:      81 e0           ldi     r24, 0x01       ; 1
+     f24:      95 ff           sbrs    r25, 5
+     f26:      80 e0           ldi     r24, 0x00       ; 0
+                        */
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UENUM = (Address & ENDPOINT_EPNUM_MASK);
+     f28:      10 92 e9 00     sts     0x00E9, r1
+                        *  \note This is not applicable for non CONTROL type endpoints.
+                        */
+                       static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearSETUP(void)
+                       {
+                               UEINTX &= ~(1 << RXSTPI);
+     f2c:      90 91 e8 00     lds     r25, 0x00E8
+     f30:      97 7f           andi    r25, 0xF7       ; 247
+     f32:      90 93 e8 00     sts     0x00E8, r25
+                        *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline void Endpoint_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_Write_16_LE(const uint16_t Data)
+                       {
+                               UEDATX = (Data & 0xFF);
+     f36:      80 93 f1 00     sts     0x00F1, r24
+                               UEDATX = (Data >> 8);
+     f3a:      10 92 f1 00     sts     0x00F1, r1
+     f3e:      cf c0           rjmp    .+414           ; 0x10de <USB_Device_ProcessControlRequest+0x24e>
+                               }
+
+                               break;
+                       case REQ_ClearFeature:
+                       case REQ_SetFeature:
+                               if ((bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) ||
+     f40:      88 23           and     r24, r24
+     f42:      19 f0           breq    .+6             ; 0xf4a <USB_Device_ProcessControlRequest+0xba>
+     f44:      82 30           cpi     r24, 0x02       ; 2
+     f46:      09 f0           breq    .+2             ; 0xf4a <USB_Device_ProcessControlRequest+0xba>
+     f48:      ec c0           rjmp    .+472           ; 0x1122 <USB_Device_ProcessControlRequest+0x292>
+       Endpoint_ClearStatusStage();
+}
+
+static void USB_Device_ClearSetFeature(void)
+{
+       switch (USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT)
+     f4a:      90 e0           ldi     r25, 0x00       ; 0
+     f4c:      8f 71           andi    r24, 0x1F       ; 31
+     f4e:      90 70           andi    r25, 0x00       ; 0
+     f50:      00 97           sbiw    r24, 0x00       ; 0
+     f52:      29 f0           breq    .+10            ; 0xf5e <USB_Device_ProcessControlRequest+0xce>
+     f54:      82 30           cpi     r24, 0x02       ; 2
+     f56:      91 05           cpc     r25, r1
+     f58:      09 f0           breq    .+2             ; 0xf5c <USB_Device_ProcessControlRequest+0xcc>
+     f5a:      e3 c0           rjmp    .+454           ; 0x1122 <USB_Device_ProcessControlRequest+0x292>
+     f5c:      0b c0           rjmp    .+22            ; 0xf74 <USB_Device_ProcessControlRequest+0xe4>
+       {
+               #if !defined(NO_DEVICE_REMOTE_WAKEUP)
+               case REQREC_DEVICE:
+                       if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_DeviceRemoteWakeup)
+     f5e:      80 91 9c 02     lds     r24, 0x029C
+     f62:      81 30           cpi     r24, 0x01       ; 1
+     f64:      09 f0           breq    .+2             ; 0xf68 <USB_Device_ProcessControlRequest+0xd8>
+     f66:      dd c0           rjmp    .+442           ; 0x1122 <USB_Device_ProcessControlRequest+0x292>
+                         USB_Device_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature);
+     f68:      23 30           cpi     r18, 0x03       ; 3
+     f6a:      09 f0           breq    .+2             ; 0xf6e <USB_Device_ProcessControlRequest+0xde>
+     f6c:      80 e0           ldi     r24, 0x00       ; 0
+     f6e:      80 93 98 02     sts     0x0298, r24
+     f72:      2c c0           rjmp    .+88            ; 0xfcc <USB_Device_ProcessControlRequest+0x13c>
+
+                       break;
+               #endif
+               #if !defined(CONTROL_ONLY_DEVICE)
+               case REQREC_ENDPOINT:
+                       if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_EndpointHalt)
+     f74:      80 91 9c 02     lds     r24, 0x029C
+     f78:      88 23           and     r24, r24
+     f7a:      41 f5           brne    .+80            ; 0xfcc <USB_Device_ProcessControlRequest+0x13c>
+                       {
+                               uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK);
+     f7c:      20 91 9e 02     lds     r18, 0x029E
+     f80:      2f 70           andi    r18, 0x0F       ; 15
+
+                               if (EndpointIndex == ENDPOINT_CONTROLEP)
+     f82:      09 f4           brne    .+2             ; 0xf86 <USB_Device_ProcessControlRequest+0xf6>
+     f84:      ce c0           rjmp    .+412           ; 0x1122 <USB_Device_ProcessControlRequest+0x292>
+                        */
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UENUM = (Address & ENDPOINT_EPNUM_MASK);
+     f86:      20 93 e9 00     sts     0x00E9, r18
+                        * \return Boolean \c true if the currently selected endpoint is enabled, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsEnabled(void)
+                       {
+                               return ((UECONX & (1 << EPEN)) ? true : false);
+     f8a:      80 91 eb 00     lds     r24, 0x00EB
+                                 return;
+
+                               Endpoint_SelectEndpoint(EndpointIndex);
+
+                               if (Endpoint_IsEnabled())
+     f8e:      80 ff           sbrs    r24, 0
+     f90:      1d c0           rjmp    .+58            ; 0xfcc <USB_Device_ProcessControlRequest+0x13c>
+                               {
+                                       if (USB_ControlRequest.bRequest == REQ_SetFeature)
+     f92:      80 91 9b 02     lds     r24, 0x029B
+     f96:      83 30           cpi     r24, 0x03       ; 3
+     f98:      21 f4           brne    .+8             ; 0xfa2 <USB_Device_ProcessControlRequest+0x112>
+                        *  \ingroup Group_EndpointPacketManagement_AVR8
+                        */
+                       static inline void Endpoint_StallTransaction(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_StallTransaction(void)
+                       {
+                               UECONX |= (1 << STALLRQ);
+     f9a:      80 91 eb 00     lds     r24, 0x00EB
+     f9e:      80 62           ori     r24, 0x20       ; 32
+     fa0:      13 c0           rjmp    .+38            ; 0xfc8 <USB_Device_ProcessControlRequest+0x138>
+                        *  \ingroup Group_EndpointPacketManagement_AVR8
+                        */
+                       static inline void Endpoint_ClearStall(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearStall(void)
+                       {
+                               UECONX |= (1 << STALLRQC);
+     fa2:      80 91 eb 00     lds     r24, 0x00EB
+     fa6:      80 61           ori     r24, 0x10       ; 16
+     fa8:      80 93 eb 00     sts     0x00EB, r24
+                        *  \param[in] Address  Endpoint address whose FIFO buffers are to be reset.
+                        */
+                       static inline void Endpoint_ResetEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ResetEndpoint(const uint8_t Address)
+                       {
+                               UERST = (1 << (Address & ENDPOINT_EPNUM_MASK));
+     fac:      81 e0           ldi     r24, 0x01       ; 1
+     fae:      90 e0           ldi     r25, 0x00       ; 0
+     fb0:      02 c0           rjmp    .+4             ; 0xfb6 <USB_Device_ProcessControlRequest+0x126>
+     fb2:      88 0f           add     r24, r24
+     fb4:      99 1f           adc     r25, r25
+     fb6:      2a 95           dec     r18
+     fb8:      e2 f7           brpl    .-8             ; 0xfb2 <USB_Device_ProcessControlRequest+0x122>
+     fba:      80 93 ea 00     sts     0x00EA, r24
+                               UERST = 0;
+     fbe:      10 92 ea 00     sts     0x00EA, r1
+
+                       /** Resets the data toggle of the currently selected endpoint. */
+                       static inline void Endpoint_ResetDataToggle(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ResetDataToggle(void)
+                       {
+                               UECONX |= (1 << RSTDT);
+     fc2:      80 91 eb 00     lds     r24, 0x00EB
+     fc6:      88 60           ori     r24, 0x08       ; 8
+     fc8:      80 93 eb 00     sts     0x00EB, r24
+                        */
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UENUM = (Address & ENDPOINT_EPNUM_MASK);
+     fcc:      10 92 e9 00     sts     0x00E9, r1
+                        *  \note This is not applicable for non CONTROL type endpoints.
+                        */
+                       static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearSETUP(void)
+                       {
+                               UEINTX &= ~(1 << RXSTPI);
+     fd0:      80 91 e8 00     lds     r24, 0x00E8
+     fd4:      87 7f           andi    r24, 0xF7       ; 247
+     fd6:      86 c0           rjmp    .+268           ; 0x10e4 <USB_Device_ProcessControlRequest+0x254>
+                                       USB_Device_ClearSetFeature();
+                               }
+
+                               break;
+                       case REQ_SetAddress:
+                               if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE))
+     fd8:      88 23           and     r24, r24
+     fda:      09 f0           breq    .+2             ; 0xfde <USB_Device_ProcessControlRequest+0x14e>
+     fdc:      a2 c0           rjmp    .+324           ; 0x1122 <USB_Device_ProcessControlRequest+0x292>
+       }
+}
+
+static void USB_Device_SetAddress(void)
+{
+       uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F);
+     fde:      10 91 9c 02     lds     r17, 0x029C
+     fe2:      1f 77           andi    r17, 0x7F       ; 127
+                       #endif
+
+                       static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Device_SetDeviceAddress(const uint8_t Address)
+                       {
+                               UDADDR = (UDADDR & (1 << ADDEN)) | (Address & 0x7F);
+     fe4:      80 91 e3 00     lds     r24, 0x00E3
+     fe8:      80 78           andi    r24, 0x80       ; 128
+     fea:      81 2b           or      r24, r17
+     fec:      80 93 e3 00     sts     0x00E3, r24
+     ff0:      80 91 e8 00     lds     r24, 0x00E8
+     ff4:      87 7f           andi    r24, 0xF7       ; 247
+     ff6:      80 93 e8 00     sts     0x00E8, r24
+
+       USB_Device_SetDeviceAddress(DeviceAddress);
+
+       Endpoint_ClearSETUP();
+
+       Endpoint_ClearStatusStage();
+     ffa:      d2 dd           rcall   .-1116          ; 0xba0 <Endpoint_ClearStatusStage>
+                        *  \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsINReady(void)
+                       {
+                               return ((UEINTX & (1 << TXINI)) ? true : false);
+     ffc:      80 91 e8 00     lds     r24, 0x00E8
+
+       while (!(Endpoint_IsINReady()));
+    1000:      80 ff           sbrs    r24, 0
+    1002:      fc cf           rjmp    .-8             ; 0xffc <USB_Device_ProcessControlRequest+0x16c>
+                       static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Device_EnableDeviceAddress(const uint8_t Address)
+                       {
+                               (void)Address;
+                               
+                               UDADDR |= (1 << ADDEN);
+    1004:      80 91 e3 00     lds     r24, 0x00E3
+    1008:      80 68           ori     r24, 0x80       ; 128
+    100a:      80 93 e3 00     sts     0x00E3, r24
+
+       USB_Device_EnableDeviceAddress(DeviceAddress);
+
+       USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default;
+    100e:      11 23           and     r17, r17
+    1010:      11 f0           breq    .+4             ; 0x1016 <USB_Device_ProcessControlRequest+0x186>
+    1012:      83 e0           ldi     r24, 0x03       ; 3
+    1014:      01 c0           rjmp    .+2             ; 0x1018 <USB_Device_ProcessControlRequest+0x188>
+    1016:      82 e0           ldi     r24, 0x02       ; 2
+    1018:      8e bb           out     0x1e, r24       ; 30
+    101a:      83 c0           rjmp    .+262           ; 0x1122 <USB_Device_ProcessControlRequest+0x292>
+                               if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE))
+                                 USB_Device_SetAddress();
+
+                               break;
+                       case REQ_GetDescriptor:
+                               if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) ||
+    101c:      80 58           subi    r24, 0x80       ; 128
+    101e:      82 30           cpi     r24, 0x02       ; 2
+    1020:      08 f0           brcs    .+2             ; 0x1024 <USB_Device_ProcessControlRequest+0x194>
+    1022:      7f c0           rjmp    .+254           ; 0x1122 <USB_Device_ProcessControlRequest+0x292>
+           !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS))
+       uint8_t DescriptorAddressSpace;
+       #endif
+
+       #if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
+       if (USB_ControlRequest.wValue == ((DTYPE_String << 8) | USE_INTERNAL_SERIAL))
+    1024:      80 91 9c 02     lds     r24, 0x029C
+    1028:      90 91 9d 02     lds     r25, 0x029D
+    102c:      23 e0           ldi     r18, 0x03       ; 3
+    102e:      8c 3d           cpi     r24, 0xDC       ; 220
+    1030:      92 07           cpc     r25, r18
+    1032:      91 f5           brne    .+100           ; 0x1098 <USB_Device_ProcessControlRequest+0x208>
+       {
+               USB_Descriptor_Header_t Header;
+               uint16_t                UnicodeString[INTERNAL_SERIAL_LENGTH_BITS / 4];
+       } SignatureDescriptor;
+
+       SignatureDescriptor.Header.Type = DTYPE_String;
+    1034:      83 e0           ldi     r24, 0x03       ; 3
+    1036:      8c 83           std     Y+4, r24        ; 0x04
+       SignatureDescriptor.Header.Size = USB_STRING_LEN(INTERNAL_SERIAL_LENGTH_BITS / 4);
+    1038:      8a e2           ldi     r24, 0x2A       ; 42
+    103a:      8b 83           std     Y+3, r24        ; 0x03
+                       static inline uint_reg_t GetGlobalInterruptMask(void)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               return SREG;
+    103c:      5f b7           in      r21, 0x3f       ; 63
+                       static inline void GlobalInterruptDisable(void)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               cli();
+    103e:      f8 94           cli
+                               __builtin_ssrf(AVR32_SR_GM_OFFSET);
+                               #elif (ARCH == ARCH_XMEGA)
+                               cli();
+                               #endif
+
+                               GCC_MEMORY_BARRIER();
+    1040:      de 01           movw    r26, r28
+    1042:      15 96           adiw    r26, 0x05       ; 5
+    1044:      80 e0           ldi     r24, 0x00       ; 0
+    1046:      90 e0           ldi     r25, 0x00       ; 0
+                       static inline void USB_Device_GetSerialString(uint16_t* const UnicodeString)
+                       {
+                               uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+                               GlobalInterruptDisable();
+
+                               uint8_t SigReadAddress = INTERNAL_SERIAL_START_ADDRESS;
+    1048:      4e e0           ldi     r20, 0x0E       ; 14
+
+                               for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++)
+                               {
+                                       uint8_t SerialByte = boot_signature_byte_get(SigReadAddress);
+    104a:      61 e2           ldi     r22, 0x21       ; 33
+    104c:      e4 2f           mov     r30, r20
+    104e:      f0 e0           ldi     r31, 0x00       ; 0
+    1050:      60 93 57 00     sts     0x0057, r22
+    1054:      e4 91           lpm     r30, Z+
+
+                                       if (SerialCharNum & 0x01)
+    1056:      80 ff           sbrs    r24, 0
+    1058:      03 c0           rjmp    .+6             ; 0x1060 <USB_Device_ProcessControlRequest+0x1d0>
+                                       {
+                                               SerialByte >>= 4;
+    105a:      e2 95           swap    r30
+    105c:      ef 70           andi    r30, 0x0F       ; 15
+                                               SigReadAddress++;
+    105e:      4f 5f           subi    r20, 0xFF       ; 255
+                                       }
+
+                                       SerialByte &= 0x0F;
+    1060:      ef 70           andi    r30, 0x0F       ; 15
+    1062:      2e 2f           mov     r18, r30
+    1064:      30 e0           ldi     r19, 0x00       ; 0
+
+                                       UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ?
+    1066:      ea 30           cpi     r30, 0x0A       ; 10
+    1068:      18 f0           brcs    .+6             ; 0x1070 <USB_Device_ProcessControlRequest+0x1e0>
+    106a:      29 5c           subi    r18, 0xC9       ; 201
+    106c:      3f 4f           sbci    r19, 0xFF       ; 255
+    106e:      02 c0           rjmp    .+4             ; 0x1074 <USB_Device_ProcessControlRequest+0x1e4>
+    1070:      20 5d           subi    r18, 0xD0       ; 208
+    1072:      3f 4f           sbci    r19, 0xFF       ; 255
+    1074:      2d 93           st      X+, r18
+    1076:      3d 93           st      X+, r19
+    1078:      01 96           adiw    r24, 0x01       ; 1
+                               uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+                               GlobalInterruptDisable();
+
+                               uint8_t SigReadAddress = INTERNAL_SERIAL_START_ADDRESS;
+
+                               for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++)
+    107a:      84 31           cpi     r24, 0x14       ; 20
+    107c:      91 05           cpc     r25, r1
+    107e:      31 f7           brne    .-52            ; 0x104c <USB_Device_ProcessControlRequest+0x1bc>
+                       static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState)
+                       {
+                               GCC_MEMORY_BARRIER();
+
+                               #if (ARCH == ARCH_AVR8)
+                               SREG = GlobalIntState;
+    1080:      5f bf           out     0x3f, r21       ; 63
+                        *  \note This is not applicable for non CONTROL type endpoints.
+                        */
+                       static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearSETUP(void)
+                       {
+                               UEINTX &= ~(1 << RXSTPI);
+    1082:      80 91 e8 00     lds     r24, 0x00E8
+    1086:      87 7f           andi    r24, 0xF7       ; 247
+    1088:      80 93 e8 00     sts     0x00E8, r24
+
+       USB_Device_GetSerialString(SignatureDescriptor.UnicodeString);
+
+       Endpoint_ClearSETUP();
+
+       Endpoint_Write_Control_Stream_LE(&SignatureDescriptor, sizeof(SignatureDescriptor));
+    108c:      ce 01           movw    r24, r28
+    108e:      03 96           adiw    r24, 0x03       ; 3
+    1090:      6a e2           ldi     r22, 0x2A       ; 42
+    1092:      70 e0           ldi     r23, 0x00       ; 0
+    1094:      55 dc           rcall   .-1878          ; 0x940 <Endpoint_Write_Control_Stream_LE>
+    1096:      12 c0           rjmp    .+36            ; 0x10bc <USB_Device_ProcessControlRequest+0x22c>
+               USB_Device_GetInternalSerialDescriptor();
+               return;
+       }
+       #endif
+
+       if ((DescriptorSize = CALLBACK_USB_GetDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex,
+    1098:      60 91 9e 02     lds     r22, 0x029E
+    109c:      ae 01           movw    r20, r28
+    109e:      4f 5f           subi    r20, 0xFF       ; 255
+    10a0:      5f 4f           sbci    r21, 0xFF       ; 255
+    10a2:      21 dc           rcall   .-1982          ; 0x8e6 <CALLBACK_USB_GetDescriptor>
+    10a4:      bc 01           movw    r22, r24
+    10a6:      00 97           sbiw    r24, 0x00       ; 0
+    10a8:      09 f4           brne    .+2             ; 0x10ac <USB_Device_ProcessControlRequest+0x21c>
+    10aa:      3b c0           rjmp    .+118           ; 0x1122 <USB_Device_ProcessControlRequest+0x292>
+    10ac:      80 91 e8 00     lds     r24, 0x00E8
+    10b0:      87 7f           andi    r24, 0xF7       ; 247
+    10b2:      80 93 e8 00     sts     0x00E8, r24
+       #if defined(USE_RAM_DESCRIPTORS) || !defined(ARCH_HAS_MULTI_ADDRESS_SPACE)
+       Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize);
+       #elif defined(USE_EEPROM_DESCRIPTORS)
+       Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize);
+       #elif defined(USE_FLASH_DESCRIPTORS)
+       Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize);
+    10b6:      89 81           ldd     r24, Y+1        ; 0x01
+    10b8:      9a 81           ldd     r25, Y+2        ; 0x02
+    10ba:      9c dc           rcall   .-1736          ; 0x9f4 <Endpoint_Write_Control_PStream_LE>
+                        */
+                       static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearOUT(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UEINTX &= ~((1 << RXOUTI) | (1 << FIFOCON));
+    10bc:      80 91 e8 00     lds     r24, 0x00E8
+    10c0:      8b 77           andi    r24, 0x7B       ; 123
+    10c2:      80 93 e8 00     sts     0x00E8, r24
+    10c6:      2d c0           rjmp    .+90            ; 0x1122 <USB_Device_ProcessControlRequest+0x292>
+                                       USB_Device_GetDescriptor();
+                               }
+
+                               break;
+                       case REQ_GetConfiguration:
+                               if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE))
+    10c8:      80 38           cpi     r24, 0x80       ; 128
+    10ca:      59 f5           brne    .+86            ; 0x1122 <USB_Device_ProcessControlRequest+0x292>
+                        *  \note This is not applicable for non CONTROL type endpoints.
+                        */
+                       static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearSETUP(void)
+                       {
+                               UEINTX &= ~(1 << RXSTPI);
+    10cc:      80 91 e8 00     lds     r24, 0x00E8
+    10d0:      87 7f           andi    r24, 0xF7       ; 247
+    10d2:      80 93 e8 00     sts     0x00E8, r24
+
+static void USB_Device_GetConfiguration(void)
+{
+       Endpoint_ClearSETUP();
+
+       Endpoint_Write_8(USB_Device_ConfigurationNumber);
+    10d6:      80 91 96 02     lds     r24, 0x0296
+                        *  \param[in] Data  Data to write into the the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_Write_8(const uint8_t Data)
+                       {
+                               UEDATX = Data;
+    10da:      80 93 f1 00     sts     0x00F1, r24
+                        */
+                       static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearIN(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UEINTX &= ~((1 << TXINI) | (1 << FIFOCON));
+    10de:      80 91 e8 00     lds     r24, 0x00E8
+    10e2:      8e 77           andi    r24, 0x7E       ; 126
+    10e4:      80 93 e8 00     sts     0x00E8, r24
+       Endpoint_ClearIN();
+
+       Endpoint_ClearStatusStage();
+    10e8:      5b dd           rcall   .-1354          ; 0xba0 <Endpoint_ClearStatusStage>
+    10ea:      1b c0           rjmp    .+54            ; 0x1122 <USB_Device_ProcessControlRequest+0x292>
+                               if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE))
+                                 USB_Device_GetConfiguration();
+
+                               break;
+                       case REQ_SetConfiguration:
+                               if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE))
+    10ec:      88 23           and     r24, r24
+    10ee:      c9 f4           brne    .+50            ; 0x1122 <USB_Device_ProcessControlRequest+0x292>
+}
+
+static void USB_Device_SetConfiguration(void)
+{
+       #if defined(FIXED_NUM_CONFIGURATIONS)
+       if ((uint8_t)USB_ControlRequest.wValue > FIXED_NUM_CONFIGURATIONS)
+    10f0:      90 91 9c 02     lds     r25, 0x029C
+    10f4:      92 30           cpi     r25, 0x02       ; 2
+    10f6:      a8 f4           brcc    .+42            ; 0x1122 <USB_Device_ProcessControlRequest+0x292>
+                        *  \note This is not applicable for non CONTROL type endpoints.
+                        */
+                       static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearSETUP(void)
+                       {
+                               UEINTX &= ~(1 << RXSTPI);
+    10f8:      80 91 e8 00     lds     r24, 0x00E8
+    10fc:      87 7f           andi    r24, 0xF7       ; 247
+    10fe:      80 93 e8 00     sts     0x00E8, r24
+       #endif
+       #endif
+
+       Endpoint_ClearSETUP();
+
+       USB_Device_ConfigurationNumber = (uint8_t)USB_ControlRequest.wValue;
+    1102:      90 93 96 02     sts     0x0296, r25
+
+       Endpoint_ClearStatusStage();
+    1106:      4c dd           rcall   .-1384          ; 0xba0 <Endpoint_ClearStatusStage>
+
+       if (USB_Device_ConfigurationNumber)
+    1108:      80 91 96 02     lds     r24, 0x0296
+    110c:      88 23           and     r24, r24
+    110e:      21 f4           brne    .+8             ; 0x1118 <USB_Device_ProcessControlRequest+0x288>
+                       }
+
+                       static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+                       static inline bool USB_Device_IsAddressSet(void)
+                       {
+                               return (UDADDR & (1 << ADDEN));
+    1110:      80 91 e3 00     lds     r24, 0x00E3
+         USB_DeviceState = DEVICE_STATE_Configured;
+       else
+         USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered;
+    1114:      87 ff           sbrs    r24, 7
+    1116:      02 c0           rjmp    .+4             ; 0x111c <USB_Device_ProcessControlRequest+0x28c>
+    1118:      84 e0           ldi     r24, 0x04       ; 4
+    111a:      01 c0           rjmp    .+2             ; 0x111e <USB_Device_ProcessControlRequest+0x28e>
+    111c:      81 e0           ldi     r24, 0x01       ; 1
+    111e:      8e bb           out     0x1e, r24       ; 30
+
+       EVENT_USB_Device_ConfigurationChanged();
+    1120:      3e da           rcall   .-2948          ; 0x59e <EVENT_USB_Device_ConfigurationChanged>
+                        *  \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsSETUPReceived(void)
+                       {
+                               return ((UEINTX & (1 << RXSTPI)) ? true : false);
+    1122:      80 91 e8 00     lds     r24, 0x00E8
+                       default:
+                               break;
+               }
+       }
+
+       if (Endpoint_IsSETUPReceived())
+    1126:      83 ff           sbrs    r24, 3
+    1128:      0a c0           rjmp    .+20            ; 0x113e <USB_Device_ProcessControlRequest+0x2ae>
+                        *  \note This is not applicable for non CONTROL type endpoints.
+                        */
+                       static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearSETUP(void)
+                       {
+                               UEINTX &= ~(1 << RXSTPI);
+    112a:      80 91 e8 00     lds     r24, 0x00E8
+    112e:      87 7f           andi    r24, 0xF7       ; 247
+    1130:      80 93 e8 00     sts     0x00E8, r24
+                        *  \ingroup Group_EndpointPacketManagement_AVR8
+                        */
+                       static inline void Endpoint_StallTransaction(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_StallTransaction(void)
+                       {
+                               UECONX |= (1 << STALLRQ);
+    1134:      80 91 eb 00     lds     r24, 0x00EB
+    1138:      80 62           ori     r24, 0x20       ; 32
+    113a:      80 93 eb 00     sts     0x00EB, r24
+       {
+               Endpoint_ClearSETUP();
+               Endpoint_StallTransaction();
+       }
+}
+    113e:      ac 96           adiw    r28, 0x2c       ; 44
+    1140:      0f b6           in      r0, 0x3f        ; 63
+    1142:      f8 94           cli
+    1144:      de bf           out     0x3e, r29       ; 62
+    1146:      0f be           out     0x3f, r0        ; 63
+    1148:      cd bf           out     0x3d, r28       ; 61
+    114a:      cf 91           pop     r28
+    114c:      df 91           pop     r29
+    114e:      1f 91           pop     r17
+    1150:      08 95           ret
+
+00001152 <USB_Event_Stub>:
+#include "Events.h"
+
+void USB_Event_Stub(void)
+{
+
+}
+    1152:      08 95           ret
+
+00001154 <USB_USBTask>:
+#if defined(USB_CAN_BE_DEVICE) && !defined(DEVICE_STATE_AS_GPIOR)
+volatile uint8_t     USB_DeviceState;
+#endif
+
+void USB_USBTask(void)
+{
+    1154:      1f 93           push    r17
+}
+
+#if defined(USB_CAN_BE_DEVICE)
+static void USB_DeviceTask(void)
+{
+       if (USB_DeviceState == DEVICE_STATE_Unattached)
+    1156:      8e b3           in      r24, 0x1e       ; 30
+    1158:      88 23           and     r24, r24
+    115a:      a9 f0           breq    .+42            ; 0x1186 <USB_USBTask+0x32>
+                        */
+                       static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Endpoint_GetCurrentEndpoint(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       return ((UENUM & ENDPOINT_EPNUM_MASK) | Endpoint_GetEndpointDirection());
+    115c:      80 91 e9 00     lds     r24, 0x00E9
+    1160:      8f 70           andi    r24, 0x0F       ; 15
+                        *  \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask.
+                        */
+                       static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Endpoint_GetEndpointDirection(void)
+                       {
+                               return (UECFG0X & (1 << EPDIR)) ? ENDPOINT_DIR_IN : ENDPOINT_DIR_OUT;
+    1162:      90 91 ec 00     lds     r25, 0x00EC
+    1166:      90 ff           sbrs    r25, 0
+    1168:      02 c0           rjmp    .+4             ; 0x116e <USB_USBTask+0x1a>
+    116a:      10 e8           ldi     r17, 0x80       ; 128
+    116c:      01 c0           rjmp    .+2             ; 0x1170 <USB_USBTask+0x1c>
+    116e:      10 e0           ldi     r17, 0x00       ; 0
+                        */
+                       static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Endpoint_GetCurrentEndpoint(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       return ((UENUM & ENDPOINT_EPNUM_MASK) | Endpoint_GetEndpointDirection());
+    1170:      18 2b           or      r17, r24
+                        */
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UENUM = (Address & ENDPOINT_EPNUM_MASK);
+    1172:      10 92 e9 00     sts     0x00E9, r1
+                        *  \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsSETUPReceived(void)
+                       {
+                               return ((UEINTX & (1 << RXSTPI)) ? true : false);
+    1176:      80 91 e8 00     lds     r24, 0x00E8
+
+       uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint();
+
+       Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
+
+       if (Endpoint_IsSETUPReceived())
+    117a:      83 ff           sbrs    r24, 3
+    117c:      01 c0           rjmp    .+2             ; 0x1180 <USB_USBTask+0x2c>
+         USB_Device_ProcessControlRequest();
+    117e:      88 de           rcall   .-752           ; 0xe90 <USB_Device_ProcessControlRequest>
+                        */
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UENUM = (Address & ENDPOINT_EPNUM_MASK);
+    1180:      1f 70           andi    r17, 0x0F       ; 15
+    1182:      10 93 e9 00     sts     0x00E9, r17
+       #elif defined(USB_CAN_BE_HOST)
+               USB_HostTask();
+       #elif defined(USB_CAN_BE_DEVICE)
+               USB_DeviceTask();
+       #endif
+}
+    1186:      1f 91           pop     r17
+    1188:      08 95           ret
+
+0000118a <CDC_Device_ProcessControlRequest>:
+#define  __INCLUDE_FROM_CDC_DRIVER
+#define  __INCLUDE_FROM_CDC_DEVICE_C
+#include "CDCClassDevice.h"
+
+void CDC_Device_ProcessControlRequest(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+{
+    118a:      cf 93           push    r28
+    118c:      df 93           push    r29
+    118e:      ec 01           movw    r28, r24
+                        *  \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsSETUPReceived(void)
+                       {
+                               return ((UEINTX & (1 << RXSTPI)) ? true : false);
+    1190:      80 91 e8 00     lds     r24, 0x00E8
+       if (!(Endpoint_IsSETUPReceived()))
+    1194:      83 ff           sbrs    r24, 3
+    1196:      a2 c0           rjmp    .+324           ; 0x12dc <CDC_Device_ProcessControlRequest+0x152>
+         return;
+
+       if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber)
+    1198:      88 81           ld      r24, Y
+    119a:      90 e0           ldi     r25, 0x00       ; 0
+    119c:      20 91 9e 02     lds     r18, 0x029E
+    11a0:      30 91 9f 02     lds     r19, 0x029F
+    11a4:      28 17           cp      r18, r24
+    11a6:      39 07           cpc     r19, r25
+    11a8:      09 f0           breq    .+2             ; 0x11ac <CDC_Device_ProcessControlRequest+0x22>
+    11aa:      98 c0           rjmp    .+304           ; 0x12dc <CDC_Device_ProcessControlRequest+0x152>
+         return;
+
+       switch (USB_ControlRequest.bRequest)
+    11ac:      80 91 9b 02     lds     r24, 0x029B
+    11b0:      81 32           cpi     r24, 0x21       ; 33
+    11b2:      69 f0           breq    .+26            ; 0x11ce <CDC_Device_ProcessControlRequest+0x44>
+    11b4:      82 32           cpi     r24, 0x22       ; 34
+    11b6:      20 f4           brcc    .+8             ; 0x11c0 <CDC_Device_ProcessControlRequest+0x36>
+    11b8:      80 32           cpi     r24, 0x20       ; 32
+    11ba:      09 f0           breq    .+2             ; 0x11be <CDC_Device_ProcessControlRequest+0x34>
+    11bc:      8f c0           rjmp    .+286           ; 0x12dc <CDC_Device_ProcessControlRequest+0x152>
+    11be:      3c c0           rjmp    .+120           ; 0x1238 <CDC_Device_ProcessControlRequest+0xae>
+    11c0:      82 32           cpi     r24, 0x22       ; 34
+    11c2:      09 f4           brne    .+2             ; 0x11c6 <CDC_Device_ProcessControlRequest+0x3c>
+    11c4:      6a c0           rjmp    .+212           ; 0x129a <CDC_Device_ProcessControlRequest+0x110>
+    11c6:      83 32           cpi     r24, 0x23       ; 35
+    11c8:      09 f0           breq    .+2             ; 0x11cc <CDC_Device_ProcessControlRequest+0x42>
+    11ca:      88 c0           rjmp    .+272           ; 0x12dc <CDC_Device_ProcessControlRequest+0x152>
+    11cc:      79 c0           rjmp    .+242           ; 0x12c0 <CDC_Device_ProcessControlRequest+0x136>
+       {
+               case CDC_REQ_GetLineEncoding:
+                       if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
+    11ce:      80 91 9a 02     lds     r24, 0x029A
+    11d2:      81 3a           cpi     r24, 0xA1       ; 161
+    11d4:      09 f0           breq    .+2             ; 0x11d8 <CDC_Device_ProcessControlRequest+0x4e>
+    11d6:      82 c0           rjmp    .+260           ; 0x12dc <CDC_Device_ProcessControlRequest+0x152>
+                        *  \note This is not applicable for non CONTROL type endpoints.
+                        */
+                       static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearSETUP(void)
+                       {
+                               UEINTX &= ~(1 << RXSTPI);
+    11d8:      80 91 e8 00     lds     r24, 0x00E8
+    11dc:      87 7f           andi    r24, 0xF7       ; 247
+    11de:      80 93 e8 00     sts     0x00E8, r24
+                        *  \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsINReady(void)
+                       {
+                               return ((UEINTX & (1 << TXINI)) ? true : false);
+    11e2:      80 91 e8 00     lds     r24, 0x00E8
+                       {
+                               Endpoint_ClearSETUP();
+
+                               while (!(Endpoint_IsINReady()));
+    11e6:      80 ff           sbrs    r24, 0
+    11e8:      fc cf           rjmp    .-8             ; 0x11e2 <CDC_Device_ProcessControlRequest+0x58>
+
+                               Endpoint_Write_32_LE(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS);
+    11ea:      8c 89           ldd     r24, Y+20       ; 0x14
+    11ec:      9d 89           ldd     r25, Y+21       ; 0x15
+    11ee:      ae 89           ldd     r26, Y+22       ; 0x16
+    11f0:      bf 89           ldd     r27, Y+23       ; 0x17
+                        *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline void Endpoint_Write_32_LE(const uint32_t Data) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_Write_32_LE(const uint32_t Data)
+                       {
+                               UEDATX = (Data &  0xFF);
+    11f2:      80 93 f1 00     sts     0x00F1, r24
+                               UEDATX = (Data >> 8);
+    11f6:      29 2f           mov     r18, r25
+    11f8:      3a 2f           mov     r19, r26
+    11fa:      4b 2f           mov     r20, r27
+    11fc:      55 27           eor     r21, r21
+    11fe:      20 93 f1 00     sts     0x00F1, r18
+                               UEDATX = (Data >> 16);
+    1202:      9d 01           movw    r18, r26
+    1204:      44 27           eor     r20, r20
+    1206:      55 27           eor     r21, r21
+    1208:      20 93 f1 00     sts     0x00F1, r18
+                               UEDATX = (Data >> 24);
+    120c:      8b 2f           mov     r24, r27
+    120e:      99 27           eor     r25, r25
+    1210:      aa 27           eor     r26, r26
+    1212:      bb 27           eor     r27, r27
+    1214:      80 93 f1 00     sts     0x00F1, r24
+                               Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.CharFormat);
+    1218:      88 8d           ldd     r24, Y+24       ; 0x18
+                        *  \param[in] Data  Data to write into the the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_Write_8(const uint8_t Data)
+                       {
+                               UEDATX = Data;
+    121a:      80 93 f1 00     sts     0x00F1, r24
+                               Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.ParityType);
+    121e:      89 8d           ldd     r24, Y+25       ; 0x19
+    1220:      80 93 f1 00     sts     0x00F1, r24
+                               Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.DataBits);
+    1224:      8a 8d           ldd     r24, Y+26       ; 0x1a
+    1226:      80 93 f1 00     sts     0x00F1, r24
+                        */
+                       static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearIN(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UEINTX &= ~((1 << TXINI) | (1 << FIFOCON));
+    122a:      80 91 e8 00     lds     r24, 0x00E8
+    122e:      8e 77           andi    r24, 0x7E       ; 126
+    1230:      80 93 e8 00     sts     0x00E8, r24
+
+                               Endpoint_ClearIN();
+                               Endpoint_ClearStatusStage();
+    1234:      b5 dc           rcall   .-1686          ; 0xba0 <Endpoint_ClearStatusStage>
+    1236:      52 c0           rjmp    .+164           ; 0x12dc <CDC_Device_ProcessControlRequest+0x152>
+                       }
+
+                       break;
+               case CDC_REQ_SetLineEncoding:
+                       if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
+    1238:      80 91 9a 02     lds     r24, 0x029A
+    123c:      81 32           cpi     r24, 0x21       ; 33
+    123e:      09 f0           breq    .+2             ; 0x1242 <CDC_Device_ProcessControlRequest+0xb8>
+    1240:      4d c0           rjmp    .+154           ; 0x12dc <CDC_Device_ProcessControlRequest+0x152>
+                        *  \note This is not applicable for non CONTROL type endpoints.
+                        */
+                       static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearSETUP(void)
+                       {
+                               UEINTX &= ~(1 << RXSTPI);
+    1242:      80 91 e8 00     lds     r24, 0x00E8
+    1246:      87 7f           andi    r24, 0xF7       ; 247
+    1248:      80 93 e8 00     sts     0x00E8, r24
+                       {
+                               Endpoint_ClearSETUP();
+
+                               while (!(Endpoint_IsOUTReceived()))
+    124c:      04 c0           rjmp    .+8             ; 0x1256 <CDC_Device_ProcessControlRequest+0xcc>
+                               {
+                                       if (USB_DeviceState == DEVICE_STATE_Unattached)
+    124e:      8e b3           in      r24, 0x1e       ; 30
+    1250:      88 23           and     r24, r24
+    1252:      09 f4           brne    .+2             ; 0x1256 <CDC_Device_ProcessControlRequest+0xcc>
+    1254:      43 c0           rjmp    .+134           ; 0x12dc <CDC_Device_ProcessControlRequest+0x152>
+                        *  \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsOUTReceived(void)
+                       {
+                               return ((UEINTX & (1 << RXOUTI)) ? true : false);
+    1256:      80 91 e8 00     lds     r24, 0x00E8
+               case CDC_REQ_SetLineEncoding:
+                       if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
+                       {
+                               Endpoint_ClearSETUP();
+
+                               while (!(Endpoint_IsOUTReceived()))
+    125a:      82 ff           sbrs    r24, 2
+    125c:      f8 cf           rjmp    .-16            ; 0x124e <CDC_Device_ProcessControlRequest+0xc4>
+                               {
+                                       uint32_t Value;
+                                       uint8_t  Bytes[4];
+                               } Data;
+
+                               Data.Bytes[0] = UEDATX;
+    125e:      30 91 f1 00     lds     r19, 0x00F1
+                               Data.Bytes[1] = UEDATX;
+    1262:      20 91 f1 00     lds     r18, 0x00F1
+                               Data.Bytes[2] = UEDATX;
+    1266:      90 91 f1 00     lds     r25, 0x00F1
+                               Data.Bytes[3] = UEDATX;
+    126a:      80 91 f1 00     lds     r24, 0x00F1
+                               {
+                                       if (USB_DeviceState == DEVICE_STATE_Unattached)
+                                         return;
+                               }
+
+                               CDCInterfaceInfo->State.LineEncoding.BaudRateBPS = Endpoint_Read_32_LE();
+    126e:      3c 8b           std     Y+20, r19       ; 0x14
+    1270:      2d 8b           std     Y+21, r18       ; 0x15
+    1272:      9e 8b           std     Y+22, r25       ; 0x16
+    1274:      8f 8b           std     Y+23, r24       ; 0x17
+                        *  \return Next byte in the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline uint8_t Endpoint_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Endpoint_Read_8(void)
+                       {
+                               return UEDATX;
+    1276:      80 91 f1 00     lds     r24, 0x00F1
+                               CDCInterfaceInfo->State.LineEncoding.CharFormat  = Endpoint_Read_8();
+    127a:      88 8f           std     Y+24, r24       ; 0x18
+    127c:      80 91 f1 00     lds     r24, 0x00F1
+                               CDCInterfaceInfo->State.LineEncoding.ParityType  = Endpoint_Read_8();
+    1280:      89 8f           std     Y+25, r24       ; 0x19
+    1282:      80 91 f1 00     lds     r24, 0x00F1
+                               CDCInterfaceInfo->State.LineEncoding.DataBits    = Endpoint_Read_8();
+    1286:      8a 8f           std     Y+26, r24       ; 0x1a
+                        */
+                       static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearOUT(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UEINTX &= ~((1 << RXOUTI) | (1 << FIFOCON));
+    1288:      80 91 e8 00     lds     r24, 0x00E8
+    128c:      8b 77           andi    r24, 0x7B       ; 123
+    128e:      80 93 e8 00     sts     0x00E8, r24
+
+                               Endpoint_ClearOUT();
+                               Endpoint_ClearStatusStage();
+    1292:      86 dc           rcall   .-1780          ; 0xba0 <Endpoint_ClearStatusStage>
+
+                               EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo);
+    1294:      ce 01           movw    r24, r28
+    1296:      b3 d9           rcall   .-3226          ; 0x5fe <EVENT_CDC_Device_LineEncodingChanged>
+    1298:      21 c0           rjmp    .+66            ; 0x12dc <CDC_Device_ProcessControlRequest+0x152>
+                       }
+
+                       break;
+               case CDC_REQ_SetControlLineState:
+                       if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
+    129a:      80 91 9a 02     lds     r24, 0x029A
+    129e:      81 32           cpi     r24, 0x21       ; 33
+    12a0:      e9 f4           brne    .+58            ; 0x12dc <CDC_Device_ProcessControlRequest+0x152>
+                        *  \note This is not applicable for non CONTROL type endpoints.
+                        */
+                       static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearSETUP(void)
+                       {
+                               UEINTX &= ~(1 << RXSTPI);
+    12a2:      80 91 e8 00     lds     r24, 0x00E8
+    12a6:      87 7f           andi    r24, 0xF7       ; 247
+    12a8:      80 93 e8 00     sts     0x00E8, r24
+                       {
+                               Endpoint_ClearSETUP();
+                               Endpoint_ClearStatusStage();
+    12ac:      79 dc           rcall   .-1806          ; 0xba0 <Endpoint_ClearStatusStage>
+
+                               CDCInterfaceInfo->State.ControlLineStates.HostToDevice = USB_ControlRequest.wValue;
+    12ae:      80 91 9c 02     lds     r24, 0x029C
+    12b2:      90 91 9d 02     lds     r25, 0x029D
+    12b6:      99 8b           std     Y+17, r25       ; 0x11
+    12b8:      88 8b           std     Y+16, r24       ; 0x10
+
+                               EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo);
+    12ba:      ce 01           movw    r24, r28
+    12bc:      d4 d0           rcall   .+424           ; 0x1466 <CDC_Device_Event_Stub>
+    12be:      0e c0           rjmp    .+28            ; 0x12dc <CDC_Device_ProcessControlRequest+0x152>
+                       }
+
+                       break;
+               case CDC_REQ_SendBreak:
+                       if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
+    12c0:      80 91 9a 02     lds     r24, 0x029A
+    12c4:      81 32           cpi     r24, 0x21       ; 33
+    12c6:      51 f4           brne    .+20            ; 0x12dc <CDC_Device_ProcessControlRequest+0x152>
+    12c8:      80 91 e8 00     lds     r24, 0x00E8
+    12cc:      87 7f           andi    r24, 0xF7       ; 247
+    12ce:      80 93 e8 00     sts     0x00E8, r24
+                       {
+                               Endpoint_ClearSETUP();
+                               Endpoint_ClearStatusStage();
+    12d2:      66 dc           rcall   .-1844          ; 0xba0 <Endpoint_ClearStatusStage>
+
+                               EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue);
+    12d4:      ce 01           movw    r24, r28
+    12d6:      60 91 9c 02     lds     r22, 0x029C
+    12da:      c5 d0           rcall   .+394           ; 0x1466 <CDC_Device_Event_Stub>
+                       }
+
+                       break;
+       }
+}
+    12dc:      df 91           pop     r29
+    12de:      cf 91           pop     r28
+    12e0:      08 95           ret
+
+000012e2 <CDC_Device_ConfigureEndpoints>:
+
+bool CDC_Device_ConfigureEndpoints(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+{
+    12e2:      cf 93           push    r28
+    12e4:      df 93           push    r29
+    12e6:      ec 01           movw    r28, r24
+       memset(&CDCInterfaceInfo->State, 0x00, sizeof(CDCInterfaceInfo->State));
+    12e8:      40 96           adiw    r24, 0x10       ; 16
+    12ea:      fc 01           movw    r30, r24
+    12ec:      8b e0           ldi     r24, 0x0B       ; 11
+    12ee:      df 01           movw    r26, r30
+    12f0:      1d 92           st      X+, r1
+    12f2:      8a 95           dec     r24
+    12f4:      e9 f7           brne    .-6             ; 0x12f0 <CDC_Device_ConfigureEndpoints+0xe>
+
+       CDCInterfaceInfo->Config.DataINEndpoint.Type       = EP_TYPE_BULK;
+    12f6:      82 e0           ldi     r24, 0x02       ; 2
+    12f8:      8c 83           std     Y+4, r24        ; 0x04
+       CDCInterfaceInfo->Config.DataOUTEndpoint.Type      = EP_TYPE_BULK;
+    12fa:      89 87           std     Y+9, r24        ; 0x09
+       CDCInterfaceInfo->Config.NotificationEndpoint.Type = EP_TYPE_INTERRUPT;
+    12fc:      83 e0           ldi     r24, 0x03       ; 3
+    12fe:      8e 87           std     Y+14, r24       ; 0x0e
+
+       if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataINEndpoint, 1)))
+    1300:      ce 01           movw    r24, r28
+    1302:      01 96           adiw    r24, 0x01       ; 1
+    1304:      61 e0           ldi     r22, 0x01       ; 1
+    1306:      08 dc           rcall   .-2032          ; 0xb18 <Endpoint_ConfigureEndpointTable>
+    1308:      88 23           and     r24, r24
+    130a:      59 f0           breq    .+22            ; 0x1322 <CDC_Device_ConfigureEndpoints+0x40>
+         return false;
+
+       if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataOUTEndpoint, 1)))
+    130c:      ce 01           movw    r24, r28
+    130e:      06 96           adiw    r24, 0x06       ; 6
+    1310:      61 e0           ldi     r22, 0x01       ; 1
+    1312:      02 dc           rcall   .-2044          ; 0xb18 <Endpoint_ConfigureEndpointTable>
+    1314:      88 23           and     r24, r24
+    1316:      29 f0           breq    .+10            ; 0x1322 <CDC_Device_ConfigureEndpoints+0x40>
+         return false;
+
+       if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.NotificationEndpoint, 1)))
+    1318:      ce 01           movw    r24, r28
+    131a:      0b 96           adiw    r24, 0x0b       ; 11
+    131c:      61 e0           ldi     r22, 0x01       ; 1
+    131e:      fc db           rcall   .-2056          ; 0xb18 <Endpoint_ConfigureEndpointTable>
+    1320:      01 c0           rjmp    .+2             ; 0x1324 <CDC_Device_ConfigureEndpoints+0x42>
+
+       if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataINEndpoint, 1)))
+         return false;
+
+       if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataOUTEndpoint, 1)))
+         return false;
+    1322:      80 e0           ldi     r24, 0x00       ; 0
+
+       if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.NotificationEndpoint, 1)))
+         return false;
+
+       return true;
+}
+    1324:      df 91           pop     r29
+    1326:      cf 91           pop     r28
+    1328:      08 95           ret
+
+0000132a <CDC_Device_SendByte>:
+       return Endpoint_Write_Stream_LE(Buffer, Length, NULL);
+}
+
+uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+                            const uint8_t Data)
+{
+    132a:      df 93           push    r29
+    132c:      cf 93           push    r28
+    132e:      0f 92           push    r0
+    1330:      cd b7           in      r28, 0x3d       ; 61
+    1332:      de b7           in      r29, 0x3e       ; 62
+    1334:      fc 01           movw    r30, r24
+       if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+    1336:      8e b3           in      r24, 0x1e       ; 30
+    1338:      84 30           cpi     r24, 0x04       ; 4
+    133a:      f9 f4           brne    .+62            ; 0x137a <CDC_Device_SendByte+0x50>
+    133c:      24 89           ldd     r18, Z+20       ; 0x14
+    133e:      35 89           ldd     r19, Z+21       ; 0x15
+    1340:      46 89           ldd     r20, Z+22       ; 0x16
+    1342:      57 89           ldd     r21, Z+23       ; 0x17
+    1344:      21 15           cp      r18, r1
+    1346:      31 05           cpc     r19, r1
+    1348:      41 05           cpc     r20, r1
+    134a:      51 05           cpc     r21, r1
+    134c:      b1 f0           breq    .+44            ; 0x137a <CDC_Device_SendByte+0x50>
+                        */
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UENUM = (Address & ENDPOINT_EPNUM_MASK);
+    134e:      81 81           ldd     r24, Z+1        ; 0x01
+    1350:      8f 70           andi    r24, 0x0F       ; 15
+    1352:      80 93 e9 00     sts     0x00E9, r24
+                        *          on its direction.
+                        */
+                       static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsReadWriteAllowed(void)
+                       {
+                               return ((UEINTX & (1 << RWAL)) ? true : false);
+    1356:      80 91 e8 00     lds     r24, 0x00E8
+         return ENDPOINT_RWSTREAM_DeviceDisconnected;
+
+       Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address);
+
+       if (!(Endpoint_IsReadWriteAllowed()))
+    135a:      85 fd           sbrc    r24, 5
+    135c:      0a c0           rjmp    .+20            ; 0x1372 <CDC_Device_SendByte+0x48>
+                        */
+                       static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearIN(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UEINTX &= ~((1 << TXINI) | (1 << FIFOCON));
+    135e:      80 91 e8 00     lds     r24, 0x00E8
+    1362:      8e 77           andi    r24, 0x7E       ; 126
+    1364:      80 93 e8 00     sts     0x00E8, r24
+       {
+               Endpoint_ClearIN();
+
+               uint8_t ErrorCode;
+
+               if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError)
+    1368:      69 83           std     Y+1, r22        ; 0x01
+    136a:      39 dc           rcall   .-1934          ; 0xbde <Endpoint_WaitUntilReady>
+    136c:      69 81           ldd     r22, Y+1        ; 0x01
+    136e:      88 23           and     r24, r24
+    1370:      29 f4           brne    .+10            ; 0x137c <CDC_Device_SendByte+0x52>
+                        *  \param[in] Data  Data to write into the the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_Write_8(const uint8_t Data)
+                       {
+                               UEDATX = Data;
+    1372:      60 93 f1 00     sts     0x00F1, r22
+                 return ErrorCode;
+       }
+
+       Endpoint_Write_8(Data);
+       return ENDPOINT_READYWAIT_NoError;
+    1376:      80 e0           ldi     r24, 0x00       ; 0
+    1378:      01 c0           rjmp    .+2             ; 0x137c <CDC_Device_SendByte+0x52>
+
+uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+                            const uint8_t Data)
+{
+       if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+         return ENDPOINT_RWSTREAM_DeviceDisconnected;
+    137a:      82 e0           ldi     r24, 0x02       ; 2
+                 return ErrorCode;
+       }
+
+       Endpoint_Write_8(Data);
+       return ENDPOINT_READYWAIT_NoError;
+}
+    137c:      0f 90           pop     r0
+    137e:      cf 91           pop     r28
+    1380:      df 91           pop     r29
+    1382:      08 95           ret
+
+00001384 <CDC_Device_Flush>:
+
+uint8_t CDC_Device_Flush(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+{
+    1384:      fc 01           movw    r30, r24
+       if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+    1386:      8e b3           in      r24, 0x1e       ; 30
+    1388:      84 30           cpi     r24, 0x04       ; 4
+    138a:      19 f5           brne    .+70            ; 0x13d2 <CDC_Device_Flush+0x4e>
+    138c:      24 89           ldd     r18, Z+20       ; 0x14
+    138e:      35 89           ldd     r19, Z+21       ; 0x15
+    1390:      46 89           ldd     r20, Z+22       ; 0x16
+    1392:      57 89           ldd     r21, Z+23       ; 0x17
+    1394:      21 15           cp      r18, r1
+    1396:      31 05           cpc     r19, r1
+    1398:      41 05           cpc     r20, r1
+    139a:      51 05           cpc     r21, r1
+    139c:      d1 f0           breq    .+52            ; 0x13d2 <CDC_Device_Flush+0x4e>
+                        */
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UENUM = (Address & ENDPOINT_EPNUM_MASK);
+    139e:      81 81           ldd     r24, Z+1        ; 0x01
+    13a0:      8f 70           andi    r24, 0x0F       ; 15
+    13a2:      80 93 e9 00     sts     0x00E9, r24
+                               #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+                                       return UEBCX;
+                               #elif defined(USB_SERIES_4_AVR)
+                                       return (((uint16_t)UEBCHX << 8) | UEBCLX);
+                               #elif defined(USB_SERIES_2_AVR)
+                                       return UEBCLX;
+    13a6:      80 91 f2 00     lds     r24, 0x00F2
+
+       uint8_t ErrorCode;
+
+       Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address);
+
+       if (!(Endpoint_BytesInEndpoint()))
+    13aa:      88 23           and     r24, r24
+    13ac:      a1 f0           breq    .+40            ; 0x13d6 <CDC_Device_Flush+0x52>
+                        *          on its direction.
+                        */
+                       static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsReadWriteAllowed(void)
+                       {
+                               return ((UEINTX & (1 << RWAL)) ? true : false);
+    13ae:      90 91 e8 00     lds     r25, 0x00E8
+                        */
+                       static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearIN(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UEINTX &= ~((1 << TXINI) | (1 << FIFOCON));
+    13b2:      80 91 e8 00     lds     r24, 0x00E8
+    13b6:      8e 77           andi    r24, 0x7E       ; 126
+    13b8:      80 93 e8 00     sts     0x00E8, r24
+
+       bool BankFull = !(Endpoint_IsReadWriteAllowed());
+
+       Endpoint_ClearIN();
+
+       if (BankFull)
+    13bc:      95 fd           sbrc    r25, 5
+    13be:      0d c0           rjmp    .+26            ; 0x13da <CDC_Device_Flush+0x56>
+       {
+               if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError)
+    13c0:      0e dc           rcall   .-2020          ; 0xbde <Endpoint_WaitUntilReady>
+    13c2:      88 23           and     r24, r24
+    13c4:      59 f4           brne    .+22            ; 0x13dc <CDC_Device_Flush+0x58>
+    13c6:      90 91 e8 00     lds     r25, 0x00E8
+    13ca:      9e 77           andi    r25, 0x7E       ; 126
+    13cc:      90 93 e8 00     sts     0x00E8, r25
+    13d0:      08 95           ret
+}
+
+uint8_t CDC_Device_Flush(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+{
+       if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+         return ENDPOINT_RWSTREAM_DeviceDisconnected;
+    13d2:      82 e0           ldi     r24, 0x02       ; 2
+    13d4:      08 95           ret
+       uint8_t ErrorCode;
+
+       Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address);
+
+       if (!(Endpoint_BytesInEndpoint()))
+         return ENDPOINT_READYWAIT_NoError;
+    13d6:      80 e0           ldi     r24, 0x00       ; 0
+    13d8:      08 95           ret
+                 return ErrorCode;
+
+               Endpoint_ClearIN();
+       }
+
+       return ENDPOINT_READYWAIT_NoError;
+    13da:      80 e0           ldi     r24, 0x00       ; 0
+}
+    13dc:      08 95           ret
+
+000013de <CDC_Device_USBTask>:
+       return true;
+}
+
+void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+{
+       if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+    13de:      2e b3           in      r18, 0x1e       ; 30
+    13e0:      24 30           cpi     r18, 0x04       ; 4
+    13e2:      99 f4           brne    .+38            ; 0x140a <CDC_Device_USBTask+0x2c>
+    13e4:      fc 01           movw    r30, r24
+    13e6:      24 89           ldd     r18, Z+20       ; 0x14
+    13e8:      35 89           ldd     r19, Z+21       ; 0x15
+    13ea:      46 89           ldd     r20, Z+22       ; 0x16
+    13ec:      57 89           ldd     r21, Z+23       ; 0x17
+    13ee:      21 15           cp      r18, r1
+    13f0:      31 05           cpc     r19, r1
+    13f2:      41 05           cpc     r20, r1
+    13f4:      51 05           cpc     r21, r1
+    13f6:      49 f0           breq    .+18            ; 0x140a <CDC_Device_USBTask+0x2c>
+                        */
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UENUM = (Address & ENDPOINT_EPNUM_MASK);
+    13f8:      21 81           ldd     r18, Z+1        ; 0x01
+    13fa:      2f 70           andi    r18, 0x0F       ; 15
+    13fc:      20 93 e9 00     sts     0x00E9, r18
+                        *  \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsINReady(void)
+                       {
+                               return ((UEINTX & (1 << TXINI)) ? true : false);
+    1400:      20 91 e8 00     lds     r18, 0x00E8
+         return;
+
+       #if !defined(NO_CLASS_DRIVER_AUTOFLUSH)
+       Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address);
+
+       if (Endpoint_IsINReady())
+    1404:      20 ff           sbrs    r18, 0
+    1406:      01 c0           rjmp    .+2             ; 0x140a <CDC_Device_USBTask+0x2c>
+         CDC_Device_Flush(CDCInterfaceInfo);
+    1408:      bd cf           rjmp    .-134           ; 0x1384 <CDC_Device_Flush>
+    140a:      08 95           ret
+
+0000140c <CDC_Device_ReceiveByte>:
+               return 0;
+       }
+}
+
+int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+{
+    140c:      fc 01           movw    r30, r24
+       if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+    140e:      8e b3           in      r24, 0x1e       ; 30
+    1410:      84 30           cpi     r24, 0x04       ; 4
+    1412:      29 f5           brne    .+74            ; 0x145e <CDC_Device_ReceiveByte+0x52>
+    1414:      24 89           ldd     r18, Z+20       ; 0x14
+    1416:      35 89           ldd     r19, Z+21       ; 0x15
+    1418:      46 89           ldd     r20, Z+22       ; 0x16
+    141a:      57 89           ldd     r21, Z+23       ; 0x17
+    141c:      21 15           cp      r18, r1
+    141e:      31 05           cpc     r19, r1
+    1420:      41 05           cpc     r20, r1
+    1422:      51 05           cpc     r21, r1
+    1424:      e1 f0           breq    .+56            ; 0x145e <CDC_Device_ReceiveByte+0x52>
+                        */
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_SelectEndpoint(const uint8_t Address)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UENUM = (Address & ENDPOINT_EPNUM_MASK);
+    1426:      86 81           ldd     r24, Z+6        ; 0x06
+    1428:      8f 70           andi    r24, 0x0F       ; 15
+    142a:      80 93 e9 00     sts     0x00E9, r24
+                        *  \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsOUTReceived(void)
+                       {
+                               return ((UEINTX & (1 << RXOUTI)) ? true : false);
+    142e:      80 91 e8 00     lds     r24, 0x00E8
+
+       int16_t ReceivedByte = -1;
+
+       Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpoint.Address);
+
+       if (Endpoint_IsOUTReceived())
+    1432:      82 ff           sbrs    r24, 2
+    1434:      14 c0           rjmp    .+40            ; 0x145e <CDC_Device_ReceiveByte+0x52>
+                               #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+                                       return UEBCX;
+                               #elif defined(USB_SERIES_4_AVR)
+                                       return (((uint16_t)UEBCHX << 8) | UEBCLX);
+                               #elif defined(USB_SERIES_2_AVR)
+                                       return UEBCLX;
+    1436:      80 91 f2 00     lds     r24, 0x00F2
+       {
+               if (Endpoint_BytesInEndpoint())
+    143a:      88 23           and     r24, r24
+    143c:      21 f0           breq    .+8             ; 0x1446 <CDC_Device_ReceiveByte+0x3a>
+                        *  \return Next byte in the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline uint8_t Endpoint_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Endpoint_Read_8(void)
+                       {
+                               return UEDATX;
+    143e:      20 91 f1 00     lds     r18, 0x00F1
+                 ReceivedByte = Endpoint_Read_8();
+    1442:      30 e0           ldi     r19, 0x00       ; 0
+    1444:      02 c0           rjmp    .+4             ; 0x144a <CDC_Device_ReceiveByte+0x3e>
+int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+{
+       if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+         return -1;
+
+       int16_t ReceivedByte = -1;
+    1446:      2f ef           ldi     r18, 0xFF       ; 255
+    1448:      3f ef           ldi     r19, 0xFF       ; 255
+                               #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+                                       return UEBCX;
+                               #elif defined(USB_SERIES_4_AVR)
+                                       return (((uint16_t)UEBCHX << 8) | UEBCLX);
+                               #elif defined(USB_SERIES_2_AVR)
+                                       return UEBCLX;
+    144a:      80 91 f2 00     lds     r24, 0x00F2
+       if (Endpoint_IsOUTReceived())
+       {
+               if (Endpoint_BytesInEndpoint())
+                 ReceivedByte = Endpoint_Read_8();
+
+               if (!(Endpoint_BytesInEndpoint()))
+    144e:      88 23           and     r24, r24
+    1450:      41 f4           brne    .+16            ; 0x1462 <CDC_Device_ReceiveByte+0x56>
+                        */
+                       static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearOUT(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UEINTX &= ~((1 << RXOUTI) | (1 << FIFOCON));
+    1452:      80 91 e8 00     lds     r24, 0x00E8
+    1456:      8b 77           andi    r24, 0x7B       ; 123
+    1458:      80 93 e8 00     sts     0x00E8, r24
+    145c:      02 c0           rjmp    .+4             ; 0x1462 <CDC_Device_ReceiveByte+0x56>
+int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+{
+       if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+         return -1;
+
+       int16_t ReceivedByte = -1;
+    145e:      2f ef           ldi     r18, 0xFF       ; 255
+    1460:      3f ef           ldi     r19, 0xFF       ; 255
+               if (!(Endpoint_BytesInEndpoint()))
+                 Endpoint_ClearOUT();
+       }
+
+       return ReceivedByte;
+}
+    1462:      c9 01           movw    r24, r18
+    1464:      08 95           ret
+
+00001466 <CDC_Device_Event_Stub>:
+#endif
+
+void CDC_Device_Event_Stub(void)
+{
+
+}
+    1466:      08 95           ret
+
+00001468 <__subsf3>:
+    1468:      50 58           subi    r21, 0x80       ; 128
+
+0000146a <__addsf3>:
+    146a:      bb 27           eor     r27, r27
+    146c:      aa 27           eor     r26, r26
+    146e:      0e d0           rcall   .+28            ; 0x148c <__addsf3x>
+    1470:      70 c1           rjmp    .+736           ; 0x1752 <__fp_round>
+    1472:      61 d1           rcall   .+706           ; 0x1736 <__fp_pscA>
+    1474:      30 f0           brcs    .+12            ; 0x1482 <__addsf3+0x18>
+    1476:      66 d1           rcall   .+716           ; 0x1744 <__fp_pscB>
+    1478:      20 f0           brcs    .+8             ; 0x1482 <__addsf3+0x18>
+    147a:      31 f4           brne    .+12            ; 0x1488 <__addsf3+0x1e>
+    147c:      9f 3f           cpi     r25, 0xFF       ; 255
+    147e:      11 f4           brne    .+4             ; 0x1484 <__addsf3+0x1a>
+    1480:      1e f4           brtc    .+6             ; 0x1488 <__addsf3+0x1e>
+    1482:      56 c1           rjmp    .+684           ; 0x1730 <__fp_nan>
+    1484:      0e f4           brtc    .+2             ; 0x1488 <__addsf3+0x1e>
+    1486:      e0 95           com     r30
+    1488:      e7 fb           bst     r30, 7
+    148a:      4c c1           rjmp    .+664           ; 0x1724 <__fp_inf>
+
+0000148c <__addsf3x>:
+    148c:      e9 2f           mov     r30, r25
+    148e:      72 d1           rcall   .+740           ; 0x1774 <__fp_split3>
+    1490:      80 f3           brcs    .-32            ; 0x1472 <__addsf3+0x8>
+    1492:      ba 17           cp      r27, r26
+    1494:      62 07           cpc     r22, r18
+    1496:      73 07           cpc     r23, r19
+    1498:      84 07           cpc     r24, r20
+    149a:      95 07           cpc     r25, r21
+    149c:      18 f0           brcs    .+6             ; 0x14a4 <__addsf3x+0x18>
+    149e:      71 f4           brne    .+28            ; 0x14bc <__addsf3x+0x30>
+    14a0:      9e f5           brtc    .+102           ; 0x1508 <__addsf3x+0x7c>
+    14a2:      8a c1           rjmp    .+788           ; 0x17b8 <__fp_zero>
+    14a4:      0e f4           brtc    .+2             ; 0x14a8 <__addsf3x+0x1c>
+    14a6:      e0 95           com     r30
+    14a8:      0b 2e           mov     r0, r27
+    14aa:      ba 2f           mov     r27, r26
+    14ac:      a0 2d           mov     r26, r0
+    14ae:      0b 01           movw    r0, r22
+    14b0:      b9 01           movw    r22, r18
+    14b2:      90 01           movw    r18, r0
+    14b4:      0c 01           movw    r0, r24
+    14b6:      ca 01           movw    r24, r20
+    14b8:      a0 01           movw    r20, r0
+    14ba:      11 24           eor     r1, r1
+    14bc:      ff 27           eor     r31, r31
+    14be:      59 1b           sub     r21, r25
+    14c0:      99 f0           breq    .+38            ; 0x14e8 <__addsf3x+0x5c>
+    14c2:      59 3f           cpi     r21, 0xF9       ; 249
+    14c4:      50 f4           brcc    .+20            ; 0x14da <__addsf3x+0x4e>
+    14c6:      50 3e           cpi     r21, 0xE0       ; 224
+    14c8:      68 f1           brcs    .+90            ; 0x1524 <__addsf3x+0x98>
+    14ca:      1a 16           cp      r1, r26
+    14cc:      f0 40           sbci    r31, 0x00       ; 0
+    14ce:      a2 2f           mov     r26, r18
+    14d0:      23 2f           mov     r18, r19
+    14d2:      34 2f           mov     r19, r20
+    14d4:      44 27           eor     r20, r20
+    14d6:      58 5f           subi    r21, 0xF8       ; 248
+    14d8:      f3 cf           rjmp    .-26            ; 0x14c0 <__addsf3x+0x34>
+    14da:      46 95           lsr     r20
+    14dc:      37 95           ror     r19
+    14de:      27 95           ror     r18
+    14e0:      a7 95           ror     r26
+    14e2:      f0 40           sbci    r31, 0x00       ; 0
+    14e4:      53 95           inc     r21
+    14e6:      c9 f7           brne    .-14            ; 0x14da <__addsf3x+0x4e>
+    14e8:      7e f4           brtc    .+30            ; 0x1508 <__addsf3x+0x7c>
+    14ea:      1f 16           cp      r1, r31
+    14ec:      ba 0b           sbc     r27, r26
+    14ee:      62 0b           sbc     r22, r18
+    14f0:      73 0b           sbc     r23, r19
+    14f2:      84 0b           sbc     r24, r20
+    14f4:      ba f0           brmi    .+46            ; 0x1524 <__addsf3x+0x98>
+    14f6:      91 50           subi    r25, 0x01       ; 1
+    14f8:      a1 f0           breq    .+40            ; 0x1522 <__addsf3x+0x96>
+    14fa:      ff 0f           add     r31, r31
+    14fc:      bb 1f           adc     r27, r27
+    14fe:      66 1f           adc     r22, r22
+    1500:      77 1f           adc     r23, r23
+    1502:      88 1f           adc     r24, r24
+    1504:      c2 f7           brpl    .-16            ; 0x14f6 <__addsf3x+0x6a>
+    1506:      0e c0           rjmp    .+28            ; 0x1524 <__addsf3x+0x98>
+    1508:      ba 0f           add     r27, r26
+    150a:      62 1f           adc     r22, r18
+    150c:      73 1f           adc     r23, r19
+    150e:      84 1f           adc     r24, r20
+    1510:      48 f4           brcc    .+18            ; 0x1524 <__addsf3x+0x98>
+    1512:      87 95           ror     r24
+    1514:      77 95           ror     r23
+    1516:      67 95           ror     r22
+    1518:      b7 95           ror     r27
+    151a:      f7 95           ror     r31
+    151c:      9e 3f           cpi     r25, 0xFE       ; 254
+    151e:      08 f0           brcs    .+2             ; 0x1522 <__addsf3x+0x96>
+    1520:      b3 cf           rjmp    .-154           ; 0x1488 <__addsf3+0x1e>
+    1522:      93 95           inc     r25
+    1524:      88 0f           add     r24, r24
+    1526:      08 f0           brcs    .+2             ; 0x152a <__addsf3x+0x9e>
+    1528:      99 27           eor     r25, r25
+    152a:      ee 0f           add     r30, r30
+    152c:      97 95           ror     r25
+    152e:      87 95           ror     r24
+    1530:      08 95           ret
+
+00001532 <__cmpsf2>:
+    1532:      d4 d0           rcall   .+424           ; 0x16dc <__fp_cmp>
+    1534:      08 f4           brcc    .+2             ; 0x1538 <__cmpsf2+0x6>
+    1536:      81 e0           ldi     r24, 0x01       ; 1
+    1538:      08 95           ret
+
+0000153a <__divsf3>:
+    153a:      0c d0           rcall   .+24            ; 0x1554 <__divsf3x>
+    153c:      0a c1           rjmp    .+532           ; 0x1752 <__fp_round>
+    153e:      02 d1           rcall   .+516           ; 0x1744 <__fp_pscB>
+    1540:      40 f0           brcs    .+16            ; 0x1552 <__divsf3+0x18>
+    1542:      f9 d0           rcall   .+498           ; 0x1736 <__fp_pscA>
+    1544:      30 f0           brcs    .+12            ; 0x1552 <__divsf3+0x18>
+    1546:      21 f4           brne    .+8             ; 0x1550 <__divsf3+0x16>
+    1548:      5f 3f           cpi     r21, 0xFF       ; 255
+    154a:      19 f0           breq    .+6             ; 0x1552 <__divsf3+0x18>
+    154c:      eb c0           rjmp    .+470           ; 0x1724 <__fp_inf>
+    154e:      51 11           cpse    r21, r1
+    1550:      34 c1           rjmp    .+616           ; 0x17ba <__fp_szero>
+    1552:      ee c0           rjmp    .+476           ; 0x1730 <__fp_nan>
+
+00001554 <__divsf3x>:
+    1554:      0f d1           rcall   .+542           ; 0x1774 <__fp_split3>
+    1556:      98 f3           brcs    .-26            ; 0x153e <__divsf3+0x4>
+
+00001558 <__divsf3_pse>:
+    1558:      99 23           and     r25, r25
+    155a:      c9 f3           breq    .-14            ; 0x154e <__divsf3+0x14>
+    155c:      55 23           and     r21, r21
+    155e:      b1 f3           breq    .-20            ; 0x154c <__divsf3+0x12>
+    1560:      95 1b           sub     r25, r21
+    1562:      55 0b           sbc     r21, r21
+    1564:      bb 27           eor     r27, r27
+    1566:      aa 27           eor     r26, r26
+    1568:      62 17           cp      r22, r18
+    156a:      73 07           cpc     r23, r19
+    156c:      84 07           cpc     r24, r20
+    156e:      38 f0           brcs    .+14            ; 0x157e <__divsf3_pse+0x26>
+    1570:      9f 5f           subi    r25, 0xFF       ; 255
+    1572:      5f 4f           sbci    r21, 0xFF       ; 255
+    1574:      22 0f           add     r18, r18
+    1576:      33 1f           adc     r19, r19
+    1578:      44 1f           adc     r20, r20
+    157a:      aa 1f           adc     r26, r26
+    157c:      a9 f3           breq    .-22            ; 0x1568 <__divsf3_pse+0x10>
+    157e:      33 d0           rcall   .+102           ; 0x15e6 <__divsf3_pse+0x8e>
+    1580:      0e 2e           mov     r0, r30
+    1582:      3a f0           brmi    .+14            ; 0x1592 <__divsf3_pse+0x3a>
+    1584:      e0 e8           ldi     r30, 0x80       ; 128
+    1586:      30 d0           rcall   .+96            ; 0x15e8 <__divsf3_pse+0x90>
+    1588:      91 50           subi    r25, 0x01       ; 1
+    158a:      50 40           sbci    r21, 0x00       ; 0
+    158c:      e6 95           lsr     r30
+    158e:      00 1c           adc     r0, r0
+    1590:      ca f7           brpl    .-14            ; 0x1584 <__divsf3_pse+0x2c>
+    1592:      29 d0           rcall   .+82            ; 0x15e6 <__divsf3_pse+0x8e>
+    1594:      fe 2f           mov     r31, r30
+    1596:      27 d0           rcall   .+78            ; 0x15e6 <__divsf3_pse+0x8e>
+    1598:      66 0f           add     r22, r22
+    159a:      77 1f           adc     r23, r23
+    159c:      88 1f           adc     r24, r24
+    159e:      bb 1f           adc     r27, r27
+    15a0:      26 17           cp      r18, r22
+    15a2:      37 07           cpc     r19, r23
+    15a4:      48 07           cpc     r20, r24
+    15a6:      ab 07           cpc     r26, r27
+    15a8:      b0 e8           ldi     r27, 0x80       ; 128
+    15aa:      09 f0           breq    .+2             ; 0x15ae <__divsf3_pse+0x56>
+    15ac:      bb 0b           sbc     r27, r27
+    15ae:      80 2d           mov     r24, r0
+    15b0:      bf 01           movw    r22, r30
+    15b2:      ff 27           eor     r31, r31
+    15b4:      93 58           subi    r25, 0x83       ; 131
+    15b6:      5f 4f           sbci    r21, 0xFF       ; 255
+    15b8:      2a f0           brmi    .+10            ; 0x15c4 <__divsf3_pse+0x6c>
+    15ba:      9e 3f           cpi     r25, 0xFE       ; 254
+    15bc:      51 05           cpc     r21, r1
+    15be:      68 f0           brcs    .+26            ; 0x15da <__divsf3_pse+0x82>
+    15c0:      b1 c0           rjmp    .+354           ; 0x1724 <__fp_inf>
+    15c2:      fb c0           rjmp    .+502           ; 0x17ba <__fp_szero>
+    15c4:      5f 3f           cpi     r21, 0xFF       ; 255
+    15c6:      ec f3           brlt    .-6             ; 0x15c2 <__divsf3_pse+0x6a>
+    15c8:      98 3e           cpi     r25, 0xE8       ; 232
+    15ca:      dc f3           brlt    .-10            ; 0x15c2 <__divsf3_pse+0x6a>
+    15cc:      86 95           lsr     r24
+    15ce:      77 95           ror     r23
+    15d0:      67 95           ror     r22
+    15d2:      b7 95           ror     r27
+    15d4:      f7 95           ror     r31
+    15d6:      9f 5f           subi    r25, 0xFF       ; 255
+    15d8:      c9 f7           brne    .-14            ; 0x15cc <__divsf3_pse+0x74>
+    15da:      88 0f           add     r24, r24
+    15dc:      91 1d           adc     r25, r1
+    15de:      96 95           lsr     r25
+    15e0:      87 95           ror     r24
+    15e2:      97 f9           bld     r25, 7
+    15e4:      08 95           ret
+    15e6:      e1 e0           ldi     r30, 0x01       ; 1
+    15e8:      66 0f           add     r22, r22
+    15ea:      77 1f           adc     r23, r23
+    15ec:      88 1f           adc     r24, r24
+    15ee:      bb 1f           adc     r27, r27
+    15f0:      62 17           cp      r22, r18
+    15f2:      73 07           cpc     r23, r19
+    15f4:      84 07           cpc     r24, r20
+    15f6:      ba 07           cpc     r27, r26
+    15f8:      20 f0           brcs    .+8             ; 0x1602 <__divsf3_pse+0xaa>
+    15fa:      62 1b           sub     r22, r18
+    15fc:      73 0b           sbc     r23, r19
+    15fe:      84 0b           sbc     r24, r20
+    1600:      ba 0b           sbc     r27, r26
+    1602:      ee 1f           adc     r30, r30
+    1604:      88 f7           brcc    .-30            ; 0x15e8 <__divsf3_pse+0x90>
+    1606:      e0 95           com     r30
+    1608:      08 95           ret
+
+0000160a <__fixunssfsi>:
+    160a:      bc d0           rcall   .+376           ; 0x1784 <__fp_splitA>
+    160c:      88 f0           brcs    .+34            ; 0x1630 <__fixunssfsi+0x26>
+    160e:      9f 57           subi    r25, 0x7F       ; 127
+    1610:      90 f0           brcs    .+36            ; 0x1636 <__fixunssfsi+0x2c>
+    1612:      b9 2f           mov     r27, r25
+    1614:      99 27           eor     r25, r25
+    1616:      b7 51           subi    r27, 0x17       ; 23
+    1618:      a0 f0           brcs    .+40            ; 0x1642 <__fixunssfsi+0x38>
+    161a:      d1 f0           breq    .+52            ; 0x1650 <__fixunssfsi+0x46>
+    161c:      66 0f           add     r22, r22
+    161e:      77 1f           adc     r23, r23
+    1620:      88 1f           adc     r24, r24
+    1622:      99 1f           adc     r25, r25
+    1624:      1a f0           brmi    .+6             ; 0x162c <__fixunssfsi+0x22>
+    1626:      ba 95           dec     r27
+    1628:      c9 f7           brne    .-14            ; 0x161c <__fixunssfsi+0x12>
+    162a:      12 c0           rjmp    .+36            ; 0x1650 <__fixunssfsi+0x46>
+    162c:      b1 30           cpi     r27, 0x01       ; 1
+    162e:      81 f0           breq    .+32            ; 0x1650 <__fixunssfsi+0x46>
+    1630:      c3 d0           rcall   .+390           ; 0x17b8 <__fp_zero>
+    1632:      b1 e0           ldi     r27, 0x01       ; 1
+    1634:      08 95           ret
+    1636:      c0 c0           rjmp    .+384           ; 0x17b8 <__fp_zero>
+    1638:      67 2f           mov     r22, r23
+    163a:      78 2f           mov     r23, r24
+    163c:      88 27           eor     r24, r24
+    163e:      b8 5f           subi    r27, 0xF8       ; 248
+    1640:      39 f0           breq    .+14            ; 0x1650 <__fixunssfsi+0x46>
+    1642:      b9 3f           cpi     r27, 0xF9       ; 249
+    1644:      cc f3           brlt    .-14            ; 0x1638 <__fixunssfsi+0x2e>
+    1646:      86 95           lsr     r24
+    1648:      77 95           ror     r23
+    164a:      67 95           ror     r22
+    164c:      b3 95           inc     r27
+    164e:      d9 f7           brne    .-10            ; 0x1646 <__fixunssfsi+0x3c>
+    1650:      3e f4           brtc    .+14            ; 0x1660 <__fixunssfsi+0x56>
+    1652:      90 95           com     r25
+    1654:      80 95           com     r24
+    1656:      70 95           com     r23
+    1658:      61 95           neg     r22
+    165a:      7f 4f           sbci    r23, 0xFF       ; 255
+    165c:      8f 4f           sbci    r24, 0xFF       ; 255
+    165e:      9f 4f           sbci    r25, 0xFF       ; 255
+    1660:      08 95           ret
+
+00001662 <__floatunsisf>:
+    1662:      e8 94           clt
+    1664:      09 c0           rjmp    .+18            ; 0x1678 <__floatsisf+0x12>
+
+00001666 <__floatsisf>:
+    1666:      97 fb           bst     r25, 7
+    1668:      3e f4           brtc    .+14            ; 0x1678 <__floatsisf+0x12>
+    166a:      90 95           com     r25
+    166c:      80 95           com     r24
+    166e:      70 95           com     r23
+    1670:      61 95           neg     r22
+    1672:      7f 4f           sbci    r23, 0xFF       ; 255
+    1674:      8f 4f           sbci    r24, 0xFF       ; 255
+    1676:      9f 4f           sbci    r25, 0xFF       ; 255
+    1678:      99 23           and     r25, r25
+    167a:      a9 f0           breq    .+42            ; 0x16a6 <__floatsisf+0x40>
+    167c:      f9 2f           mov     r31, r25
+    167e:      96 e9           ldi     r25, 0x96       ; 150
+    1680:      bb 27           eor     r27, r27
+    1682:      93 95           inc     r25
+    1684:      f6 95           lsr     r31
+    1686:      87 95           ror     r24
+    1688:      77 95           ror     r23
+    168a:      67 95           ror     r22
+    168c:      b7 95           ror     r27
+    168e:      f1 11           cpse    r31, r1
+    1690:      f8 cf           rjmp    .-16            ; 0x1682 <__floatsisf+0x1c>
+    1692:      fa f4           brpl    .+62            ; 0x16d2 <__floatsisf+0x6c>
+    1694:      bb 0f           add     r27, r27
+    1696:      11 f4           brne    .+4             ; 0x169c <__floatsisf+0x36>
+    1698:      60 ff           sbrs    r22, 0
+    169a:      1b c0           rjmp    .+54            ; 0x16d2 <__floatsisf+0x6c>
+    169c:      6f 5f           subi    r22, 0xFF       ; 255
+    169e:      7f 4f           sbci    r23, 0xFF       ; 255
+    16a0:      8f 4f           sbci    r24, 0xFF       ; 255
+    16a2:      9f 4f           sbci    r25, 0xFF       ; 255
+    16a4:      16 c0           rjmp    .+44            ; 0x16d2 <__floatsisf+0x6c>
+    16a6:      88 23           and     r24, r24
+    16a8:      11 f0           breq    .+4             ; 0x16ae <__floatsisf+0x48>
+    16aa:      96 e9           ldi     r25, 0x96       ; 150
+    16ac:      11 c0           rjmp    .+34            ; 0x16d0 <__floatsisf+0x6a>
+    16ae:      77 23           and     r23, r23
+    16b0:      21 f0           breq    .+8             ; 0x16ba <__floatsisf+0x54>
+    16b2:      9e e8           ldi     r25, 0x8E       ; 142
+    16b4:      87 2f           mov     r24, r23
+    16b6:      76 2f           mov     r23, r22
+    16b8:      05 c0           rjmp    .+10            ; 0x16c4 <__floatsisf+0x5e>
+    16ba:      66 23           and     r22, r22
+    16bc:      71 f0           breq    .+28            ; 0x16da <__floatsisf+0x74>
+    16be:      96 e8           ldi     r25, 0x86       ; 134
+    16c0:      86 2f           mov     r24, r22
+    16c2:      70 e0           ldi     r23, 0x00       ; 0
+    16c4:      60 e0           ldi     r22, 0x00       ; 0
+    16c6:      2a f0           brmi    .+10            ; 0x16d2 <__floatsisf+0x6c>
+    16c8:      9a 95           dec     r25
+    16ca:      66 0f           add     r22, r22
+    16cc:      77 1f           adc     r23, r23
+    16ce:      88 1f           adc     r24, r24
+    16d0:      da f7           brpl    .-10            ; 0x16c8 <__floatsisf+0x62>
+    16d2:      88 0f           add     r24, r24
+    16d4:      96 95           lsr     r25
+    16d6:      87 95           ror     r24
+    16d8:      97 f9           bld     r25, 7
+    16da:      08 95           ret
+
+000016dc <__fp_cmp>:
+    16dc:      99 0f           add     r25, r25
+    16de:      00 08           sbc     r0, r0
+    16e0:      55 0f           add     r21, r21
+    16e2:      aa 0b           sbc     r26, r26
+    16e4:      e0 e8           ldi     r30, 0x80       ; 128
+    16e6:      fe ef           ldi     r31, 0xFE       ; 254
+    16e8:      16 16           cp      r1, r22
+    16ea:      17 06           cpc     r1, r23
+    16ec:      e8 07           cpc     r30, r24
+    16ee:      f9 07           cpc     r31, r25
+    16f0:      c0 f0           brcs    .+48            ; 0x1722 <__fp_cmp+0x46>
+    16f2:      12 16           cp      r1, r18
+    16f4:      13 06           cpc     r1, r19
+    16f6:      e4 07           cpc     r30, r20
+    16f8:      f5 07           cpc     r31, r21
+    16fa:      98 f0           brcs    .+38            ; 0x1722 <__fp_cmp+0x46>
+    16fc:      62 1b           sub     r22, r18
+    16fe:      73 0b           sbc     r23, r19
+    1700:      84 0b           sbc     r24, r20
+    1702:      95 0b           sbc     r25, r21
+    1704:      39 f4           brne    .+14            ; 0x1714 <__fp_cmp+0x38>
+    1706:      0a 26           eor     r0, r26
+    1708:      61 f0           breq    .+24            ; 0x1722 <__fp_cmp+0x46>
+    170a:      23 2b           or      r18, r19
+    170c:      24 2b           or      r18, r20
+    170e:      25 2b           or      r18, r21
+    1710:      21 f4           brne    .+8             ; 0x171a <__fp_cmp+0x3e>
+    1712:      08 95           ret
+    1714:      0a 26           eor     r0, r26
+    1716:      09 f4           brne    .+2             ; 0x171a <__fp_cmp+0x3e>
+    1718:      a1 40           sbci    r26, 0x01       ; 1
+    171a:      a6 95           lsr     r26
+    171c:      8f ef           ldi     r24, 0xFF       ; 255
+    171e:      81 1d           adc     r24, r1
+    1720:      81 1d           adc     r24, r1
+    1722:      08 95           ret
+
+00001724 <__fp_inf>:
+    1724:      97 f9           bld     r25, 7
+    1726:      9f 67           ori     r25, 0x7F       ; 127
+    1728:      80 e8           ldi     r24, 0x80       ; 128
+    172a:      70 e0           ldi     r23, 0x00       ; 0
+    172c:      60 e0           ldi     r22, 0x00       ; 0
+    172e:      08 95           ret
+
+00001730 <__fp_nan>:
+    1730:      9f ef           ldi     r25, 0xFF       ; 255
+    1732:      80 ec           ldi     r24, 0xC0       ; 192
+    1734:      08 95           ret
+
+00001736 <__fp_pscA>:
+    1736:      00 24           eor     r0, r0
+    1738:      0a 94           dec     r0
+    173a:      16 16           cp      r1, r22
+    173c:      17 06           cpc     r1, r23
+    173e:      18 06           cpc     r1, r24
+    1740:      09 06           cpc     r0, r25
+    1742:      08 95           ret
+
+00001744 <__fp_pscB>:
+    1744:      00 24           eor     r0, r0
+    1746:      0a 94           dec     r0
+    1748:      12 16           cp      r1, r18
+    174a:      13 06           cpc     r1, r19
+    174c:      14 06           cpc     r1, r20
+    174e:      05 06           cpc     r0, r21
+    1750:      08 95           ret
+
+00001752 <__fp_round>:
+    1752:      09 2e           mov     r0, r25
+    1754:      03 94           inc     r0
+    1756:      00 0c           add     r0, r0
+    1758:      11 f4           brne    .+4             ; 0x175e <__fp_round+0xc>
+    175a:      88 23           and     r24, r24
+    175c:      52 f0           brmi    .+20            ; 0x1772 <__fp_round+0x20>
+    175e:      bb 0f           add     r27, r27
+    1760:      40 f4           brcc    .+16            ; 0x1772 <__fp_round+0x20>
+    1762:      bf 2b           or      r27, r31
+    1764:      11 f4           brne    .+4             ; 0x176a <__fp_round+0x18>
+    1766:      60 ff           sbrs    r22, 0
+    1768:      04 c0           rjmp    .+8             ; 0x1772 <__fp_round+0x20>
+    176a:      6f 5f           subi    r22, 0xFF       ; 255
+    176c:      7f 4f           sbci    r23, 0xFF       ; 255
+    176e:      8f 4f           sbci    r24, 0xFF       ; 255
+    1770:      9f 4f           sbci    r25, 0xFF       ; 255
+    1772:      08 95           ret
+
+00001774 <__fp_split3>:
+    1774:      57 fd           sbrc    r21, 7
+    1776:      90 58           subi    r25, 0x80       ; 128
+    1778:      44 0f           add     r20, r20
+    177a:      55 1f           adc     r21, r21
+    177c:      59 f0           breq    .+22            ; 0x1794 <__fp_splitA+0x10>
+    177e:      5f 3f           cpi     r21, 0xFF       ; 255
+    1780:      71 f0           breq    .+28            ; 0x179e <__fp_splitA+0x1a>
+    1782:      47 95           ror     r20
+
+00001784 <__fp_splitA>:
+    1784:      88 0f           add     r24, r24
+    1786:      97 fb           bst     r25, 7
+    1788:      99 1f           adc     r25, r25
+    178a:      61 f0           breq    .+24            ; 0x17a4 <__fp_splitA+0x20>
+    178c:      9f 3f           cpi     r25, 0xFF       ; 255
+    178e:      79 f0           breq    .+30            ; 0x17ae <__fp_splitA+0x2a>
+    1790:      87 95           ror     r24
+    1792:      08 95           ret
+    1794:      12 16           cp      r1, r18
+    1796:      13 06           cpc     r1, r19
+    1798:      14 06           cpc     r1, r20
+    179a:      55 1f           adc     r21, r21
+    179c:      f2 cf           rjmp    .-28            ; 0x1782 <__fp_split3+0xe>
+    179e:      46 95           lsr     r20
+    17a0:      f1 df           rcall   .-30            ; 0x1784 <__fp_splitA>
+    17a2:      08 c0           rjmp    .+16            ; 0x17b4 <__fp_splitA+0x30>
+    17a4:      16 16           cp      r1, r22
+    17a6:      17 06           cpc     r1, r23
+    17a8:      18 06           cpc     r1, r24
+    17aa:      99 1f           adc     r25, r25
+    17ac:      f1 cf           rjmp    .-30            ; 0x1790 <__fp_splitA+0xc>
+    17ae:      86 95           lsr     r24
+    17b0:      71 05           cpc     r23, r1
+    17b2:      61 05           cpc     r22, r1
+    17b4:      08 94           sec
+    17b6:      08 95           ret
+
+000017b8 <__fp_zero>:
+    17b8:      e8 94           clt
+
+000017ba <__fp_szero>:
+    17ba:      bb 27           eor     r27, r27
+    17bc:      66 27           eor     r22, r22
+    17be:      77 27           eor     r23, r23
+    17c0:      cb 01           movw    r24, r22
+    17c2:      97 f9           bld     r25, 7
+    17c4:      08 95           ret
+
+000017c6 <__gesf2>:
+    17c6:      8a df           rcall   .-236           ; 0x16dc <__fp_cmp>
+    17c8:      08 f4           brcc    .+2             ; 0x17cc <__gesf2+0x6>
+    17ca:      8f ef           ldi     r24, 0xFF       ; 255
+    17cc:      08 95           ret
+
+000017ce <__udivmodsi4>:
+    17ce:      a1 e2           ldi     r26, 0x21       ; 33
+    17d0:      1a 2e           mov     r1, r26
+    17d2:      aa 1b           sub     r26, r26
+    17d4:      bb 1b           sub     r27, r27
+    17d6:      fd 01           movw    r30, r26
+    17d8:      0d c0           rjmp    .+26            ; 0x17f4 <__udivmodsi4_ep>
+
+000017da <__udivmodsi4_loop>:
+    17da:      aa 1f           adc     r26, r26
+    17dc:      bb 1f           adc     r27, r27
+    17de:      ee 1f           adc     r30, r30
+    17e0:      ff 1f           adc     r31, r31
+    17e2:      a2 17           cp      r26, r18
+    17e4:      b3 07           cpc     r27, r19
+    17e6:      e4 07           cpc     r30, r20
+    17e8:      f5 07           cpc     r31, r21
+    17ea:      20 f0           brcs    .+8             ; 0x17f4 <__udivmodsi4_ep>
+    17ec:      a2 1b           sub     r26, r18
+    17ee:      b3 0b           sbc     r27, r19
+    17f0:      e4 0b           sbc     r30, r20
+    17f2:      f5 0b           sbc     r31, r21
+
+000017f4 <__udivmodsi4_ep>:
+    17f4:      66 1f           adc     r22, r22
+    17f6:      77 1f           adc     r23, r23
+    17f8:      88 1f           adc     r24, r24
+    17fa:      99 1f           adc     r25, r25
+    17fc:      1a 94           dec     r1
+    17fe:      69 f7           brne    .-38            ; 0x17da <__udivmodsi4_loop>
+    1800:      60 95           com     r22
+    1802:      70 95           com     r23
+    1804:      80 95           com     r24
+    1806:      90 95           com     r25
+    1808:      9b 01           movw    r18, r22
+    180a:      ac 01           movw    r20, r24
+    180c:      bd 01           movw    r22, r26
+    180e:      cf 01           movw    r24, r30
+    1810:      08 95           ret
+
+00001812 <_exit>:
+    1812:      f8 94           cli
+
+00001814 <__stop_program>:
+    1814:      ff cf           rjmp    .-2             ; 0x1814 <__stop_program>
diff --git a/firmware/USBtoSerial.map b/firmware/USBtoSerial.map
new file mode 100644 (file)
index 0000000..81032a2
--- /dev/null
@@ -0,0 +1,1713 @@
+Archive member included because of file (symbol)
+
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o)
+                              USBtoSerial.o (__subsf3)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o)
+                              /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o) (__addsf3x)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o)
+                              USBtoSerial.o (__ltsf2)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3.o)
+                              USBtoSerial.o (__divsf3)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o)
+                              /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3.o) (__divsf3x)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fixunssfsi.o)
+                              USBtoSerial.o (__fixunssfsi)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(floatsisf.o)
+                              USBtoSerial.o (__floatunsisf)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_cmp.o)
+                              /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o) (__fp_cmp)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_inf.o)
+                              /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o) (__fp_inf)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_nan.o)
+                              /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o) (__fp_nan)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscA.o)
+                              /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o) (__fp_pscA)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscB.o)
+                              /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o) (__fp_pscB)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_round.o)
+                              /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o) (__fp_round)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_split3.o)
+                              /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o) (__fp_split3)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_zero.o)
+                              /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o) (__fp_zero)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(gesf2.o)
+                              USBtoSerial.o (__gtsf2)
+/usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulhi3.o)
+                              ../../LUFA/Drivers/USB/Class/Common/HIDParser.o (__mulhi3)
+/usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodhi4.o)
+                              USBtoSerial.o (__udivmodhi4)
+/usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodsi4.o)
+                              USBtoSerial.o (__udivmodsi4)
+/usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o)
+                              /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o (exit)
+/usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_copy_data.o)
+                              USBtoSerial.o (__do_copy_data)
+/usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_clear_bss.o)
+                              USBtoSerial.o (__do_clear_bss)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy_P.o)
+                              ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o (memcpy_P)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcmp.o)
+                              ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o (memcmp)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy.o)
+                              ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o (memcpy)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memset.o)
+                              ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o (memset)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eerd_byte_atmega32u2.o)
+                              ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o (__eerd_byte_m32u2)
+/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eeupd_byte_atmega32u2.o)
+                              ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o (__eeupd_byte_m32u2)
+
+Allocating common symbols
+Common symbol       size              file
+
+adb_werte           0x9               USBtoSerial.o
+USB_IsInitialized   0x1               ../../LUFA/Drivers/USB/Core/USBTask.o
+USB_Device_ConfigurationNumber
+                    0x1               ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+USB_Device_CurrentlySelfPowered
+                    0x1               ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+USB_ControlRequest  0x8               ../../LUFA/Drivers/USB/Core/USBTask.o
+USB_Device_RemoteWakeupEnabled
+                    0x1               ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+t0ovfcount          0x1               USBtoSerial.o
+adb_data_length     0x1               USBtoSerial.o
+
+Discarded input sections
+
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+ .text          0x0000000000000000        0x0 USBtoSerial.o
+ .text.touchpad_set_abs_mode
+                0x0000000000000000       0x30 USBtoSerial.o
+ .text.touchpad_set_rel_mode_100dpi
+                0x0000000000000000       0x18 USBtoSerial.o
+ .text.touchpad_set_rel_mode_200dpi
+                0x0000000000000000       0x18 USBtoSerial.o
+ .text.z_pressure
+                0x0000000000000000       0x16 USBtoSerial.o
+ .text.x_abs    0x0000000000000000       0x3c USBtoSerial.o
+ .text.y_abs    0x0000000000000000       0x3e USBtoSerial.o
+ .text.decode_field
+                0x0000000000000000       0x8c USBtoSerial.o
+ .text          0x0000000000000000        0x0 Descriptors.o
+ .data          0x0000000000000000        0x0 Descriptors.o
+ .bss           0x0000000000000000        0x0 Descriptors.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+ .text.USB_ProcessHIDReport
+                0x0000000000000000      0x836 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+ .text.USB_GetHIDReportItemInfo
+                0x0000000000000000       0xbc ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+ .text.USB_SetHIDReportItemInfo
+                0x0000000000000000       0xc8 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+ .text.USB_GetHIDReportSize
+                0x0000000000000000       0x58 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o
+ .text.USB_Device_SendRemoteWakeup
+                0x0000000000000000       0x2c ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Discard_Stream
+                0x0000000000000000       0x8e ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Null_Stream
+                0x0000000000000000       0x8e ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Write_Stream_LE
+                0x0000000000000000       0xbe ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Write_Stream_BE
+                0x0000000000000000       0xae ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Read_Stream_LE
+                0x0000000000000000       0xbe ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Read_Stream_BE
+                0x0000000000000000       0xae ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Write_PStream_LE
+                0x0000000000000000       0xc2 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Write_PStream_BE
+                0x0000000000000000       0xae ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Write_EStream_LE
+                0x0000000000000000       0xc4 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Write_EStream_BE
+                0x0000000000000000       0xb0 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Read_EStream_LE
+                0x0000000000000000       0xc2 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Read_EStream_BE
+                0x0000000000000000       0xb2 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Write_Control_Stream_BE
+                0x0000000000000000       0xb8 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Read_Control_Stream_LE
+                0x0000000000000000       0x78 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Read_Control_Stream_BE
+                0x0000000000000000       0x7a ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Write_Control_PStream_BE
+                0x0000000000000000       0xba ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Write_Control_EStream_LE
+                0x0000000000000000       0xcc ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Write_Control_EStream_BE
+                0x0000000000000000       0xda ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Read_Control_EStream_LE
+                0x0000000000000000       0x84 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text.Endpoint_Read_Control_EStream_BE
+                0x0000000000000000       0x8a ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+ .text.Endpoint_ClearEndpoints
+                0x0000000000000000       0x2c ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+ .text.USB_Disable
+                0x0000000000000000       0x2e ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+ .text.USB_GetNextDescriptorOfType
+                0x0000000000000000       0x4c ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+ .text.USB_GetNextDescriptorOfTypeBefore
+                0x0000000000000000       0x56 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+ .text.USB_GetNextDescriptorOfTypeAfter
+                0x0000000000000000       0x34 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+ .text.USB_GetNextDescriptorComp
+                0x0000000000000000       0x86 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/Events.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/Events.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/Events.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/HostStandardReq.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/HostStandardReq.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/HostStandardReq.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/USBTask.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/USBTask.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Core/USBTask.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+ .text.Audio_Device_ProcessControlRequest
+                0x0000000000000000      0x316 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+ .text.Audio_Device_ConfigureEndpoints
+                0x0000000000000000       0x30 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+ .text.Audio_Device_Event_Stub
+                0x0000000000000000        0x2 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .data          0x0000000000000000        0x8 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .text.CDC_Device_SendString
+                0x0000000000000000       0x46 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .text.CDC_Device_SendData
+                0x0000000000000000       0x38 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .text.CDC_Device_putchar
+                0x0000000000000000       0x20 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .text.CDC_Device_BytesReceived
+                0x0000000000000000       0x4e ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .text.CDC_Device_getchar_Blocking
+                0x0000000000000000       0x36 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .text.CDC_Device_getchar
+                0x0000000000000000       0x18 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .text.CDC_Device_SendControlLineStateChange
+                0x0000000000000000       0x8c ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .text.CDC_Device_CreateStream
+                0x0000000000000000       0x26 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .text.CDC_Device_CreateBlockingStream
+                0x0000000000000000       0x26 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+ .text.HID_Device_ProcessControlRequest
+                0x0000000000000000      0x28c ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+ .text.HID_Device_ConfigureEndpoints
+                0x0000000000000000       0x34 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+ .text.HID_Device_USBTask
+                0x0000000000000000      0x1a0 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+ .text.MS_Device_ProcessControlRequest
+                0x0000000000000000       0x7e ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+ .text.MS_Device_ConfigureEndpoints
+                0x0000000000000000       0x3c ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+ .text.MS_Device_USBTask
+                0x0000000000000000      0x266 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+ .text.MIDI_Device_ConfigureEndpoints
+                0x0000000000000000       0x30 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+ .text.MIDI_Device_SendEventPacket
+                0x0000000000000000       0x3a ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+ .text.MIDI_Device_Flush
+                0x0000000000000000       0x30 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+ .text.MIDI_Device_USBTask
+                0x0000000000000000       0x1e ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+ .text.MIDI_Device_ReceiveEventPacket
+                0x0000000000000000       0x44 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+ .data          0x0000000000000000        0x8 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+ .text.RNDIS_Device_ProcessControlRequest
+                0x0000000000000000      0x5bc ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+ .text.RNDIS_Device_ConfigureEndpoints
+                0x0000000000000000       0x4e ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+ .text.RNDIS_Device_USBTask
+                0x0000000000000000       0x86 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+ .text.RNDIS_Device_IsPacketReceived
+                0x0000000000000000       0x2e ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+ .text.RNDIS_Device_ReadPacket
+                0x0000000000000000       0xbe ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+ .text.RNDIS_Device_SendPacket
+                0x0000000000000000       0xde ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+ .progmem.data  0x0000000000000000       0x6c ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o
+ .text          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o
+ .data          0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o
+ .bss           0x0000000000000000        0x0 ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fixunssfsi.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fixunssfsi.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fixunssfsi.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(floatsisf.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(floatsisf.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(floatsisf.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_cmp.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_cmp.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_cmp.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_inf.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_inf.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_inf.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_nan.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_nan.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_nan.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscA.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscA.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscA.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscB.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscB.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscB.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_round.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_round.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_round.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_split3.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_split3.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_split3.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_zero.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_zero.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_zero.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(gesf2.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(gesf2.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(gesf2.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulhi3.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulhi3.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulhi3.o)
+ .text.libgcc   0x0000000000000000       0x24 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulhi3.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodhi4.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodhi4.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodhi4.o)
+ .text.libgcc   0x0000000000000000       0x28 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodhi4.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodsi4.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodsi4.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodsi4.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o)
+ .text.libgcc   0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_copy_data.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_copy_data.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_copy_data.o)
+ .text.libgcc   0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_copy_data.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_clear_bss.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_clear_bss.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_clear_bss.o)
+ .text.libgcc   0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_clear_bss.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy_P.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy_P.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy_P.o)
+ .text.avr-libc
+                0x0000000000000000       0x12 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy_P.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcmp.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcmp.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcmp.o)
+ .text.avr-libc
+                0x0000000000000000       0x1a /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcmp.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy.o)
+ .text.avr-libc
+                0x0000000000000000       0x12 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memset.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memset.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memset.o)
+ .text.avr-libc
+                0x0000000000000000        0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memset.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eerd_byte_atmega32u2.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eerd_byte_atmega32u2.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eerd_byte_atmega32u2.o)
+ .text.avr-libc
+                0x0000000000000000       0x10 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eerd_byte_atmega32u2.o)
+ .text          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eeupd_byte_atmega32u2.o)
+ .data          0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eeupd_byte_atmega32u2.o)
+ .bss           0x0000000000000000        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eeupd_byte_atmega32u2.o)
+ .text.avr-libc
+                0x0000000000000000       0x24 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eeupd_byte_atmega32u2.o)
+
+Memory Configuration
+
+Name             Origin             Length             Attributes
+text             0x0000000000000000 0x0000000000010000 xr
+data             0x0000000000800060 0x000000000000ffa0 rw !x
+eeprom           0x0000000000810000 0x0000000000010000 rw !x
+fuse             0x0000000000820000 0x0000000000000400 rw !x
+lock             0x0000000000830000 0x0000000000000400 rw !x
+signature        0x0000000000840000 0x0000000000000400 rw !x
+*default*        0x0000000000000000 0xffffffffffffffff
+
+Linker script and memory map
+
+Address of section .data set to 0x800100
+LOAD /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+LOAD USBtoSerial.o
+LOAD Descriptors.o
+LOAD ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+LOAD ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o
+LOAD ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+LOAD ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+LOAD ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o
+LOAD ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o
+LOAD ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o
+LOAD ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+LOAD ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+LOAD ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+LOAD ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+LOAD ../../LUFA/Drivers/USB/Core/Events.o
+LOAD ../../LUFA/Drivers/USB/Core/HostStandardReq.o
+LOAD ../../LUFA/Drivers/USB/Core/USBTask.o
+LOAD ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+LOAD ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+LOAD ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+LOAD ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+LOAD ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+LOAD ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+LOAD ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o
+LOAD ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o
+LOAD ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o
+LOAD ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o
+LOAD ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o
+LOAD ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o
+LOAD ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o
+LOAD ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o
+LOAD ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o
+LOAD /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a
+LOAD /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a
+LOAD /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a
+LOAD /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a
+
+.hash
+ *(.hash)
+
+.dynsym
+ *(.dynsym)
+
+.dynstr
+ *(.dynstr)
+
+.gnu.version
+ *(.gnu.version)
+
+.gnu.version_d
+ *(.gnu.version_d)
+
+.gnu.version_r
+ *(.gnu.version_r)
+
+.rel.init
+ *(.rel.init)
+
+.rela.init
+ *(.rela.init)
+
+.rel.text
+ *(.rel.text)
+ *(.rel.text.*)
+ *(.rel.gnu.linkonce.t*)
+
+.rela.text
+ *(.rela.text)
+ *(.rela.text.*)
+ *(.rela.gnu.linkonce.t*)
+
+.rel.fini
+ *(.rel.fini)
+
+.rela.fini
+ *(.rela.fini)
+
+.rel.rodata
+ *(.rel.rodata)
+ *(.rel.rodata.*)
+ *(.rel.gnu.linkonce.r*)
+
+.rela.rodata
+ *(.rela.rodata)
+ *(.rela.rodata.*)
+ *(.rela.gnu.linkonce.r*)
+
+.rel.data
+ *(.rel.data)
+ *(.rel.data.*)
+ *(.rel.gnu.linkonce.d*)
+
+.rela.data
+ *(.rela.data)
+ *(.rela.data.*)
+ *(.rela.gnu.linkonce.d*)
+
+.rel.ctors
+ *(.rel.ctors)
+
+.rela.ctors
+ *(.rela.ctors)
+
+.rel.dtors
+ *(.rel.dtors)
+
+.rela.dtors
+ *(.rela.dtors)
+
+.rel.got
+ *(.rel.got)
+
+.rela.got
+ *(.rela.got)
+
+.rel.bss
+ *(.rel.bss)
+
+.rela.bss
+ *(.rela.bss)
+
+.rel.plt
+ *(.rel.plt)
+
+.rela.plt
+ *(.rela.plt)
+
+.text           0x0000000000000000     0x1816
+ *(.vectors)
+ .vectors       0x0000000000000000       0x98 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+                0x0000000000000000                __vectors
+                0x0000000000000000                __vector_default
+ *(.vectors)
+ *(.progmem.gcc*)
+ *(.progmem*)
+ .progmem.data  0x0000000000000098       0x9e Descriptors.o
+                0x0000000000000098                DeviceDescriptor
+                0x00000000000000aa                ConfigurationDescriptor
+                0x00000000000000e8                LanguageString
+                0x00000000000000ec                ManufacturerString
+                0x0000000000000106                ProductString
+                0x0000000000000136                . = ALIGN (0x2)
+                0x0000000000000136                __trampolines_start = .
+ *(.trampolines)
+ .trampolines   0x0000000000000136        0x0 linker stubs
+ *(.trampolines*)
+                0x0000000000000136                __trampolines_end = .
+ *(.jumptables)
+ *(.jumptables*)
+ *(.lowtext)
+ *(.lowtext*)
+                0x0000000000000136                __ctors_start = .
+ *(.ctors)
+                0x0000000000000136                __ctors_end = .
+                0x0000000000000136                __dtors_start = .
+ *(.dtors)
+                0x0000000000000136                __dtors_end = .
+ SORT(*)(.ctors)
+ SORT(*)(.dtors)
+ *(.init0)
+ .init0         0x0000000000000136        0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+                0x0000000000000136                __init
+ *(.init0)
+ *(.init1)
+ *(.init1)
+ *(.init2)
+ .init2         0x0000000000000136        0xc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+ *(.init2)
+ *(.init3)
+ *(.init3)
+ *(.init4)
+ .init4         0x0000000000000142       0x16 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_copy_data.o)
+                0x0000000000000142                __do_copy_data
+ .init4         0x0000000000000158       0x10 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_clear_bss.o)
+                0x0000000000000158                __do_clear_bss
+ *(.init4)
+ *(.init5)
+ *(.init5)
+ *(.init6)
+ *(.init6)
+ *(.init7)
+ *(.init7)
+ *(.init8)
+ *(.init8)
+ *(.init9)
+ .init9         0x0000000000000168        0x6 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+ *(.init9)
+ *(.text)
+ .text          0x000000000000016e        0x2 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+                0x000000000000016e                __vector_22
+                0x000000000000016e                __vector_28
+                0x000000000000016e                __vector_1
+                0x000000000000016e                __vector_32
+                0x000000000000016e                __vector_34
+                0x000000000000016e                __vector_24
+                0x000000000000016e                __bad_interrupt
+                0x000000000000016e                __vector_6
+                0x000000000000016e                __vector_31
+                0x000000000000016e                __vector_35
+                0x000000000000016e                __vector_3
+                0x000000000000016e                __vector_30
+                0x000000000000016e                __vector_25
+                0x000000000000016e                __vector_13
+                0x000000000000016e                __vector_17
+                0x000000000000016e                __vector_19
+                0x000000000000016e                __vector_7
+                0x000000000000016e                __vector_27
+                0x000000000000016e                __vector_5
+                0x000000000000016e                __vector_33
+                0x000000000000016e                __vector_37
+                0x000000000000016e                __vector_4
+                0x000000000000016e                __vector_9
+                0x000000000000016e                __vector_2
+                0x000000000000016e                __vector_15
+                0x000000000000016e                __vector_36
+                0x000000000000016e                __vector_29
+                0x000000000000016e                __vector_8
+                0x000000000000016e                __vector_26
+                0x000000000000016e                __vector_14
+                0x000000000000016e                __vector_10
+                0x000000000000016e                __vector_16
+                0x000000000000016e                __vector_18
+                0x000000000000016e                __vector_20
+                0x0000000000000170                . = ALIGN (0x2)
+ *(.text.*)
+ .text.RingBuffer_Insert
+                0x0000000000000170       0x36 USBtoSerial.o
+ .text.RingBuffer_Remove
+                0x00000000000001a6       0x32 USBtoSerial.o
+ .text.RingBuffer_InitBuffer.clone.0
+                0x00000000000001d8       0x2a USBtoSerial.o
+ .text.__vector_21
+                0x0000000000000202       0x22 USBtoSerial.o
+                0x0000000000000202                __vector_21
+ .text.t0ext    0x0000000000000224       0x10 USBtoSerial.o
+                0x0000000000000224                t0ext
+ .text.t0rst    0x0000000000000234        0x8 USBtoSerial.o
+                0x0000000000000234                t0rst
+ .text.adb      0x000000000000023c      0x220 USBtoSerial.o
+                0x000000000000023c                adb
+ .text.touchpad_init
+                0x000000000000045c       0x10 USBtoSerial.o
+                0x000000000000045c                touchpad_init
+ .text.touchpad_read
+                0x000000000000046c       0x12 USBtoSerial.o
+                0x000000000000046c                touchpad_read
+ .text.delta_y  0x000000000000047e       0x20 USBtoSerial.o
+                0x000000000000047e                delta_y
+ .text.delta_x  0x000000000000049e       0x20 USBtoSerial.o
+                0x000000000000049e                delta_x
+ .text.Usb2SerialTask
+                0x00000000000004be       0xb2 USBtoSerial.o
+                0x00000000000004be                Usb2SerialTask
+ .text.SetupHardware
+                0x0000000000000570       0x2a USBtoSerial.o
+                0x0000000000000570                SetupHardware
+ .text.EVENT_USB_Device_Connect
+                0x000000000000059a        0x2 USBtoSerial.o
+                0x000000000000059a                EVENT_USB_Device_Connect
+ .text.EVENT_USB_Device_Disconnect
+                0x000000000000059c        0x2 USBtoSerial.o
+                0x000000000000059c                EVENT_USB_Device_Disconnect
+ .text.EVENT_USB_Device_ConfigurationChanged
+                0x000000000000059e        0x6 USBtoSerial.o
+                0x000000000000059e                EVENT_USB_Device_ConfigurationChanged
+ .text.EVENT_USB_Device_ControlRequest
+                0x00000000000005a4        0x6 USBtoSerial.o
+                0x00000000000005a4                EVENT_USB_Device_ControlRequest
+ .text.__vector_23
+                0x00000000000005aa       0x54 USBtoSerial.o
+                0x00000000000005aa                __vector_23
+ .text.EVENT_CDC_Device_LineEncodingChanged
+                0x00000000000005fe       0xc0 USBtoSerial.o
+                0x00000000000005fe                EVENT_CDC_Device_LineEncodingChanged
+ .text.uart_putc
+                0x00000000000006be       0x10 USBtoSerial.o
+                0x00000000000006be                uart_putc
+ .text.uart_puts
+                0x00000000000006ce       0x26 USBtoSerial.o
+                0x00000000000006ce                uart_puts
+ .text.my_uitoa
+                0x00000000000006f4       0xd0 USBtoSerial.o
+                0x00000000000006f4                my_uitoa
+ .text.main     0x00000000000007c4      0x122 USBtoSerial.o
+                0x00000000000007c4                main
+ .text.CALLBACK_USB_GetDescriptor
+                0x00000000000008e6       0x5a Descriptors.o
+                0x00000000000008e6                CALLBACK_USB_GetDescriptor
+ .text.Endpoint_Write_Control_Stream_LE
+                0x0000000000000940       0xb4 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+                0x0000000000000940                Endpoint_Write_Control_Stream_LE
+ .text.Endpoint_Write_Control_PStream_LE
+                0x00000000000009f4       0xb6 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+                0x00000000000009f4                Endpoint_Write_Control_PStream_LE
+ .text.Endpoint_ConfigureEndpoint_Prv
+                0x0000000000000aaa       0x6e ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+                0x0000000000000aaa                Endpoint_ConfigureEndpoint_Prv
+ .text.Endpoint_ConfigureEndpointTable
+                0x0000000000000b18       0x88 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+                0x0000000000000b18                Endpoint_ConfigureEndpointTable
+ .text.Endpoint_ClearStatusStage
+                0x0000000000000ba0       0x3e ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+                0x0000000000000ba0                Endpoint_ClearStatusStage
+ .text.Endpoint_WaitUntilReady
+                0x0000000000000bde       0x66 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+                0x0000000000000bde                Endpoint_WaitUntilReady
+ .text.USB_ResetInterface
+                0x0000000000000c44       0x70 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+                0x0000000000000c44                USB_ResetInterface
+ .text.USB_Init
+                0x0000000000000cb4       0x12 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+                0x0000000000000cb4                USB_Init
+ .text.USB_INT_DisableAllInterrupts
+                0x0000000000000cc6        0x6 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+                0x0000000000000cc6                USB_INT_DisableAllInterrupts
+ .text.USB_INT_ClearAllInterrupts
+                0x0000000000000ccc        0x6 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+                0x0000000000000ccc                USB_INT_ClearAllInterrupts
+ .text.__vector_11
+                0x0000000000000cd2      0x148 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+                0x0000000000000cd2                __vector_11
+ .text.__vector_12
+                0x0000000000000e1a       0x76 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+                0x0000000000000e1a                __vector_12
+ .text.USB_Device_ProcessControlRequest
+                0x0000000000000e90      0x2c2 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+                0x0000000000000e90                USB_Device_ProcessControlRequest
+ .text.USB_Event_Stub
+                0x0000000000001152        0x2 ../../LUFA/Drivers/USB/Core/Events.o
+                0x0000000000001152                EVENT_USB_Device_WakeUp
+                0x0000000000001152                USB_Event_Stub
+                0x0000000000001152                EVENT_USB_Device_Suspend
+                0x0000000000001152                EVENT_USB_Device_StartOfFrame
+                0x0000000000001152                EVENT_USB_Device_Reset
+ .text.USB_USBTask
+                0x0000000000001154       0x36 ../../LUFA/Drivers/USB/Core/USBTask.o
+                0x0000000000001154                USB_USBTask
+ .text.CDC_Device_ProcessControlRequest
+                0x000000000000118a      0x158 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                0x000000000000118a                CDC_Device_ProcessControlRequest
+ .text.CDC_Device_ConfigureEndpoints
+                0x00000000000012e2       0x48 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                0x00000000000012e2                CDC_Device_ConfigureEndpoints
+ .text.CDC_Device_SendByte
+                0x000000000000132a       0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                0x000000000000132a                CDC_Device_SendByte
+ .text.CDC_Device_Flush
+                0x0000000000001384       0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                0x0000000000001384                CDC_Device_Flush
+ .text.CDC_Device_USBTask
+                0x00000000000013de       0x2e ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                0x00000000000013de                CDC_Device_USBTask
+ .text.CDC_Device_ReceiveByte
+                0x000000000000140c       0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                0x000000000000140c                CDC_Device_ReceiveByte
+ .text.CDC_Device_Event_Stub
+                0x0000000000001466        0x2 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                0x0000000000001466                EVENT_CDC_Device_ControLineStateChanged
+                0x0000000000001466                EVENT_CDC_Device_BreakSent
+                0x0000000000001466                CDC_Device_Event_Stub
+ .text.avr-libc.fplib
+                0x0000000000001468        0xa /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o)
+                0x0000000000001468                __subsf3
+                0x000000000000146a                __addsf3
+ .text.avr-libc.fplib
+                0x0000000000001472       0xc0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o)
+                0x000000000000148c                __addsf3x
+ .text.avr-libc.fplib
+                0x0000000000001532        0x8 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o)
+                0x0000000000001532                __lesf2
+                0x0000000000001532                __nesf2
+                0x0000000000001532                __eqsf2
+                0x0000000000001532                __cmpsf2
+                0x0000000000001532                __ltsf2
+ .text.avr-libc.fplib
+                0x000000000000153a        0x4 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3.o)
+                0x000000000000153a                __divsf3
+ .text.avr-libc.fplib
+                0x000000000000153e       0xcc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o)
+                0x0000000000001554                __divsf3x
+                0x0000000000001558                __divsf3_pse
+ .text.avr-libc.fplib
+                0x000000000000160a       0x58 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fixunssfsi.o)
+                0x000000000000160a                __fixunssfsi
+ .text.avr-libc.fplib
+                0x0000000000001662       0x7a /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(floatsisf.o)
+                0x0000000000001662                __floatunsisf
+                0x0000000000001666                __floatsisf
+ .text.avr-libc.fplib
+                0x00000000000016dc       0x48 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_cmp.o)
+                0x00000000000016dc                __fp_cmp
+ .text.avr-libc.fplib
+                0x0000000000001724        0xc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_inf.o)
+                0x0000000000001724                __fp_inf
+ .text.avr-libc.fplib
+                0x0000000000001730        0x6 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_nan.o)
+                0x0000000000001730                __fp_nan
+ .text.avr-libc.fplib
+                0x0000000000001736        0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscA.o)
+                0x0000000000001736                __fp_pscA
+ .text.avr-libc.fplib
+                0x0000000000001744        0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscB.o)
+                0x0000000000001744                __fp_pscB
+ .text.avr-libc.fplib
+                0x0000000000001752       0x22 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_round.o)
+                0x0000000000001752                __fp_round
+ .text.avr-libc.fplib
+                0x0000000000001774       0x44 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_split3.o)
+                0x0000000000001774                __fp_split3
+                0x0000000000001784                __fp_splitA
+ .text.avr-libc.fplib
+                0x00000000000017b8        0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_zero.o)
+                0x00000000000017b8                __fp_zero
+                0x00000000000017ba                __fp_szero
+ .text.avr-libc.fplib
+                0x00000000000017c6        0x8 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(gesf2.o)
+                0x00000000000017c6                __gtsf2
+                0x00000000000017c6                __gesf2
+ .text.libgcc   0x00000000000017ce       0x44 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodsi4.o)
+                0x00000000000017ce                __udivmodsi4
+                0x0000000000001812                . = ALIGN (0x2)
+ *(.fini9)
+ .fini9         0x0000000000001812        0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o)
+                0x0000000000001812                exit
+                0x0000000000001812                _exit
+ *(.fini9)
+ *(.fini8)
+ *(.fini8)
+ *(.fini7)
+ *(.fini7)
+ *(.fini6)
+ *(.fini6)
+ *(.fini5)
+ *(.fini5)
+ *(.fini4)
+ *(.fini4)
+ *(.fini3)
+ *(.fini3)
+ *(.fini2)
+ *(.fini2)
+ *(.fini1)
+ *(.fini1)
+ *(.fini0)
+ .fini0         0x0000000000001812        0x4 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o)
+ *(.fini0)
+                0x0000000000001816                _etext = .
+
+.data           0x0000000000800100       0x6e load address 0x0000000000001816
+                0x0000000000800100                PROVIDE (__data_start, .)
+ *(.data)
+ .data          0x0000000000800100       0x6d USBtoSerial.o
+                0x0000000000800150                VirtualSerial_CDC_Interface
+ *(.data*)
+ *(.rodata)
+ *(.rodata*)
+ *(.gnu.linkonce.d*)
+                0x000000000080016e                . = ALIGN (0x2)
+ *fill*         0x000000000080016d        0x1 00
+                0x000000000080016e                _edata = .
+                0x000000000080016e                PROVIDE (__data_end, .)
+
+.bss            0x000000000080016e      0x134
+                0x000000000080016e                PROVIDE (__bss_start, .)
+ *(.bss)
+ .bss           0x000000000080016e      0x11d USBtoSerial.o
+ *(.bss*)
+ *(COMMON)
+ COMMON         0x000000000080028b        0xb USBtoSerial.o
+                0x000000000080028b                adb_werte
+                0x0000000000800294                t0ovfcount
+                0x0000000000800295                adb_data_length
+ COMMON         0x0000000000800296        0x3 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+                0x0000000000800296                USB_Device_ConfigurationNumber
+                0x0000000000800297                USB_Device_CurrentlySelfPowered
+                0x0000000000800298                USB_Device_RemoteWakeupEnabled
+ COMMON         0x0000000000800299        0x9 ../../LUFA/Drivers/USB/Core/USBTask.o
+                0x0000000000800299                USB_IsInitialized
+                0x000000000080029a                USB_ControlRequest
+                0x00000000008002a2                PROVIDE (__bss_end, .)
+                0x0000000000001816                __data_load_start = LOADADDR (.data)
+                0x0000000000001884                __data_load_end = (__data_load_start + SIZEOF (.data))
+
+.noinit         0x00000000008002a2        0x0
+                0x00000000008002a2                PROVIDE (__noinit_start, .)
+ *(.noinit*)
+                0x00000000008002a2                PROVIDE (__noinit_end, .)
+                0x00000000008002a2                _end = .
+                0x00000000008002a2                PROVIDE (__heap_start, .)
+
+.eeprom         0x0000000000810000        0x0
+ *(.eeprom*)
+                0x0000000000810000                __eeprom_end = .
+
+.fuse
+ *(.fuse)
+ *(.lfuse)
+ *(.hfuse)
+ *(.efuse)
+
+.lock
+ *(.lock*)
+
+.signature
+ *(.signature*)
+
+.stab           0x0000000000000000     0x228c
+ *(.stab)
+ .stab          0x0000000000000000      0x6cc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+ .stab          0x00000000000006cc       0x78 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o)
+                                         0x84 (size before relaxing)
+ .stab          0x0000000000000744      0x4bc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o)
+                                        0x4c8 (size before relaxing)
+ .stab          0x0000000000000c00       0x90 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o)
+                                         0x9c (size before relaxing)
+ .stab          0x0000000000000c90       0x48 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3.o)
+                                         0x54 (size before relaxing)
+ .stab          0x0000000000000cd8      0x510 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o)
+                                        0x51c (size before relaxing)
+ .stab          0x00000000000011e8      0x240 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fixunssfsi.o)
+                                        0x24c (size before relaxing)
+ .stab          0x0000000000001428      0x318 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(floatsisf.o)
+                                        0x324 (size before relaxing)
+ .stab          0x0000000000001740      0x1e0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_cmp.o)
+                                        0x1ec (size before relaxing)
+ .stab          0x0000000000001920       0x78 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_inf.o)
+                                         0x84 (size before relaxing)
+ .stab          0x0000000000001998       0x54 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_nan.o)
+                                         0x60 (size before relaxing)
+ .stab          0x00000000000019ec       0x84 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscA.o)
+                                         0x90 (size before relaxing)
+ .stab          0x0000000000001a70       0x84 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscB.o)
+                                         0x90 (size before relaxing)
+ .stab          0x0000000000001af4       0xfc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_round.o)
+                                        0x108 (size before relaxing)
+ .stab          0x0000000000001bf0      0x1d4 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_split3.o)
+                                        0x1e0 (size before relaxing)
+ .stab          0x0000000000001dc4       0x90 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_zero.o)
+                                         0x9c (size before relaxing)
+ .stab          0x0000000000001e54       0x6c /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(gesf2.o)
+                                         0x78 (size before relaxing)
+ .stab          0x0000000000001ec0       0x84 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy_P.o)
+                                         0x90 (size before relaxing)
+ .stab          0x0000000000001f44       0xb4 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcmp.o)
+                                         0xc0 (size before relaxing)
+ .stab          0x0000000000001ff8       0x84 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy.o)
+                                         0x90 (size before relaxing)
+ .stab          0x000000000000207c       0x6c /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memset.o)
+                                         0x78 (size before relaxing)
+ .stab          0x00000000000020e8       0x90 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eerd_byte_atmega32u2.o)
+                                         0x9c (size before relaxing)
+ .stab          0x0000000000002178      0x114 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eeupd_byte_atmega32u2.o)
+                                        0x120 (size before relaxing)
+
+.stabstr        0x0000000000000000      0x44f
+ *(.stabstr)
+ .stabstr       0x0000000000000000      0x44f /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+
+.stab.excl
+ *(.stab.excl)
+
+.stab.exclstr
+ *(.stab.exclstr)
+
+.stab.index
+ *(.stab.index)
+
+.stab.indexstr
+ *(.stab.indexstr)
+
+.comment
+ *(.comment)
+
+.debug
+ *(.debug)
+
+.line
+ *(.line)
+
+.debug_srcinfo
+ *(.debug_srcinfo)
+
+.debug_sfnames
+ *(.debug_sfnames)
+
+.debug_aranges  0x0000000000000000      0x538
+ *(.debug_aranges)
+ .debug_aranges
+                0x0000000000000000      0x108 USBtoSerial.o
+ .debug_aranges
+                0x0000000000000108       0x20 Descriptors.o
+ .debug_aranges
+                0x0000000000000128       0x38 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+ .debug_aranges
+                0x0000000000000160       0x20 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o
+ .debug_aranges
+                0x0000000000000180       0xc8 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .debug_aranges
+                0x0000000000000248       0x40 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+ .debug_aranges
+                0x0000000000000288       0x30 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+ .debug_aranges
+                0x00000000000002b8       0x38 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+ .debug_aranges
+                0x00000000000002f0       0x38 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+ .debug_aranges
+                0x0000000000000328       0x20 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+ .debug_aranges
+                0x0000000000000348       0x20 ../../LUFA/Drivers/USB/Core/Events.o
+ .debug_aranges
+                0x0000000000000368       0x20 ../../LUFA/Drivers/USB/Core/USBTask.o
+ .debug_aranges
+                0x0000000000000388       0x30 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+ .debug_aranges
+                0x00000000000003b8       0x98 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .debug_aranges
+                0x0000000000000450       0x30 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+ .debug_aranges
+                0x0000000000000480       0x30 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+ .debug_aranges
+                0x00000000000004b0       0x40 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+ .debug_aranges
+                0x00000000000004f0       0x48 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+
+.debug_pubnames
+                0x0000000000000000      0xe11
+ *(.debug_pubnames)
+ .debug_pubnames
+                0x0000000000000000      0x276 USBtoSerial.o
+ .debug_pubnames
+                0x0000000000000276       0x9e Descriptors.o
+ .debug_pubnames
+                0x0000000000000314       0x7e ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+ .debug_pubnames
+                0x0000000000000392       0x32 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o
+ .debug_pubnames
+                0x00000000000003c4      0x2df ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .debug_pubnames
+                0x00000000000006a3       0xaf ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+ .debug_pubnames
+                0x0000000000000752       0x46 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+ .debug_pubnames
+                0x0000000000000798       0x72 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+ .debug_pubnames
+                0x000000000000080a       0x9b ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+ .debug_pubnames
+                0x00000000000008a5       0xa1 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+ .debug_pubnames
+                0x0000000000000946       0x25 ../../LUFA/Drivers/USB/Core/Events.o
+ .debug_pubnames
+                0x000000000000096b       0x4f ../../LUFA/Drivers/USB/Core/USBTask.o
+ .debug_pubnames
+                0x00000000000009ba       0x79 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+ .debug_pubnames
+                0x0000000000000a33      0x18b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .debug_pubnames
+                0x0000000000000bbe       0x70 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+ .debug_pubnames
+                0x0000000000000c2e       0x6d ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+ .debug_pubnames
+                0x0000000000000c9b       0xa6 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+ .debug_pubnames
+                0x0000000000000d41       0xd0 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+
+.debug_info     0x0000000000000000     0x8cae
+ *(.debug_info)
+ .debug_info    0x0000000000000000      0xef0 USBtoSerial.o
+ .debug_info    0x0000000000000ef0      0x77d Descriptors.o
+ .debug_info    0x000000000000166d      0x6f9 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+ .debug_info    0x0000000000001d66       0xd8 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o
+ .debug_info    0x0000000000001e3e     0x154c ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .debug_info    0x000000000000338a      0x603 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+ .debug_info    0x000000000000398d       0x6c ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o
+ .debug_info    0x00000000000039f9       0x6c ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o
+ .debug_info    0x0000000000003a65       0x6c ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o
+ .debug_info    0x0000000000003ad1      0x412 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+ .debug_info    0x0000000000003ee3      0x662 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+ .debug_info    0x0000000000004545      0x38c ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+ .debug_info    0x00000000000048d1      0x973 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+ .debug_info    0x0000000000005244       0x85 ../../LUFA/Drivers/USB/Core/Events.o
+ .debug_info    0x00000000000052c9       0x6c ../../LUFA/Drivers/USB/Core/HostStandardReq.o
+ .debug_info    0x0000000000005335      0x245 ../../LUFA/Drivers/USB/Core/USBTask.o
+ .debug_info    0x000000000000557a      0x56c ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+ .debug_info    0x0000000000005ae6      0xc3b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .debug_info    0x0000000000006721      0x67a ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+ .debug_info    0x0000000000006d9b      0x7ca ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+ .debug_info    0x0000000000007565      0x4c1 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+ .debug_info    0x0000000000007a26      0xebc ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+ .debug_info    0x00000000000088e2       0x6c ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o
+ .debug_info    0x000000000000894e       0x6c ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o
+ .debug_info    0x00000000000089ba       0x6c ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o
+ .debug_info    0x0000000000008a26       0x6c ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o
+ .debug_info    0x0000000000008a92       0x6c ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o
+ .debug_info    0x0000000000008afe       0x6c ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o
+ .debug_info    0x0000000000008b6a       0x6c ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o
+ .debug_info    0x0000000000008bd6       0x6c ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o
+ .debug_info    0x0000000000008c42       0x6c ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o
+ *(.gnu.linkonce.wi.*)
+
+.debug_abbrev   0x0000000000000000     0x21b9
+ *(.debug_abbrev)
+ .debug_abbrev  0x0000000000000000      0x430 USBtoSerial.o
+ .debug_abbrev  0x0000000000000430      0x153 Descriptors.o
+ .debug_abbrev  0x0000000000000583      0x1ec ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+ .debug_abbrev  0x000000000000076f       0x7d ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o
+ .debug_abbrev  0x00000000000007ec      0x18b ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .debug_abbrev  0x0000000000000977      0x1ee ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+ .debug_abbrev  0x0000000000000b65       0x2a ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o
+ .debug_abbrev  0x0000000000000b8f       0x2a ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o
+ .debug_abbrev  0x0000000000000bb9       0x2a ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o
+ .debug_abbrev  0x0000000000000be3      0x14d ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+ .debug_abbrev  0x0000000000000d30      0x1e2 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+ .debug_abbrev  0x0000000000000f12      0x148 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+ .debug_abbrev  0x000000000000105a      0x20b ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+ .debug_abbrev  0x0000000000001265       0x41 ../../LUFA/Drivers/USB/Core/Events.o
+ .debug_abbrev  0x00000000000012a6       0x2a ../../LUFA/Drivers/USB/Core/HostStandardReq.o
+ .debug_abbrev  0x00000000000012d0      0x14b ../../LUFA/Drivers/USB/Core/USBTask.o
+ .debug_abbrev  0x000000000000141b      0x160 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+ .debug_abbrev  0x000000000000157b      0x2ec ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .debug_abbrev  0x0000000000001867      0x1b5 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+ .debug_abbrev  0x0000000000001a1c      0x205 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+ .debug_abbrev  0x0000000000001c21      0x16c ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+ .debug_abbrev  0x0000000000001d8d      0x2b2 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+ .debug_abbrev  0x000000000000203f       0x2a ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o
+ .debug_abbrev  0x0000000000002069       0x2a ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o
+ .debug_abbrev  0x0000000000002093       0x2a ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o
+ .debug_abbrev  0x00000000000020bd       0x2a ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o
+ .debug_abbrev  0x00000000000020e7       0x2a ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o
+ .debug_abbrev  0x0000000000002111       0x2a ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o
+ .debug_abbrev  0x000000000000213b       0x2a ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o
+ .debug_abbrev  0x0000000000002165       0x2a ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o
+ .debug_abbrev  0x000000000000218f       0x2a ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o
+
+.debug_line     0x0000000000000000     0x75f0
+ *(.debug_line)
+ .debug_line    0x0000000000000000     0x100d USBtoSerial.o
+ .debug_line    0x000000000000100d      0x1d9 Descriptors.o
+ .debug_line    0x00000000000011e6      0x762 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+ .debug_line    0x0000000000001948      0x15f ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o
+ .debug_line    0x0000000000001aa7     0x1a80 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .debug_line    0x0000000000003527      0x5a1 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+ .debug_line    0x0000000000003ac8       0x3e ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o
+ .debug_line    0x0000000000003b06       0x3e ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o
+ .debug_line    0x0000000000003b44       0x3e ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o
+ .debug_line    0x0000000000003b82      0x312 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+ .debug_line    0x0000000000003e94      0x55a ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+ .debug_line    0x00000000000043ee      0x269 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+ .debug_line    0x0000000000004657      0x5a2 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+ .debug_line    0x0000000000004bf9       0x80 ../../LUFA/Drivers/USB/Core/Events.o
+ .debug_line    0x0000000000004c79       0x3e ../../LUFA/Drivers/USB/Core/HostStandardReq.o
+ .debug_line    0x0000000000004cb7      0x1ae ../../LUFA/Drivers/USB/Core/USBTask.o
+ .debug_line    0x0000000000004e65      0x4be ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+ .debug_line    0x0000000000005323      0x9c2 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .debug_line    0x0000000000005ce5      0x5c3 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+ .debug_line    0x00000000000062a8      0x5c6 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+ .debug_line    0x000000000000686e      0x3bc ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+ .debug_line    0x0000000000006c2a      0x798 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+ .debug_line    0x00000000000073c2       0x3e ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o
+ .debug_line    0x0000000000007400       0x3e ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o
+ .debug_line    0x000000000000743e       0x3e ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o
+ .debug_line    0x000000000000747c       0x3e ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o
+ .debug_line    0x00000000000074ba       0x3e ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o
+ .debug_line    0x00000000000074f8       0x3e ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o
+ .debug_line    0x0000000000007536       0x3e ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o
+ .debug_line    0x0000000000007574       0x3e ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o
+ .debug_line    0x00000000000075b2       0x3e ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o
+
+.debug_frame    0x0000000000000000      0x830
+ *(.debug_frame)
+ .debug_frame   0x0000000000000000      0x1f0 USBtoSerial.o
+ .debug_frame   0x00000000000001f0       0x20 Descriptors.o
+ .debug_frame   0x0000000000000210       0x50 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+ .debug_frame   0x0000000000000260       0x20 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o
+ .debug_frame   0x0000000000000280      0x170 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .debug_frame   0x00000000000003f0       0x60 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+ .debug_frame   0x0000000000000450       0x40 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+ .debug_frame   0x0000000000000490       0x50 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+ .debug_frame   0x00000000000004e0       0x50 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+ .debug_frame   0x0000000000000530       0x20 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+ .debug_frame   0x0000000000000550       0x20 ../../LUFA/Drivers/USB/Core/Events.o
+ .debug_frame   0x0000000000000570       0x20 ../../LUFA/Drivers/USB/Core/USBTask.o
+ .debug_frame   0x0000000000000590       0x40 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+ .debug_frame   0x00000000000005d0      0x110 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .debug_frame   0x00000000000006e0       0x40 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+ .debug_frame   0x0000000000000720       0x40 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+ .debug_frame   0x0000000000000760       0x60 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+ .debug_frame   0x00000000000007c0       0x70 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+
+.debug_str      0x0000000000000000     0x3bf7
+ *(.debug_str)
+ .debug_str     0x0000000000000000      0x939 USBtoSerial.o
+                                        0x9db (size before relaxing)
+ .debug_str     0x0000000000000939      0x8ba Descriptors.o
+                                        0xa0a (size before relaxing)
+ .debug_str     0x00000000000011f3      0x47c ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+                                        0x5ea (size before relaxing)
+ .debug_str     0x000000000000166f       0x77 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o
+                                        0x14d (size before relaxing)
+ .debug_str     0x00000000000016e6      0x592 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+                                        0x763 (size before relaxing)
+ .debug_str     0x0000000000001c78      0x212 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+                                        0x55f (size before relaxing)
+ .debug_str     0x0000000000001e8a       0x2d ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o
+                                         0xf5 (size before relaxing)
+ .debug_str     0x0000000000001eb7       0x33 ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o
+                                         0xfb (size before relaxing)
+ .debug_str     0x0000000000001eea       0x2d ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o
+                                         0xf5 (size before relaxing)
+ .debug_str     0x0000000000001f17      0x209 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+                                        0x41e (size before relaxing)
+ .debug_str     0x0000000000002120      0x113 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+                                        0x420 (size before relaxing)
+ .debug_str     0x0000000000002233      0x227 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+                                        0x335 (size before relaxing)
+ .debug_str     0x000000000000245a      0x3b2 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+                                        0x853 (size before relaxing)
+ .debug_str     0x000000000000280c       0x34 ../../LUFA/Drivers/USB/Core/Events.o
+                                         0xfc (size before relaxing)
+ .debug_str     0x0000000000002840       0x2e ../../LUFA/Drivers/USB/Core/HostStandardReq.o
+                                         0xf6 (size before relaxing)
+ .debug_str     0x000000000000286e       0x4e ../../LUFA/Drivers/USB/Core/USBTask.o
+                                        0x2a3 (size before relaxing)
+ .debug_str     0x00000000000028bc      0x239 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+                                        0x523 (size before relaxing)
+ .debug_str     0x0000000000002af5      0x2fa ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                                        0x8d7 (size before relaxing)
+ .debug_str     0x0000000000002def      0x1ed ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+                                        0x552 (size before relaxing)
+ .debug_str     0x0000000000002fdc      0x23d ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+                                        0x6b3 (size before relaxing)
+ .debug_str     0x0000000000003219      0x118 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+                                        0x53a (size before relaxing)
+ .debug_str     0x0000000000003331      0x6e8 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+                                        0xbeb (size before relaxing)
+ .debug_str     0x0000000000003a19       0x3e ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o
+                                        0x106 (size before relaxing)
+ .debug_str     0x0000000000003a57       0x33 ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o
+                                         0xfb (size before relaxing)
+ .debug_str     0x0000000000003a8a       0x31 ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o
+                                         0xf9 (size before relaxing)
+ .debug_str     0x0000000000003abb       0x31 ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o
+                                         0xf9 (size before relaxing)
+ .debug_str     0x0000000000003aec       0x39 ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o
+                                        0x101 (size before relaxing)
+ .debug_str     0x0000000000003b25       0x32 ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o
+                                         0xfa (size before relaxing)
+ .debug_str     0x0000000000003b57       0x35 ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o
+                                         0xfd (size before relaxing)
+ .debug_str     0x0000000000003b8c       0x33 ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o
+                                         0xfb (size before relaxing)
+ .debug_str     0x0000000000003bbf       0x38 ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o
+                                        0x100 (size before relaxing)
+
+.debug_loc      0x0000000000000000     0x464d
+ *(.debug_loc)
+ .debug_loc     0x0000000000000000      0x5b1 USBtoSerial.o
+ .debug_loc     0x00000000000005b1       0xd3 Descriptors.o
+ .debug_loc     0x0000000000000684      0x88f ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+ .debug_loc     0x0000000000000f13     0x1982 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .debug_loc     0x0000000000002895      0x390 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+ .debug_loc     0x0000000000002c25      0x190 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+ .debug_loc     0x0000000000002db5      0x2bc ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+ .debug_loc     0x0000000000003071      0x22a ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+ .debug_loc     0x000000000000329b       0x27 ../../LUFA/Drivers/USB/Core/USBTask.o
+ .debug_loc     0x00000000000032c2      0x16d ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+ .debug_loc     0x000000000000342f      0x52b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .debug_loc     0x000000000000395a      0x249 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+ .debug_loc     0x0000000000003ba3      0x152 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+ .debug_loc     0x0000000000003cf5      0x1f6 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+ .debug_loc     0x0000000000003eeb      0x762 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+
+.debug_macinfo
+ *(.debug_macinfo)
+OUTPUT(USBtoSerial.elf elf32-avr)
+LOAD linker stubs
+
+.debug_pubtypes
+                0x0000000000000000     0x1111
+ .debug_pubtypes
+                0x0000000000000000      0x15a USBtoSerial.o
+ .debug_pubtypes
+                0x000000000000015a      0x1f1 Descriptors.o
+ .debug_pubtypes
+                0x000000000000034b      0x145 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+ .debug_pubtypes
+                0x0000000000000490       0x1e ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o
+ .debug_pubtypes
+                0x00000000000004ae       0xab ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .debug_pubtypes
+                0x0000000000000559       0x9e ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+ .debug_pubtypes
+                0x00000000000005f7       0x12 ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o
+ .debug_pubtypes
+                0x0000000000000609       0x12 ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o
+ .debug_pubtypes
+                0x000000000000061b       0x12 ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o
+ .debug_pubtypes
+                0x000000000000062d       0x68 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+ .debug_pubtypes
+                0x0000000000000695       0x58 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+ .debug_pubtypes
+                0x00000000000006ed       0xb4 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+ .debug_pubtypes
+                0x00000000000007a1       0xd7 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+ .debug_pubtypes
+                0x0000000000000878       0x12 ../../LUFA/Drivers/USB/Core/Events.o
+ .debug_pubtypes
+                0x000000000000088a       0x12 ../../LUFA/Drivers/USB/Core/HostStandardReq.o
+ .debug_pubtypes
+                0x000000000000089c       0x5c ../../LUFA/Drivers/USB/Core/USBTask.o
+ .debug_pubtypes
+                0x00000000000008f8       0xb2 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+ .debug_pubtypes
+                0x00000000000009aa      0x151 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .debug_pubtypes
+                0x0000000000000afb       0xc6 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+ .debug_pubtypes
+                0x0000000000000bc1      0x132 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+ .debug_pubtypes
+                0x0000000000000cf3       0xe0 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+ .debug_pubtypes
+                0x0000000000000dd3      0x29c ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+ .debug_pubtypes
+                0x000000000000106f       0x12 ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o
+ .debug_pubtypes
+                0x0000000000001081       0x12 ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o
+ .debug_pubtypes
+                0x0000000000001093       0x12 ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o
+ .debug_pubtypes
+                0x00000000000010a5       0x12 ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o
+ .debug_pubtypes
+                0x00000000000010b7       0x12 ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o
+ .debug_pubtypes
+                0x00000000000010c9       0x12 ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o
+ .debug_pubtypes
+                0x00000000000010db       0x12 ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o
+ .debug_pubtypes
+                0x00000000000010ed       0x12 ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o
+ .debug_pubtypes
+                0x00000000000010ff       0x12 ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o
+
+.debug_ranges   0x0000000000000000      0x790
+ .debug_ranges  0x0000000000000000       0xf8 USBtoSerial.o
+ .debug_ranges  0x00000000000000f8       0x10 Descriptors.o
+ .debug_ranges  0x0000000000000108      0x100 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+ .debug_ranges  0x0000000000000208       0x10 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o
+ .debug_ranges  0x0000000000000218      0x298 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+ .debug_ranges  0x00000000000004b0       0xa8 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+ .debug_ranges  0x0000000000000558       0x20 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+ .debug_ranges  0x0000000000000578       0x28 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+ .debug_ranges  0x00000000000005a0       0x28 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+ .debug_ranges  0x00000000000005c8       0x10 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+ .debug_ranges  0x00000000000005d8       0x10 ../../LUFA/Drivers/USB/Core/Events.o
+ .debug_ranges  0x00000000000005e8       0x10 ../../LUFA/Drivers/USB/Core/USBTask.o
+ .debug_ranges  0x00000000000005f8       0x20 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+ .debug_ranges  0x0000000000000618       0x88 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+ .debug_ranges  0x00000000000006a0       0x20 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+ .debug_ranges  0x00000000000006c0       0x20 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+ .debug_ranges  0x00000000000006e0       0x30 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+ .debug_ranges  0x0000000000000710       0x80 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+
+Cross Reference Table
+
+Symbol                                            File
+Audio_Device_ConfigureEndpoints                   ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+Audio_Device_Event_Stub                           ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+Audio_Device_ProcessControlRequest                ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+CALLBACK_Audio_Device_GetSetEndpointProperty      ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+CALLBACK_Audio_Device_GetSetInterfaceProperty     ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+CALLBACK_HIDParser_FilterHIDReportItem            ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+CALLBACK_HID_Device_CreateHIDReport               ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+CALLBACK_HID_Device_ProcessHIDReport              ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+CALLBACK_MS_Device_SCSICommandReceived            ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+CALLBACK_USB_GetDescriptor                        Descriptors.o
+                                                  ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+CDC_Device_BytesReceived                          ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+CDC_Device_ConfigureEndpoints                     ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                                                  USBtoSerial.o
+CDC_Device_CreateBlockingStream                   ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+CDC_Device_CreateStream                           ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+CDC_Device_Event_Stub                             ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+CDC_Device_Flush                                  ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+CDC_Device_ProcessControlRequest                  ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                                                  USBtoSerial.o
+CDC_Device_ReceiveByte                            ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                                                  USBtoSerial.o
+CDC_Device_SendByte                               ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                                                  USBtoSerial.o
+CDC_Device_SendControlLineStateChange             ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+CDC_Device_SendData                               ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+CDC_Device_SendString                             ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+CDC_Device_USBTask                                ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                                                  USBtoSerial.o
+ConfigurationDescriptor                           Descriptors.o
+DeviceDescriptor                                  Descriptors.o
+EVENT_Audio_Device_StreamStartStop                ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+EVENT_CDC_Device_BreakSent                        ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+EVENT_CDC_Device_ControLineStateChanged           ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+EVENT_CDC_Device_LineEncodingChanged              USBtoSerial.o
+EVENT_USB_Device_ConfigurationChanged             USBtoSerial.o
+                                                  ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+EVENT_USB_Device_Connect                          USBtoSerial.o
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+EVENT_USB_Device_ControlRequest                   USBtoSerial.o
+                                                  ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+EVENT_USB_Device_Disconnect                       USBtoSerial.o
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+EVENT_USB_Device_Reset                            ../../LUFA/Drivers/USB/Core/Events.o
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+EVENT_USB_Device_StartOfFrame                     ../../LUFA/Drivers/USB/Core/Events.o
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+EVENT_USB_Device_Suspend                          ../../LUFA/Drivers/USB/Core/Events.o
+EVENT_USB_Device_WakeUp                           ../../LUFA/Drivers/USB/Core/Events.o
+Endpoint_ClearEndpoints                           ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+Endpoint_ClearStatusStage                         ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+Endpoint_ConfigureEndpointTable                   ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+Endpoint_ConfigureEndpoint_Prv                    ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+Endpoint_Discard_Stream                           ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+Endpoint_Null_Stream                              ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+Endpoint_Read_Control_EStream_BE                  ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+Endpoint_Read_Control_EStream_LE                  ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+Endpoint_Read_Control_Stream_BE                   ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+Endpoint_Read_Control_Stream_LE                   ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+Endpoint_Read_EStream_BE                          ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+Endpoint_Read_EStream_LE                          ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+Endpoint_Read_Stream_BE                           ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+Endpoint_Read_Stream_LE                           ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+Endpoint_WaitUntilReady                           ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+Endpoint_Write_Control_EStream_BE                 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+Endpoint_Write_Control_EStream_LE                 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+Endpoint_Write_Control_PStream_BE                 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+Endpoint_Write_Control_PStream_LE                 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+                                                  ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+Endpoint_Write_Control_Stream_BE                  ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+Endpoint_Write_Control_Stream_LE                  ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+Endpoint_Write_EStream_BE                         ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+Endpoint_Write_EStream_LE                         ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+Endpoint_Write_PStream_BE                         ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+Endpoint_Write_PStream_LE                         ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+Endpoint_Write_Stream_BE                          ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+Endpoint_Write_Stream_LE                          ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+HID_Device_ConfigureEndpoints                     ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+HID_Device_ProcessControlRequest                  ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+HID_Device_USBTask                                ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+LanguageString                                    Descriptors.o
+MIDI_Device_ConfigureEndpoints                    ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+MIDI_Device_Flush                                 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+MIDI_Device_ReceiveEventPacket                    ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+MIDI_Device_SendEventPacket                       ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+MIDI_Device_USBTask                               ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o
+MS_Device_ConfigureEndpoints                      ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+MS_Device_ProcessControlRequest                   ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+MS_Device_USBTask                                 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+ManufacturerString                                Descriptors.o
+ProductString                                     Descriptors.o
+RNDIS_Device_ConfigureEndpoints                   ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+RNDIS_Device_IsPacketReceived                     ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+RNDIS_Device_ProcessControlRequest                ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+RNDIS_Device_ReadPacket                           ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+RNDIS_Device_SendPacket                           ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+RNDIS_Device_USBTask                              ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+SetupHardware                                     USBtoSerial.o
+USB_ControlRequest                                ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Core/USBTask.o
+                                                  ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+USB_Device_ConfigurationNumber                    ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+USB_Device_CurrentlySelfPowered                   ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+USB_Device_ProcessControlRequest                  ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+                                                  ../../LUFA/Drivers/USB/Core/USBTask.o
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+USB_Device_RemoteWakeupEnabled                    ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+USB_Device_SendRemoteWakeup                       ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o
+USB_Disable                                       ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+USB_Event_Stub                                    ../../LUFA/Drivers/USB/Core/Events.o
+USB_GetHIDReportItemInfo                          ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+USB_GetHIDReportSize                              ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+USB_GetNextDescriptorComp                         ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+USB_GetNextDescriptorOfType                       ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+USB_GetNextDescriptorOfTypeAfter                  ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+USB_GetNextDescriptorOfTypeBefore                 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o
+USB_INT_ClearAllInterrupts                        ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+USB_INT_DisableAllInterrupts                      ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+USB_Init                                          ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+                                                  USBtoSerial.o
+USB_IsInitialized                                 ../../LUFA/Drivers/USB/Core/USBTask.o
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+USB_ProcessHIDReport                              ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+USB_ResetInterface                                ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o
+USB_SetHIDReportItemInfo                          ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+USB_USBTask                                       ../../LUFA/Drivers/USB/Core/USBTask.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                                                  USBtoSerial.o
+Usb2SerialTask                                    USBtoSerial.o
+VirtualSerial_CDC_Interface                       USBtoSerial.o
+__addsf3                                          /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o)
+                                                  USBtoSerial.o
+__addsf3x                                         /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o)
+__bad_interrupt                                   /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__bss_end                                         /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_clear_bss.o)
+__bss_start                                       /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_clear_bss.o)
+__cmpsf2                                          /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o)
+__data_end                                        /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_copy_data.o)
+__data_load_start                                 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_copy_data.o)
+__data_start                                      /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_copy_data.o)
+__divsf3                                          /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3.o)
+                                                  USBtoSerial.o
+__divsf3_pse                                      /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o)
+__divsf3x                                         /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3.o)
+__do_clear_bss                                    /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_clear_bss.o)
+                                                  ../../LUFA/Drivers/USB/Core/USBTask.o
+                                                  ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o
+                                                  USBtoSerial.o
+__do_copy_data                                    /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_copy_data.o)
+                                                  ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o
+                                                  USBtoSerial.o
+__eerd_byte_m32u2                                 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eerd_byte_atmega32u2.o)
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+__eeupd_byte_m32u2                                /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eeupd_byte_atmega32u2.o)
+                                                  ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o
+__eeupd_r18_m32u2                                 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eeupd_byte_atmega32u2.o)
+__eqsf2                                           /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o)
+__fixunssfsi                                      /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fixunssfsi.o)
+                                                  USBtoSerial.o
+__floatsisf                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(floatsisf.o)
+__floatunsisf                                     /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(floatsisf.o)
+                                                  USBtoSerial.o
+__fp_cmp                                          /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_cmp.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(gesf2.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o)
+__fp_inf                                          /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_inf.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o)
+__fp_nan                                          /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_nan.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o)
+__fp_pscA                                         /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscA.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o)
+__fp_pscB                                         /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscB.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o)
+__fp_round                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_round.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o)
+__fp_split3                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_split3.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o)
+__fp_splitA                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_split3.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fixunssfsi.o)
+__fp_szero                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_zero.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o)
+__fp_zero                                         /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_zero.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fixunssfsi.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o)
+__gesf2                                           /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(gesf2.o)
+__gtsf2                                           /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(gesf2.o)
+                                                  USBtoSerial.o
+__heap_end                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__init                                            /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__lesf2                                           /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o)
+__ltsf2                                           /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o)
+                                                  USBtoSerial.o
+__mulhi3                                          /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulhi3.o)
+                                                  ../../LUFA/Drivers/USB/Class/Common/HIDParser.o
+__nesf2                                           /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o)
+__stack                                           /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__subsf3                                          /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o)
+                                                  USBtoSerial.o
+__udivmodhi4                                      /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodhi4.o)
+                                                  USBtoSerial.o
+__udivmodsi4                                      /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodsi4.o)
+                                                  USBtoSerial.o
+__vector_1                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_10                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_11                                       ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_12                                       ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_13                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_14                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_15                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_16                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_17                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_18                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_19                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_2                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_20                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_21                                       USBtoSerial.o
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_22                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_23                                       USBtoSerial.o
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_24                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_25                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_26                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_27                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_28                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_29                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_3                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_30                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_31                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_32                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_33                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_34                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_35                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_36                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_37                                       /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_4                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_5                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_6                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_7                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_8                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_9                                        /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vector_default                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+__vectors                                         /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+_exit                                             /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o)
+adb                                               USBtoSerial.o
+adb_data_length                                   USBtoSerial.o
+adb_werte                                         USBtoSerial.o
+decode_field                                      USBtoSerial.o
+delta_x                                           USBtoSerial.o
+delta_y                                           USBtoSerial.o
+exit                                              /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o)
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+main                                              USBtoSerial.o
+                                                  /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o
+memcmp                                            /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcmp.o)
+                                                  ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+memcpy                                            /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy.o)
+                                                  ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+                                                  ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+memcpy_P                                          /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy_P.o)
+                                                  ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o
+memset                                            /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memset.o)
+                                                  ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o
+my_uitoa                                          USBtoSerial.o
+t0ext                                             USBtoSerial.o
+t0ovfcount                                        USBtoSerial.o
+t0rst                                             USBtoSerial.o
+touchpad_init                                     USBtoSerial.o
+touchpad_read                                     USBtoSerial.o
+touchpad_set_abs_mode                             USBtoSerial.o
+touchpad_set_rel_mode_100dpi                      USBtoSerial.o
+touchpad_set_rel_mode_200dpi                      USBtoSerial.o
+uart_putc                                         USBtoSerial.o
+uart_puts                                         USBtoSerial.o
+x_abs                                             USBtoSerial.o
+y_abs                                             USBtoSerial.o
+z_pressure                                        USBtoSerial.o
diff --git a/firmware/USBtoSerial.o b/firmware/USBtoSerial.o
new file mode 100644 (file)
index 0000000..51f8fa1
Binary files /dev/null and b/firmware/USBtoSerial.o differ
diff --git a/firmware/USBtoSerial.sym b/firmware/USBtoSerial.sym
new file mode 100644 (file)
index 0000000..a03e211
--- /dev/null
@@ -0,0 +1,357 @@
+         U CALLBACK_Audio_Device_GetSetEndpointProperty
+         U CALLBACK_Audio_Device_GetSetInterfaceProperty
+         U CALLBACK_HIDParser_FilterHIDReportItem
+         U CALLBACK_HID_Device_CreateHIDReport
+         U CALLBACK_HID_Device_ProcessHIDReport
+         U CALLBACK_MS_Device_SCSICommandReceived
+00000000 W __heap_end
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 a __tmp_reg__
+00000000 W __vector_default
+00000000 T __vectors
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000001 a __zero_reg__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+00000034 a __CCP__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003d a __SP_L__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003e a __SP_H__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+0000003f a __SREG__
+00000098 T DeviceDescriptor
+000000aa T ConfigurationDescriptor
+000000e8 T LanguageString
+000000ec T ManufacturerString
+00000106 T ProductString
+00000136 T __ctors_end
+00000136 T __ctors_start
+00000136 T __dtors_end
+00000136 T __dtors_start
+00000136 W __init
+00000136 T __trampolines_end
+00000136 T __trampolines_start
+00000142 T __do_copy_data
+00000158 T __do_clear_bss
+00000160 t .do_clear_bss_loop
+00000162 t .do_clear_bss_start
+0000016e T __bad_interrupt
+0000016e W __vector_1
+0000016e W __vector_10
+0000016e W __vector_13
+0000016e W __vector_14
+0000016e W __vector_15
+0000016e W __vector_16
+0000016e W __vector_17
+0000016e W __vector_18
+0000016e W __vector_19
+0000016e W __vector_2
+0000016e W __vector_20
+0000016e W __vector_22
+0000016e W __vector_24
+0000016e W __vector_25
+0000016e W __vector_26
+0000016e W __vector_27
+0000016e W __vector_28
+0000016e W __vector_29
+0000016e W __vector_3
+0000016e W __vector_30
+0000016e W __vector_31
+0000016e W __vector_32
+0000016e W __vector_33
+0000016e W __vector_34
+0000016e W __vector_35
+0000016e W __vector_36
+0000016e W __vector_37
+0000016e W __vector_4
+0000016e W __vector_5
+0000016e W __vector_6
+0000016e W __vector_7
+0000016e W __vector_8
+0000016e W __vector_9
+00000170 t RingBuffer_Insert
+000001a6 t RingBuffer_Remove
+000001d8 t RingBuffer_InitBuffer.clone.0
+00000202 T __vector_21
+00000224 T t0ext
+00000234 T t0rst
+0000023c T adb
+0000045c T touchpad_init
+0000046c T touchpad_read
+0000047e T delta_y
+0000049e T delta_x
+000004be T Usb2SerialTask
+000004ff W __stack
+00000570 T SetupHardware
+0000059a T EVENT_USB_Device_Connect
+0000059c T EVENT_USB_Device_Disconnect
+0000059e T EVENT_USB_Device_ConfigurationChanged
+000005a4 T EVENT_USB_Device_ControlRequest
+000005aa T __vector_23
+000005fe T EVENT_CDC_Device_LineEncodingChanged
+000006be T uart_putc
+000006ce T uart_puts
+000006f4 T my_uitoa
+000007c4 T main
+000008e6 T CALLBACK_USB_GetDescriptor
+00000940 T Endpoint_Write_Control_Stream_LE
+000009f4 T Endpoint_Write_Control_PStream_LE
+00000aaa T Endpoint_ConfigureEndpoint_Prv
+00000b18 T Endpoint_ConfigureEndpointTable
+00000ba0 T Endpoint_ClearStatusStage
+00000bde T Endpoint_WaitUntilReady
+00000c44 T USB_ResetInterface
+00000cb4 T USB_Init
+00000cc6 T USB_INT_DisableAllInterrupts
+00000ccc T USB_INT_ClearAllInterrupts
+00000cd2 T __vector_11
+00000e1a T __vector_12
+00000e90 T USB_Device_ProcessControlRequest
+00001152 W EVENT_USB_Device_Reset
+00001152 W EVENT_USB_Device_StartOfFrame
+00001152 W EVENT_USB_Device_Suspend
+00001152 W EVENT_USB_Device_WakeUp
+00001152 T USB_Event_Stub
+00001154 T USB_USBTask
+0000118a T CDC_Device_ProcessControlRequest
+000012e2 T CDC_Device_ConfigureEndpoints
+0000132a T CDC_Device_SendByte
+00001384 T CDC_Device_Flush
+000013de T CDC_Device_USBTask
+0000140c T CDC_Device_ReceiveByte
+00001466 T CDC_Device_Event_Stub
+00001466 W EVENT_CDC_Device_BreakSent
+00001466 W EVENT_CDC_Device_ControLineStateChanged
+00001468 T __subsf3
+0000146a T __addsf3
+0000148c T __addsf3x
+00001532 T __cmpsf2
+00001532 T __eqsf2
+00001532 T __lesf2
+00001532 T __ltsf2
+00001532 T __nesf2
+0000153a T __divsf3
+00001554 T __divsf3x
+00001558 T __divsf3_pse
+0000160a T __fixunssfsi
+00001662 T __floatunsisf
+00001666 T __floatsisf
+000016dc T __fp_cmp
+00001724 T __fp_inf
+00001730 T __fp_nan
+00001736 T __fp_pscA
+00001744 T __fp_pscB
+00001752 T __fp_round
+00001774 T __fp_split3
+00001784 T __fp_splitA
+000017b8 T __fp_zero
+000017ba T __fp_szero
+000017c6 T __gesf2
+000017c6 T __gtsf2
+000017ce T __udivmodsi4
+000017da t __udivmodsi4_loop
+000017f4 t __udivmodsi4_ep
+00001812 T _exit
+00001812 W exit
+00001814 t __stop_program
+00001816 A __data_load_start
+00001816 T _etext
+00001884 A __data_load_end
+00800100 D __data_start
+00800150 D VirtualSerial_CDC_Interface
+0080016b d CSWTCH.10
+0080016e b USBtoUSART_Buffer
+0080016e B __bss_start
+0080016e D __data_end
+0080016e D _edata
+0080017a b USBtoUSART_Buffer_Data
+008001fa b USARTtoUSB_Buffer
+00800206 b USARTtoUSB_Buffer_Data
+00800286 b y_mem.3984
+00800288 b x_mem.3983
+0080028a b last_pressure.3978
+0080028b B adb_werte
+00800294 B t0ovfcount
+00800295 B adb_data_length
+00800296 B USB_Device_ConfigurationNumber
+00800297 B USB_Device_CurrentlySelfPowered
+00800298 B USB_Device_RemoteWakeupEnabled
+00800299 B USB_IsInitialized
+0080029a B USB_ControlRequest
+008002a2 B __bss_end
+008002a2 N _end
+00810000 N __eeprom_end
diff --git a/firmware/USBtoSerial.txt b/firmware/USBtoSerial.txt
new file mode 100644 (file)
index 0000000..1ee7afa
--- /dev/null
@@ -0,0 +1,83 @@
+/** \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.
+ */
+
+/** \mainpage USB to Serial Converter Project
+ *
+ *  \section Sec_Compat Project Compatibility:
+ *
+ *  The following list indicates what microcontrollers are compatible with this project.
+ *
+ *  \li Series 7 USB AVRs (AT90USBxxx7)
+ *  \li Series 6 USB AVRs (AT90USBxxx6)
+ *  \li Series 4 USB AVRs (ATMEGAxxU4)
+ *  \li Series 2 USB AVRs (AT90USBxx2, ATMEGAxxU2)
+ *
+ *  \section Sec_Info USB Information:
+ *
+ *  The following table gives a rundown of the USB utilization of this project.
+ *
+ *  <table>
+ *   <tr>
+ *    <td><b>USB Mode:</b></td>
+ *    <td>Device</td>
+ *   </tr>
+ *   <tr>
+ *    <td><b>USB Class:</b></td>
+ *    <td>Communications Device Class (CDC)</td>
+ *   </tr>
+ *   <tr>
+ *    <td><b>USB Subclass:</b></td>
+ *    <td>Abstract Control Model (ACM)</td>
+ *   </tr>
+ *   <tr>
+ *    <td><b>Relevant Standards:</b></td>
+ *    <td>USBIF CDC Class Standard</td>
+ *   </tr>
+ *   <tr>
+ *    <td><b>Supported USB Speeds:</b></td>
+ *    <td>Full Speed Mode</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section Sec_Description Project Description:
+ *
+ *  USB to Serial bridge project. This project allows a USB AVR to serve
+ *  as a USB to USART bridge between a USB host and a device lacking a
+ *  USB port. When programmed into a USB AVR, the AVR will enumerate as a
+ *  virtual COM port.
+ *
+ *  The AVR's hardware USART's settings will change to mirror as closely as
+ *  possible the serial settings set on the host. However, due to hardware
+ *  limitations, some options may not be supported (baud rates with unacceptable
+ *  error rates at the AVR's clock speed, data lengths other than 6, 7 or 8 bits,
+ *  1.5 stop bits, parity other than none, even or odd).
+ *
+ *  After running this project for the first time on a new computer,
+ *  you will need to supply the .INF file located in this project
+ *  project's directory as the device's driver when running under
+ *  Windows. This will enable Windows to use its inbuilt CDC drivers,
+ *  negating the need for custom drivers for the device. Other
+ *  Operating Systems should automatically use their own inbuilt
+ *  CDC-ACM drivers.
+ *
+ *  \section Sec_Options Project Options
+ *
+ *  The following defines can be found in this project, which can control the project behaviour when defined, or changed in value.
+ *
+ *  <table>
+ *   <tr>
+ *    <td><b>Define Name:</b></td>
+ *    <td><b>Location:</b></td>
+ *    <td><b>Description:</b></td>
+ *   </tr>
+ *   <tr>
+ *    <td>BUFF_STATICSIZE</td>
+ *    <td>RingBuff.h</td>
+ *    <td>Defines the maximum number of bytes which can be buffered in each Ring Buffer.</td>
+ *   </tr>
+ *  </table>
+ */
+
diff --git a/firmware/asf.xml b/firmware/asf.xml
new file mode 100644 (file)
index 0000000..d4d90a6
--- /dev/null
@@ -0,0 +1,45 @@
+<asf xmlversion="1.0">\r
+       <project caption="USB to Serial Converter" id="lufa.projects.usb_to_serial.avr8">\r
+               <require idref="lufa.projects.usb_to_serial"/>\r
+               <require idref="lufa.boards.dummy.avr8"/>\r
+               <generator value="as5_8"/>\r
+\r
+               <device-support value="at90usb1287"/>\r
+               <config name="lufa.drivers.board.name" value="usbkey"/>\r
+\r
+               <build type="define" name="F_CPU" value="8000000UL"/>\r
+               <build type="define" name="F_USB" value="8000000UL"/>\r
+       </project>\r
+\r
+       <module type="application" id="lufa.projects.usb_to_serial" caption="USB to Serial Converter">\r
+               <info type="description" value="summary">\r
+               USB to Serial USART converter project.\r
+               </info>\r
+\r
+               <info type="keyword" value="Technology">\r
+                       <keyword value="Class Driver APIs"/>\r
+                       <keyword value="USB Device"/>\r
+                       <keyword value="CDC Class"/>\r
+               </info>\r
+\r
+               <device-support-alias value="lufa_avr8"/>\r
+               <device-support-alias value="lufa_xmega"/>\r
+               <device-support-alias value="lufa_uc3"/>\r
+\r
+               <build type="distribute" subtype="user-file" value="USBtoSerial.txt"/>\r
+               <build type="distribute" subtype="user-file" value="LUFA USBtoSerial.inf"/>\r
+\r
+               <build type="c-source" value="USBtoSerial.c"/>\r
+               <build type="c-source" value="Descriptors.c"/>\r
+               <build type="header-file" value="USBtoSerial.h"/>\r
+               <build type="header-file" value="Descriptors.h"/>\r
+\r
+               <build type="module-config" subtype="path" value="Config"/>\r
+               <build type="header-file" value="Config/LUFAConfig.h"/>\r
+\r
+               <require idref="lufa.common"/>\r
+               <require idref="lufa.platform"/>\r
+               <require idref="lufa.drivers.usb"/>\r
+               <require idref="lufa.drivers.misc.ringbuffer"/>\r
+       </module>\r
+</asf>\r
diff --git a/firmware/makefile b/firmware/makefile
new file mode 100644 (file)
index 0000000..e9a153c
--- /dev/null
@@ -0,0 +1,48 @@
+#\r
+#             LUFA Library\r
+#     Copyright (C) Dean Camera, 2013.\r
+#\r
+#  dean [at] fourwalledcubicle [dot] com\r
+#           www.lufa-lib.org\r
+#\r
+# --------------------------------------\r
+#         LUFA Project Makefile.\r
+# --------------------------------------\r
+\r
+# Run "make help" for target help.\r
+\r
+MCU          = atmega32u2\r
+ARCH         = AVR8\r
+BOARD        = USBKEY\r
+F_CPU        = 16000000\r
+F_USB        = $(F_CPU)\r
+OPTIMIZATION = s\r
+TARGET       = USBtoSerial\r
+SRC          = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)\r
+LUFA_PATH    = ../../LUFA\r
+CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/\r
+LD_FLAGS     =\r
+\r
+# my modules\r
+\r
+# SRC += blahblah\r
+\r
+# Default target\r
+all:\r
+\r
+# Include LUFA build script makefiles\r
+include $(LUFA_PATH)/Build/lufa_core.mk\r
+include $(LUFA_PATH)/Build/lufa_sources.mk\r
+include $(LUFA_PATH)/Build/lufa_build.mk\r
+include $(LUFA_PATH)/Build/lufa_cppcheck.mk\r
+include $(LUFA_PATH)/Build/lufa_doxygen.mk\r
+include $(LUFA_PATH)/Build/lufa_dfu.mk\r
+include $(LUFA_PATH)/Build/lufa_hid.mk\r
+include $(LUFA_PATH)/Build/lufa_avrdude.mk\r
+include $(LUFA_PATH)/Build/lufa_atprogram.mk\r
+\r
+.PHONY: all\r
+\r
+program: all\r
+\r
+       dfu-programmer $(MCU) erase && dfu-programmer $(MCU) flash $(TARGET).hex && dfu-programmer $(MCU) start
\ No newline at end of file
diff --git a/firmware/makefile~ b/firmware/makefile~
new file mode 100644 (file)
index 0000000..b3122e3
--- /dev/null
@@ -0,0 +1,44 @@
+#\r
+#             LUFA Library\r
+#     Copyright (C) Dean Camera, 2013.\r
+#\r
+#  dean [at] fourwalledcubicle [dot] com\r
+#           www.lufa-lib.org\r
+#\r
+# --------------------------------------\r
+#         LUFA Project Makefile.\r
+# --------------------------------------\r
+\r
+# Run "make help" for target help.\r
+\r
+MCU          = atmega32u2\r
+ARCH         = AVR8\r
+BOARD        = USBKEY\r
+F_CPU        = 16000000\r
+F_USB        = $(F_CPU)\r
+OPTIMIZATION = s\r
+TARGET       = USBtoSerial\r
+SRC          = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)\r
+LUFA_PATH    = ../../LUFA\r
+CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/\r
+LD_FLAGS     =\r
+\r
+# Default target\r
+all:\r
+\r
+# Include LUFA build script makefiles\r
+include $(LUFA_PATH)/Build/lufa_core.mk\r
+include $(LUFA_PATH)/Build/lufa_sources.mk\r
+include $(LUFA_PATH)/Build/lufa_build.mk\r
+include $(LUFA_PATH)/Build/lufa_cppcheck.mk\r
+include $(LUFA_PATH)/Build/lufa_doxygen.mk\r
+include $(LUFA_PATH)/Build/lufa_dfu.mk\r
+include $(LUFA_PATH)/Build/lufa_hid.mk\r
+include $(LUFA_PATH)/Build/lufa_avrdude.mk\r
+include $(LUFA_PATH)/Build/lufa_atprogram.mk\r
+\r
+.PHONY: all\r
+\r
+program: all\r
+\r
+       dfu-programmer $(MCU) erase && dfu-programmer $(MCU) flash $(TARGET).hex && dfu-programmer $(MCU) start
\ No newline at end of file
diff --git a/firmware/rfm70.c b/firmware/rfm70.c
new file mode 100644 (file)
index 0000000..eeda2f4
--- /dev/null
@@ -0,0 +1,533 @@
+/*\r
+       Diese Library bassiert auf der Arduino RFM70 Library, ich habe sie lediglich so\r
+       angepasst, dass man sie auf einem AVR und ohne zusätzliche Libs von Arduino\r
+       verwenden kann.\r
+\r
+       Es sind nur die wichtigstens Funktionen implementiert!\r
+       Bei Fragen oder Anregungen:\r
+       Mein Blog: http:://projects.web4clans.com\r
+       Meine Email: daniel.weber@web4clans.com\r
+\r
+*/\r
+\r
+#include "rfm70.h"\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Register initialization values and command macros //\r
+///////////////////////////////////////////////////////////////////////////////\r
\r
+//************ Address definition commands\r
+const uint8_t PROGMEM RFM70_cmd_adrRX0[] = { (0x20|0x0A), 0x34,0x43,0x10,0x10,0x01};\r
+const uint8_t PROGMEM RFM70_cmd_adrTX[]  = { (0x20|0x10), 0x34,0x43,0x10,0x10,0x01};\r
+const uint8_t PROGMEM RFM70_cmd_adrRX1[] = { (0x20|0x0B), 0x35,0x43,0x10,0x10,0x02};\r
\r
+//************ Bank0 register initialization commands\r
+ const uint8_t PROGMEM RFM70_bank0Init[][2] = {\r
+  // address data\r
+  { (0x20|0x00), 0x0F }, //Disable CRC ,CRC=1byte, POWER UP, TX\r
+  { (0x20|0x01), 0x3F }, //Enable auto acknowledgement data pipe0-5\r
+  { (0x20|0x02), 0x3F }, //Enable RX Addresses pipe0-5\r
+  { (0x20|0x03), 0x03 }, //RX/TX address field width 5byte\r
+  { (0x20|0x04), 0x08 }, //x = 250 ms = 4000ms, y = 15 tries\r
+  { (0x20|0x05), 0x17 }, //channel = 0x17\r
+  { (0x20|0x06), 0x3F }, //air data rate-2M,out power 5dbm,setup LNA gain high (0dBM)\r
+  { (0x20|0x07), 0x07 }, //\r
+  { (0x20|0x08), 0x00 }, //\r
+  { (0x20|0x09), 0x00 }, //\r
+  { (0x20|0x0C), 0xc3 }, //LSB Addr pipe 2\r
+  { (0x20|0x0D), 0xc4 }, //LSB Addr pipe 3\r
+  { (0x20|0x0E), 0xc5 }, //LSB Addr pipe 4\r
+  { (0x20|0x0F), 0xc6 }, //LSB Addr pipe 5\r
+  { (0x20|0x11), 0x20 }, //Payload len pipe0\r
+  { (0x20|0x12), 0x20 }, //Payload len pipe0\r
+  { (0x20|0x13), 0x20 }, //Payload len pipe0\r
+  { (0x20|0x14), 0x20 }, //Payload len pipe0\r
+  { (0x20|0x15), 0x20 }, //Payload len pipe0\r
+  { (0x20|0x16), 0x20 }, //Payload len pipe0\r
+  { (0x20|0x17), 0x20 }, //Payload len pipe0\r
+  { (0x20|0x1C), 0x3F }, //Enable dynamic payload legth data pipe0-5\r
+  { (0x20|0x1D), 0x07 } //Enables Dynamic Payload Length,Enables Payload with ACK\r
+};\r
\r
+//************ Bank1 register initialization commands\r
+ const uint8_t PROGMEM RFM70_bank1Init[][5] = {\r
+  // address data\r
+  { (0x20|0x00), 0x40, 0x4B, 0x01, 0xE2 },\r
+  { (0x20|0x01), 0xC0, 0x4B, 0x00, 0x00 },\r
+  { (0x20|0x02), 0xD0, 0xFC, 0x8C, 0x02 },\r
+  { (0x20|0x03), 0x99, 0x00, 0x39, 0x41 },\r
+  { (0x20|0x04), 0xb9, 0x9E, 0x86, 0x0B }, // b9? f9?\r
+  { (0x20|0x05), 0x24, 0x06, 0x7F, 0xA6 },\r
+  { (0x20|0x06), 0x00, 0x00, 0x00, 0x00 },\r
+  { (0x20|0x07), 0x00, 0x00, 0x00, 0x00 },\r
+  { (0x20|0x08), 0x00, 0x00, 0x00, 0x00 },\r
+  { (0x20|0x09), 0x00, 0x00, 0x00, 0x00 },\r
+  { (0x20|0x0a), 0x00, 0x00, 0x00, 0x00 },\r
+  { (0x20|0x0b), 0x00, 0x00, 0x00, 0x00 },\r
+  { (0x20|0x0C), 0x00, 0x12, 0x73, 0x00 },\r
+  { (0x20|0x0D), 0x36, 0xb4, 0x80, 0x00 }\r
+};\r
\r
+//************ Bank1 register 14 initialization commands\r
+ const uint8_t PROGMEM RFM70_bank1R0EInit[] = {\r
+  // address Data...\r
+  (0x20|0x0E), 0x41,0x20,0x08,0x04,0x81,0x20,0xCF,0xF7,0xFE,0xFF,0xFF\r
+};\r
+\r
+\r
+//************ other commands: { <command>, <data>, ... }\r
+const uint8_t PROGMEM RFM70_cmd_switch_cfg[] = { 0x50, 0x53 }; // switch Register Bank\r
+const uint8_t PROGMEM RFM70_cmd_flush_rx[] = { 0xe2, 0x00 }; // flush RX FIFO\r
+const uint8_t PROGMEM RFM70_cmd_flush_tx[] = { 0xe1, 0x00 }; // flush TX FIFO\r
+const uint8_t PROGMEM RFM70_cmd_activate[] = { 0x50, 0x73 }; // Activation command\r
+const uint8_t PROGMEM RFM70_cmd_tog1[]={ (0x20|0x04), 0xd9 | 0x06, 0x9e, 0x86, 0x0b }; //assosciated with set1[4]!\r
+const uint8_t PROGMEM RFM70_cmd_tog2[]={ (0x20|0x04), 0xd9 & ~0x06, 0x9e, 0x86, 0x0b}; //assosciated with set1[4]!\r
+\r
+\r
+\r
+void initSPI(uint8_t clk_div)\r
+{\r
+       // set the pin direction to output\r
+       DDR_SPI |= (1<<SCK)|(1<<MOSI)|(1<<CSN);\r
+\r
+       // chip select to high\r
+       PORT_SPI |= (1<<CSN);\r
+       // other to low\r
+       PORT_SPI &=~((1<<MOSI)|(1<<SCK));\r
+       \r
+       // init SPI\r
+       SPCR = (1<<SPE)|(1<<MSTR);\r
+\r
+       // det clock divider\r
+       spiSetClockDivider(clk_div);\r
+\r
+\r
+}\r
+\r
+void initHardware(uint8_t irq)\r
+{\r
+       // set the CE ddr to output\r
+       DDR_SPI |= (1<<CE);\r
+       // and set it to low\r
+       PORT_SPI &=~(1<<CE);\r
+\r
+       if (irq != -1) \r
+       DDRD &=~ (1<<IRQ);\r
+\r
+\r
+}\r
+\r
+void initRegisters(void)\r
+{\r
+       // init bank 0 registers\r
+       selectBank(0);\r
+\r
+       for (int i = 0; i < 20; i++)\r
+       writeRegVal(pgm_read_byte(&RFM70_bank0Init[i][0]), pgm_read_byte(&RFM70_bank0Init[i][1]));\r
+\r
+\r
+       // init address registers in bank 0\r
+       writeRegPgmBuf((uint8_t *)RFM70_cmd_adrRX0, sizeof(RFM70_cmd_adrRX0));\r
+       writeRegPgmBuf((uint8_t *)RFM70_cmd_adrRX1, sizeof(RFM70_cmd_adrRX1));\r
+       writeRegPgmBuf((uint8_t *)RFM70_cmd_adrTX, sizeof(RFM70_cmd_adrTX));\r
+\r
+       // activate Feature register\r
+       if(!readRegVal(RFM70_REG_FEATURE))\r
+       writeRegPgmBuf((uint8_t *)RFM70_cmd_activate, sizeof(RFM70_cmd_activate));\r
+\r
+       // now set Registers 1D and 1C\r
+       writeRegVal(pgm_read_byte(&RFM70_bank0Init[22][0]), pgm_read_byte(&RFM70_bank0Init[22][1]));\r
+       writeRegVal(pgm_read_byte(&RFM70_bank0Init[21][0]), pgm_read_byte(&RFM70_bank0Init[21][1]));\r
+\r
+       // init bank 1 registers\r
+       selectBank(1);\r
+\r
+       for (int i=0; i < 14; i++)\r
+       writeRegPgmBuf((uint8_t *)RFM70_bank1Init[i], sizeof(RFM70_bank1Init[i]));\r
+\r
+       // set ramp curve\r
+       writeRegPgmBuf((uint8_t *)RFM70_bank1R0EInit, sizeof(RFM70_bank1R0EInit));\r
+\r
+\r
+       // do we have to toggle some bits here like in the example code?\r
+       writeRegPgmBuf((uint8_t *)RFM70_cmd_tog1, sizeof(RFM70_cmd_tog1));\r
+       writeRegPgmBuf((uint8_t *)RFM70_cmd_tog2, sizeof(RFM70_cmd_tog2));\r
+\r
+       _delay_ms(RFM70_END_INIT_WAIT_MS);\r
+\r
+       //Check the ChipID\r
+       if (readRegVal(0x08) != 0x63) \r
+       debug(RFM70_DEBUG_WRONG_CHIP_ID);\r
+       else\r
+       //uart_puts("load rfm70 register successful\n");\r
+\r
+       selectBank(0);\r
+       setModeRX();\r
+}\r
+\r
+void Begin(void) \r
+{\r
+  setBegin(-1, RFM77_DEFAULT_SPI_CLOCK_DIV);\r
+}\r
+\r
+\r
+void setBegin(uint8_t irq, uint8_t clk_div) \r
+{\r
+       initHardware(irq);\r
+       initSPI(clk_div);\r
+       _delay_ms(RFM70_BEGIN_INIT_WAIT_MS);\r
+       initRegisters();\r
+ }\r
+\r
+\r
+\r
+uint8_t transmitSPI(uint8_t val) \r
+{\r
+  SPDR = val;\r
+  while (!(SPSR & _BV(SPIF)))\r
+    ;\r
+  return SPDR;\r
+}\r
+\r
+void selectBank(uint8_t bank) \r
+{\r
+       uint8_t tmp = readRegVal(0x07) & 0x80;\r
+       if(bank) \r
+       {\r
+       if(!tmp)\r
+       writeRegPgmBuf((uint8_t *)RFM70_cmd_switch_cfg, sizeof(RFM70_cmd_switch_cfg));\r
+       } \r
+       else \r
+       {\r
+       if(tmp)\r
+               writeRegPgmBuf((uint8_t *)RFM70_cmd_switch_cfg, sizeof(RFM70_cmd_switch_cfg));\r
+       }\r
+}\r
+\r
+void setMode(uint8_t mode) \r
+{\r
+  if (mode == 1)\r
+    setModeRX();\r
+  else\r
+    setModeTX();\r
+}\r
+\r
+\r
+void setModeRX(void)\r
+{\r
+  uint8_t val;\r
+\r
+  writeRegPgmBuf((uint8_t *)RFM70_cmd_flush_rx, sizeof(RFM70_cmd_flush_rx)); // Flush RX FIFO\r
+  val = readRegVal(RFM70_REG_STATUS); // Read Status\r
+  writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_STATUS, val); // Reset IRQ bits\r
+  PORT_SPI &=~ (1<<CE); // RFM chip disable\r
+  // set PRIM_RX bit to 1\r
+  val=readRegVal(RFM70_REG_CONFIG);\r
+  val |= RFM70_PIN_PRIM_RX;\r
+  writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_CONFIG, val);\r
+  PORT_SPI |= (1<<CE); // RFM chip enable\r
+}\r
+\r
+\r
+void setModeTX(void)\r
+{\r
+       uint8_t val;\r
+\r
+       writeRegPgmBuf((uint8_t *)RFM70_cmd_flush_tx, sizeof(RFM70_cmd_flush_tx)); // Flush TX FIFO\r
+       PORT_SPI &=~ (1<<CE); // disable rfm70\r
+       // set PRIM_RX bit to 0\r
+       val=readRegVal(RFM70_REG_CONFIG);\r
+       val &= ~RFM70_PIN_PRIM_RX;\r
+       writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_CONFIG, val);\r
+       PORT_SPI |= (1<<CE); // RFM chip enable\r
+}\r
+\r
+uint8_t getMode(void) \r
+{\r
+  return readRegVal(RFM70_REG_CONFIG) & RFM70_PIN_PRIM_RX;\r
+}\r
+\r
+\r
+void setChannel(uint8_t cnum)\r
+{\r
+  writeRegVal( RFM70_CMD_WRITE_REG | RFM70_REG_RF_CH, cnum);\r
+}\r
+\r
+uint8_t getChannel(void) \r
+{\r
+  return readRegVal(RFM70_REG_RF_CH);\r
+}\r
+\r
+\r
+uint8_t configRxPipe(uint8_t pipe_nr, uint8_t * adr, uint8_t plLen, uint8_t en_aa) \r
+{\r
+\r
+       uint8_t tmp;\r
+       uint8_t nr = pipe_nr -1;\r
+  \r
+       if(plLen > 32 || nr > 5 || en_aa > 1)\r
+       return 0;\r
+\r
+       // write address\r
+       if(nr<2)      // full length for rx pipe 0 an 1\r
+       writeRegCmdBuf(RFM70_CMD_WRITE_REG | (RFM70_REG_RX_ADDR_P0 + nr), adr, sizeof(adr));\r
+       else // only LSB for pipes 2..5\r
+       writeRegVal(RFM70_CMD_WRITE_REG | (RFM70_REG_RX_ADDR_P0 + nr), adr[0]); //ODO:check this\r
+  \r
+       // static\r
+       if (plLen) {\r
+       // set payload len\r
+       writeRegVal(RFM70_CMD_WRITE_REG | (RFM70_REG_RX_PW_P0 + nr), plLen);\r
+               // set EN_AA bit\r
+        tmp = readRegVal(RFM70_REG_EN_AA);\r
+               if (en_aa)\r
+               tmp |= 1 << nr;\r
+               else\r
+                tmp &= ~(1 << nr);\r
+        writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_EN_AA, tmp);\r
+        // clear DPL bit\r
+        tmp = readRegVal(RFM70_REG_DYNPD);\r
+        tmp &= ~(1 << nr);\r
+        writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_DYNPD, tmp);        \r
+        // set Enable pipe bit\r
+        enableRxPipe(nr);\r
+       }\r
+       // dynamic\r
+       else \r
+       {\r
+               // set payload len to default\r
+               writeRegVal(RFM70_CMD_WRITE_REG | (RFM70_REG_RX_PW_P0 + nr), 0x20);\r
+               // set EN_AA bit\r
+               tmp = readRegVal(RFM70_REG_EN_AA);\r
+               tmp |= 1 << nr;\r
+               writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_EN_AA, tmp);\r
+               // set DPL bit\r
+               tmp = readRegVal(RFM70_REG_DYNPD);\r
+               tmp |= 1 << nr;\r
+               writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_DYNPD, tmp);\r
+               // set Enable pipe bit\r
+               enableRxPipe(nr);\r
+       }\r
+  return 1;\r
+}\r
+\r
+void enableRxPipe(uint8_t pipe_nr) \r
+{\r
+       uint8_t nr = pipe_nr - 1;\r
+       if (nr > 5) return;\r
+       uint8_t tmp;\r
+       // set Enable pipe bit\r
+       tmp = readRegVal(RFM70_REG_EN_RXADDR);\r
+       tmp |= 1 << nr;\r
+       writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_EN_RXADDR, tmp);\r
+}\r
+\r
+void disableRxPipe(uint8_t pipe_nr) \r
+{\r
+  uint8_t nr = pipe_nr - 1;\r
+  if (nr > 5) return;\r
+  uint8_t tmp;\r
+  // set Enable pipe bit\r
+  tmp = readRegVal(RFM70_REG_EN_RXADDR);\r
+  tmp &= ~(1 << nr);\r
+  writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_EN_RXADDR, tmp);\r
+\r
+}\r
+\r
+void configTxPipe(uint8_t * adr, uint8_t pltype) \r
+{\r
+  // write TX address\r
+  writeRegCmdBuf(RFM70_CMD_WRITE_REG | RFM70_REG_TX_ADDR, adr, sizeof(adr));\r
+  // write RX0 address\r
+  writeRegCmdBuf(RFM70_CMD_WRITE_REG | RFM70_REG_RX_ADDR_P0, adr, sizeof(adr));\r
+  // set static or dynamic payload\r
+  uint8_t tmp;\r
+  tmp = readRegVal(RFM70_REG_DYNPD);\r
+  if(pltype == TX_DPL) // dynamic\r
+        tmp |= 1;\r
+  else  \r
+    tmp &= ~(1 << 0);\r
+  writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_DYNPD, tmp);\r
+}\r
+\r
+uint8_t sendPayload(uint8_t * payload, uint8_t len, uint8_t toAck)     // choose 0=nAck, 1=AckRequest\r
+{\r
+\r
+       // check TX_FIFO\r
+       uint8_t status;\r
+\r
+       status = readRegVal(RFM70_REG_FIFO_STATUS); \r
+\r
+       if (status & RFM70_FIFO_STATUS_TX_FULL) \r
+       {\r
+       debug(RFM70_DEBUG_FIFO_FULL);\r
+       return 0;\r
+       }\r
+\r
+\r
+       // send payload\r
+       PORT_SPI &=~ (1<<CSN);\r
+       _delay_ms(RFM70_CS_DELAY);\r
+\r
+       if(toAck == -1)\r
+       transmitSPI(RFM70_CMD_W_ACK_PAYLOAD);\r
+       else if (toAck == 0)\r
+       transmitSPI(RFM70_CMD_W_TX_PAYLOAD_NOACK);\r
+       else\r
+       transmitSPI(RFM70_CMD_WR_TX_PLOAD);\r
+\r
+       \r
+       while(len--) \r
+       {\r
+       transmitSPI(*(payload++));\r
+               //uart_putc(*payload);\r
+               //uart_puts(", ");\r
+       }\r
+       PORT_SPI |= (1<<CSN);\r
+       _delay_ms(RFM70_CS_DELAY);\r
+       //uart_puts("\n");\r
+       //PORTA ^= (1<<PA4);\r
+       return 1;\r
+}\r
+\r
+uint8_t receivePayload(uint8_t *payload)\r
+{\r
+       uint8_t len;\r
+       // check RX_FIFO\r
+       uint8_t status;\r
+       status = readRegVal(RFM70_REG_STATUS);\r
+       if (status & RFM70_IRQ_STATUS_RX_DR) { // RX_DR\r
+               //PORTA ^= (1<<PA4);\r
+       //while(1) {\r
+       uint8_t fifo_sta;\r
+       len = readRegVal(RFM70_CMD_RX_PL_WID); // Payload width\r
+       readRegBuf(RFM70_CMD_RD_RX_PLOAD, payload, len);\r
+       fifo_sta = readRegVal(RFM70_REG_FIFO_STATUS);\r
+       //if (fifo_sta & RFM70_FIFO_STATUS_RX_EMPTY) break; // read until RX_FIFO empty\r
+       //}\r
+               \r
+        if (fifo_sta & RFM70_FIFO_STATUS_RX_EMPTY) {\r
+               status|= 0x40 & 0xCF; // clear status bit rx_dr\r
+               writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_STATUS, status); \r
+        }\r
+       return len;\r
+       }\r
+       else\r
+       {\r
+               \r
+       return 0;\r
+       }\r
+}\r
+\r
+\r
+void flushTxFIFO() \r
+{\r
+  writeRegPgmBuf((uint8_t *)RFM70_cmd_flush_tx, sizeof(RFM70_cmd_flush_tx)); // Flush TX FIFO\r
+}\r
+\r
+void flushRxFIFO() \r
+{\r
+  writeRegPgmBuf((uint8_t *)RFM70_cmd_flush_rx, sizeof(RFM70_cmd_flush_rx)); // Flush RX FIFO\r
+}\r
+\r
+\r
+\r
+\r
+\r
+uint8_t readRegVal(uint8_t cmd) \r
+{\r
+       uint8_t res;\r
+       PORT_SPI &=~ (1<<CSN);\r
+       _delay_ms(RFM70_CS_DELAY);\r
+\r
+       transmitSPI(cmd);\r
+\r
+       res=transmitSPI(0);\r
+       PORT_SPI |= (1<<CSN);\r
+       _delay_ms(RFM70_CS_DELAY);\r
+       return res;\r
+}\r
+\r
+uint8_t writeRegVal(uint8_t cmd, uint8_t val) \r
+{\r
+  PORT_SPI &=~ (1<<CSN);\r
+  _delay_ms(RFM70_CS_DELAY);\r
+  transmitSPI(cmd);\r
+  transmitSPI(val);\r
+  PORT_SPI |= (1<<CSN);\r
+  _delay_ms(RFM70_CS_DELAY);\r
+  return 1;\r
+}\r
+\r
+void readRegBuf(uint8_t reg, uint8_t * buf, uint8_t len) \r
+{\r
+       uint8_t status, byte_ctr;\r
+       PORT_SPI &=~ (1<<CSN);\r
+       _delay_ms(RFM70_CS_DELAY);\r
+       status = transmitSPI(reg); // Select register to write, and read status UINT8\r
+       for(byte_ctr = 0; byte_ctr < len; byte_ctr++)\r
+               buf[byte_ctr] = transmitSPI(0); // Perform SPI_RW to read UINT8 from RFM70\r
+       PORT_SPI |= (1<<CSN);\r
+       _delay_ms(RFM70_CS_DELAY);\r
+}\r
+\r
+\r
+\r
+uint8_t writeRegPgmBuf(uint8_t * cmdbuf, uint8_t len) \r
+{\r
+  PORT_SPI &=~ (1<<CSN);\r
+  _delay_ms(RFM70_CS_DELAY);\r
+  while(len--) {\r
+    transmitSPI(pgm_read_byte(cmdbuf++));\r
+  }\r
+  PORT_SPI |= (1<<CSN);\r
+  _delay_ms(RFM70_CS_DELAY);\r
+  return 1;\r
+}\r
+\r
+uint8_t writeRegCmdBuf(uint8_t cmd, uint8_t * buf, uint8_t len) \r
+{\r
+       PORT_SPI &=~ (1<<CSN);\r
+       _delay_ms(RFM70_CS_DELAY);\r
+       transmitSPI(cmd);\r
+       while(len--) \r
+       {\r
+       transmitSPI(*(buf++));\r
+       }\r
+       PORT_SPI |= (1<<CSN);\r
+       _delay_ms(RFM70_CS_DELAY);\r
+       return 1;\r
+}\r
+\r
+void configRfPower(uint8_t pwr) \r
+{\r
+  if (pwr > 3) return;\r
+  uint8_t tmp = readRegVal(RFM70_REG_RF_SETUP);\r
+  tmp &= 0xF9;\r
+  tmp |= pwr << 1;\r
+  writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_RF_SETUP, tmp);\r
+}\r
+\r
+\r
+\r
+\r
+void debug(uint8_t token)\r
+{\r
+       switch(token)\r
+       {\r
+               case 0x01:\r
+               //uart_puts("rfm error: the reseive chip id is invalid!\n");\r
+               break;\r
+\r
+               case 0x02:\r
+               //uart_puts("rfm error: the fifo is full!\n");\r
+               break;\r
+       }\r
+}\r
+\r
+void spiSetClockDivider(uint8_t rate) \r
+{\r
+  SPCR = (SPCR & ~SPI_CLOCK_MASK) | (rate & SPI_CLOCK_MASK);\r
+  SPSR = (SPSR & ~SPI_2XCLOCK_MASK) | ((rate >> 2) & SPI_2XCLOCK_MASK);\r
+}\r
+\r
+\r
diff --git a/firmware/rfm70.h b/firmware/rfm70.h
new file mode 100644 (file)
index 0000000..5e76657
--- /dev/null
@@ -0,0 +1,172 @@
+/*\r
+       Diese Library bassiert auf der Arduino RFM70 Library, ich habe sie lediglich so\r
+       angepasst, dass man sie auf einem AVR und ohne zusätzliche Libs von Arduino\r
+       verwenden kann.\r
+\r
+       Es sind nur die wichtigstens Funktionen implementiert!\r
+       Bei Fragen oder Anregungen:\r
+       Mein Blog: http:://projects.web4clans.com\r
+       Meine Email: daniel.weber@web4clans.com\r
+\r
+*/\r
+\r
+#include <inttypes.h>\r
+#include <avr/io.h>\r
+#include <avr/interrupt.h>\r
+#include <util/delay.h>\r
+#include <avr/pgmspace.h>\r
+\r
+\r
+//************************RFM function parameter constants********************************//\r
+#define WITH_ACK     0x01 // parameter for sendPayload(..): send with ack expectation\r
+#define NO_ACK       0x00 // parameter for sendPayload(..): send without ack expectation\r
+#define MODE_PTX     0x00 // parameter for setMode(mode): set to transmitter\r
+#define MODE_PRX     0x01 // parameter for setMode(mode): set to receiver\r
+#define EN_AA        0x01 // parameter for configRxPipe(..): enable pipe auto ack\r
+#define NO_AA        0x00 // parameter for configRxPipe(..): disable pipe auto ack\r
+#define TX_DPL       0x01 // parameter for configTxPipe(..): enable dynamic payload for PTX\r
+#define TX_SPL       0x00 // parameter for configTxPipe(..): enable static payload for PTX\r
+#define CRC0         0x00 // parameter for configCRC(crc): disable CRC\r
+#define CRC1         0x01 // parameter for configCRC(crc): 1 byte CRC\r
+#define CRC2         0x02 // parameter for configCRC(crc): 2 byte CRC\r
+#define MBPS1        0x01 // parameter for configSpeed(speed): 1Mbps\r
+#define MBPS2        0x02 // parameter for configSpeed(speed): 2Mbps\r
+#define DBMM10       0x00 // parameter for confRfPwr(pwr): -10 dBm\r
+#define DBMM5        0x01 // parameter for confRfPwr(pwr): -5 dBm\r
+#define DBM0         0x02 // parameter for confRfPwr(pwr): 0 dBm\r
+#define DBM5         0x03 // parameter for confRfPwr(pwr): +5 dBm\r
+#define ADR_WIDTH3   0x03 // parameter for confAdrWidth(width): 3 byte\r
+#define ADR_WIDTH4   0x03 // parameter for confAdrWidth(width): 4 byte\r
+#define ADR_WIDTH5   0x03 // parameter for confAdrWidth(width): 5 byte\r
+#define PWR_OFF      0x00 // parameter for setPower(pwr): off\r
+#define PWR_ON       0x01 // parameter for setPower(pwr): on\r
+\r
+\r
+//************************RFM Definitions************************************************//\r
+#define RFM70_MAX_PACKET_LEN 32// max value is 32\r
+#define RFM70_BEGIN_INIT_WAIT_MS 3000 // pause before Init Registers\r
+#define RFM70_END_INIT_WAIT_MS 100 // pause after init registers\r
+#define RFM70_CS_DELAY 0 // wait ms after CS pin state change default 0\r
+\r
+//************************RFM COMMAND and REGISTER****************************************//\r
+// SPI(RFM70) commands\r
+#define RFM70_CMD_READ_REG 0x00 // Define read command to register\r
+#define RFM70_CMD_WRITE_REG 0x20 // Define write command to register\r
+#define RFM70_CMD_RD_RX_PLOAD 0x61 // Define RX payload command\r
+#define RFM70_CMD_WR_TX_PLOAD 0xA0 // Define TX payload command\r
+#define RFM70_CMD_FLUSH_TX 0xE1 // Define flush TX register command\r
+#define RFM70_CMD_FLUSH_RX 0xE2 // Define flush RX register command\r
+#define RFM70_CMD_REUSE_TX_PL 0xE3 // Define reuse TX payload register command\r
+#define RFM70_CMD_W_TX_PAYLOAD_NOACK 0xb0 // Define TX payload NOACK command\r
+#define RFM70_CMD_W_ACK_PAYLOAD 0xa8 // Define Write ack command\r
+#define RFM70_CMD_ACTIVATE 0x50 // Define feature activation command\r
+#define RFM70_CMD_RX_PL_WID 0x60 // Define received payload width command\r
+#define RFM70_CMD_NOP_NOP 0xFF // Define No Operation, might be used to read status register\r
+\r
+// SPI(RFM70) registers(addresses)\r
+#define RFM70_REG_CONFIG 0x00 // 'Config' register address\r
+#define RFM70_REG_EN_AA 0x01 // 'Enable Auto Acknowledgment' register address\r
+#define RFM70_REG_EN_RXADDR 0x02 // 'Enabled RX addresses' register address\r
+#define RFM70_REG_SETUP_AW 0x03 // 'Setup address width' register address\r
+#define RFM70_REG_SETUP_RETR 0x04 // 'Setup Auto. Retrans' register address\r
+#define RFM70_REG_RF_CH 0x05 // 'RF channel' register address\r
+#define RFM70_REG_RF_SETUP 0x06 // 'RF setup' register address\r
+#define RFM70_REG_STATUS 0x07 // 'Status' register address\r
+#define RFM70_REG_OBSERVE_TX 0x08 // 'Observe TX' register address\r
+#define RFM70_REG_CD 0x09 // 'Carrier Detect' register address\r
+#define RFM70_REG_RX_ADDR_P0 0x0A // 'RX address pipe0' register address\r
+#define RFM70_REG_RX_ADDR_P1 0x0B // 'RX address pipe1' register address\r
+#define RFM70_REG_RX_ADDR_P2 0x0C // 'RX address pipe2' register address\r
+#define RFM70_REG_RX_ADDR_P3 0x0D // 'RX address pipe3' register address\r
+#define RFM70_REG_RX_ADDR_P4 0x0E // 'RX address pipe4' register address\r
+#define RFM70_REG_RX_ADDR_P5 0x0F // 'RX address pipe5' register address\r
+#define RFM70_REG_TX_ADDR 0x10 // 'TX address' register address\r
+#define RFM70_REG_RX_PW_P0 0x11 // 'RX payload width, pipe0' register address\r
+#define RFM70_REG_RX_PW_P1 0x12 // 'RX payload width, pipe1' register address\r
+#define RFM70_REG_RX_PW_P2 0x13 // 'RX payload width, pipe2' register address\r
+#define RFM70_REG_RX_PW_P3 0x14 // 'RX payload width, pipe3' register address\r
+#define RFM70_REG_RX_PW_P4 0x15 // 'RX payload width, pipe4' register address\r
+#define RFM70_REG_RX_PW_P5 0x16 // 'RX payload width, pipe5' register address\r
+#define RFM70_REG_FIFO_STATUS 0x17 // 'FIFO Status Register' register address\r
+#define RFM70_REG_DYNPD 0x1c // 'Enable dynamic payload length' register address\r
+#define RFM70_REG_FEATURE 0x1d // 'Feature' register address\r
+\r
+//************************RFM Debug Tokens******************************************//\r
+#define RFM70_DEBUG_WRONG_CHIP_ID 0x01\r
+#define RFM70_DEBUG_FIFO_FULL 0x02\r
+\r
+//************************RFM SPI Constants****************************************//\r
+#define RFM77_SPI_CLOCK_DIV4 0x00\r
+#define RFM77_SPI_CLOCK_DIV16 0x01\r
+//#define RFM77_SPI_CLOCK_DIV64 0x02\r
+#define RFM77_SPI_CLOCK_DIV128 0x03\r
+#define RFM77_SPI_CLOCK_DIV2 0x04\r
+#define RFM77_SPI_CLOCK_DIV8 0x05\r
+#define RFM77_SPI_CLOCK_DIV32 0x06\r
+#define RFM77_SPI_CLOCK_DIV64 0x07\r
+#define SPI_CLOCK_MASK 0x03 // SPR1 = bit 1, SPR0 = bit 0 on SPCR\r
+#define SPI_2XCLOCK_MASK 0x01 // SPI2X = bit 0 on SPSR\r
+\r
+#define RFM77_DEFAULT_SPI_CLOCK_DIV RFM77_SPI_CLOCK_DIV2\r
+\r
+\r
+//interrupt status\r
+#define RFM70_IRQ_STATUS_RX_DR 0x40 // Status bit RX_DR IRQ\r
+#define RFM70_IRQ_STATUS_TX_DS 0x20 // Status bit TX_DS IRQ\r
+#define RFM70_IRQ_STATUS_MAX_RT 0x10 // Status bit MAX_RT IRQ\r
+\r
+#define RFM70_IRQ_STATUS_TX_FULL 0x01 \r
+\r
+\r
+#define RFM70_PIN_PRIM_RX 0x01\r
+#define RFM70_PIN_POWER 0x02\r
+\r
+//FIFO_STATUS\r
+#define RFM70_FIFO_STATUS_TX_REUSE 0x40\r
+#define RFM70_FIFO_STATUS_TX_FULL 0x20\r
+#define RFM70_FIFO_STATUS_TX_EMPTY 0x10\r
+\r
+#define RFM70_FIFO_STATUS_RX_FULL 0x02\r
+#define RFM70_FIFO_STATUS_RX_EMPTY 0x01\r
+\r
+// PIN SETUP\r
+\r
+#define DDR_SPI DDRB\r
+#define PORT_SPI PORTB\r
+#define CE   PB4\r
+#define CSN  PB0\r
+#define SCK  PB1\r
+#define MISO PB3\r
+#define MOSI PB2\r
+#define IRQ  PB5\r
+\r
+void initSPI(uint8_t clk_div);\r
+void initHardware(uint8_t irq);\r
+void initRegisters(void);\r
+uint8_t transmitSPI(uint8_t val);\r
+uint8_t readRegVal(uint8_t cmd);\r
+uint8_t writeRegVal(uint8_t cmd, uint8_t val);\r
+uint8_t writeRegPgmBuf(uint8_t * cmdbuf, uint8_t len);\r
+void readRegBuf(uint8_t reg, uint8_t * buf, uint8_t len);\r
+void selectBank(uint8_t bank);\r
+void setModeTX(void);\r
+void setModeRX(void);\r
+void setMode(uint8_t mode);\r
+uint8_t getMode(void);\r
+void setChannel(uint8_t cnum);\r
+uint8_t getChannel(void);\r
+uint8_t configRxPipe(uint8_t pipe_nr, uint8_t * adr, uint8_t plLen, uint8_t en_aa);\r
+void enableRxPipe(uint8_t pipe_nr);\r
+void debug(uint8_t token);\r
+void setModeRX(void);\r
+void spiSetClockDivider(uint8_t rate);\r
+void setBegin(uint8_t irq, uint8_t clk_div);\r
+void Begin(void);\r
+uint8_t writeRegCmdBuf(uint8_t cmd, uint8_t * buf, uint8_t len);\r
+void disableRxPipe(uint8_t pipe_nr);\r
+void configTxPipe(uint8_t * adr, uint8_t pltype);\r
+void flushTxFIFO();\r
+void flushRxFIFO();\r
+uint8_t receivePayload(uint8_t *payload);\r
+uint8_t sendPayload(uint8_t * payload, uint8_t len, uint8_t toAck);\r
+void configRfPower(uint8_t pwr);\r