From 03b59aa6f19c28036868e7ebb1ccf93a9c867073 Mon Sep 17 00:00:00 2001 From: Michael Wiebusch Date: Sat, 5 Oct 2013 22:57:21 +0200 Subject: [PATCH 1/1] this way relative mode works, very dirty code stuff --- firmware/Config/LUFAConfig.h | 93 + firmware/Descriptors.c | 260 ++ firmware/Descriptors.d | 270 ++ firmware/Descriptors.h | 89 + firmware/Descriptors.o | Bin 0 -> 11504 bytes firmware/Doxygen.conf | 1883 +++++++++++ firmware/LUFA USBtoSerial.inf | 63 + firmware/TM1001A.c | 357 ++ firmware/TM1001A.c~ | 357 ++ firmware/USBtoSerial.c | 480 +++ firmware/USBtoSerial.c~ | 480 +++ firmware/USBtoSerial.d | 307 ++ firmware/USBtoSerial.eep | 1 + firmware/USBtoSerial.elf | Bin 0 -> 148716 bytes firmware/USBtoSerial.h | 76 + firmware/USBtoSerial.hex | 394 +++ firmware/USBtoSerial.lss | 5748 +++++++++++++++++++++++++++++++++ firmware/USBtoSerial.map | 1713 ++++++++++ firmware/USBtoSerial.o | Bin 0 -> 41156 bytes firmware/USBtoSerial.sym | 357 ++ firmware/USBtoSerial.txt | 83 + firmware/asf.xml | 45 + firmware/makefile | 48 + firmware/makefile~ | 44 + firmware/rfm70.c | 533 +++ firmware/rfm70.h | 172 + 26 files changed, 13853 insertions(+) create mode 100644 firmware/Config/LUFAConfig.h create mode 100644 firmware/Descriptors.c create mode 100644 firmware/Descriptors.d create mode 100644 firmware/Descriptors.h create mode 100644 firmware/Descriptors.o create mode 100644 firmware/Doxygen.conf create mode 100644 firmware/LUFA USBtoSerial.inf create mode 100644 firmware/TM1001A.c create mode 100644 firmware/TM1001A.c~ create mode 100644 firmware/USBtoSerial.c create mode 100644 firmware/USBtoSerial.c~ create mode 100644 firmware/USBtoSerial.d create mode 100644 firmware/USBtoSerial.eep create mode 100755 firmware/USBtoSerial.elf create mode 100644 firmware/USBtoSerial.h create mode 100644 firmware/USBtoSerial.hex create mode 100644 firmware/USBtoSerial.lss create mode 100644 firmware/USBtoSerial.map create mode 100644 firmware/USBtoSerial.o create mode 100644 firmware/USBtoSerial.sym create mode 100644 firmware/USBtoSerial.txt create mode 100644 firmware/asf.xml create mode 100644 firmware/makefile create mode 100644 firmware/makefile~ create mode 100644 firmware/rfm70.c create mode 100644 firmware/rfm70.h diff --git a/firmware/Config/LUFAConfig.h b/firmware/Config/LUFAConfig.h new file mode 100644 index 0000000..3fbf1f1 --- /dev/null +++ b/firmware/Config/LUFAConfig.h @@ -0,0 +1,93 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2013. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2013 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief LUFA Library Configuration Header File + * + * This header file is used to configure LUFA's compile time options, + * as an alternative to the compile time constants supplied through + * a makefile. + * + * For information on what each token does, refer to the LUFA + * manual section "Summary of Compile Tokens". + */ + +#ifndef _LUFA_CONFIG_H_ +#define _LUFA_CONFIG_H_ + + #if (ARCH == ARCH_AVR8) + + /* Non-USB Related Configuration Tokens: */ +// #define DISABLE_TERMINAL_CODES + + /* USB Class Driver Related Tokens: */ +// #define HID_HOST_BOOT_PROTOCOL_ONLY +// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here} +// #define HID_USAGE_STACK_DEPTH {Insert Value Here} +// #define HID_MAX_COLLECTIONS {Insert Value Here} +// #define HID_MAX_REPORTITEMS {Insert Value Here} +// #define HID_MAX_REPORT_IDS {Insert Value Here} +// #define NO_CLASS_DRIVER_AUTOFLUSH + + /* General USB Driver Related Tokens: */ +// #define ORDERED_EP_CONFIG + #define USE_STATIC_OPTIONS (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL) + #define USB_DEVICE_ONLY +// #define USB_HOST_ONLY +// #define USB_STREAM_TIMEOUT_MS {Insert Value Here} +// #define NO_LIMITED_CONTROLLER_CONNECT +// #define NO_SOF_EVENTS + + /* USB Device Mode Driver Related Tokens: */ +// #define USE_RAM_DESCRIPTORS + #define USE_FLASH_DESCRIPTORS +// #define USE_EEPROM_DESCRIPTORS +// #define NO_INTERNAL_SERIAL + #define FIXED_CONTROL_ENDPOINT_SIZE 8 + #define DEVICE_STATE_AS_GPIOR 0 + #define FIXED_NUM_CONFIGURATIONS 1 +// #define CONTROL_ONLY_DEVICE + #define INTERRUPT_CONTROL_ENDPOINT +// #define NO_DEVICE_REMOTE_WAKEUP +// #define NO_DEVICE_SELF_POWER + + /* USB Host Mode Driver Related Tokens: */ +// #define HOST_STATE_AS_GPIOR 0 +// #define USB_HOST_TIMEOUT_MS {Insert Value Here} +// #define HOST_DEVICE_SETTLE_DELAY_MS {Insert Value Here} +// #define NO_AUTO_VBUS_MANAGEMENT +// #define INVERTED_VBUS_ENABLE_LINE + + #else + + #error Unsupported architecture for this LUFA configuration file. + + #endif +#endif diff --git a/firmware/Descriptors.c b/firmware/Descriptors.c new file mode 100644 index 0000000..765b281 --- /dev/null +++ b/firmware/Descriptors.c @@ -0,0 +1,260 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2013. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2013 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * USB Device Descriptors, for library use when in USB device mode. Descriptors are special + * computer-readable structures which the host requests upon device enumeration, to determine + * the device's capabilities and functions. + */ + +#include "Descriptors.h" + + +/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall + * device characteristics, including the supported USB version, control endpoint size and the + * number of device configurations. The descriptor is read out by the USB host when the enumeration + * process begins. + */ +const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = +{ + .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, + + .USBSpecification = VERSION_BCD(01.10), + .Class = CDC_CSCP_CDCClass, + .SubClass = CDC_CSCP_NoSpecificSubclass, + .Protocol = CDC_CSCP_NoSpecificProtocol, + + .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, + + .VendorID = 0x03EB, + .ProductID = 0x204B, + .ReleaseNumber = VERSION_BCD(00.01), + + .ManufacturerStrIndex = 0x01, + .ProductStrIndex = 0x02, + .SerialNumStrIndex = USE_INTERNAL_SERIAL, + + .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS +}; + +/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage + * of the device in one of its supported configurations, including information about any device interfaces + * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting + * a configuration so that the host may correctly communicate with the USB device. + */ +const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = +{ + .Config = + { + .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, + + .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), + .TotalInterfaces = 2, + + .ConfigurationNumber = 1, + .ConfigurationStrIndex = NO_DESCRIPTOR, + + .ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_SELFPOWERED), + + .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) + }, + + .CDC_CCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 0, + .AlternateSetting = 0, + + .TotalEndpoints = 1, + + .Class = CDC_CSCP_CDCClass, + .SubClass = CDC_CSCP_ACMSubclass, + .Protocol = CDC_CSCP_ATCommandProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_Functional_Header = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, + .Subtype = CDC_DSUBTYPE_CSInterface_Header, + + .CDCSpecification = VERSION_BCD(01.10), + }, + + .CDC_Functional_ACM = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, + .Subtype = CDC_DSUBTYPE_CSInterface_ACM, + + .Capabilities = 0x06, + }, + + .CDC_Functional_Union = + { + .Header = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, + .Subtype = CDC_DSUBTYPE_CSInterface_Union, + + .MasterInterfaceNumber = 0, + .SlaveInterfaceNumber = 1, + }, + + .CDC_NotificationEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = CDC_NOTIFICATION_EPADDR, + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_NOTIFICATION_EPSIZE, + .PollingIntervalMS = 0xFF + }, + + .CDC_DCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 1, + .AlternateSetting = 0, + + .TotalEndpoints = 2, + + .Class = CDC_CSCP_CDCDataClass, + .SubClass = CDC_CSCP_NoDataSubclass, + .Protocol = CDC_CSCP_NoDataProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_DataOutEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = CDC_RX_EPADDR, + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x05 + }, + + .CDC_DataInEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = CDC_TX_EPADDR, + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x05 + } +}; + +/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests + * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate + * via the language ID table available at USB.org what languages the device supports for its string descriptors. + */ +const USB_Descriptor_String_t PROGMEM LanguageString = +{ + .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, + + .UnicodeString = {LANGUAGE_ID_ENG} +}; + +/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable + * form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +const USB_Descriptor_String_t PROGMEM ManufacturerString = +{ + .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, + + .UnicodeString = L"Dean Camera" +}; + +/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, + * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +const USB_Descriptor_String_t PROGMEM ProductString = +{ + .Header = {.Size = USB_STRING_LEN(22), .Type = DTYPE_String}, + + .UnicodeString = L"LUFA USB-RS232 Adapter" +}; + +/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" + * documentation) by the application code so that the address and size of a requested descriptor can be given + * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function + * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the + * USB host. + */ +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + const void** const DescriptorAddress) +{ + const uint8_t DescriptorType = (wValue >> 8); + const uint8_t DescriptorNumber = (wValue & 0xFF); + + const void* Address = NULL; + uint16_t Size = NO_DESCRIPTOR; + + switch (DescriptorType) + { + case DTYPE_Device: + Address = &DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + break; + case DTYPE_Configuration: + Address = &ConfigurationDescriptor; + Size = sizeof(USB_Descriptor_Configuration_t); + break; + case DTYPE_String: + switch (DescriptorNumber) + { + case 0x00: + Address = &LanguageString; + Size = pgm_read_byte(&LanguageString.Header.Size); + break; + case 0x01: + Address = &ManufacturerString; + Size = pgm_read_byte(&ManufacturerString.Header.Size); + break; + case 0x02: + Address = &ProductString; + Size = pgm_read_byte(&ProductString.Header.Size); + break; + } + + break; + } + + *DescriptorAddress = Address; + return Size; +} + diff --git a/firmware/Descriptors.d b/firmware/Descriptors.d new file mode 100644 index 0000000..6168db3 --- /dev/null +++ b/firmware/Descriptors.d @@ -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 index 0000000..b237a79 --- /dev/null +++ b/firmware/Descriptors.h @@ -0,0 +1,89 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2013. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2013 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Descriptors.c. + */ + +#ifndef _DESCRIPTORS_H_ +#define _DESCRIPTORS_H_ + + /* Includes: */ + #include + + #include + + /* Macros: */ + /** Endpoint address of the CDC device-to-host notification IN endpoint. */ + #define CDC_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | 2) + + /** Endpoint address of the CDC device-to-host data IN endpoint. */ + #define CDC_TX_EPADDR (ENDPOINT_DIR_IN | 3) + + /** Endpoint address of the CDC host-to-device data OUT endpoint. */ + #define CDC_RX_EPADDR (ENDPOINT_DIR_OUT | 4) + + /** Size in bytes of the CDC device-to-host notification IN endpoint. */ + #define CDC_NOTIFICATION_EPSIZE 8 + + /** Size in bytes of the CDC data IN and OUT endpoints. */ + #define CDC_TXRX_EPSIZE 16 + + /* Type Defines: */ + /** Type define for the device configuration descriptor structure. This must be defined in the + * application code, as the configuration descriptor contains several sub-descriptors which + * vary between devices, and which describe the device's usage to the host. + */ + typedef struct + { + USB_Descriptor_Configuration_Header_t Config; + + // CDC Command Interface + USB_Descriptor_Interface_t CDC_CCI_Interface; + USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header; + USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM; + USB_CDC_Descriptor_FunctionalUnion_t CDC_Functional_Union; + USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; + + // CDC Data Interface + USB_Descriptor_Interface_t CDC_DCI_Interface; + USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; + USB_Descriptor_Endpoint_t CDC_DataInEndpoint; + } USB_Descriptor_Configuration_t; + + /* Function Prototypes: */ + uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + const void** const DescriptorAddress) + ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); + +#endif + diff --git a/firmware/Descriptors.o b/firmware/Descriptors.o new file mode 100644 index 0000000000000000000000000000000000000000..11ded1e8a2cf6f44ec752ddff5aa354e35b20b89 GIT binary patch literal 11504 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 literal 0 HcmV?d00001 diff --git a/firmware/Doxygen.conf b/firmware/Doxygen.conf new file mode 100644 index 0000000..cce7bd1 --- /dev/null +++ b/firmware/Doxygen.conf @@ -0,0 +1,1883 @@ +# Doxyfile 1.8.3.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" "). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. + +PROJECT_NAME = "LUFA Library - USB to Serial Device Project" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./Documentation/ + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. Note that you specify absolute paths here, but also +# relative paths, which will be relative from the directory where doxygen is +# started. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = YES + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, +# and language is one of the parsers supported by doxygen: IDL, Java, +# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, +# C++. For instance to make doxygen treat .inc files as Fortran files (default +# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note +# that for custom extensions you also need to set FILE_PATTERNS otherwise the +# files are not read by doxygen. + +EXTENSION_MAPPING = + +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = NO + +# When enabled doxygen tries to link words that correspond to documented classes, +# or namespaces to their corresponding documentation. Such a link can be +# prevented in individual cases by by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES (the +# default) will make doxygen replace the get and set methods by a property in +# the documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +SYMBOL_CACHE_SIZE = 0 + +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# scope will be included in the documentation. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = NO + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = NO + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = NO + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if section-label ... \endif +# and \cond section-label ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. Do not use +# file names with spaces, bibtex cannot handle them. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ./ + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = *.h \ + *.c \ + *.txt + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = Documentation/ + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = __* \ + INCLUDE_FROM_* + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page (index.html). +# This can be useful if you have a project on for instance GitHub and want reuse +# the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C, C++ and Fortran comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = NO + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If left blank doxygen will +# generate a default style sheet. Note that it is recommended to use +# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this +# tag will in the future become obsolete. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional +# user-defined cascading style sheet that is included after the standard +# style sheets created by doxygen. Using this option one can overrule +# certain style aspects. This is preferred over using HTML_STYLESHEET +# since it does not replace the standard style sheet and is therefor more +# robust against future updates. Doxygen will copy the style sheet file to +# the output directory. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. + +HTML_DYNAMIC_SECTIONS = YES + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of +# entries shown in the various tree structured indices initially; the user +# can expand and collapse entries dynamically later on. Doxygen will expand +# the tree to such a level that at most the specified number of entries are +# visible (unless a fully collapsed tree already exceeds this amount). +# So setting the number of entries 1 will produce a full collapsed tree by +# default. 0 is a special value representing an infinite number of entries +# and will result in a full expanded tree by default. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely +# identify the documentation publisher. This should be a reverse domain-name +# style string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = YES + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = YES + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. + +GENERATE_TREEVIEW = YES + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 1 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# thA MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and +# SVG. The default value is HTML-CSS, which is slower, but has the best +# compatibility. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. +# However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = NO + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a web server instead of a web client using Javascript. +# There are two flavours of web server based search depending on the +# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for +# searching and an index file used by the script. When EXTERNAL_SEARCH is +# enabled the indexing and searching needs to be provided by external tools. +# See the manual for details. + +SERVER_BASED_SEARCH = NO + +# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP +# script for searching. Instead the search results are written to an XML file +# which needs to be processed by an external indexer. Doxygen will invoke an +# external search engine pointed to by the SEARCHENGINE_URL option to obtain +# the search results. Doxygen ships with an example indexer (doxyindexer) and +# search engine (doxysearch.cgi) which are based on the open source search engine +# library Xapian. See the manual for configuration details. + +EXTERNAL_SEARCH = NO + +# The SEARCHENGINE_URL should point to a search engine hosted by a web server +# which will returned the search results when EXTERNAL_SEARCH is enabled. +# Doxygen ships with an example search engine (doxysearch) which is based on +# the open source search engine library Xapian. See the manual for configuration +# details. + +SEARCHENGINE_URL = + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed +# search data is written to a file for indexing by an external tool. With the +# SEARCHDATA_FILE tag the name of this file can be specified. + +SEARCHDATA_FILE = searchdata.xml + +# When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the +# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is +# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple +# projects and redirect the results back to the right project. + +EXTERNAL_SEARCH_ID = + +# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen +# projects other than the one defined by this configuration file, but that are +# all added to the same external search index. Each project needs to have a +# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id +# of to a relative location where the documentation can be found. +# The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ... + +EXTRA_SEARCH_MAPPINGS = + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load style sheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = YES + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = __DOXYGEN__ \ + PROGMEM + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = NO + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. + +DOT_FONTNAME = FreeSans + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = NO + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = NO + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = NO + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# managable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 10 + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = NO + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = NO + +# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = NO + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 15 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 2 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = YES + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/firmware/LUFA USBtoSerial.inf b/firmware/LUFA USBtoSerial.inf new file mode 100644 index 0000000..86a39e0 --- /dev/null +++ b/firmware/LUFA USBtoSerial.inf @@ -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 index 0000000..fa5d2c0 --- /dev/null +++ b/firmware/TM1001A.c @@ -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 index 0000000..2436f67 --- /dev/null +++ b/firmware/TM1001A.c~ @@ -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 index 0000000..3cd194c --- /dev/null +++ b/firmware/USBtoSerial.c @@ -0,0 +1,480 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2013. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2013 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Main source file for the USBtoSerial project. This file contains the main tasks of + * the project and is responsible for the initial application hardware configuration. + */ +#define F_CPU 16e6 + +#include "USBtoSerial.h" +#include +#include "TM1001A.c" +// #include "rfm70.c" + +/** Circular buffer to hold data from the host before it is sent to the device via the serial port. */ +static RingBuffer_t USBtoUSART_Buffer; + +/** Underlying data buffer for \ref USBtoUSART_Buffer, where the stored bytes are located. */ +static uint8_t USBtoUSART_Buffer_Data[128]; + +/** Circular buffer to hold data from the serial port before it is sent to the host. */ +static RingBuffer_t USARTtoUSB_Buffer; + +/** Underlying data buffer for \ref USARTtoUSB_Buffer, where the stored bytes are located. */ +static uint8_t USARTtoUSB_Buffer_Data[128]; + +/** LUFA CDC Class driver interface configuration and state information. This structure is + * passed to all CDC Class driver functions, so that multiple instances of the same class + * within a device can be differentiated from one another. + */ +USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = + { + .Config = + { + .ControlInterfaceNumber = 0, + .DataINEndpoint = + { + .Address = CDC_TX_EPADDR, + .Size = CDC_TXRX_EPSIZE, + .Banks = 1, + }, + .DataOUTEndpoint = + { + .Address = CDC_RX_EPADDR, + .Size = CDC_TXRX_EPSIZE, + .Banks = 1, + }, + .NotificationEndpoint = + { + .Address = CDC_NOTIFICATION_EPADDR, + .Size = CDC_NOTIFICATION_EPSIZE, + .Banks = 1, + }, + }, + }; + + + + + +void Usb2SerialTask(void) { + + /* Only try to read in bytes from the CDC interface if the transmit buffer is not full */ + if (!(RingBuffer_IsFull(&USBtoUSART_Buffer))) + { + int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); + + /* Read bytes from the USB OUT endpoint into the USART transmit buffer */ + if (!(ReceivedByte < 0)) + RingBuffer_Insert(&USBtoUSART_Buffer, ReceivedByte); + } + + /* 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) + { + 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()) + { + /* 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--) + { + /* 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, + RingBuffer_Peek(&USARTtoUSB_Buffer)) != ENDPOINT_READYWAIT_NoError) + { + break; + } + + /* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */ + RingBuffer_Remove(&USARTtoUSB_Buffer); + } + } + } + + /* Load the next byte from the USART transmit buffer into the USART */ + if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { + Serial_SendByte(RingBuffer_Remove(&USBtoUSART_Buffer)); +// dummy = RingBuffer_Remove(&USBtoUSART_Buffer); +// sendPayload(&dummy,1,0); + } + CDC_Device_USBTask(&VirtualSerial_CDC_Interface); + USB_USBTask(); + +} + + + +/** 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); + wdt_disable(); + + /* Disable clock division */ + clock_prescale_set(clock_div_1); + + /* Hardware Initialization */ +// LEDs_Init(); + USB_Init(); +} + +/** Event handler for the library USB Connection event. */ +void EVENT_USB_Device_Connect(void) +{ +// LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); +} + +/** Event handler for the library USB Disconnection event. */ +void EVENT_USB_Device_Disconnect(void) +{ +// LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); +} + +/** 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); + +// LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); +} + +/** Event handler for the library USB Control Request reception event. */ +void EVENT_USB_Device_ControlRequest(void) +{ + CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface); +} + +/** 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) +{ + uint8_t ReceivedByte = UDR1; + + if (USB_DeviceState == DEVICE_STATE_Configured) + RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte); +} + +/** 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) +{ + uint8_t ConfigMask = 0; + + switch (CDCInterfaceInfo->State.LineEncoding.ParityType) + { + case CDC_PARITY_Odd: + ConfigMask = ((1 << UPM11) | (1 << UPM10)); + break; + case CDC_PARITY_Even: + ConfigMask = (1 << UPM11); + break; + } + + if (CDCInterfaceInfo->State.LineEncoding.CharFormat == CDC_LINEENCODING_TwoStopBits) + ConfigMask |= (1 << USBS1); + + switch (CDCInterfaceInfo->State.LineEncoding.DataBits) + { + case 6: + ConfigMask |= (1 << UCSZ10); + break; + case 7: + ConfigMask |= (1 << UCSZ11); + break; + case 8: + ConfigMask |= ((1 << UCSZ11) | (1 << UCSZ10)); + break; + } + + /* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */ + UCSR1B = 0; + UCSR1A = 0; + UCSR1C = 0; + + /* Set the new baud rate before configuring the USART */ + UBRR1 = SERIAL_2X_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); + + /* Reconfigure the USART in double speed mode for a wider baud rate range at the expense of accuracy */ + UCSR1C = ConfigMask; + UCSR1A = (1 << U2X1); + UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1)); +} + + + + +void uart_putc(unsigned char data) +{ + + if (USB_DeviceState == DEVICE_STATE_Configured){ + RingBuffer_Insert(&USARTtoUSB_Buffer, data); + } + +} + +void uart_puts(const char *s ) +{ + while (*s) + uart_putc(*s++); + +}/* uart_puts */ + + +// 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--) { + if (zahl == 0 && i < (no_digits - 1)) { + string[i] = ' '; + } else { + string[i] = (zahl % 10) + '0'; + } // Modulo rechnen, dann den ASCII-Code von '0' addieren + zahl /= 10; + } + +} + +/** 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) +{ + char dummy; + uint8_t field_val = 0; + SetupHardware(); + + + + RingBuffer_InitBuffer(&USBtoUSART_Buffer, USBtoUSART_Buffer_Data, sizeof(USBtoUSART_Buffer_Data)); + RingBuffer_InitBuffer(&USARTtoUSB_Buffer, USARTtoUSB_Buffer_Data, sizeof(USARTtoUSB_Buffer_Data)); + +// LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); + GlobalInterruptEnable(); + + touchpad_init(); // you need to call this to setup the I/O pin! + sei(); + _delay_ms(500); + + +// setup rfm70 transceiver + +// Begin(); +// +// setMode(0);// set mode t +// setChannel(8); +// _delay_ms(1000); +// sendPayload("eins",4, 0); +// _delay_ms(1000); + + +// end + + uint8_t loopcounter=0; + + char stringbuffer[16]; +// for (;;) { // the eternal loop +// +// Usb2SerialTask(); +// loopcounter++; +// if(loopcounter == 0){ +// uart_puts("blah\r\n"); +// // if (USB_DeviceState == DEVICE_STATE_Configured){ +// // RingBuffer_Insert(&USARTtoUSB_Buffer, 'b'); +// // } +// } +// +// } + + + + + +//###################################################################### +// uncomment desired demo mode here! + +#define DEMO_MODE KEYPAD_MODE +//#define DEMO_MODE ABSOLUTE_MODE +//#define DEMO_MODE RELATIVE_MODE +//###################################################################### + +// #if DEMO_MODE == KEYPAD_MODE + // begin of keypad mode demo block + // current configuration is: 3 colums, 2 rows => 6 touch buttons + // this can be changed by the PAD_ROWS/PAD_COLS defines in the TM1001A.c file + + // ------------------------- + // | back | up | enter | + // ------------------------- + // | left | down | right | + // ------------------------- + + 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(); + loopcounter++; + if(loopcounter) { + continue; + } +// // 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 + uart_puts("data_length: "); + uart_puts(stringbuffer); + uart_puts(" x_pos: "); + my_uitoa(delta_x(),stringbuffer,4);// x_abs returns current x position of your finger + uart_puts(stringbuffer); +// uart_puts("\r"); +// field_val = decode_field(); // decode_field returns the number of the +// // touch button that was pressed last. or zero if nothing happened +// +// switch (field_val) { +// +// case 4: +// uart_puts("left\n\r"); +// break; +// case 6: +// uart_puts("right\n\r"); +// break; +// case 2: +// uart_puts("up\n\r"); +// break; +// case 5: +// uart_puts("down\n\r"); +// break; +// case 1: +// uart_puts("back\n\r"); +// break; +// case 3: +// uart_puts("enter\n\r"); +// break; +// default: +// break; +// } +// +// } + // end of keypad mode demo block + +// #elif DEMO_MODE == ABSOLUTE_MODE + // begin of keypad mode demo block +// uart_puts("you selected the absolute position demo modus:\n\r"); +// touchpad_set_abs_mode();// tell the touchpad you want to use it in the "absolute mode" +// while (1) { +// +// _delay_ms(20); +// +// touchpad_read(); // read data from the touchpad +// uart_puts("x_pos: "); +// my_uitoa(x_abs(),stringbuffer,4);// x_abs returns current x position of your finger +// uart_puts(stringbuffer); +// uart_puts("\ty_pos: "); +// my_uitoa(y_abs(),stringbuffer,4);// y_abs returns current y position of your finger +// uart_puts(stringbuffer); +// uart_puts("\tz_pressure: ");// z_pressure returns current "pressure" (contact area) of your finger +// my_uitoa(z_pressure(),stringbuffer,4); +// uart_puts(stringbuffer); +// uart_puts("\r"); +// +// } +// // end of absolute mode demo block +// +// // #elif DEMO_MODE == RELATIVE_MODE +// // begin of relative mode demo block +// uart_puts("you selected the relative position demo modus:\n\r"); +// touchpad_set_rel_mode_100dpi();// use touchpad in relative mode +// // touchpad_set_rel_mode_200dpi(); // uncomment this line if you want double resolution +// uint8_t x, y = 0; +// int8_t dx, dy = 0; +// +// while (1) { +// +// _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 + 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; + } else if (x + dx < 0) { + x = 0; + } else { + x = (x + dx); + } + + if (y + dy > 255) { + y = 255; + } else if (y + dy < 0) { + y = 0; + } else { + y = (y + dy); + } + + uart_puts("x_pos: "); + my_uitoa(x, stringbuffer, 4); + uart_puts(stringbuffer); + uart_puts("\ty_pos: "); + my_uitoa(y, stringbuffer, 4); + uart_puts(stringbuffer); + uart_puts("\r"); + +// } + // end of relative mode demo block + +// #endif + +} + + +} // end of main \ No newline at end of file diff --git a/firmware/USBtoSerial.c~ b/firmware/USBtoSerial.c~ new file mode 100644 index 0000000..3cd194c --- /dev/null +++ b/firmware/USBtoSerial.c~ @@ -0,0 +1,480 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2013. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2013 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Main source file for the USBtoSerial project. This file contains the main tasks of + * the project and is responsible for the initial application hardware configuration. + */ +#define F_CPU 16e6 + +#include "USBtoSerial.h" +#include +#include "TM1001A.c" +// #include "rfm70.c" + +/** Circular buffer to hold data from the host before it is sent to the device via the serial port. */ +static RingBuffer_t USBtoUSART_Buffer; + +/** Underlying data buffer for \ref USBtoUSART_Buffer, where the stored bytes are located. */ +static uint8_t USBtoUSART_Buffer_Data[128]; + +/** Circular buffer to hold data from the serial port before it is sent to the host. */ +static RingBuffer_t USARTtoUSB_Buffer; + +/** Underlying data buffer for \ref USARTtoUSB_Buffer, where the stored bytes are located. */ +static uint8_t USARTtoUSB_Buffer_Data[128]; + +/** LUFA CDC Class driver interface configuration and state information. This structure is + * passed to all CDC Class driver functions, so that multiple instances of the same class + * within a device can be differentiated from one another. + */ +USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = + { + .Config = + { + .ControlInterfaceNumber = 0, + .DataINEndpoint = + { + .Address = CDC_TX_EPADDR, + .Size = CDC_TXRX_EPSIZE, + .Banks = 1, + }, + .DataOUTEndpoint = + { + .Address = CDC_RX_EPADDR, + .Size = CDC_TXRX_EPSIZE, + .Banks = 1, + }, + .NotificationEndpoint = + { + .Address = CDC_NOTIFICATION_EPADDR, + .Size = CDC_NOTIFICATION_EPSIZE, + .Banks = 1, + }, + }, + }; + + + + + +void Usb2SerialTask(void) { + + /* Only try to read in bytes from the CDC interface if the transmit buffer is not full */ + if (!(RingBuffer_IsFull(&USBtoUSART_Buffer))) + { + int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); + + /* Read bytes from the USB OUT endpoint into the USART transmit buffer */ + if (!(ReceivedByte < 0)) + RingBuffer_Insert(&USBtoUSART_Buffer, ReceivedByte); + } + + /* 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) + { + 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()) + { + /* 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--) + { + /* 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, + RingBuffer_Peek(&USARTtoUSB_Buffer)) != ENDPOINT_READYWAIT_NoError) + { + break; + } + + /* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */ + RingBuffer_Remove(&USARTtoUSB_Buffer); + } + } + } + + /* Load the next byte from the USART transmit buffer into the USART */ + if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { + Serial_SendByte(RingBuffer_Remove(&USBtoUSART_Buffer)); +// dummy = RingBuffer_Remove(&USBtoUSART_Buffer); +// sendPayload(&dummy,1,0); + } + CDC_Device_USBTask(&VirtualSerial_CDC_Interface); + USB_USBTask(); + +} + + + +/** 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); + wdt_disable(); + + /* Disable clock division */ + clock_prescale_set(clock_div_1); + + /* Hardware Initialization */ +// LEDs_Init(); + USB_Init(); +} + +/** Event handler for the library USB Connection event. */ +void EVENT_USB_Device_Connect(void) +{ +// LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); +} + +/** Event handler for the library USB Disconnection event. */ +void EVENT_USB_Device_Disconnect(void) +{ +// LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); +} + +/** 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); + +// LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); +} + +/** Event handler for the library USB Control Request reception event. */ +void EVENT_USB_Device_ControlRequest(void) +{ + CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface); +} + +/** 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) +{ + uint8_t ReceivedByte = UDR1; + + if (USB_DeviceState == DEVICE_STATE_Configured) + RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte); +} + +/** 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) +{ + uint8_t ConfigMask = 0; + + switch (CDCInterfaceInfo->State.LineEncoding.ParityType) + { + case CDC_PARITY_Odd: + ConfigMask = ((1 << UPM11) | (1 << UPM10)); + break; + case CDC_PARITY_Even: + ConfigMask = (1 << UPM11); + break; + } + + if (CDCInterfaceInfo->State.LineEncoding.CharFormat == CDC_LINEENCODING_TwoStopBits) + ConfigMask |= (1 << USBS1); + + switch (CDCInterfaceInfo->State.LineEncoding.DataBits) + { + case 6: + ConfigMask |= (1 << UCSZ10); + break; + case 7: + ConfigMask |= (1 << UCSZ11); + break; + case 8: + ConfigMask |= ((1 << UCSZ11) | (1 << UCSZ10)); + break; + } + + /* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */ + UCSR1B = 0; + UCSR1A = 0; + UCSR1C = 0; + + /* Set the new baud rate before configuring the USART */ + UBRR1 = SERIAL_2X_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); + + /* Reconfigure the USART in double speed mode for a wider baud rate range at the expense of accuracy */ + UCSR1C = ConfigMask; + UCSR1A = (1 << U2X1); + UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1)); +} + + + + +void uart_putc(unsigned char data) +{ + + if (USB_DeviceState == DEVICE_STATE_Configured){ + RingBuffer_Insert(&USARTtoUSB_Buffer, data); + } + +} + +void uart_puts(const char *s ) +{ + while (*s) + uart_putc(*s++); + +}/* uart_puts */ + + +// 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--) { + if (zahl == 0 && i < (no_digits - 1)) { + string[i] = ' '; + } else { + string[i] = (zahl % 10) + '0'; + } // Modulo rechnen, dann den ASCII-Code von '0' addieren + zahl /= 10; + } + +} + +/** 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) +{ + char dummy; + uint8_t field_val = 0; + SetupHardware(); + + + + RingBuffer_InitBuffer(&USBtoUSART_Buffer, USBtoUSART_Buffer_Data, sizeof(USBtoUSART_Buffer_Data)); + RingBuffer_InitBuffer(&USARTtoUSB_Buffer, USARTtoUSB_Buffer_Data, sizeof(USARTtoUSB_Buffer_Data)); + +// LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); + GlobalInterruptEnable(); + + touchpad_init(); // you need to call this to setup the I/O pin! + sei(); + _delay_ms(500); + + +// setup rfm70 transceiver + +// Begin(); +// +// setMode(0);// set mode t +// setChannel(8); +// _delay_ms(1000); +// sendPayload("eins",4, 0); +// _delay_ms(1000); + + +// end + + uint8_t loopcounter=0; + + char stringbuffer[16]; +// for (;;) { // the eternal loop +// +// Usb2SerialTask(); +// loopcounter++; +// if(loopcounter == 0){ +// uart_puts("blah\r\n"); +// // if (USB_DeviceState == DEVICE_STATE_Configured){ +// // RingBuffer_Insert(&USARTtoUSB_Buffer, 'b'); +// // } +// } +// +// } + + + + + +//###################################################################### +// uncomment desired demo mode here! + +#define DEMO_MODE KEYPAD_MODE +//#define DEMO_MODE ABSOLUTE_MODE +//#define DEMO_MODE RELATIVE_MODE +//###################################################################### + +// #if DEMO_MODE == KEYPAD_MODE + // begin of keypad mode demo block + // current configuration is: 3 colums, 2 rows => 6 touch buttons + // this can be changed by the PAD_ROWS/PAD_COLS defines in the TM1001A.c file + + // ------------------------- + // | back | up | enter | + // ------------------------- + // | left | down | right | + // ------------------------- + + 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(); + loopcounter++; + if(loopcounter) { + continue; + } +// // 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 + uart_puts("data_length: "); + uart_puts(stringbuffer); + uart_puts(" x_pos: "); + my_uitoa(delta_x(),stringbuffer,4);// x_abs returns current x position of your finger + uart_puts(stringbuffer); +// uart_puts("\r"); +// field_val = decode_field(); // decode_field returns the number of the +// // touch button that was pressed last. or zero if nothing happened +// +// switch (field_val) { +// +// case 4: +// uart_puts("left\n\r"); +// break; +// case 6: +// uart_puts("right\n\r"); +// break; +// case 2: +// uart_puts("up\n\r"); +// break; +// case 5: +// uart_puts("down\n\r"); +// break; +// case 1: +// uart_puts("back\n\r"); +// break; +// case 3: +// uart_puts("enter\n\r"); +// break; +// default: +// break; +// } +// +// } + // end of keypad mode demo block + +// #elif DEMO_MODE == ABSOLUTE_MODE + // begin of keypad mode demo block +// uart_puts("you selected the absolute position demo modus:\n\r"); +// touchpad_set_abs_mode();// tell the touchpad you want to use it in the "absolute mode" +// while (1) { +// +// _delay_ms(20); +// +// touchpad_read(); // read data from the touchpad +// uart_puts("x_pos: "); +// my_uitoa(x_abs(),stringbuffer,4);// x_abs returns current x position of your finger +// uart_puts(stringbuffer); +// uart_puts("\ty_pos: "); +// my_uitoa(y_abs(),stringbuffer,4);// y_abs returns current y position of your finger +// uart_puts(stringbuffer); +// uart_puts("\tz_pressure: ");// z_pressure returns current "pressure" (contact area) of your finger +// my_uitoa(z_pressure(),stringbuffer,4); +// uart_puts(stringbuffer); +// uart_puts("\r"); +// +// } +// // end of absolute mode demo block +// +// // #elif DEMO_MODE == RELATIVE_MODE +// // begin of relative mode demo block +// uart_puts("you selected the relative position demo modus:\n\r"); +// touchpad_set_rel_mode_100dpi();// use touchpad in relative mode +// // touchpad_set_rel_mode_200dpi(); // uncomment this line if you want double resolution +// uint8_t x, y = 0; +// int8_t dx, dy = 0; +// +// while (1) { +// +// _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 + 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; + } else if (x + dx < 0) { + x = 0; + } else { + x = (x + dx); + } + + if (y + dy > 255) { + y = 255; + } else if (y + dy < 0) { + y = 0; + } else { + y = (y + dy); + } + + uart_puts("x_pos: "); + my_uitoa(x, stringbuffer, 4); + uart_puts(stringbuffer); + uart_puts("\ty_pos: "); + my_uitoa(y, stringbuffer, 4); + uart_puts(stringbuffer); + uart_puts("\r"); + +// } + // end of relative mode demo block + +// #endif + +} + + +} // end of main \ No newline at end of file diff --git a/firmware/USBtoSerial.d b/firmware/USBtoSerial.d new file mode 100644 index 0000000..27289d5 --- /dev/null +++ b/firmware/USBtoSerial.d @@ -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 index 0000000..1996e8f --- /dev/null +++ b/firmware/USBtoSerial.eep @@ -0,0 +1 @@ +:00000001FF diff --git a/firmware/USBtoSerial.elf b/firmware/USBtoSerial.elf new file mode 100755 index 0000000000000000000000000000000000000000..913ff391965882a111343aeb5705a10c4f3d7301 GIT binary patch literal 148716 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

@H7(ZaCvm=ItWsS%cEP@S&%JPAj`!_r32#W z!Wx>`201$Wpy#rBG4Rx%_dWgVx##JvTLJ9o&C^3#mLZQ#CXbQKV-fPO8rWtCa&b8tsT{>R1OETCSk=fQ!{nih71#En#ri9X z6>Qub2l%=+8#mv1ay0G~Bz83JF(4g{dk4w7#{D!%-MAaTSZnNP-0xc=ck(o(ZY=l$ zYAr@UyaIa>Wp!ggcoIx-ETDWWO$=&rIS%8okESZuAMT;!P^6wv)swV)C~I#zNYUd4 zb<>%2=v<`G9brC&+O>QLm~Uv@7zjLswA~SU0`?_ocZAM>-ASS&)WEA}O-Xb|__a36 zabr7_DyYbga21C2i;Nq5QOptAn~~TN+9yCdLi;1hy3i&i2mMDm^oG##15!W5Lai>e zGoXfX)!yEstS+?6Xo8^)Z3t}$-bvNE(B1}BM`-^5(hhA%-#zpNq|l*#m%{o(+J8O9 zB%&mZd19qYqC@+cHp|e4HXYg`&L|g-F?_qu5n5lndZA4K=?Lw0B``P9E}wot&>3I>MET#EzCY7NjFwWhCpu^$f`R{&#LU4-UUr7y*WoIGcSXiK9j?*Z>;>VPeDN8KFI?(y*)!NoBz6q-OF-&y z*)!M!AY1N1mOYS42gIJi4uk(c9qJ!L9+#Uu^icl^^0>$h_II2$U1SF9!LvwS6|swT z7Kt6jis@LdSYtr8XiYjz&GSZk2S1;uLJ3O9>e0=_~LmwzPuBEy!buHEXf4r9J@yvb=etY$^{Bu$P zacR`cTi>2c&R@9Y<>jqOPnIond3l2EnQK$HHOV((JlX4^>eJU{eG@Dc)~{c4@z4eQNsxJYUDg}AF6-rWS#RjNte5LbZ|J(Lm)B*zq3g0< zUYGUOzb@l(67tT(h_R)O^=a%1;nb!h#Wh9xR=*;acM zX|5MXg)ZRQd~=C7?m>9sy4${#8|P(_zOpX|M;)S%=Yr*HpcX);25S$w0^`SWI6(77 z?1pqe4W=(u=m3pYAf>vDq{?lSiIS-yn#gYam|LV2DVkhO?&Wm(38ZLx0Q@F5lBWl~ zBj7bzM=MuS#nTDoNJ=M=90W4{IavP*ehBPA=v?S_k} z+MR`b7-Wm~Q01v=OWZ9=rOST;x0N6DN=X2zRG;PpLGpW5%~Jpx5hMe2BxnXO7@+BQ zP;JduiPJ$fe~);rCQgPaR~ix96hADCPYPV2J(4*}R)1fQl(u$JIAf*n0k z?WMm(P_j1`>#vZSY0$2p<#as&Gi?~a(56=MsdOEwbId{q+X#P6^M`4^R54=wcoNO? zmHK$L?8m@(61!R-p8@h2z*k6ajn4zgZ>YRQa!34fkZ%Lhf~vy3<&W7QZqlujJbrG8 zmQTWRlL^f6R{ERJ1>}!Zy=xrE#USHLVTwskVpn%Hjb#c>3~E19_`2fO-x(TsmMOeh zm1=IK(uu;6M+5BY+4!4b!vge@d|EqO19P=Bd4K$NNNJrcb+0byKqwBO^24}o$SJ^o zH3vGS>Jj>%M&c_$NEe&}wwyNw92kg4d{m`d9-8_9>Ufx0f z`%PZ}Fmsd0zq$MBM<@Hxwyl_sVd`^E&U4AY;;On{6H0t?3PNRj1s9pEq z$8;M4w!976pox0l26lU=;n(B66~B0jQqPj!3C9K0fATV@?-`_1Rv+a<3-Vrp(%}Q_ z_*LGu5Ln(0z%KD~_HhMgAO7>bFwQ=%48m~EJ}y1`gmd@3t~az{&OWX`ksHpz-(}A}!5hr>ocRhob01Q!hiRp`Ca5ow5yUf; z>op^op#@RBQ3~s2Os&NPPbydRY69GLbVZjVku{BID0vHrhLLwOk-4KCZEk(Xgl>K7 zQbp%6RVH*})k8>T{?{OU#~88(-8b$ay$fz?Q5>(vg*KHRcfv_7iQ`Zk+EkH5&4hjY z(_cJ>+$|BPL~(fHm*8lgpZ!(_cltt;kjBPKKm7vkb6HR-_8$7+!Du1BUd~29p+7yoCuxnie-HbJIi|y62!Gd z5y*T2ySiMO?m~oovpL`@)$|M!`SMvcAbv~9iXd?u691(4VL_>Q^8POgWj0qwl8UAo z994g5Q-4HQfe~Tn5GXko*1k)P2)_TH5yAS;M+EZPiFyHJZKM zLT}#;iSF&zA#Ec%k?D5YD{EV@(-v?TurLg8C1(p}XhF3 z6D_gq)-F8JqFs(*$48#Z<$D0B+{bOU9?(1oY+?-Bp&rmY2WVdpXr9+K)TcOa=z!@n znm>`N2Q-g8p!rU~s^yg-dGNR}4nKh_ zXxM7f8AzJU1*=_Guo|&a+z>=lIE63OH2F1H1GJDfVo$=uEtq-;F-HP3QfTm6h53zVJh0pWe_&u!>*GE_?Tx7K@7l3fcQ|7 zW`n@F5gfEn=0h{zVpsch9(QU<3pJ??SRSR=hRcHOcnrqhmZ=o@bmwWsUN{88vDm?T z623G&4#R0dp66$2H5EFPkEc$UItZP{S>WN^i7_DiDvH7tU$tw@>hnr#c1E&iP!y@O zm07^ENynhH98IoS5bG4cec1~jKGr?uar88)Ovbp<8f+)8y_rE17^s~XP{LS;9i zi=j=WHy#A?BP45_0`Lt0W)XX9ItHAm?wW|Df3aM!#Hn@6ZaQdtqZ|D2neE1Oy3q%T z8fZ6W(2Z+B+CI#*eP~$1lFZUXR(*$NYlqe&g?8vxfcg&o794DGY5Vp$fGyaJ@et9!{K#1*o!J1;)&9c#N?6Oxvwker=vXuZU&o>c zfU%=1XB^FAi>=0w&wk`_aTwdpWj{$r2`<>oDz&XpCh*MOTSHIus-4+E!uYSMNn+ELj>i0Xn`u$F?e!tUezu)Pz zyftow+|TujH}rm|pVjKE|9+?UTV}~;U1wAOfBLLz3@m!qv_qx&o_Ge>t3S5x{h1u^ zuMu#U*9GkH7U0+Gjc(5({T7$%{oYxShItQzAMR~{-w5w+NF&A52M6Ul@gB|n2rS+= z*uuRxBAFFDP4-XVg|q+YG&$@T(z!lRt~N-aFXOsCAPio`4QB=7jH-U7{pZVW%B1BzH8s2aTuKl};t z7`q5{XTt)MSrWylLQ#agcw3y9jMsO$#8$``t zE5%p8V{1sPrgsu{f(B11HI;(dG;vzPSCRnrD}C^G7KDw%`ce8frS^jIbygqUh@+pE z(9|*ZNj^l*D5(Gy__}NC@0sHGJdpM~d=CIMoeHX<#9zsb58=$V5xv>2@I9QD$m*fE za^jcRIr4skvx(;0lEEKHxCBnO*a!JD*!g+K=6Osrm}S|FpO$|>SSWu4yShwT9tQm^ z@C&3zw0IeZwlMuin&p_F(wLN&OIsa-svpD3FzjkP@6WUjkqKWy#y7h|! z=c@tuPW2vY|I~rnA+jCYy|vBNiX+Bg$k$NkQ@*Q}Gy|+Jk-l|^-)=5ADkmWy2dgK% zZV$gG9D?2TdCT4)2`?x4&lWtCVE+;ENLYn5ZIGrlxvQ`z@HMtRA&6U~iHuTC(X94k5V`15_%q?7%wU~SHgp* zD;>@xg2?9x3JI^Vg|7$_&NLmFM(I}sl*hHpDv^#%sJd%iybMeZQ>)HF&Tep|6nW#e zMFX@q`&L3^$NEdI_tEvgzXD43lI#ET)`eU3fPK7K$RU#dkb=Wx@P5X{DmxAul?REXy zlRI>KUBC9^4&7eYuRXa#x7YP+Pwx7+*WLQHr!eQu;xJw(vx3*j!p(Y#*XSaGchiX_ zl1(-$G`aJcfY72TdKK&UGNo348MB$h2rADg6aY{0Ji zHweLoJU_zAH|)>XKvYQah`)ep9E+bUkOkPSpK;R_G{wuPl2!w%2`{wW+!OgW=1C_7 zt0){DN8J)Yo!dCA_bBzSH9ejPl_Y)$6V)|A~$B{TeB-^5-s4{gMf7I+pW z*lXH%s^4qAgF?;(C^=44{^yOz3P!xL&>`tc1>;@{Q6YGuTM4n`c%WOPc{7dRKu@NHT?Fe2Ko^{Y!SSq9rioixmMmr z>L{%rU<32NhN`gq+aPfH3xVDKaljt`wfHSn{)0HIQT}ToS*!ffIIL6tkC1Y`^8Wzp zoDxr@FP;CB*ZUxbecxm|c;e+F0lsNArM&zgs&D3NIVrX`nwc z^UW!Rb68)BC(1YBYO?t~Q{UC}8EkJU9#iqnWrkK#Bo^NA#h1(E;h_#j1Gvu94jMci zi7=-d5oQq{skXp9)e)NZ#_n|h{zt8Z52_>K%V_7(&i`zqI&;aPw-d-O_HQ(i!V-!R z{73#bLOU-ZEP=`RfKHD zJ)83#HE{8+yBuX6c~wfcF@i@w3>$$W>;4WS(O1v4*XZX;nPu8?FA$*V|4lPqQ? zc^78BlKfJW`Kl8aWPW}9%x`dHK8Km>l5b;fchZb5`HduFb*c4B;C4ZGFs~;~US+3| z+z||2id&fS|FQQqfOQpB{`bE3n!coMTKXBFl(dvmzWPO}6|wXywZS$GNm>d5k2HB{ z18Gw7QQC@75i45(k)q2Y7GwdDMMOkpg#~0;77-DVKe8+$DvGkGECM2;{(rwSbLP&y z@4Ymwz;ISYv2KW^k z;NaOvstUhA;(Ht^3HLPzE9io-mhzF{J+Qr0@L^bi^|e8!jooi#5_m#3`juAsef^KuAVAsq~Ul~$3xp$cu4Ek7J_*|BHo3I-nt5N5x6I5RXMp&C~_Wjn*OfDijB<=GIf2OGH9VSF}{ zJxjI|a0kmUUX7jYwdkN>r@~id&Ausa9SJJ`fz+EqG9I4#82+_`&WI|MSXut^Q2Mqt zeQiPc??1v+`0)2b$nsZkG6h(w><6GLf0Y%)pgU}T$W}fmTrOy4WJkUen`jm-8;P$w z;j*gm5b(q$CnMM5^84~^$Q$->)5@^x$hSPCdO0|Zl57)^IGS>eW(YEF7fC6WAz*Gz zI}+hRBPv=i0F(i(Lbf(3G>5Q?bu?hwDTlC%c7v6bT?$WLafZQ$1cNda8+b8D*%9T4 z?ly)Hl<`jQiau*Hc%)j<`3Q-4r+39>7RXZm3CgJWFk6M!-wfKnVhvv?l`*j5%te-n zV_?O3EFyK#h#<{7y(`WqvoSgbJ_;42$GS0ajBbQU{J58(yz-$IJZ%jbLmr43b&MXo6u$c%3jL?9Oo<_-{{{5>XHr+Cc>HlZ$EDQH z6xolL)1gJg>QIY3YyFD3lEz(6lFZgEJTl< z$P0cMcCwI0q zPTjW&5mUly7WySAlq%qLE3DZ(7@?`zmsse5$X?CP5Z*+?J`w07)~pWXtMCiI@@w#v zlKNQEM0N!x@WqbstB0Nj(2d_@usuv3NqwDt_3uC{_QUjbB>h@&2+fqV8;Rd3CVCZl z28W-;CYu(D<75Q?C@jA{b3_Z1sK~E?_{fj!57Ox&o$B|Pc}n;rHsL)|QC5;)u4Gd{vQ@|tN1N3+n`&}B!e4tYAoydIye&GW@McGpCO-Ms;h44(ciHQ%2 z8g4=GHlp8^sxo*N(eDZR0D_MZeLOfY9K@175mGjONt5#NTRBF)Pf)%qRD#z*!%yXg z7q@^yB)C;1phsXrhKZj-#qS`~r@|&g>mM2a(J_9CjPF;*N)!I%E@k|pFlJBIzwoD0 zQ-}UsI-)~=5l?*qQrt`R|2|v@8dj|hKT2_Rg;wwPl!6~MJ&cpU@O4s71uFWU0`h72 zg>RgI3{u-OkQRu0VZtmXzA44dLGT!&e-URf55a{*|2mD0!=m1Y;_=4Xpc?%9(28JByGer_#LAoWkAS=)X#+X2EoilBpe=c7Kq!lX2m?ru&^6hL_teH8%(2j z*1vFk7~mpnRJAi4jEx?-- z2aPCi$dds#Y|1+*Cug*rtd?)2Xt+KVPfgJ`$~Uv1Av#%QQR$%!Xul@|t$)n`jC)^*kOKb{#6P?YRW4`4aw zS|;91bPN{QV?N8&FBAPB(6})FjMFSenA5lxk8Av{1DHsScQY}r^?T!${8w1S$spfG zN>Mg3Q8sI0lwHk{r^3Ds6hnds;4o6bc%<8rCj-0mPcq#LF1$n5A9;4`0fF7AS`T3c zxKs55kd_tOsWQ&byc@cUovKU0!)!m5)eS=v3~>8t&_B{c@7;$BEMB*tXu<>9ezKcS zcFY=FHVd|teev7O{z>r+G((hn$L3Sfj!YsG5Q$hKG*}-8W zOsV2z#AeGwG$qG|Ax+I|gKULGGZjxGXLg81vlW+PQjD*Xfdz<%4q3LcF31kE=&*{- zh|gA9w6bCNojCi&#o6D9a|cE+vbxo zw~Z3XLy}6eX+H+&2sg^|T;e`&eK&GgzbCC_7q@d$GXuC^zPg*74iK zyYYFnj>Qr`!i~j$V2O4tmJ&zn?vWvMN4=`yNsVY#p%9L8=fOs~LtkUUU!qot(VCx{ z8T(0zXYe2C@_61r|H8w@-S4AE$I;`)aT87d!ueHC`{;tNgXO+2AnLo~E_seZ|FFs! z`4E!#OR+Wf4?jm4j`s!&GyDFtlka%S_k#G#1yFprO=!b|F+3a~71&0C3A}tNypS#@ zIFOg?hqv;JBuaB@MDvi)j0yjZL?@%6%pb?7ufV$+rJPLqk;lTXpW(}%y96Bf-Gr!P zkQR(%L+M}GTt%VvFKjsqHob2pGSq>#TH`0~ix@1G;*7UHuZ-J-@phl_=i;l+ty%;8Ob?Fg<%W{xU-lFCXRO_ z`DZX@_#^qV&_(Au5P56J-5SXUID9{VT9*Bd!}rI*LmxD~iSPg)G#v@O3}~b`<8fIH zXJ>mb9+zhZPY-WH-ipJIf}k_)$b^rlLg#~zvS?WG5u&p#nyT2B=+PEU2SXZ&&yn-> zgN9`5`QDE_ywAplv1}7Hs!u+$D-DL1dc*9=a#DE`WXPVvF$4n_2E=R~pCih+lwEZ< znCe>C7Ij{y0t0)gQxl^%q;Ijc{YoKK`Y=!*$@HLenGM05&pA zLpTf-jMqPU#{0m3)W;x1IF-Ry**z=&9ih?keczGc^GvG|UHSPM(YH*#8sd~pw@NXqs zdt{iWRC?UkaAj?t0)>%kHKn@UiE%2$c(Xu^+?^`MaJ&*4RK=FH&2ceWFvCBP#m;pq zWRd)ov?+2fi+msW#H%{*Ku}0k8>I|B0o1>6KI(E5nRXPk42N37xPy$>BD2x(dZt`m zP)_$Jw45JFIWd*?#x=aT>XW_{TY}1OA@k@Il`DshQvomKuuGBg*uL-`*lKvm!#ZHV zd+Na6#-+%es37i!8H|b!(3i2f2jt6mqs=EkJb;JhW&x!S%?+jx%?;)rnzMLawfrkZ z*}aG6smGAVu3m<)6Z{(ZQ0@o}3I@-^>LSd3GX-17eg=&kWZUp$A`AvUJDUl2^TmMd z7r8H={SK1D>=Ov%ODX>;$OAmhoBbV0gTV(#j)!xMdX&#XvIhwBgAh(-JCT~szJ@R! z=$2)l+6c0;Utwb>`}BWMzJriF8#LJ;lfj^D_7^vh;ss>LKEDRs=s8>P)G7NbgW>L> zv%x?6>yMKDi0pqip(7jm-^b`*vGirzA#?UsgJsKp2v?PT&0s^zKEbp<7;Hq@qfC3< zV57^*nf6D6Rh12=L~j^ueA(TU=uZZ#F5_c`?3)IgTy_t+{MlergY=hK*}r@>1M)Crs9a05(xRh-;dc@r z9&#o=Y<6~Bcon+0DR19+dAjnm<>|^VTPaIDUHJ_)#ZPeMN%042d6k#2xN3`5RUXO8 zPPFLw%EyRKvS_uD^&pE*t~`N?nrzXjmA@gYgDrYQeDHfd(48N9YI3)Z&D>gJc z9q(dj#mrYHU?@hBvuqw)v7;=S4Tjf}#q97#p-lPWtQ`}H>mVA7Oe_~zeZDT2|vZ+ zM`X_on_ThhEs<4Gr$w!nyDVzWXM;tdqC44f&I&8R2o>5K{?Kv!aGc{gagHBRj;2EA zDMwSGtroQv`lv;1h0eDqDzuvQ{aAQ9i?6~Ly%%8!Gy1&P64?q}Vo_V6Pg&Gf=u(Rg zHN{_MQCs{Di=zK+r$t;I{siR>sw%I)8O6z2n)29;ved>1&(f5y`hobpA!VB?6> zEPirC**DQN?JTc57^vA$IeCTUDH|$z)+BXMRgk`xQmtdQ zeRLB<${Xo6K}NbM>PR;a9pyG(&PLABcJqZ{bAWIkoxcjNeROxkaCRFrV<)1!gx7>2 z-~SwUBTOs2hQX=}8N8m?DDPW!76c4$-pc4p|Y`mNfs! zT>FRnGc5HTA5!wsQsD!_YQ*C$dj7-cF|`aGjK~Ukr*HpltSjDTlR`VmL<+scEA&&Q zP|?bzq0l@?b$?n41*2YMJ77XsK}kM! zkmz67RK3(kS53Uuq9dTbaP_Nrz&zR$0*e+Pz@r{dGH@sYFEKD1f$TyAjzeHP z1IHtCaL6~n zK>xxYP0b)-((8!(BgtMwpm|XcOnnxCNsr^7i-Apg5P|XkU$|X=?RsAibZXYESQT9lSNbWdVOz~^}eXA6BA|4>D$Y;k&nu{C{b4L z-Y)A?QCasS%DQdum4%CX4z3(EBwe|G=%>NAYHm zQBefZ(bFISD{#orYLQ{gAe(_@jh%ubFzvNOLktrZUS-KdqcIb07C5vn5=`{3%N`4!|lF%p8))kz)-JscEC zl>$2XfMDh*=3PDHBvkz11419gS2kykBH1Cn_)$?)EpJH7q7IE@W+q(S?3fM0M8)F` z^oVJ;C?oZeQWTg>n{CUS&Y1BKYR0r6s=X;3!<-*kD^-|}GG~dVq}|ypk*G&`^+qYP zU3Rpw^29|#wjePKjh^GQ??qG7@A2vjo^ye^_Iq!HP&LOm9x#_ks`q(15u-SE2s+)! z5I2R18jy3IiD7xiQ6oVxpGoXd3mj8d36d?0?1)7#@)`*mS{w;Y<<^Ln5x<07@rf>B z4t%KukiXVufKeYO#&`VDVtgO;+R2 zP=8f51^V(lgwgDNQQqT*{%tCCT1+@$7cb_v3#G=~u!mew~suKp2z z+wSAH)5uZ{G0M|Cbn7XUDj5^$h|M%MLgA8!V32|vj#`5%wxa;4_agzN++Q1Jym96S zIAIcfe1g||z~Dezob`Bcz>&v@OlhJYtzIZ{#mtPF&=p&MLD}}a`@{#YvIsSU+h8Y+ z^F0`VJ?D%j-1EZY1{IC=wyBMoS(|_h;aFUrln_UP&0xpz7R%mfv@s*&&`9eT^P?7l z>6zvmZW-9I7`@l8v$g;mexJB;CHrw)E4azPjbM-~>do|xY{GHcDKPRQ2Cca76ex2) zMmr;8vE$Y74)9qrWrD4nbFX{e6u!#K;wm2;Z>Fqz)$*jOD}3z^G1?s(ZysFIr>$iS z3@+8U%4jC!Ia4%7R7EsEvZ)5_2fUV}A5e{Y9)Jy?J|Nzb`}%4}18H+be!zA{Gy}Ov zGjYmm=0#{E)4T_2gGW8zbt<;zM86zHOp5BRecsNVjmwX>_Q+7C*xryC&8pveN;k## z$}cr!$L%TV_AXw=9Xz&8T1I))jF{?2+CjHhYjb%_?^k<+qUjwfBl9DwU0?h*BVt`Y z^2z(e4PvCOds6OZ!1|x z6&r)c+g38GDKCo{<^-=0EJhCW)3L)zSx0R+w>Q zi0f1`n&Q4Ev!WiBYzZ8RG@hB6@dzqHMwq^Zwo5h@iyImBNjg7&0tQbTYctzoBpa)9 zD0B$ZGF3i%f7JD6y3D!fdW>r#ay!0$v+3o}#Rs?{Sia$QVzV)!I}2`RqSIN)IA#izF;-V7<8<$$D(d(wd|zL!QD5>_3skBd z%2>nko^>OC;haNT4%1oFa@BqZAPejwunSD`IH8{$q@8rKPmg^Aoe)j&;!*M;$sRP- zkKll~Yg33uz)Uem6K62+0d#Np=YFlu7?f-GiezUU;&;}erhj@?S1`4*-Z@fWKSNz? z+B#BOdz7|PtVgr8$9T<*W{Z4rRGL|k{>?+3ud;#8QC+7O*X=D9jE;uHCj>)__ZA)W z>;$heUgP0LN7O~UGe-(wAB$9J+6z~6nr=Qu`|wz^%Ye z_CUWCBgc#BfpD;UlYAFQAtR@$9Z}pRp0fJveIq%8oEcCFrQ63(7 z7N5xxkkZ>;zy_;Uo0dGy6B>?vx@8GPGIfTN462SQKGUN@1J3fq6dO6pD+B4pH(4X$ zi>-kEAK7}`rFb61*d2UGWOr;s^&VnqiA@JPMHmqc+J?yhCtF@a!1a!fnz`SdE>HC` zDU3ECW(Tt|i)1UxDi;$2?VaPbhaVt49My_FSn!QU_qk}|Xvylgx6yn*R1tMwIuY*n zS}P}7WOFj+sLV8d>aLJ9??~fEbmnH8cXZ^6O!JO$eFS5C)JHIO`pzM_nn|`B z-dVD%8f_&!7m7v*zfHzlsqK`4W_dtVSZpT=E1HPdOdRkpg_KndN`$T^MW*II6@uaT zvpd)%UQgm&aLPN^2>dqQ-M(vDQ+uy%?LFV6(q>Hd-ekj%(}u5#JAe|C{kLUCpmo8G z2xe+9RHp{R{4R;l9_i4+J~-TO4SfuYp2alPE7WZC?mdd-QU}`x@t%p9f%3-u!1ThJK6bSduouN2yiUPj8}o}%-^OECEr6ZMad*aA&KEtaY<_O8r-`8>5KCl+gtLxL%SO#bam%NY-HJG2_CJf>h!*z z?&%%vYo@PlX_?-xprY+ zTU)+++PVPF&FC0moXBfhK6A#5nG2@1z=Z{9hTg75G+T3riD0`;ujy>v(AD1An!8#I)Gdt9ueMSzUI959orv7vE*{6JZQg~YD_ zzQ2W-`v2W|WP7b-TV+EeyAClEECku@LUscpjYtfoKZzT}2BjEe(KiB8Bpg8%c$ba8 zA25?T6e$dm_XB_wiIDh%fE0-kWnC|2Jx(Nb45Aq#*%N>ii4bHBEc{7?jYJIny^W~? ze2P@5uh|guKaCg`OGx|~Ko&~~exEy+41WfMwfUumFIf1pg>P8+7r;#F9#Aqwc5pKy z9wFF$SJ;{08*)Zz0J@tlu38lIMU3q zw8vOlUe9l68Oo&315p6ZgoV#o_$DCpRiP`B?|y*f%dgH7&IL^O zvcdS>i&22{0f{dGWKEX>lJa;9msz+DkR17rKGQoaybzFfbE!?|4F^oW5)kjUqG&}rshNemftK_S15%F10crG40H)D{VP}@&SwKqgGeC0qi;YjA<1@Ytkesp> z@&Z)GPqp|oz%;&_J}7l8LI(jZWK0)hmLfC^@OZ%KfTsW&TVN=Y{+*2@zta%I@=v$$ z3_#HcpvlvLP$vBbXc%Hzw}qQ5JjcRw0Zkr2E?^noAmn73{F|MB-AUSmoO@B_viICeiKsG8b@Fo6PK+1k4 z;BdgJ0O|C00-9180-GCz4H0I$0g!BNvG_Lt$%e0Hlg(X#WOFxQO!)hp@Jyy=wT=o^ zlS!P#`SePs@icFyE3WBuCw_c-ty0dkDN1PsrO25~2h#3kDD^WNB46J9#vy```2B#a z2O)g=o#N9UCX%`i(F~F75kQVigqckGG9h~!2ups>68#F0b^a}hQvYE?%+9N0St=p% zmjPKSp)2(bB2p?tBzqH(r4pjl&r7KRRwtQ3cOn|k_JYp?@^Tm?Kk*T&1&=qyd*LjX z@WB2piuiY=-~cPh9u+QgfKUQnfnNbQpNT1wF~q`gvQlIwB)%AsIS8H1%ZP}~43Vr3 zkTMgZv~Nji4M3=w)r>4#htTOZrqz&rMP>wN*vJk*Ds}^)X;OwVnd@yF(>7Y#ZA=-Q zzNdnfze32;5B4d-LU}8+;lfZRbGwZrm#bVFLz&FCY#h^ex-^C|nR{&TqxEfj*KCYoiC2#2_S5pXD!*!EPM`-qx=hil;RaYQwl@KzFo49$D4CZ z=KFLkE_x1sf-RAzX6c7;62oYmjYG- zUI|FCcLE*&ct4;Kk0FTnc@gh9AQbPHfE4E?Ko2v%CH$w#XvvTJATd=>;nrzV4RAAn zD|mlZzK1LA-B=8lS_td9I#`_VX~7OeZ&!DZSM_O2AVKpF|Z4zJ_ z-^YR>B18^H0J6KyusGjRJsSA2faE+Mu-}GVjINOib_!LAhSlAjs6p+P%Y0#wBcwJ6>2wIG zJwlxXDgLUBPyeTx6@Y}xN|I_(9M_4bZ;;WI!Nm!Z^k-ZWmsBKC0hEj4?8i)3K~<0> zuJjtOFqvQD6(-Y_kH)J!G%L#S&lYkCMm+r;r-)=0Eh5QM=vEU8x1t&LoR#6_kb2YrNvBGL7e`L4KO9uvEO}XD4SqHEWGmzRE{o`bVzSxYfd} zN~#8?EHsNkZ8c5Td|I?tS>qLIeue3;IT3!ohaxEJB-A2y1+@wawH1|Lx?W=xreAeJ zKWT;5%&IpnH2qmen*Oa@O*_`#bg7(FvH@0Ec!Y&BEaavm)2CUOe#K?|f=0dUqRi}w z^y!=2l2J=lS(CWRtm&N8kVUnHN}rY)K2s*z6wRp=NnHIYCvVJWc2gKq$L9(B-Q5;g zjSXKLj|t2_$8f)>tFyPetD_^|tsDFP z$c;Hu;jsLE+b)@u-4`K|>Iuu+AIoBzk)ZgoYXPL(=u(tiVZZ8Kvme!a1dL(tt9N&r zV0UN>o_-Z?-=_Tf4IRzByY)Z_FJsz=GmX97`R4WgG_VqSZL1|t*Feq@HJoTBZkker z#F|TP;FJxC$skswo*7~m-jF}5FW=MKw0T1wGjmv{<75*D_{JH1vr3u^U_ zsNFyMnjcW#dD_qMC0DCtE2rPiHrs2p(l$!Mx3zYAsh_<=E%M#k!2|EgN50#3Z^KCN zzuT+4?X}~kX(lrVBRoU&xJv-p6IKCo25>SU$C=XsF>5gMz78Up^e<&3>a-Ny7H%|@ zf0j85ujK>f$7RlPu1Wcwq?~V3c1Q}Zx&-&1O3HSVa;>CXA}RMmg3C?xld?VVSs)aP z*IFXuf5`xOm7(~15$hTttkAW9T+QAH$O_#8$R+X}fXMkV$$1}d=d~je<;E}O(c{4q6qse5N?4y2bj*0$FC4#o)-bR>G6`qUk2m^{1w1x zf@_+B(?K2l)G3h{^lqclw+*|aGv57QJj#WaOYF->7pOjDQ?HieBg zO+myf%ru3i_^g|&XoVE&27^{icP(6#SPrI1h$tnSgt(Te&@~AYU6T;eT`AKfjL|%7 z5+Bz!k=G=H=2#kS3Y|kM4}~ayYcx+Als;cfg4~hvvKWgXgVLY&Q(o}%Tq0 zN&TxTeo*=cZi@`8zu+@?%rQt-O&KD`qrNaVIbocd@~UdhGj%uAqz$Zj|KF%fOI7$k zKyB>$ro%Ht!CwcYm1S`XolP(lkZK$Wh-Nb#egYBg@VxGp6jLlb%ut#RKh01Y-#g2s zm<~V3q?itWj7c#aex6A&9e$ytu){Ak(Wb*64}^s-lVt0A>kWnJ@C`s%p;Z>H24sgn z4UiRU1!RZk<+`Yt@xhyjs1H8ZQeFVa4!;eMWp20d5s>VrQEgqD0Ipy}{C z5n|qJ0of~Vu=tID?C>`MdL3SdL-tg)CGGghUg4TVy0tb55timdP`>MfjY{^&2fy1S zu9sL_+pEK3vs!j?%qTJ(zS|VNo z&Jm`9r|}HpZG8T;I}e|BhgP32?n$2AfA7gXx+?O}N}uX@53A(ar~eoe=U=^pML5`m zheevtJohPhqJ#|YF%rVw)1`i%7jbIDQ^$k{0^S0cNj-_sHy8@j_sdG;TR=FUyBmIsYd|$6#X&4OzJs=o@NNI5DB|qO7xEq{gR2kSE645Lhi3y z_@rE*AWosH@Mq?7IhWR1E3 zc{*zoAjLQb@EpLcfT+~ZMb-;|a1wnXAggo{AeDG2ATwVE$a1d%jHa`nKn&*$$uT06 z`X`%$0$!8?d@?0B2fCR8vIiZRuGURCEb%k8WM;g{N^&b8ywX*&+~lVrz~g7qKzEpw z$0X%`lkzP|dB~(}laxnHifPoxOv*n?$}>Pr;SAk^LJ2cz&isGLP{_xazhWr07NM6A zx)bmfNlSlPYVtY|YVZv}w&`CiOySCC$o;UCR7NCBe?z3JAd*gZQvV|*;c$ei5TfQM zm{eIlPm)x|PC3T!kLT=td>EdxA)5IMx%9s+jnI7*SzCUPpJNW7fJRl(H1 z>$m`wX%e#5cJ}7GyZbh{H&v00bH3)yQ{(TQ`!_ia+SuFN+1lLA;|CZxOiDB$0QYRi zS`j@HuL^Tp1KXhzeKY2KHEjF8T82_Pw!0-`sXH=Y`7 z)u=5kLQV#(3+Z*{- zO)B84n0tS+6}^jXk2k}P@V~t1Ui^HHHMHID83X0)o$%W2LNxDgcf&-V(O#H{mRH5C z0*W6M!|^apR~VnH6(LCWWGxK`>zuT(;t&A_@<=D!C2hFkLa&T zbcTq`oNyruqs=S?H=vNut8(gRv`M*1GE_;*T_}sU`6Gkbj;xmG4f0}O2^L3kWOmob!~9zQE_>2HYpxdsRc zuLYzVx{isd`w_a)kUb&1ZWe~`zE)ViMkH)P^y>(%0o)HCGl7q?q4dY4{paxuCxdwOb}>TcMdYOj z%|gsFrll;uRYc0}Kr}eGoo16+9+X{w&G#y`oNVATDY5yblf#wzaSIU#b!BQy48r0bSQe57vH<1)iV1 z#JeM>LnElEG&o@<^+Ov&UByzuv@v`}a!o|2r_)RWGo~|{E%k4u8GcV%iP<>R5^@YA zqyZ8}$K3RFgQ%#FC1{g*l}D80Vw;0@MDCg+le*T%6sh%pJ0X=^p%!2+5g@}u5+e0$ zXcx#3&Z{m4JcRdaXo z(%ipgD9sbMyA7pz;&vYp+SmgYz79x}eG`yAE`$4segl{V!sh_jUdao zk5Rvo;vZ&ko1{L9AZzd>ASB)?bLnS*aMto1BjqNPml#U@32|>2!tV&-n-ZPAOok-B z>0+L(;cR{&=-rkyc!5u%{S0%kHN+7O#<9%8sjMo4@< zARXsYQl`^?lA0V3ggRXXNFAPR;c0+mdpaO9x7qkDfX44^MJSV5gEWRnb3P!|NSH}& zL+B!g!t^at)D=LuEpf9Xe;=W5m}K*!)Ljz&B%&WQ(U*!!9+v3z{}E+9VN$LTeovW{ zCnV(=AnBc=tzQ|UPYKbBj5n_WzJws#=XIv1(*Gp+Qu~O67YcD15Go;S;Rq(Crz2*x zA(Mlw)i!k!<5I67b&5&-cM}La61d4fv!c?gNNWUI>4boHm4Ek<(=%8j} zzO$Ea)xw3ur_(I&JrIJB)oa>S`PE>s=NmScLV#3IiGTOb_+lOATQp{<>mATY;U+wI zLs|X!Kz)3?P1ptt(H5%!xx_gIFq3)=p*0AZndt_ECL*RAkn8`AfL{mP0*GGq_hN46 z0%1qp%E;7zBDBpU-z+A*9Z0{nb`7e6NeTWRSZkHI1^140h_Ibf+Jye&2`bfT(2fW!}Dkb3tBQ!O-cYDHrz=A=3KwfhxZ5 z0V!S=f?Fl3y}9OkX3t>IERQ@0Shj4%tF_4G6nSYNUZfEvy1W&i~p%Hv17trC$>6 z6HLmd#Sd4Tl;26pWRr54q)ag>zm=53fY^!hY(w-1A({(>&UB$6eqB2JGDBh9ZygW{ zy~WqvDVGDG>{kM^me(3ebGYv9WOmcyF+=f&Nd5#6&UKywoCNqZAO&~^ z(1^y+=WGm9o&(OJUkA*j{sEz2w7DBE0|>#)A%rXtk`D!p6!BYzMF}vL{(@e@tan0;yy09Qq)ObC@YlQwJ>nY&NK7rJzc0iLvYP9RVoN{vxL$UnM?w6z zbO!e}Eg#K{rSRcRV#R8ockk|XUd5N1rKW38u};whnwgMJ=8(FJ$()zJVB+Sbxd|5H zAc}orT;hf?zXq}jjizMC9-opC*ClC>HF&tCFFNCd>nL23YTr_r?0bqU)L}B|&NSUz zx=LB@QyIeaC&dFX5&~T+6B9wg^lLKxAfgPke<_X}FZfmX2cMT2{VXrDdq{+Sj!?ag zuA;!}8OO`aJ4pt`Jmk1)`I;Ab%WNw5~?ad`5ng{Jk7~CW-CH@kE4vq@oUFj zdJN3x*#7N%D^7b^#Ej1bYaBOkYP z`lyi_aO0pBvnw&w4AW<7VTW3_iYq6D%27ue_4P^mOzKR_34(pu&DNk^^Qgz_^m340?tW*eSt+Wg0b+D=6P$=_V7rt9Ad^x_D(TKY+o7d)jN4V>iH&ng% zowW`Q1uJiq7CG{y%>HsandXLq*jgLxN;`HKrCGjNbKSK=M-H>rwmIG?@VM$cK>63= zUg=A&Q)q7k?XOFCrAQ=Y9Ql;fY`;-9+JBO`x&fVDs{@ZXsh825nbZT8w?Aiha%WQC zj(Y!JoLkb|>izTpg>DY2e0)Gm{UveD4|PO?MEV~c|No8({ic&eGbIZJlV~msCv}O- zkxBha#ONu9KNj*C3Xr>v7um8I4DbYk7g`53TrX;8K zUTsRxz_!R8(&JG5cV}R`H3Ms?TU^^%ysx8s%8W?6Zm~X(=L*SLlj-{!>-sL5M&tTh zJZoXa{X`_K?PpwG)QFQ1raQp(>Q4%I>6%lGTAh_bjo(wK zd{kz|6>7W=&k8lZ*=j{6b~-(qY2$U;r1_Mu`Zukg=F_#BPVdx3DV=UMq<`XkhgMx# zE3P6Xi`I0FSI4AP()6@>vyd)ErAx9@QiYnX(rUblX1^0gmKv3WngvGlr0>0NcBX-p z66@1lowH3}<|by5r{<|M3Zw>2Tdrh&tJ*l5?QY)(>nlP{FnzD6-R}E;% znk@;F>8Pz7RyEw_S&5=;o5La*OOMOd$i3$W>E6v9pUps-#^zub{~L84;Dw~%ulNgt z@Vv=Gs|80?z>jFo0c1M=ZU8F4=gg)8cFCm^^t2x=yC(}nzaQw{y4fUz`T?qU5g9&`K#gqI_xBQMMk-pWY zUt-fs;ddv}Z%N?0O202bpUi)MBK_6`p3Hxnm(EKhZ})HngF6!VrUbsl!+87}B+FrzY(Si0K;=FU94K%ce zB>#H!75+`bkLkquYV$@9=X=B2Uz7PS1wG%-gh@+&;(Qy^$NBChUTk#fd>2pko8GT~uoISTh`lU$c-&p9G z`4v}xsCX&o1O z@0Z6z8tQK}eU8TuLCo{w@?4a_r}TsKFhD7NJWIpD-$k~)6nE`y)2}JvFRS58`FAdU z)R*Eqz9`;i`6un=bemuGqxdnFpW?~%35oQ@7EkiO*Ydv$?MC?&SN$u#&E{8pS^`)9 zsp-!ky)obWfsU><%^mL5a6ExIGswwTzH{q)f|ic1mNRp$?HhA5z3?nAJR1*^y74XY zAeY;iZ^5&u+$^7Tt`~n)u(D^(Ec2Ohe#pV&GINgG;mkGWJHSXcGJ=k-&b8I@PhV$G z``XTYYc(!^h{#WDZtq>$iEooP*f@oQHovLYs&9>a z%H0>CA-}$BW8SMiYrU|!ueAZ+6Ioc_7-^ukr?yTi?IwQ# z{>(X0YHL^DnvOirzN%Jn*G8}Cd-}Sr_4(=R+gsK(bMI?$|(oKzsL)LO)b5!Y^y@%-3{6|FA9;%la&Vj=b4>dXLsgu;Ip8iske(2TWDHO>z8ZqY=;pbp9tl( zMB|3$7ATih@oHxjO@pP9bKQB?cU60LZ(nnV=`J~DsilRrDFfTK%bUB;l%iIwY|>f< zon7d&YpD=Zd+F6tUp{J9QEgf+!st6t<4qQB4r=Na*RQBWM{1~9u=u1C7t}VvqNJY% zn{(^)>!FpHtC)54oPsLi!-4I+n^CO>w5CxP>Vt0y7U`sm+k0BNIy+$$L0@w>jIyt{ zg%#n4jGPYY`qr;OfAe&^qP4ZKO>%4n(NBGEcdYQ9C4C(o!NSe3+@`L^d?z!*0Hsy6 zLACgvz%^}8o(7_oO zN0a)_rm?SQ10;kA$K-%DiyT37=a%Mm9Xaxe*qJ^<8iYNT!w` zy8Z4@(2#G*w{Oh1Qaizx$SZhV6z>UQ^yu5L6nE^L-3*Trlgw#omeG)Ndg3ZzFl+kS zJ9^tYbNHZ@9c@}Rw{+xt0%IGC=uU&&!mh54z`1>Rm2T_e=%-qm(R0xpaEhJqX5Emc zyHl!I%RQ@`!J&u|n9(V+d+@XNPB&rPE8X_`4g8nRJJ;G0^sMXZ?yYv}f$)LT zv$-<~9O>Wu%GSa)S$Ac81BRiljcqc1C9~IbCUf@|b`sOW)^E=BwfA;4M`nOeSG9^i zn+t^&YY~jRecjEy?OmN1Y&zGX&L5~-S-q%w_Ozp?9aT(A3;TMaj({d|zM!_Vtt&7d zhM$?TrLht1u4nJU=W>Gnv2<#msY~IkkroE%R zw;erGbR#;|Pw?g$OdjjI*_=K=5B<6j z=+lx!f^*Rrja8A&Cghc=RI(9VZNPOI2Dv_1jg?3A>e7v3>$-aBR%B3Am3!S%JCp6w zbT=Z}f?jy2HGP=LV&>M7Z|=!kJHfmk{mK<$W0muaM%S~8*@YQf(9GIWB35JobzRi9 zGr#4{n?wZ=sizN%XZp{QeMsBLn4EmaG*Y-%;{tnc;=u*n?5GTEw}~}T>0%eRcVkt- z*+5W_kD|h)L^qfgFK-M?Su5INykyvmDx6ar z-m|;9&s4`|%J8NT3B#g;=BRqM@q3Bl+?+-9k4CEP)HV;WB9+x3-lxbdZ|_8_fen#{ z{02-XYkTwSbCEsKY`fONB0EF?bZC$oN--W5jHclBiAyltYU)=sH05fWYL@4gT}v7gd|uCc7Wr+39hEOI-#&Mshs;n2|Y8}#vg9+z2!GR$e5rpTyf zu>w2un=p*`=3AkgMf^mrOsdd>R1d--QVn^_w9twnV%xo=w!RLLjrMHx8L{Ealmi6- z*1N(~CbMKY$Rv@0=*H>Ov= zZgYUSSkS1K?P%(NT(0V^)%T(fBd76mY%l|67+T4B0+ zHB@*mi?`aVZW(4Eoo(IuJl0I=`!H+GH+R?8MG+@rQ!1~U!t~Po-15R2vny2F z+0@?VK>QgC_=9LWwPC59VQmM9^XZlv8h&UE5Mae z+tXOnw6b1zXQFyo$s10LyT!$_8|t!Cv97W;QEjO^yCWXWZd|Uoj=XG+Lik#C%W5L2 zMBUhyjACkgfEJ1$6D*QzmnNVR*euo*G&UEPygrg}&3f;4oJcxDU#y0h5^(d;a!9J# z6=-Z%*evM45XKg^i>QP!kt}p|2J@}K8bd9%zwrU_d~ZH7#W+K+R*9l)5wK?WNF*su zBn3^tSf03|+_FW>q)XX~>+=%NUaf>$D6+{mnBp*~BF5%hN4#}Z>xC3^BdLX_QnF&I zi&$Y%t>WpPLNs5z#S6<;?V_wTP6wKqeH5FYISA;sb=5ue*NZiukteEz_y%vL7MDI& ziaLwfj+iHfrmNdohIK$aM#FrsYvfT{XkEVL zOvw=Cho?*$Wc)dy8x4I}rvp?XMt+@A z7OgfEt3{cW64!7VgOS-4+FEit>V{{RE$NjV6Gu_sy>Zw4XlUjHeao(i>)SWvZFjfD z?{X|*7UfS{TfSm(jdh9Q2?bw?B{vhXK*FP62{zQ=Nn~4FL?aJdNyMFYpMy~9X06K) zb#Q3uz{aIDEn#J6H>xaIUfRX5*Awjepo3eMZTc){msJG=uT*aW#bX9t<}nd>`w0@|v1(wd$pB7`E0)wcRr+b9^KqWPz(wn-+p#+8jK zEif&YQ)sh0EUQN28r;E$nKQBfX%9inoaICj!7v|iDm4>fma??DXGKd37kN?1wyeSo z)+B0s>^2ZqPOc1`R}g1n*et^AcS&OIi@t5GMf=^ZyAfK$39WsD&&W3PawBbVP2-}5 z+WMvy4Y|ge1r3Xq<`%73UeBiwE83#Hk5Xhyn%nX8HQxq@AqzRGmbsR7wG_#Mjj<)z zoabY)^&6V;)Tpbw0Z%)*k+ZlFllqo*nAoo0fF_lPfNsX47KYl_;jl#{)`~VMbwL|U zQ9`DtMeOmoxO5$jEd6yf!!9b1_o~vk3j`@1Ys53^DNaF2#hFKC$ZC;#l);dLkm{zG zS_+#_nxsgyQM@euxe>}1Dq0mIw5T*_s5ya4d!q)sA@7C~vuR~Xba%+kuk4;~f4X%O zRri6HmS9QEf~J)XIGj_n%yw_Tce|3YLc=^&CewJd#No|KpBAf`~Ulj`) zaTrQA);xB$fJl7u*Rh1FU$lu+ID`@3ehZ1X(itB zvBsr&`Z|;{xhoKBgw35T>tvSVlTr$K(2mia4+J~`?W)=;Q)lZQL0s{^!Kg}cl*qVL zTa5w(Hf0x)UnN&gXv-dG5^KAruC;6N1RjmW*>nM&&eQP3*O#aXcEABHYWv8;+cu6X z*cEK%+&HL(`MOtmGd!4jsStKNu+7?Ek8@W;lcON$NPTPi9YHvrgSFR3nHfJh`WJ~N zD7}_ep1{MI*99FB`dXzpZwU-gpKy zU{?o57`TX1n(_b$*iI);Gp@|!ocuSZ{wB4J!!88K0co3feE>N5+T1G5vt7*Fgf zOF_;B7-y@>wcW#$BkI`LJI1Ptekvx78k$?FU~5oMqUo$7E`rf@6o(?TQLqTYIWSXz z<05;$5jix2#}YGVJm3%0mbgw`BN-GJj}o6Q3(ww;%g4@!*r zbmDP9OY;Ui%*4}ZJQt9sO;I zpll5cq~jr8*`}e>jl3V9 z0N6%14+re#f1N!ZR@>T#am7bK+C~K z%)uJ5o*vT`T15maauMYsf83>Lh13Ozz#3_4DbliF5ykTejI%`*H(2j!jFT1zd0TLV z1?v>AE>>Auu2?p8Yo673<*4;Bu^xS=tF@*Bo(OA0;x&i%dT30}MM% zE^o{=;+ZnnY0DSX;qezw{S2h3uz6Jco+)s&N}^+|?X><<3^*t#Ze4RvUY2G7#jv!I zY}UBo`#4kuI*82@-oRHp_M@u7-bbfPV8>p0N0Ox8bq2@kK1%Z(A^J zZ^h9nWQbL#Sgng&GIJ)zLl$sUz8bnC@gwY?12F&uzF)Ur}$y(UX2iTW42fWz?J5=U) zHy6(6glx_Qi*j}a0qlb{HT9^^sv53%>|_Ev1@>WsJXH>`XqL*y7+QXdI=c8&+iJlm z3T7bMsnJCs>?L9Reh`h)m_CRZ6VYZTGa{=ZD9Huz!+il z%!V#j0Bzk+VEg}!F0^njLq8_&B@9#4#Mel1VQI{^1lj5?`W;JE4YFUZ}IwllYNm}1g(;>%N2R1JdA>w{mTiqI%c$&t(4LnwoZ(UKl zSdO-EH7I$dYX-JxE1Ibp%|(25k=57&}Krntj6>UEeWk{T%MK;Q!^Aj z=*((#!3rF6!}*(7Ni=su>N#;`)9)C}ot^1;^{%_Cy>)@SI*F|n(KJ)A^D%(j?n6fd z&VohF?v;T_^X_HvCULu&QD-9qu1r04FEIq~UNO>qyO*UA@5Of1uE#vX&&TUPa5E-e zxnH*$1e;{e;nWm6MPcjS^UyL`PQpv;En&K_<=;T^@7V5;WXoFLc^h% z;4%EdpgCf;ZobREj%R?UU1W(un-B>$;b0`P{*FgTUqWXW`@W>Odi>!P4zIViwI z$y+tS!BjBgYDL1JRf8p>HCY=i!aH_^>!U_13;M?)%!NgSDP+55N7xdvMYe5Twue#w zpW=t;P2pCRC1CUu_(2Z@q(}wXoTfhq{6+k^>&m#Jk@T^U|0c)XL1MBEho*zAPU@PoY)%rilPg(gU_!~_X$HbDYjAp>PRq{S1z zPm+n75u1$zW@%E51c_G zfU|9wkXPCy{j;B!JeWTnWakN^YMYsm%*q1O?8O5$Lm;HwPcmbf|GZIABy}= zQpUpcBz+Q(ceiw~{XA!GWx*Lc!ZZECl9}UpBy`+grGtxpuW3#(8j(osH>c@udy+F* zOHZJf0HqNvwJb0_Il|+O2@bDnT964YtB$Z#aFH|V7@5)|@_nB6jU&;-LQ_bl_m3+d ze*i5DR__Q;idq-~d>XS3^H(JCVlOeS(n3RwbH*eF9=|x_WI?;)m86gOuG$fv7}cgM zh~x2^mrnEPl(!$}%|`Yx7;(MiyePcI3zv%D?$MN@-+pc}o}PEvt3fSmXmHAo@YEfl z83f-+u_}w-h8hA1T}l1D~Nl>WO|e@?p~7} zP3clH=o<_j7vo&~&tH+0*}0HXByo-R=YvD-;28I$yA!KilQk`~Mi`|Vqf}gBQp!@A zNG=yN|KF|wf3B!phXwum$6qJ8USA%Zg9}_^QOUO16|S{@i`BeU%fX5)+U3&7q{^fCca{MsM~_k-=Pgxc zQd!APQCfNZ+h>&Tf4w~>RTx$Mon~)wSMWC3TT+O)<5uN)PPd<^r0VyU^_CvA|39$i z_;8%`QvI|>kv2;Wc@UzrAJPTA#vwsd)EPy8pq`g#l<) zYguTOacv~6B8f+Ql5Qey-4R`Us=ce}RWe=qyrou|?7{;#!M&xtxI@xPmoUk5lQY=< z=P9K;{ad0^J|C!)ZT@(>Gk%rCn;FB&2w&sj4BzMB4DpN8X){Ee%SiE1AyfssKt95f}Kd&BB|@11Nfy0YEzNLwfLzi zF?^SYD;?!y8fNuw!}3w!PvVDe{1U*+Ca5_SDrdzNCN;FXc*G~Jq*9}zZ#JHKiU*as z=b^lyrY5VF#Ffrp3L)(F+%?@}?FBWp6xUrTtWRNLD$hi0j-Cp>wcrw zMX4^RQ3KcYo{i7RsaFzLIpPl4iRtyk;z7+H2JISDn4EGD&SG z;J1xD%fB0`4+`PhM;zf=ax{c%mE(Pma199qVY7xHgCCAk{YEn}thpX=x$+VFyi$fi zUI{%Zqg2;FD^P^3tY)Biv++x|j>d;U88lL3r&#VN)yyf z3xS@8AC7C_M4kEb;@m{Yi^Gw}0y>QfmRNqCt+hr)IChNdkYX`g2kgWTkL?J$O^{%V z2`cj_(_G0!5{OcL#zJOu#Q4 zTyWmi49qg|1amZ=0e%k4dmgDQv}MU>5`HQ+!;=L!^UNs-PxbJ_5I(}gry)GU!?k?n zM-k?F>Bk^Uk+giR{~J^t;xUG@NV4^Y(>H;R7)B#G+C6s308hqMA#SnI9p&h%i^Lt~ z;$}IzWr({@@pTr$ zjR_K%%$=$}k5HqwIx06mdJ0j`;D;9bELu$ex>3_@`1$(U3jBQhJbfv-RzAXuAK3K{ ze=BJyUpQ1uU>K~9;XtT;jq}4AH!#Mf&X@Qc{cu0reKJ4%H)JVPV!ZeBYm=Abr*sTI zi!V+lJ?hJdKN|563*T!rfBONqar^+J{8dMB`)b^jC~iNE<5w+Tz)#C%cq+a`nJic7 zl`g{LBS_NwM0D{UQ^+TtuK9}XTo&ftTQbBwYO)-asqi6LT=rzT=JV^quY=ANJ)1Ha zK2va0mn{gN0LIIHq}}-v*RfD}%oaveo-7oxJqm`IBcHdi7I?Ba39b zvf63$Q3X#}T3;Rf%xXEhj*6)HUbpe7;6mq&G%ZP6%E(bpndaf=T1R;0Fx)11TxC-b zw-`UXb@$h+8CW7jW}e9K@tVlMXVM(qU(QRnw)$@`I22GUb|9s zrQ%D?-%`O=ETrOpg>@@F(SobQ+luC|RM<;*t?zq&KdiLrU~9CV^#*oL_lH-F8xowG zy*z|5Pr*q$jZ|2w@}Ye9SE&T1gH2J{nv%kSz2qMhcV05CP;momw9L zgOfB?p|2Xx&6J4NTt#LRsi3gvRIsr?oL%TWX~e}liB~6VSN*q&rLa(~#n}|n6`$~< z>6|x-${08;@)zjAtAesDMpnuai-}Y`|G+d_sEW8HmU6U(<504^_=v1^En5A;N29wI zD_LAz?0$=jh8KTW^23@vDTc=H$q==-HMu8)O(wYL`E%X!C^^IIKNZe)UCFGmMAg#n z@!yToOOzJxn5BBq-x@#A{H5s7Te0V8{&we889$%qPukSp#Fq)vhpRPs{5^4(tfT{|ZYjjL{s$ z>QSOc#GT?>WgQU6Rj5?BnDBqQ^~ZQZa)bm`fhe_@Ul(B$3@p7<2;na`|$KS z&zyeBtriI`GX9;H_y@6iEeCtqlDio0X2kQ-RR5Ay+~tY8^LXRkcZ;Oru4MB)`(sh} zWLD%Ega@YayZgLLS$l)?k=%eg#LNX@puZRqeKY0;yltir-_PaWZ%}S3pjJPEdoX5L zWl){9HY_UqI1v4~>8BB9v3jdtmweoSl^EozUikIh9~Y)s4fO`6pnh?VxVx(8_fTIb zq;yxdL4XfhjYOhF4cQx9QkZJ)I7ZGdAkApci7vMp>8D3=U6))I3({W{kbCh}PuDScQS z0csp@`#2S}9f0R92>D86>K7$--UK}U7!yw|=u^h(&DRQfAGhC&>@9)O-F+jV3g?2% zb<4TrcjDN*j>cXfS%Q?JUMZq(KMMPA{aM2UAfu>`vnt~UHX-TkPJkH9P*8_ceEIrw zqhO3ZPOACh_u@zgQT&;hKNiH~kBMknL6-`CfS8f!Vt(TkRloQT{ZbI^xmcV0)W+)v zfq({0_@#oM&%<-7{&YvzNtOdDhkPkRDyXRmf{S2(CFMUGWYLFmz7EU??);bYH1{IS zxB^~nYQAh^K0Whur1bawmK0h`)0r3TS@`W6@Cbg0A9TJn2ztuhO}P;`U7OFCTme z)njYPxF~Kj_6Y|wyevodRPf7_gW!EwXZzY%h`ONZWjevGLpu;;y+vfGc^U`{DeyGU zBf&-X=Qu{%swEYDnT;<{^yiV_IG6C1&x3~31F5^^Kwn)2ow)eq9iV5~M1RJIJlhd% zFaQ5NI(S^Au^Aky9NdRrDwv2Pg@+Rs>+ctS=F63-rg~9Kj=&)3YFy7XK@!-G*wW2|H<$oJtXV1J`nzwPeo z++Tlr69rLgNo^iE0HxhV?eOY#@3wOo#E}IC5x*-PB?ec3CKXKCf;XSwQ+-Df8>QEP zbYK=Spvn%0z{M*22^(KvI`kTja|zS=HE7JWx5+-ki$_h0TLw;aQ9_*b8MBcbyE{6% z6n!I-;uoXe;CSf;z;2Li`oHa6dyE}b8K2!n9ui{0ffXy6hn|k zd_d9l_d9dW%r~>!g#N)q6VB%BoZoqT=R4o|&Np+`!%0H^CCDSNF)^t) zMHG79$$489XUvSf_$L3m8`GP79JAr``I!ClV%~pKKF{s*V*WEPX6w!QQoouPGrTL! z!?)|wV$t)>xb*5Rx6p`X+EbP2IeS2VB|472q5ZYE9;keM^6r_Iq%p z=etbl_iDcnS9-p@l%8)9rRV!X>G^(8`h)02dcHBzIEHyT^i8+01b9I85qKUteL=|S z5W+k)$~Ybw{a>e7%l&xuubwTjlbOaonV4 z9K+lZM$a8v#xYzI*u)>}%Dh{SBmc4J{NKiR2eZx4!PhE-(2uWMOsLB5$8?AIG_ciO z=EtxCozW>Hi`89q%h6^V(=zxHA5vr3j>;{3C^5lx%t)Fvr(DLTEDdV#1I4;jjUQJu zKoG~*^GqxVtGQ}}b+xZw@aG^ao;I*ykAWT5zB6&kiec@TMt3ee!?=?xw;TV@KwjhU zM55ez_|H2$>9s)bOzhVkFhme%f)|J|f-2vxrQF;dJ3ftIG+KS|inlo0+KV-!%fzFK zp~s~o6K2-GeH13d5EE%16Jh52(3oW{7DL_8z?4UZ-bYH9zuCnSu`~H{OlWzwiOqglAw|7`Q;*rTT{T7{%Kegx%Ue{s$lS0sr zH0bZpR~>CV{BVbL=^BI5y6(;8I~mWPi-oB&JUx)hch>2h>P7E{qRGdivfsXe3H~3M zOo9gU8{J`Y^}U_e#n2g8JnI#Bws#RcpK>IGdb#FtYcBWo~Ggs&#T~|i3#Bt5k z(>Pt$z;q*Rl?*Ht3Q=9jXfWw`z7-BTJp^L@?6X=IUy&eOmnH6Li0@J(AkENai3Y25 zp|}daJ=4MytRr(cIAUQaXm@0eLl$$~2|gF0)dnK}2N50+nBy;XN9I^ImGzOiOMv>t_!;-BIA zs=!YHZv&3$by$A@z8ZK3uFQWF*Aqd{V9qBRSA=|)puTcaC${Ave3ig!lQ4Dtjqk5d z6K39xFXtjal!R{yx{t_7F^#o1=n|L!S#Km;QGE*aDCq|xV~Q$T;HDx zuJ2z3*LRZm$x?*VoT=D7ZeS;QF?szLtJwT7q9`H{|fGz&GRf8Gjis z#_zQ|bLo45x!lBG%BP|H&w)9Wiye;&9|q@b5?GyuAp&hhG!rsXr&7AeSV;qLTL#U_+nj7XbI6 z|L9oX04vgtZE|w?o4NGez+6t?JO}&pK494&2Xf{4mBjC%KOrKO|4Cq3|8If0Ji1Y* zKM$Pt-;ueaz>@w+m_oXza|d#h|1N7Wux#IZa`*$lcSGJwke~ea0(1JmN8?do zFyEd*6{G&&2+U>L^MP5O-%y-_{ER;C0p_yEq}KPZ19Mq}@?VPo2Y?O#l>bkGjbnX( z2Yyulo??Ie8(6mI6pY;$kdO2h%5(VIqK8R(;l3SS4zZ<|iIEiShVl7PPMCKlIND7Qg0LqcKvr)4E@!r+7cG z;g9_M2AIp}Mt}LyM9Ciwp_z|dgkCxon9EeA{pSNq{ptZWj`AN;<>MIQ@f_X+%=g`x z{+|KnveY1oP<}gsO@Fe#ZU^SFT1}_#1D5r ztdC3EqhkEL2)tA1%d5btJTT)5!^Ld`6R3mbPX(6pI30MRV~2GP=r2YqKMXASy$G1w z6F9%j@}t1Ae?AF(7vw|!I6hjy+y>FD^IrpO+!ENQ&jE9}%#4R`1IzmM=kQN}`L2@# zAj0~83C!_f^_PHU ze>*wc1U8Q2c{lJJ`jd|B-vj(-gxP+M-){n^{ncT82ROB7Cs^NA=`79ioz^2cdI3=T z3e4qF^E`1q@LNHDlgfirOu#3Cm}&1GV8ai`%RRtS-uD3;{@LFLbLo%g@H4;`^p}p~ z|9Rlug8!Fu`MD&p4|#dNBL951o~(Zv@Kz2^IP$j~_=|$xYT*4s9^6kCdL`GdI}Lo7 z-L^}UV{2`jfeCw^35=`2$jF4chS*BZ^H$7twd;Eth|@~zTY>9`^8C`I+w`Vg8N>Z) z@!_U!oakz~-96Tf-E^DX{i_E1tyvQsuo_Mf+HKzrg2;D~x^ggP`ts7y8AC7AF8iZAaDmbknN_^#R*$XR%_`MjN~~#OZCuYBRSAtHVD&3hPaDn%DTq zK~@-Q$9T3z5XeSc>I6Y4^nCL{`GhxaBF$!1d-t+Y>pb+e=3t`UcC+$ij7eqAtbm4E zRo|;uhbk4Qis#QN%FKqgrJU;sBRUODGc?RM!bF=UXguL#7rg7siqbaeJf*PSXsmA< zap+jvo^~sclHJ#bPBP&^%c+*_?HD?48ry4)Z5-P$WmC0v7sY)O`A%5(S|eMy^`J_% zz$uk_XpIbwj}H%xT%t;>b;Gm|tsQ&-ZcwGfHK*dLE%lmH9K2(1Xsy@#bJpV^8?gU^Ixz z6hPX216J6>eIiLrZ(nKxuE1$fm$X9PYhYWjvJ>NDX@+@Spf=1~mj~s(*gSL4gLYYU zAJmSgp5k7Dc8t(Q4MEeWkm@{??1nXsDAXqu2~?jNNGJb_%>nbCf$l#pN1wI8gZjA$ioOG z1tSQ=WM^mEz>a`M@qUC5bODSe9nr_swDEy5>K0yf|ZXPbLDEqpwb z&6r=HOOk;p`ebvMkxy^Gb*a;eFnV!7%=Mw2IC(7UUx_e;+j3eWa+PY6x-CJUqw;(u zDn&s%Bh!@_A$~xu0yS)kvYNAYR1ZA|G4e(W=(=s+Yw9kkL1)9D9@LWRg9U11uU=ML zqjpivvzepypyIW%I^D;1DYYP%%79`hA*WMrxY@x3hCZDUS=FsMQ9}%n3lrY#{@5%U zYaRJMZrzR9lG~_FcrfqUS{wbbZQcru@fvGY+aB&KcJ|nZpbjY-I}R(taZK5H?OD|p zt*IP&Fo7}8kajz$3?m95WnG65PM>I+PMtm5P+GCE?uU`nh>ea-+nHz(^5}cjK%%jD zGRfbc)cruoQ`w2|M=*P4IJ#6-+|#7#9!#6p$0o(L1HJ8PK7~w& zp)K2R1H_rH89XPT{Tx8Qr+QQ?HJ|50mqsXRkF_{nsE6s(r+%6g z&mMviZRyp07+ln6z(Y_A>J}_iHLBpbF1A0KP1Ah?()bFylXMQA_0zDD2Jd&VwGVr| r=~@NP8)C@z4(gM&`cX=7o6zYa%~-wE(^-5Maa)^1-cUK5)Gg<~L5!CN literal 0 HcmV?d00001 diff --git a/firmware/USBtoSerial.h b/firmware/USBtoSerial.h new file mode 100644 index 0000000..7a210f0 --- /dev/null +++ b/firmware/USBtoSerial.h @@ -0,0 +1,76 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2013. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2013 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaims all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for USBtoSerial.c. + */ + +#ifndef _USB_SERIAL_H_ +#define _USB_SERIAL_H_ + + /* Includes: */ + #include + #include + #include + #include + + #include "Descriptors.h" + + #include + #include + #include + #include + + /* Macros: */ + /** LED mask for the library LED driver, to indicate that the USB interface is not ready. */ + #define LEDMASK_USB_NOTREADY LEDS_LED1 + + /** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */ + #define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3) + + /** LED mask for the library LED driver, to indicate that the USB interface is ready. */ + #define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4) + + /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ + #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3) + + /* Function Prototypes: */ + void SetupHardware(void); + + void EVENT_USB_Device_Connect(void); + void EVENT_USB_Device_Disconnect(void); + void EVENT_USB_Device_ConfigurationChanged(void); + void EVENT_USB_Device_ControlRequest(void); + + void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo); + +#endif + diff --git a/firmware/USBtoSerial.hex b/firmware/USBtoSerial.hex new file mode 100644 index 0000000..040d61e --- /dev/null +++ b/firmware/USBtoSerial.hex @@ -0,0 +1,394 @@ +:100000009AC00000B4C00000B2C00000B0C0000040 +:10001000AEC00000ACC00000AAC00000A8C0000034 +:10002000A6C00000A4C00000A2C0000052C600008C +:10003000F4C600009CC000009AC0000098C00000F8 +:1000400096C0000094C0000092C0000090C0000064 +:100050008EC00000D6C000008AC00000A6C200000A +:1000600086C0000084C0000082C0000080C0000084 +:100070007EC000007CC000007AC0000078C0000094 +:1000800076C0000074C0000072C0000070C00000A4 +:100090006EC000006CC000001201100102000008D8 +:1000A000EB034B2001000102DC0109023E000201CA +:1000B00000C0320904000001020201000524001002 +:1000C0000104240206052406000107058203080036 +:1000D000FF09040100020A000000070504021000E5 +:1000E00005070583021000050403090418034400F2 +:1000F000650061006E002000430061006D00650036 +:100100007200610000002E034C00550046004100C3 +:1001100020005500530042002D00520053003200D1 +:100120003300320020004100640061007000740060 +:1001300065007200000011241FBECFEFD4E0DEBFC7 +:10014000CDBF11E0A0E0B1E0E6E1F8E102C005902A +:100150000D92AE36B107D9F712E0AEE6B1E001C0BC +:100160001D92A23AB107E1F72DD30C94090C48CFA8 +:10017000FC01A081B1816C93808191810196918372 +:100180008083268137818217930721F484819581AA +:10019000918380832FB7F894828593850196938706 +:1001A00082872FBF0895FC01A281B3818D91B38313 +:1001B000A28326813781A217B30721F424813581D8 +:1001C000338322839FB7F8942285338521503040B2 +:1001D000338722879FBF0895FC012FB7F89471835E +:1001E0006083738362837583648360587F4F7783F2 +:1001F000668380E890E091878087138612862FBF00 +:1002000008951F920F920FB60F9211248F93809131 +:1002100094028F5F809394028F910F900FBE0F9086 +:100220001F90189586B53091940220E0280F311D5B +:10023000C901089516BC109294020895DF92EF92BE +:10024000FF920F931F93CF93DF9383E085BDF2DF7F +:10025000509A5898E7DFBC0180E090E00E94310B93 +:1002600020E030E84EE053E40E94990A87FDF2CF87 +:1002700082E085BDDD24D39410E0DCDF509A5898ED +:10028000D1DFBC0180E090E00E94310B20E030E043 +:100290004CE852E40E94990A87FDF2CF5098589A90 +:1002A000C1DFBC0180E090E00E94310B20E030E033 +:1002B00048E453E40E94990A87FDF2CF41C0C8E0A8 +:1002C000D0E000E8E12EFF248BE892E0E80EF91E72 +:1002D000B1DF509A5898F7018081802379F0A2DF2E +:1002E000BC0180E090E00E94310B20E030E04CE85F +:1002F00052E40E94990A87FDF2CF0EC093DFBC0141 +:1003000080E090E00E94310B20E030E042E053E4D6 +:100310000E94990A87FDF2CF5098589A83DFBC015A +:1003200080E090E00E94310B20E030E048E453E4AC +:100330000E94990A87FDF2CF0695219749F61F5F23 +:100340001D1508F4BCCF76DF509A58986BDFBC01BE +:1003500080E090E00E94310B20E030E042E053E486 +:100360000E94990A87FDF2CF5098589A5BDFBC0132 +:1003700080E090E00E94310B20E030E048E453E45C +:100380000E94990A87FDF2CF80918B028B3329F06E +:10039000893341F429E0D22E02C093E0D92E1130E6 +:1003A00009F46BCF47DF3EDFBC0180E090E00E94A4 +:1003B000310B20E030E04AEF53E40E94E30B1816C3 +:1003C0000CF442C04899EFCF489BFECFCCE8D2E076 +:1003D00011E001C0182F188288E0E82EF12C00E807 +:1003E00029DF20DFBC0180E090E00E94310B20E09B +:1003F00030E048E453E40E94E30B181614F4115063 +:1004000024C04899EECF16DF489BFECF0BDFBC011E +:1004100080E090E00E94310B20E030E048EC52E4B4 +:100420000E94990A87FF03C08881800F8883069500 +:100430000894E108F108E114F10491F6812F8F5F2F +:100440002196893039F601C010E0812FDF91CF91DC +:100450001F910F91FF90EF90DF9008955098589A58 +:10046000EEE6F0E080818160808308958CE38093E4 +:100470008B02E4DE8093950280919502089580912D +:100480009502882351F080918C0286FF04C08195EB +:100490008F73819508958F73089580E008958091FA +:1004A0009502882351F080918D0286FF04C08195CA +:1004B0008F73819508958F73089580E008951F9339 +:1004C0008FB7F89420917801309179018FBF809196 +:1004D0007601909177012817390749F080E591E07E +:1004E00095D7BC0197FD03C08EE691E041DE2FB7A2 +:1004F000F89480910402909105022FBF009701F1BA +:10050000209151012F702093E9002091E80020FFF5 +:1005100017C08031910510F08FE090E0182F0EC0C9 +:10052000E091FC01F091FD0180E591E06081FDD654 +:100530001150882329F48AEF91E035DE112381F7E9 +:100540002FB7F89480917801909179012FBF00978F +:1005500049F08EE691E027DE9091C80095FFFCCF30 +:100560008093CE0080E591E03AD7F4D51F910895AD +:1005700084B7877F84BF88E10FB6F89480936000CA +:10058000109260000FBE90E080E80FB6F894809360 +:100590006100909361000FBE8DC30895089580E5BA +:1005A00091E09FC680E591E0F0C51F920F920FB6D3 +:1005B0000F9211242F933F934F935F936F937F93E9 +:1005C0008F939F93AF93BF93EF93FF936091CE0070 +:1005D0008EB3843019F48AEF91E0CADDFF91EF9178 +:1005E000BF91AF919F918F917F916F915F914F914B +:1005F0003F912F910F900FBE0F901F9018958F92E3 +:100600009F92AF92BF92CF92DF92EF92FF921F9391 +:10061000FC01A18DA150A23028F4B0E0A559BE4F35 +:100620001C9101C010E0808D823009F41860828D29 +:10063000873031F0883031F0863029F4126003C001 +:10064000146001C016601092C9001092C800109288 +:10065000CA00C488D588E688F788C701B601969590 +:10066000879577956795FDD720E034E244EF59E40C +:10067000FCD64B015C01C701B601F3D79B01AC016D +:10068000C501B4015AD720E030E040E85FE3ECD682 +:10069000BCD77093CD006093CC001093CA0082E069 +:1006A0008093C80088E98093C9001F91FF90EF9064 +:1006B000DF90CF90BF90AF909F908F900895682F5C +:1006C0008EB3843019F48AEF91E052CD0895EF9201 +:1006D000FF92CF93DF93E82EE7017E01F92EE70129 +:1006E00001C0EDDF89918823E1F7DF91CF91FF9081 +:1006F000EF9008952F923F924F925F926F927F9268 +:100700008F929F92AF92BF92CF92DF92EF92FF9221 +:100710000F931F93CF93DF937B018C01822F90E087 +:10072000FA01E80FF91F1082D22EDA944D2C5524CD +:1007300047FC5094EA01C40DD51DAA24BB24BAE09D +:100740006B2E712C812C912C1C01089421083108EE +:10075000A0E2CA2E22C0E114F1040105110541F402 +:10076000C501840D951D8215930514F4C88208C037 +:10077000C801B701A40193010E94E70B605D688383 +:10078000C801B701A40193010E94E70B79018A0116 +:10079000DA9421970894A108B108D7FEDCCFDF9145 +:1007A000CF911F910F91FF90EF90DF90CF90BF906E +:1007B000AF909F908F907F906F905F904F903F9001 +:1007C0002F900895CF92DF92EF92FF920F931F9395 +:1007D000DF93CF93CDB7DEB760970FB6F894DEBF47 +:1007E0000FBECDBFC5DE8EE691E06AE771E0F4DCB6 +:1007F0008AEF91E066E072E0EFDC78942FDE789487 +:100800008FEF99E6A8E181509040A040E1F700C049 +:10081000000080E091E05BDFFF24DD248E010F5FAC +:100820001F4F4DDED394E9F721DE682F70E080E0A2 +:1008300090E0A80124E05EDF86E291E048DFC80195 +:1008400046DF84E391E043DF2ADE682F772767FDE8 +:100850007095872F972FA80124E04CDFC80137DF60 +:100860001EDEC82E0CDE2C2D332727FD30952E0DD5 +:10087000311D2F3F310509F024F437FD05C0EC0C84 +:1008800004C0EE24EA9401C0EE24282F332727FD6C +:1008900030952F0D311D2F3F310509F024F437FD20 +:1008A00005C0F80E04C0FF24FA9401C0FF248DE3B4 +:1008B00091E00DDF6E2D70E080E090E0A80124E073 +:1008C00019DFC80104DF85E491E001DF6F2D70E0DE +:1008D00080E090E0A80124E00DDFC801F8DE8EE49E +:1008E00091E0F5DE9ECF923029F0933041F09130C7 +:1008F000E9F417C02EE330E0EAEAF0E01BC08130F3 +:1009000041F0813018F0823089F406C0E8EEF0E062 +:1009100005C0ECEEF0E002C0E6E0F1E0249130E04A +:1009200009C022E130E0E8E9F0E004C020E030E076 +:10093000E0E0F0E0DA011196FC93EE93C90108952E +:10094000282F392FF9018091A0029091A1028617DA +:10095000970718F4BC0120E034C061157105D9F780 +:100960008091E8008E778093E800F5CF8EB38823DE +:10097000E9F18530B9F18091E80083FD35C08091BF +:10098000E80082FD29C08091E80080FF1AC08091B4 +:10099000F20090E006C021912093F1006150704078 +:1009A00001966115710519F088309105A0F321E0D9 +:1009B0008830910509F020E08091E8008E778093DF +:1009C000E8006115710591F6222381F605C08EB30A +:1009D000882361F0853061F08091E80082FFF7CFD5 +:1009E00080E0089583E0089581E0089582E008950D +:1009F00083E00895E82FF92F8091A0029091A10241 +:100A00008617970718F4BC0120E036C06115710500 +:100A1000D9F78091E8008E778093E800F5CF8EB308 +:100A2000882309F43EC08530C1F18091E80083FD40 +:100A300036C08091E80082FD2AC08091E80080FFE6 +:100A40001BC08091F20090E007C024912093F10038 +:100A500031966150704001966115710519F088302A +:100A6000910598F321E08830910509F020E080910C +:100A7000E8008E778093E8006115710581F62223E6 +:100A800071F605C08EB3882361F0853061F08091E6 +:100A9000E80082FFF7CF80E0089583E0089581E0C9 +:100AA000089582E0089583E00895982F2CC0292F9F +:100AB0002F702093E900981739F07091EC00209185 +:100AC000ED005091F00003C0242F762F50E021FF5D +:100AD00019C03091EB003E7F3093EB003091ED0078 +:100AE0003D7F3093ED003091EB0031603093EB00AF +:100AF0007093EC002093ED005093F0002091EE00F5 +:100B000027FF08C09F5F953090F28F708093E900B7 +:100B100081E0089580E00895EF92FF920F931F9374 +:100B2000CF93DF93162FE82EE7017E01F92EE70120 +:100B300000E02AC09881992329F16B81E981FA812B +:100B40002C81892F8F70853018F56295660F660F9E +:100B5000607C991F9927991F692B223010F096E02D +:100B600001C092E028E030E040E003C04F5F220F78 +:100B7000331F2E173F07D0F34295407F492B95DF57 +:100B8000882331F00F5F25960117A0F281E001C0A4 +:100B900080E0DF91CF911F910F91FF90EF9008952A +:100BA00080919A0287FF11C003C08EB38823B1F0F1 +:100BB0008091E80082FFF9CF8091E8008B778093E5 +:100BC000E80008958EB3882349F08091E80080FF03 +:100BD000F9CF8091E8008E778093E80008958091A6 +:100BE000E4009091E50044E62091EC0020FF25C050 +:100BF0002091E80020FD15C02EB32223A1F025305E +:100C0000A1F02091EB0025FD12C02091E40030916D +:100C1000E5002817390741F3442359F04150C90131 +:100C2000E3CF80E0089582E0089583E0089581E0B5 +:100C3000089584E0089580E008952091E80022FF5F +:100C4000DBCFF9CF40D042D08091D8008F7780930E +:100C5000D8008091D80080688093D8008091D80017 +:100C60008F7D8093D80084E089BD86E089BD09B47A +:100C700000FEFDCF1EBA10929602109298021092BA +:100C8000970280E060E042E010DF8091E1008E7F1B +:100C90008093E1008091E20081608093E200809186 +:100CA000E20088608093E2008091E0008E7F809374 +:100CB000E0000895E3E6F0E080818E7F808381E0AC +:100CC00080939902BFCF1092E20008951092E10044 +:100CD00008951F920F920FB60F9211242F933F93F6 +:100CE0004F935F936F937F938F939F93AF93BF9334 +:100CF000EF93FF938091E10082FF0AC08091E200B0 +:100D000082FF06C08091E1008B7F8093E10021D2B9 +:100D10008091E10080FF16C08091E20080FF12C048 +:100D20008091E2008E7F8093E2008091E2008061FA +:100D30008093E2008091D80080628093D80019BC33 +:100D40001EBA2CDC8091E10084FF2CC08091E2006F +:100D500084FF28C084E089BD86E089BD09B400FE17 +:100D6000FDCF8091D8008F7D8093D8008091E100E5 +:100D70008F7E8093E1008091E2008F7E8093E2007D +:100D80008091E20081608093E20080919602882346 +:100D900021F48091E30087FF02C084E001C081E07C +:100DA0008EBBFBDB8091E10083FF26C08091E200D7 +:100DB00083FF22C08091E100877F8093E10082E081 +:100DC0008EBB109296028091E1008E7F8093E100AD +:100DD0008091E2008E7F8093E2008091E20080614A +:100DE0008093E20080E060E042E05FDE8091F0000E +:100DF00088608093F000ADD1FF91EF91BF91AF91EA +:100E00009F918F917F916F915F914F913F912F9122 +:100E10000F900FBE0F901F9018951F920F920FB654 +:100E20000F9211241F932F933F934F935F936F93D0 +:100E30007F938F939F93AF93BF93EF93FF93109103 +:100E4000E9001F708091EC001092E9008091F000A1 +:100E5000877F8093F00078941BD01092E9008091F6 +:100E6000F00088608093F0001093E900FF91EF910B +:100E7000BF91AF919F918F917F916F915F914F91B2 +:100E80003F912F911F910F900FBE0F901F901895BB +:100E90001F93DF93CF93CDB7DEB7AC970FB6F8941F +:100EA000DEBF0FBECDBFEAE9F2E08091F100819391 +:100EB00022E0E23AF207C9F775DB8091E80083FF90 +:100EC00030C180919A0220919B02253009F484C0A0 +:100ED000263040F42130A1F1213070F0233009F0A8 +:100EE00020C12EC0283009F4EFC0293009F4FEC01B +:100EF000263009F016C192C0803821F0823809F0FE +:100F000010C108C08091970290919802992371F0C6 +:100F100082600CC080919E028F708093E900909156 +:100F2000EB0081E095FF80E01092E9009091E800ED +:100F3000977F9093E8008093F1001092F100CFC06A +:100F4000882319F0823009F0ECC090E08F71907026 +:100F5000009729F08230910509F0E3C00BC0809121 +:100F60009C02813009F0DDC0233009F080E08093DD +:100F700098022CC080919C02882341F520919E020A +:100F80002F7009F4CEC02093E9008091EB0080FF20 +:100F90001DC080919B02833021F48091EB00806220 +:100FA00013C08091EB0080618093EB0081E090E0C2 +:100FB00002C0880F991F2A95E2F78093EA001092E9 +:100FC000EA008091EB0088608093EB001092E900CA +:100FD0008091E800877F86C0882309F0A2C0109125 +:100FE0009C021F778091E3008078812B8093E3003F +:100FF0008091E800877F8093E800D2DD8091E8004F +:1010000080FFFCCF8091E30080688093E300112390 +:1010100011F083E001C082E08EBB83C08058823033 +:1010200008F07FC080919C0290919D0223E08C3D4E +:10103000920791F583E08C838AE28B835FB7F89403 +:10104000DE01159680E090E04EE061E2E42FF0E0F2 +:1010500060935700E49180FF03C0E295EF704F5F0B +:10106000EF702E2F30E0EA3018F0295C3F4F02C0BD +:10107000205D3F4F2D933D9301968431910531F7CB +:101080005FBF8091E800877F8093E800CE010396E0 +:101090006AE270E055DC12C060919E02AE014F5FC3 +:1010A0005F4F21DCBC01009709F43BC08091E80050 +:1010B000877F8093E80089819A819CDC8091E80099 +:1010C0008B778093E8002DC0803859F58091E80037 +:1010D000877F8093E800809196028093F100809151 +:1010E000E8008E778093E8005BDD1BC08823C9F49D +:1010F00090919C029230A8F48091E800877F8093C1 +:10110000E800909396024CDD80919602882321F4AA +:101110008091E30087FF02C084E001C081E08EBBC4 +:101120003EDA8091E80083FF0AC08091E800877F63 +:101130008093E8008091EB0080628093EB00AC9696 +:101140000FB6F894DEBF0FBECDBFCF91DF911F91D8 +:10115000089508951F938EB38823A9F08091E90024 +:101160008F709091EC0090FF02C010E801C010E079 +:10117000182B1092E9008091E80083FF01C088DEFF +:101180001F701093E9001F910895CF93DF93EC0136 +:101190008091E80083FFA2C0888190E020919E02A8 +:1011A00030919F022817390709F098C080919B025F +:1011B000813269F0823220F4803209F08FC03CC065 +:1011C000823209F46AC0833209F088C079C0809104 +:1011D0009A02813A09F082C08091E800877F80936B +:1011E000E8008091E80080FFFCCF8C899D89AE8962 +:1011F000BF898093F100292F3A2F4B2F5527209339 +:10120000F1009D01442755272093F1008B2F99274A +:10121000AA27BB278093F100888D8093F100898DE8 +:101220008093F1008A8D8093F1008091E8008E77A1 +:101230008093E800B5DC52C080919A02813209F0B7 +:101240004DC08091E800877F8093E80004C08EB392 +:10125000882309F443C08091E80082FFF8CF3091E1 +:10126000F1002091F1009091F1008091F1003C8B10 +:101270002D8B9E8B8F8B8091F100888F8091F10058 +:10128000898F8091F1008A8F8091E8008B7780931D +:10129000E80086DCCE01B3D921C080919A02813268 +:1012A000E9F48091E800877F8093E80079DC809101 +:1012B0009C0290919D02998B888BCE01D4D00EC058 +:1012C00080919A02813251F48091E800877F809367 +:1012D000E80066DCCE0160919C02C5D0DF91CF9121 +:1012E0000895CF93DF93EC014096FC018BE0DF0182 +:1012F0001D928A95E9F782E08C83898783E08E8747 +:10130000CE01019661E008DC882359F0CE010696F3 +:1013100061E002DC882329F0CE010B9661E0FCDB62 +:1013200001C080E0DF91CF910895DF93CF930F92BA +:10133000CDB7DEB7FC018EB38430F9F4248935894A +:10134000468957892115310541055105B1F0818143 +:101350008F708093E9008091E80085FD0AC080913C +:10136000E8008E778093E800698339DC69818823FF +:1013700029F46093F10080E001C082E00F90CF91EA +:10138000DF910895FC018EB3843019F524893589E5 +:10139000468957892115310541055105D1F08181D3 +:1013A0008F708093E9008091F2008823A1F09091E2 +:1013B000E8008091E8008E778093E80095FD0DC0ED +:1013C0000EDC882359F49091E8009E779093E80012 +:1013D000089582E0089580E0089580E008952EB396 +:1013E000243099F4FC0124893589468957892115CF +:1013F00031054105510549F021812F702093E90005 +:101400002091E80020FF01C0BDCF0895FC018EB3FC +:10141000843029F524893589468957892115310574 +:1014200041055105E1F086818F708093E90080913C +:10143000E80082FF14C08091F200882321F02091FF +:10144000F10030E002C02FEF3FEF8091F2008823DF +:1014500041F48091E8008B778093E80002C02FEF81 +:101460003FEFC901089508955058BB27AA270ED011 +:1014700070C161D130F066D120F031F49F3F11F49A +:101480001EF456C10EF4E095E7FB4CC1E92F72D172 +:1014900080F3BA17620773078407950718F071F491 +:1014A0009EF58AC10EF4E0950B2EBA2FA02D0B01EC +:1014B000B90190010C01CA01A0011124FF27591B99 +:1014C00099F0593F50F4503E68F11A16F040A22F9F +:1014D000232F342F4427585FF3CF46953795279510 +:1014E000A795F0405395C9F77EF41F16BA0B620B0F +:1014F000730B840BBAF09150A1F0FF0FBB1F661F56 +:10150000771F881FC2F70EC0BA0F621F731F841F98 +:1015100048F4879577956795B795F7959E3F08F0BE +:10152000B3CF9395880F08F09927EE0F979587957D +:101530000895D4D008F481E008950CD00AC102D1F6 +:1015400040F0F9D030F021F45F3F19F0EBC05111B9 +:1015500034C1EEC00FD198F39923C9F35523B1F3E9 +:10156000951B550BBB27AA2762177307840738F012 +:101570009F5F5F4F220F331F441FAA1FA9F333D071 +:101580000E2E3AF0E0E830D091505040E695001C25 +:10159000CAF729D0FE2F27D0660F771F881FBB1FE1 +:1015A000261737074807AB07B0E809F0BB0B802DBB +:1015B000BF01FF2793585F4F2AF09E3F510568F007 +:1015C000B1C0FBC05F3FECF3983EDCF386957795A6 +:1015D0006795B795F7959F5FC9F7880F911D969509 +:1015E000879597F90895E1E0660F771F881FBB1F65 +:1015F000621773078407BA0720F0621B730B840B12 +:10160000BA0BEE1F88F7E0950895BCD088F09F577D +:1016100090F0B92F9927B751A0F0D1F0660F771F3E +:10162000881F991F1AF0BA95C9F712C0B13081F01E +:10163000C3D0B1E00895C0C0672F782F8827B85F66 +:1016400039F0B93FCCF3869577956795B395D9F77F +:101650003EF490958095709561957F4F8F4F9F4F89 +:101660000895E89409C097FB3EF490958095709595 +:1016700061957F4F8F4F9F4F9923A9F0F92F96E9DE +:10168000BB279395F695879577956795B795F11153 +:10169000F8CFFAF4BB0F11F460FF1BC06F5F7F4FF0 +:1016A0008F4F9F4F16C0882311F096E911C0772302 +:1016B00021F09EE8872F762F05C0662371F096E80B +:1016C000862F70E060E02AF09A95660F771F881FDA +:1016D000DAF7880F9695879597F90895990F00087E +:1016E000550FAA0BE0E8FEEF16161706E807F907F4 +:1016F000C0F012161306E407F50798F0621B730B8F +:10170000840B950B39F40A2661F0232B242B252B0F +:1017100021F408950A2609F4A140A6958FEF811DB2 +:10172000811D089597F99F6780E870E060E0089553 +:101730009FEF80EC089500240A94161617061806E9 +:101740000906089500240A941216130614060506C5 +:101750000895092E0394000C11F4882352F0BB0F56 +:1017600040F4BF2B11F460FF04C06F5F7F4F8F4FB9 +:101770009F4F089557FD9058440F551F59F05F3FF4 +:1017800071F04795880F97FB991F61F09F3F79F0A3 +:1017900087950895121613061406551FF2CF469525 +:1017A000F1DF08C0161617061806991FF1CF8695A7 +:1017B0007105610508940895E894BB27662777278B +:1017C000CB0197F908958ADF08F48FEF0895A1E21D +:1017D0001A2EAA1BBB1BFD010DC0AA1FBB1FEE1FAB +:1017E000FF1FA217B307E407F50720F0A21BB30BF6 +:1017F000E40BF50B661F771F881F991F1A9469F772 +:1018000060957095809590959B01AC01BD01CF01CD +:061810000895F894FFCFDB +:10181600796F752073656C6563746564207468659B +:10182600206B65797061642064656D6F206D6F64EF +:1018360075733A0A0D00646174615F6C656E677456 +:10184600683A200020785F706F733A2000785F70E6 +:101856006F733A200009795F706F733A20000D00AC +:10186600008310000001041000000182080000013E +:0E187600000000000000000000000030200014 +:00000001FF diff --git a/firmware/USBtoSerial.lss b/firmware/USBtoSerial.lss new file mode 100644 index 0000000..e0c487b --- /dev/null +++ b/firmware/USBtoSerial.lss @@ -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 : + 98: 12 01 10 01 02 00 00 08 eb 03 4b 20 01 00 01 02 ..........K .... + a8: dc 01 .. + +000000aa : + 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 : + e8: 04 03 09 04 .... + +000000ec : + 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 : + 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

+ 16a: 0c 94 09 0c jmp 0x1812 ; 0x1812 <_exit> + +0000016e <__bad_interrupt>: + 16e: 48 cf rjmp .-368 ; 0x0 <__vectors> + +00000170 : + * \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 + 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 : + * \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 + 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 : + 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 : + +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 : + +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 : +// 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 + 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 + 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 + ; // 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 + 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 + 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_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 + 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 + 2bc: 41 c0 rjmp .+130 ; 0x340 + ; + + 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 + 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 + while (t0ext() < ADB_IMPULS_KURZ) + 2de: a2 df rcall .-188 ; 0x224 + 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 + 2fa: 0e c0 rjmp .+28 ; 0x318 + ; + else + while (t0ext() < ADB_IMPULS_LANG) + 2fc: 93 df rcall .-218 ; 0x224 + 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_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 + 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_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_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 + 344: bc cf rjmp .-136 ; 0x2be + while (t0ext() < ADB_IMPULS_KURZ + ADB_IMPULS_LANG) + ; + } + } + // STOP BIT (0) + t0rst(); // TCNT0 = 0; + 346: 76 df rcall .-276 ; 0x234 + 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 + 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_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 + 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 + ; + + // 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 + anzahl_out = 2 + 1; + else if (adb_werte[0] == COM_LISTEN1) + 390: 89 33 cpi r24, 0x39 ; 57 + 392: 41 f4 brne .+16 ; 0x3a4 + anzahl_out = 8 + 1; + 394: 29 e0 ldi r18, 0x09 ; 9 + 396: d2 2e mov r13, r18 + 398: 02 c0 rjmp .+4 ; 0x39e + 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 + 3a2: 6b cf rjmp .-298 ; 0x27a + + // Warten auf Rückgabewerte sonst Abbruch + // TCCR0 = ADB_VORTEILER_A_BIT; // micha modifikation + t0rst(); // TCNT0 = 0; + 3a4: 47 df rcall .-370 ; 0x234 + + do { + if (t0ext() > ADB_IMPULS_TLT) { + 3a6: 3e df rcall .-388 ; 0x224 + 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 + 3c2: 42 c0 rjmp .+132 ; 0x448 + return (0); + } + } while (ADB_PIN & ADB_BIT); + 3c4: 48 99 sbic 0x09, 0 ; 9 + 3c6: ef cf rjmp .-34 ; 0x3a6 + while (!(ADB_PIN & ADB_BIT)) + 3c8: 48 9b sbis 0x09, 0 ; 9 + 3ca: fe cf rjmp .-4 ; 0x3c8 + 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 + 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 + // Abbruch wenn keine weiteren Bytes übertragen werden. + do { + if (t0ext() > ADB_IMPULS_KURZ + ADB_IMPULS_LANG) { + 3e2: 20 df rcall .-448 ; 0x224 + 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 + return (z_byte - 1); + 3fe: 11 50 subi r17, 0x01 ; 1 + 400: 24 c0 rjmp .+72 ; 0x44a + } + } while (ADB_PIN & ADB_BIT); + 402: 48 99 sbic 0x09, 0 ; 9 + 404: ee cf rjmp .-36 ; 0x3e2 + t0rst(); // TCNT0 = 0; + 406: 16 df rcall .-468 ; 0x234 + while (!(ADB_PIN & ADB_BIT)) + 408: 48 9b sbis 0x09, 0 ; 9 + 40a: fe cf rjmp .-4 ; 0x408 + ; + if (t0ext() < (ADB_IMPULS_KURZ + ADB_IMPULS_LANG) / 2) + 40c: 0b df rcall .-490 ; 0x224 + 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_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 + 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 + 446: 01 c0 rjmp .+2 ; 0x44a + // 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 : + +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 : + +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 + 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 : + 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 + 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 + 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 : + +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 + 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 + 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 : + + + + + +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 + { + 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 + 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 + 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 + 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 + 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 + /* 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 + * \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 + USB_USBTask(); + 56a: f4 d5 rcall .+3048 ; 0x1154 + +} + 56c: 1f 91 pop r17 + 56e: 08 95 ret + +00000570 : + +/** 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 + +0000059a : + +/** 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 handler for the library USB Disconnection event. */ +void EVENT_USB_Device_Disconnect(void) +{ +// LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); +} + 59c: 08 95 ret + +0000059e : +/** 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 + +000005a4 : + +/** 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 + +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 +} + 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 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 + 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 + 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 + 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 + 634: 88 30 cpi r24, 0x08 ; 8 + 636: 31 f0 breq .+12 ; 0x644 + 638: 86 30 cpi r24, 0x06 ; 6 + 63a: 29 f4 brne .+10 ; 0x646 + { + case 6: + ConfigMask |= (1 << UCSZ10); + 63c: 12 60 ori r17, 0x02 ; 2 + break; + 63e: 03 c0 rjmp .+6 ; 0x646 + case 7: + ConfigMask |= (1 << UCSZ11); + 640: 14 60 ori r17, 0x04 ; 4 + break; + 642: 01 c0 rjmp .+2 ; 0x646 + 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 : + + + + +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 + 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 + 6cc: 08 95 ret + +000006ce : + } + +} + +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_putc(*s++); + 6e2: ed df rcall .-38 ; 0x6be + +} + +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_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 : + + +// 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 + 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 + +}/* 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 + string[i] = ' '; + 76c: c8 82 st Y, r12 + 76e: 08 c0 rjmp .+16 ; 0x780 + } 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 + 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 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 + + + + 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(&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 + 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 + 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 + 80e: 00 c0 rjmp .+0 ; 0x810 + 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 + 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 + loopcounter++; + 824: d3 94 inc r13 + if(loopcounter) { + 826: e9 f7 brne .-6 ; 0x822 + continue; + } +// // uart_puts("c"); +// _delay_ms(20); + + dummy=touchpad_read(); // read values from the touchpad + 828: 21 de rcall .-958 ; 0x46c + 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 + 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(stringbuffer); + 83e: c8 01 movw r24, r16 + 840: 46 df rcall .-372 ; 0x6ce + uart_puts(" x_pos: "); + 842: 84 e3 ldi r24, 0x34 ; 52 + 844: 91 e0 ldi r25, 0x01 ; 1 + 846: 43 df rcall .-378 ; 0x6ce + my_uitoa(delta_x(),stringbuffer,4);// x_abs returns current x position of your finger + 848: 2a de rcall .-940 ; 0x49e + 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 + uart_puts(stringbuffer); + 85c: c8 01 movw r24, r16 + 85e: 37 df rcall .-402 ; 0x6ce +// +// _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 + 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 + + // 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 + 878: 24 f4 brge .+8 ; 0x882 + x = 255; + } else if (x + dx < 0) { + 87a: 37 fd sbrc r19, 7 + 87c: 05 c0 rjmp .+10 ; 0x888 + x = 0; + } else { + x = (x + dx); + 87e: ec 0c add r14, r12 + 880: 04 c0 rjmp .+8 ; 0x88a + 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 + } 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 + 89c: 24 f4 brge .+8 ; 0x8a6 + y = 255; + } else if (y + dy < 0) { + 89e: 37 fd sbrc r19, 7 + 8a0: 05 c0 rjmp .+10 ; 0x8ac + y = 0; + } else { + y = (y + dy); + 8a2: f8 0e add r15, r24 + 8a4: 04 c0 rjmp .+8 ; 0x8ae + } 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 + } 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 + 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 + uart_puts(stringbuffer); + 8c2: c8 01 movw r24, r16 + 8c4: 04 df rcall .-504 ; 0x6ce + uart_puts("\ty_pos: "); + 8c6: 85 e4 ldi r24, 0x45 ; 69 + 8c8: 91 e0 ldi r25, 0x01 ; 1 + 8ca: 01 df rcall .-510 ; 0x6ce + 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 + uart_puts(stringbuffer); + 8da: c8 01 movw r24, r16 + 8dc: f8 de rcall .-528 ; 0x6ce + uart_puts("\r"); + 8de: 8e e4 ldi r24, 0x4E ; 78 + 8e0: 91 e0 ldi r25, 0x01 ; 1 + 8e2: f5 de rcall .-534 ; 0x6ce + 8e4: 9e cf rjmp .-196 ; 0x822 + +000008e6 : + 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 + 8ea: 93 30 cpi r25, 0x03 ; 3 + 8ec: 41 f0 breq .+16 ; 0x8fe + 8ee: 91 30 cpi r25, 0x01 ; 1 + 8f0: e9 f4 brne .+58 ; 0x92c + 8f2: 17 c0 rjmp .+46 ; 0x922 + 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 + case DTYPE_String: + switch (DescriptorNumber) + 8fe: 81 30 cpi r24, 0x01 ; 1 + 900: 41 f0 breq .+16 ; 0x912 + 902: 81 30 cpi r24, 0x01 ; 1 + 904: 18 f0 brcs .+6 ; 0x90c + 906: 82 30 cpi r24, 0x02 ; 2 + 908: 89 f4 brne .+34 ; 0x92c + 90a: 06 c0 rjmp .+12 ; 0x918 + { + 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 + 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 + 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 + + 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 +{ + 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 : +#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 + 954: bc 01 movw r22, r24 + 956: 20 e0 ldi r18, 0x00 ; 0 + 958: 34 c0 rjmp .+104 ; 0x9c2 + 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 + */ + 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_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 + 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 + * \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 + * \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 + * \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 + #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 + { + 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 + 9a8: 88 30 cpi r24, 0x08 ; 8 + 9aa: 91 05 cpc r25, r1 + 9ac: a0 f3 brcs .-24 ; 0x996 + 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 + 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 + 9c8: 22 23 and r18, r18 + 9ca: 81 f6 brne .-96 ; 0x96c + 9cc: 05 c0 rjmp .+10 ; 0x9d8 + } + } + + 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 + 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 + * \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 + 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 : +#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 + a06: bc 01 movw r22, r24 + a08: 20 e0 ldi r18, 0x00 ; 0 + a0a: 36 c0 rjmp .+108 ; 0xa78 + 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 + */ + 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_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 + a24: 3e c0 rjmp .+124 ; 0xaa2 + 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 + * \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 + * \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 + * \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 + #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 + { + 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 + a5e: 88 30 cpi r24, 0x08 ; 8 + a60: 91 05 cpc r25, r1 + a62: 98 f3 brcs .-26 ; 0xa4a + 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 + 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 + a7e: 22 23 and r18, r18 + a80: 71 f6 brne .-100 ; 0xa1e + a82: 05 c0 rjmp .+10 ; 0xa8e + } + } + + 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 + 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 + * \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 + 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 : + 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 + */ + 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 + 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_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 + * 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 + 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 + */ + 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 : +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 + { + if (!(Table[i].Address)) + b34: 98 81 ld r25, Y + b36: 99 23 and r25, r25 + b38: 29 f1 breq .+74 ; 0xb84 + 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 + 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 + b5e: 96 e0 ldi r25, 0x06 ; 6 + b60: 01 c0 rjmp .+2 ; 0xb64 + 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 + 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 + { + 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 + b80: 88 23 and r24, r24 + b82: 31 f0 breq .+12 ; 0xb90 +#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 + + 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 + { + 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 : + } +} + +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 + ba8: 03 c0 rjmp .+6 ; 0xbb0 + { + 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 + * \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 + */ + 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 + * \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 + */ + 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 : + * \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 + * \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 + { + 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 + 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 + * \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 + 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 + { + PreviousFrameNumber = CurrentFrameNumber; + + if (!(TimeoutMSRem--)) + c18: 44 23 and r20, r20 + c1a: 59 f0 breq .+22 ; 0xc32 + c1c: 41 50 subi r20, 0x01 ; 1 + c1e: c9 01 movw r24, r18 + c20: e3 cf rjmp .-58 ; 0xbe8 + 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 + c42: f9 cf rjmp .-14 ; 0xc36 + +00000c44 : +{ + #if defined(USB_CAN_BE_BOTH) + bool UIDModeSelectEnabled = ((UHWCON & (1 << UIDE)) != 0); + #endif + + USB_INT_DisableAllInterrupts(); + c44: 40 d0 rcall .+128 ; 0xcc6 + USB_INT_ClearAllInterrupts(); + c46: 42 d0 rcall .+132 ; 0xccc + } + + 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 +} + +#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 + #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 : + 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 + +00000cc6 : + #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 : + #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 + #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 + 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 + 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 + 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_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 + 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 : +#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 + *(RequestHeader++) = Endpoint_Read_8(); + #endif + + EVENT_USB_Device_ControlRequest(); + eb8: 75 db rcall .-2326 ; 0x5a4 + * \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 + { + 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 + ece: 84 c0 rjmp .+264 ; 0xfd8 + ed0: 26 30 cpi r18, 0x06 ; 6 + ed2: 40 f4 brcc .+16 ; 0xee4 + ed4: 21 30 cpi r18, 0x01 ; 1 + ed6: a1 f1 breq .+104 ; 0xf40 + ed8: 21 30 cpi r18, 0x01 ; 1 + eda: 70 f0 brcs .+28 ; 0xef8 + edc: 23 30 cpi r18, 0x03 ; 3 + ede: 09 f0 breq .+2 ; 0xee2 + ee0: 20 c1 rjmp .+576 ; 0x1122 + ee2: 2e c0 rjmp .+92 ; 0xf40 + ee4: 28 30 cpi r18, 0x08 ; 8 + ee6: 09 f4 brne .+2 ; 0xeea + ee8: ef c0 rjmp .+478 ; 0x10c8 + eea: 29 30 cpi r18, 0x09 ; 9 + eec: 09 f4 brne .+2 ; 0xef0 + eee: fe c0 rjmp .+508 ; 0x10ec + ef0: 26 30 cpi r18, 0x06 ; 6 + ef2: 09 f0 breq .+2 ; 0xef6 + ef4: 16 c1 rjmp .+556 ; 0x1122 + ef6: 92 c0 rjmp .+292 ; 0x101c + { + case REQ_GetStatus: + if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || + ef8: 80 38 cpi r24, 0x80 ; 128 + efa: 21 f0 breq .+8 ; 0xf04 + efc: 82 38 cpi r24, 0x82 ; 130 + efe: 09 f0 breq .+2 ; 0xf02 + f00: 10 c1 rjmp .+544 ; 0x1122 + f02: 08 c0 rjmp .+16 ; 0xf14 + 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 + CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED; + f10: 82 60 ori r24, 0x02 ; 2 + f12: 0c c0 rjmp .+24 ; 0xf2c + */ + 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 + } + + 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 + f44: 82 30 cpi r24, 0x02 ; 2 + f46: 09 f0 breq .+2 ; 0xf4a + f48: ec c0 rjmp .+472 ; 0x1122 + 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 + f54: 82 30 cpi r24, 0x02 ; 2 + f56: 91 05 cpc r25, r1 + f58: 09 f0 breq .+2 ; 0xf5c + f5a: e3 c0 rjmp .+454 ; 0x1122 + f5c: 0b c0 rjmp .+22 ; 0xf74 + { + #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 + f66: dd c0 rjmp .+442 ; 0x1122 + USB_Device_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature); + f68: 23 30 cpi r18, 0x03 ; 3 + f6a: 09 f0 breq .+2 ; 0xf6e + f6c: 80 e0 ldi r24, 0x00 ; 0 + f6e: 80 93 98 02 sts 0x0298, r24 + f72: 2c c0 rjmp .+88 ; 0xfcc + + 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 + { + 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 + f84: ce c0 rjmp .+412 ; 0x1122 + */ + 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 + { + 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 + * \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 + * \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 + fb2: 88 0f add r24, r24 + fb4: 99 1f adc r25, r25 + fb6: 2a 95 dec r18 + fb8: e2 f7 brpl .-8 ; 0xfb2 + 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_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 + fdc: a2 c0 rjmp .+324 ; 0x1122 + } +} + +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 + * \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 + 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 + 1012: 83 e0 ldi r24, 0x03 ; 3 + 1014: 01 c0 rjmp .+2 ; 0x1018 + 1016: 82 e0 ldi r24, 0x02 ; 2 + 1018: 8e bb out 0x1e, r24 ; 30 + 101a: 83 c0 rjmp .+262 ; 0x1122 + 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 + 1022: 7f c0 rjmp .+254 ; 0x1122 + !(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_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 + { + 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 + 106a: 29 5c subi r18, 0xC9 ; 201 + 106c: 3f 4f sbci r19, 0xFF ; 255 + 106e: 02 c0 rjmp .+4 ; 0x1074 + 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 + 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 + 1096: 12 c0 rjmp .+36 ; 0x10bc + 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 + 10a4: bc 01 movw r22, r24 + 10a6: 00 97 sbiw r24, 0x00 ; 0 + 10a8: 09 f4 brne .+2 ; 0x10ac + 10aa: 3b c0 rjmp .+118 ; 0x1122 + 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 + */ + 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_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 + * \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 + 10ea: 1b c0 rjmp .+54 ; 0x1122 + 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 +} + +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 + * \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 + + if (USB_Device_ConfigurationNumber) + 1108: 80 91 96 02 lds r24, 0x0296 + 110c: 88 23 and r24, r24 + 110e: 21 f4 brne .+8 ; 0x1118 + } + + 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 + 1118: 84 e0 ldi r24, 0x04 ; 4 + 111a: 01 c0 rjmp .+2 ; 0x111e + 111c: 81 e0 ldi r24, 0x01 ; 1 + 111e: 8e bb out 0x1e, r24 ; 30 + + EVENT_USB_Device_ConfigurationChanged(); + 1120: 3e da rcall .-2948 ; 0x59e + * \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 + * \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 : +#include "Events.h" + +void USB_Event_Stub(void) +{ + +} + 1152: 08 95 ret + +00001154 : +#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 + */ + 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 + 116a: 10 e8 ldi r17, 0x80 ; 128 + 116c: 01 c0 rjmp .+2 ; 0x1170 + 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_Device_ProcessControlRequest(); + 117e: 88 de rcall .-752 ; 0xe90 + */ + 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 : +#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 + 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 + 11aa: 98 c0 rjmp .+304 ; 0x12dc + 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 + 11b4: 82 32 cpi r24, 0x22 ; 34 + 11b6: 20 f4 brcc .+8 ; 0x11c0 + 11b8: 80 32 cpi r24, 0x20 ; 32 + 11ba: 09 f0 breq .+2 ; 0x11be + 11bc: 8f c0 rjmp .+286 ; 0x12dc + 11be: 3c c0 rjmp .+120 ; 0x1238 + 11c0: 82 32 cpi r24, 0x22 ; 34 + 11c2: 09 f4 brne .+2 ; 0x11c6 + 11c4: 6a c0 rjmp .+212 ; 0x129a + 11c6: 83 32 cpi r24, 0x23 ; 35 + 11c8: 09 f0 breq .+2 ; 0x11cc + 11ca: 88 c0 rjmp .+272 ; 0x12dc + 11cc: 79 c0 rjmp .+242 ; 0x12c0 + { + 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 + 11d6: 82 c0 rjmp .+260 ; 0x12dc + * \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 + + 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 + 1236: 52 c0 rjmp .+164 ; 0x12dc + } + + 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 + 1240: 4d c0 rjmp .+154 ; 0x12dc + * \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 + { + 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 + 1254: 43 c0 rjmp .+134 ; 0x12dc + * \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 + { + 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 + + EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); + 1294: ce 01 movw r24, r28 + 1296: b3 d9 rcall .-3226 ; 0x5fe + 1298: 21 c0 rjmp .+66 ; 0x12dc + } + + 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 + * \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 + + 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 + 12be: 0e c0 rjmp .+28 ; 0x12dc + } + + 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 + 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 + + 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 + } + + break; + } +} + 12dc: df 91 pop r29 + 12de: cf 91 pop r28 + 12e0: 08 95 ret + +000012e2 : + +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 + + 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 + 1308: 88 23 and r24, r24 + 130a: 59 f0 breq .+22 ; 0x1322 + 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 + 1314: 88 23 and r24, r24 + 1316: 29 f0 breq .+10 ; 0x1322 + 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 + 1320: 01 c0 rjmp .+2 ; 0x1324 + + 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 : + 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 + 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 + */ + 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 + */ + 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 + 136c: 69 81 ldd r22, Y+1 ; 0x01 + 136e: 88 23 and r24, r24 + 1370: 29 f4 brne .+10 ; 0x137c + * \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 + +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 : + +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 + 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 + */ + 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 + * 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 + { + if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) + 13c0: 0e dc rcall .-2020 ; 0xbde + 13c2: 88 23 and r24, r24 + 13c4: 59 f4 brne .+22 ; 0x13dc + 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 : + 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 + 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 + */ + 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_Flush(CDCInterfaceInfo); + 1408: bd cf rjmp .-134 ; 0x1384 + 140a: 08 95 ret + +0000140c : + 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 + 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 + */ + 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 + #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 + * \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 +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 + */ + 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 +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 : +#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 index 0000000..81032a2 --- /dev/null +++ b/firmware/USBtoSerial.map @@ -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 index 0000000000000000000000000000000000000000..51f8fa1766f17aa090a101a00ffd696e1b072d13 GIT binary patch literal 41156 zcmd^|d3;sH`TytKdjnw&L_}1O3q(YgB&_1j5|+3?$|m+py}3zlNF*dNxj~>-5`|CG)?!4!j zXP$XxIdkTmdu~`Y?Sko!<0umxHCH84N^O{_)Q^!lPAd#k-&3>Hii(^Z& z<0Y~1lGuvMXi>N*wzML=w4$h{`i!nUR8ce@jg-a87spG^2&?e&NM%Jez{Fivh@gj3 zYkDc=g!r*K6(7bI#Mxn|w{vpOW4Z- zt=l=!P%0z{D=8tTTQ{hrI8f;{4Ep_1Q)eld!h)&CxGLSK(xr!Ia$;Adx`v!!Pi;Ww zb`w=?t-Gkg2vvKep?=!y={UK^&{oG+(Gu8Ezn!QoGB$Z0fbSq3brF-r% zVJIJy5HQ&%6CSVur*sc%AC66t0<5d=P*kDRaiY}CHNwjKiJErl_;FsVlsX|{ku_5J z#6)>l&>yAgqVAvpQd%cY%5=`{?)LgA-OuW-)W8(&LO5Zfx0CKn>PowV5>5m#UW2V9 z`e8`Is{oQ21JvkaSaxBzi_!3t2RL?eXbN(vc8cwOqN-tH8&0ySQxiV3&~VFkic%vi z+enVgl&V~>N9n3yBy*h9nMFx|IF+5L60LVDS8B8^%+*bpggVFQp3(!&VM(|;)@nCu z8Rr$p7#o}8ZJ{Zw)C8~h^?XU#Jk4q^Y)(Yd8^6;N33kmHo()WwgoQJ$KGBontZq2z z(s3G|t-Apw&v7Lj*>l+=N=;%G|sQLhnHo06DEta_?7Na&%QgwyQYX}XsopH8bv z&Cte?o~Z%lbEN<#^|^ZToi|=jzVmH4$6I}bWgwtekdR(T?A63tSVXDI3NCCx2UQr! z%IR8yCB#U6xDXf$q?DG&UDI8zxRg49&eREpFp-Svm20%b%}CW5!Bm|}aXLSe@+NY1 zRqm%$t0h7G8PcCA`m>Y%?5sail{V7(H!0g$fup^XNVhgnd?qqdQ@UPq4qDs=th(k? z6c{3@Xhf$RH?P3W3%aR7Hx+W5*R|*y7RRBSl!iF$X&*ZDSya2t`pHpMwIR#}M?39S z(f#G;+bt(%yTA3%cC)o9={41@bN6!REEvVQgpW#RIU+ROOQVU% z&p?$s6k@K%O$AhHw;tuKp3(|d=+*K=HZCwEq*71pQIHZet}K~vE3IM`fg!!zVeGM* z#(J{pVH8N?oL!|-yF2AqAlWOoTsf5_)X{5pO$N3a-5T`v- z#f}r~qv=f0pP+oKq{yl-Rga^@xznK!!DB#I=w+ueL3y4ADv%Lae^N~);|(iu8?{Y*#lUv^Q$SWQn`IL z2kvTfsaH9{Nmz4qJ*ig_btj~*_xdAsLqfW7IZT{{Zos;6jpGblL&9=KFO)XutaXBQ z#-Ov7o#?jVs)TgiI#Z3a(d}!_l)kJnOhe8=T>~-L7*@O(407c($1s>5&O!FFQ#?c` zzMv(iAmbjGGQs&GW0#%$^5kFJ$!~_fgrrk|eF9537)0GiQk-?KN8Q6D(^P({PN!+z z(B{C_fGg;uC#6$5JjsJT&hR7`j&(*P`Eb1BI#G(9#SC+YLlD0F}b+N%qB?588}~X#YJ)TZCUH3CHPFFeP!TLjT6QQf$2a zV=X!9PMaQ(oZ~vo>F+pt5=ggM^_4MFu?z{W z?Nrj_lr}kMhUKi(Ig9q95kp5q)Jc1P>&fq1GsJm+=x0bu)>$mUaQ44NC$kGr>5}AW zeNXbVzBhSVKQM}Cu?goG_z-UBi5I%$LL)oVb|qB&eQYNF6L)-z%6D+*OkOQa2$f!r z3P+u9L>WIY1dY&A&+}c-ay`GyOwp5<*s7PG`y-t^lh+RuLTjgCbcWstQM(=g+W*^@ zs*`!SG9h%;sGVL?rcy)FRJsk$p8S-jgAUl9^(vFzoS5`3lC`TKa?kG2ZAk`1cxRGO zs=6;p_!+8l`}2NY!F7<*kC?Q+&`9YglZ2zO<8w>5n9(pN$8$-FrBED13~sr- zUb(*I$mkK^2`P1bnPlQ-&%~G9|L8DTYlH&HtJrU$Ii(tR7!FB?9szC!L>-qh5$l!> z!(ErYjD@=CZ7%bs@&oCa*gSM9YI0&tj!`iVpI)j$-4iRDyKsdDIL<Nfa5KV?!;etdU6S0)vy<1S(76r^1~xfZib63j6HAeuDne$l=f&wo$W0`NbGKtc z=u~IKKkf7=XIc=KNr=9h>P@WaJt3NLyq0GiK5u3QNTsi&k)Cw^1o)(PzGOh{ z`rOK0i>}1=z?QgfSQ0VeO4PwLbh`Q}n(8?J{6|-O>e=FCW@h343+7Ls?8P}%rORSf z)mayoRu`&o$bl~$I-s-k6ClNZdH_-(55=T4z{{6Do~>C%ewqv=j9i&j@><;0ei z7RJ7d?sur6qAI4{MvT z!xk-b1su05+_+U%;Gso?DU`wv)YUNpOd2+*vf^@G10E`{-mIcnS#$;Tk*lXCFj-v+9`x{75%u-OMji@Glbquup5sfO zC}}*zy?T|YArx5PQ#&c4w$oF?86@K1H35UB>W*DH)o1%#T>6PuS153XubAc198-D1 zqw7SwpTwcSL%#CgQtgdb8iS@aM~g#&-9Gb{d(V6368?pP#Ztg;+Sa+$r(-(R)~WF6 z7<=vMUMadmJ1Aqyn%K-5W6Li$X@Bh3H~Gfi@lt>9|D_+sZV->&+>_%NiB0-wE$zrt zGjII)>0;ls!04Hlnb>${{4kR~SZO3i!_?p}Y2-%F#D00O+E^SSz6C3cq=!hdB(~?x zL6I4IrhXHf`s^}aNg0#ZQEZn9e&j6^rmBvL`Sbm0f4QV;{`H-!Nh-e9TfvT2tI1C) zeyvyhTb*p^P|XxevbycNso&T}-9MPd_cR$uv-~I3dguR*nO}QmOf9C3CN|#q(;azj zs7&%gf%k<>`ER*I{K8w)LxCN>V&2jp3O0Ib#z$k@ zv^f-b%UAq=U+c|Yt)Y}(i1nK#4uyiR|HyQUfAtDEPbbt~@~oKg>uNFsM$NS5fA90- zUTt2_bSjbhJV_|{fVU$sLesJKkp4spnmnT$>KxqN)ifSG@l1_L7!BLXPM;M!@9}TR zYmq$DIVQHtKPNh-UK86oulRKQt!b~!JHEQjTr|4IhVjWS_ovNu&d5z{%A458{juGi z;FldP(Mf8ny@kU+I>x%W%A4Agif{Can`~38mvoMq_9iy#hS5v+b-Y?>!SHoaofruU89^rlH4O|PT+JCdW<`{Ir-pzyj3_+LE}xBNthDlfR~V zO~IO)HAQRk7p|Ip`I_Q2wFl~38`jsZKW1I}I@%uCnAVu~NLpj>j4e&I4N7f^)HdO> zA+0{`$+Y@`_5GUHJ)8}BxOG_C=mF0X$vYDwTJ`!tIQoaB5rYTS?*8>;tn}=k6n~|3O|sBN?pqK+i8vVhP&*+^Mar9pW5nYr(EVwY1HjV)=Y@ zA38M;y3RQ~Ff!m+b=bAme#^d_RgTCtW1T}+k97{8+WJbSYH4bHE3wR(WTZO4vTe(oer5UId9DR&(MmhoAIUf! zQ7s$lYST8X>C~LM^}WH-h!TNXW zQ=8eZAMZcZT3c6_U%Mu?dDEXc`&bWSwm!A_8ZBG1pOUq$CjVMb^J-0;lPs64U+3v3 z%U4@+)-o(ByES}ycIEiyQ<~RTt{#!v9ELQz^_0r&$}w4kPZ^swHjR4qt?Mi6E4MXo z&)RUxbnY&-a}lU>B(;|ereJRPV{e=wbIh`tl5#lKggc+tW)-pD_NJd zA#GjS%rw<9skIlZtd()b>e93Y>yWXzWjB4V$1&`<(>tSuvO+xJT!(eRq_}b!y{z2| zUbB2wWw_}>6>d17!swIQ(G4l;&=!>Mm!(=-k$(sWE#%kH$KHAH`>?UdwzRcsa_bwO zQO&g3^n$j)@;nAMq&Ba8bp5KeyEnX-_6U4x%2&M_^HtiD^{urBTuD^bH$@?#ek#U@ zBjm1nHYL{Btfq6DW;aEeDw4B!*O$VEfH03wEpf*3W7Uzj6f284H!|sL$ z8g6aa(y*$bq9M{SyW!l1ENflf(s*m*1C6^IUu<+&;(<+HJGWnZd)^({>hOcDx8*%J zseglN>D5|$?P}QVm%sYj_1Vs$4LH^zou02+`rzoB->dOiwCfohAde!pS=hR-)V z?L6Xa!~DLyd2ut_7H%E)e$K&*^_qOXv&dmSysdwA_VoDufO|52k@0xzlFZ9S){Sf!+22XsIw*B?>TT~ohZR?^WGTH< zoWoB!YkM>gSbc0$O6c%2t8vwF9(8s&O}h2@KPXvar&l-|owv6Rx-NC=?WsRYedFJ% zg+3?NzC`O+)mPL<>Sx!VTc3sYn9-!~@8Zh(yGP%7H2*rzws&@?J^8!c>{-r{{MJf+ zHrl*=D|44`-E#2y{dd1tmsdaOwn@BFxFwi(B;!vRo1L`Cz}ZZ_y45+%xFoBxm3HoS zGCZ4s+obp~I)) z{QjuBYWX{Z3L=BgHcVRr<H2 z?qTU~hlPYg=Dw-?}BmckFD{gWYC+Z2P&Ei2Ka#X%aSQu1YYHw{vZbSi< zZDmJ|*ijaiB%~I43MMz8Mq8$SV8o7U4->iVnZ&!IM!}Agoh>q19f(bK+d(U9a+W4K zvy=MvbO+9~HCxc+6ei4eP^<&7qr85=E1?nNyNTOYmOLShUWe8Tj7EFbJ1ph-WJ-6a z>Df1$R)dVlo*+i%sA7XAZrj%OPqO4;_oidg)IEw6o$;Kh*2I?M|ABL+RCnbLNb-5# zU0u@TM4FuZCMTMh8QqmTQ`|Q;5*FIiHMx%RdN`=!j(4IZ^8e$rtWAd}cjUL*xg=5H zQP3zRTlZ$RqmF{6eA0LX6)V#@5qxi7R9ULt=ulydtMGRytc+Av#j2}os$!~hD)wHquLgluXgU*wZ|m_x zs}*X#$IDfP=0f-pDK3qb6)C=qIKR4JjQjonylC|j{r=zFSiGikX0)p4@+fNHYh2S7 zOq(??g7*m`?$`B^sTJkr=q~kedzm?SlSJ~LYcC&#i%S>RR7K;Z73EV)qUDQYMT)O* zwO38Ns-kR8?6R5|#vm2f;lwzNReW*FErYiSjB6K^mdB=*qm_6~!WfT3u_js-k5tyg z3l-nNGO22{7pbKyA~mJ)im2jSR7<0!3k-Jz??A+3>M^9^*%ix*3oB~ybC2gG z)A})+`V(XeN~_{E(K30RfMbHNt$A5jc7R zEd$yb{6M*LjBuL(W5Pw?m9cSrmzqf z3;P_(t)8~DGQI*A3F~5zGi^cc)M=5q^Cr)m7MWijjmM*fC0LltDk>`VvKOnu8pumw zl4eeXW7fK@JC>Fsk$7q0lB5wIGg0BSLtGNf zr4$#7Dt9GQ1*LKPE;+IE7FE<>`D}MRoVTJ9Fa4ENERAI?ErsWNV=yZkUm9B+9XqCG zOcqx*vtQ6JUXB_)HXHwCGZQ87+`sd+I zQvBpkPgZTgjJK)2Ix+Ix^7=Qn%XM$)A-21A-sKhEB*q?tO>Ntw^GcV-D)3uGYa5Uk zi(!22C2MX?btOE+bT_A4Bx&m%EngWeDT~lfQaR~#l=D^sy*rL9iNG&50Gp@CtPiyGhM0T^Y0Y=hn%McW{$;)=7SP{U!T+@5-fjUYJG&HKk?o(((x2 z&5gKMu)-CEWwC1Io_ACA&NMQmqM|HuhU%5ny$-Q)g;DGQ(J5G5%dr?%VV_@BuG`t( zr9^M=*=KTFVf8*%4Yxj?n0h~I&9Q0AV&zKL+|E#%UPG(O%Fvf?>tx5w8K!$Nap{~e zPPse5c@;A&aP4Wwq??~OAz)Qb1nyCF1=YL&EUh$`fk;uIsxGOhiieZdGOx?s%>pcP z(`?VWT-@);GH369%{Ja$RqQ(jpUG+Eev23j_uAOz#B$F{@6N>SZ*R)z`%H7opwHj- zhOq5z){I&6!&Afh{q^?xa!O5g;yl8bdP@oS<;q>C^cC+vy6svSDd0Il_w=ypJ1fi> zeLKTTMh9Ddj`X|=cUoQjI5l>Xa-GRzGT&`PE?yJgLFwf&j0amn<{6H_A-v$s5!nQdE7+_jFj#qL7} zt0H%UWeNDm!L7?1di~JBQt>kMoMX9U zWIQ?0fqF}Y85zA(z45K&Y!R`509%<9u89msD5<}espM_TUdGLgKc~Dm*MdRzTl!gJV*5GMWu}C zzZZtM-%~=YgQ<&;S8aQDuW|jMJv>YF>|F_F8DkHBfk}VQ36T!Q-U_5_dpj+Acpm84 z+XlAnO@KY~IEMy}z1=>&eCV0SJ+|KCNZ9qZpk6-KVLLc1%ws>lj>E2ZHSAg4?A80S zltHA!n^rrhZ|r>lw(T{-o_YMlf~FnsOBu=-_F4A${iLz?1=zNC1MHc{SS)AkeI{in zV>kqRHwE4H@-dgOhu1Ze?7cIz{q~;d)B6~D=5ZPAn|k{KXxoHM>)pp`?C0Zfn0om; zewH!wC4dt!+Y~}<>}C1vJpp@V$frI2Q43>lzR%tm*fWpqpyt`*qchvTVH*@+dplvzJl=$wXYXmByCMwt0B%CeX1vv(itLF5Hvuf(T!e+PP7e0mQ;&pgJaQDbi-^z8P|gnt>x zXa9}HVcOf`v-fxh_V|~LYU$^z8Q5UYqdmbSN8p zGko^GfIUn>FBp4MeD)rMy$op4KYk}=>@D)y3uAJ=_Mc%BusX$5hhTN;fFqZuhpX+VsA3?jlD*n zz3eQde#Q-$1Y??CMH$=7+JW~__oTZ1O-0(+yTfPiJ#0Lep4@lY?S}d#aMIOOPkm#dwX`~Zpu;WOO!Ri)XUiF zew95R^93h!9^|~vvEE)dScO$wg%@F6W2OXS&!kOk%R}muBSy|R=#7pm4JLWQ{Gduh z7U#DcJ~_g@OXB+b$&o=w^L%o{Cr5C4%im(9HbLLf1QuW3qdtPJtC>@h*|y_#JIHR zYdzC;2r4XwRtPFAW>yF$?X=lnyb>ou(ES@Xo*<~NgkBQ*r>VD*T!O=Gk9}s*9L_aSE6YH_eV|3b_@GHIX}f@-qIgrJ)0OLOH+grMTemk2@kPri79 zpf|f+QBYl|_-9WU2IEM_{5;7U8?HH@9ywL=xn`tezVbeW0ha=#)8#Lcx%X!2n6IZx zK6O}ThA%xEX^Oc1(0<}?bh-Lb(Rb_XtMDUu9e5_BW4@dF6^dE@TFKAW`NyjtOPcFS zI_7^%QhI>mew~45Qaa}U0ZE^w(}UElC9uLnQ6yk5yBB`9+dmpv#X}-2X7_#gUHlr`e}}i!Xhb zFa4k|{Yy!6WlYEU#_Kc#_k8I%-(HsVOFDhFdfQk214(lamX7o9BVYc%d};SV@TxzY1RaHo$?Q?faA`jawNjs0(^*4)| zV^5zr*8R$rI4=3SeTYt**v@yCZN3UsQ|DeZZ|cm<(b;Xa-7jR?6mi9ghqj~b?|<9} z{O(hIKFW_oipwgZaenPoU5r#&yt;Ud^}<3VvRF&JXZreKzn9Wa`2F9_d$~!E`IDsn zXZ!7E$^(7tDZcyY-hEzg9@4upzX7*i9>Mzocn=M)IF^)-^S=jkv~TR?akhMos=p|* zo^pHN30g9Ib);Wb3{5;JP-fA*4NBoZwusxBUjX@#+Hp}MBPh2qlXm~_>} z)urC6kA)spCtiT`2C^ChslTs-wTeh#Mdb?pLI{l`Sr&^{Mfi=Idk^f$7LV6#2bc3x zapB@#oP0g@)%=^ex3VI4)xCD>AMQJ7e<@Odx&@TPy4|%IF-=qJ# z@OJR$!Xx2N2=!6_2FTKc!|3}Hgjx1v;Zwk)h2KN};2%5CWh2m^DZB_e^M&buzA$x{ z2y?ua3A5ie3BLdzn#euj7{YbJT(5SB4sG5~o~TvSLn8k->tPqwC!xj9BSMwt3x(V=f6$ncFevqetdCJWQIxn$Tm z2|5=EhrxvwFBTpQd9`pR_;TTF@Fp@h$O!eqyyo0ah7Wn*dxV#RTSN!LrS=G;%hih( zzbcGKy(2sn{Jt>T^%)s`5(R%n?gK#hw=jL?dPg0uk;jmEav>Zi%x)YcI*Xw*jLe%e zgptDNHZ_?nk2|IbbM2Z#hW**#MP#)1Cg?{+z76NX5|Q(|R4MWy@NuQc2cTZAo3wKc z&gl*0eo#i(Buqbf{h-bPICMMtc&(y-BFyGLAUZu@{}J*DuFm7a9Irj1a~0;-^JIBU z!|N!SRlg-V55vxTRmzX((3py+Id&cDb5T%9Ar?8Ywel|G+@b{$LRWJ5S!n0t^R zqH_t#Ws&&>9Ku*(-V2{CI+tOhB3vjO245sPrO+uP52A)ri-p7B%S2}a`us;^ zP7;JV;Z5MpMh9bhBN_Ji%;+|ePeXg}C1b4dMqBaCi97mkj$?!M6eAq4XH@R=5S6DLP-nw;Yk9sG2Fv z`ExNDbutuMI*ToxxTUkw(z(*oSx<(aQ&GWnmd=gBtm00K?-7P;>S19nt&a)Qw>@Oo z{61{{PUM^_FAH-Ge4C7ZxB`auiT(=ce{AV|Dm(@HK|C~IdpV|E$mloP=^;#=zGT$P z=N3aPo#Db<^T%6!x-g2U9N|genZmR=mkfnnuo)5gbjS;Z^T1W2^9FRTu;jJE^Psa{ zcp>;2;f>&}Wc0%iFt2VQqppu(=PuDHhR(gh<=|fmZv_8JcsuwNvdo7+S~{(k&fhJa z&n%tKEge3FrVkFz@m^%~^G4Y3Bh3CEXz>u?&5&mbZv&4Jrf+AHVY44>o+t7hkk1l+ z5X^tPiaH~p6D6Zh?&^enHThI1Ae0I7n)M@Lu1j^o!@!#@d7~x2gAALKa9;m6c{r32 zekzPESC5Jg_c%|IM`#uGYhmi_6&?QLKd+Lx;X!yq7+tCMiO#V&_dh11UFV=({}A~< zpz}3(6iXs>cbR3olHn)s!+Mk1ScGGR7k~$g4$qyDWZ0hr`(s6Z8GJi~ERV3y5#Eck z=ZnsK=*%ahYz$?;FLJ(@RU~qLZ?{b3Uqk*QvOM;#6XsT7v*?@&o$X}U+=sHaiu{L| z+jo($>fK6LO8 z=;=Nj3i+{Q=&S?}5$3*hxae?gn?UAbf^dc~pYhEQ9fh{cA;Zotl)Xsgv(W!V!v6*R z3ekBTI&qQn9&VG!75d=@;c?*q7LJ2=2{(d&MTS4To<1ea>*mYCIpE(5b3S}v$^T}_ zNA!dp%%vWfxD$o1Mc+;n&O^H{5-vr(g=F~7P$KeQLq9HZbg^0?@)an1mB=?izER{O zVP~7jw?lrT$o~rcyM^h`!{ljDKzLl_^zCV~e5toru{AZ)C(=haZPs zhbJk5z8^#$!;6#)bB!ibjnAves8)R-%&pNu;SBJX7PB7eV@Xt9Ebc8l4D#bG9xBXf zpKb9(VNSV87GEel0dl@0VD1YFEWT72ZmB9^`oB_`>)~o)UUN5Dyj3_1Ip1reeew?B z!QlHW*7vi}$%I_r&k8>;I@yrFYB8U=&?ejaA(@KkAW{0m-MpUicNWw~Zf6vogfK1-sURnHXWwmDCjZPfo-5)?R&1tKS3D$H@LvUrs+ zFBw;p`v4G{gn3@@pBtf^{r_WO*2U*6=04?7i+2mN?9;;NI>mQh%{|K>EdH}F`|5AP z?1#^UIS0NW%Y98}oQGugiM|I1vrmo_IsL>xLaBB7flm=;Uu6knxl^YJb1lL@U#Rsb zfoBL$0nZkm4!%fuCYb+F6MZ-jyjZvdTp@fZ_;TSg@G4=hC+me9!CQoH0beJ42l!Uu z9pJl!?*u;}d_VY6;TOQWg+Bs6E&MU~Md3r>H-vj)-F{D)&kjEn=DV7o2=hMTOW`os z!GN&6gTY;dGr+xtr+|+a&H)b+o(?`$xClI2xD0%{a3y%M@G@|&@JjIagloYU3$F!7 zg?E5Uh5798GGYEmeTDE&aGmfY;A@1R1UCt{fNvDu1OBn_``~+p_k$l2=Ci|J2=lwp z-w1ySeqOj2CbWJ&fPUk9et!~q2KX<+!@&oI`R?B5!ehWkgn9qo1$zQ>udSaCaAG5z zC~~N%A;LIS)CggoBV&bm4xUYx`|%kT&lX0N>LOv5jR^DnS}e>Z;xe+_vtMcPI$_$` zEX;L4KNEmH?c5@Ao~L&T^V)R3a2RZ!2@C~4DRQn+zZK2|zaX3qev>TE2lTzaF#lKv z<@Dzt!u01GVfvGT1%^8Gr-v}R_c$^gL&&grq%duc6Q<3xglRKJm^LpErp*Q90RRMj z?=QSWm^LL`w1gU4JHo)AY@s5nlSC3 zD@^+{glT`aFzsI?O#2bxFu0UF7=W-$nB%3N4?xcGS|@V$`DS6-=d&=DrTtrkIS=)- z0?0Y{?icwu@FT+PwJ2fv3@=Pn_LHeAaZg{nB%h4;+4W2 zi`Bxzz#D}}f*Xa|Z#P-ILwEw@_gTDCm~;CHi=P#q1o^8L|3P>PsX16NEV~=LoL@PZ!<@&a-%-Fvlz3V*MNdK5T}( zQsiX)902ld;PoOWZxP-OzRuzu!Z$&FpYRUwBf|HA^}RoAJ_vqZgj~5;Z9weLz9zh-sKp1cF*}|NwGsq*fiu#_# z7YkFTkUY}WS!!{OFxL=$Uk@D&xmr*8C|AG1;_HQ}f4eaC^}ReDMtGQV@L=#Sh0$H= zDdCae-wAVW|6X_j_+7F*ulP{759FT+v#-7sW_A2Noch^d{PXjgxwiBco&-K#nDcy) za1QuX;pyPf!ZX3A3ts@9EX?_zE6n--J>k2-7YpA9jtc)ATq?{tbD8j7@DIuI{A7bL z$EaSIeY;(l>+K!nF#v=IgsJnWFm-kdv#*{O?gxHRnCr|N!o$Gtk>$C{$HJ8VQ<&rO zZ{dmHPCZ?H_Ek^e^T2(D*(WCnF9Hu0&Ie}-7l0=Smx0d_t^!XNUJjlm%=LVM@Fwsj z!aQe-h3^EH3*Q4?Cj1h(mdu7ATq_&~Hw$NgZx-hK`HApZ;0G*zRG9N>x5fO!Ro-5B^%1eG*D@?UaDK3$uUv2$zHV3s-_OgyZ0m!fV0fgxObT z2{(dsgl_;}ApCRiJYmkyMZ!;li-dm-E)#wo92b5Ye1-5k;I+d0z?+2kgSQHQ1-?o6 z-{2j>0qp9a{))7&2;(xk#^IkQtGZp={YV>KorD%4RtwJ zOj({krtCbjl+7ng*vM(UMpK@sz=ZC3l4_WGZ4$Qi!yI1%l#4K;hzDX88_mQRSU%@O(-9wa1U7RaM zzZ3j6`rX0Q*ScW(N#FH*;9%Z^^LsezY=WF=)2LCm^Zg%kE#f#1>hnJR3QK;a$T=^lXMA2u7N0kh#pfHy zT!ayB1JnKv#CPDJecl(}DNGyp2=jiQ_xYRyh}8Y~;2a?T93L#p`~4Oi#)my*@!t8; z(Z`X(d|r_$I;=N@_L#Bg1Wt!OLw6jZT#fo2a>KTMSL#TgU}?|{llnf~*x@;B?DuD$ z*w3)!ypB=_x6S%@*GA{N*7aTW=_~6^L2Q^d^qK~F5IjW7wAx~`$6=_Adhy=LCm$9c8-V68Nys+ zxF?{U>4+y;@*H96&ji!X6^JhoIoF{)OTGx4J{KPd~51fH?*M4B9xv>=VA<#`?oJIt!y3mA(KU2*Ys%MW21b_xl*wU!8@s z!RZ_v1k)$m!0a#ja2?_t9ISUEV)jD_b$t&ptD$|$*>>s_ATAR5I>aS7XlFCxGT|+V z*+0hrO0e-i4o<%a9|-JgQ!o3D{%=BDi-Z1?SK~~(IDH{L5O(26zgVN5lj;BEGCxh( z0N9j;iz+?BTsL&66Ls^4BMM*uIS0&`vL7Jw`Xn1{#`FYmAS-bm@jI<0kcDw{70v($ zp)(9IZBm~$SO<9u;)%l35uYW@xiAR_%aU^}E&-c0KTa;f2SP0lBd6c#F?=9w$C1u~ zL*TfiFV?8niU97XdLfyL!^{DWtC<7c!KS@jLxMQz`yuW_x!jBO2L~XhEFVV@_eXak zz7$6Qd;zVVJi;9cY|rC0CAY|Q}Kb2fy2xzOdW4t4HG&2GZrTWUy*7>$Is0jX$jK9Nn6f-))7fx@JRAWOIuG$296|6r#5`v?#~2pk z;5=mbK8|!&h@i)gjwA3qr5(yDaiq&L^I9_6&cObmO%_>)gEq+m*GW{c6cw-$zq*GTkv(f;+~f6BKHIvpHCu7zhzi*-t(|e za0yn!!7NK2Y3ZCrma@$ljIsGu-fyOQQahc}%##Zt$C7j0&GX55 zmV6JC-)JafOr^L<~Ey3rp`o*&l09f zd1RUM^Mt9NZ*h?@yL!1WB7I$9*}mWnA}4PWrv6Q2%=unu(`~}MufI!}{dcc0@8fSpSv>`egpz zMwf;CIpo3awRM4T8f^Z+V*YNJIvXJ`vA9f_<5Nw>gyLSE?*~)A6Xa`zSAwsxc#H5A zkZ-g22H`6q=e<1bka;gpW?g)Tn9OOWf8zt@vZ;U9BmAuB@O1mV#cv5Ofc!7Q^x;Ec z*7XmIzZ7P@Du8;?M&38^-DUdF58__J)4}~M4hxq+&ii!glR4gG+B}U6oBd#ODjDk) zFEKNOPX^BtovvWMLu_>PZ-t;wA7UaWms(}{4l(t49{)%<8+^6J*9vp#;Jd=qp9KDi za54BkGW^^I=DWW}=LzBSApecUPYbiGe#ZY&A+38z6GK&H9waNkX4 z8~MJex$c}KTmX5t#p8r;f_%Eg=Lz2l`67$+g&%>O@2VR6`gdCx6xzQ^)(!{?0)bdk(2fB$RMYEzEey4 zmq0#Im~~CEI7gWKbpED}`sCTd+_NtbP6dBonAfYQ#W7*l%lCI_=Si4aF8nL7exD6; z@)}E@@Aw)&w+YkFTZDfN=I>0X!)s$Fq@C{gK z*A|9W9NwBh#yQS#2!}ZbzaVp-NHG13sjd5b0^(G1FIRy>MW!i=O#k;0rrZ6<6d?4+ zL1vS~WVt8G5T=b` + * + * USB Mode: + * Device + * + * + * USB Class: + * Communications Device Class (CDC) + * + * + * USB Subclass: + * Abstract Control Model (ACM) + * + * + * Relevant Standards: + * USBIF CDC Class Standard + * + * + * Supported USB Speeds: + * Full Speed Mode + * + * + * + * \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. + * + * + * + * + * + * + * + * + * + * + * + * + *
Define Name:Location:Description:
BUFF_STATICSIZERingBuff.hDefines the maximum number of bytes which can be buffered in each Ring Buffer.
+ */ + diff --git a/firmware/asf.xml b/firmware/asf.xml new file mode 100644 index 0000000..d4d90a6 --- /dev/null +++ b/firmware/asf.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + USB to Serial USART converter project. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/makefile b/firmware/makefile new file mode 100644 index 0000000..e9a153c --- /dev/null +++ b/firmware/makefile @@ -0,0 +1,48 @@ +# +# LUFA Library +# Copyright (C) Dean Camera, 2013. +# +# dean [at] fourwalledcubicle [dot] com +# www.lufa-lib.org +# +# -------------------------------------- +# LUFA Project Makefile. +# -------------------------------------- + +# Run "make help" for target help. + +MCU = atmega32u2 +ARCH = AVR8 +BOARD = USBKEY +F_CPU = 16000000 +F_USB = $(F_CPU) +OPTIMIZATION = s +TARGET = USBtoSerial +SRC = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) +LUFA_PATH = ../../LUFA +CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -IConfig/ +LD_FLAGS = + +# my modules + +# SRC += blahblah + +# Default target +all: + +# Include LUFA build script makefiles +include $(LUFA_PATH)/Build/lufa_core.mk +include $(LUFA_PATH)/Build/lufa_sources.mk +include $(LUFA_PATH)/Build/lufa_build.mk +include $(LUFA_PATH)/Build/lufa_cppcheck.mk +include $(LUFA_PATH)/Build/lufa_doxygen.mk +include $(LUFA_PATH)/Build/lufa_dfu.mk +include $(LUFA_PATH)/Build/lufa_hid.mk +include $(LUFA_PATH)/Build/lufa_avrdude.mk +include $(LUFA_PATH)/Build/lufa_atprogram.mk + +.PHONY: all + +program: all + + 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 index 0000000..b3122e3 --- /dev/null +++ b/firmware/makefile~ @@ -0,0 +1,44 @@ +# +# LUFA Library +# Copyright (C) Dean Camera, 2013. +# +# dean [at] fourwalledcubicle [dot] com +# www.lufa-lib.org +# +# -------------------------------------- +# LUFA Project Makefile. +# -------------------------------------- + +# Run "make help" for target help. + +MCU = atmega32u2 +ARCH = AVR8 +BOARD = USBKEY +F_CPU = 16000000 +F_USB = $(F_CPU) +OPTIMIZATION = s +TARGET = USBtoSerial +SRC = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) +LUFA_PATH = ../../LUFA +CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -IConfig/ +LD_FLAGS = + +# Default target +all: + +# Include LUFA build script makefiles +include $(LUFA_PATH)/Build/lufa_core.mk +include $(LUFA_PATH)/Build/lufa_sources.mk +include $(LUFA_PATH)/Build/lufa_build.mk +include $(LUFA_PATH)/Build/lufa_cppcheck.mk +include $(LUFA_PATH)/Build/lufa_doxygen.mk +include $(LUFA_PATH)/Build/lufa_dfu.mk +include $(LUFA_PATH)/Build/lufa_hid.mk +include $(LUFA_PATH)/Build/lufa_avrdude.mk +include $(LUFA_PATH)/Build/lufa_atprogram.mk + +.PHONY: all + +program: all + + 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 index 0000000..eeda2f4 --- /dev/null +++ b/firmware/rfm70.c @@ -0,0 +1,533 @@ +/* + Diese Library bassiert auf der Arduino RFM70 Library, ich habe sie lediglich so + angepasst, dass man sie auf einem AVR und ohne zusätzliche Libs von Arduino + verwenden kann. + + Es sind nur die wichtigstens Funktionen implementiert! + Bei Fragen oder Anregungen: + Mein Blog: http:://projects.web4clans.com + Meine Email: daniel.weber@web4clans.com + +*/ + +#include "rfm70.h" +/////////////////////////////////////////////////////////////////////////////// +// Register initialization values and command macros // +/////////////////////////////////////////////////////////////////////////////// + +//************ Address definition commands +const uint8_t PROGMEM RFM70_cmd_adrRX0[] = { (0x20|0x0A), 0x34,0x43,0x10,0x10,0x01}; +const uint8_t PROGMEM RFM70_cmd_adrTX[] = { (0x20|0x10), 0x34,0x43,0x10,0x10,0x01}; +const uint8_t PROGMEM RFM70_cmd_adrRX1[] = { (0x20|0x0B), 0x35,0x43,0x10,0x10,0x02}; + +//************ Bank0 register initialization commands + const uint8_t PROGMEM RFM70_bank0Init[][2] = { + // address data + { (0x20|0x00), 0x0F }, //Disable CRC ,CRC=1byte, POWER UP, TX + { (0x20|0x01), 0x3F }, //Enable auto acknowledgement data pipe0-5 + { (0x20|0x02), 0x3F }, //Enable RX Addresses pipe0-5 + { (0x20|0x03), 0x03 }, //RX/TX address field width 5byte + { (0x20|0x04), 0x08 }, //x = 250 ms = 4000ms, y = 15 tries + { (0x20|0x05), 0x17 }, //channel = 0x17 + { (0x20|0x06), 0x3F }, //air data rate-2M,out power 5dbm,setup LNA gain high (0dBM) + { (0x20|0x07), 0x07 }, // + { (0x20|0x08), 0x00 }, // + { (0x20|0x09), 0x00 }, // + { (0x20|0x0C), 0xc3 }, //LSB Addr pipe 2 + { (0x20|0x0D), 0xc4 }, //LSB Addr pipe 3 + { (0x20|0x0E), 0xc5 }, //LSB Addr pipe 4 + { (0x20|0x0F), 0xc6 }, //LSB Addr pipe 5 + { (0x20|0x11), 0x20 }, //Payload len pipe0 + { (0x20|0x12), 0x20 }, //Payload len pipe0 + { (0x20|0x13), 0x20 }, //Payload len pipe0 + { (0x20|0x14), 0x20 }, //Payload len pipe0 + { (0x20|0x15), 0x20 }, //Payload len pipe0 + { (0x20|0x16), 0x20 }, //Payload len pipe0 + { (0x20|0x17), 0x20 }, //Payload len pipe0 + { (0x20|0x1C), 0x3F }, //Enable dynamic payload legth data pipe0-5 + { (0x20|0x1D), 0x07 } //Enables Dynamic Payload Length,Enables Payload with ACK +}; + +//************ Bank1 register initialization commands + const uint8_t PROGMEM RFM70_bank1Init[][5] = { + // address data + { (0x20|0x00), 0x40, 0x4B, 0x01, 0xE2 }, + { (0x20|0x01), 0xC0, 0x4B, 0x00, 0x00 }, + { (0x20|0x02), 0xD0, 0xFC, 0x8C, 0x02 }, + { (0x20|0x03), 0x99, 0x00, 0x39, 0x41 }, + { (0x20|0x04), 0xb9, 0x9E, 0x86, 0x0B }, // b9? f9? + { (0x20|0x05), 0x24, 0x06, 0x7F, 0xA6 }, + { (0x20|0x06), 0x00, 0x00, 0x00, 0x00 }, + { (0x20|0x07), 0x00, 0x00, 0x00, 0x00 }, + { (0x20|0x08), 0x00, 0x00, 0x00, 0x00 }, + { (0x20|0x09), 0x00, 0x00, 0x00, 0x00 }, + { (0x20|0x0a), 0x00, 0x00, 0x00, 0x00 }, + { (0x20|0x0b), 0x00, 0x00, 0x00, 0x00 }, + { (0x20|0x0C), 0x00, 0x12, 0x73, 0x00 }, + { (0x20|0x0D), 0x36, 0xb4, 0x80, 0x00 } +}; + +//************ Bank1 register 14 initialization commands + const uint8_t PROGMEM RFM70_bank1R0EInit[] = { + // address Data... + (0x20|0x0E), 0x41,0x20,0x08,0x04,0x81,0x20,0xCF,0xF7,0xFE,0xFF,0xFF +}; + + +//************ other commands: { , , ... } +const uint8_t PROGMEM RFM70_cmd_switch_cfg[] = { 0x50, 0x53 }; // switch Register Bank +const uint8_t PROGMEM RFM70_cmd_flush_rx[] = { 0xe2, 0x00 }; // flush RX FIFO +const uint8_t PROGMEM RFM70_cmd_flush_tx[] = { 0xe1, 0x00 }; // flush TX FIFO +const uint8_t PROGMEM RFM70_cmd_activate[] = { 0x50, 0x73 }; // Activation command +const uint8_t PROGMEM RFM70_cmd_tog1[]={ (0x20|0x04), 0xd9 | 0x06, 0x9e, 0x86, 0x0b }; //assosciated with set1[4]! +const uint8_t PROGMEM RFM70_cmd_tog2[]={ (0x20|0x04), 0xd9 & ~0x06, 0x9e, 0x86, 0x0b}; //assosciated with set1[4]! + + + +void initSPI(uint8_t clk_div) +{ + // set the pin direction to output + DDR_SPI |= (1< 32 || nr > 5 || en_aa > 1) + return 0; + + // write address + if(nr<2) // full length for rx pipe 0 an 1 + writeRegCmdBuf(RFM70_CMD_WRITE_REG | (RFM70_REG_RX_ADDR_P0 + nr), adr, sizeof(adr)); + else // only LSB for pipes 2..5 + writeRegVal(RFM70_CMD_WRITE_REG | (RFM70_REG_RX_ADDR_P0 + nr), adr[0]); //ODO:check this + + // static + if (plLen) { + // set payload len + writeRegVal(RFM70_CMD_WRITE_REG | (RFM70_REG_RX_PW_P0 + nr), plLen); + // set EN_AA bit + tmp = readRegVal(RFM70_REG_EN_AA); + if (en_aa) + tmp |= 1 << nr; + else + tmp &= ~(1 << nr); + writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_EN_AA, tmp); + // clear DPL bit + tmp = readRegVal(RFM70_REG_DYNPD); + tmp &= ~(1 << nr); + writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_DYNPD, tmp); + // set Enable pipe bit + enableRxPipe(nr); + } + // dynamic + else + { + // set payload len to default + writeRegVal(RFM70_CMD_WRITE_REG | (RFM70_REG_RX_PW_P0 + nr), 0x20); + // set EN_AA bit + tmp = readRegVal(RFM70_REG_EN_AA); + tmp |= 1 << nr; + writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_EN_AA, tmp); + // set DPL bit + tmp = readRegVal(RFM70_REG_DYNPD); + tmp |= 1 << nr; + writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_DYNPD, tmp); + // set Enable pipe bit + enableRxPipe(nr); + } + return 1; +} + +void enableRxPipe(uint8_t pipe_nr) +{ + uint8_t nr = pipe_nr - 1; + if (nr > 5) return; + uint8_t tmp; + // set Enable pipe bit + tmp = readRegVal(RFM70_REG_EN_RXADDR); + tmp |= 1 << nr; + writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_EN_RXADDR, tmp); +} + +void disableRxPipe(uint8_t pipe_nr) +{ + uint8_t nr = pipe_nr - 1; + if (nr > 5) return; + uint8_t tmp; + // set Enable pipe bit + tmp = readRegVal(RFM70_REG_EN_RXADDR); + tmp &= ~(1 << nr); + writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_EN_RXADDR, tmp); + +} + +void configTxPipe(uint8_t * adr, uint8_t pltype) +{ + // write TX address + writeRegCmdBuf(RFM70_CMD_WRITE_REG | RFM70_REG_TX_ADDR, adr, sizeof(adr)); + // write RX0 address + writeRegCmdBuf(RFM70_CMD_WRITE_REG | RFM70_REG_RX_ADDR_P0, adr, sizeof(adr)); + // set static or dynamic payload + uint8_t tmp; + tmp = readRegVal(RFM70_REG_DYNPD); + if(pltype == TX_DPL) // dynamic + tmp |= 1; + else + tmp &= ~(1 << 0); + writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_DYNPD, tmp); +} + +uint8_t sendPayload(uint8_t * payload, uint8_t len, uint8_t toAck) // choose 0=nAck, 1=AckRequest +{ + + // check TX_FIFO + uint8_t status; + + status = readRegVal(RFM70_REG_FIFO_STATUS); + + if (status & RFM70_FIFO_STATUS_TX_FULL) + { + debug(RFM70_DEBUG_FIFO_FULL); + return 0; + } + + + // send payload + PORT_SPI &=~ (1< 3) return; + uint8_t tmp = readRegVal(RFM70_REG_RF_SETUP); + tmp &= 0xF9; + tmp |= pwr << 1; + writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_RF_SETUP, tmp); +} + + + + +void debug(uint8_t token) +{ + switch(token) + { + case 0x01: + //uart_puts("rfm error: the reseive chip id is invalid!\n"); + break; + + case 0x02: + //uart_puts("rfm error: the fifo is full!\n"); + break; + } +} + +void spiSetClockDivider(uint8_t rate) +{ + SPCR = (SPCR & ~SPI_CLOCK_MASK) | (rate & SPI_CLOCK_MASK); + SPSR = (SPSR & ~SPI_2XCLOCK_MASK) | ((rate >> 2) & SPI_2XCLOCK_MASK); +} + + diff --git a/firmware/rfm70.h b/firmware/rfm70.h new file mode 100644 index 0000000..5e76657 --- /dev/null +++ b/firmware/rfm70.h @@ -0,0 +1,172 @@ +/* + Diese Library bassiert auf der Arduino RFM70 Library, ich habe sie lediglich so + angepasst, dass man sie auf einem AVR und ohne zusätzliche Libs von Arduino + verwenden kann. + + Es sind nur die wichtigstens Funktionen implementiert! + Bei Fragen oder Anregungen: + Mein Blog: http:://projects.web4clans.com + Meine Email: daniel.weber@web4clans.com + +*/ + +#include +#include +#include +#include +#include + + +//************************RFM function parameter constants********************************// +#define WITH_ACK 0x01 // parameter for sendPayload(..): send with ack expectation +#define NO_ACK 0x00 // parameter for sendPayload(..): send without ack expectation +#define MODE_PTX 0x00 // parameter for setMode(mode): set to transmitter +#define MODE_PRX 0x01 // parameter for setMode(mode): set to receiver +#define EN_AA 0x01 // parameter for configRxPipe(..): enable pipe auto ack +#define NO_AA 0x00 // parameter for configRxPipe(..): disable pipe auto ack +#define TX_DPL 0x01 // parameter for configTxPipe(..): enable dynamic payload for PTX +#define TX_SPL 0x00 // parameter for configTxPipe(..): enable static payload for PTX +#define CRC0 0x00 // parameter for configCRC(crc): disable CRC +#define CRC1 0x01 // parameter for configCRC(crc): 1 byte CRC +#define CRC2 0x02 // parameter for configCRC(crc): 2 byte CRC +#define MBPS1 0x01 // parameter for configSpeed(speed): 1Mbps +#define MBPS2 0x02 // parameter for configSpeed(speed): 2Mbps +#define DBMM10 0x00 // parameter for confRfPwr(pwr): -10 dBm +#define DBMM5 0x01 // parameter for confRfPwr(pwr): -5 dBm +#define DBM0 0x02 // parameter for confRfPwr(pwr): 0 dBm +#define DBM5 0x03 // parameter for confRfPwr(pwr): +5 dBm +#define ADR_WIDTH3 0x03 // parameter for confAdrWidth(width): 3 byte +#define ADR_WIDTH4 0x03 // parameter for confAdrWidth(width): 4 byte +#define ADR_WIDTH5 0x03 // parameter for confAdrWidth(width): 5 byte +#define PWR_OFF 0x00 // parameter for setPower(pwr): off +#define PWR_ON 0x01 // parameter for setPower(pwr): on + + +//************************RFM Definitions************************************************// +#define RFM70_MAX_PACKET_LEN 32// max value is 32 +#define RFM70_BEGIN_INIT_WAIT_MS 3000 // pause before Init Registers +#define RFM70_END_INIT_WAIT_MS 100 // pause after init registers +#define RFM70_CS_DELAY 0 // wait ms after CS pin state change default 0 + +//************************RFM COMMAND and REGISTER****************************************// +// SPI(RFM70) commands +#define RFM70_CMD_READ_REG 0x00 // Define read command to register +#define RFM70_CMD_WRITE_REG 0x20 // Define write command to register +#define RFM70_CMD_RD_RX_PLOAD 0x61 // Define RX payload command +#define RFM70_CMD_WR_TX_PLOAD 0xA0 // Define TX payload command +#define RFM70_CMD_FLUSH_TX 0xE1 // Define flush TX register command +#define RFM70_CMD_FLUSH_RX 0xE2 // Define flush RX register command +#define RFM70_CMD_REUSE_TX_PL 0xE3 // Define reuse TX payload register command +#define RFM70_CMD_W_TX_PAYLOAD_NOACK 0xb0 // Define TX payload NOACK command +#define RFM70_CMD_W_ACK_PAYLOAD 0xa8 // Define Write ack command +#define RFM70_CMD_ACTIVATE 0x50 // Define feature activation command +#define RFM70_CMD_RX_PL_WID 0x60 // Define received payload width command +#define RFM70_CMD_NOP_NOP 0xFF // Define No Operation, might be used to read status register + +// SPI(RFM70) registers(addresses) +#define RFM70_REG_CONFIG 0x00 // 'Config' register address +#define RFM70_REG_EN_AA 0x01 // 'Enable Auto Acknowledgment' register address +#define RFM70_REG_EN_RXADDR 0x02 // 'Enabled RX addresses' register address +#define RFM70_REG_SETUP_AW 0x03 // 'Setup address width' register address +#define RFM70_REG_SETUP_RETR 0x04 // 'Setup Auto. Retrans' register address +#define RFM70_REG_RF_CH 0x05 // 'RF channel' register address +#define RFM70_REG_RF_SETUP 0x06 // 'RF setup' register address +#define RFM70_REG_STATUS 0x07 // 'Status' register address +#define RFM70_REG_OBSERVE_TX 0x08 // 'Observe TX' register address +#define RFM70_REG_CD 0x09 // 'Carrier Detect' register address +#define RFM70_REG_RX_ADDR_P0 0x0A // 'RX address pipe0' register address +#define RFM70_REG_RX_ADDR_P1 0x0B // 'RX address pipe1' register address +#define RFM70_REG_RX_ADDR_P2 0x0C // 'RX address pipe2' register address +#define RFM70_REG_RX_ADDR_P3 0x0D // 'RX address pipe3' register address +#define RFM70_REG_RX_ADDR_P4 0x0E // 'RX address pipe4' register address +#define RFM70_REG_RX_ADDR_P5 0x0F // 'RX address pipe5' register address +#define RFM70_REG_TX_ADDR 0x10 // 'TX address' register address +#define RFM70_REG_RX_PW_P0 0x11 // 'RX payload width, pipe0' register address +#define RFM70_REG_RX_PW_P1 0x12 // 'RX payload width, pipe1' register address +#define RFM70_REG_RX_PW_P2 0x13 // 'RX payload width, pipe2' register address +#define RFM70_REG_RX_PW_P3 0x14 // 'RX payload width, pipe3' register address +#define RFM70_REG_RX_PW_P4 0x15 // 'RX payload width, pipe4' register address +#define RFM70_REG_RX_PW_P5 0x16 // 'RX payload width, pipe5' register address +#define RFM70_REG_FIFO_STATUS 0x17 // 'FIFO Status Register' register address +#define RFM70_REG_DYNPD 0x1c // 'Enable dynamic payload length' register address +#define RFM70_REG_FEATURE 0x1d // 'Feature' register address + +//************************RFM Debug Tokens******************************************// +#define RFM70_DEBUG_WRONG_CHIP_ID 0x01 +#define RFM70_DEBUG_FIFO_FULL 0x02 + +//************************RFM SPI Constants****************************************// +#define RFM77_SPI_CLOCK_DIV4 0x00 +#define RFM77_SPI_CLOCK_DIV16 0x01 +//#define RFM77_SPI_CLOCK_DIV64 0x02 +#define RFM77_SPI_CLOCK_DIV128 0x03 +#define RFM77_SPI_CLOCK_DIV2 0x04 +#define RFM77_SPI_CLOCK_DIV8 0x05 +#define RFM77_SPI_CLOCK_DIV32 0x06 +#define RFM77_SPI_CLOCK_DIV64 0x07 +#define SPI_CLOCK_MASK 0x03 // SPR1 = bit 1, SPR0 = bit 0 on SPCR +#define SPI_2XCLOCK_MASK 0x01 // SPI2X = bit 0 on SPSR + +#define RFM77_DEFAULT_SPI_CLOCK_DIV RFM77_SPI_CLOCK_DIV2 + + +//interrupt status +#define RFM70_IRQ_STATUS_RX_DR 0x40 // Status bit RX_DR IRQ +#define RFM70_IRQ_STATUS_TX_DS 0x20 // Status bit TX_DS IRQ +#define RFM70_IRQ_STATUS_MAX_RT 0x10 // Status bit MAX_RT IRQ + +#define RFM70_IRQ_STATUS_TX_FULL 0x01 + + +#define RFM70_PIN_PRIM_RX 0x01 +#define RFM70_PIN_POWER 0x02 + +//FIFO_STATUS +#define RFM70_FIFO_STATUS_TX_REUSE 0x40 +#define RFM70_FIFO_STATUS_TX_FULL 0x20 +#define RFM70_FIFO_STATUS_TX_EMPTY 0x10 + +#define RFM70_FIFO_STATUS_RX_FULL 0x02 +#define RFM70_FIFO_STATUS_RX_EMPTY 0x01 + +// PIN SETUP + +#define DDR_SPI DDRB +#define PORT_SPI PORTB +#define CE PB4 +#define CSN PB0 +#define SCK PB1 +#define MISO PB3 +#define MOSI PB2 +#define IRQ PB5 + +void initSPI(uint8_t clk_div); +void initHardware(uint8_t irq); +void initRegisters(void); +uint8_t transmitSPI(uint8_t val); +uint8_t readRegVal(uint8_t cmd); +uint8_t writeRegVal(uint8_t cmd, uint8_t val); +uint8_t writeRegPgmBuf(uint8_t * cmdbuf, uint8_t len); +void readRegBuf(uint8_t reg, uint8_t * buf, uint8_t len); +void selectBank(uint8_t bank); +void setModeTX(void); +void setModeRX(void); +void setMode(uint8_t mode); +uint8_t getMode(void); +void setChannel(uint8_t cnum); +uint8_t getChannel(void); +uint8_t configRxPipe(uint8_t pipe_nr, uint8_t * adr, uint8_t plLen, uint8_t en_aa); +void enableRxPipe(uint8_t pipe_nr); +void debug(uint8_t token); +void setModeRX(void); +void spiSetClockDivider(uint8_t rate); +void setBegin(uint8_t irq, uint8_t clk_div); +void Begin(void); +uint8_t writeRegCmdBuf(uint8_t cmd, uint8_t * buf, uint8_t len); +void disableRxPipe(uint8_t pipe_nr); +void configTxPipe(uint8_t * adr, uint8_t pltype); +void flushTxFIFO(); +void flushRxFIFO(); +uint8_t receivePayload(uint8_t *payload); +uint8_t sendPayload(uint8_t * payload, uint8_t len, uint8_t toAck); +void configRfPower(uint8_t pwr); -- 2.43.0