diff --git a/Demos/Device/LowLevel/AudioInput/AudioInput.c b/Demos/Device/LowLevel/AudioInput/AudioInput.c index 7a5a0a6ea2..f62fcbec55 100644 --- a/Demos/Device/LowLevel/AudioInput/AudioInput.c +++ b/Demos/Device/LowLevel/AudioInput/AudioInput.c @@ -143,6 +143,15 @@ void EVENT_USB_Device_ControlRequest(void) } break; + case AUDIO_REQ_GetStatus: + /* Get Status request can be directed at either the interface or endpoint, neither is currently used + * according to the latest USB Audio 1.0 standard, but must be ACKed with no data when requested */ + if ((USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) || + (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))) + { + Endpoint_ClearSETUP(); + Endpoint_ClearStatusStage(); + } } } diff --git a/Demos/Device/LowLevel/AudioOutput/AudioOutput.c b/Demos/Device/LowLevel/AudioOutput/AudioOutput.c index 93ca370a8e..22cfac4d9f 100644 --- a/Demos/Device/LowLevel/AudioOutput/AudioOutput.c +++ b/Demos/Device/LowLevel/AudioOutput/AudioOutput.c @@ -169,6 +169,15 @@ void EVENT_USB_Device_ControlRequest(void) } break; + case AUDIO_REQ_GetStatus: + /* Get Status request can be directed at either the interface or endpoint, neither is currently used + * according to the latest USB Audio 1.0 standard, but must be ACKed with no data when requested */ + if ((USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) || + (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))) + { + Endpoint_ClearSETUP(); + Endpoint_ClearStatusStage(); + } } } diff --git a/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.c b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.c new file mode 100644 index 0000000000..7ac8f0015c --- /dev/null +++ b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.c @@ -0,0 +1,274 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Main source file for the AudioInputHost demo. This file contains the main tasks of + * the demo and is responsible for the initial application hardware configuration. + */ + +#include "AudioInputHost.h" + +/** Main program entry point. This routine configures the hardware required by the application, then + * enters a loop to run the application tasks in sequence. + */ +int main(void) +{ + SetupHardware(); + + puts_P(PSTR(ESC_FG_CYAN "Audio Host Demo running.\r\n" ESC_FG_WHITE)); + + LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); + sei(); + + for (;;) + { + Audio_Task(); + 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 */ + Serial_Init(9600, false); + LEDs_Init(); + USB_Init(); + + /* Create a stdio stream for the serial port for stdin and stdout */ + Serial_CreateStream(NULL); +} + +/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and + * starts the library USB task to begin the enumeration and USB management process. + */ +void EVENT_USB_Host_DeviceAttached(void) +{ + puts_P(PSTR(ESC_FG_GREEN "Device Attached.\r\n" ESC_FG_WHITE)); + LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); +} + +/** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and + * stops the library USB task management process. + */ +void EVENT_USB_Host_DeviceUnattached(void) +{ + puts_P(PSTR(ESC_FG_GREEN "Device Unattached.\r\n" ESC_FG_WHITE)); + LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); +} + +/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully + * enumerated by the host and is now ready to be used by the application. + */ +void EVENT_USB_Host_DeviceEnumerationComplete(void) +{ + LEDs_SetAllLEDs(LEDMASK_USB_READY); +} + +/** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */ +void EVENT_USB_Host_HostError(const uint8_t ErrorCode) +{ + USB_Disable(); + + printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n" + " -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode); + + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + for(;;); +} + +/** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while + * enumerating an attached USB device. + */ +void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode, + const uint8_t SubErrorCode) +{ + printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n" + " -- Error Code %d\r\n" + " -- Sub Error Code %d\r\n" + " -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState); + + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); +} + +void Audio_Task(void) +{ + uint8_t ErrorCode; + + switch (USB_HostState) + { + case HOST_STATE_Addressed: + puts_P(PSTR("Getting Config Data.\r\n")); + + /* Get and process the configuration descriptor data */ + if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead) + { + if (ErrorCode == ControlError) + puts_P(PSTR(ESC_FG_RED "Control Error (Get Configuration).\r\n")); + else + puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n")); + + printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode); + + /* Indicate error status */ + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + + /* Wait until USB device disconnected */ + USB_HostState = HOST_STATE_WaitForDeviceRemoval; + break; + } + + /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */ + if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful) + { + printf_P(PSTR(ESC_FG_RED "Control Error (Set Configuration).\r\n" + " -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode); + + /* Indicate error status */ + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + + /* Wait until USB device disconnected */ + USB_HostState = HOST_STATE_WaitForDeviceRemoval; + break; + } + + if ((ErrorCode = USB_Host_SetInterfaceAltSetting(StreamingInterfaceIndex, + StreamingInterfaceAltSetting)) != HOST_SENDCONTROL_Successful) + { + printf_P(PSTR(ESC_FG_RED "Could not set alternative streaming interface setting.\r\n" + " -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode); + + /* Indicate error status */ + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + + /* Wait until USB device disconnected */ + USB_HostState = HOST_STATE_WaitForDeviceRemoval; + break; + } + + USB_ControlRequest = (USB_Request_Header_t) + { + .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT), + .bRequest = AUDIO_REQ_SetCurrent, + .wValue = 0x0100, + .wIndex = StreamingEndpointAddress, + .wLength = sizeof(USB_Audio_SampleFreq_t), + }; + + USB_Audio_SampleFreq_t SampleRate = AUDIO_SAMPLE_FREQ(48000); + + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + + /* Set the sample rate on the streaming interface endpoint */ + if ((ErrorCode = USB_Host_SendControlRequest(&SampleRate)) != HOST_SENDCONTROL_Successful) + { + /* Indicate error status */ + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + + /* Wait until USB device disconnected */ + USB_HostState = HOST_STATE_WaitForDeviceRemoval; + break; + } + + /* Sample reload timer initialization */ + TIMSK0 = (1 << OCIE0A); + OCR0A = ((F_CPU / 8 / 8000) - 1); + TCCR0A = (1 << WGM01); // CTC mode + TCCR0B = (1 << CS01); // Fcpu/8 speed + + /* Set speaker as output */ + DDRC |= (1 << 6); + + /* PWM speaker timer initialization */ + TCCR3A = ((1 << WGM30) | (1 << COM3A1) | (1 << COM3A0) + | (1 << COM3B1) | (1 << COM3B0)); // Set on match, clear on TOP + TCCR3B = ((1 << WGM32) | (1 << CS30)); // Fast 8-Bit PWM, F_CPU speed + + puts_P(PSTR("Microphone Enumerated.\r\n")); + + USB_HostState = HOST_STATE_Configured; + break; + case HOST_STATE_Configured: + break; + } +} + +/** ISR to handle the reloading of the PWM timer with the next sample. */ +ISR(TIMER0_COMPA_vect, ISR_BLOCK) +{ + uint8_t PrevPipe = Pipe_GetCurrentPipe(); + + Pipe_SelectPipe(AUDIO_DATA_IN_PIPE); + Pipe_Unfreeze(); + + /* Check if the current pipe can be read from (contains a packet) and the device is sending data */ + if (Pipe_IsINReceived()) + { + /* Retrieve the signed 16-bit audio sample, convert to 8-bit */ + int8_t Sample_8Bit = (Pipe_Read_16_LE() >> 8); + + /* Check to see if the bank is now empty */ + if (!(Pipe_IsReadWriteAllowed())) + { + /* Acknowledge the packet, clear the bank ready for the next packet */ + Pipe_ClearIN(); + } + + /* Load the sample into the PWM timer channel */ + OCR3A = (Sample_8Bit ^ (1 << 7)); + + uint8_t LEDMask = LEDS_NO_LEDS; + + /* Turn on LEDs as the sample amplitude increases */ + if (Sample_8Bit > 16) + LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4); + else if (Sample_8Bit > 8) + LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3); + else if (Sample_8Bit > 4) + LEDMask = (LEDS_LED1 | LEDS_LED2); + else if (Sample_8Bit > 2) + LEDMask = (LEDS_LED1); + + LEDs_SetAllLEDs(LEDMask); + } + + Pipe_Freeze(); + + Pipe_SelectPipe(PrevPipe); +} diff --git a/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.eep b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.eep new file mode 100644 index 0000000000..1996e8fde5 --- /dev/null +++ b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.eep @@ -0,0 +1 @@ +:00000001FF diff --git a/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.elf b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.elf new file mode 100644 index 0000000000..a41d735eb1 Binary files /dev/null and b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.elf differ diff --git a/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.h b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.h new file mode 100644 index 0000000000..6a3b8502c5 --- /dev/null +++ b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.h @@ -0,0 +1,80 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for AudioHost.c. + */ + +#ifndef _AUDIO_HOST_H_ +#define _AUDIO_HOST_H_ + + /* Includes: */ + #include + #include + #include + #include + #include + #include + + #include + #include + #include + #include + #include + + #include "ConfigDescriptor.h" + + /* 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 Audio_Task(void); + void SetupHardware(void); + + void EVENT_USB_Host_HostError(const uint8_t ErrorCode); + void EVENT_USB_Host_DeviceAttached(void); + void EVENT_USB_Host_DeviceUnattached(void); + void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode, + const uint8_t SubErrorCode); + void EVENT_USB_Host_DeviceEnumerationComplete(void); + +#endif + diff --git a/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.hex b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.hex new file mode 100644 index 0000000000..2c962aabda --- /dev/null +++ b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.hex @@ -0,0 +1,403 @@ +:1000000051C100006DC100006BC1000069C100005A +:1000100067C1000065C1000063C1000061C100004C +:100020005FC100005DC10000D5C6000059C10000DD +:1000300057C1000055C1000053C1000051C100006C +:100040004FC100004DC100004BC1000049C100007C +:1000500047C100008BC2000043C1000041C1000045 +:100060003FC100003DC100003BC1000039C100009C +:1000700037C1000035C1000033C1000031C10000AC +:100080002FC100002DC100002BC1000029C10000BC +:1000900027C1000025C100004D6963726F70686F51 +:1000A0006E6520456E756D6572617465642E0D0A0E +:1000B000001B5B33316D436F756C64206E6F742071 +:1000C00073657420616C7465726E61746976652005 +:1000D00073747265616D696E6720696E74657266AE +:1000E0006163652073657474696E672E0D0A202D37 +:1000F0002D204572726F7220436F64653A2025642B +:100100000D0A1B5B33376D001B5B33316D436F6E24 +:1001100074726F6C204572726F7220285365742060 +:10012000436F6E66696775726174696F6E292E0D13 +:100130000A202D2D204572726F7220436F64653A3C +:100140002025640D0A1B5B33376D00202D2D2045C3 +:1001500072726F7220436F64653A2025640D0A1B2A +:100160005B33376D001B5B33316D496E76616C69B3 +:1001700064204465766963652E0D0A001B5B33318C +:100180006D436F6E74726F6C204572726F722028AF +:1001900047657420436F6E66696775726174696F35 +:1001A0006E292E0D0A0047657474696E6720436FCF +:1001B0006E66696720446174612E0D0A001B5B3313 +:1001C000316D44657620456E756D204572726F7293 +:1001D0000D0A202D2D204572726F7220436F6465C9 +:1001E0002025640D0A202D2D205375622045727242 +:1001F0006F7220436F64652025640D0A202D2D2029 +:10020000496E2053746174652025640D0A1B5B33AD +:10021000376D001B5B33316D486F7374204D6F6415 +:1002200065204572726F720D0A202D2D2045727265 +:100230006F7220436F64652025640D0A1B5B3337A2 +:100240006D001B5B33326D44657669636520556EC6 +:1002500061747461636865642E0D0A1B5B33376DCE +:10026000001B5B33326D44657669636520417474AD +:1002700061636865642E0D0A1B5B33376D001B5B81 +:1002800033366D417564696F20486F73742044651F +:100290006D6F2072756E6E696E672E0D0A1B5B3373 +:1002A000376D000011241FBECFEFD0E2DEBFCDBFFF +:1002B00011E0A0E0B1E0EAEFF8E100E00BBF02C01E +:1002C00007900D92AC31B107D9F711E0ACE1B1E084 +:1002D00001C01D92A034B107E1F73ED10C947B0C14 +:1002E0008FCE9BB19F70982B9BB9089584B7877F61 +:1002F00084BF28E10FB6F89420936000109260004C +:100300000FBE90E080E80FB6F89480936100909360 +:1003100061000FBE83E390E09093CD008093CC000A +:1003200086E08093CA001092C8002093C900539AB7 +:100330005A9A8AB1806F8AB98BB18F708BB934D5D4 +:10034000ECE2F1E0F0933B01E0933A01F0933D01E0 +:10035000E0933C018EE0DF011D928A95E9F783E08E +:1003600080932F0185E699E09093350180933401C5 +:100370008EE699E09093370180933601089581E6E7 +:1003800092E0DED780EAADCF82E492E0D9D780E177 +:10039000A8CF80E6A6CFDF93CF930F92CDB7DEB77D +:1003A00089839CD400D000D0EDB7FEB7319623E10D +:1003B00032E0ADB7BEB712963C932E931197898168 +:1003C000828313829ED70F900F900F900F9080E939 +:1003D00088DFFFCF90912B012DB73EB728503040DA +:1003E0000FB6F8943EBF0FBE2DBFEDB7FEB73196E6 +:1003F0002DEB31E0ADB7BEB712963C932E9311971B +:100400008283138264831582968317827AD72DB7ED +:100410003EB7285F3F4F0FB6F8943EBF0FBE2DBFCB +:1004200080E95FCF1F93DF93CF9300D00F92CDB7BA +:10043000DEB780912B018B3009F087C086EA91E00E +:100440007FD730D1182F8823E9F0813019F48CE759 +:1004500091E002C085E691E073D700D000D0EDB7FF +:10046000FEB731962BE431E0ADB7BEB712963C93A0 +:100470002E9311971283138244D70F900F900F90F1 +:100480000F904AC081E082D3882341F000D000D091 +:10049000EDB7FEB7319628E031E00EC080911C0127 +:1004A00060911D0189D3882379F000D000D0EDB789 +:1004B000FEB7319621EB30E0ADB7BEB712963C9354 +:1004C0002E9311978283D7CF20911E0182E28093D1 +:1004D000230181E08093240180E091E09093260144 +:1004E00080932501209327011092280183E090E05A +:1004F00090932A0180932901DE011196E0E0F1E05A +:1005000083E001900D928150E1F71092A700CE0197 +:100510000196B7D5882329F080E9E3DE10922B01FC +:1005200014C082E080936E009CE797BD84BD85BDBA +:100530003E9A81EF8093900089E08093910088E952 +:1005400090E0FED68CE080932B010F900F900F90DF +:10055000CF91DF911F910895C9DE8EE792E0F0D62A +:1005600080E1BFDE78945EDFA2D6FDCF1F920F92AE +:100570000FB60F920BB60F9211241F932F933F9338 +:100580004F935F936F937F938F939F93AF93BF939B +:10059000EF93FF931091A700177081E08093A7005D +:1005A0008091A9008F7B8093A9008091A60080FF95 +:1005B0002BC08091AF004091AF008091A60085FDD7 +:1005C00005C08091A6008E778093A600842F99277E +:1005D00087FD909520E830E082279327909399003B +:1005E00080939800413144F4493044F4453044F458 +:1005F000433044F480E007C080EF05C080EB03C0C7 +:1006000080E301C080E16DDE8091A9008064809369 +:10061000A9001093A700FF91EF91BF91AF919F9117 +:100620008F917F916F915F914F913F912F911F918A +:100630000F900BBE0F900FBE0F901F901895FC01EE +:100640008181843049F48581813031F48681813023 +:1006500019F48781882311F082E0089580E00895DD +:10066000FC018181843049F48581813031F48681B7 +:10067000823019F48781882311F082E0089580E0A8 +:100680000895FC018181853029F483818370813054 +:1006900019F404C0843021F082E0089580E00895C8 +:1006A00081E00895AF92BF92CF92DF92EF92FF92D6 +:1006B0000F931F93DF93CF93CDB7DEB7C450D240D3 +:1006C0000FB6F894DEBF0FBECDBFAE014B5F5F4FDC +:1006D0005A83498323E0E22EF12CEC0EFD1E81E0CB +:1006E000B70120E032E009D4853009F45CC08630DF +:1006F00061F0882361F400E010E0CC24DD24570190 +:100700007E010894E11CF11C07C083E04FC081E02A +:100710004DC09C01032F182FC114D10441F0C50115 +:10072000B70141E453E040D4882351F41CC0C50113 +:10073000B7014FE153E038D48823B9F5C980DA8096 +:10074000C501B70140E353E02FD4882349F0C50128 +:10075000B7014FE153E028D4882339F5C980DA8006 +:1007600009811A8135C0E981FA81828187FF30C011 +:10077000902F812F309769F2D80112968C911297A1 +:1007800080931C0113968C9180931D0122812093EC +:100790001E010481158181E061E040E194E0E92ED1 +:1007A00022D280E003C082E001C084E0CC5FDD4F54 +:1007B0000FB6F894DEBF0FBECDBFCF91DF911F9172 +:1007C0000F91FF90EF90DF90CF90BF90AF90089582 +:1007D000902F812F9ECF80919E0090E0817090702D +:1007E0002091A0002D7F2093A00020919E002260E8 +:1007F00020939E0020919E0021FDFCCF20919E0021 +:10080000216020939E002091A00030E02072307083 +:100810004091A0004F7D4093A00040919F004F7DEC +:1008200040939F004AE050919F0055FF0BC04091BC +:100830009F004F7D40939F0040919F004D7F4093CC +:100840009F0008C0EFECF7E03197F1F700C000001F +:10085000415049F72115310529F02091A00020626F +:100860002093A000009729F480919E008E7F8093B2 +:100870009E008091A00082608093A0000895409126 +:100880009E0050E0417050702091A00030E0207236 +:1008900030709091A0009F7D9093A00090919F0058 +:1008A0009F7D90939F0090919E00916090939E00F9 +:1008B00026C090919F0095FF06C090919F009F7D5C +:1008C00090939F00815090912B019230D9F090919C +:1008D000A60094FF09C01092F5008091A6008F7EBB +:1008E0008093A60082E00FC09091A60091FF07C000 +:1008F0008091A6008D7F8093A60083E004C08823AA +:10090000C1F601C081E04115510529F490919E0086 +:100910009E7F90939E002115310529F09091A000B3 +:1009200090629093A0000895EF920F931F93DF932E +:10093000CF93CDB7DEB728970FB6F894DEBF0FBEC2 +:10094000CDBF80912B01863009F499C0873070F4B7 +:100950008330C9F1843020F4813009F00BC113C019 +:100960008430C9F1853009F005C160C0883009F4D0 +:10097000A0C0883008F48FC0893009F4B9C08A302B +:1009800009F0F8C0DEC0009120011091210101158D +:10099000110509F4EFC081E072DF682F882331F080 +:1009A00080911F0180932B0181E0E0C00150104035 +:1009B00010932101009320010115110509F0DAC0FF +:1009C00080911F01C3C088EE93E090932101809332 +:1009D000200184E0BBC080912001909121019C0105 +:1009E000215030403093210120932001009739F0AD +:1009F0008FEC97E00197F1F700C00000BBC077983B +:100A00008091D80080618093D8008091DD008B7F39 +:100A10008093DD008091D70080618093D700809122 +:100A2000DD0082608093DD0085E090C080919F00B2 +:100A300080FFA0C080919F008E7F80939F00809157 +:100A40009F008D7F80939F008091DF008D7F80933A +:100A5000DF008091DE0082608093DE0080919E0046 +:100A6000816080939E0026D181E080932B0184E6F3 +:100A700090E0909321018093200186E05FC0ABDE7F +:100A800081E080932B0188EC90E09093210180938A +:100A9000200187E053C080E060E040E020E000E417 +:100AA00010E0EE24A0D08091AC0087FF5BC088E00E +:100AB0004DC0A3E2B1E0E3E1F1E088E001900D92E6 +:100AC0008150E1F7CE010196DCD2682F882309F02E +:100AD0004CC0888580931B017EDE81E080932B01D2 +:100AE00088EC90E0909321018093200189E026C05A +:100AF00000911B0180E060E040E020E010E0EE2487 +:100B000072D08091AC0087FF2DC0A3E2B1E0EBE092 +:100B1000F1E088E001900D928150E1F780E090E0F3 +:100B2000B0D2682F882309F581E080932B0184E6F9 +:100B300090E090932101809320018AE080931F012F +:100B400019C081E08093A10024DC8BE080932B010D +:100B500011C040DC8091DD0081608093DD0014DCF9 +:100B6000D5D008C060E084E001C083E090912B0103 +:100B7000923079F728960FB6F894DEBF0FBECDBF3E +:100B8000CF91DF911F910F91EF9008951092230163 +:100B900099E09093240180932501109226011092F0 +:100BA00028011092270110922A0110922901109217 +:100BB000A70080E090E065C2E3E2F1E091E090936D +:100BC00023019BE09093240160932501138280937D +:100BD0002701158210922A01109229011092A70074 +:100BE00080E090E04EC2EF920F931F935E2D6295CE +:100BF000660F660F607C642B2F70622B982F5260FB +:100C00004DC09093A7009817B1F428E030E040E081 +:100C100003C04F5F220F331F2017310710F44530F8 +:100C2000C1F7242F2295207F252BA62F40E070E0CE +:100C3000E1E2F0E00CC0A091AA002091AB00F0919D +:100C4000AD00E091A9007091A5004091AE003091F7 +:100C5000A90030623093A90021FF1FC03091A90084 +:100C60003E7F3093A9003091AB0032703093AB00DF +:100C70003091A90031603093A900A093AA0020937D +:100C8000AB00F093AD00E093A9007093A5004093F2 +:100C9000AE002091AC0027FF08C09F5F973008F49A +:100CA000B0CF8093A70081E001C080E01F910F9139 +:100CB000EF9008951092F80080E08093A7001092C2 +:100CC000AE001092A6001092AB009091A9009E7FFA +:100CD0009093A9008F5F873081F708956ED075D00B +:100CE000E0EEF0E0808181608083E8EDF0E08081DB +:100CF0008F77808319BCA7EDB0E08C918E7F8C93A9 +:100D000080818F7E808310922201089556D05DD01D +:100D10008091D800982F9F779093D8008068809317 +:100D2000D8008091D8008F7D8093D8008091D70023 +:100D30008F778093D7008CE089BD89B5826089BDAB +:100D400009B400FEFDCF82E080932B0180E4809304 +:100D50001B018091D80080648093D8008091DD00D1 +:100D600081608093DD008091DD0084608093DD00F0 +:100D70008091D7008F7E8093D7006F9A779A809169 +:100D8000DE0081608093DE008091DE0084608093CD +:100D9000DE008091E0008E7F8093E0008091D8009B +:100DA00080618093D8000895E7EDF0E08081816054 +:100DB000808381E080932201A9CFE8EDF0E080817B +:100DC0008C7F80831092A00008951092DA00109218 +:100DD0009F0008951F920F920FB60F920BB60F92BD +:100DE00011242F933F934F935F936F937F938F9330 +:100DF0009F93AF93BF93EF93FF9380919F0085FFE5 +:100E00000AC08091A00085FF06C080919F008F7D61 +:100E100080939F000CD180919F0081FF15C080912D +:100E2000A00081FF11C080919F008D7F80939F0063 +:100E300080919F008E7F80939F008091A0008D7F86 +:100E40008093A000A1DA62DF8091DF0081FF15C0EE +:100E50008091DE0081FF11C08091DF008D7F809343 +:100E6000DF0077988091DD0081608093DD0080E075 +:100E700092DA8ADA82E080932B018091DF0080FF92 +:100E800017C08091DE0080FF13C08091DF008E7F4D +:100E90008093DF008091DE008E7F8093DE006FDA2A +:100EA0008091A00082608093A00083E080932B015A +:100EB0008091DF0082FF0EC08091DE0082FF0AC0B9 +:100EC0008091DF008B7F8093DF0082E060E082DA38 +:100ED0005BDA1CDFFF91EF91BF91AF919F918F91F2 +:100EE0007F916F915F914F913F912F910F900BBE2A +:100EF0000F900FBE0F901F901895CF92DF92EF9238 +:100F0000FF920F931F93DF93CF93CDB7DEB729974F +:100F10000FB6F894DEBF0FBECDBF6B018A01790119 +:100F200090E89093230196E09093240190E001973C +:100F300092609093260180932501109228011092CF +:100F4000270189E090E090932A0180932901109273 +:100F5000A700CE01019695D08823B9F48B819C819E +:100F6000F60191838083E816F90670F090932A01C8 +:100F700080932901C80185D0882339F4F801918133 +:100F8000923019F086E001C085E029960FB6F894FA +:100F9000DEBF0FBECDBFCF91DF911F910F91FF90AC +:100FA000EF90DF90CF900895AF92BF92CF92DF92F3 +:100FB000EF92FF920F931F93CF93DF938C01EB017E +:100FC0006A0123C0E881F9815F01208130E0C70117 +:100FD0002E153F0508F4C901E80FF91FF983E883CE +:100FE000F80120813181281B390B318320838881CE +:100FF0009981F6010995823041F0813069F4A88227 +:10100000B982F801F182E08207C0F801E080F18046 +:10101000E114F104B9F682E0DF91CF911F910F91B5 +:10102000FF90EF90DF90CF90BF90AF90089508951C +:101030001F93CF93DF93182FC8EED3E007C081E052 +:101040001EDC8823D1F42097B9F02197112329F4CD +:101050008091A60083FFF3CF0DC0113029F4809159 +:10106000A60080FFECCF06C0123049F78091A600A1 +:1010700082FFE5CF80E001C084E0DF91CF911F9136 +:101080000895EF92FF920F931F93CF93DF938C01FC +:10109000E0909E00FF2481E0E822FF24C091290116 +:1010A000D0912A0180919E00816080939E0081E012 +:1010B000E6DB882309F0E2C08091AA008F7C809350 +:1010C000AA001092F5008091A6008F7E8093A60062 +:1010D0008091A9008F7B8093A90080912301809348 +:1010E000AF00809124018093AF0090912501809101 +:1010F00026019093AF008093AF00909127018091DB +:1011000028019093AF008093AF00909129018091C6 +:101110002A019093AF008093AF008091A60087775B +:101120008093A60080E084DF882309F0A7C0809127 +:10113000A90080648093A90081E0A1DB882309F0E5 +:101140009DC08091230187FF4FC08091AA008F7CB2 +:1011500080618093AA000115110561F52DC0809171 +:10116000A9008F7B8093A90081E062DF882309F0CA +:1011700085C08091F6009091F700009749F4C0E097 +:10118000D0E006C08091AF00F80181938F012197D4 +:101190008091F6009091F700009711F0209791F759 +:1011A0008091A90080648093A9008091A6008E7729 +:1011B0008093A600209799F68091AA008F7C806288 +:1011C0008093AA008091A9008F7B8093A90082E080 +:1011D0002FDF882309F052C08091A6008B7780937F +:1011E000A60082E025DF4AC00115110599F1809122 +:1011F000AA008F7C80628093AA008091A9008F7BD7 +:101200008093A9001CC082E013DF8823B9F5F801A0 +:1012100006C081918F018093AF00219759F08F0113 +:101220002091F6003091F70080911B0190E0281783 +:10123000390778F38091A6008B778093A6002097DA +:1012400011F782E0F5DE8823C9F48091A90080645B +:101250008093A9008091AA008F7C80618093AA006E +:101260008091A9008F7B8093A90081E0E1DE882333 +:1012700029F49091A6009E779093A6009091A900E2 +:1012800090649093A900E114F10429F490919E00D8 +:101290009E7F90939E0091E09093A8001092A800EA +:1012A000DF91CF911F910F91FF90EF9008951F93C1 +:1012B000CF93DF93C7EAD0E018811770188234DB30 +:1012C0001883DF91CF911F9108959091C80095FFE9 +:1012D000FCCF8093CE0080E090E008958091C8001C +:1012E00087FF08C08091C80087FF07C02091CE000B +:1012F00030E005C02EEF3FEF02C02FEF3FEFC901F6 +:101300000895DF93CF93CDB7DEB7FE013596619197 +:10131000719180913C0190913D01DC0113962C91DB +:101320001397286013962C93AF0142D0E0913C01B3 +:10133000F0913D012381277F2383CF91DF91089591 +:10134000EF92FF920F931F93CF93DF938C01E09165 +:101350003C01F0913D01838181FF20C0C0E0D0E0DD +:101360000CC0DB011896ED91FC9119970995009737 +:1013700011F0CFEFDFEF0F5F1F4FF8018491609105 +:101380003C0170913D01882361F7DB011896ED91D6 +:10139000FC9119978AE00995009711F0CFEFDFEFE4 +:1013A000CE01DF91CF911F910F91FF90EF900895A3 +:1013B0002F923F924F925F926F927F928F929F9265 +:1013C000AF92BF92CF92DF92EF92FF920F931F9353 +:1013D000DF93CF93CDB7DEB72C970FB6F894DEBF6F +:1013E0000FBECDBF6C011B018A01FC011782168262 +:1013F000838181FFC4C12E010894411C511CF60158 +:101400009381F10193FD859193FF81911F018823C1 +:1014100009F4B1C1853239F493FD859193FF81912F +:101420001F01853221F490E0B601DBD1E8CFEE2434 +:10143000FF2420E02032B0F48B3269F08C3228F4A3 +:10144000803251F0833271F40BC08D3239F0803329 +:1014500049F421602CC02260246029C0286027C084 +:10146000206125C027FD2CC0382F30533A3098F426 +:1014700026FF08C08E2D880FE82EEE0CEE0CE80E2D +:10148000E30E15C08F2D880FF82EFF0CFF0CF80E01 +:10149000F30E20620CC08E3221F426FD6CC1206454 +:1014A00006C08C3611F4206802C0883649F4F10178 +:1014B00093FD859193FF81911F01882309F0BACF95 +:1014C000982F9554933018F09052933028F40C5F75 +:1014D0001F4FFFE3F9830DC0833631F0833771F07E +:1014E000833509F05CC021C0F801808189830E5FDB +:1014F0001F4F420171E0A72EB12C15C062E0662E8D +:10150000712C600E711EF8018080918026FF03C04F +:101510006E2D70E002C06FEF7FEFC4012C8756D1B3 +:101520005C0183012C852F7716C052E0652E712C4B +:10153000600E711EF8018080918026FF03C06E2D21 +:1015400070E002C06FEF7FEFC4012C8734D15C01E3 +:101550002C852068830123FD1EC007C080E290E037 +:10156000B6012C873ED1FA942C858F2D90E0A816D9 +:10157000B906A0F310C0F40127FD859127FF8191E2 +:101580004F0190E0B6012C872CD12C85F110FA94F4 +:101590000894A108B108A114B10469F7E9C0843620 +:1015A00011F0893641F527FF08C0F801608171818B +:1015B000828193810C5F1F4F09C0F80160817181A6 +:1015C000882777FD8095982F0E5F1F4F4FE6B42E2A +:1015D000B22297FF09C090958095709561957F4FD5 +:1015E0008F4F9F4FF0E8BF2AA2012AE030E025D1BB +:1015F000782E741844C0853731F43FEEB32EB222F2 +:101600002AE030E025C099EFB92EB2228F36C1F022 +:10161000803720F4883509F0AEC00DC0803721F046 +:10162000883709F0A8C002C020E1B22AB4FE0BC07E +:1016300084E0B82A08C0B4FE09C0E6E0BE2A06C0AD +:1016400028E030E005C020E130E002C020E132E0D7 +:10165000B7FE08C0F80160817181828193810C5FBF +:101660001F4F07C0F8016081718180E090E00E5F3C +:101670001F4FA201E2D0782E7418FFE7BF22B6FEFA +:101680000BC02EEFB2227E1438F4B4FE07C0B2FCB9 +:1016900005C08FEEB82202C0A72C01C0AE2C8B2D46 +:1016A00090E0B4FE0DC0FE01E70DF11D2081203356 +:1016B00019F4E9EEBE2209C0A394B2FE06C004C02C +:1016C00086789070009709F0A3948B2C9924B3FC32 +:1016D00013C0B0FE0EC0AF1428F4E72CEF0CEA18CC +:1016E000AF2C07C0E72C05C080E290E0B60179D0AE +:1016F000A394AF14C8F304C0AF1410F4FA1801C0D7 +:10170000FF2484FE0EC080E390E0B6016AD082FE22 +:101710001DC081FE03C088E590E010C088E790E01E +:101720000DC0C40186789070009781F081FC02C0E2 +:1017300080E201C08BE2B7FC8DE290E0B60151D0AF +:1017400005C080E390E0B6014CD0EA947E14C8F363 +:101750007A94F201E70DF11D808190E0B60141D04D +:101760007720B1F705C080E290E0B6013AD0FA9454 +:10177000FF20C9F744CEF6012681378102C02FEF42 +:101780003FEFC9012C960FB6F894DEBF0FBECDBF58 +:10179000CF91DF911F910F91FF90EF90DF90CF904D +:1017A000BF90AF909F908F907F906F905F904F9081 +:1017B0003F902F900895FC010590615070400110FA +:1017C000D8F7809590958E0F9F1F0895FC0161506A +:1017D000704001900110D8F7809590958E0F9F1F53 +:1017E00008950F931F93CF93DF938C01EB018B81AF +:1017F00081FF1BC082FF0DC02E813F818C819D81A6 +:101800002817390764F4E881F9810193F983E883A3 +:1018100006C0E885F985802F0995009731F48E81FF +:101820009F8101969F838E8302C00FEF1FEFC80137 +:10183000DF91CF911F910F910895FA01AA272830C7 +:1018400051F1203181F1E8946F936E7F6E5F7F4F8D +:101850008F4F9F4FAF4FB1E03ED0B4E03CD0670F09 +:10186000781F891F9A1FA11D680F791F8A1F911D5C +:10187000A11D6A0F711D811D911DA11D20D009F4AC +:1018800068943F912AE0269F11243019305D3193EE +:10189000DEF6CF010895462F4770405D4193B3E0D7 +:1018A0000FD0C9F7F6CF462F4F70405D4A3318F07E +:1018B000495D31FD4052419302D0A9F7EACFB4E02F +:1018C000A6959795879577956795BA95C9F70097E7 +:1018D0006105710508959B01AC010A2E0694579588 +:1018E000479537952795BA95C9F7620F731F841FDF +:0A18F000951FA01D0895F894FFCF86 +:1018FA0080BB008006000100001200000501000004 +:0C190A0000000080060001000008004002 +:00000001FF diff --git a/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.lss b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.lss new file mode 100644 index 0000000000..1529174033 --- /dev/null +++ b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.lss @@ -0,0 +1,5024 @@ + +AudioInputHost.elf: file format elf32-avr + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .data 0000001c 00800100 000018fa 0000198e 2**0 + CONTENTS, ALLOC, LOAD, DATA + 1 .text 000018fa 00000000 00000000 00000094 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 2 .bss 00000024 0080011c 0080011c 000019aa 2**0 + ALLOC + 3 .stab 00000e28 00000000 00000000 000019ac 2**2 + CONTENTS, READONLY, DEBUGGING + 4 .stabstr 0000026b 00000000 00000000 000027d4 2**0 + CONTENTS, READONLY, DEBUGGING + 5 .debug_aranges 000003b0 00000000 00000000 00002a3f 2**0 + CONTENTS, READONLY, DEBUGGING + 6 .debug_pubnames 0000089a 00000000 00000000 00002def 2**0 + CONTENTS, READONLY, DEBUGGING + 7 .debug_info 000056c7 00000000 00000000 00003689 2**0 + CONTENTS, READONLY, DEBUGGING + 8 .debug_abbrev 00001b65 00000000 00000000 00008d50 2**0 + CONTENTS, READONLY, DEBUGGING + 9 .debug_line 000053bf 00000000 00000000 0000a8b5 2**0 + CONTENTS, READONLY, DEBUGGING + 10 .debug_frame 00000540 00000000 00000000 0000fc74 2**2 + CONTENTS, READONLY, DEBUGGING + 11 .debug_str 000026bf 00000000 00000000 000101b4 2**0 + CONTENTS, READONLY, DEBUGGING + 12 .debug_loc 00003422 00000000 00000000 00012873 2**0 + CONTENTS, READONLY, DEBUGGING + 13 .debug_pubtypes 00000a86 00000000 00000000 00015c95 2**0 + CONTENTS, READONLY, DEBUGGING + 14 .debug_ranges 00000490 00000000 00000000 0001671b 2**0 + CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +00000000 <__vectors>: + 0: 51 c1 rjmp .+674 ; 0x2a4 <__ctors_end> + 2: 00 00 nop + 4: 6d c1 rjmp .+730 ; 0x2e0 <__bad_interrupt> + 6: 00 00 nop + 8: 6b c1 rjmp .+726 ; 0x2e0 <__bad_interrupt> + a: 00 00 nop + c: 69 c1 rjmp .+722 ; 0x2e0 <__bad_interrupt> + e: 00 00 nop + 10: 67 c1 rjmp .+718 ; 0x2e0 <__bad_interrupt> + 12: 00 00 nop + 14: 65 c1 rjmp .+714 ; 0x2e0 <__bad_interrupt> + 16: 00 00 nop + 18: 63 c1 rjmp .+710 ; 0x2e0 <__bad_interrupt> + 1a: 00 00 nop + 1c: 61 c1 rjmp .+706 ; 0x2e0 <__bad_interrupt> + 1e: 00 00 nop + 20: 5f c1 rjmp .+702 ; 0x2e0 <__bad_interrupt> + 22: 00 00 nop + 24: 5d c1 rjmp .+698 ; 0x2e0 <__bad_interrupt> + 26: 00 00 nop + 28: d5 c6 rjmp .+3498 ; 0xdd4 <__vector_10> + 2a: 00 00 nop + 2c: 59 c1 rjmp .+690 ; 0x2e0 <__bad_interrupt> + 2e: 00 00 nop + 30: 57 c1 rjmp .+686 ; 0x2e0 <__bad_interrupt> + 32: 00 00 nop + 34: 55 c1 rjmp .+682 ; 0x2e0 <__bad_interrupt> + 36: 00 00 nop + 38: 53 c1 rjmp .+678 ; 0x2e0 <__bad_interrupt> + 3a: 00 00 nop + 3c: 51 c1 rjmp .+674 ; 0x2e0 <__bad_interrupt> + 3e: 00 00 nop + 40: 4f c1 rjmp .+670 ; 0x2e0 <__bad_interrupt> + 42: 00 00 nop + 44: 4d c1 rjmp .+666 ; 0x2e0 <__bad_interrupt> + 46: 00 00 nop + 48: 4b c1 rjmp .+662 ; 0x2e0 <__bad_interrupt> + 4a: 00 00 nop + 4c: 49 c1 rjmp .+658 ; 0x2e0 <__bad_interrupt> + 4e: 00 00 nop + 50: 47 c1 rjmp .+654 ; 0x2e0 <__bad_interrupt> + 52: 00 00 nop + 54: 8b c2 rjmp .+1302 ; 0x56c <__vector_21> + 56: 00 00 nop + 58: 43 c1 rjmp .+646 ; 0x2e0 <__bad_interrupt> + 5a: 00 00 nop + 5c: 41 c1 rjmp .+642 ; 0x2e0 <__bad_interrupt> + 5e: 00 00 nop + 60: 3f c1 rjmp .+638 ; 0x2e0 <__bad_interrupt> + 62: 00 00 nop + 64: 3d c1 rjmp .+634 ; 0x2e0 <__bad_interrupt> + 66: 00 00 nop + 68: 3b c1 rjmp .+630 ; 0x2e0 <__bad_interrupt> + 6a: 00 00 nop + 6c: 39 c1 rjmp .+626 ; 0x2e0 <__bad_interrupt> + 6e: 00 00 nop + 70: 37 c1 rjmp .+622 ; 0x2e0 <__bad_interrupt> + 72: 00 00 nop + 74: 35 c1 rjmp .+618 ; 0x2e0 <__bad_interrupt> + 76: 00 00 nop + 78: 33 c1 rjmp .+614 ; 0x2e0 <__bad_interrupt> + 7a: 00 00 nop + 7c: 31 c1 rjmp .+610 ; 0x2e0 <__bad_interrupt> + 7e: 00 00 nop + 80: 2f c1 rjmp .+606 ; 0x2e0 <__bad_interrupt> + 82: 00 00 nop + 84: 2d c1 rjmp .+602 ; 0x2e0 <__bad_interrupt> + 86: 00 00 nop + 88: 2b c1 rjmp .+598 ; 0x2e0 <__bad_interrupt> + 8a: 00 00 nop + 8c: 29 c1 rjmp .+594 ; 0x2e0 <__bad_interrupt> + 8e: 00 00 nop + 90: 27 c1 rjmp .+590 ; 0x2e0 <__bad_interrupt> + 92: 00 00 nop + 94: 25 c1 rjmp .+586 ; 0x2e0 <__bad_interrupt> + 96: 00 00 nop + +00000098 <__c.3939>: + 98: 4d 69 63 72 6f 70 68 6f 6e 65 20 45 6e 75 6d 65 Microphone Enume + a8: 72 61 74 65 64 2e 0d 0a 00 rated.... + +000000b1 <__c.3935>: + b1: 1b 5b 33 31 6d 43 6f 75 6c 64 20 6e 6f 74 20 73 .[31mCould not s + c1: 65 74 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 et alternative s + d1: 74 72 65 61 6d 69 6e 67 20 69 6e 74 65 72 66 61 treaming interfa + e1: 63 65 20 73 65 74 74 69 6e 67 2e 0d 0a 20 2d 2d ce setting... -- + f1: 20 45 72 72 6f 72 20 43 6f 64 65 3a 20 25 64 0d Error Code: %d. + 101: 0a 1b 5b 33 37 6d 00 ..[37m. + +00000108 <__c.3933>: + 108: 1b 5b 33 31 6d 43 6f 6e 74 72 6f 6c 20 45 72 72 .[31mControl Err + 118: 6f 72 20 28 53 65 74 20 43 6f 6e 66 69 67 75 72 or (Set Configur + 128: 61 74 69 6f 6e 29 2e 0d 0a 20 2d 2d 20 45 72 72 ation)... -- Err + 138: 6f 72 20 43 6f 64 65 3a 20 25 64 0d 0a 1b 5b 33 or Code: %d...[3 + 148: 37 6d 00 7m. + +0000014b <__c.3930>: + 14b: 20 2d 2d 20 45 72 72 6f 72 20 43 6f 64 65 3a 20 -- Error Code: + 15b: 25 64 0d 0a 1b 5b 33 37 6d 00 %d...[37m. + +00000165 <__c.3928>: + 165: 1b 5b 33 31 6d 49 6e 76 61 6c 69 64 20 44 65 76 .[31mInvalid Dev + 175: 69 63 65 2e 0d 0a 00 ice.... + +0000017c <__c.3926>: + 17c: 1b 5b 33 31 6d 43 6f 6e 74 72 6f 6c 20 45 72 72 .[31mControl Err + 18c: 6f 72 20 28 47 65 74 20 43 6f 6e 66 69 67 75 72 or (Get Configur + 19c: 61 74 69 6f 6e 29 2e 0d 0a 00 ation).... + +000001a6 <__c.3924>: + 1a6: 47 65 74 74 69 6e 67 20 43 6f 6e 66 69 67 20 44 Getting Config D + 1b6: 61 74 61 2e 0d 0a 00 ata.... + +000001bd <__c.3917>: + 1bd: 1b 5b 33 31 6d 44 65 76 20 45 6e 75 6d 20 45 72 .[31mDev Enum Er + 1cd: 72 6f 72 0d 0a 20 2d 2d 20 45 72 72 6f 72 20 43 ror.. -- Error C + 1dd: 6f 64 65 20 25 64 0d 0a 20 2d 2d 20 53 75 62 20 ode %d.. -- Sub + 1ed: 45 72 72 6f 72 20 43 6f 64 65 20 25 64 0d 0a 20 Error Code %d.. + 1fd: 2d 2d 20 49 6e 20 53 74 61 74 65 20 25 64 0d 0a -- In State %d.. + 20d: 1b 5b 33 37 6d 00 .[37m. + +00000213 <__c.3910>: + 213: 1b 5b 33 31 6d 48 6f 73 74 20 4d 6f 64 65 20 45 .[31mHost Mode E + 223: 72 72 6f 72 0d 0a 20 2d 2d 20 45 72 72 6f 72 20 rror.. -- Error + 233: 43 6f 64 65 20 25 64 0d 0a 1b 5b 33 37 6d 00 Code %d...[37m. + +00000242 <__c.3902>: + 242: 1b 5b 33 32 6d 44 65 76 69 63 65 20 55 6e 61 74 .[32mDevice Unat + 252: 74 61 63 68 65 64 2e 0d 0a 1b 5b 33 37 6d 00 tached....[37m. + +00000261 <__c.3897>: + 261: 1b 5b 33 32 6d 44 65 76 69 63 65 20 41 74 74 61 .[32mDevice Atta + 271: 63 68 65 64 2e 0d 0a 1b 5b 33 37 6d 00 ched....[37m. + +0000027e <__c.3888>: + 27e: 1b 5b 33 36 6d 41 75 64 69 6f 20 48 6f 73 74 20 .[36mAudio Host + 28e: 44 65 6d 6f 20 72 75 6e 6e 69 6e 67 2e 0d 0a 1b Demo running.... + 29e: 5b 33 37 6d 00 00 [37m.. + +000002a4 <__ctors_end>: + 2a4: 11 24 eor r1, r1 + 2a6: 1f be out 0x3f, r1 ; 63 + 2a8: cf ef ldi r28, 0xFF ; 255 + 2aa: d0 e2 ldi r29, 0x20 ; 32 + 2ac: de bf out 0x3e, r29 ; 62 + 2ae: cd bf out 0x3d, r28 ; 61 + +000002b0 <__do_copy_data>: + 2b0: 11 e0 ldi r17, 0x01 ; 1 + 2b2: a0 e0 ldi r26, 0x00 ; 0 + 2b4: b1 e0 ldi r27, 0x01 ; 1 + 2b6: ea ef ldi r30, 0xFA ; 250 + 2b8: f8 e1 ldi r31, 0x18 ; 24 + 2ba: 00 e0 ldi r16, 0x00 ; 0 + 2bc: 0b bf out 0x3b, r16 ; 59 + 2be: 02 c0 rjmp .+4 ; 0x2c4 <__do_copy_data+0x14> + 2c0: 07 90 elpm r0, Z+ + 2c2: 0d 92 st X+, r0 + 2c4: ac 31 cpi r26, 0x1C ; 28 + 2c6: b1 07 cpc r27, r17 + 2c8: d9 f7 brne .-10 ; 0x2c0 <__do_copy_data+0x10> + +000002ca <__do_clear_bss>: + 2ca: 11 e0 ldi r17, 0x01 ; 1 + 2cc: ac e1 ldi r26, 0x1C ; 28 + 2ce: b1 e0 ldi r27, 0x01 ; 1 + 2d0: 01 c0 rjmp .+2 ; 0x2d4 <.do_clear_bss_start> + +000002d2 <.do_clear_bss_loop>: + 2d2: 1d 92 st X+, r1 + +000002d4 <.do_clear_bss_start>: + 2d4: a0 34 cpi r26, 0x40 ; 64 + 2d6: b1 07 cpc r27, r17 + 2d8: e1 f7 brne .-8 ; 0x2d2 <.do_clear_bss_loop> + 2da: 3e d1 rcall .+636 ; 0x558
+ 2dc: 0c 94 7b 0c jmp 0x18f6 ; 0x18f6 <_exit> + +000002e0 <__bad_interrupt>: + 2e0: 8f ce rjmp .-738 ; 0x0 <__vectors> + +000002e2 : + PORTD &= ~LEDMask; + } + + static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) + { + PORTD = ((PORTD & ~LEDS_ALL_LEDS) | LEDMask); + 2e2: 9b b1 in r25, 0x0b ; 11 + 2e4: 9f 70 andi r25, 0x0F ; 15 + 2e6: 98 2b or r25, r24 + 2e8: 9b b9 out 0x0b, r25 ; 11 + } + 2ea: 08 95 ret + +000002ec : + +/** 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); + 2ec: 84 b7 in r24, 0x34 ; 52 + 2ee: 87 7f andi r24, 0xF7 ; 247 + 2f0: 84 bf out 0x34, r24 ; 52 + wdt_disable(); + 2f2: 28 e1 ldi r18, 0x18 ; 24 + 2f4: 0f b6 in r0, 0x3f ; 63 + 2f6: f8 94 cli + 2f8: 20 93 60 00 sts 0x0060, r18 + 2fc: 10 92 60 00 sts 0x0060, r1 + 300: 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__ ( + 302: 90 e0 ldi r25, 0x00 ; 0 + 304: 80 e8 ldi r24, 0x80 ; 128 + 306: 0f b6 in r0, 0x3f ; 63 + 308: f8 94 cli + 30a: 80 93 61 00 sts 0x0061, r24 + 30e: 90 93 61 00 sts 0x0061, r25 + 312: 0f be out 0x3f, r0 ; 63 + * \param[in] DoubleSpeed Enables double speed mode when set, halving the sample time to double the baud rate. + */ + static inline void Serial_Init(const uint32_t BaudRate, + const bool DoubleSpeed) + { + UBRR1 = (DoubleSpeed ? SERIAL_2X_UBBRVAL(BaudRate) : SERIAL_UBBRVAL(BaudRate)); + 314: 83 e3 ldi r24, 0x33 ; 51 + 316: 90 e0 ldi r25, 0x00 ; 0 + 318: 90 93 cd 00 sts 0x00CD, r25 + 31c: 80 93 cc 00 sts 0x00CC, r24 + + UCSR1C = ((1 << UCSZ11) | (1 << UCSZ10)); + 320: 86 e0 ldi r24, 0x06 ; 6 + 322: 80 93 ca 00 sts 0x00CA, r24 + UCSR1A = (DoubleSpeed ? (1 << U2X1) : 0); + 326: 10 92 c8 00 sts 0x00C8, r1 + UCSR1B = ((1 << TXEN1) | (1 << RXEN1)); + 32a: 20 93 c9 00 sts 0x00C9, r18 + + DDRD |= (1 << 3); + 32e: 53 9a sbi 0x0a, 3 ; 10 + PORTD |= (1 << 2); + 330: 5a 9a sbi 0x0b, 2 ; 11 + + /* Inline Functions: */ + #if !defined(__DOXYGEN__) + static inline void LEDs_Init(void) + { + DDRD |= LEDS_ALL_LEDS; + 332: 8a b1 in r24, 0x0a ; 10 + 334: 80 6f ori r24, 0xF0 ; 240 + 336: 8a b9 out 0x0a, r24 ; 10 + PORTD &= ~LEDS_ALL_LEDS; + 338: 8b b1 in r24, 0x0b ; 11 + 33a: 8f 70 andi r24, 0x0F ; 15 + 33c: 8b b9 out 0x0b, r24 ; 11 + clock_prescale_set(clock_div_1); + + /* Hardware Initialization */ + Serial_Init(9600, false); + LEDs_Init(); + USB_Init(); + 33e: 34 d5 rcall .+2664 ; 0xda8 + static inline void Serial_CreateStream(FILE* Stream) + { + if (!(Stream)) + { + Stream = &USARTSerialStream; + stdin = Stream; + 340: ec e2 ldi r30, 0x2C ; 44 + 342: f1 e0 ldi r31, 0x01 ; 1 + 344: f0 93 3b 01 sts 0x013B, r31 + 348: e0 93 3a 01 sts 0x013A, r30 + stdout = Stream; + 34c: f0 93 3d 01 sts 0x013D, r31 + 350: e0 93 3c 01 sts 0x013C, r30 + } + + *Stream = (FILE)FDEV_SETUP_STREAM(Serial_putchar, Serial_getchar, _FDEV_SETUP_RW); + 354: 8e e0 ldi r24, 0x0E ; 14 + 356: df 01 movw r26, r30 + 358: 1d 92 st X+, r1 + 35a: 8a 95 dec r24 + 35c: e9 f7 brne .-6 ; 0x358 + 35e: 83 e0 ldi r24, 0x03 ; 3 + 360: 80 93 2f 01 sts 0x012F, r24 + 364: 85 e6 ldi r24, 0x65 ; 101 + 366: 99 e0 ldi r25, 0x09 ; 9 + 368: 90 93 35 01 sts 0x0135, r25 + 36c: 80 93 34 01 sts 0x0134, r24 + 370: 8e e6 ldi r24, 0x6E ; 110 + 372: 99 e0 ldi r25, 0x09 ; 9 + 374: 90 93 37 01 sts 0x0137, r25 + 378: 80 93 36 01 sts 0x0136, r24 + + /* Create a stdio stream for the serial port for stdin and stdout */ + Serial_CreateStream(NULL); +} + 37c: 08 95 ret + +0000037e : +/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and + * starts the library USB task to begin the enumeration and USB management process. + */ +void EVENT_USB_Host_DeviceAttached(void) +{ + puts_P(PSTR(ESC_FG_GREEN "Device Attached.\r\n" ESC_FG_WHITE)); + 37e: 81 e6 ldi r24, 0x61 ; 97 + 380: 92 e0 ldi r25, 0x02 ; 2 + 382: de d7 rcall .+4028 ; 0x1340 + LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); + 384: 80 ea ldi r24, 0xA0 ; 160 +} + 386: ad cf rjmp .-166 ; 0x2e2 + +00000388 : +/** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and + * stops the library USB task management process. + */ +void EVENT_USB_Host_DeviceUnattached(void) +{ + puts_P(PSTR(ESC_FG_GREEN "Device Unattached.\r\n" ESC_FG_WHITE)); + 388: 82 e4 ldi r24, 0x42 ; 66 + 38a: 92 e0 ldi r25, 0x02 ; 2 + 38c: d9 d7 rcall .+4018 ; 0x1340 + LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); + 38e: 80 e1 ldi r24, 0x10 ; 16 +} + 390: a8 cf rjmp .-176 ; 0x2e2 + +00000392 : +/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully + * enumerated by the host and is now ready to be used by the application. + */ +void EVENT_USB_Host_DeviceEnumerationComplete(void) +{ + LEDs_SetAllLEDs(LEDMASK_USB_READY); + 392: 80 e6 ldi r24, 0x60 ; 96 +} + 394: a6 cf rjmp .-180 ; 0x2e2 + +00000396 : + +/** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */ +void EVENT_USB_Host_HostError(const uint8_t ErrorCode) +{ + 396: df 93 push r29 + 398: cf 93 push r28 + 39a: 0f 92 push r0 + 39c: cd b7 in r28, 0x3d ; 61 + 39e: de b7 in r29, 0x3e ; 62 + USB_Disable(); + 3a0: 89 83 std Y+1, r24 ; 0x01 + 3a2: 9c d4 rcall .+2360 ; 0xcdc + + printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n" + 3a4: 00 d0 rcall .+0 ; 0x3a6 + 3a6: 00 d0 rcall .+0 ; 0x3a8 + 3a8: ed b7 in r30, 0x3d ; 61 + 3aa: fe b7 in r31, 0x3e ; 62 + 3ac: 31 96 adiw r30, 0x01 ; 1 + 3ae: 23 e1 ldi r18, 0x13 ; 19 + 3b0: 32 e0 ldi r19, 0x02 ; 2 + 3b2: ad b7 in r26, 0x3d ; 61 + 3b4: be b7 in r27, 0x3e ; 62 + 3b6: 12 96 adiw r26, 0x02 ; 2 + 3b8: 3c 93 st X, r19 + 3ba: 2e 93 st -X, r18 + 3bc: 11 97 sbiw r26, 0x01 ; 1 + 3be: 89 81 ldd r24, Y+1 ; 0x01 + 3c0: 82 83 std Z+2, r24 ; 0x02 + 3c2: 13 82 std Z+3, r1 ; 0x03 + 3c4: 9e d7 rcall .+3900 ; 0x1302 + " -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode); + + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + 3c6: 0f 90 pop r0 + 3c8: 0f 90 pop r0 + 3ca: 0f 90 pop r0 + 3cc: 0f 90 pop r0 + 3ce: 80 e9 ldi r24, 0x90 ; 144 + 3d0: 88 df rcall .-240 ; 0x2e2 + 3d2: ff cf rjmp .-2 ; 0x3d2 + +000003d4 : + * enumerating an attached USB device. + */ +void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode, + const uint8_t SubErrorCode) +{ + printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n" + 3d4: 90 91 2b 01 lds r25, 0x012B + 3d8: 2d b7 in r18, 0x3d ; 61 + 3da: 3e b7 in r19, 0x3e ; 62 + 3dc: 28 50 subi r18, 0x08 ; 8 + 3de: 30 40 sbci r19, 0x00 ; 0 + 3e0: 0f b6 in r0, 0x3f ; 63 + 3e2: f8 94 cli + 3e4: 3e bf out 0x3e, r19 ; 62 + 3e6: 0f be out 0x3f, r0 ; 63 + 3e8: 2d bf out 0x3d, r18 ; 61 + 3ea: ed b7 in r30, 0x3d ; 61 + 3ec: fe b7 in r31, 0x3e ; 62 + 3ee: 31 96 adiw r30, 0x01 ; 1 + 3f0: 2d eb ldi r18, 0xBD ; 189 + 3f2: 31 e0 ldi r19, 0x01 ; 1 + 3f4: ad b7 in r26, 0x3d ; 61 + 3f6: be b7 in r27, 0x3e ; 62 + 3f8: 12 96 adiw r26, 0x02 ; 2 + 3fa: 3c 93 st X, r19 + 3fc: 2e 93 st -X, r18 + 3fe: 11 97 sbiw r26, 0x01 ; 1 + 400: 82 83 std Z+2, r24 ; 0x02 + 402: 13 82 std Z+3, r1 ; 0x03 + 404: 64 83 std Z+4, r22 ; 0x04 + 406: 15 82 std Z+5, r1 ; 0x05 + 408: 96 83 std Z+6, r25 ; 0x06 + 40a: 17 82 std Z+7, r1 ; 0x07 + 40c: 7a d7 rcall .+3828 ; 0x1302 + " -- Error Code %d\r\n" + " -- Sub Error Code %d\r\n" + " -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState); + + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + 40e: 2d b7 in r18, 0x3d ; 61 + 410: 3e b7 in r19, 0x3e ; 62 + 412: 28 5f subi r18, 0xF8 ; 248 + 414: 3f 4f sbci r19, 0xFF ; 255 + 416: 0f b6 in r0, 0x3f ; 63 + 418: f8 94 cli + 41a: 3e bf out 0x3e, r19 ; 62 + 41c: 0f be out 0x3f, r0 ; 63 + 41e: 2d bf out 0x3d, r18 ; 61 + 420: 80 e9 ldi r24, 0x90 ; 144 +} + 422: 5f cf rjmp .-322 ; 0x2e2 + +00000424 : + +void Audio_Task(void) +{ + 424: 1f 93 push r17 + 426: df 93 push r29 + 428: cf 93 push r28 + 42a: 00 d0 rcall .+0 ; 0x42c + 42c: 0f 92 push r0 + 42e: cd b7 in r28, 0x3d ; 61 + 430: de b7 in r29, 0x3e ; 62 + uint8_t ErrorCode; + + switch (USB_HostState) + 432: 80 91 2b 01 lds r24, 0x012B + 436: 8b 30 cpi r24, 0x0B ; 11 + 438: 09 f0 breq .+2 ; 0x43c + 43a: 87 c0 rjmp .+270 ; 0x54a + { + case HOST_STATE_Addressed: + puts_P(PSTR("Getting Config Data.\r\n")); + 43c: 86 ea ldi r24, 0xA6 ; 166 + 43e: 91 e0 ldi r25, 0x01 ; 1 + 440: 7f d7 rcall .+3838 ; 0x1340 + + /* Get and process the configuration descriptor data */ + if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead) + 442: 30 d1 rcall .+608 ; 0x6a4 + 444: 18 2f mov r17, r24 + 446: 88 23 and r24, r24 + 448: e9 f0 breq .+58 ; 0x484 + { + if (ErrorCode == ControlError) + 44a: 81 30 cpi r24, 0x01 ; 1 + 44c: 19 f4 brne .+6 ; 0x454 + puts_P(PSTR(ESC_FG_RED "Control Error (Get Configuration).\r\n")); + 44e: 8c e7 ldi r24, 0x7C ; 124 + 450: 91 e0 ldi r25, 0x01 ; 1 + 452: 02 c0 rjmp .+4 ; 0x458 + else + puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n")); + 454: 85 e6 ldi r24, 0x65 ; 101 + 456: 91 e0 ldi r25, 0x01 ; 1 + 458: 73 d7 rcall .+3814 ; 0x1340 + + printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode); + 45a: 00 d0 rcall .+0 ; 0x45c + 45c: 00 d0 rcall .+0 ; 0x45e + 45e: ed b7 in r30, 0x3d ; 61 + 460: fe b7 in r31, 0x3e ; 62 + 462: 31 96 adiw r30, 0x01 ; 1 + 464: 2b e4 ldi r18, 0x4B ; 75 + 466: 31 e0 ldi r19, 0x01 ; 1 + 468: ad b7 in r26, 0x3d ; 61 + 46a: be b7 in r27, 0x3e ; 62 + 46c: 12 96 adiw r26, 0x02 ; 2 + 46e: 3c 93 st X, r19 + 470: 2e 93 st -X, r18 + 472: 11 97 sbiw r26, 0x01 ; 1 + 474: 12 83 std Z+2, r17 ; 0x02 + 476: 13 82 std Z+3, r1 ; 0x03 + 478: 44 d7 rcall .+3720 ; 0x1302 + + /* Indicate error status */ + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + 47a: 0f 90 pop r0 + 47c: 0f 90 pop r0 + 47e: 0f 90 pop r0 + 480: 0f 90 pop r0 + 482: 4a c0 rjmp .+148 ; 0x518 + USB_HostState = HOST_STATE_WaitForDeviceRemoval; + break; + } + + /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */ + if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful) + 484: 81 e0 ldi r24, 0x01 ; 1 + 486: 82 d3 rcall .+1796 ; 0xb8c + 488: 88 23 and r24, r24 + 48a: 41 f0 breq .+16 ; 0x49c + { + printf_P(PSTR(ESC_FG_RED "Control Error (Set Configuration).\r\n" + 48c: 00 d0 rcall .+0 ; 0x48e + 48e: 00 d0 rcall .+0 ; 0x490 + 490: ed b7 in r30, 0x3d ; 61 + 492: fe b7 in r31, 0x3e ; 62 + 494: 31 96 adiw r30, 0x01 ; 1 + 496: 28 e0 ldi r18, 0x08 ; 8 + 498: 31 e0 ldi r19, 0x01 ; 1 + 49a: 0e c0 rjmp .+28 ; 0x4b8 + /* Wait until USB device disconnected */ + USB_HostState = HOST_STATE_WaitForDeviceRemoval; + break; + } + + if ((ErrorCode = USB_Host_SetInterfaceAltSetting(StreamingInterfaceIndex, + 49c: 80 91 1c 01 lds r24, 0x011C + 4a0: 60 91 1d 01 lds r22, 0x011D + 4a4: 89 d3 rcall .+1810 ; 0xbb8 + 4a6: 88 23 and r24, r24 + 4a8: 79 f0 breq .+30 ; 0x4c8 + StreamingInterfaceAltSetting)) != HOST_SENDCONTROL_Successful) + { + printf_P(PSTR(ESC_FG_RED "Could not set alternative streaming interface setting.\r\n" + 4aa: 00 d0 rcall .+0 ; 0x4ac + 4ac: 00 d0 rcall .+0 ; 0x4ae + 4ae: ed b7 in r30, 0x3d ; 61 + 4b0: fe b7 in r31, 0x3e ; 62 + 4b2: 31 96 adiw r30, 0x01 ; 1 + 4b4: 21 eb ldi r18, 0xB1 ; 177 + 4b6: 30 e0 ldi r19, 0x00 ; 0 + 4b8: ad b7 in r26, 0x3d ; 61 + 4ba: be b7 in r27, 0x3e ; 62 + 4bc: 12 96 adiw r26, 0x02 ; 2 + 4be: 3c 93 st X, r19 + 4c0: 2e 93 st -X, r18 + 4c2: 11 97 sbiw r26, 0x01 ; 1 + 4c4: 82 83 std Z+2, r24 ; 0x02 + 4c6: d7 cf rjmp .-82 ; 0x476 + /* Wait until USB device disconnected */ + USB_HostState = HOST_STATE_WaitForDeviceRemoval; + break; + } + + USB_ControlRequest = (USB_Request_Header_t) + 4c8: 20 91 1e 01 lds r18, 0x011E + 4cc: 82 e2 ldi r24, 0x22 ; 34 + 4ce: 80 93 23 01 sts 0x0123, r24 + 4d2: 81 e0 ldi r24, 0x01 ; 1 + 4d4: 80 93 24 01 sts 0x0124, r24 + 4d8: 80 e0 ldi r24, 0x00 ; 0 + 4da: 91 e0 ldi r25, 0x01 ; 1 + 4dc: 90 93 26 01 sts 0x0126, r25 + 4e0: 80 93 25 01 sts 0x0125, r24 + 4e4: 20 93 27 01 sts 0x0127, r18 + 4e8: 10 92 28 01 sts 0x0128, r1 + 4ec: 83 e0 ldi r24, 0x03 ; 3 + 4ee: 90 e0 ldi r25, 0x00 ; 0 + 4f0: 90 93 2a 01 sts 0x012A, r25 + 4f4: 80 93 29 01 sts 0x0129, r24 + .wValue = 0x0100, + .wIndex = StreamingEndpointAddress, + .wLength = sizeof(USB_Audio_SampleFreq_t), + }; + + USB_Audio_SampleFreq_t SampleRate = AUDIO_SAMPLE_FREQ(48000); + 4f8: de 01 movw r26, r28 + 4fa: 11 96 adiw r26, 0x01 ; 1 + 4fc: e0 e0 ldi r30, 0x00 ; 0 + 4fe: f1 e0 ldi r31, 0x01 ; 1 + 500: 83 e0 ldi r24, 0x03 ; 3 + 502: 01 90 ld r0, Z+ + 504: 0d 92 st X+, r0 + 506: 81 50 subi r24, 0x01 ; 1 + 508: e1 f7 brne .-8 ; 0x502 + * \param[in] PipeNumber Index of the pipe to select. + */ + static inline void Pipe_SelectPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE; + static inline void Pipe_SelectPipe(const uint8_t PipeNumber) + { + UPNUM = PipeNumber; + 50a: 10 92 a7 00 sts 0x00A7, r1 + + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + + /* Set the sample rate on the streaming interface endpoint */ + if ((ErrorCode = USB_Host_SendControlRequest(&SampleRate)) != HOST_SENDCONTROL_Successful) + 50e: ce 01 movw r24, r28 + 510: 01 96 adiw r24, 0x01 ; 1 + 512: b7 d5 rcall .+2926 ; 0x1082 + 514: 88 23 and r24, r24 + 516: 29 f0 breq .+10 ; 0x522 + { + /* Indicate error status */ + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + 518: 80 e9 ldi r24, 0x90 ; 144 + 51a: e3 de rcall .-570 ; 0x2e2 + + /* Wait until USB device disconnected */ + USB_HostState = HOST_STATE_WaitForDeviceRemoval; + 51c: 10 92 2b 01 sts 0x012B, r1 + break; + 520: 14 c0 rjmp .+40 ; 0x54a + } + + /* Sample reload timer initialization */ + TIMSK0 = (1 << OCIE0A); + 522: 82 e0 ldi r24, 0x02 ; 2 + 524: 80 93 6e 00 sts 0x006E, r24 + OCR0A = ((F_CPU / 8 / 8000) - 1); + 528: 9c e7 ldi r25, 0x7C ; 124 + 52a: 97 bd out 0x27, r25 ; 39 + TCCR0A = (1 << WGM01); // CTC mode + 52c: 84 bd out 0x24, r24 ; 36 + TCCR0B = (1 << CS01); // Fcpu/8 speed + 52e: 85 bd out 0x25, r24 ; 37 + + /* Set speaker as output */ + DDRC |= (1 << 6); + 530: 3e 9a sbi 0x07, 6 ; 7 + + /* PWM speaker timer initialization */ + TCCR3A = ((1 << WGM30) | (1 << COM3A1) | (1 << COM3A0) + 532: 81 ef ldi r24, 0xF1 ; 241 + 534: 80 93 90 00 sts 0x0090, r24 + | (1 << COM3B1) | (1 << COM3B0)); // Set on match, clear on TOP + TCCR3B = ((1 << WGM32) | (1 << CS30)); // Fast 8-Bit PWM, F_CPU speed + 538: 89 e0 ldi r24, 0x09 ; 9 + 53a: 80 93 91 00 sts 0x0091, r24 + + puts_P(PSTR("Microphone Enumerated.\r\n")); + 53e: 88 e9 ldi r24, 0x98 ; 152 + 540: 90 e0 ldi r25, 0x00 ; 0 + 542: fe d6 rcall .+3580 ; 0x1340 + + USB_HostState = HOST_STATE_Configured; + 544: 8c e0 ldi r24, 0x0C ; 12 + 546: 80 93 2b 01 sts 0x012B, r24 + break; + case HOST_STATE_Configured: + break; + } +} + 54a: 0f 90 pop r0 + 54c: 0f 90 pop r0 + 54e: 0f 90 pop r0 + 550: cf 91 pop r28 + 552: df 91 pop r29 + 554: 1f 91 pop r17 + 556: 08 95 ret + +00000558
: +/** Main program entry point. This routine configures the hardware required by the application, then + * enters a loop to run the application tasks in sequence. + */ +int main(void) +{ + SetupHardware(); + 558: c9 de rcall .-622 ; 0x2ec + + puts_P(PSTR(ESC_FG_CYAN "Audio Host Demo running.\r\n" ESC_FG_WHITE)); + 55a: 8e e7 ldi r24, 0x7E ; 126 + 55c: 92 e0 ldi r25, 0x02 ; 2 + 55e: f0 d6 rcall .+3552 ; 0x1340 + + LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); + 560: 80 e1 ldi r24, 0x10 ; 16 + 562: bf de rcall .-642 ; 0x2e2 + sei(); + 564: 78 94 sei + + for (;;) + { + Audio_Task(); + 566: 5e df rcall .-324 ; 0x424 + USB_USBTask(); + 568: a2 d6 rcall .+3396 ; 0x12ae + 56a: fd cf rjmp .-6 ; 0x566 + +0000056c <__vector_21>: + } +} + +/** ISR to handle the reloading of the PWM timer with the next sample. */ +ISR(TIMER0_COMPA_vect, ISR_BLOCK) +{ + 56c: 1f 92 push r1 + 56e: 0f 92 push r0 + 570: 0f b6 in r0, 0x3f ; 63 + 572: 0f 92 push r0 + 574: 0b b6 in r0, 0x3b ; 59 + 576: 0f 92 push r0 + 578: 11 24 eor r1, r1 + 57a: 1f 93 push r17 + 57c: 2f 93 push r18 + 57e: 3f 93 push r19 + 580: 4f 93 push r20 + 582: 5f 93 push r21 + 584: 6f 93 push r22 + 586: 7f 93 push r23 + 588: 8f 93 push r24 + 58a: 9f 93 push r25 + 58c: af 93 push r26 + 58e: bf 93 push r27 + 590: ef 93 push r30 + 592: ff 93 push r31 + * \return Index of the currently selected pipe. + */ + static inline uint8_t Pipe_GetCurrentPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline uint8_t Pipe_GetCurrentPipe(void) + { + return (UPNUM & PIPE_PIPENUM_MASK); + 594: 10 91 a7 00 lds r17, 0x00A7 + 598: 17 70 andi r17, 0x07 ; 7 + * \param[in] PipeNumber Index of the pipe to select. + */ + static inline void Pipe_SelectPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE; + static inline void Pipe_SelectPipe(const uint8_t PipeNumber) + { + UPNUM = PipeNumber; + 59a: 81 e0 ldi r24, 0x01 ; 1 + 59c: 80 93 a7 00 sts 0x00A7, r24 + + /** Unfreezes the selected pipe, allowing it to communicate with an attached device. */ + static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_Unfreeze(void) + { + UPCONX &= ~(1 << PFREEZE); + 5a0: 80 91 a9 00 lds r24, 0x00A9 + 5a4: 8f 7b andi r24, 0xBF ; 191 + 5a6: 80 93 a9 00 sts 0x00A9, r24 + * \return Boolean \c true if the current pipe has received an IN packet, \c false otherwise. + */ + static inline bool Pipe_IsINReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline bool Pipe_IsINReceived(void) + { + return ((UPINTX & (1 << RXINI)) ? true : false); + 5aa: 80 91 a6 00 lds r24, 0x00A6 + + Pipe_SelectPipe(AUDIO_DATA_IN_PIPE); + Pipe_Unfreeze(); + + /* Check if the current pipe can be read from (contains a packet) and the device is sending data */ + if (Pipe_IsINReceived()) + 5ae: 80 ff sbrs r24, 0 + 5b0: 2b c0 rjmp .+86 ; 0x608 <__vector_21+0x9c> + { + uint16_t Value; + uint8_t Bytes[2]; + } Data; + + Data.Bytes[0] = UPDATX; + 5b2: 80 91 af 00 lds r24, 0x00AF + Data.Bytes[1] = UPDATX; + 5b6: 40 91 af 00 lds r20, 0x00AF + * on its direction. + */ + static inline bool Pipe_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline bool Pipe_IsReadWriteAllowed(void) + { + return ((UPINTX & (1 << RWAL)) ? true : false); + 5ba: 80 91 a6 00 lds r24, 0x00A6 + { + /* Retrieve the signed 16-bit audio sample, convert to 8-bit */ + int8_t Sample_8Bit = (Pipe_Read_16_LE() >> 8); + + /* Check to see if the bank is now empty */ + if (!(Pipe_IsReadWriteAllowed())) + 5be: 85 fd sbrc r24, 5 + 5c0: 05 c0 rjmp .+10 ; 0x5cc <__vector_21+0x60> + * \ingroup Group_PipePacketManagement_AVR8 + */ + static inline void Pipe_ClearIN(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_ClearIN(void) + { + UPINTX &= ~((1 << RXINI) | (1 << FIFOCON)); + 5c2: 80 91 a6 00 lds r24, 0x00A6 + 5c6: 8e 77 andi r24, 0x7E ; 126 + 5c8: 80 93 a6 00 sts 0x00A6, r24 + /* Acknowledge the packet, clear the bank ready for the next packet */ + Pipe_ClearIN(); + } + + /* Load the sample into the PWM timer channel */ + OCR3A = (Sample_8Bit ^ (1 << 7)); + 5cc: 84 2f mov r24, r20 + 5ce: 99 27 eor r25, r25 + 5d0: 87 fd sbrc r24, 7 + 5d2: 90 95 com r25 + 5d4: 20 e8 ldi r18, 0x80 ; 128 + 5d6: 30 e0 ldi r19, 0x00 ; 0 + 5d8: 82 27 eor r24, r18 + 5da: 93 27 eor r25, r19 + 5dc: 90 93 99 00 sts 0x0099, r25 + 5e0: 80 93 98 00 sts 0x0098, r24 + + uint8_t LEDMask = LEDS_NO_LEDS; + + /* Turn on LEDs as the sample amplitude increases */ + if (Sample_8Bit > 16) + 5e4: 41 31 cpi r20, 0x11 ; 17 + 5e6: 44 f4 brge .+16 ; 0x5f8 <__vector_21+0x8c> + LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4); + else if (Sample_8Bit > 8) + 5e8: 49 30 cpi r20, 0x09 ; 9 + 5ea: 44 f4 brge .+16 ; 0x5fc <__vector_21+0x90> + LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3); + else if (Sample_8Bit > 4) + 5ec: 45 30 cpi r20, 0x05 ; 5 + 5ee: 44 f4 brge .+16 ; 0x600 <__vector_21+0x94> + LEDMask = (LEDS_LED1 | LEDS_LED2); + else if (Sample_8Bit > 2) + 5f0: 43 30 cpi r20, 0x03 ; 3 + 5f2: 44 f4 brge .+16 ; 0x604 <__vector_21+0x98> + } + + /* Load the sample into the PWM timer channel */ + OCR3A = (Sample_8Bit ^ (1 << 7)); + + uint8_t LEDMask = LEDS_NO_LEDS; + 5f4: 80 e0 ldi r24, 0x00 ; 0 + 5f6: 07 c0 rjmp .+14 ; 0x606 <__vector_21+0x9a> + + /* Turn on LEDs as the sample amplitude increases */ + if (Sample_8Bit > 16) + LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4); + 5f8: 80 ef ldi r24, 0xF0 ; 240 + 5fa: 05 c0 rjmp .+10 ; 0x606 <__vector_21+0x9a> + else if (Sample_8Bit > 8) + LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3); + 5fc: 80 eb ldi r24, 0xB0 ; 176 + 5fe: 03 c0 rjmp .+6 ; 0x606 <__vector_21+0x9a> + else if (Sample_8Bit > 4) + LEDMask = (LEDS_LED1 | LEDS_LED2); + 600: 80 e3 ldi r24, 0x30 ; 48 + 602: 01 c0 rjmp .+2 ; 0x606 <__vector_21+0x9a> + else if (Sample_8Bit > 2) + LEDMask = (LEDS_LED1); + 604: 80 e1 ldi r24, 0x10 ; 16 + + LEDs_SetAllLEDs(LEDMask); + 606: 6d de rcall .-806 ; 0x2e2 + + /** Freezes the selected pipe, preventing it from communicating with an attached device. */ + static inline void Pipe_Freeze(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_Freeze(void) + { + UPCONX |= (1 << PFREEZE); + 608: 80 91 a9 00 lds r24, 0x00A9 + 60c: 80 64 ori r24, 0x40 ; 64 + 60e: 80 93 a9 00 sts 0x00A9, r24 + * \param[in] PipeNumber Index of the pipe to select. + */ + static inline void Pipe_SelectPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE; + static inline void Pipe_SelectPipe(const uint8_t PipeNumber) + { + UPNUM = PipeNumber; + 612: 10 93 a7 00 sts 0x00A7, r17 + } + + Pipe_Freeze(); + + Pipe_SelectPipe(PrevPipe); +} + 616: ff 91 pop r31 + 618: ef 91 pop r30 + 61a: bf 91 pop r27 + 61c: af 91 pop r26 + 61e: 9f 91 pop r25 + 620: 8f 91 pop r24 + 622: 7f 91 pop r23 + 624: 6f 91 pop r22 + 626: 5f 91 pop r21 + 628: 4f 91 pop r20 + 62a: 3f 91 pop r19 + 62c: 2f 91 pop r18 + 62e: 1f 91 pop r17 + 630: 0f 90 pop r0 + 632: 0b be out 0x3b, r0 ; 59 + 634: 0f 90 pop r0 + 636: 0f be out 0x3f, r0 ; 63 + 638: 0f 90 pop r0 + 63a: 1f 90 pop r1 + 63c: 18 95 reti + +0000063e : + /* Valid data found, return success */ + return SuccessfulConfigRead; +} + +uint8_t DComp_NextAudioControlInterface(void* CurrentDescriptor) +{ + 63e: fc 01 movw r30, r24 + USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + + if (Header->Type == DTYPE_Interface) + 640: 81 81 ldd r24, Z+1 ; 0x01 + 642: 84 30 cpi r24, 0x04 ; 4 + 644: 49 f4 brne .+18 ; 0x658 + { + USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); + + if ((Interface->Class == AUDIO_CSCP_AudioClass) && + 646: 85 81 ldd r24, Z+5 ; 0x05 + 648: 81 30 cpi r24, 0x01 ; 1 + 64a: 31 f4 brne .+12 ; 0x658 + 64c: 86 81 ldd r24, Z+6 ; 0x06 + 64e: 81 30 cpi r24, 0x01 ; 1 + 650: 19 f4 brne .+6 ; 0x658 + (Interface->SubClass == AUDIO_CSCP_ControlSubclass) && + 652: 87 81 ldd r24, Z+7 ; 0x07 + 654: 88 23 and r24, r24 + 656: 11 f0 breq .+4 ; 0x65c + { + return DESCRIPTOR_SEARCH_Found; + } + } + + return DESCRIPTOR_SEARCH_NotFound; + 658: 82 e0 ldi r24, 0x02 ; 2 + 65a: 08 95 ret + + if ((Interface->Class == AUDIO_CSCP_AudioClass) && + (Interface->SubClass == AUDIO_CSCP_ControlSubclass) && + (Interface->Protocol == AUDIO_CSCP_ControlProtocol)) + { + return DESCRIPTOR_SEARCH_Found; + 65c: 80 e0 ldi r24, 0x00 ; 0 + } + } + + return DESCRIPTOR_SEARCH_NotFound; +} + 65e: 08 95 ret + +00000660 : + +uint8_t DComp_NextAudioStreamInterface(void* CurrentDescriptor) +{ + 660: fc 01 movw r30, r24 + USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + + if (Header->Type == DTYPE_Interface) + 662: 81 81 ldd r24, Z+1 ; 0x01 + 664: 84 30 cpi r24, 0x04 ; 4 + 666: 49 f4 brne .+18 ; 0x67a + { + USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); + + if ((Interface->Class == AUDIO_CSCP_AudioClass) && + 668: 85 81 ldd r24, Z+5 ; 0x05 + 66a: 81 30 cpi r24, 0x01 ; 1 + 66c: 31 f4 brne .+12 ; 0x67a + 66e: 86 81 ldd r24, Z+6 ; 0x06 + 670: 82 30 cpi r24, 0x02 ; 2 + 672: 19 f4 brne .+6 ; 0x67a + (Interface->SubClass == AUDIO_CSCP_AudioStreamingSubclass) && + 674: 87 81 ldd r24, Z+7 ; 0x07 + 676: 88 23 and r24, r24 + 678: 11 f0 breq .+4 ; 0x67e + { + return DESCRIPTOR_SEARCH_Found; + } + } + + return DESCRIPTOR_SEARCH_NotFound; + 67a: 82 e0 ldi r24, 0x02 ; 2 + 67c: 08 95 ret + + if ((Interface->Class == AUDIO_CSCP_AudioClass) && + (Interface->SubClass == AUDIO_CSCP_AudioStreamingSubclass) && + (Interface->Protocol == AUDIO_CSCP_StreamingProtocol)) + { + return DESCRIPTOR_SEARCH_Found; + 67e: 80 e0 ldi r24, 0x00 ; 0 + } + } + + return DESCRIPTOR_SEARCH_NotFound; +} + 680: 08 95 ret + +00000682 : + +uint8_t DComp_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor) +{ + 682: fc 01 movw r30, r24 + USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + + if (Header->Type == DTYPE_Endpoint) + 684: 81 81 ldd r24, Z+1 ; 0x01 + 686: 85 30 cpi r24, 0x05 ; 5 + 688: 29 f4 brne .+10 ; 0x694 + { + USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t); + + if ((Endpoint->Attributes & EP_TYPE_MASK) == EP_TYPE_ISOCHRONOUS) + 68a: 83 81 ldd r24, Z+3 ; 0x03 + 68c: 83 70 andi r24, 0x03 ; 3 + 68e: 81 30 cpi r24, 0x01 ; 1 + 690: 19 f4 brne .+6 ; 0x698 + 692: 04 c0 rjmp .+8 ; 0x69c + return DESCRIPTOR_SEARCH_Found; + } + else if (Header->Type == DTYPE_Interface) + 694: 84 30 cpi r24, 0x04 ; 4 + 696: 21 f0 breq .+8 ; 0x6a0 + { + return DESCRIPTOR_SEARCH_Fail; + } + + return DESCRIPTOR_SEARCH_NotFound; + 698: 82 e0 ldi r24, 0x02 ; 2 + 69a: 08 95 ret + if (Header->Type == DTYPE_Endpoint) + { + USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t); + + if ((Endpoint->Attributes & EP_TYPE_MASK) == EP_TYPE_ISOCHRONOUS) + return DESCRIPTOR_SEARCH_Found; + 69c: 80 e0 ldi r24, 0x00 ; 0 + 69e: 08 95 ret + } + else if (Header->Type == DTYPE_Interface) + { + return DESCRIPTOR_SEARCH_Fail; + 6a0: 81 e0 ldi r24, 0x01 ; 1 + } + + return DESCRIPTOR_SEARCH_NotFound; +} + 6a2: 08 95 ret + +000006a4 : +uint8_t StreamingInterfaceIndex = 0; +uint8_t StreamingInterfaceAltSetting = 0; +uint8_t StreamingEndpointAddress = 0; + +uint8_t ProcessConfigurationDescriptor(void) +{ + 6a4: af 92 push r10 + 6a6: bf 92 push r11 + 6a8: cf 92 push r12 + 6aa: df 92 push r13 + 6ac: ef 92 push r14 + 6ae: ff 92 push r15 + 6b0: 0f 93 push r16 + 6b2: 1f 93 push r17 + 6b4: df 93 push r29 + 6b6: cf 93 push r28 + 6b8: cd b7 in r28, 0x3d ; 61 + 6ba: de b7 in r29, 0x3e ; 62 + 6bc: c4 50 subi r28, 0x04 ; 4 + 6be: d2 40 sbci r29, 0x02 ; 2 + 6c0: 0f b6 in r0, 0x3f ; 63 + 6c2: f8 94 cli + 6c4: de bf out 0x3e, r29 ; 62 + 6c6: 0f be out 0x3f, r0 ; 63 + 6c8: cd bf out 0x3d, r28 ; 61 + uint8_t ConfigDescriptorData[512]; + void* CurrConfigLocation = ConfigDescriptorData; + 6ca: ae 01 movw r20, r28 + 6cc: 4b 5f subi r20, 0xFB ; 251 + 6ce: 5f 4f sbci r21, 0xFF ; 255 + 6d0: 5a 83 std Y+2, r21 ; 0x02 + 6d2: 49 83 std Y+1, r20 ; 0x01 + USB_Descriptor_Interface_t* AudioControlInterface = NULL; + USB_Descriptor_Interface_t* AudioStreamingInterface = NULL; + USB_Descriptor_Endpoint_t* DataINEndpoint = NULL; + + /* Retrieve the entire configuration descriptor into the allocated buffer */ + switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData))) + 6d4: 23 e0 ldi r18, 0x03 ; 3 + 6d6: e2 2e mov r14, r18 + 6d8: f1 2c mov r15, r1 + 6da: ec 0e add r14, r28 + 6dc: fd 1e adc r15, r29 + 6de: 81 e0 ldi r24, 0x01 ; 1 + 6e0: b7 01 movw r22, r14 + 6e2: 20 e0 ldi r18, 0x00 ; 0 + 6e4: 32 e0 ldi r19, 0x02 ; 2 + 6e6: 09 d4 rcall .+2066 ; 0xefa + 6e8: 85 30 cpi r24, 0x05 ; 5 + 6ea: 09 f4 brne .+2 ; 0x6ee + 6ec: 5c c0 rjmp .+184 ; 0x7a6 + 6ee: 86 30 cpi r24, 0x06 ; 6 + 6f0: 61 f0 breq .+24 ; 0x70a + 6f2: 88 23 and r24, r24 + 6f4: 61 f4 brne .+24 ; 0x70e + 6f6: 00 e0 ldi r16, 0x00 ; 0 + 6f8: 10 e0 ldi r17, 0x00 ; 0 + 6fa: cc 24 eor r12, r12 + 6fc: dd 24 eor r13, r13 + 6fe: 57 01 movw r10, r14 + 700: 7e 01 movw r14, r28 + 702: 08 94 sec + 704: e1 1c adc r14, r1 + 706: f1 1c adc r15, r1 + 708: 07 c0 rjmp .+14 ; 0x718 + { + case HOST_GETCONFIG_Successful: + break; + case HOST_GETCONFIG_InvalidData: + return InvalidConfigDataReturned; + 70a: 83 e0 ldi r24, 0x03 ; 3 + 70c: 4f c0 rjmp .+158 ; 0x7ac + case HOST_GETCONFIG_BuffOverflow: + return DescriptorTooLarge; + default: + return ControlError; + 70e: 81 e0 ldi r24, 0x01 ; 1 + 710: 4d c0 rjmp .+154 ; 0x7ac + USB_Descriptor_Interface_t* AudioControlInterface = NULL; + USB_Descriptor_Interface_t* AudioStreamingInterface = NULL; + USB_Descriptor_Endpoint_t* DataINEndpoint = NULL; + + /* Retrieve the entire configuration descriptor into the allocated buffer */ + switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData))) + 712: 9c 01 movw r18, r24 + 714: 03 2f mov r16, r19 + 716: 18 2f mov r17, r24 + return ControlError; + } + + while (!(DataINEndpoint)) + { + if (!(AudioControlInterface) || + 718: c1 14 cp r12, r1 + 71a: d1 04 cpc r13, r1 + 71c: 41 f0 breq .+16 ; 0x72e + USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, + 71e: c5 01 movw r24, r10 + 720: b7 01 movw r22, r14 + 722: 41 e4 ldi r20, 0x41 ; 65 + 724: 53 e0 ldi r21, 0x03 ; 3 + 726: 40 d4 rcall .+2176 ; 0xfa8 + return ControlError; + } + + while (!(DataINEndpoint)) + { + if (!(AudioControlInterface) || + 728: 88 23 and r24, r24 + 72a: 51 f4 brne .+20 ; 0x740 + 72c: 1c c0 rjmp .+56 ; 0x766 + USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, + DComp_NextAudioInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) + { + if (!(AudioControlInterface)) + { + if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, + 72e: c5 01 movw r24, r10 + 730: b7 01 movw r22, r14 + 732: 4f e1 ldi r20, 0x1F ; 31 + 734: 53 e0 ldi r21, 0x03 ; 3 + 736: 38 d4 rcall .+2160 ; 0xfa8 + 738: 88 23 and r24, r24 + 73a: b9 f5 brne .+110 ; 0x7aa + /* Descriptor not found, error out */ + return NoCompatibleInterfaceFound; + } + + /* Save the interface in case we need to refer back to it later */ + AudioControlInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t); + 73c: c9 80 ldd r12, Y+1 ; 0x01 + 73e: da 80 ldd r13, Y+2 ; 0x02 + } + + if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, + 740: c5 01 movw r24, r10 + 742: b7 01 movw r22, r14 + 744: 40 e3 ldi r20, 0x30 ; 48 + 746: 53 e0 ldi r21, 0x03 ; 3 + 748: 2f d4 rcall .+2142 ; 0xfa8 + 74a: 88 23 and r24, r24 + 74c: 49 f0 breq .+18 ; 0x760 + DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found) + { + if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, + 74e: c5 01 movw r24, r10 + 750: b7 01 movw r22, r14 + 752: 4f e1 ldi r20, 0x1F ; 31 + 754: 53 e0 ldi r21, 0x03 ; 3 + 756: 28 d4 rcall .+2128 ; 0xfa8 + 758: 88 23 and r24, r24 + 75a: 39 f5 brne .+78 ; 0x7aa + /* Descriptor not found, error out */ + return NoCompatibleInterfaceFound; + } + + /* Save the interface in case we need to refer back to it later */ + AudioControlInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t); + 75c: c9 80 ldd r12, Y+1 ; 0x01 + 75e: da 80 ldd r13, Y+2 ; 0x02 + } + + /* Save the interface in case we need to refer back to it later */ + AudioStreamingInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t); + 760: 09 81 ldd r16, Y+1 ; 0x01 + 762: 1a 81 ldd r17, Y+2 ; 0x02 + + /* Skip the remainder of the loop as we have not found an endpoint yet */ + continue; + 764: 35 c0 rjmp .+106 ; 0x7d0 + } + + /* Retrieve the endpoint address from the endpoint descriptor */ + USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t); + 766: e9 81 ldd r30, Y+1 ; 0x01 + 768: fa 81 ldd r31, Y+2 ; 0x02 + + /* If the endpoint is a IN type endpoint */ + if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN) + 76a: 82 81 ldd r24, Z+2 ; 0x02 + 76c: 87 ff sbrs r24, 7 + 76e: 30 c0 rjmp .+96 ; 0x7d0 + 770: 90 2f mov r25, r16 + 772: 81 2f mov r24, r17 + return DescriptorTooLarge; + default: + return ControlError; + } + + while (!(DataINEndpoint)) + 774: 30 97 sbiw r30, 0x00 ; 0 + 776: 69 f2 breq .-102 ; 0x712 + /* If the endpoint is a IN type endpoint */ + if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN) + DataINEndpoint = EndpointData; + } + + StreamingInterfaceIndex = AudioStreamingInterface->InterfaceNumber; + 778: d8 01 movw r26, r16 + 77a: 12 96 adiw r26, 0x02 ; 2 + 77c: 8c 91 ld r24, X + 77e: 12 97 sbiw r26, 0x02 ; 2 + 780: 80 93 1c 01 sts 0x011C, r24 + StreamingInterfaceAltSetting = AudioStreamingInterface->AlternateSetting; + 784: 13 96 adiw r26, 0x03 ; 3 + 786: 8c 91 ld r24, X + 788: 80 93 1d 01 sts 0x011D, r24 + StreamingEndpointAddress = DataINEndpoint->EndpointAddress; + 78c: 22 81 ldd r18, Z+2 ; 0x02 + 78e: 20 93 1e 01 sts 0x011E, r18 + + /* Configure the HID data IN pipe */ + Pipe_ConfigurePipe(AUDIO_DATA_IN_PIPE, EP_TYPE_ISOCHRONOUS, PIPE_TOKEN_IN, + 792: 04 81 ldd r16, Z+4 ; 0x04 + 794: 15 81 ldd r17, Z+5 ; 0x05 + 796: 81 e0 ldi r24, 0x01 ; 1 + 798: 61 e0 ldi r22, 0x01 ; 1 + 79a: 40 e1 ldi r20, 0x10 ; 16 + 79c: 94 e0 ldi r25, 0x04 ; 4 + 79e: e9 2e mov r14, r25 + 7a0: 22 d2 rcall .+1092 ; 0xbe6 + DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_DOUBLE); + + /* Valid data found, return success */ + return SuccessfulConfigRead; + 7a2: 80 e0 ldi r24, 0x00 ; 0 + 7a4: 03 c0 rjmp .+6 ; 0x7ac + case HOST_GETCONFIG_Successful: + break; + case HOST_GETCONFIG_InvalidData: + return InvalidConfigDataReturned; + case HOST_GETCONFIG_BuffOverflow: + return DescriptorTooLarge; + 7a6: 82 e0 ldi r24, 0x02 ; 2 + 7a8: 01 c0 rjmp .+2 ; 0x7ac + { + if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, + DComp_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found) + { + /* Descriptor not found, error out */ + return NoCompatibleInterfaceFound; + 7aa: 84 e0 ldi r24, 0x04 ; 4 + Pipe_ConfigurePipe(AUDIO_DATA_IN_PIPE, EP_TYPE_ISOCHRONOUS, PIPE_TOKEN_IN, + DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_DOUBLE); + + /* Valid data found, return success */ + return SuccessfulConfigRead; +} + 7ac: cc 5f subi r28, 0xFC ; 252 + 7ae: dd 4f sbci r29, 0xFD ; 253 + 7b0: 0f b6 in r0, 0x3f ; 63 + 7b2: f8 94 cli + 7b4: de bf out 0x3e, r29 ; 62 + 7b6: 0f be out 0x3f, r0 ; 63 + 7b8: cd bf out 0x3d, r28 ; 61 + 7ba: cf 91 pop r28 + 7bc: df 91 pop r29 + 7be: 1f 91 pop r17 + 7c0: 0f 91 pop r16 + 7c2: ff 90 pop r15 + 7c4: ef 90 pop r14 + 7c6: df 90 pop r13 + 7c8: cf 90 pop r12 + 7ca: bf 90 pop r11 + 7cc: af 90 pop r10 + 7ce: 08 95 ret + USB_Descriptor_Interface_t* AudioControlInterface = NULL; + USB_Descriptor_Interface_t* AudioStreamingInterface = NULL; + USB_Descriptor_Endpoint_t* DataINEndpoint = NULL; + + /* Retrieve the entire configuration descriptor into the allocated buffer */ + switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData))) + 7d0: 90 2f mov r25, r16 + 7d2: 81 2f mov r24, r17 + 7d4: 9e cf rjmp .-196 ; 0x712 + +000007d6 : + * \return Boolean \c true if the bus is currently suspended, \c false otherwise. + */ + static inline bool USB_Host_IsBusSuspended(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline bool USB_Host_IsBusSuspended(void) + { + return ((UHCON & (1 << SOFEN)) ? false : true); + 7d6: 80 91 9e 00 lds r24, 0x009E + 7da: 90 e0 ldi r25, 0x00 ; 0 + 7dc: 81 70 andi r24, 0x01 ; 1 + 7de: 90 70 andi r25, 0x00 ; 0 + break; + case USB_INT_DCONNI: + UHIEN &= ~(1 << DCONNE); + break; + case USB_INT_DDISCI: + UHIEN &= ~(1 << DDISCE); + 7e0: 20 91 a0 00 lds r18, 0x00A0 + 7e4: 2d 7f andi r18, 0xFD ; 253 + 7e6: 20 93 a0 00 sts 0x00A0, r18 + * woken up automatically and the bus resumed after the reset has been correctly issued. + */ + static inline void USB_Host_ResetBus(void) ATTR_ALWAYS_INLINE; + static inline void USB_Host_ResetBus(void) + { + UHCON |= (1 << RESET); + 7ea: 20 91 9e 00 lds r18, 0x009E + 7ee: 22 60 ori r18, 0x02 ; 2 + 7f0: 20 93 9e 00 sts 0x009E, r18 + * \return Boolean \c true if no bus reset is currently being sent, \c false otherwise. + */ + static inline bool USB_Host_IsBusResetComplete(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline bool USB_Host_IsBusResetComplete(void) + { + return ((UHCON & (1 << RESET)) ? false : true); + 7f4: 20 91 9e 00 lds r18, 0x009E + bool BusSuspended = USB_Host_IsBusSuspended(); + + USB_INT_Disable(USB_INT_DDISCI); + + USB_Host_ResetBus(); + while (!(USB_Host_IsBusResetComplete())); + 7f8: 21 fd sbrc r18, 1 + 7fa: fc cf rjmp .-8 ; 0x7f4 + * host and attached device may occur. + */ + static inline void USB_Host_ResumeBus(void) ATTR_ALWAYS_INLINE; + static inline void USB_Host_ResumeBus(void) + { + UHCON |= (1 << SOFEN); + 7fc: 20 91 9e 00 lds r18, 0x009E + 800: 21 60 ori r18, 0x01 ; 1 + 802: 20 93 9e 00 sts 0x009E, r18 + case USB_INT_RXSTPI: + return (UEIENX & (1 << RXSTPE)); + #endif + #if defined(USB_CAN_BE_HOST) + case USB_INT_HSOFI: + return (UHIEN & (1 << HSOFE)); + 806: 20 91 a0 00 lds r18, 0x00A0 + 80a: 30 e0 ldi r19, 0x00 ; 0 + 80c: 20 72 andi r18, 0x20 ; 32 + 80e: 30 70 andi r19, 0x00 ; 0 + UEIENX &= ~(1 << RXSTPE); + break; + #endif + #if defined(USB_CAN_BE_HOST) + case USB_INT_HSOFI: + UHIEN &= ~(1 << HSOFE); + 810: 40 91 a0 00 lds r20, 0x00A0 + 814: 4f 7d andi r20, 0xDF ; 223 + 816: 40 93 a0 00 sts 0x00A0, r20 + UEINTX &= ~(1 << RXSTPI); + break; + #endif + #if defined(USB_CAN_BE_HOST) + case USB_INT_HSOFI: + UHINT &= ~(1 << HSOFI); + 81a: 40 91 9f 00 lds r20, 0x009F + 81e: 4f 7d andi r20, 0xDF ; 223 + 820: 40 93 9f 00 sts 0x009F, r20 + 824: 4a e0 ldi r20, 0x0A ; 10 + case USB_INT_RXSTPI: + return (UEINTX & (1 << RXSTPI)); + #endif + #if defined(USB_CAN_BE_HOST) + case USB_INT_HSOFI: + return (UHINT & (1 << HSOFI)); + 826: 50 91 9f 00 lds r21, 0x009F + /* Workaround for powerless-pull-up devices. After a USB bus reset, + all disconnection interrupts are suppressed while a USB frame is + looked for - if it is found within 10ms, the device is still + present. */ + + if (USB_INT_HasOccurred(USB_INT_HSOFI)) + 82a: 55 ff sbrs r21, 5 + 82c: 0b c0 rjmp .+22 ; 0x844 + UEINTX &= ~(1 << RXSTPI); + break; + #endif + #if defined(USB_CAN_BE_HOST) + case USB_INT_HSOFI: + UHINT &= ~(1 << HSOFI); + 82e: 40 91 9f 00 lds r20, 0x009F + 832: 4f 7d andi r20, 0xDF ; 223 + 834: 40 93 9f 00 sts 0x009F, r20 + break; + case USB_INT_DCONNI: + UHINT &= ~(1 << DCONNI); + break; + case USB_INT_DDISCI: + UHINT &= ~(1 << DDISCI); + 838: 40 91 9f 00 lds r20, 0x009F + 83c: 4d 7f andi r20, 0xFD ; 253 + 83e: 40 93 9f 00 sts 0x009F, r20 + 842: 08 c0 rjmp .+16 ; 0x854 + #else + //round up by default + __ticks_dc = (uint32_t)(ceil(fabs(__tmp))); + #endif + + __builtin_avr_delay_cycles(__ticks_dc); + 844: ef ec ldi r30, 0xCF ; 207 + 846: f7 e0 ldi r31, 0x07 ; 7 + 848: 31 97 sbiw r30, 0x01 ; 1 + 84a: f1 f7 brne .-4 ; 0x848 + 84c: 00 c0 rjmp .+0 ; 0x84e + 84e: 00 00 nop + 850: 41 50 subi r20, 0x01 ; 1 + bool HSOFIEnabled = USB_INT_IsEnabled(USB_INT_HSOFI); + + USB_INT_Disable(USB_INT_HSOFI); + USB_INT_Clear(USB_INT_HSOFI); + + for (uint8_t MSRem = 10; MSRem != 0; MSRem--) + 852: 49 f7 brne .-46 ; 0x826 + } + + Delay_MS(1); + } + + if (HSOFIEnabled) + 854: 21 15 cp r18, r1 + 856: 31 05 cpc r19, r1 + 858: 29 f0 breq .+10 ; 0x864 + UEIENX |= (1 << RXSTPE); + break; + #endif + #if defined(USB_CAN_BE_HOST) + case USB_INT_HSOFI: + UHIEN |= (1 << HSOFE); + 85a: 20 91 a0 00 lds r18, 0x00A0 + 85e: 20 62 ori r18, 0x20 ; 32 + 860: 20 93 a0 00 sts 0x00A0, r18 + USB_INT_Enable(USB_INT_HSOFI); + + if (BusSuspended) + 864: 00 97 sbiw r24, 0x00 ; 0 + 866: 29 f4 brne .+10 ; 0x872 + * messages to the device. + */ + static inline void USB_Host_SuspendBus(void) ATTR_ALWAYS_INLINE; + static inline void USB_Host_SuspendBus(void) + { + UHCON &= ~(1 << SOFEN); + 868: 80 91 9e 00 lds r24, 0x009E + 86c: 8e 7f andi r24, 0xFE ; 254 + 86e: 80 93 9e 00 sts 0x009E, r24 + break; + case USB_INT_DCONNI: + UHIEN |= (1 << DCONNE); + break; + case USB_INT_DDISCI: + UHIEN |= (1 << DDISCE); + 872: 80 91 a0 00 lds r24, 0x00A0 + 876: 82 60 ori r24, 0x02 ; 2 + 878: 80 93 a0 00 sts 0x00A0, r24 + USB_Host_SuspendBus(); + + USB_INT_Enable(USB_INT_DDISCI); +} + 87c: 08 95 ret + +0000087e : + * \return Boolean \c true if the bus is currently suspended, \c false otherwise. + */ + static inline bool USB_Host_IsBusSuspended(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline bool USB_Host_IsBusSuspended(void) + { + return ((UHCON & (1 << SOFEN)) ? false : true); + 87e: 40 91 9e 00 lds r20, 0x009E + 882: 50 e0 ldi r21, 0x00 ; 0 + 884: 41 70 andi r20, 0x01 ; 1 + 886: 50 70 andi r21, 0x00 ; 0 + case USB_INT_RXSTPI: + return (UEIENX & (1 << RXSTPE)); + #endif + #if defined(USB_CAN_BE_HOST) + case USB_INT_HSOFI: + return (UHIEN & (1 << HSOFE)); + 888: 20 91 a0 00 lds r18, 0x00A0 + 88c: 30 e0 ldi r19, 0x00 ; 0 + 88e: 20 72 andi r18, 0x20 ; 32 + 890: 30 70 andi r19, 0x00 ; 0 + UEIENX &= ~(1 << RXSTPE); + break; + #endif + #if defined(USB_CAN_BE_HOST) + case USB_INT_HSOFI: + UHIEN &= ~(1 << HSOFE); + 892: 90 91 a0 00 lds r25, 0x00A0 + 896: 9f 7d andi r25, 0xDF ; 223 + 898: 90 93 a0 00 sts 0x00A0, r25 + UEINTX &= ~(1 << RXSTPI); + break; + #endif + #if defined(USB_CAN_BE_HOST) + case USB_INT_HSOFI: + UHINT &= ~(1 << HSOFI); + 89c: 90 91 9f 00 lds r25, 0x009F + 8a0: 9f 7d andi r25, 0xDF ; 223 + 8a2: 90 93 9f 00 sts 0x009F, r25 + * host and attached device may occur. + */ + static inline void USB_Host_ResumeBus(void) ATTR_ALWAYS_INLINE; + static inline void USB_Host_ResumeBus(void) + { + UHCON |= (1 << SOFEN); + 8a6: 90 91 9e 00 lds r25, 0x009E + 8aa: 91 60 ori r25, 0x01 ; 1 + 8ac: 90 93 9e 00 sts 0x009E, r25 + USB_INT_Disable(USB_INT_HSOFI); + USB_INT_Clear(USB_INT_HSOFI); + + USB_Host_ResumeBus(); + + while (MS) + 8b0: 26 c0 rjmp .+76 ; 0x8fe + case USB_INT_RXSTPI: + return (UEINTX & (1 << RXSTPI)); + #endif + #if defined(USB_CAN_BE_HOST) + case USB_INT_HSOFI: + return (UHINT & (1 << HSOFI)); + 8b2: 90 91 9f 00 lds r25, 0x009F + { + if (USB_INT_HasOccurred(USB_INT_HSOFI)) + 8b6: 95 ff sbrs r25, 5 + 8b8: 06 c0 rjmp .+12 ; 0x8c6 + UEINTX &= ~(1 << RXSTPI); + break; + #endif + #if defined(USB_CAN_BE_HOST) + case USB_INT_HSOFI: + UHINT &= ~(1 << HSOFI); + 8ba: 90 91 9f 00 lds r25, 0x009F + 8be: 9f 7d andi r25, 0xDF ; 223 + 8c0: 90 93 9f 00 sts 0x009F, r25 + { + USB_INT_Clear(USB_INT_HSOFI); + MS--; + 8c4: 81 50 subi r24, 0x01 ; 1 + } + + if ((USB_HostState == HOST_STATE_Unattached) || (USB_CurrentMode != USB_MODE_Host)) + 8c6: 90 91 2b 01 lds r25, 0x012B + 8ca: 92 30 cpi r25, 0x02 ; 2 + 8cc: d9 f0 breq .+54 ; 0x904 + * \return Boolean \c true if an error has occurred on the selected pipe, \c false otherwise. + */ + static inline bool Pipe_IsError(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline bool Pipe_IsError(void) + { + return ((UPINTX & (1 << PERRI)) ? true : false); + 8ce: 90 91 a6 00 lds r25, 0x00A6 + ErrorCode = HOST_WAITERROR_DeviceDisconnect; + + break; + } + + if (Pipe_IsError() == true) + 8d2: 94 ff sbrs r25, 4 + 8d4: 09 c0 rjmp .+18 ; 0x8e8 + + /** Clears the error flags for the currently selected pipe. */ + static inline void Pipe_ClearError(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_ClearError(void) + { + UPERRX = 0; + 8d6: 10 92 f5 00 sts 0x00F5, r1 + UPINTX &= ~(1 << PERRI); + 8da: 80 91 a6 00 lds r24, 0x00A6 + 8de: 8f 7e andi r24, 0xEF ; 239 + 8e0: 80 93 a6 00 sts 0x00A6, r24 + { + Pipe_ClearError(); + ErrorCode = HOST_WAITERROR_PipeError; + 8e4: 82 e0 ldi r24, 0x02 ; 2 + + break; + 8e6: 0f c0 rjmp .+30 ; 0x906 + * \return Boolean \c true if the current pipe has been stalled by the attached device, \c false otherwise. + */ + static inline bool Pipe_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline bool Pipe_IsStalled(void) + { + return ((UPINTX & (1 << RXSTALLI)) ? true : false); + 8e8: 90 91 a6 00 lds r25, 0x00A6 + } + + if (Pipe_IsStalled() == true) + 8ec: 91 ff sbrs r25, 1 + 8ee: 07 c0 rjmp .+14 ; 0x8fe + * \ingroup Group_PipePacketManagement_AVR8 + */ + static inline void Pipe_ClearStall(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_ClearStall(void) + { + UPINTX &= ~(1 << RXSTALLI); + 8f0: 80 91 a6 00 lds r24, 0x00A6 + 8f4: 8d 7f andi r24, 0xFD ; 253 + 8f6: 80 93 a6 00 sts 0x00A6, r24 + { + Pipe_ClearStall(); + ErrorCode = HOST_WAITERROR_SetupStalled; + 8fa: 83 e0 ldi r24, 0x03 ; 3 + + break; + 8fc: 04 c0 rjmp .+8 ; 0x906 + USB_INT_Disable(USB_INT_HSOFI); + USB_INT_Clear(USB_INT_HSOFI); + + USB_Host_ResumeBus(); + + while (MS) + 8fe: 88 23 and r24, r24 + 900: c1 f6 brne .-80 ; 0x8b2 + 902: 01 c0 rjmp .+2 ; 0x906 + MS--; + } + + if ((USB_HostState == HOST_STATE_Unattached) || (USB_CurrentMode != USB_MODE_Host)) + { + ErrorCode = HOST_WAITERROR_DeviceDisconnect; + 904: 81 e0 ldi r24, 0x01 ; 1 + + break; + } + } + + if (BusSuspended) + 906: 41 15 cp r20, r1 + 908: 51 05 cpc r21, r1 + 90a: 29 f4 brne .+10 ; 0x916 + * messages to the device. + */ + static inline void USB_Host_SuspendBus(void) ATTR_ALWAYS_INLINE; + static inline void USB_Host_SuspendBus(void) + { + UHCON &= ~(1 << SOFEN); + 90c: 90 91 9e 00 lds r25, 0x009E + 910: 9e 7f andi r25, 0xFE ; 254 + 912: 90 93 9e 00 sts 0x009E, r25 + USB_Host_SuspendBus(); + + if (HSOFIEnabled) + 916: 21 15 cp r18, r1 + 918: 31 05 cpc r19, r1 + 91a: 29 f0 breq .+10 ; 0x926 + UEIENX |= (1 << RXSTPE); + break; + #endif + #if defined(USB_CAN_BE_HOST) + case USB_INT_HSOFI: + UHIEN |= (1 << HSOFE); + 91c: 90 91 a0 00 lds r25, 0x00A0 + 920: 90 62 ori r25, 0x20 ; 32 + 922: 90 93 a0 00 sts 0x00A0, r25 + USB_INT_Enable(USB_INT_HSOFI); + + return ErrorCode; +} + 926: 08 95 ret + +00000928 : + +#define __INCLUDE_FROM_HOST_C +#include "../Host.h" + +void USB_Host_ProcessNextHostState(void) +{ + 928: ef 92 push r14 + 92a: 0f 93 push r16 + 92c: 1f 93 push r17 + 92e: df 93 push r29 + 930: cf 93 push r28 + 932: cd b7 in r28, 0x3d ; 61 + 934: de b7 in r29, 0x3e ; 62 + 936: 28 97 sbiw r28, 0x08 ; 8 + 938: 0f b6 in r0, 0x3f ; 63 + 93a: f8 94 cli + 93c: de bf out 0x3e, r29 ; 62 + 93e: 0f be out 0x3f, r0 ; 63 + 940: cd bf out 0x3d, r28 ; 61 + uint8_t SubErrorCode = HOST_ENUMERROR_NoError; + + static uint16_t WaitMSRemaining; + static uint8_t PostWaitState; + + switch (USB_HostState) + 942: 80 91 2b 01 lds r24, 0x012B + 946: 86 30 cpi r24, 0x06 ; 6 + 948: 09 f4 brne .+2 ; 0x94c + 94a: 99 c0 rjmp .+306 ; 0xa7e + 94c: 87 30 cpi r24, 0x07 ; 7 + 94e: 70 f4 brcc .+28 ; 0x96c + 950: 83 30 cpi r24, 0x03 ; 3 + 952: c9 f1 breq .+114 ; 0x9c6 + 954: 84 30 cpi r24, 0x04 ; 4 + 956: 20 f4 brcc .+8 ; 0x960 + 958: 81 30 cpi r24, 0x01 ; 1 + 95a: 09 f0 breq .+2 ; 0x95e + 95c: 0b c1 rjmp .+534 ; 0xb74 + 95e: 13 c0 rjmp .+38 ; 0x986 + 960: 84 30 cpi r24, 0x04 ; 4 + 962: c9 f1 breq .+114 ; 0x9d6 + 964: 85 30 cpi r24, 0x05 ; 5 + 966: 09 f0 breq .+2 ; 0x96a + 968: 05 c1 rjmp .+522 ; 0xb74 + 96a: 60 c0 rjmp .+192 ; 0xa2c + 96c: 88 30 cpi r24, 0x08 ; 8 + 96e: 09 f4 brne .+2 ; 0x972 + 970: a0 c0 rjmp .+320 ; 0xab2 + 972: 88 30 cpi r24, 0x08 ; 8 + 974: 08 f4 brcc .+2 ; 0x978 + 976: 8f c0 rjmp .+286 ; 0xa96 + 978: 89 30 cpi r24, 0x09 ; 9 + 97a: 09 f4 brne .+2 ; 0x97e + 97c: b9 c0 rjmp .+370 ; 0xaf0 + 97e: 8a 30 cpi r24, 0x0A ; 10 + 980: 09 f0 breq .+2 ; 0x984 + 982: f8 c0 rjmp .+496 ; 0xb74 + 984: de c0 rjmp .+444 ; 0xb42 + { + case HOST_STATE_WaitForDevice: + if (WaitMSRemaining) + 986: 00 91 20 01 lds r16, 0x0120 + 98a: 10 91 21 01 lds r17, 0x0121 + 98e: 01 15 cp r16, r1 + 990: 11 05 cpc r17, r1 + 992: 09 f4 brne .+2 ; 0x996 + 994: ef c0 rjmp .+478 ; 0xb74 + { + if ((SubErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful) + 996: 81 e0 ldi r24, 0x01 ; 1 + 998: 72 df rcall .-284 ; 0x87e + 99a: 68 2f mov r22, r24 + 99c: 88 23 and r24, r24 + 99e: 31 f0 breq .+12 ; 0x9ac + { + USB_HostState = PostWaitState; + 9a0: 80 91 1f 01 lds r24, 0x011F + 9a4: 80 93 2b 01 sts 0x012B, r24 + ErrorCode = HOST_ENUMERROR_WaitStage; + 9a8: 81 e0 ldi r24, 0x01 ; 1 + break; + 9aa: e0 c0 rjmp .+448 ; 0xb6c + } + + if (!(--WaitMSRemaining)) + 9ac: 01 50 subi r16, 0x01 ; 1 + 9ae: 10 40 sbci r17, 0x00 ; 0 + 9b0: 10 93 21 01 sts 0x0121, r17 + 9b4: 00 93 20 01 sts 0x0120, r16 + 9b8: 01 15 cp r16, r1 + 9ba: 11 05 cpc r17, r1 + 9bc: 09 f0 breq .+2 ; 0x9c0 + 9be: da c0 rjmp .+436 ; 0xb74 + USB_HostState = PostWaitState; + 9c0: 80 91 1f 01 lds r24, 0x011F + 9c4: c3 c0 rjmp .+390 ; 0xb4c + } + + break; + case HOST_STATE_Powered: + WaitMSRemaining = HOST_DEVICE_SETTLE_DELAY_MS; + 9c6: 88 ee ldi r24, 0xE8 ; 232 + 9c8: 93 e0 ldi r25, 0x03 ; 3 + 9ca: 90 93 21 01 sts 0x0121, r25 + 9ce: 80 93 20 01 sts 0x0120, r24 + + USB_HostState = HOST_STATE_Powered_WaitForDeviceSettle; + 9d2: 84 e0 ldi r24, 0x04 ; 4 + 9d4: bb c0 rjmp .+374 ; 0xb4c + break; + case HOST_STATE_Powered_WaitForDeviceSettle: + if (WaitMSRemaining--) + 9d6: 80 91 20 01 lds r24, 0x0120 + 9da: 90 91 21 01 lds r25, 0x0121 + 9de: 9c 01 movw r18, r24 + 9e0: 21 50 subi r18, 0x01 ; 1 + 9e2: 30 40 sbci r19, 0x00 ; 0 + 9e4: 30 93 21 01 sts 0x0121, r19 + 9e8: 20 93 20 01 sts 0x0120, r18 + 9ec: 00 97 sbiw r24, 0x00 ; 0 + 9ee: 39 f0 breq .+14 ; 0x9fe + 9f0: 8f ec ldi r24, 0xCF ; 207 + 9f2: 97 e0 ldi r25, 0x07 ; 7 + 9f4: 01 97 sbiw r24, 0x01 ; 1 + 9f6: f1 f7 brne .-4 ; 0x9f4 + 9f8: 00 c0 rjmp .+0 ; 0x9fa + 9fa: 00 00 nop + 9fc: bb c0 rjmp .+374 ; 0xb74 + } + + static inline void USB_Host_VBUS_Manual_Off(void) ATTR_ALWAYS_INLINE; + static inline void USB_Host_VBUS_Manual_Off(void) + { + PORTE &= ~(1 << 7); + 9fe: 77 98 cbi 0x0e, 7 ; 14 + + #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) + static inline void USB_OTGPAD_On(void) ATTR_ALWAYS_INLINE; + static inline void USB_OTGPAD_On(void) + { + USBCON |= (1 << OTGPADE); + a00: 80 91 d8 00 lds r24, 0x00D8 + a04: 80 61 ori r24, 0x10 ; 16 + a06: 80 93 d8 00 sts 0x00D8, r24 + } + + static inline void USB_Host_VBUS_Auto_Enable(void) ATTR_ALWAYS_INLINE; + static inline void USB_Host_VBUS_Auto_Enable(void) + { + OTGCON &= ~(1 << VBUSHWC); + a0a: 80 91 dd 00 lds r24, 0x00DD + a0e: 8b 7f andi r24, 0xFB ; 251 + a10: 80 93 dd 00 sts 0x00DD, r24 + UHWCON |= (1 << UVCONE); + a14: 80 91 d7 00 lds r24, 0x00D7 + a18: 80 61 ori r24, 0x10 ; 16 + a1a: 80 93 d7 00 sts 0x00D7, r24 + } + + static inline void USB_Host_VBUS_Auto_On(void) ATTR_ALWAYS_INLINE; + static inline void USB_Host_VBUS_Auto_On(void) + { + OTGCON |= (1 << VBUSREQ); + a1e: 80 91 dd 00 lds r24, 0x00DD + a22: 82 60 ori r24, 0x02 ; 2 + a24: 80 93 dd 00 sts 0x00DD, r24 + + USB_OTGPAD_On(); + USB_Host_VBUS_Auto_Enable(); + USB_Host_VBUS_Auto_On(); + + USB_HostState = HOST_STATE_Powered_WaitForConnect; + a28: 85 e0 ldi r24, 0x05 ; 5 + a2a: 90 c0 rjmp .+288 ; 0xb4c + #endif + #if defined(USB_CAN_BE_HOST) + case USB_INT_HSOFI: + return (UHINT & (1 << HSOFI)); + case USB_INT_DCONNI: + return (UHINT & (1 << DCONNI)); + a2c: 80 91 9f 00 lds r24, 0x009F + } + + break; + case HOST_STATE_Powered_WaitForConnect: + if (USB_INT_HasOccurred(USB_INT_DCONNI)) + a30: 80 ff sbrs r24, 0 + a32: a0 c0 rjmp .+320 ; 0xb74 + #if defined(USB_CAN_BE_HOST) + case USB_INT_HSOFI: + UHINT &= ~(1 << HSOFI); + break; + case USB_INT_DCONNI: + UHINT &= ~(1 << DCONNI); + a34: 80 91 9f 00 lds r24, 0x009F + a38: 8e 7f andi r24, 0xFE ; 254 + a3a: 80 93 9f 00 sts 0x009F, r24 + break; + case USB_INT_DDISCI: + UHINT &= ~(1 << DDISCI); + a3e: 80 91 9f 00 lds r24, 0x009F + a42: 8d 7f andi r24, 0xFD ; 253 + a44: 80 93 9f 00 sts 0x009F, r24 + break; + case USB_INT_BCERRI: + OTGINT &= ~(1 << BCERRI); + break; + case USB_INT_VBERRI: + OTGINT &= ~(1 << VBERRI); + a48: 80 91 df 00 lds r24, 0x00DF + a4c: 8d 7f andi r24, 0xFD ; 253 + a4e: 80 93 df 00 sts 0x00DF, r24 + break; + case USB_INT_BCERRI: + OTGIEN |= (1 << BCERRE); + break; + case USB_INT_VBERRI: + OTGIEN |= (1 << VBERRE); + a52: 80 91 de 00 lds r24, 0x00DE + a56: 82 60 ori r24, 0x02 ; 2 + a58: 80 93 de 00 sts 0x00DE, r24 + * host and attached device may occur. + */ + static inline void USB_Host_ResumeBus(void) ATTR_ALWAYS_INLINE; + static inline void USB_Host_ResumeBus(void) + { + UHCON |= (1 << SOFEN); + a5c: 80 91 9e 00 lds r24, 0x009E + a60: 81 60 ori r24, 0x01 ; 1 + a62: 80 93 9e 00 sts 0x009E, r24 + + USB_INT_Clear(USB_INT_VBERRI); + USB_INT_Enable(USB_INT_VBERRI); + + USB_Host_ResumeBus(); + Pipe_ClearPipes(); + a66: 26 d1 rcall .+588 ; 0xcb4 + + HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Powered_DoReset); + a68: 81 e0 ldi r24, 0x01 ; 1 + a6a: 80 93 2b 01 sts 0x012B, r24 + a6e: 84 e6 ldi r24, 0x64 ; 100 + a70: 90 e0 ldi r25, 0x00 ; 0 + a72: 90 93 21 01 sts 0x0121, r25 + a76: 80 93 20 01 sts 0x0120, r24 + a7a: 86 e0 ldi r24, 0x06 ; 6 + a7c: 5f c0 rjmp .+190 ; 0xb3c + } + + break; + case HOST_STATE_Powered_DoReset: + USB_Host_ResetDevice(); + a7e: ab de rcall .-682 ; 0x7d6 + + HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Powered_ConfigPipe); + a80: 81 e0 ldi r24, 0x01 ; 1 + a82: 80 93 2b 01 sts 0x012B, r24 + a86: 88 ec ldi r24, 0xC8 ; 200 + a88: 90 e0 ldi r25, 0x00 ; 0 + a8a: 90 93 21 01 sts 0x0121, r25 + a8e: 80 93 20 01 sts 0x0120, r24 + a92: 87 e0 ldi r24, 0x07 ; 7 + a94: 53 c0 rjmp .+166 ; 0xb3c + break; + case HOST_STATE_Powered_ConfigPipe: + Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL, + a96: 80 e0 ldi r24, 0x00 ; 0 + a98: 60 e0 ldi r22, 0x00 ; 0 + a9a: 40 e0 ldi r20, 0x00 ; 0 + a9c: 20 e0 ldi r18, 0x00 ; 0 + a9e: 00 e4 ldi r16, 0x40 ; 64 + aa0: 10 e0 ldi r17, 0x00 ; 0 + aa2: ee 24 eor r14, r14 + aa4: a0 d0 rcall .+320 ; 0xbe6 + * \return Boolean \c true if the selected pipe is configured, \c false otherwise. + */ + static inline bool Pipe_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline bool Pipe_IsConfigured(void) + { + return ((UPSTAX & (1 << CFGOK)) ? true : false); + aa6: 80 91 ac 00 lds r24, 0x00AC + PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP, + PIPE_CONTROLPIPE_DEFAULT_SIZE, PIPE_BANK_SINGLE); + + if (!(Pipe_IsConfigured())) + aaa: 87 ff sbrs r24, 7 + aac: 5b c0 rjmp .+182 ; 0xb64 + ErrorCode = HOST_ENUMERROR_PipeConfigError; + SubErrorCode = 0; + break; + } + + USB_HostState = HOST_STATE_Default; + aae: 88 e0 ldi r24, 0x08 ; 8 + ab0: 4d c0 rjmp .+154 ; 0xb4c + break; + case HOST_STATE_Default: + USB_ControlRequest = (USB_Request_Header_t) + ab2: a3 e2 ldi r26, 0x23 ; 35 + ab4: b1 e0 ldi r27, 0x01 ; 1 + ab6: e3 e1 ldi r30, 0x13 ; 19 + ab8: f1 e0 ldi r31, 0x01 ; 1 + aba: 88 e0 ldi r24, 0x08 ; 8 + abc: 01 90 ld r0, Z+ + abe: 0d 92 st X+, r0 + ac0: 81 50 subi r24, 0x01 ; 1 + ac2: e1 f7 brne .-8 ; 0xabc + .wLength = 8, + }; + + uint8_t DataBuffer[8]; + + if ((SubErrorCode = USB_Host_SendControlRequest(DataBuffer)) != HOST_SENDCONTROL_Successful) + ac4: ce 01 movw r24, r28 + ac6: 01 96 adiw r24, 0x01 ; 1 + ac8: dc d2 rcall .+1464 ; 0x1082 + aca: 68 2f mov r22, r24 + acc: 88 23 and r24, r24 + ace: 09 f0 breq .+2 ; 0xad2 + ad0: 4c c0 rjmp .+152 ; 0xb6a + { + ErrorCode = HOST_ENUMERROR_ControlError; + break; + } + + USB_ControlPipeSize = DataBuffer[offsetof(USB_Descriptor_Device_t, Endpoint0Size)]; + ad2: 88 85 ldd r24, Y+8 ; 0x08 + ad4: 80 93 1b 01 sts 0x011B, r24 + + USB_Host_ResetDevice(); + ad8: 7e de rcall .-772 ; 0x7d6 + + HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Default_PostReset); + ada: 81 e0 ldi r24, 0x01 ; 1 + adc: 80 93 2b 01 sts 0x012B, r24 + ae0: 88 ec ldi r24, 0xC8 ; 200 + ae2: 90 e0 ldi r25, 0x00 ; 0 + ae4: 90 93 21 01 sts 0x0121, r25 + ae8: 80 93 20 01 sts 0x0120, r24 + aec: 89 e0 ldi r24, 0x09 ; 9 + aee: 26 c0 rjmp .+76 ; 0xb3c + break; + case HOST_STATE_Default_PostReset: + Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL, + af0: 00 91 1b 01 lds r16, 0x011B + af4: 80 e0 ldi r24, 0x00 ; 0 + af6: 60 e0 ldi r22, 0x00 ; 0 + af8: 40 e0 ldi r20, 0x00 ; 0 + afa: 20 e0 ldi r18, 0x00 ; 0 + afc: 10 e0 ldi r17, 0x00 ; 0 + afe: ee 24 eor r14, r14 + b00: 72 d0 rcall .+228 ; 0xbe6 + b02: 80 91 ac 00 lds r24, 0x00AC + PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP, + USB_ControlPipeSize, PIPE_BANK_SINGLE); + + if (!(Pipe_IsConfigured())) + b06: 87 ff sbrs r24, 7 + b08: 2d c0 rjmp .+90 ; 0xb64 + ErrorCode = HOST_ENUMERROR_PipeConfigError; + SubErrorCode = 0; + break; + } + + USB_ControlRequest = (USB_Request_Header_t) + b0a: a3 e2 ldi r26, 0x23 ; 35 + b0c: b1 e0 ldi r27, 0x01 ; 1 + b0e: eb e0 ldi r30, 0x0B ; 11 + b10: f1 e0 ldi r31, 0x01 ; 1 + b12: 88 e0 ldi r24, 0x08 ; 8 + b14: 01 90 ld r0, Z+ + b16: 0d 92 st X+, r0 + b18: 81 50 subi r24, 0x01 ; 1 + b1a: e1 f7 brne .-8 ; 0xb14 + .wValue = USB_HOST_DEVICEADDRESS, + .wIndex = 0, + .wLength = 0, + }; + + if ((SubErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) + b1c: 80 e0 ldi r24, 0x00 ; 0 + b1e: 90 e0 ldi r25, 0x00 ; 0 + b20: b0 d2 rcall .+1376 ; 0x1082 + b22: 68 2f mov r22, r24 + b24: 88 23 and r24, r24 + b26: 09 f5 brne .+66 ; 0xb6a + { + ErrorCode = HOST_ENUMERROR_ControlError; + break; + } + + HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Default_PostAddressSet); + b28: 81 e0 ldi r24, 0x01 ; 1 + b2a: 80 93 2b 01 sts 0x012B, r24 + b2e: 84 e6 ldi r24, 0x64 ; 100 + b30: 90 e0 ldi r25, 0x00 ; 0 + b32: 90 93 21 01 sts 0x0121, r25 + b36: 80 93 20 01 sts 0x0120, r24 + b3a: 8a e0 ldi r24, 0x0A ; 10 + b3c: 80 93 1f 01 sts 0x011F, r24 + break; + b40: 19 c0 rjmp .+50 ; 0xb74 + } + + static inline void USB_Host_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; + static inline void USB_Host_SetDeviceAddress(const uint8_t Address) + { + UHADDR = (Address & 0x7F); + b42: 81 e0 ldi r24, 0x01 ; 1 + b44: 80 93 a1 00 sts 0x00A1, r24 + case HOST_STATE_Default_PostAddressSet: + USB_Host_SetDeviceAddress(USB_HOST_DEVICEADDRESS); + + EVENT_USB_Host_DeviceEnumerationComplete(); + b48: 24 dc rcall .-1976 ; 0x392 + USB_HostState = HOST_STATE_Addressed; + b4a: 8b e0 ldi r24, 0x0B ; 11 + b4c: 80 93 2b 01 sts 0x012B, r24 + break; + b50: 11 c0 rjmp .+34 ; 0xb74 + } + + if ((ErrorCode != HOST_ENUMERROR_NoError) && (USB_HostState != HOST_STATE_Unattached)) + { + EVENT_USB_Host_DeviceEnumerationFailed(ErrorCode, SubErrorCode); + b52: 40 dc rcall .-1920 ; 0x3d4 + } + + static inline void USB_Host_VBUS_Auto_Off(void) ATTR_ALWAYS_INLINE; + static inline void USB_Host_VBUS_Auto_Off(void) + { + OTGCON |= (1 << VBUSRQC); + b54: 80 91 dd 00 lds r24, 0x00DD + b58: 81 60 ori r24, 0x01 ; 1 + b5a: 80 93 dd 00 sts 0x00DD, r24 + + USB_Host_VBUS_Auto_Off(); + + EVENT_USB_Host_DeviceUnattached(); + b5e: 14 dc rcall .-2008 ; 0x388 + + USB_ResetInterface(); + b60: d5 d0 rcall .+426 ; 0xd0c + b62: 08 c0 rjmp .+16 ; 0xb74 + USB_ControlPipeSize, PIPE_BANK_SINGLE); + + if (!(Pipe_IsConfigured())) + { + ErrorCode = HOST_ENUMERROR_PipeConfigError; + SubErrorCode = 0; + b64: 60 e0 ldi r22, 0x00 ; 0 + PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP, + USB_ControlPipeSize, PIPE_BANK_SINGLE); + + if (!(Pipe_IsConfigured())) + { + ErrorCode = HOST_ENUMERROR_PipeConfigError; + b66: 84 e0 ldi r24, 0x04 ; 4 + b68: 01 c0 rjmp .+2 ; 0xb6c + .wLength = 0, + }; + + if ((SubErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) + { + ErrorCode = HOST_ENUMERROR_ControlError; + b6a: 83 e0 ldi r24, 0x03 ; 3 + EVENT_USB_Host_DeviceEnumerationComplete(); + USB_HostState = HOST_STATE_Addressed; + break; + } + + if ((ErrorCode != HOST_ENUMERROR_NoError) && (USB_HostState != HOST_STATE_Unattached)) + b6c: 90 91 2b 01 lds r25, 0x012B + b70: 92 30 cpi r25, 0x02 ; 2 + b72: 79 f7 brne .-34 ; 0xb52 + + EVENT_USB_Host_DeviceUnattached(); + + USB_ResetInterface(); + } +} + b74: 28 96 adiw r28, 0x08 ; 8 + b76: 0f b6 in r0, 0x3f ; 63 + b78: f8 94 cli + b7a: de bf out 0x3e, r29 ; 62 + b7c: 0f be out 0x3f, r0 ; 63 + b7e: cd bf out 0x3d, r28 ; 61 + b80: cf 91 pop r28 + b82: df 91 pop r29 + b84: 1f 91 pop r17 + b86: 0f 91 pop r16 + b88: ef 90 pop r14 + b8a: 08 95 ret + +00000b8c : + USB_INT_Enable(USB_INT_DDISCI); +} + +uint8_t USB_Host_SetDeviceConfiguration(const uint8_t ConfigNumber) +{ + USB_ControlRequest = (USB_Request_Header_t) + b8c: 10 92 23 01 sts 0x0123, r1 + b90: 99 e0 ldi r25, 0x09 ; 9 + b92: 90 93 24 01 sts 0x0124, r25 + b96: 80 93 25 01 sts 0x0125, r24 + b9a: 10 92 26 01 sts 0x0126, r1 + b9e: 10 92 28 01 sts 0x0128, r1 + ba2: 10 92 27 01 sts 0x0127, r1 + ba6: 10 92 2a 01 sts 0x012A, r1 + baa: 10 92 29 01 sts 0x0129, r1 + * \param[in] PipeNumber Index of the pipe to select. + */ + static inline void Pipe_SelectPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE; + static inline void Pipe_SelectPipe(const uint8_t PipeNumber) + { + UPNUM = PipeNumber; + bae: 10 92 a7 00 sts 0x00A7, r1 + .wLength = 0, + }; + + Pipe_SelectPipe(PIPE_CONTROLPIPE); + + return USB_Host_SendControlRequest(NULL); + bb2: 80 e0 ldi r24, 0x00 ; 0 + bb4: 90 e0 ldi r25, 0x00 ; 0 +} + bb6: 65 c2 rjmp .+1226 ; 0x1082 + +00000bb8 : +} + +uint8_t USB_Host_SetInterfaceAltSetting(const uint8_t InterfaceNum, + const uint8_t AltSetting) +{ + USB_ControlRequest = (USB_Request_Header_t) + bb8: e3 e2 ldi r30, 0x23 ; 35 + bba: f1 e0 ldi r31, 0x01 ; 1 + bbc: 91 e0 ldi r25, 0x01 ; 1 + bbe: 90 93 23 01 sts 0x0123, r25 + bc2: 9b e0 ldi r25, 0x0B ; 11 + bc4: 90 93 24 01 sts 0x0124, r25 + bc8: 60 93 25 01 sts 0x0125, r22 + bcc: 13 82 std Z+3, r1 ; 0x03 + bce: 80 93 27 01 sts 0x0127, r24 + bd2: 15 82 std Z+5, r1 ; 0x05 + bd4: 10 92 2a 01 sts 0x012A, r1 + bd8: 10 92 29 01 sts 0x0129, r1 + bdc: 10 92 a7 00 sts 0x00A7, r1 + .wLength = 0, + }; + + Pipe_SelectPipe(PIPE_CONTROLPIPE); + + return USB_Host_SendControlRequest(NULL); + be0: 80 e0 ldi r24, 0x00 ; 0 + be2: 90 e0 ldi r25, 0x00 ; 0 +} + be4: 4e c2 rjmp .+1180 ; 0x1082 + +00000be6 : + const uint8_t Type, + const uint8_t Token, + const uint8_t EndpointNumber, + const uint16_t Size, + const uint8_t Banks) +{ + be6: ef 92 push r14 + be8: 0f 93 push r16 + bea: 1f 93 push r17 + bec: 5e 2d mov r21, r14 + + Pipe_SelectPipe(PNum); + + if (PNum == Number) + { + UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0)); + bee: 62 95 swap r22 + bf0: 66 0f add r22, r22 + bf2: 66 0f add r22, r22 + bf4: 60 7c andi r22, 0xC0 ; 192 + bf6: 64 2b or r22, r20 + bf8: 2f 70 andi r18, 0x0F ; 15 + bfa: 62 2b or r22, r18 + + Pipe_SetInfiniteINRequests(); + + return Pipe_IsConfigured(); +#else + for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++) + bfc: 98 2f mov r25, r24 + Pipe_SelectPipe(PNum); + + if (PNum == Number) + { + UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0)); + UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size)); + bfe: 52 60 ori r21, 0x02 ; 2 + + Pipe_SetInfiniteINRequests(); + + return Pipe_IsConfigured(); +#else + for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++) + c00: 4d c0 rjmp .+154 ; 0xc9c + * \param[in] PipeNumber Index of the pipe to select. + */ + static inline void Pipe_SelectPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE; + static inline void Pipe_SelectPipe(const uint8_t PipeNumber) + { + UPNUM = PipeNumber; + c02: 90 93 a7 00 sts 0x00A7, r25 + uint8_t UPINRQXTemp; + uint8_t UPIENXTemp; + + Pipe_SelectPipe(PNum); + + if (PNum == Number) + c06: 98 17 cp r25, r24 + c08: b1 f4 brne .+44 ; 0xc36 + c0a: 28 e0 ldi r18, 0x08 ; 8 + c0c: 30 e0 ldi r19, 0x00 ; 0 + c0e: 40 e0 ldi r20, 0x00 ; 0 + c10: 03 c0 rjmp .+6 ; 0xc18 + uint8_t MaskVal = 0; + uint16_t CheckBytes = 8; + + while ((CheckBytes < Bytes) && (CheckBytes < PIPE_MAX_SIZE)) + { + MaskVal++; + c12: 4f 5f subi r20, 0xFF ; 255 + CheckBytes <<= 1; + c14: 22 0f add r18, r18 + c16: 33 1f adc r19, r19 + static inline uint8_t Pipe_BytesToEPSizeMask(const uint16_t Bytes) + { + uint8_t MaskVal = 0; + uint16_t CheckBytes = 8; + + while ((CheckBytes < Bytes) && (CheckBytes < PIPE_MAX_SIZE)) + c18: 20 17 cp r18, r16 + c1a: 31 07 cpc r19, r17 + c1c: 10 f4 brcc .+4 ; 0xc22 + c1e: 45 30 cpi r20, 0x05 ; 5 + c20: c1 f7 brne .-16 ; 0xc12 + { + MaskVal++; + CheckBytes <<= 1; + } + + return (MaskVal << EPSIZE0); + c22: 24 2f mov r18, r20 + c24: 22 95 swap r18 + c26: 20 7f andi r18, 0xF0 ; 240 + { + UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0)); + UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size)); + c28: 25 2b or r18, r21 + + Pipe_SelectPipe(PNum); + + if (PNum == Number) + { + UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0)); + c2a: a6 2f mov r26, r22 + UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size)); + UPCFG2XTemp = 0; + UPCONXTemp = ((1 << PEN) | (1 << INMODE)); + UPINRQXTemp = 0; + UPIENXTemp = 0; + c2c: 40 e0 ldi r20, 0x00 ; 0 + { + UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0)); + UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size)); + UPCFG2XTemp = 0; + UPCONXTemp = ((1 << PEN) | (1 << INMODE)); + UPINRQXTemp = 0; + c2e: 70 e0 ldi r23, 0x00 ; 0 + if (PNum == Number) + { + UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0)); + UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size)); + UPCFG2XTemp = 0; + UPCONXTemp = ((1 << PEN) | (1 << INMODE)); + c30: e1 e2 ldi r30, 0x21 ; 33 + + if (PNum == Number) + { + UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0)); + UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size)); + UPCFG2XTemp = 0; + c32: f0 e0 ldi r31, 0x00 ; 0 + c34: 0c c0 rjmp .+24 ; 0xc4e + UPINRQXTemp = 0; + UPIENXTemp = 0; + } + else + { + UPCFG0XTemp = UPCFG0X; + c36: a0 91 aa 00 lds r26, 0x00AA + UPCFG1XTemp = UPCFG1X; + c3a: 20 91 ab 00 lds r18, 0x00AB + UPCFG2XTemp = UPCFG2X; + c3e: f0 91 ad 00 lds r31, 0x00AD + UPCONXTemp = UPCONX; + c42: e0 91 a9 00 lds r30, 0x00A9 + UPINRQXTemp = UPINRQX; + c46: 70 91 a5 00 lds r23, 0x00A5 + UPIENXTemp = UPIENX; + c4a: 40 91 ae 00 lds r20, 0x00AE + + /** Configures the currently selected pipe to allow for an unlimited number of IN requests. */ + static inline void Pipe_SetInfiniteINRequests(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_SetInfiniteINRequests(void) + { + UPCONX |= (1 << INMODE); + c4e: 30 91 a9 00 lds r19, 0x00A9 + c52: 30 62 ori r19, 0x20 ; 32 + c54: 30 93 a9 00 sts 0x00A9, r19 + } + + Pipe_SetInfiniteINRequests(); + + if (!(UPCFG1XTemp & (1 << ALLOC))) + c58: 21 ff sbrs r18, 1 + c5a: 1f c0 rjmp .+62 ; 0xc9a + * from an attached device. + */ + static inline void Pipe_DisablePipe(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_DisablePipe(void) + { + UPCONX &= ~(1 << PEN); + c5c: 30 91 a9 00 lds r19, 0x00A9 + c60: 3e 7f andi r19, 0xFE ; 254 + c62: 30 93 a9 00 sts 0x00A9, r19 + continue; + + Pipe_DisablePipe(); + UPCFG1X &= (1 << ALLOC); + c66: 30 91 ab 00 lds r19, 0x00AB + c6a: 32 70 andi r19, 0x02 ; 2 + c6c: 30 93 ab 00 sts 0x00AB, r19 + * \pre The currently selected pipe must first be configured properly via \ref Pipe_ConfigurePipe(). + */ + static inline void Pipe_EnablePipe(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_EnablePipe(void) + { + UPCONX |= (1 << PEN); + c70: 30 91 a9 00 lds r19, 0x00A9 + c74: 31 60 ori r19, 0x01 ; 1 + c76: 30 93 a9 00 sts 0x00A9, r19 + + Pipe_EnablePipe(); + UPCFG0X = UPCFG0XTemp; + c7a: a0 93 aa 00 sts 0x00AA, r26 + UPCFG1X = UPCFG1XTemp; + c7e: 20 93 ab 00 sts 0x00AB, r18 + UPCFG2X = UPCFG2XTemp; + c82: f0 93 ad 00 sts 0x00AD, r31 + UPCONX = UPCONXTemp; + c86: e0 93 a9 00 sts 0x00A9, r30 + UPINRQX = UPINRQXTemp; + c8a: 70 93 a5 00 sts 0x00A5, r23 + UPIENX = UPIENXTemp; + c8e: 40 93 ae 00 sts 0x00AE, r20 + * \return Boolean \c true if the selected pipe is configured, \c false otherwise. + */ + static inline bool Pipe_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline bool Pipe_IsConfigured(void) + { + return ((UPSTAX & (1 << CFGOK)) ? true : false); + c92: 20 91 ac 00 lds r18, 0x00AC + + if (!(Pipe_IsConfigured())) + c96: 27 ff sbrs r18, 7 + c98: 08 c0 rjmp .+16 ; 0xcaa + + Pipe_SetInfiniteINRequests(); + + return Pipe_IsConfigured(); +#else + for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++) + c9a: 9f 5f subi r25, 0xFF ; 255 + c9c: 97 30 cpi r25, 0x07 ; 7 + c9e: 08 f4 brcc .+2 ; 0xca2 + ca0: b0 cf rjmp .-160 ; 0xc02 + * \param[in] PipeNumber Index of the pipe to select. + */ + static inline void Pipe_SelectPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE; + static inline void Pipe_SelectPipe(const uint8_t PipeNumber) + { + UPNUM = PipeNumber; + ca2: 80 93 a7 00 sts 0x00A7, r24 + if (!(Pipe_IsConfigured())) + return false; + } + + Pipe_SelectPipe(Number); + return true; + ca6: 81 e0 ldi r24, 0x01 ; 1 + ca8: 01 c0 rjmp .+2 ; 0xcac + UPCONX = UPCONXTemp; + UPINRQX = UPINRQXTemp; + UPIENX = UPIENXTemp; + + if (!(Pipe_IsConfigured())) + return false; + caa: 80 e0 ldi r24, 0x00 ; 0 + } + + Pipe_SelectPipe(Number); + return true; +#endif +} + cac: 1f 91 pop r17 + cae: 0f 91 pop r16 + cb0: ef 90 pop r14 + cb2: 08 95 ret + +00000cb4 : + +void Pipe_ClearPipes(void) +{ + UPINT = 0; + cb4: 10 92 f8 00 sts 0x00F8, r1 + + for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++) + cb8: 80 e0 ldi r24, 0x00 ; 0 + cba: 80 93 a7 00 sts 0x00A7, r24 + { + Pipe_SelectPipe(PNum); + UPIENX = 0; + cbe: 10 92 ae 00 sts 0x00AE, r1 + UPINTX = 0; + cc2: 10 92 a6 00 sts 0x00A6, r1 + UPCFG1X = 0; + cc6: 10 92 ab 00 sts 0x00AB, r1 + * from an attached device. + */ + static inline void Pipe_DisablePipe(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_DisablePipe(void) + { + UPCONX &= ~(1 << PEN); + cca: 90 91 a9 00 lds r25, 0x00A9 + cce: 9e 7f andi r25, 0xFE ; 254 + cd0: 90 93 a9 00 sts 0x00A9, r25 + +void Pipe_ClearPipes(void) +{ + UPINT = 0; + + for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++) + cd4: 8f 5f subi r24, 0xFF ; 255 + cd6: 87 30 cpi r24, 0x07 ; 7 + cd8: 81 f7 brne .-32 ; 0xcba + UPIENX = 0; + UPINTX = 0; + UPCFG1X = 0; + Pipe_DisablePipe(); + } +} + cda: 08 95 ret + +00000cdc : + USB_ResetInterface(); +} + +void USB_Disable(void) +{ + USB_INT_DisableAllInterrupts(); + cdc: 6e d0 rcall .+220 ; 0xdba + USB_INT_ClearAllInterrupts(); + cde: 75 d0 rcall .+234 ; 0xdca + * enumerating the device once attached until \ref USB_Attach() is called. + */ + static inline void USB_Detach(void) ATTR_ALWAYS_INLINE; + static inline void USB_Detach(void) + { + UDCON |= (1 << DETACH); + ce0: e0 ee ldi r30, 0xE0 ; 224 + ce2: f0 e0 ldi r31, 0x00 ; 0 + ce4: 80 81 ld r24, Z + ce6: 81 60 ori r24, 0x01 ; 1 + ce8: 80 83 st Z, r24 + } + + static inline void USB_Controller_Disable(void) ATTR_ALWAYS_INLINE; + static inline void USB_Controller_Disable(void) + { + USBCON &= ~(1 << USBE); + cea: e8 ed ldi r30, 0xD8 ; 216 + cec: f0 e0 ldi r31, 0x00 ; 0 + cee: 80 81 ld r24, Z + cf0: 8f 77 andi r24, 0x7F ; 127 + cf2: 80 83 st Z, r24 + } + + static inline void USB_PLL_Off(void) ATTR_ALWAYS_INLINE; + static inline void USB_PLL_Off(void) + { + PLLCSR = 0; + cf4: 19 bc out 0x29, r1 ; 41 + + static inline void USB_REG_Off(void) ATTR_ALWAYS_INLINE; + static inline void USB_REG_Off(void) + { + #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) + UHWCON &= ~(1 << UVREGE); + cf6: a7 ed ldi r26, 0xD7 ; 215 + cf8: b0 e0 ldi r27, 0x00 ; 0 + cfa: 8c 91 ld r24, X + cfc: 8e 7f andi r24, 0xFE ; 254 + cfe: 8c 93 st X, r24 + } + + static inline void USB_OTGPAD_Off(void) ATTR_ALWAYS_INLINE; + static inline void USB_OTGPAD_Off(void) + { + USBCON &= ~(1 << OTGPADE); + d00: 80 81 ld r24, Z + d02: 8f 7e andi r24, 0xEF ; 239 + d04: 80 83 st Z, r24 + + #if defined(USB_CAN_BE_BOTH) + USB_CurrentMode = USB_MODE_None; + #endif + + USB_IsInitialized = false; + d06: 10 92 22 01 sts 0x0122, r1 +} + d0a: 08 95 ret + +00000d0c : +{ + #if defined(USB_CAN_BE_BOTH) + bool UIDModeSelectEnabled = ((UHWCON & (1 << UIDE)) != 0); + #endif + + USB_INT_DisableAllInterrupts(); + d0c: 56 d0 rcall .+172 ; 0xdba + USB_INT_ClearAllInterrupts(); + d0e: 5d d0 rcall .+186 ; 0xdca + } + + static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE; + static inline void USB_Controller_Reset(void) + { + const uint8_t Temp = USBCON; + d10: 80 91 d8 00 lds r24, 0x00D8 + + USBCON = (Temp & ~(1 << USBE)); + d14: 98 2f mov r25, r24 + d16: 9f 77 andi r25, 0x7F ; 127 + d18: 90 93 d8 00 sts 0x00D8, r25 + USBCON = (Temp | (1 << USBE)); + d1c: 80 68 ori r24, 0x80 ; 128 + d1e: 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); + d22: 80 91 d8 00 lds r24, 0x00D8 + d26: 8f 7d andi r24, 0xDF ; 223 + d28: 80 93 d8 00 sts 0x00D8, r24 + #endif + } + else if (USB_CurrentMode == USB_MODE_Host) + { + #if defined(USB_CAN_BE_HOST) + UHWCON &= ~(1 << UIMOD); + d2c: 80 91 d7 00 lds r24, 0x00D7 + d30: 8f 77 andi r24, 0x7F ; 127 + d32: 80 93 d7 00 sts 0x00D7, r24 + + /* Inline Functions: */ + static inline void USB_PLL_On(void) ATTR_ALWAYS_INLINE; + static inline void USB_PLL_On(void) + { + PLLCSR = USB_PLL_PSC; + d36: 8c e0 ldi r24, 0x0C ; 12 + d38: 89 bd out 0x29, r24 ; 41 + PLLCSR |= (1 << PLLE); + d3a: 89 b5 in r24, 0x29 ; 41 + d3c: 82 60 ori r24, 0x02 ; 2 + d3e: 89 bd out 0x29, r24 ; 41 + + if (!(USB_Options & USB_OPT_MANUAL_PLL)) + { + #if defined(USB_CAN_BE_HOST) + USB_PLL_On(); + while (!(USB_PLL_IsReady())); + d40: 09 b4 in r0, 0x29 ; 41 + d42: 00 fe sbrs r0, 0 + d44: fd cf rjmp .-6 ; 0xd40 +#endif + +#if defined(USB_CAN_BE_HOST) +static void USB_Init_Host(void) +{ + USB_HostState = HOST_STATE_Unattached; + d46: 82 e0 ldi r24, 0x02 ; 2 + d48: 80 93 2b 01 sts 0x012B, r24 + USB_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE; + d4c: 80 e4 ldi r24, 0x40 ; 64 + d4e: 80 93 1b 01 sts 0x011B, r24 + #if !defined(__DOXYGEN__) + /* Macros: */ + static inline void USB_Host_HostMode_On(void) ATTR_ALWAYS_INLINE; + static inline void USB_Host_HostMode_On(void) + { + USBCON |= (1 << HOST); + d52: 80 91 d8 00 lds r24, 0x00D8 + d56: 80 64 ori r24, 0x40 ; 64 + d58: 80 93 d8 00 sts 0x00D8, r24 + } + + static inline void USB_Host_VBUS_Auto_Off(void) ATTR_ALWAYS_INLINE; + static inline void USB_Host_VBUS_Auto_Off(void) + { + OTGCON |= (1 << VBUSRQC); + d5c: 80 91 dd 00 lds r24, 0x00DD + d60: 81 60 ori r24, 0x01 ; 1 + d62: 80 93 dd 00 sts 0x00DD, r24 + } + + static inline void USB_Host_VBUS_Manual_Enable(void) ATTR_ALWAYS_INLINE; + static inline void USB_Host_VBUS_Manual_Enable(void) + { + OTGCON |= (1 << VBUSHWC); + d66: 80 91 dd 00 lds r24, 0x00DD + d6a: 84 60 ori r24, 0x04 ; 4 + d6c: 80 93 dd 00 sts 0x00DD, r24 + UHWCON &= ~(1 << UVCONE); + d70: 80 91 d7 00 lds r24, 0x00D7 + d74: 8f 7e andi r24, 0xEF ; 239 + d76: 80 93 d7 00 sts 0x00D7, r24 + + DDRE |= (1 << 7); + d7a: 6f 9a sbi 0x0d, 7 ; 13 + } + + static inline void USB_Host_VBUS_Manual_On(void) ATTR_ALWAYS_INLINE; + static inline void USB_Host_VBUS_Manual_On(void) + { + PORTE |= (1 << 7); + d7c: 77 9a sbi 0x0e, 7 ; 14 + break; + case USB_INT_VBERRI: + OTGIEN |= (1 << VBERRE); + break; + case USB_INT_SRPI: + OTGIEN |= (1 << SRPE); + d7e: 80 91 de 00 lds r24, 0x00DE + d82: 81 60 ori r24, 0x01 ; 1 + d84: 80 93 de 00 sts 0x00DE, r24 + break; + case USB_INT_RSTI: + UHIEN |= (1 << RSTE); + break; + case USB_INT_BCERRI: + OTGIEN |= (1 << BCERRE); + d88: 80 91 de 00 lds r24, 0x00DE + d8c: 84 60 ori r24, 0x04 ; 4 + d8e: 80 93 de 00 sts 0x00DE, 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); + d92: 80 91 e0 00 lds r24, 0x00E0 + d96: 8e 7f andi r24, 0xFE ; 254 + d98: 80 93 e0 00 sts 0x00E0, r24 + + #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) + static inline void USB_OTGPAD_On(void) ATTR_ALWAYS_INLINE; + static inline void USB_OTGPAD_On(void) + { + USBCON |= (1 << OTGPADE); + d9c: 80 91 d8 00 lds r24, 0x00D8 + da0: 80 61 ori r24, 0x10 ; 16 + da2: 80 93 d8 00 sts 0x00D8, r24 + } + + #if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) + USB_OTGPAD_On(); + #endif +} + da6: 08 95 ret + +00000da8 : + + static inline void USB_REG_On(void) ATTR_ALWAYS_INLINE; + 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); + da8: e7 ed ldi r30, 0xD7 ; 215 + daa: f0 e0 ldi r31, 0x00 ; 0 + dac: 80 81 ld r24, Z + dae: 81 60 ori r24, 0x01 ; 1 + db0: 80 83 st Z, r24 + UHWCON &= ~(1 << UIDE); + USB_CurrentMode = Mode; + } + #endif + + USB_IsInitialized = true; + db2: 81 e0 ldi r24, 0x01 ; 1 + db4: 80 93 22 01 sts 0x0122, r24 + + USB_ResetInterface(); +} + db8: a9 cf rjmp .-174 ; 0xd0c + +00000dba : +#include "../USBInterrupt.h" + +void USB_INT_DisableAllInterrupts(void) +{ + #if defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) + USBCON &= ~((1 << VBUSTE) | (1 << IDTE)); + dba: e8 ed ldi r30, 0xD8 ; 216 + dbc: f0 e0 ldi r31, 0x00 ; 0 + dbe: 80 81 ld r24, Z + dc0: 8c 7f andi r24, 0xFC ; 252 + dc2: 80 83 st Z, r24 + #if defined(USB_CAN_BE_BOTH) + OTGIEN = 0; + #endif + + #if defined(USB_CAN_BE_HOST) + UHIEN = 0; + dc4: 10 92 a0 00 sts 0x00A0, r1 + #endif + + #if defined(USB_CAN_BE_DEVICE) + UDIEN = 0; + #endif +} + dc8: 08 95 ret + +00000dca : + +void USB_INT_ClearAllInterrupts(void) +{ + #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) + USBINT = 0; + dca: 10 92 da 00 sts 0x00DA, r1 + #if defined(USB_CAN_BE_BOTH) + OTGINT = 0; + #endif + + #if defined(USB_CAN_BE_HOST) + UHINT = 0; + dce: 10 92 9f 00 sts 0x009F, r1 + #endif + + #if defined(USB_CAN_BE_DEVICE) + UDINT = 0; + #endif +} + dd2: 08 95 ret + +00000dd4 <__vector_10>: + +ISR(USB_GEN_vect, ISR_BLOCK) +{ + dd4: 1f 92 push r1 + dd6: 0f 92 push r0 + dd8: 0f b6 in r0, 0x3f ; 63 + dda: 0f 92 push r0 + ddc: 0b b6 in r0, 0x3b ; 59 + dde: 0f 92 push r0 + de0: 11 24 eor r1, r1 + de2: 2f 93 push r18 + de4: 3f 93 push r19 + de6: 4f 93 push r20 + de8: 5f 93 push r21 + dea: 6f 93 push r22 + dec: 7f 93 push r23 + dee: 8f 93 push r24 + df0: 9f 93 push r25 + df2: af 93 push r26 + df4: bf 93 push r27 + df6: ef 93 push r30 + df8: ff 93 push r31 + case USB_INT_RXSTPI: + return (UEINTX & (1 << RXSTPI)); + #endif + #if defined(USB_CAN_BE_HOST) + case USB_INT_HSOFI: + return (UHINT & (1 << HSOFI)); + dfa: 80 91 9f 00 lds r24, 0x009F + } + #endif + + #if defined(USB_CAN_BE_HOST) + #if !defined(NO_SOF_EVENTS) + if (USB_INT_HasOccurred(USB_INT_HSOFI) && USB_INT_IsEnabled(USB_INT_HSOFI)) + dfe: 85 ff sbrs r24, 5 + e00: 0a c0 rjmp .+20 ; 0xe16 <__vector_10+0x42> + case USB_INT_RXSTPI: + return (UEIENX & (1 << RXSTPE)); + #endif + #if defined(USB_CAN_BE_HOST) + case USB_INT_HSOFI: + return (UHIEN & (1 << HSOFE)); + e02: 80 91 a0 00 lds r24, 0x00A0 + e06: 85 ff sbrs r24, 5 + e08: 06 c0 rjmp .+12 ; 0xe16 <__vector_10+0x42> + UEINTX &= ~(1 << RXSTPI); + break; + #endif + #if defined(USB_CAN_BE_HOST) + case USB_INT_HSOFI: + UHINT &= ~(1 << HSOFI); + e0a: 80 91 9f 00 lds r24, 0x009F + e0e: 8f 7d andi r24, 0xDF ; 223 + e10: 80 93 9f 00 sts 0x009F, r24 + { + USB_INT_Clear(USB_INT_HSOFI); + + EVENT_USB_Host_StartOfFrame(); + e14: 0c d1 rcall .+536 ; 0x102e + case USB_INT_HSOFI: + return (UHINT & (1 << HSOFI)); + case USB_INT_DCONNI: + return (UHINT & (1 << DCONNI)); + case USB_INT_DDISCI: + return (UHINT & (1 << DDISCI)); + e16: 80 91 9f 00 lds r24, 0x009F + } + #endif + + if (USB_INT_HasOccurred(USB_INT_DDISCI) && USB_INT_IsEnabled(USB_INT_DDISCI)) + e1a: 81 ff sbrs r24, 1 + e1c: 15 c0 rjmp .+42 ; 0xe48 <__vector_10+0x74> + case USB_INT_HSOFI: + return (UHIEN & (1 << HSOFE)); + case USB_INT_DCONNI: + return (UHIEN & (1 << DCONNE)); + case USB_INT_DDISCI: + return (UHIEN & (1 << DDISCE)); + e1e: 80 91 a0 00 lds r24, 0x00A0 + e22: 81 ff sbrs r24, 1 + e24: 11 c0 rjmp .+34 ; 0xe48 <__vector_10+0x74> + break; + case USB_INT_DCONNI: + UHINT &= ~(1 << DCONNI); + break; + case USB_INT_DDISCI: + UHINT &= ~(1 << DDISCI); + e26: 80 91 9f 00 lds r24, 0x009F + e2a: 8d 7f andi r24, 0xFD ; 253 + e2c: 80 93 9f 00 sts 0x009F, r24 + #if defined(USB_CAN_BE_HOST) + case USB_INT_HSOFI: + UHINT &= ~(1 << HSOFI); + break; + case USB_INT_DCONNI: + UHINT &= ~(1 << DCONNI); + e30: 80 91 9f 00 lds r24, 0x009F + e34: 8e 7f andi r24, 0xFE ; 254 + e36: 80 93 9f 00 sts 0x009F, r24 + break; + case USB_INT_DCONNI: + UHIEN &= ~(1 << DCONNE); + break; + case USB_INT_DDISCI: + UHIEN &= ~(1 << DDISCE); + e3a: 80 91 a0 00 lds r24, 0x00A0 + e3e: 8d 7f andi r24, 0xFD ; 253 + e40: 80 93 a0 00 sts 0x00A0, r24 + { + USB_INT_Clear(USB_INT_DDISCI); + USB_INT_Clear(USB_INT_DCONNI); + USB_INT_Disable(USB_INT_DDISCI); + + EVENT_USB_Host_DeviceUnattached(); + e44: a1 da rcall .-2750 ; 0x388 + + USB_ResetInterface(); + e46: 62 df rcall .-316 ; 0xd0c + case USB_INT_RSTI: + return (UHINT & (1 << RSTI)); + case USB_INT_BCERRI: + return (OTGINT & (1 << BCERRI)); + case USB_INT_VBERRI: + return (OTGINT & (1 << VBERRI)); + e48: 80 91 df 00 lds r24, 0x00DF + } + + if (USB_INT_HasOccurred(USB_INT_VBERRI) && USB_INT_IsEnabled(USB_INT_VBERRI)) + e4c: 81 ff sbrs r24, 1 + e4e: 15 c0 rjmp .+42 ; 0xe7a <__vector_10+0xa6> + case USB_INT_RSTI: + return (UHIEN & (1 << RSTE)); + case USB_INT_BCERRI: + return (OTGIEN & (1 << BCERRE)); + case USB_INT_VBERRI: + return (OTGIEN & (1 << VBERRE)); + e50: 80 91 de 00 lds r24, 0x00DE + e54: 81 ff sbrs r24, 1 + e56: 11 c0 rjmp .+34 ; 0xe7a <__vector_10+0xa6> + break; + case USB_INT_BCERRI: + OTGINT &= ~(1 << BCERRI); + break; + case USB_INT_VBERRI: + OTGINT &= ~(1 << VBERRI); + e58: 80 91 df 00 lds r24, 0x00DF + e5c: 8d 7f andi r24, 0xFD ; 253 + e5e: 80 93 df 00 sts 0x00DF, r24 + } + + static inline void USB_Host_VBUS_Manual_Off(void) ATTR_ALWAYS_INLINE; + static inline void USB_Host_VBUS_Manual_Off(void) + { + PORTE &= ~(1 << 7); + e62: 77 98 cbi 0x0e, 7 ; 14 + } + + static inline void USB_Host_VBUS_Auto_Off(void) ATTR_ALWAYS_INLINE; + static inline void USB_Host_VBUS_Auto_Off(void) + { + OTGCON |= (1 << VBUSRQC); + e64: 80 91 dd 00 lds r24, 0x00DD + e68: 81 60 ori r24, 0x01 ; 1 + e6a: 80 93 dd 00 sts 0x00DD, r24 + USB_INT_Clear(USB_INT_VBERRI); + + USB_Host_VBUS_Manual_Off(); + USB_Host_VBUS_Auto_Off(); + + EVENT_USB_Host_HostError(HOST_ERROR_VBusVoltageDip); + e6e: 80 e0 ldi r24, 0x00 ; 0 + e70: 92 da rcall .-2780 ; 0x396 + EVENT_USB_Host_DeviceUnattached(); + e72: 8a da rcall .-2796 ; 0x388 + + USB_HostState = HOST_STATE_Unattached; + e74: 82 e0 ldi r24, 0x02 ; 2 + e76: 80 93 2b 01 sts 0x012B, r24 + case USB_INT_BCERRI: + return (OTGINT & (1 << BCERRI)); + case USB_INT_VBERRI: + return (OTGINT & (1 << VBERRI)); + case USB_INT_SRPI: + return (OTGINT & (1 << SRPI)); + e7a: 80 91 df 00 lds r24, 0x00DF + } + + if (USB_INT_HasOccurred(USB_INT_SRPI) && USB_INT_IsEnabled(USB_INT_SRPI)) + e7e: 80 ff sbrs r24, 0 + e80: 17 c0 rjmp .+46 ; 0xeb0 <__vector_10+0xdc> + case USB_INT_BCERRI: + return (OTGIEN & (1 << BCERRE)); + case USB_INT_VBERRI: + return (OTGIEN & (1 << VBERRE)); + case USB_INT_SRPI: + return (OTGIEN & (1 << SRPE)); + e82: 80 91 de 00 lds r24, 0x00DE + e86: 80 ff sbrs r24, 0 + e88: 13 c0 rjmp .+38 ; 0xeb0 <__vector_10+0xdc> + break; + case USB_INT_VBERRI: + OTGINT &= ~(1 << VBERRI); + break; + case USB_INT_SRPI: + OTGINT &= ~(1 << SRPI); + e8a: 80 91 df 00 lds r24, 0x00DF + e8e: 8e 7f andi r24, 0xFE ; 254 + e90: 80 93 df 00 sts 0x00DF, r24 + break; + case USB_INT_VBERRI: + OTGIEN &= ~(1 << VBERRE); + break; + case USB_INT_SRPI: + OTGIEN &= ~(1 << SRPE); + e94: 80 91 de 00 lds r24, 0x00DE + e98: 8e 7f andi r24, 0xFE ; 254 + e9a: 80 93 de 00 sts 0x00DE, r24 + { + USB_INT_Clear(USB_INT_SRPI); + USB_INT_Disable(USB_INT_SRPI); + + EVENT_USB_Host_DeviceAttached(); + e9e: 6f da rcall .-2850 ; 0x37e + break; + case USB_INT_DCONNI: + UHIEN |= (1 << DCONNE); + break; + case USB_INT_DDISCI: + UHIEN |= (1 << DDISCE); + ea0: 80 91 a0 00 lds r24, 0x00A0 + ea4: 82 60 ori r24, 0x02 ; 2 + ea6: 80 93 a0 00 sts 0x00A0, r24 + + USB_INT_Enable(USB_INT_DDISCI); + + USB_HostState = HOST_STATE_Powered; + eaa: 83 e0 ldi r24, 0x03 ; 3 + eac: 80 93 2b 01 sts 0x012B, r24 + case USB_INT_DDISCI: + return (UHINT & (1 << DDISCI)); + case USB_INT_RSTI: + return (UHINT & (1 << RSTI)); + case USB_INT_BCERRI: + return (OTGINT & (1 << BCERRI)); + eb0: 80 91 df 00 lds r24, 0x00DF + } + + if (USB_INT_HasOccurred(USB_INT_BCERRI) && USB_INT_IsEnabled(USB_INT_BCERRI)) + eb4: 82 ff sbrs r24, 2 + eb6: 0e c0 rjmp .+28 ; 0xed4 <__vector_10+0x100> + case USB_INT_DDISCI: + return (UHIEN & (1 << DDISCE)); + case USB_INT_RSTI: + return (UHIEN & (1 << RSTE)); + case USB_INT_BCERRI: + return (OTGIEN & (1 << BCERRE)); + eb8: 80 91 de 00 lds r24, 0x00DE + ebc: 82 ff sbrs r24, 2 + ebe: 0a c0 rjmp .+20 ; 0xed4 <__vector_10+0x100> + break; + case USB_INT_RSTI: + UHINT &= ~(1 << RSTI); + break; + case USB_INT_BCERRI: + OTGINT &= ~(1 << BCERRI); + ec0: 80 91 df 00 lds r24, 0x00DF + ec4: 8b 7f andi r24, 0xFB ; 251 + ec6: 80 93 df 00 sts 0x00DF, r24 + { + USB_INT_Clear(USB_INT_BCERRI); + + EVENT_USB_Host_DeviceEnumerationFailed(HOST_ENUMERROR_NoDeviceDetected, 0); + eca: 82 e0 ldi r24, 0x02 ; 2 + ecc: 60 e0 ldi r22, 0x00 ; 0 + ece: 82 da rcall .-2812 ; 0x3d4 + EVENT_USB_Host_DeviceUnattached(); + ed0: 5b da rcall .-2890 ; 0x388 + + USB_ResetInterface(); + ed2: 1c df rcall .-456 ; 0xd0c + USB_ResetInterface(); + + EVENT_USB_UIDChange(); + } + #endif +} + ed4: ff 91 pop r31 + ed6: ef 91 pop r30 + ed8: bf 91 pop r27 + eda: af 91 pop r26 + edc: 9f 91 pop r25 + ede: 8f 91 pop r24 + ee0: 7f 91 pop r23 + ee2: 6f 91 pop r22 + ee4: 5f 91 pop r21 + ee6: 4f 91 pop r20 + ee8: 3f 91 pop r19 + eea: 2f 91 pop r18 + eec: 0f 90 pop r0 + eee: 0b be out 0x3b, r0 ; 59 + ef0: 0f 90 pop r0 + ef2: 0f be out 0x3f, r0 ; 63 + ef4: 0f 90 pop r0 + ef6: 1f 90 pop r1 + ef8: 18 95 reti + +00000efa : +#if defined(USB_CAN_BE_HOST) +uint8_t USB_Host_GetDeviceConfigDescriptor(const uint8_t ConfigNumber, + uint16_t* const ConfigSizePtr, + void* const BufferPtr, + const uint16_t BufferSize) +{ + efa: cf 92 push r12 + efc: df 92 push r13 + efe: ef 92 push r14 + f00: ff 92 push r15 + f02: 0f 93 push r16 + f04: 1f 93 push r17 + f06: df 93 push r29 + f08: cf 93 push r28 + f0a: cd b7 in r28, 0x3d ; 61 + f0c: de b7 in r29, 0x3e ; 62 + f0e: 29 97 sbiw r28, 0x09 ; 9 + f10: 0f b6 in r0, 0x3f ; 63 + f12: f8 94 cli + f14: de bf out 0x3e, r29 ; 62 + f16: 0f be out 0x3f, r0 ; 63 + f18: cd bf out 0x3d, r28 ; 61 + f1a: 6b 01 movw r12, r22 + f1c: 8a 01 movw r16, r20 + f1e: 79 01 movw r14, r18 + uint8_t ErrorCode; + uint8_t ConfigHeader[sizeof(USB_Descriptor_Configuration_Header_t)]; + + USB_ControlRequest = (USB_Request_Header_t) + f20: 90 e8 ldi r25, 0x80 ; 128 + f22: 90 93 23 01 sts 0x0123, r25 + f26: 96 e0 ldi r25, 0x06 ; 6 + f28: 90 93 24 01 sts 0x0124, r25 + { + .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE), + .bRequest = REQ_GetDescriptor, + .wValue = ((DTYPE_Configuration << 8) | (ConfigNumber - 1)), + f2c: 90 e0 ldi r25, 0x00 ; 0 + f2e: 01 97 sbiw r24, 0x01 ; 1 + f30: 92 60 ori r25, 0x02 ; 2 + const uint16_t BufferSize) +{ + uint8_t ErrorCode; + uint8_t ConfigHeader[sizeof(USB_Descriptor_Configuration_Header_t)]; + + USB_ControlRequest = (USB_Request_Header_t) + f32: 90 93 26 01 sts 0x0126, r25 + f36: 80 93 25 01 sts 0x0125, r24 + f3a: 10 92 28 01 sts 0x0128, r1 + f3e: 10 92 27 01 sts 0x0127, r1 + f42: 89 e0 ldi r24, 0x09 ; 9 + f44: 90 e0 ldi r25, 0x00 ; 0 + f46: 90 93 2a 01 sts 0x012A, r25 + f4a: 80 93 29 01 sts 0x0129, r24 + f4e: 10 92 a7 00 sts 0x00A7, r1 + .wLength = sizeof(USB_Descriptor_Configuration_Header_t), + }; + + Pipe_SelectPipe(PIPE_CONTROLPIPE); + + if ((ErrorCode = USB_Host_SendControlRequest(ConfigHeader)) != HOST_SENDCONTROL_Successful) + f52: ce 01 movw r24, r28 + f54: 01 96 adiw r24, 0x01 ; 1 + f56: 95 d0 rcall .+298 ; 0x1082 + f58: 88 23 and r24, r24 + f5a: b9 f4 brne .+46 ; 0xf8a + return ErrorCode; + + *ConfigSizePtr = DESCRIPTOR_PCAST(ConfigHeader, USB_Descriptor_Configuration_Header_t)->TotalConfigurationSize; + f5c: 8b 81 ldd r24, Y+3 ; 0x03 + f5e: 9c 81 ldd r25, Y+4 ; 0x04 + f60: f6 01 movw r30, r12 + f62: 91 83 std Z+1, r25 ; 0x01 + f64: 80 83 st Z, r24 + + if (*ConfigSizePtr > BufferSize) + f66: e8 16 cp r14, r24 + f68: f9 06 cpc r15, r25 + f6a: 70 f0 brcs .+28 ; 0xf88 + return HOST_GETCONFIG_BuffOverflow; + + USB_ControlRequest.wLength = *ConfigSizePtr; + f6c: 90 93 2a 01 sts 0x012A, r25 + f70: 80 93 29 01 sts 0x0129, r24 + + if ((ErrorCode = USB_Host_SendControlRequest(BufferPtr)) != HOST_SENDCONTROL_Successful) + f74: c8 01 movw r24, r16 + f76: 85 d0 rcall .+266 ; 0x1082 + f78: 88 23 and r24, r24 + f7a: 39 f4 brne .+14 ; 0xf8a + return ErrorCode; + + if (DESCRIPTOR_TYPE(BufferPtr) != DTYPE_Configuration) + f7c: f8 01 movw r30, r16 + f7e: 91 81 ldd r25, Z+1 ; 0x01 + f80: 92 30 cpi r25, 0x02 ; 2 + f82: 19 f0 breq .+6 ; 0xf8a + return HOST_GETCONFIG_InvalidData; + f84: 86 e0 ldi r24, 0x06 ; 6 + f86: 01 c0 rjmp .+2 ; 0xf8a + return ErrorCode; + + *ConfigSizePtr = DESCRIPTOR_PCAST(ConfigHeader, USB_Descriptor_Configuration_Header_t)->TotalConfigurationSize; + + if (*ConfigSizePtr > BufferSize) + return HOST_GETCONFIG_BuffOverflow; + f88: 85 e0 ldi r24, 0x05 ; 5 + + if (DESCRIPTOR_TYPE(BufferPtr) != DTYPE_Configuration) + return HOST_GETCONFIG_InvalidData; + + return HOST_GETCONFIG_Successful; +} + f8a: 29 96 adiw r28, 0x09 ; 9 + f8c: 0f b6 in r0, 0x3f ; 63 + f8e: f8 94 cli + f90: de bf out 0x3e, r29 ; 62 + f92: 0f be out 0x3f, r0 ; 63 + f94: cd bf out 0x3d, r28 ; 61 + f96: cf 91 pop r28 + f98: df 91 pop r29 + f9a: 1f 91 pop r17 + f9c: 0f 91 pop r16 + f9e: ff 90 pop r15 + fa0: ef 90 pop r14 + fa2: df 90 pop r13 + fa4: cf 90 pop r12 + fa6: 08 95 ret + +00000fa8 : +} + +uint8_t USB_GetNextDescriptorComp(uint16_t* const BytesRem, + void** const CurrConfigLoc, + const ConfigComparatorPtr_t const ComparatorRoutine) +{ + fa8: af 92 push r10 + faa: bf 92 push r11 + fac: cf 92 push r12 + fae: df 92 push r13 + fb0: ef 92 push r14 + fb2: ff 92 push r15 + fb4: 0f 93 push r16 + fb6: 1f 93 push r17 + fb8: cf 93 push r28 + fba: df 93 push r29 + fbc: 8c 01 movw r16, r24 + fbe: eb 01 movw r28, r22 + fc0: 6a 01 movw r12, r20 + uint8_t ErrorCode; + + while (*BytesRem) + fc2: 23 c0 rjmp .+70 ; 0x100a + { + uint8_t* PrevDescLoc = *CurrConfigLoc; + fc4: e8 81 ld r30, Y + fc6: f9 81 ldd r31, Y+1 ; 0x01 + fc8: 5f 01 movw r10, r30 + static inline void USB_GetNextDescriptor(uint16_t* const BytesRem, + void** CurrConfigLoc) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + static inline void USB_GetNextDescriptor(uint16_t* const BytesRem, + void** CurrConfigLoc) + { + uint16_t CurrDescriptorSize = DESCRIPTOR_CAST(*CurrConfigLoc, USB_Descriptor_Header_t).Size; + fca: 20 81 ld r18, Z + fcc: 30 e0 ldi r19, 0x00 ; 0 + fce: c7 01 movw r24, r14 + fd0: 2e 15 cp r18, r14 + fd2: 3f 05 cpc r19, r15 + fd4: 08 f4 brcc .+2 ; 0xfd8 + fd6: c9 01 movw r24, r18 + + if (*BytesRem < CurrDescriptorSize) + CurrDescriptorSize = *BytesRem; + + *CurrConfigLoc = (void*)((uintptr_t)*CurrConfigLoc + CurrDescriptorSize); + fd8: e8 0f add r30, r24 + fda: f9 1f adc r31, r25 + fdc: f9 83 std Y+1, r31 ; 0x01 + fde: e8 83 st Y, r30 + *BytesRem -= CurrDescriptorSize; + fe0: f8 01 movw r30, r16 + fe2: 20 81 ld r18, Z + fe4: 31 81 ldd r19, Z+1 ; 0x01 + fe6: 28 1b sub r18, r24 + fe8: 39 0b sbc r19, r25 + fea: 31 83 std Z+1, r19 ; 0x01 + fec: 20 83 st Z, r18 + uint16_t PrevBytesRem = *BytesRem; + + USB_GetNextDescriptor(BytesRem, CurrConfigLoc); + + if ((ErrorCode = ComparatorRoutine(*CurrConfigLoc)) != DESCRIPTOR_SEARCH_NotFound) + fee: 88 81 ld r24, Y + ff0: 99 81 ldd r25, Y+1 ; 0x01 + ff2: f6 01 movw r30, r12 + ff4: 09 95 icall + ff6: 82 30 cpi r24, 0x02 ; 2 + ff8: 41 f0 breq .+16 ; 0x100a + { + if (ErrorCode == DESCRIPTOR_SEARCH_Fail) + ffa: 81 30 cpi r24, 0x01 ; 1 + ffc: 69 f4 brne .+26 ; 0x1018 + { + *CurrConfigLoc = PrevDescLoc; + ffe: a8 82 st Y, r10 + 1000: b9 82 std Y+1, r11 ; 0x01 + *BytesRem = PrevBytesRem; + 1002: f8 01 movw r30, r16 + 1004: f1 82 std Z+1, r15 ; 0x01 + 1006: e0 82 st Z, r14 + 1008: 07 c0 rjmp .+14 ; 0x1018 + void** const CurrConfigLoc, + const ConfigComparatorPtr_t const ComparatorRoutine) +{ + uint8_t ErrorCode; + + while (*BytesRem) + 100a: f8 01 movw r30, r16 + 100c: e0 80 ld r14, Z + 100e: f1 80 ldd r15, Z+1 ; 0x01 + 1010: e1 14 cp r14, r1 + 1012: f1 04 cpc r15, r1 + 1014: b9 f6 brne .-82 ; 0xfc4 + + return ErrorCode; + } + } + + return DESCRIPTOR_SEARCH_COMP_EndOfDescriptor; + 1016: 82 e0 ldi r24, 0x02 ; 2 +} + 1018: df 91 pop r29 + 101a: cf 91 pop r28 + 101c: 1f 91 pop r17 + 101e: 0f 91 pop r16 + 1020: ff 90 pop r15 + 1022: ef 90 pop r14 + 1024: df 90 pop r13 + 1026: cf 90 pop r12 + 1028: bf 90 pop r11 + 102a: af 90 pop r10 + 102c: 08 95 ret + +0000102e : +#include "Events.h" + +void USB_Event_Stub(void) +{ + +} + 102e: 08 95 ret + +00001030 : + + return ReturnStatus; +} + +static uint8_t USB_Host_WaitForIOS(const uint8_t WaitType) +{ + 1030: 1f 93 push r17 + 1032: cf 93 push r28 + 1034: df 93 push r29 + 1036: 18 2f mov r17, r24 + #if (USB_HOST_TIMEOUT_MS < 0xFF) + uint8_t TimeoutCounter = USB_HOST_TIMEOUT_MS; + #else + uint16_t TimeoutCounter = USB_HOST_TIMEOUT_MS; + 1038: c8 ee ldi r28, 0xE8 ; 232 + 103a: d3 e0 ldi r29, 0x03 ; 3 + #endif + + while (!(((WaitType == USB_HOST_WAITFOR_SetupSent) && Pipe_IsSETUPSent()) || + 103c: 07 c0 rjmp .+14 ; 0x104c + ((WaitType == USB_HOST_WAITFOR_InReceived) && Pipe_IsINReceived()) || + ((WaitType == USB_HOST_WAITFOR_OutReady) && Pipe_IsOUTReady()))) + { + uint8_t ErrorCode; + + if ((ErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful) + 103e: 81 e0 ldi r24, 0x01 ; 1 + 1040: 1e dc rcall .-1988 ; 0x87e + 1042: 88 23 and r24, r24 + 1044: d1 f4 brne .+52 ; 0x107a + return ErrorCode; + + if (!(TimeoutCounter--)) + 1046: 20 97 sbiw r28, 0x00 ; 0 + 1048: b9 f0 breq .+46 ; 0x1078 + 104a: 21 97 sbiw r28, 0x01 ; 1 + uint8_t TimeoutCounter = USB_HOST_TIMEOUT_MS; + #else + uint16_t TimeoutCounter = USB_HOST_TIMEOUT_MS; + #endif + + while (!(((WaitType == USB_HOST_WAITFOR_SetupSent) && Pipe_IsSETUPSent()) || + 104c: 11 23 and r17, r17 + 104e: 29 f4 brne .+10 ; 0x105a + * \return Boolean \c true if the current pipe is ready for a SETUP packet, \c false otherwise. + */ + static inline bool Pipe_IsSETUPSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline bool Pipe_IsSETUPSent(void) + { + return ((UPINTX & (1 << TXSTPI)) ? true : false); + 1050: 80 91 a6 00 lds r24, 0x00A6 + 1054: 83 ff sbrs r24, 3 + 1056: f3 cf rjmp .-26 ; 0x103e + 1058: 0d c0 rjmp .+26 ; 0x1074 + 105a: 11 30 cpi r17, 0x01 ; 1 + 105c: 29 f4 brne .+10 ; 0x1068 + * \return Boolean \c true if the current pipe has received an IN packet, \c false otherwise. + */ + static inline bool Pipe_IsINReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline bool Pipe_IsINReceived(void) + { + return ((UPINTX & (1 << RXINI)) ? true : false); + 105e: 80 91 a6 00 lds r24, 0x00A6 + ((WaitType == USB_HOST_WAITFOR_InReceived) && Pipe_IsINReceived()) || + 1062: 80 ff sbrs r24, 0 + 1064: ec cf rjmp .-40 ; 0x103e + 1066: 06 c0 rjmp .+12 ; 0x1074 + uint8_t TimeoutCounter = USB_HOST_TIMEOUT_MS; + #else + uint16_t TimeoutCounter = USB_HOST_TIMEOUT_MS; + #endif + + while (!(((WaitType == USB_HOST_WAITFOR_SetupSent) && Pipe_IsSETUPSent()) || + 1068: 12 30 cpi r17, 0x02 ; 2 + 106a: 49 f7 brne .-46 ; 0x103e + * \return Boolean \c true if the current pipe is ready for an OUT packet, \c false otherwise. + */ + static inline bool Pipe_IsOUTReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline bool Pipe_IsOUTReady(void) + { + return ((UPINTX & (1 << TXOUTI)) ? true : false); + 106c: 80 91 a6 00 lds r24, 0x00A6 + ((WaitType == USB_HOST_WAITFOR_InReceived) && Pipe_IsINReceived()) || + ((WaitType == USB_HOST_WAITFOR_OutReady) && Pipe_IsOUTReady()))) + 1070: 82 ff sbrs r24, 2 + 1072: e5 cf rjmp .-54 ; 0x103e + + if (!(TimeoutCounter--)) + return HOST_SENDCONTROL_SoftwareTimeOut; + } + + return HOST_SENDCONTROL_Successful; + 1074: 80 e0 ldi r24, 0x00 ; 0 + 1076: 01 c0 rjmp .+2 ; 0x107a + + if ((ErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful) + return ErrorCode; + + if (!(TimeoutCounter--)) + return HOST_SENDCONTROL_SoftwareTimeOut; + 1078: 84 e0 ldi r24, 0x04 ; 4 + } + + return HOST_SENDCONTROL_Successful; +} + 107a: df 91 pop r29 + 107c: cf 91 pop r28 + 107e: 1f 91 pop r17 + 1080: 08 95 ret + +00001082 : + +#define __INCLUDE_FROM_HOSTSTDREQ_C +#include "HostStandardReq.h" + +uint8_t USB_Host_SendControlRequest(void* const BufferPtr) +{ + 1082: ef 92 push r14 + 1084: ff 92 push r15 + 1086: 0f 93 push r16 + 1088: 1f 93 push r17 + 108a: cf 93 push r28 + 108c: df 93 push r29 + 108e: 8c 01 movw r16, r24 + * \return Boolean \c true if the bus is currently suspended, \c false otherwise. + */ + static inline bool USB_Host_IsBusSuspended(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline bool USB_Host_IsBusSuspended(void) + { + return ((UHCON & (1 << SOFEN)) ? false : true); + 1090: e0 90 9e 00 lds r14, 0x009E + 1094: ff 24 eor r15, r15 + 1096: 81 e0 ldi r24, 0x01 ; 1 + 1098: e8 22 and r14, r24 + 109a: ff 24 eor r15, r15 + uint8_t* DataStream = (uint8_t*)BufferPtr; + bool BusSuspended = USB_Host_IsBusSuspended(); + uint8_t ReturnStatus = HOST_SENDCONTROL_Successful; + uint16_t DataLen = USB_ControlRequest.wLength; + 109c: c0 91 29 01 lds r28, 0x0129 + 10a0: d0 91 2a 01 lds r29, 0x012A + * host and attached device may occur. + */ + static inline void USB_Host_ResumeBus(void) ATTR_ALWAYS_INLINE; + static inline void USB_Host_ResumeBus(void) + { + UHCON |= (1 << SOFEN); + 10a4: 80 91 9e 00 lds r24, 0x009E + 10a8: 81 60 ori r24, 0x01 ; 1 + 10aa: 80 93 9e 00 sts 0x009E, r24 + + USB_Host_ResumeBus(); + + if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful) + 10ae: 81 e0 ldi r24, 0x01 ; 1 + 10b0: e6 db rcall .-2100 ; 0x87e + 10b2: 88 23 and r24, r24 + 10b4: 09 f0 breq .+2 ; 0x10b8 + 10b6: e2 c0 rjmp .+452 ; 0x127c + * \param[in] Token New pipe token to set the selected pipe to, as a \c PIPE_TOKEN_* mask. + */ + static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_ALWAYS_INLINE; + static inline void Pipe_SetPipeToken(const uint8_t Token) + { + UPCFG0X = ((UPCFG0X & ~(0x03 << PTOKEN0)) | Token); + 10b8: 80 91 aa 00 lds r24, 0x00AA + 10bc: 8f 7c andi r24, 0xCF ; 207 + 10be: 80 93 aa 00 sts 0x00AA, r24 + + /** Clears the error flags for the currently selected pipe. */ + static inline void Pipe_ClearError(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_ClearError(void) + { + UPERRX = 0; + 10c2: 10 92 f5 00 sts 0x00F5, r1 + UPINTX &= ~(1 << PERRI); + 10c6: 80 91 a6 00 lds r24, 0x00A6 + 10ca: 8f 7e andi r24, 0xEF ; 239 + 10cc: 80 93 a6 00 sts 0x00A6, r24 + + /** Unfreezes the selected pipe, allowing it to communicate with an attached device. */ + static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_Unfreeze(void) + { + UPCONX &= ~(1 << PFREEZE); + 10d0: 80 91 a9 00 lds r24, 0x00A9 + 10d4: 8f 7b andi r24, 0xBF ; 191 + 10d6: 80 93 a9 00 sts 0x00A9, r24 + Pipe_SetPipeToken(PIPE_TOKEN_SETUP); + Pipe_ClearError(); + + Pipe_Unfreeze(); + + Pipe_Write_8(USB_ControlRequest.bmRequestType); + 10da: 80 91 23 01 lds r24, 0x0123 + * \param[in] Data Data to write into the the currently selected pipe's FIFO buffer. + */ + static inline void Pipe_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE; + static inline void Pipe_Write_8(const uint8_t Data) + { + UPDATX = Data; + 10de: 80 93 af 00 sts 0x00AF, r24 + Pipe_Write_8(USB_ControlRequest.bRequest); + 10e2: 80 91 24 01 lds r24, 0x0124 + 10e6: 80 93 af 00 sts 0x00AF, r24 + Pipe_Write_16_LE(USB_ControlRequest.wValue); + 10ea: 90 91 25 01 lds r25, 0x0125 + 10ee: 80 91 26 01 lds r24, 0x0126 + * \param[in] Data Data to write to the currently selected pipe's FIFO buffer. + */ + static inline void Pipe_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE; + static inline void Pipe_Write_16_LE(const uint16_t Data) + { + UPDATX = (Data & 0xFF); + 10f2: 90 93 af 00 sts 0x00AF, r25 + UPDATX = (Data >> 8); + 10f6: 80 93 af 00 sts 0x00AF, r24 + Pipe_Write_16_LE(USB_ControlRequest.wIndex); + 10fa: 90 91 27 01 lds r25, 0x0127 + 10fe: 80 91 28 01 lds r24, 0x0128 + * \param[in] Data Data to write to the currently selected pipe's FIFO buffer. + */ + static inline void Pipe_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE; + static inline void Pipe_Write_16_LE(const uint16_t Data) + { + UPDATX = (Data & 0xFF); + 1102: 90 93 af 00 sts 0x00AF, r25 + UPDATX = (Data >> 8); + 1106: 80 93 af 00 sts 0x00AF, r24 + Pipe_Write_16_LE(USB_ControlRequest.wLength); + 110a: 90 91 29 01 lds r25, 0x0129 + 110e: 80 91 2a 01 lds r24, 0x012A + * \param[in] Data Data to write to the currently selected pipe's FIFO buffer. + */ + static inline void Pipe_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE; + static inline void Pipe_Write_16_LE(const uint16_t Data) + { + UPDATX = (Data & 0xFF); + 1112: 90 93 af 00 sts 0x00AF, r25 + UPDATX = (Data >> 8); + 1116: 80 93 af 00 sts 0x00AF, r24 + * \ingroup Group_PipePacketManagement_AVR8 + */ + static inline void Pipe_ClearSETUP(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_ClearSETUP(void) + { + UPINTX &= ~((1 << TXSTPI) | (1 << FIFOCON)); + 111a: 80 91 a6 00 lds r24, 0x00A6 + 111e: 87 77 andi r24, 0x77 ; 119 + 1120: 80 93 a6 00 sts 0x00A6, r24 + + Pipe_ClearSETUP(); + + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_SetupSent)) != HOST_SENDCONTROL_Successful) + 1124: 80 e0 ldi r24, 0x00 ; 0 + 1126: 84 df rcall .-248 ; 0x1030 + 1128: 88 23 and r24, r24 + 112a: 09 f0 breq .+2 ; 0x112e + 112c: a7 c0 rjmp .+334 ; 0x127c + + /** Freezes the selected pipe, preventing it from communicating with an attached device. */ + static inline void Pipe_Freeze(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_Freeze(void) + { + UPCONX |= (1 << PFREEZE); + 112e: 80 91 a9 00 lds r24, 0x00A9 + 1132: 80 64 ori r24, 0x40 ; 64 + 1134: 80 93 a9 00 sts 0x00A9, r24 + goto End_Of_Control_Send; + + Pipe_Freeze(); + + if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful) + 1138: 81 e0 ldi r24, 0x01 ; 1 + 113a: a1 db rcall .-2238 ; 0x87e + 113c: 88 23 and r24, r24 + 113e: 09 f0 breq .+2 ; 0x1142 + 1140: 9d c0 rjmp .+314 ; 0x127c + goto End_Of_Control_Send; + + if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_DIRECTION) == REQDIR_DEVICETOHOST) + 1142: 80 91 23 01 lds r24, 0x0123 + 1146: 87 ff sbrs r24, 7 + 1148: 4f c0 rjmp .+158 ; 0x11e8 + * \param[in] Token New pipe token to set the selected pipe to, as a \c PIPE_TOKEN_* mask. + */ + static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_ALWAYS_INLINE; + static inline void Pipe_SetPipeToken(const uint8_t Token) + { + UPCFG0X = ((UPCFG0X & ~(0x03 << PTOKEN0)) | Token); + 114a: 80 91 aa 00 lds r24, 0x00AA + 114e: 8f 7c andi r24, 0xCF ; 207 + 1150: 80 61 ori r24, 0x10 ; 16 + 1152: 80 93 aa 00 sts 0x00AA, r24 + { + Pipe_SetPipeToken(PIPE_TOKEN_IN); + + if (DataStream != NULL) + 1156: 01 15 cp r16, r1 + 1158: 11 05 cpc r17, r1 + 115a: 61 f5 brne .+88 ; 0x11b4 + 115c: 2d c0 rjmp .+90 ; 0x11b8 + + /** Unfreezes the selected pipe, allowing it to communicate with an attached device. */ + static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_Unfreeze(void) + { + UPCONX &= ~(1 << PFREEZE); + 115e: 80 91 a9 00 lds r24, 0x00A9 + 1162: 8f 7b andi r24, 0xBF ; 191 + 1164: 80 93 a9 00 sts 0x00A9, r24 + { + while (DataLen) + { + Pipe_Unfreeze(); + + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived)) != HOST_SENDCONTROL_Successful) + 1168: 81 e0 ldi r24, 0x01 ; 1 + 116a: 62 df rcall .-316 ; 0x1030 + 116c: 88 23 and r24, r24 + 116e: 09 f0 breq .+2 ; 0x1172 + 1170: 85 c0 rjmp .+266 ; 0x127c + * \return Total number of bytes in the currently selected pipe's FIFO buffer. + */ + static inline uint16_t Pipe_BytesInPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline uint16_t Pipe_BytesInPipe(void) + { + return UPBCX; + 1172: 80 91 f6 00 lds r24, 0x00F6 + 1176: 90 91 f7 00 lds r25, 0x00F7 + goto End_Of_Control_Send; + + if (!(Pipe_BytesInPipe())) + 117a: 00 97 sbiw r24, 0x00 ; 0 + 117c: 49 f4 brne .+18 ; 0x1190 + DataLen = 0; + 117e: c0 e0 ldi r28, 0x00 ; 0 + 1180: d0 e0 ldi r29, 0x00 ; 0 + 1182: 06 c0 rjmp .+12 ; 0x1190 + * \return Next byte in the currently selected pipe's FIFO buffer. + */ + static inline uint8_t Pipe_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline uint8_t Pipe_Read_8(void) + { + return UPDATX; + 1184: 80 91 af 00 lds r24, 0x00AF + + while (Pipe_BytesInPipe() && DataLen) + { + *(DataStream++) = Pipe_Read_8(); + 1188: f8 01 movw r30, r16 + 118a: 81 93 st Z+, r24 + 118c: 8f 01 movw r16, r30 + DataLen--; + 118e: 21 97 sbiw r28, 0x01 ; 1 + * \return Total number of bytes in the currently selected pipe's FIFO buffer. + */ + static inline uint16_t Pipe_BytesInPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline uint16_t Pipe_BytesInPipe(void) + { + return UPBCX; + 1190: 80 91 f6 00 lds r24, 0x00F6 + 1194: 90 91 f7 00 lds r25, 0x00F7 + goto End_Of_Control_Send; + + if (!(Pipe_BytesInPipe())) + DataLen = 0; + + while (Pipe_BytesInPipe() && DataLen) + 1198: 00 97 sbiw r24, 0x00 ; 0 + 119a: 11 f0 breq .+4 ; 0x11a0 + 119c: 20 97 sbiw r28, 0x00 ; 0 + 119e: 91 f7 brne .-28 ; 0x1184 + + /** Freezes the selected pipe, preventing it from communicating with an attached device. */ + static inline void Pipe_Freeze(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_Freeze(void) + { + UPCONX |= (1 << PFREEZE); + 11a0: 80 91 a9 00 lds r24, 0x00A9 + 11a4: 80 64 ori r24, 0x40 ; 64 + 11a6: 80 93 a9 00 sts 0x00A9, r24 + * \ingroup Group_PipePacketManagement_AVR8 + */ + static inline void Pipe_ClearIN(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_ClearIN(void) + { + UPINTX &= ~((1 << RXINI) | (1 << FIFOCON)); + 11aa: 80 91 a6 00 lds r24, 0x00A6 + 11ae: 8e 77 andi r24, 0x7E ; 126 + 11b0: 80 93 a6 00 sts 0x00A6, r24 + { + Pipe_SetPipeToken(PIPE_TOKEN_IN); + + if (DataStream != NULL) + { + while (DataLen) + 11b4: 20 97 sbiw r28, 0x00 ; 0 + 11b6: 99 f6 brne .-90 ; 0x115e + * \param[in] Token New pipe token to set the selected pipe to, as a \c PIPE_TOKEN_* mask. + */ + static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_ALWAYS_INLINE; + static inline void Pipe_SetPipeToken(const uint8_t Token) + { + UPCFG0X = ((UPCFG0X & ~(0x03 << PTOKEN0)) | Token); + 11b8: 80 91 aa 00 lds r24, 0x00AA + 11bc: 8f 7c andi r24, 0xCF ; 207 + 11be: 80 62 ori r24, 0x20 ; 32 + 11c0: 80 93 aa 00 sts 0x00AA, r24 + + /** Unfreezes the selected pipe, allowing it to communicate with an attached device. */ + static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_Unfreeze(void) + { + UPCONX &= ~(1 << PFREEZE); + 11c4: 80 91 a9 00 lds r24, 0x00A9 + 11c8: 8f 7b andi r24, 0xBF ; 191 + 11ca: 80 93 a9 00 sts 0x00A9, r24 + } + + Pipe_SetPipeToken(PIPE_TOKEN_OUT); + Pipe_Unfreeze(); + + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful) + 11ce: 82 e0 ldi r24, 0x02 ; 2 + 11d0: 2f df rcall .-418 ; 0x1030 + 11d2: 88 23 and r24, r24 + 11d4: 09 f0 breq .+2 ; 0x11d8 + 11d6: 52 c0 rjmp .+164 ; 0x127c + * \ingroup Group_PipePacketManagement_AVR8 + */ + static inline void Pipe_ClearOUT(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_ClearOUT(void) + { + UPINTX &= ~((1 << TXOUTI) | (1 << FIFOCON)); + 11d8: 80 91 a6 00 lds r24, 0x00A6 + 11dc: 8b 77 andi r24, 0x7B ; 123 + 11de: 80 93 a6 00 sts 0x00A6, r24 + goto End_Of_Control_Send; + + Pipe_ClearOUT(); + + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful) + 11e2: 82 e0 ldi r24, 0x02 ; 2 + 11e4: 25 df rcall .-438 ; 0x1030 + 11e6: 4a c0 rjmp .+148 ; 0x127c + goto End_Of_Control_Send; + } + else + { + if (DataStream != NULL) + 11e8: 01 15 cp r16, r1 + 11ea: 11 05 cpc r17, r1 + 11ec: 99 f1 breq .+102 ; 0x1254 + * \param[in] Token New pipe token to set the selected pipe to, as a \c PIPE_TOKEN_* mask. + */ + static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_ALWAYS_INLINE; + static inline void Pipe_SetPipeToken(const uint8_t Token) + { + UPCFG0X = ((UPCFG0X & ~(0x03 << PTOKEN0)) | Token); + 11ee: 80 91 aa 00 lds r24, 0x00AA + 11f2: 8f 7c andi r24, 0xCF ; 207 + 11f4: 80 62 ori r24, 0x20 ; 32 + 11f6: 80 93 aa 00 sts 0x00AA, r24 + + /** Unfreezes the selected pipe, allowing it to communicate with an attached device. */ + static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_Unfreeze(void) + { + UPCONX &= ~(1 << PFREEZE); + 11fa: 80 91 a9 00 lds r24, 0x00A9 + 11fe: 8f 7b andi r24, 0xBF ; 191 + 1200: 80 93 a9 00 sts 0x00A9, r24 + { + Pipe_SetPipeToken(PIPE_TOKEN_OUT); + Pipe_Unfreeze(); + + while (DataLen) + 1204: 1c c0 rjmp .+56 ; 0x123e + { + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful) + 1206: 82 e0 ldi r24, 0x02 ; 2 + 1208: 13 df rcall .-474 ; 0x1030 + 120a: 88 23 and r24, r24 + 120c: b9 f5 brne .+110 ; 0x127c + 120e: f8 01 movw r30, r16 + 1210: 06 c0 rjmp .+12 ; 0x121e + goto End_Of_Control_Send; + + while (DataLen && (Pipe_BytesInPipe() < USB_ControlPipeSize)) + { + Pipe_Write_8(*(DataStream++)); + 1212: 81 91 ld r24, Z+ + 1214: 8f 01 movw r16, r30 + * \param[in] Data Data to write into the the currently selected pipe's FIFO buffer. + */ + static inline void Pipe_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE; + static inline void Pipe_Write_8(const uint8_t Data) + { + UPDATX = Data; + 1216: 80 93 af 00 sts 0x00AF, r24 + DataLen--; + 121a: 21 97 sbiw r28, 0x01 ; 1 + while (DataLen) + { + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful) + goto End_Of_Control_Send; + + while (DataLen && (Pipe_BytesInPipe() < USB_ControlPipeSize)) + 121c: 59 f0 breq .+22 ; 0x1234 + 121e: 8f 01 movw r16, r30 + * \return Total number of bytes in the currently selected pipe's FIFO buffer. + */ + static inline uint16_t Pipe_BytesInPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline uint16_t Pipe_BytesInPipe(void) + { + return UPBCX; + 1220: 20 91 f6 00 lds r18, 0x00F6 + 1224: 30 91 f7 00 lds r19, 0x00F7 + 1228: 80 91 1b 01 lds r24, 0x011B + 122c: 90 e0 ldi r25, 0x00 ; 0 + 122e: 28 17 cp r18, r24 + 1230: 39 07 cpc r19, r25 + 1232: 78 f3 brcs .-34 ; 0x1212 + * \ingroup Group_PipePacketManagement_AVR8 + */ + static inline void Pipe_ClearOUT(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_ClearOUT(void) + { + UPINTX &= ~((1 << TXOUTI) | (1 << FIFOCON)); + 1234: 80 91 a6 00 lds r24, 0x00A6 + 1238: 8b 77 andi r24, 0x7B ; 123 + 123a: 80 93 a6 00 sts 0x00A6, r24 + if (DataStream != NULL) + { + Pipe_SetPipeToken(PIPE_TOKEN_OUT); + Pipe_Unfreeze(); + + while (DataLen) + 123e: 20 97 sbiw r28, 0x00 ; 0 + 1240: 11 f7 brne .-60 ; 0x1206 + } + + Pipe_ClearOUT(); + } + + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful) + 1242: 82 e0 ldi r24, 0x02 ; 2 + 1244: f5 de rcall .-534 ; 0x1030 + 1246: 88 23 and r24, r24 + 1248: c9 f4 brne .+50 ; 0x127c + + /** Freezes the selected pipe, preventing it from communicating with an attached device. */ + static inline void Pipe_Freeze(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_Freeze(void) + { + UPCONX |= (1 << PFREEZE); + 124a: 80 91 a9 00 lds r24, 0x00A9 + 124e: 80 64 ori r24, 0x40 ; 64 + 1250: 80 93 a9 00 sts 0x00A9, r24 + * \param[in] Token New pipe token to set the selected pipe to, as a \c PIPE_TOKEN_* mask. + */ + static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_ALWAYS_INLINE; + static inline void Pipe_SetPipeToken(const uint8_t Token) + { + UPCFG0X = ((UPCFG0X & ~(0x03 << PTOKEN0)) | Token); + 1254: 80 91 aa 00 lds r24, 0x00AA + 1258: 8f 7c andi r24, 0xCF ; 207 + 125a: 80 61 ori r24, 0x10 ; 16 + 125c: 80 93 aa 00 sts 0x00AA, r24 + + /** Unfreezes the selected pipe, allowing it to communicate with an attached device. */ + static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_Unfreeze(void) + { + UPCONX &= ~(1 << PFREEZE); + 1260: 80 91 a9 00 lds r24, 0x00A9 + 1264: 8f 7b andi r24, 0xBF ; 191 + 1266: 80 93 a9 00 sts 0x00A9, r24 + } + + Pipe_SetPipeToken(PIPE_TOKEN_IN); + Pipe_Unfreeze(); + + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived)) != HOST_SENDCONTROL_Successful) + 126a: 81 e0 ldi r24, 0x01 ; 1 + 126c: e1 de rcall .-574 ; 0x1030 + 126e: 88 23 and r24, r24 + 1270: 29 f4 brne .+10 ; 0x127c + * \ingroup Group_PipePacketManagement_AVR8 + */ + static inline void Pipe_ClearIN(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_ClearIN(void) + { + UPINTX &= ~((1 << RXINI) | (1 << FIFOCON)); + 1272: 90 91 a6 00 lds r25, 0x00A6 + 1276: 9e 77 andi r25, 0x7E ; 126 + 1278: 90 93 a6 00 sts 0x00A6, r25 + + /** Freezes the selected pipe, preventing it from communicating with an attached device. */ + static inline void Pipe_Freeze(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_Freeze(void) + { + UPCONX |= (1 << PFREEZE); + 127c: 90 91 a9 00 lds r25, 0x00A9 + 1280: 90 64 ori r25, 0x40 ; 64 + 1282: 90 93 a9 00 sts 0x00A9, r25 + } + +End_Of_Control_Send: + Pipe_Freeze(); + + if (BusSuspended) + 1286: e1 14 cp r14, r1 + 1288: f1 04 cpc r15, r1 + 128a: 29 f4 brne .+10 ; 0x1296 + * messages to the device. + */ + static inline void USB_Host_SuspendBus(void) ATTR_ALWAYS_INLINE; + static inline void USB_Host_SuspendBus(void) + { + UHCON &= ~(1 << SOFEN); + 128c: 90 91 9e 00 lds r25, 0x009E + 1290: 9e 7f andi r25, 0xFE ; 254 + 1292: 90 93 9e 00 sts 0x009E, r25 + * \param[in] PipeNumber Index of the pipe to reset. + */ + static inline void Pipe_ResetPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE; + static inline void Pipe_ResetPipe(const uint8_t PipeNumber) + { + UPRST = (1 << PipeNumber); + 1296: 91 e0 ldi r25, 0x01 ; 1 + 1298: 90 93 a8 00 sts 0x00A8, r25 + UPRST = 0; + 129c: 10 92 a8 00 sts 0x00A8, r1 + USB_Host_SuspendBus(); + + Pipe_ResetPipe(PIPE_CONTROLPIPE); + + return ReturnStatus; +} + 12a0: df 91 pop r29 + 12a2: cf 91 pop r28 + 12a4: 1f 91 pop r17 + 12a6: 0f 91 pop r16 + 12a8: ff 90 pop r15 + 12aa: ef 90 pop r14 + 12ac: 08 95 ret + +000012ae : +#if defined(USB_CAN_BE_DEVICE) && !defined(DEVICE_STATE_AS_GPIOR) +volatile uint8_t USB_DeviceState; +#endif + +void USB_USBTask(void) +{ + 12ae: 1f 93 push r17 + 12b0: cf 93 push r28 + 12b2: df 93 push r29 + * \return Index of the currently selected pipe. + */ + static inline uint8_t Pipe_GetCurrentPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline uint8_t Pipe_GetCurrentPipe(void) + { + return (UPNUM & PIPE_PIPENUM_MASK); + 12b4: c7 ea ldi r28, 0xA7 ; 167 + 12b6: d0 e0 ldi r29, 0x00 ; 0 + 12b8: 18 81 ld r17, Y + 12ba: 17 70 andi r17, 0x07 ; 7 + * \param[in] PipeNumber Index of the pipe to select. + */ + static inline void Pipe_SelectPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE; + static inline void Pipe_SelectPipe(const uint8_t PipeNumber) + { + UPNUM = PipeNumber; + 12bc: 18 82 st Y, r1 +{ + uint8_t PrevPipe = Pipe_GetCurrentPipe(); + + Pipe_SelectPipe(PIPE_CONTROLPIPE); + + USB_Host_ProcessNextHostState(); + 12be: 34 db rcall .-2456 ; 0x928 + 12c0: 18 83 st Y, r17 + if (USB_CurrentMode == USB_MODE_Device) + USB_DeviceTask(); + else if (USB_CurrentMode == USB_MODE_Host) + USB_HostTask(); + #endif +} + 12c2: df 91 pop r29 + 12c4: cf 91 pop r28 + 12c6: 1f 91 pop r17 + 12c8: 08 95 ret + +000012ca : + * \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))); + 12ca: 90 91 c8 00 lds r25, 0x00C8 + 12ce: 95 ff sbrs r25, 5 + 12d0: fc cf rjmp .-8 ; 0x12ca + UDR1 = DataByte; + 12d2: 80 93 ce 00 sts 0x00CE, r24 +{ + (void)Stream; + + Serial_SendByte(DataByte); + return 0; +} + 12d6: 80 e0 ldi r24, 0x00 ; 0 + 12d8: 90 e0 ldi r25, 0x00 ; 0 + 12da: 08 95 ret + +000012dc : + * \return Boolean \c true if a character has been received, \c false otherwise. + */ + static inline bool Serial_IsCharReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline bool Serial_IsCharReceived(void) + { + return ((UCSR1A & (1 << RXC1)) ? true : false); + 12dc: 80 91 c8 00 lds r24, 0x00C8 + +int Serial_getchar(FILE *Stream) +{ + (void)Stream; + + if (!(Serial_IsCharReceived())) + 12e0: 87 ff sbrs r24, 7 + 12e2: 08 c0 rjmp .+16 ; 0x12f4 + 12e4: 80 91 c8 00 lds r24, 0x00C8 + * \return Next byte received from the USART, or a negative value if no byte has been received. + */ + static inline int16_t Serial_ReceiveByte(void) ATTR_ALWAYS_INLINE; + static inline int16_t Serial_ReceiveByte(void) + { + if (!(Serial_IsCharReceived())) + 12e8: 87 ff sbrs r24, 7 + 12ea: 07 c0 rjmp .+14 ; 0x12fa + return -1; + + return UDR1; + 12ec: 20 91 ce 00 lds r18, 0x00CE + 12f0: 30 e0 ldi r19, 0x00 ; 0 + 12f2: 05 c0 rjmp .+10 ; 0x12fe + return _FDEV_EOF; + 12f4: 2e ef ldi r18, 0xFE ; 254 + 12f6: 3f ef ldi r19, 0xFF ; 255 + 12f8: 02 c0 rjmp .+4 ; 0x12fe + */ + static inline int16_t Serial_ReceiveByte(void) ATTR_ALWAYS_INLINE; + static inline int16_t Serial_ReceiveByte(void) + { + if (!(Serial_IsCharReceived())) + return -1; + 12fa: 2f ef ldi r18, 0xFF ; 255 + 12fc: 3f ef ldi r19, 0xFF ; 255 + + return Serial_ReceiveByte(); +} + 12fe: c9 01 movw r24, r18 + 1300: 08 95 ret + +00001302 : + 1302: df 93 push r29 + 1304: cf 93 push r28 + 1306: cd b7 in r28, 0x3d ; 61 + 1308: de b7 in r29, 0x3e ; 62 + 130a: fe 01 movw r30, r28 + 130c: 35 96 adiw r30, 0x05 ; 5 + 130e: 61 91 ld r22, Z+ + 1310: 71 91 ld r23, Z+ + 1312: 80 91 3c 01 lds r24, 0x013C + 1316: 90 91 3d 01 lds r25, 0x013D + 131a: dc 01 movw r26, r24 + 131c: 13 96 adiw r26, 0x03 ; 3 + 131e: 2c 91 ld r18, X + 1320: 13 97 sbiw r26, 0x03 ; 3 + 1322: 28 60 ori r18, 0x08 ; 8 + 1324: 13 96 adiw r26, 0x03 ; 3 + 1326: 2c 93 st X, r18 + 1328: af 01 movw r20, r30 + 132a: 42 d0 rcall .+132 ; 0x13b0 + 132c: e0 91 3c 01 lds r30, 0x013C + 1330: f0 91 3d 01 lds r31, 0x013D + 1334: 23 81 ldd r18, Z+3 ; 0x03 + 1336: 27 7f andi r18, 0xF7 ; 247 + 1338: 23 83 std Z+3, r18 ; 0x03 + 133a: cf 91 pop r28 + 133c: df 91 pop r29 + 133e: 08 95 ret + +00001340 : + 1340: ef 92 push r14 + 1342: ff 92 push r15 + 1344: 0f 93 push r16 + 1346: 1f 93 push r17 + 1348: cf 93 push r28 + 134a: df 93 push r29 + 134c: 8c 01 movw r16, r24 + 134e: e0 91 3c 01 lds r30, 0x013C + 1352: f0 91 3d 01 lds r31, 0x013D + 1356: 83 81 ldd r24, Z+3 ; 0x03 + 1358: 81 ff sbrs r24, 1 + 135a: 20 c0 rjmp .+64 ; 0x139c + 135c: c0 e0 ldi r28, 0x00 ; 0 + 135e: d0 e0 ldi r29, 0x00 ; 0 + 1360: 0c c0 rjmp .+24 ; 0x137a + 1362: db 01 movw r26, r22 + 1364: 18 96 adiw r26, 0x08 ; 8 + 1366: ed 91 ld r30, X+ + 1368: fc 91 ld r31, X + 136a: 19 97 sbiw r26, 0x09 ; 9 + 136c: 09 95 icall + 136e: 00 97 sbiw r24, 0x00 ; 0 + 1370: 11 f0 breq .+4 ; 0x1376 + 1372: cf ef ldi r28, 0xFF ; 255 + 1374: df ef ldi r29, 0xFF ; 255 + 1376: 0f 5f subi r16, 0xFF ; 255 + 1378: 1f 4f sbci r17, 0xFF ; 255 + 137a: f8 01 movw r30, r16 + 137c: 84 91 lpm r24, Z+ + 137e: 60 91 3c 01 lds r22, 0x013C + 1382: 70 91 3d 01 lds r23, 0x013D + 1386: 88 23 and r24, r24 + 1388: 61 f7 brne .-40 ; 0x1362 + 138a: db 01 movw r26, r22 + 138c: 18 96 adiw r26, 0x08 ; 8 + 138e: ed 91 ld r30, X+ + 1390: fc 91 ld r31, X + 1392: 19 97 sbiw r26, 0x09 ; 9 + 1394: 8a e0 ldi r24, 0x0A ; 10 + 1396: 09 95 icall + 1398: 00 97 sbiw r24, 0x00 ; 0 + 139a: 11 f0 breq .+4 ; 0x13a0 + 139c: cf ef ldi r28, 0xFF ; 255 + 139e: df ef ldi r29, 0xFF ; 255 + 13a0: ce 01 movw r24, r28 + 13a2: df 91 pop r29 + 13a4: cf 91 pop r28 + 13a6: 1f 91 pop r17 + 13a8: 0f 91 pop r16 + 13aa: ff 90 pop r15 + 13ac: ef 90 pop r14 + 13ae: 08 95 ret + +000013b0 : + 13b0: 2f 92 push r2 + 13b2: 3f 92 push r3 + 13b4: 4f 92 push r4 + 13b6: 5f 92 push r5 + 13b8: 6f 92 push r6 + 13ba: 7f 92 push r7 + 13bc: 8f 92 push r8 + 13be: 9f 92 push r9 + 13c0: af 92 push r10 + 13c2: bf 92 push r11 + 13c4: cf 92 push r12 + 13c6: df 92 push r13 + 13c8: ef 92 push r14 + 13ca: ff 92 push r15 + 13cc: 0f 93 push r16 + 13ce: 1f 93 push r17 + 13d0: df 93 push r29 + 13d2: cf 93 push r28 + 13d4: cd b7 in r28, 0x3d ; 61 + 13d6: de b7 in r29, 0x3e ; 62 + 13d8: 2c 97 sbiw r28, 0x0c ; 12 + 13da: 0f b6 in r0, 0x3f ; 63 + 13dc: f8 94 cli + 13de: de bf out 0x3e, r29 ; 62 + 13e0: 0f be out 0x3f, r0 ; 63 + 13e2: cd bf out 0x3d, r28 ; 61 + 13e4: 6c 01 movw r12, r24 + 13e6: 1b 01 movw r2, r22 + 13e8: 8a 01 movw r16, r20 + 13ea: fc 01 movw r30, r24 + 13ec: 17 82 std Z+7, r1 ; 0x07 + 13ee: 16 82 std Z+6, r1 ; 0x06 + 13f0: 83 81 ldd r24, Z+3 ; 0x03 + 13f2: 81 ff sbrs r24, 1 + 13f4: c4 c1 rjmp .+904 ; 0x177e + 13f6: 2e 01 movw r4, r28 + 13f8: 08 94 sec + 13fa: 41 1c adc r4, r1 + 13fc: 51 1c adc r5, r1 + 13fe: f6 01 movw r30, r12 + 1400: 93 81 ldd r25, Z+3 ; 0x03 + 1402: f1 01 movw r30, r2 + 1404: 93 fd sbrc r25, 3 + 1406: 85 91 lpm r24, Z+ + 1408: 93 ff sbrs r25, 3 + 140a: 81 91 ld r24, Z+ + 140c: 1f 01 movw r2, r30 + 140e: 88 23 and r24, r24 + 1410: 09 f4 brne .+2 ; 0x1414 + 1412: b1 c1 rjmp .+866 ; 0x1776 + 1414: 85 32 cpi r24, 0x25 ; 37 + 1416: 39 f4 brne .+14 ; 0x1426 + 1418: 93 fd sbrc r25, 3 + 141a: 85 91 lpm r24, Z+ + 141c: 93 ff sbrs r25, 3 + 141e: 81 91 ld r24, Z+ + 1420: 1f 01 movw r2, r30 + 1422: 85 32 cpi r24, 0x25 ; 37 + 1424: 21 f4 brne .+8 ; 0x142e + 1426: 90 e0 ldi r25, 0x00 ; 0 + 1428: b6 01 movw r22, r12 + 142a: db d1 rcall .+950 ; 0x17e2 + 142c: e8 cf rjmp .-48 ; 0x13fe + 142e: ee 24 eor r14, r14 + 1430: ff 24 eor r15, r15 + 1432: 20 e0 ldi r18, 0x00 ; 0 + 1434: 20 32 cpi r18, 0x20 ; 32 + 1436: b0 f4 brcc .+44 ; 0x1464 + 1438: 8b 32 cpi r24, 0x2B ; 43 + 143a: 69 f0 breq .+26 ; 0x1456 + 143c: 8c 32 cpi r24, 0x2C ; 44 + 143e: 28 f4 brcc .+10 ; 0x144a + 1440: 80 32 cpi r24, 0x20 ; 32 + 1442: 51 f0 breq .+20 ; 0x1458 + 1444: 83 32 cpi r24, 0x23 ; 35 + 1446: 71 f4 brne .+28 ; 0x1464 + 1448: 0b c0 rjmp .+22 ; 0x1460 + 144a: 8d 32 cpi r24, 0x2D ; 45 + 144c: 39 f0 breq .+14 ; 0x145c + 144e: 80 33 cpi r24, 0x30 ; 48 + 1450: 49 f4 brne .+18 ; 0x1464 + 1452: 21 60 ori r18, 0x01 ; 1 + 1454: 2c c0 rjmp .+88 ; 0x14ae + 1456: 22 60 ori r18, 0x02 ; 2 + 1458: 24 60 ori r18, 0x04 ; 4 + 145a: 29 c0 rjmp .+82 ; 0x14ae + 145c: 28 60 ori r18, 0x08 ; 8 + 145e: 27 c0 rjmp .+78 ; 0x14ae + 1460: 20 61 ori r18, 0x10 ; 16 + 1462: 25 c0 rjmp .+74 ; 0x14ae + 1464: 27 fd sbrc r18, 7 + 1466: 2c c0 rjmp .+88 ; 0x14c0 + 1468: 38 2f mov r19, r24 + 146a: 30 53 subi r19, 0x30 ; 48 + 146c: 3a 30 cpi r19, 0x0A ; 10 + 146e: 98 f4 brcc .+38 ; 0x1496 + 1470: 26 ff sbrs r18, 6 + 1472: 08 c0 rjmp .+16 ; 0x1484 + 1474: 8e 2d mov r24, r14 + 1476: 88 0f add r24, r24 + 1478: e8 2e mov r14, r24 + 147a: ee 0c add r14, r14 + 147c: ee 0c add r14, r14 + 147e: e8 0e add r14, r24 + 1480: e3 0e add r14, r19 + 1482: 15 c0 rjmp .+42 ; 0x14ae + 1484: 8f 2d mov r24, r15 + 1486: 88 0f add r24, r24 + 1488: f8 2e mov r15, r24 + 148a: ff 0c add r15, r15 + 148c: ff 0c add r15, r15 + 148e: f8 0e add r15, r24 + 1490: f3 0e add r15, r19 + 1492: 20 62 ori r18, 0x20 ; 32 + 1494: 0c c0 rjmp .+24 ; 0x14ae + 1496: 8e 32 cpi r24, 0x2E ; 46 + 1498: 21 f4 brne .+8 ; 0x14a2 + 149a: 26 fd sbrc r18, 6 + 149c: 6c c1 rjmp .+728 ; 0x1776 + 149e: 20 64 ori r18, 0x40 ; 64 + 14a0: 06 c0 rjmp .+12 ; 0x14ae + 14a2: 8c 36 cpi r24, 0x6C ; 108 + 14a4: 11 f4 brne .+4 ; 0x14aa + 14a6: 20 68 ori r18, 0x80 ; 128 + 14a8: 02 c0 rjmp .+4 ; 0x14ae + 14aa: 88 36 cpi r24, 0x68 ; 104 + 14ac: 49 f4 brne .+18 ; 0x14c0 + 14ae: f1 01 movw r30, r2 + 14b0: 93 fd sbrc r25, 3 + 14b2: 85 91 lpm r24, Z+ + 14b4: 93 ff sbrs r25, 3 + 14b6: 81 91 ld r24, Z+ + 14b8: 1f 01 movw r2, r30 + 14ba: 88 23 and r24, r24 + 14bc: 09 f0 breq .+2 ; 0x14c0 + 14be: ba cf rjmp .-140 ; 0x1434 + 14c0: 98 2f mov r25, r24 + 14c2: 95 54 subi r25, 0x45 ; 69 + 14c4: 93 30 cpi r25, 0x03 ; 3 + 14c6: 18 f0 brcs .+6 ; 0x14ce + 14c8: 90 52 subi r25, 0x20 ; 32 + 14ca: 93 30 cpi r25, 0x03 ; 3 + 14cc: 28 f4 brcc .+10 ; 0x14d8 + 14ce: 0c 5f subi r16, 0xFC ; 252 + 14d0: 1f 4f sbci r17, 0xFF ; 255 + 14d2: ff e3 ldi r31, 0x3F ; 63 + 14d4: f9 83 std Y+1, r31 ; 0x01 + 14d6: 0d c0 rjmp .+26 ; 0x14f2 + 14d8: 83 36 cpi r24, 0x63 ; 99 + 14da: 31 f0 breq .+12 ; 0x14e8 + 14dc: 83 37 cpi r24, 0x73 ; 115 + 14de: 71 f0 breq .+28 ; 0x14fc + 14e0: 83 35 cpi r24, 0x53 ; 83 + 14e2: 09 f0 breq .+2 ; 0x14e6 + 14e4: 5c c0 rjmp .+184 ; 0x159e + 14e6: 21 c0 rjmp .+66 ; 0x152a + 14e8: f8 01 movw r30, r16 + 14ea: 80 81 ld r24, Z + 14ec: 89 83 std Y+1, r24 ; 0x01 + 14ee: 0e 5f subi r16, 0xFE ; 254 + 14f0: 1f 4f sbci r17, 0xFF ; 255 + 14f2: 42 01 movw r8, r4 + 14f4: 71 e0 ldi r23, 0x01 ; 1 + 14f6: a7 2e mov r10, r23 + 14f8: b1 2c mov r11, r1 + 14fa: 15 c0 rjmp .+42 ; 0x1526 + 14fc: 62 e0 ldi r22, 0x02 ; 2 + 14fe: 66 2e mov r6, r22 + 1500: 71 2c mov r7, r1 + 1502: 60 0e add r6, r16 + 1504: 71 1e adc r7, r17 + 1506: f8 01 movw r30, r16 + 1508: 80 80 ld r8, Z + 150a: 91 80 ldd r9, Z+1 ; 0x01 + 150c: 26 ff sbrs r18, 6 + 150e: 03 c0 rjmp .+6 ; 0x1516 + 1510: 6e 2d mov r22, r14 + 1512: 70 e0 ldi r23, 0x00 ; 0 + 1514: 02 c0 rjmp .+4 ; 0x151a + 1516: 6f ef ldi r22, 0xFF ; 255 + 1518: 7f ef ldi r23, 0xFF ; 255 + 151a: c4 01 movw r24, r8 + 151c: 2c 87 std Y+12, r18 ; 0x0c + 151e: 56 d1 rcall .+684 ; 0x17cc + 1520: 5c 01 movw r10, r24 + 1522: 83 01 movw r16, r6 + 1524: 2c 85 ldd r18, Y+12 ; 0x0c + 1526: 2f 77 andi r18, 0x7F ; 127 + 1528: 16 c0 rjmp .+44 ; 0x1556 + 152a: 52 e0 ldi r21, 0x02 ; 2 + 152c: 65 2e mov r6, r21 + 152e: 71 2c mov r7, r1 + 1530: 60 0e add r6, r16 + 1532: 71 1e adc r7, r17 + 1534: f8 01 movw r30, r16 + 1536: 80 80 ld r8, Z + 1538: 91 80 ldd r9, Z+1 ; 0x01 + 153a: 26 ff sbrs r18, 6 + 153c: 03 c0 rjmp .+6 ; 0x1544 + 153e: 6e 2d mov r22, r14 + 1540: 70 e0 ldi r23, 0x00 ; 0 + 1542: 02 c0 rjmp .+4 ; 0x1548 + 1544: 6f ef ldi r22, 0xFF ; 255 + 1546: 7f ef ldi r23, 0xFF ; 255 + 1548: c4 01 movw r24, r8 + 154a: 2c 87 std Y+12, r18 ; 0x0c + 154c: 34 d1 rcall .+616 ; 0x17b6 + 154e: 5c 01 movw r10, r24 + 1550: 2c 85 ldd r18, Y+12 ; 0x0c + 1552: 20 68 ori r18, 0x80 ; 128 + 1554: 83 01 movw r16, r6 + 1556: 23 fd sbrc r18, 3 + 1558: 1e c0 rjmp .+60 ; 0x1596 + 155a: 07 c0 rjmp .+14 ; 0x156a + 155c: 80 e2 ldi r24, 0x20 ; 32 + 155e: 90 e0 ldi r25, 0x00 ; 0 + 1560: b6 01 movw r22, r12 + 1562: 2c 87 std Y+12, r18 ; 0x0c + 1564: 3e d1 rcall .+636 ; 0x17e2 + 1566: fa 94 dec r15 + 1568: 2c 85 ldd r18, Y+12 ; 0x0c + 156a: 8f 2d mov r24, r15 + 156c: 90 e0 ldi r25, 0x00 ; 0 + 156e: a8 16 cp r10, r24 + 1570: b9 06 cpc r11, r25 + 1572: a0 f3 brcs .-24 ; 0x155c + 1574: 10 c0 rjmp .+32 ; 0x1596 + 1576: f4 01 movw r30, r8 + 1578: 27 fd sbrc r18, 7 + 157a: 85 91 lpm r24, Z+ + 157c: 27 ff sbrs r18, 7 + 157e: 81 91 ld r24, Z+ + 1580: 4f 01 movw r8, r30 + 1582: 90 e0 ldi r25, 0x00 ; 0 + 1584: b6 01 movw r22, r12 + 1586: 2c 87 std Y+12, r18 ; 0x0c + 1588: 2c d1 rcall .+600 ; 0x17e2 + 158a: 2c 85 ldd r18, Y+12 ; 0x0c + 158c: f1 10 cpse r15, r1 + 158e: fa 94 dec r15 + 1590: 08 94 sec + 1592: a1 08 sbc r10, r1 + 1594: b1 08 sbc r11, r1 + 1596: a1 14 cp r10, r1 + 1598: b1 04 cpc r11, r1 + 159a: 69 f7 brne .-38 ; 0x1576 + 159c: e9 c0 rjmp .+466 ; 0x1770 + 159e: 84 36 cpi r24, 0x64 ; 100 + 15a0: 11 f0 breq .+4 ; 0x15a6 + 15a2: 89 36 cpi r24, 0x69 ; 105 + 15a4: 41 f5 brne .+80 ; 0x15f6 + 15a6: 27 ff sbrs r18, 7 + 15a8: 08 c0 rjmp .+16 ; 0x15ba + 15aa: f8 01 movw r30, r16 + 15ac: 60 81 ld r22, Z + 15ae: 71 81 ldd r23, Z+1 ; 0x01 + 15b0: 82 81 ldd r24, Z+2 ; 0x02 + 15b2: 93 81 ldd r25, Z+3 ; 0x03 + 15b4: 0c 5f subi r16, 0xFC ; 252 + 15b6: 1f 4f sbci r17, 0xFF ; 255 + 15b8: 09 c0 rjmp .+18 ; 0x15cc + 15ba: f8 01 movw r30, r16 + 15bc: 60 81 ld r22, Z + 15be: 71 81 ldd r23, Z+1 ; 0x01 + 15c0: 88 27 eor r24, r24 + 15c2: 77 fd sbrc r23, 7 + 15c4: 80 95 com r24 + 15c6: 98 2f mov r25, r24 + 15c8: 0e 5f subi r16, 0xFE ; 254 + 15ca: 1f 4f sbci r17, 0xFF ; 255 + 15cc: 4f e6 ldi r20, 0x6F ; 111 + 15ce: b4 2e mov r11, r20 + 15d0: b2 22 and r11, r18 + 15d2: 97 ff sbrs r25, 7 + 15d4: 09 c0 rjmp .+18 ; 0x15e8 + 15d6: 90 95 com r25 + 15d8: 80 95 com r24 + 15da: 70 95 com r23 + 15dc: 61 95 neg r22 + 15de: 7f 4f sbci r23, 0xFF ; 255 + 15e0: 8f 4f sbci r24, 0xFF ; 255 + 15e2: 9f 4f sbci r25, 0xFF ; 255 + 15e4: f0 e8 ldi r31, 0x80 ; 128 + 15e6: bf 2a or r11, r31 + 15e8: a2 01 movw r20, r4 + 15ea: 2a e0 ldi r18, 0x0A ; 10 + 15ec: 30 e0 ldi r19, 0x00 ; 0 + 15ee: 25 d1 rcall .+586 ; 0x183a <__ultoa_invert> + 15f0: 78 2e mov r7, r24 + 15f2: 74 18 sub r7, r4 + 15f4: 44 c0 rjmp .+136 ; 0x167e + 15f6: 85 37 cpi r24, 0x75 ; 117 + 15f8: 31 f4 brne .+12 ; 0x1606 + 15fa: 3f ee ldi r19, 0xEF ; 239 + 15fc: b3 2e mov r11, r19 + 15fe: b2 22 and r11, r18 + 1600: 2a e0 ldi r18, 0x0A ; 10 + 1602: 30 e0 ldi r19, 0x00 ; 0 + 1604: 25 c0 rjmp .+74 ; 0x1650 + 1606: 99 ef ldi r25, 0xF9 ; 249 + 1608: b9 2e mov r11, r25 + 160a: b2 22 and r11, r18 + 160c: 8f 36 cpi r24, 0x6F ; 111 + 160e: c1 f0 breq .+48 ; 0x1640 + 1610: 80 37 cpi r24, 0x70 ; 112 + 1612: 20 f4 brcc .+8 ; 0x161c + 1614: 88 35 cpi r24, 0x58 ; 88 + 1616: 09 f0 breq .+2 ; 0x161a + 1618: ae c0 rjmp .+348 ; 0x1776 + 161a: 0d c0 rjmp .+26 ; 0x1636 + 161c: 80 37 cpi r24, 0x70 ; 112 + 161e: 21 f0 breq .+8 ; 0x1628 + 1620: 88 37 cpi r24, 0x78 ; 120 + 1622: 09 f0 breq .+2 ; 0x1626 + 1624: a8 c0 rjmp .+336 ; 0x1776 + 1626: 02 c0 rjmp .+4 ; 0x162c + 1628: 20 e1 ldi r18, 0x10 ; 16 + 162a: b2 2a or r11, r18 + 162c: b4 fe sbrs r11, 4 + 162e: 0b c0 rjmp .+22 ; 0x1646 + 1630: 84 e0 ldi r24, 0x04 ; 4 + 1632: b8 2a or r11, r24 + 1634: 08 c0 rjmp .+16 ; 0x1646 + 1636: b4 fe sbrs r11, 4 + 1638: 09 c0 rjmp .+18 ; 0x164c + 163a: e6 e0 ldi r30, 0x06 ; 6 + 163c: be 2a or r11, r30 + 163e: 06 c0 rjmp .+12 ; 0x164c + 1640: 28 e0 ldi r18, 0x08 ; 8 + 1642: 30 e0 ldi r19, 0x00 ; 0 + 1644: 05 c0 rjmp .+10 ; 0x1650 + 1646: 20 e1 ldi r18, 0x10 ; 16 + 1648: 30 e0 ldi r19, 0x00 ; 0 + 164a: 02 c0 rjmp .+4 ; 0x1650 + 164c: 20 e1 ldi r18, 0x10 ; 16 + 164e: 32 e0 ldi r19, 0x02 ; 2 + 1650: b7 fe sbrs r11, 7 + 1652: 08 c0 rjmp .+16 ; 0x1664 + 1654: f8 01 movw r30, r16 + 1656: 60 81 ld r22, Z + 1658: 71 81 ldd r23, Z+1 ; 0x01 + 165a: 82 81 ldd r24, Z+2 ; 0x02 + 165c: 93 81 ldd r25, Z+3 ; 0x03 + 165e: 0c 5f subi r16, 0xFC ; 252 + 1660: 1f 4f sbci r17, 0xFF ; 255 + 1662: 07 c0 rjmp .+14 ; 0x1672 + 1664: f8 01 movw r30, r16 + 1666: 60 81 ld r22, Z + 1668: 71 81 ldd r23, Z+1 ; 0x01 + 166a: 80 e0 ldi r24, 0x00 ; 0 + 166c: 90 e0 ldi r25, 0x00 ; 0 + 166e: 0e 5f subi r16, 0xFE ; 254 + 1670: 1f 4f sbci r17, 0xFF ; 255 + 1672: a2 01 movw r20, r4 + 1674: e2 d0 rcall .+452 ; 0x183a <__ultoa_invert> + 1676: 78 2e mov r7, r24 + 1678: 74 18 sub r7, r4 + 167a: ff e7 ldi r31, 0x7F ; 127 + 167c: bf 22 and r11, r31 + 167e: b6 fe sbrs r11, 6 + 1680: 0b c0 rjmp .+22 ; 0x1698 + 1682: 2e ef ldi r18, 0xFE ; 254 + 1684: b2 22 and r11, r18 + 1686: 7e 14 cp r7, r14 + 1688: 38 f4 brcc .+14 ; 0x1698 + 168a: b4 fe sbrs r11, 4 + 168c: 07 c0 rjmp .+14 ; 0x169c + 168e: b2 fc sbrc r11, 2 + 1690: 05 c0 rjmp .+10 ; 0x169c + 1692: 8f ee ldi r24, 0xEF ; 239 + 1694: b8 22 and r11, r24 + 1696: 02 c0 rjmp .+4 ; 0x169c + 1698: a7 2c mov r10, r7 + 169a: 01 c0 rjmp .+2 ; 0x169e + 169c: ae 2c mov r10, r14 + 169e: 8b 2d mov r24, r11 + 16a0: 90 e0 ldi r25, 0x00 ; 0 + 16a2: b4 fe sbrs r11, 4 + 16a4: 0d c0 rjmp .+26 ; 0x16c0 + 16a6: fe 01 movw r30, r28 + 16a8: e7 0d add r30, r7 + 16aa: f1 1d adc r31, r1 + 16ac: 20 81 ld r18, Z + 16ae: 20 33 cpi r18, 0x30 ; 48 + 16b0: 19 f4 brne .+6 ; 0x16b8 + 16b2: e9 ee ldi r30, 0xE9 ; 233 + 16b4: be 22 and r11, r30 + 16b6: 09 c0 rjmp .+18 ; 0x16ca + 16b8: a3 94 inc r10 + 16ba: b2 fe sbrs r11, 2 + 16bc: 06 c0 rjmp .+12 ; 0x16ca + 16be: 04 c0 rjmp .+8 ; 0x16c8 + 16c0: 86 78 andi r24, 0x86 ; 134 + 16c2: 90 70 andi r25, 0x00 ; 0 + 16c4: 00 97 sbiw r24, 0x00 ; 0 + 16c6: 09 f0 breq .+2 ; 0x16ca + 16c8: a3 94 inc r10 + 16ca: 8b 2c mov r8, r11 + 16cc: 99 24 eor r9, r9 + 16ce: b3 fc sbrc r11, 3 + 16d0: 13 c0 rjmp .+38 ; 0x16f8 + 16d2: b0 fe sbrs r11, 0 + 16d4: 0e c0 rjmp .+28 ; 0x16f2 + 16d6: af 14 cp r10, r15 + 16d8: 28 f4 brcc .+10 ; 0x16e4 + 16da: e7 2c mov r14, r7 + 16dc: ef 0c add r14, r15 + 16de: ea 18 sub r14, r10 + 16e0: af 2c mov r10, r15 + 16e2: 07 c0 rjmp .+14 ; 0x16f2 + 16e4: e7 2c mov r14, r7 + 16e6: 05 c0 rjmp .+10 ; 0x16f2 + 16e8: 80 e2 ldi r24, 0x20 ; 32 + 16ea: 90 e0 ldi r25, 0x00 ; 0 + 16ec: b6 01 movw r22, r12 + 16ee: 79 d0 rcall .+242 ; 0x17e2 + 16f0: a3 94 inc r10 + 16f2: af 14 cp r10, r15 + 16f4: c8 f3 brcs .-14 ; 0x16e8 + 16f6: 04 c0 rjmp .+8 ; 0x1700 + 16f8: af 14 cp r10, r15 + 16fa: 10 f4 brcc .+4 ; 0x1700 + 16fc: fa 18 sub r15, r10 + 16fe: 01 c0 rjmp .+2 ; 0x1702 + 1700: ff 24 eor r15, r15 + 1702: 84 fe sbrs r8, 4 + 1704: 0e c0 rjmp .+28 ; 0x1722 + 1706: 80 e3 ldi r24, 0x30 ; 48 + 1708: 90 e0 ldi r25, 0x00 ; 0 + 170a: b6 01 movw r22, r12 + 170c: 6a d0 rcall .+212 ; 0x17e2 + 170e: 82 fe sbrs r8, 2 + 1710: 1d c0 rjmp .+58 ; 0x174c + 1712: 81 fe sbrs r8, 1 + 1714: 03 c0 rjmp .+6 ; 0x171c + 1716: 88 e5 ldi r24, 0x58 ; 88 + 1718: 90 e0 ldi r25, 0x00 ; 0 + 171a: 10 c0 rjmp .+32 ; 0x173c + 171c: 88 e7 ldi r24, 0x78 ; 120 + 171e: 90 e0 ldi r25, 0x00 ; 0 + 1720: 0d c0 rjmp .+26 ; 0x173c + 1722: c4 01 movw r24, r8 + 1724: 86 78 andi r24, 0x86 ; 134 + 1726: 90 70 andi r25, 0x00 ; 0 + 1728: 00 97 sbiw r24, 0x00 ; 0 + 172a: 81 f0 breq .+32 ; 0x174c + 172c: 81 fc sbrc r8, 1 + 172e: 02 c0 rjmp .+4 ; 0x1734 + 1730: 80 e2 ldi r24, 0x20 ; 32 + 1732: 01 c0 rjmp .+2 ; 0x1736 + 1734: 8b e2 ldi r24, 0x2B ; 43 + 1736: b7 fc sbrc r11, 7 + 1738: 8d e2 ldi r24, 0x2D ; 45 + 173a: 90 e0 ldi r25, 0x00 ; 0 + 173c: b6 01 movw r22, r12 + 173e: 51 d0 rcall .+162 ; 0x17e2 + 1740: 05 c0 rjmp .+10 ; 0x174c + 1742: 80 e3 ldi r24, 0x30 ; 48 + 1744: 90 e0 ldi r25, 0x00 ; 0 + 1746: b6 01 movw r22, r12 + 1748: 4c d0 rcall .+152 ; 0x17e2 + 174a: ea 94 dec r14 + 174c: 7e 14 cp r7, r14 + 174e: c8 f3 brcs .-14 ; 0x1742 + 1750: 7a 94 dec r7 + 1752: f2 01 movw r30, r4 + 1754: e7 0d add r30, r7 + 1756: f1 1d adc r31, r1 + 1758: 80 81 ld r24, Z + 175a: 90 e0 ldi r25, 0x00 ; 0 + 175c: b6 01 movw r22, r12 + 175e: 41 d0 rcall .+130 ; 0x17e2 + 1760: 77 20 and r7, r7 + 1762: b1 f7 brne .-20 ; 0x1750 + 1764: 05 c0 rjmp .+10 ; 0x1770 + 1766: 80 e2 ldi r24, 0x20 ; 32 + 1768: 90 e0 ldi r25, 0x00 ; 0 + 176a: b6 01 movw r22, r12 + 176c: 3a d0 rcall .+116 ; 0x17e2 + 176e: fa 94 dec r15 + 1770: ff 20 and r15, r15 + 1772: c9 f7 brne .-14 ; 0x1766 + 1774: 44 ce rjmp .-888 ; 0x13fe + 1776: f6 01 movw r30, r12 + 1778: 26 81 ldd r18, Z+6 ; 0x06 + 177a: 37 81 ldd r19, Z+7 ; 0x07 + 177c: 02 c0 rjmp .+4 ; 0x1782 + 177e: 2f ef ldi r18, 0xFF ; 255 + 1780: 3f ef ldi r19, 0xFF ; 255 + 1782: c9 01 movw r24, r18 + 1784: 2c 96 adiw r28, 0x0c ; 12 + 1786: 0f b6 in r0, 0x3f ; 63 + 1788: f8 94 cli + 178a: de bf out 0x3e, r29 ; 62 + 178c: 0f be out 0x3f, r0 ; 63 + 178e: cd bf out 0x3d, r28 ; 61 + 1790: cf 91 pop r28 + 1792: df 91 pop r29 + 1794: 1f 91 pop r17 + 1796: 0f 91 pop r16 + 1798: ff 90 pop r15 + 179a: ef 90 pop r14 + 179c: df 90 pop r13 + 179e: cf 90 pop r12 + 17a0: bf 90 pop r11 + 17a2: af 90 pop r10 + 17a4: 9f 90 pop r9 + 17a6: 8f 90 pop r8 + 17a8: 7f 90 pop r7 + 17aa: 6f 90 pop r6 + 17ac: 5f 90 pop r5 + 17ae: 4f 90 pop r4 + 17b0: 3f 90 pop r3 + 17b2: 2f 90 pop r2 + 17b4: 08 95 ret + +000017b6 : + 17b6: fc 01 movw r30, r24 + 17b8: 05 90 lpm r0, Z+ + 17ba: 61 50 subi r22, 0x01 ; 1 + 17bc: 70 40 sbci r23, 0x00 ; 0 + 17be: 01 10 cpse r0, r1 + 17c0: d8 f7 brcc .-10 ; 0x17b8 + 17c2: 80 95 com r24 + 17c4: 90 95 com r25 + 17c6: 8e 0f add r24, r30 + 17c8: 9f 1f adc r25, r31 + 17ca: 08 95 ret + +000017cc : + 17cc: fc 01 movw r30, r24 + 17ce: 61 50 subi r22, 0x01 ; 1 + 17d0: 70 40 sbci r23, 0x00 ; 0 + 17d2: 01 90 ld r0, Z+ + 17d4: 01 10 cpse r0, r1 + 17d6: d8 f7 brcc .-10 ; 0x17ce + 17d8: 80 95 com r24 + 17da: 90 95 com r25 + 17dc: 8e 0f add r24, r30 + 17de: 9f 1f adc r25, r31 + 17e0: 08 95 ret + +000017e2 : + 17e2: 0f 93 push r16 + 17e4: 1f 93 push r17 + 17e6: cf 93 push r28 + 17e8: df 93 push r29 + 17ea: 8c 01 movw r16, r24 + 17ec: eb 01 movw r28, r22 + 17ee: 8b 81 ldd r24, Y+3 ; 0x03 + 17f0: 81 ff sbrs r24, 1 + 17f2: 1b c0 rjmp .+54 ; 0x182a + 17f4: 82 ff sbrs r24, 2 + 17f6: 0d c0 rjmp .+26 ; 0x1812 + 17f8: 2e 81 ldd r18, Y+6 ; 0x06 + 17fa: 3f 81 ldd r19, Y+7 ; 0x07 + 17fc: 8c 81 ldd r24, Y+4 ; 0x04 + 17fe: 9d 81 ldd r25, Y+5 ; 0x05 + 1800: 28 17 cp r18, r24 + 1802: 39 07 cpc r19, r25 + 1804: 64 f4 brge .+24 ; 0x181e + 1806: e8 81 ld r30, Y + 1808: f9 81 ldd r31, Y+1 ; 0x01 + 180a: 01 93 st Z+, r16 + 180c: f9 83 std Y+1, r31 ; 0x01 + 180e: e8 83 st Y, r30 + 1810: 06 c0 rjmp .+12 ; 0x181e + 1812: e8 85 ldd r30, Y+8 ; 0x08 + 1814: f9 85 ldd r31, Y+9 ; 0x09 + 1816: 80 2f mov r24, r16 + 1818: 09 95 icall + 181a: 00 97 sbiw r24, 0x00 ; 0 + 181c: 31 f4 brne .+12 ; 0x182a + 181e: 8e 81 ldd r24, Y+6 ; 0x06 + 1820: 9f 81 ldd r25, Y+7 ; 0x07 + 1822: 01 96 adiw r24, 0x01 ; 1 + 1824: 9f 83 std Y+7, r25 ; 0x07 + 1826: 8e 83 std Y+6, r24 ; 0x06 + 1828: 02 c0 rjmp .+4 ; 0x182e + 182a: 0f ef ldi r16, 0xFF ; 255 + 182c: 1f ef ldi r17, 0xFF ; 255 + 182e: c8 01 movw r24, r16 + 1830: df 91 pop r29 + 1832: cf 91 pop r28 + 1834: 1f 91 pop r17 + 1836: 0f 91 pop r16 + 1838: 08 95 ret + +0000183a <__ultoa_invert>: + 183a: fa 01 movw r30, r20 + 183c: aa 27 eor r26, r26 + 183e: 28 30 cpi r18, 0x08 ; 8 + 1840: 51 f1 breq .+84 ; 0x1896 <__ultoa_invert+0x5c> + 1842: 20 31 cpi r18, 0x10 ; 16 + 1844: 81 f1 breq .+96 ; 0x18a6 <__ultoa_invert+0x6c> + 1846: e8 94 clt + 1848: 6f 93 push r22 + 184a: 6e 7f andi r22, 0xFE ; 254 + 184c: 6e 5f subi r22, 0xFE ; 254 + 184e: 7f 4f sbci r23, 0xFF ; 255 + 1850: 8f 4f sbci r24, 0xFF ; 255 + 1852: 9f 4f sbci r25, 0xFF ; 255 + 1854: af 4f sbci r26, 0xFF ; 255 + 1856: b1 e0 ldi r27, 0x01 ; 1 + 1858: 3e d0 rcall .+124 ; 0x18d6 <__ultoa_invert+0x9c> + 185a: b4 e0 ldi r27, 0x04 ; 4 + 185c: 3c d0 rcall .+120 ; 0x18d6 <__ultoa_invert+0x9c> + 185e: 67 0f add r22, r23 + 1860: 78 1f adc r23, r24 + 1862: 89 1f adc r24, r25 + 1864: 9a 1f adc r25, r26 + 1866: a1 1d adc r26, r1 + 1868: 68 0f add r22, r24 + 186a: 79 1f adc r23, r25 + 186c: 8a 1f adc r24, r26 + 186e: 91 1d adc r25, r1 + 1870: a1 1d adc r26, r1 + 1872: 6a 0f add r22, r26 + 1874: 71 1d adc r23, r1 + 1876: 81 1d adc r24, r1 + 1878: 91 1d adc r25, r1 + 187a: a1 1d adc r26, r1 + 187c: 20 d0 rcall .+64 ; 0x18be <__ultoa_invert+0x84> + 187e: 09 f4 brne .+2 ; 0x1882 <__ultoa_invert+0x48> + 1880: 68 94 set + 1882: 3f 91 pop r19 + 1884: 2a e0 ldi r18, 0x0A ; 10 + 1886: 26 9f mul r18, r22 + 1888: 11 24 eor r1, r1 + 188a: 30 19 sub r19, r0 + 188c: 30 5d subi r19, 0xD0 ; 208 + 188e: 31 93 st Z+, r19 + 1890: de f6 brtc .-74 ; 0x1848 <__ultoa_invert+0xe> + 1892: cf 01 movw r24, r30 + 1894: 08 95 ret + 1896: 46 2f mov r20, r22 + 1898: 47 70 andi r20, 0x07 ; 7 + 189a: 40 5d subi r20, 0xD0 ; 208 + 189c: 41 93 st Z+, r20 + 189e: b3 e0 ldi r27, 0x03 ; 3 + 18a0: 0f d0 rcall .+30 ; 0x18c0 <__ultoa_invert+0x86> + 18a2: c9 f7 brne .-14 ; 0x1896 <__ultoa_invert+0x5c> + 18a4: f6 cf rjmp .-20 ; 0x1892 <__ultoa_invert+0x58> + 18a6: 46 2f mov r20, r22 + 18a8: 4f 70 andi r20, 0x0F ; 15 + 18aa: 40 5d subi r20, 0xD0 ; 208 + 18ac: 4a 33 cpi r20, 0x3A ; 58 + 18ae: 18 f0 brcs .+6 ; 0x18b6 <__ultoa_invert+0x7c> + 18b0: 49 5d subi r20, 0xD9 ; 217 + 18b2: 31 fd sbrc r19, 1 + 18b4: 40 52 subi r20, 0x20 ; 32 + 18b6: 41 93 st Z+, r20 + 18b8: 02 d0 rcall .+4 ; 0x18be <__ultoa_invert+0x84> + 18ba: a9 f7 brne .-22 ; 0x18a6 <__ultoa_invert+0x6c> + 18bc: ea cf rjmp .-44 ; 0x1892 <__ultoa_invert+0x58> + 18be: b4 e0 ldi r27, 0x04 ; 4 + 18c0: a6 95 lsr r26 + 18c2: 97 95 ror r25 + 18c4: 87 95 ror r24 + 18c6: 77 95 ror r23 + 18c8: 67 95 ror r22 + 18ca: ba 95 dec r27 + 18cc: c9 f7 brne .-14 ; 0x18c0 <__ultoa_invert+0x86> + 18ce: 00 97 sbiw r24, 0x00 ; 0 + 18d0: 61 05 cpc r22, r1 + 18d2: 71 05 cpc r23, r1 + 18d4: 08 95 ret + 18d6: 9b 01 movw r18, r22 + 18d8: ac 01 movw r20, r24 + 18da: 0a 2e mov r0, r26 + 18dc: 06 94 lsr r0 + 18de: 57 95 ror r21 + 18e0: 47 95 ror r20 + 18e2: 37 95 ror r19 + 18e4: 27 95 ror r18 + 18e6: ba 95 dec r27 + 18e8: c9 f7 brne .-14 ; 0x18dc <__ultoa_invert+0xa2> + 18ea: 62 0f add r22, r18 + 18ec: 73 1f adc r23, r19 + 18ee: 84 1f adc r24, r20 + 18f0: 95 1f adc r25, r21 + 18f2: a0 1d adc r26, r0 + 18f4: 08 95 ret + +000018f6 <_exit>: + 18f6: f8 94 cli + +000018f8 <__stop_program>: + 18f8: ff cf rjmp .-2 ; 0x18f8 <__stop_program> diff --git a/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.lst b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.lst new file mode 100644 index 0000000000..c99fb0e1da --- /dev/null +++ b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.lst @@ -0,0 +1,853 @@ + 1 .file "AudioInputHost.c" + 2 __SREG__ = 0x3f + 3 __SP_H__ = 0x3e + 4 __SP_L__ = 0x3d + 5 __CCP__ = 0x34 + 6 __tmp_reg__ = 0 + 7 __zero_reg__ = 1 + 15 .Ltext0: + 16 .section .text.LEDs_SetAllLEDs,"ax",@progbits + 18 LEDs_SetAllLEDs: + 19 .LFB127: + 20 .LSM0: + 21 .LVL0: + 22 /* prologue: function */ + 23 /* frame size = 0 */ + 24 /* stack size = 0 */ + 25 .L__stack_usage = 0 + 26 .LSM1: + 27 0000 9BB1 in r25,43-32 + 28 0002 9F70 andi r25,lo8(15) + 29 0004 982B or r25,r24 + 30 0006 9BB9 out 43-32,r25 + 31 /* epilogue start */ + 32 .LSM2: + 33 0008 0895 ret + 34 .LFE127: + 36 .section .text.SetupHardware,"ax",@progbits + 37 .global SetupHardware + 39 SetupHardware: + 40 .LFB132: + 41 .LSM3: + 42 /* prologue: function */ + 43 /* frame size = 0 */ + 44 /* stack size = 0 */ + 45 .L__stack_usage = 0 + 46 .LSM4: + 47 0000 84B7 in r24,84-32 + 48 0002 877F andi r24,lo8(-9) + 49 0004 84BF out 84-32,r24 + 50 .LSM5: + 51 0006 28E1 ldi r18,lo8(24) + 52 /* #APP */ + 53 ; 63 "AudioInputHost.c" 1 + 54 0008 0FB6 in __tmp_reg__, __SREG__ + 55 000a F894 cli + 56 000c 2093 6000 sts 96, r18 + 57 0010 1092 6000 sts 96, __zero_reg__ + 58 0014 0FBE out __SREG__,__tmp_reg__ + 59 + 60 ; 0 "" 2 + 61 .LVL1: + 62 /* #NOAPP */ + 63 .LBB39: + 64 .LBB40: + 65 .LSM6: + 66 0016 90E0 ldi r25,lo8(0) + 67 0018 80E8 ldi r24,lo8(-128) + 68 /* #APP */ + 69 ; 1614 "c:\program files (x86)\atmel\avr studio 5.0\extensions\application\avr toolchain\bin\../l + 70 001a 0FB6 in __tmp_reg__,__SREG__ + 71 001c F894 cli + 72 001e 8093 6100 sts 97, r24 + 73 0022 9093 6100 sts 97, r25 + 74 0026 0FBE out __SREG__, __tmp_reg__ + 75 ; 0 "" 2 + 76 .LVL2: + 77 /* #NOAPP */ + 78 .LBE40: + 79 .LBE39: + 80 .LBB41: + 81 .LBB42: + 82 .LSM7: + 83 0028 83E3 ldi r24,lo8(51) + 84 002a 90E0 ldi r25,hi8(51) + 85 002c 9093 CD00 sts 204+1,r25 + 86 0030 8093 CC00 sts 204,r24 + 87 .LSM8: + 88 0034 86E0 ldi r24,lo8(6) + 89 0036 8093 CA00 sts 202,r24 + 90 .LSM9: + 91 003a 1092 C800 sts 200,__zero_reg__ + 92 .LSM10: + 93 003e 2093 C900 sts 201,r18 + 94 .LSM11: + 95 0042 539A sbi 42-32,3 + 96 .LSM12: + 97 0044 5A9A sbi 43-32,2 + 98 .LBE42: + 99 .LBE41: + 100 .LBB43: + 101 .LBB44: + 102 .LSM13: + 103 0046 8AB1 in r24,42-32 + 104 0048 806F ori r24,lo8(-16) + 105 004a 8AB9 out 42-32,r24 + 106 .LSM14: + 107 004c 8BB1 in r24,43-32 + 108 004e 8F70 andi r24,lo8(15) + 109 0050 8BB9 out 43-32,r24 + 110 .LBE44: + 111 .LBE43: + 112 .LSM15: + 113 0052 0E94 0000 call USB_Init + 114 .LVL3: + 115 .LBB45: + 116 .LBB46: + 117 .LSM16: + 118 0056 E0E0 ldi r30,lo8(USARTSerialStream) + 119 0058 F0E0 ldi r31,hi8(USARTSerialStream) + 120 005a F093 0000 sts __iob+1,r31 + 121 005e E093 0000 sts __iob,r30 + 122 .LSM17: + 123 0062 F093 0000 sts __iob+2+1,r31 + 124 0066 E093 0000 sts __iob+2,r30 + 125 .LSM18: + 126 006a 8EE0 ldi r24,lo8(14) + 127 006c DF01 movw r26,r30 + 128 006e 1D92 st X+,__zero_reg__ + 129 0070 8A95 dec r24 + 130 0072 01F4 brne .-6 + 131 0074 83E0 ldi r24,lo8(3) + 132 0076 8093 0000 sts USARTSerialStream+3,r24 + 133 007a 80E0 ldi r24,lo8(gs(Serial_putchar)) + 134 007c 90E0 ldi r25,hi8(gs(Serial_putchar)) + 135 007e 9093 0000 sts USARTSerialStream+8+1,r25 + 136 0082 8093 0000 sts USARTSerialStream+8,r24 + 137 0086 80E0 ldi r24,lo8(gs(Serial_getchar)) + 138 0088 90E0 ldi r25,hi8(gs(Serial_getchar)) + 139 008a 9093 0000 sts USARTSerialStream+10+1,r25 + 140 008e 8093 0000 sts USARTSerialStream+10,r24 + 141 /* epilogue start */ + 142 .LBE46: + 143 .LBE45: + 144 .LSM19: + 145 0092 0895 ret + 146 .LFE132: + 148 .section .text.EVENT_USB_Host_DeviceAttached,"ax",@progbits + 149 .global EVENT_USB_Host_DeviceAttached + 151 EVENT_USB_Host_DeviceAttached: + 152 .LFB133: + 153 .LSM20: + 154 /* prologue: function */ + 155 /* frame size = 0 */ + 156 /* stack size = 0 */ + 157 .L__stack_usage = 0 + 158 .LSM21: + 159 0000 80E0 ldi r24,lo8(__c.3897) + 160 0002 90E0 ldi r25,hi8(__c.3897) + 161 0004 0E94 0000 call puts_P + 162 .LSM22: + 163 0008 80EA ldi r24,lo8(-96) + 164 000a 0E94 0000 call LEDs_SetAllLEDs + 165 /* epilogue start */ + 166 .LSM23: + 167 000e 0895 ret + 168 .LFE133: + 170 .section .text.EVENT_USB_Host_DeviceUnattached,"ax",@progbits + 171 .global EVENT_USB_Host_DeviceUnattached + 173 EVENT_USB_Host_DeviceUnattached: + 174 .LFB134: + 175 .LSM24: + 176 /* prologue: function */ + 177 /* frame size = 0 */ + 178 /* stack size = 0 */ + 179 .L__stack_usage = 0 + 180 .LSM25: + 181 0000 80E0 ldi r24,lo8(__c.3902) + 182 0002 90E0 ldi r25,hi8(__c.3902) + 183 0004 0E94 0000 call puts_P + 184 .LSM26: + 185 0008 80E1 ldi r24,lo8(16) + 186 000a 0E94 0000 call LEDs_SetAllLEDs + 187 /* epilogue start */ + 188 .LSM27: + 189 000e 0895 ret + 190 .LFE134: + 192 .section .text.EVENT_USB_Host_DeviceEnumerationComplete,"ax",@progbits + 193 .global EVENT_USB_Host_DeviceEnumerationComplete + 195 EVENT_USB_Host_DeviceEnumerationComplete: + 196 .LFB135: + 197 .LSM28: + 198 /* prologue: function */ + 199 /* frame size = 0 */ + 200 /* stack size = 0 */ + 201 .L__stack_usage = 0 + 202 .LSM29: + 203 0000 80E6 ldi r24,lo8(96) + 204 0002 0E94 0000 call LEDs_SetAllLEDs + 205 /* epilogue start */ + 206 .LSM30: + 207 0006 0895 ret + 208 .LFE135: + 210 .section .text.EVENT_USB_Host_HostError,"ax",@progbits + 211 .global EVENT_USB_Host_HostError + 213 EVENT_USB_Host_HostError: + 214 .LFB136: + 215 .LSM31: + 216 .LVL4: + 217 0000 DF93 push r29 + 218 0002 CF93 push r28 + 219 0004 0F92 push __tmp_reg__ + 220 0006 CDB7 in r28,__SP_L__ + 221 0008 DEB7 in r29,__SP_H__ + 222 /* prologue: function */ + 223 /* frame size = 1 */ + 224 /* stack size = 3 */ + 225 .L__stack_usage = 3 + 226 .LSM32: + 227 000a 8983 std Y+1,r24 + 228 000c 0E94 0000 call USB_Disable + 229 .LVL5: + 230 .LSM33: + 231 0010 00D0 rcall . + 232 0012 00D0 rcall . + 233 0014 EDB7 in r30,__SP_L__ + 234 0016 FEB7 in r31,__SP_H__ + 235 0018 3196 adiw r30,1 + 236 001a 20E0 ldi r18,lo8(__c.3910) + 237 001c 30E0 ldi r19,hi8(__c.3910) + 238 001e ADB7 in r26,__SP_L__ + 239 0020 BEB7 in r27,__SP_H__ + 240 0022 1296 adiw r26,1+1 + 241 0024 3C93 st X,r19 + 242 0026 2E93 st -X,r18 + 243 0028 1197 sbiw r26,1 + 244 002a 8981 ldd r24,Y+1 + 245 002c 8283 std Z+2,r24 + 246 002e 1382 std Z+3,__zero_reg__ + 247 0030 0E94 0000 call printf_P + 248 .LSM34: + 249 0034 0F90 pop __tmp_reg__ + 250 0036 0F90 pop __tmp_reg__ + 251 0038 0F90 pop __tmp_reg__ + 252 003a 0F90 pop __tmp_reg__ + 253 003c 80E9 ldi r24,lo8(-112) + 254 003e 0E94 0000 call LEDs_SetAllLEDs + 255 .L7: + 256 0042 00C0 rjmp .L7 + 257 .LFE136: + 259 .section .text.EVENT_USB_Host_DeviceEnumerationFailed,"ax",@progbits + 260 .global EVENT_USB_Host_DeviceEnumerationFailed + 262 EVENT_USB_Host_DeviceEnumerationFailed: + 263 .LFB137: + 264 .LSM35: + 265 .LVL6: + 266 /* prologue: function */ + 267 /* frame size = 0 */ + 268 /* stack size = 0 */ + 269 .L__stack_usage = 0 + 270 .LSM36: + 271 0000 9091 0000 lds r25,USB_HostState + 272 0004 2DB7 in r18,__SP_L__ + 273 0006 3EB7 in r19,__SP_H__ + 274 0008 2850 subi r18,lo8(-(-8)) + 275 000a 3040 sbci r19,hi8(-(-8)) + 276 000c 0FB6 in __tmp_reg__,__SREG__ + 277 000e F894 cli + 278 0010 3EBF out __SP_H__,r19 + 279 0012 0FBE out __SREG__,__tmp_reg__ + 280 0014 2DBF out __SP_L__,r18 + 281 0016 EDB7 in r30,__SP_L__ + 282 0018 FEB7 in r31,__SP_H__ + 283 001a 3196 adiw r30,1 + 284 001c 20E0 ldi r18,lo8(__c.3917) + 285 001e 30E0 ldi r19,hi8(__c.3917) + 286 0020 ADB7 in r26,__SP_L__ + 287 0022 BEB7 in r27,__SP_H__ + 288 0024 1296 adiw r26,1+1 + 289 0026 3C93 st X,r19 + 290 0028 2E93 st -X,r18 + 291 002a 1197 sbiw r26,1 + 292 002c 8283 std Z+2,r24 + 293 002e 1382 std Z+3,__zero_reg__ + 294 0030 6483 std Z+4,r22 + 295 0032 1582 std Z+5,__zero_reg__ + 296 0034 9683 std Z+6,r25 + 297 0036 1782 std Z+7,__zero_reg__ + 298 0038 0E94 0000 call printf_P + 299 .LVL7: + 300 .LSM37: + 301 003c 2DB7 in r18,__SP_L__ + 302 003e 3EB7 in r19,__SP_H__ + 303 0040 285F subi r18,lo8(-(8)) + 304 0042 3F4F sbci r19,hi8(-(8)) + 305 0044 0FB6 in __tmp_reg__,__SREG__ + 306 0046 F894 cli + 307 0048 3EBF out __SP_H__,r19 + 308 004a 0FBE out __SREG__,__tmp_reg__ + 309 004c 2DBF out __SP_L__,r18 + 310 004e 80E9 ldi r24,lo8(-112) + 311 0050 0E94 0000 call LEDs_SetAllLEDs + 312 /* epilogue start */ + 313 .LSM38: + 314 0054 0895 ret + 315 .LFE137: + 317 .section .text.Audio_Task,"ax",@progbits + 318 .global Audio_Task + 320 Audio_Task: + 321 .LFB138: + 322 .LSM39: + 323 0000 1F93 push r17 + 324 0002 DF93 push r29 + 325 0004 CF93 push r28 + 326 0006 00D0 rcall . + 327 0008 0F92 push __tmp_reg__ + 328 000a CDB7 in r28,__SP_L__ + 329 000c DEB7 in r29,__SP_H__ + 330 /* prologue: function */ + 331 /* frame size = 3 */ + 332 /* stack size = 6 */ + 333 .L__stack_usage = 6 + 334 .LSM40: + 335 000e 8091 0000 lds r24,USB_HostState + 336 0012 8B30 cpi r24,lo8(11) + 337 0014 01F0 breq .+2 + 338 0016 00C0 rjmp .L9 + 339 .LBB47: + 340 .LSM41: + 341 0018 80E0 ldi r24,lo8(__c.3924) + 342 001a 90E0 ldi r25,hi8(__c.3924) + 343 001c 0E94 0000 call puts_P + 344 .LSM42: + 345 0020 0E94 0000 call ProcessConfigurationDescriptor + 346 0024 182F mov r17,r24 + 347 .LVL8: + 348 0026 8823 tst r24 + 349 0028 01F0 breq .L12 + 350 .LSM43: + 351 002a 8130 cpi r24,lo8(1) + 352 002c 01F4 brne .L13 + 353 .LSM44: + 354 002e 80E0 ldi r24,lo8(__c.3926) + 355 0030 90E0 ldi r25,hi8(__c.3926) + 356 .LVL9: + 357 0032 00C0 rjmp .L20 + 358 .L13: + 359 .LSM45: + 360 0034 80E0 ldi r24,lo8(__c.3928) + 361 0036 90E0 ldi r25,hi8(__c.3928) + 362 .L20: + 363 0038 0E94 0000 call puts_P + 364 .LSM46: + 365 003c 00D0 rcall . + 366 003e 00D0 rcall . + 367 0040 EDB7 in r30,__SP_L__ + 368 0042 FEB7 in r31,__SP_H__ + 369 0044 3196 adiw r30,1 + 370 0046 20E0 ldi r18,lo8(__c.3930) + 371 0048 30E0 ldi r19,hi8(__c.3930) + 372 004a ADB7 in r26,__SP_L__ + 373 004c BEB7 in r27,__SP_H__ + 374 004e 1296 adiw r26,1+1 + 375 0050 3C93 st X,r19 + 376 0052 2E93 st -X,r18 + 377 0054 1197 sbiw r26,1 + 378 0056 1283 std Z+2,r17 + 379 .LVL10: + 380 .L22: + 381 0058 1382 std Z+3,__zero_reg__ + 382 005a 0E94 0000 call printf_P + 383 .LSM47: + 384 005e 0F90 pop __tmp_reg__ + 385 0060 0F90 pop __tmp_reg__ + 386 0062 0F90 pop __tmp_reg__ + 387 0064 0F90 pop __tmp_reg__ + 388 0066 00C0 rjmp .L21 + 389 .LVL11: + 390 .L12: + 391 .LSM48: + 392 0068 81E0 ldi r24,lo8(1) + 393 006a 0E94 0000 call USB_Host_SetDeviceConfiguration + 394 .LVL12: + 395 006e 8823 tst r24 + 396 0070 01F0 breq .L15 + 397 .LSM49: + 398 0072 00D0 rcall . + 399 0074 00D0 rcall . + 400 0076 EDB7 in r30,__SP_L__ + 401 0078 FEB7 in r31,__SP_H__ + 402 007a 3196 adiw r30,1 + 403 007c 20E0 ldi r18,lo8(__c.3933) + 404 007e 30E0 ldi r19,hi8(__c.3933) + 405 0080 00C0 rjmp .L23 + 406 .L15: + 407 .LSM50: + 408 0082 8091 0000 lds r24,StreamingInterfaceIndex + 409 .LVL13: + 410 0086 6091 0000 lds r22,StreamingInterfaceAltSetting + 411 008a 0E94 0000 call USB_Host_SetInterfaceAltSetting + 412 .LVL14: + 413 008e 8823 tst r24 + 414 0090 01F0 breq .L16 + 415 .LSM51: + 416 0092 00D0 rcall . + 417 0094 00D0 rcall . + 418 0096 EDB7 in r30,__SP_L__ + 419 0098 FEB7 in r31,__SP_H__ + 420 009a 3196 adiw r30,1 + 421 009c 20E0 ldi r18,lo8(__c.3935) + 422 009e 30E0 ldi r19,hi8(__c.3935) + 423 .L23: + 424 00a0 ADB7 in r26,__SP_L__ + 425 00a2 BEB7 in r27,__SP_H__ + 426 00a4 1296 adiw r26,1+1 + 427 00a6 3C93 st X,r19 + 428 00a8 2E93 st -X,r18 + 429 00aa 1197 sbiw r26,1 + 430 00ac 8283 std Z+2,r24 + 431 00ae 00C0 rjmp .L22 + 432 .L16: + 433 .LSM52: + 434 00b0 2091 0000 lds r18,StreamingEndpointAddress + 435 00b4 82E2 ldi r24,lo8(34) + 436 .LVL15: + 437 00b6 8093 0000 sts USB_ControlRequest,r24 + 438 00ba 81E0 ldi r24,lo8(1) + 439 00bc 8093 0000 sts USB_ControlRequest+1,r24 + 440 00c0 80E0 ldi r24,lo8(256) + 441 00c2 91E0 ldi r25,hi8(256) + 442 00c4 9093 0000 sts USB_ControlRequest+2+1,r25 + 443 00c8 8093 0000 sts USB_ControlRequest+2,r24 + 444 00cc 2093 0000 sts USB_ControlRequest+4,r18 + 445 00d0 1092 0000 sts USB_ControlRequest+5,__zero_reg__ + 446 00d4 83E0 ldi r24,lo8(3) + 447 00d6 90E0 ldi r25,hi8(3) + 448 00d8 9093 0000 sts USB_ControlRequest+6+1,r25 + 449 00dc 8093 0000 sts USB_ControlRequest+6,r24 + 450 .LSM53: + 451 00e0 DE01 movw r26,r28 + 452 00e2 1196 adiw r26,1 + 453 00e4 E0E0 ldi r30,lo8(C.5.5024) + 454 00e6 F0E0 ldi r31,hi8(C.5.5024) + 455 00e8 83E0 ldi r24,lo8(3) + 456 .L17: + 457 00ea 0190 ld r0,Z+ + 458 00ec 0D92 st X+,r0 + 459 00ee 8150 subi r24,lo8(-(-1)) + 460 00f0 01F4 brne .L17 + 461 .LVL16: + 462 .LBB48: + 463 .LBB49: + 464 .LSM54: + 465 00f2 1092 A700 sts 167,__zero_reg__ + 466 .LBE49: + 467 .LBE48: + 468 .LSM55: + 469 00f6 CE01 movw r24,r28 + 470 00f8 0196 adiw r24,1 + 471 00fa 0E94 0000 call USB_Host_SendControlRequest + 472 .LVL17: + 473 00fe 8823 tst r24 + 474 0100 01F0 breq .L18 + 475 .LVL18: + 476 .L21: + 477 .LSM56: + 478 0102 80E9 ldi r24,lo8(-112) + 479 0104 0E94 0000 call LEDs_SetAllLEDs + 480 .LSM57: + 481 0108 1092 0000 sts USB_HostState,__zero_reg__ + 482 .LSM58: + 483 010c 00C0 rjmp .L9 + 484 .LVL19: + 485 .L18: + 486 .LSM59: + 487 010e 82E0 ldi r24,lo8(2) + 488 .LVL20: + 489 0110 8093 6E00 sts 110,r24 + 490 .LSM60: + 491 0114 9CE7 ldi r25,lo8(124) + 492 0116 97BD out 71-32,r25 + 493 .LSM61: + 494 0118 84BD out 68-32,r24 + 495 .LSM62: + 496 011a 85BD out 69-32,r24 + 497 .LSM63: + 498 011c 3E9A sbi 39-32,6 + 499 .LSM64: + 500 011e 81EF ldi r24,lo8(-15) + 501 0120 8093 9000 sts 144,r24 + 502 .LSM65: + 503 0124 89E0 ldi r24,lo8(9) + 504 0126 8093 9100 sts 145,r24 + 505 .LSM66: + 506 012a 80E0 ldi r24,lo8(__c.3939) + 507 012c 90E0 ldi r25,hi8(__c.3939) + 508 012e 0E94 0000 call puts_P + 509 .LSM67: + 510 0132 8CE0 ldi r24,lo8(12) + 511 0134 8093 0000 sts USB_HostState,r24 + 512 .LVL21: + 513 .L9: + 514 /* epilogue start */ + 515 .LBE47: + 516 .LSM68: + 517 0138 0F90 pop __tmp_reg__ + 518 013a 0F90 pop __tmp_reg__ + 519 013c 0F90 pop __tmp_reg__ + 520 013e CF91 pop r28 + 521 0140 DF91 pop r29 + 522 0142 1F91 pop r17 + 523 0144 0895 ret + 524 .LFE138: + 526 .section .text.main,"ax",@progbits + 527 .global main + 529 main: + 530 .LFB131: + 531 .LSM69: + 532 /* prologue: function */ + 533 /* frame size = 0 */ + 534 /* stack size = 0 */ + 535 .L__stack_usage = 0 + 536 .LSM70: + 537 0000 0E94 0000 call SetupHardware + 538 .LSM71: + 539 0004 80E0 ldi r24,lo8(__c.3888) + 540 0006 90E0 ldi r25,hi8(__c.3888) + 541 0008 0E94 0000 call puts_P + 542 .LSM72: + 543 000c 80E1 ldi r24,lo8(16) + 544 000e 0E94 0000 call LEDs_SetAllLEDs + 545 .LSM73: + 546 /* #APP */ + 547 ; 49 "AudioInputHost.c" 1 + 548 0012 7894 sei + 549 ; 0 "" 2 + 550 /* #NOAPP */ + 551 .L25: + 552 .LSM74: + 553 0014 0E94 0000 call Audio_Task + 554 .LSM75: + 555 0018 0E94 0000 call USB_USBTask + 556 001c 00C0 rjmp .L25 + 557 .LFE131: + 559 .section .text.__vector_21,"ax",@progbits + 560 .global __vector_21 + 562 __vector_21: + 563 .LFB139: + 564 .LSM76: + 565 0000 1F92 push __zero_reg__ + 566 0002 0F92 push r0 + 567 0004 0FB6 in r0,__SREG__ + 568 0006 0F92 push r0 + 569 0008 0BB6 in r0,91-32 + 570 000a 0F92 push r0 + 571 000c 1124 clr __zero_reg__ + 572 000e 1F93 push r17 + 573 0010 2F93 push r18 + 574 0012 3F93 push r19 + 575 0014 4F93 push r20 + 576 0016 5F93 push r21 + 577 0018 6F93 push r22 + 578 001a 7F93 push r23 + 579 001c 8F93 push r24 + 580 001e 9F93 push r25 + 581 0020 AF93 push r26 + 582 0022 BF93 push r27 + 583 0024 EF93 push r30 + 584 0026 FF93 push r31 + 585 /* prologue: Signal */ + 586 /* frame size = 0 */ + 587 /* stack size = 17 */ + 588 .L__stack_usage = 17 + 589 .LBB50: + 590 .LBB51: + 591 .LSM77: + 592 0028 1091 A700 lds r17,167 + 593 002c 1770 andi r17,lo8(7) + 594 .LVL22: + 595 .LBE51: + 596 .LBE50: + 597 .LBB52: + 598 .LBB53: + 599 .LSM78: + 600 002e 81E0 ldi r24,lo8(1) + 601 0030 8093 A700 sts 167,r24 + 602 .LBE53: + 603 .LBE52: + 604 .LBB54: + 605 .LBB55: + 606 .LSM79: + 607 0034 8091 A900 lds r24,169 + 608 0038 8F7B andi r24,lo8(-65) + 609 003a 8093 A900 sts 169,r24 + 610 .LBE55: + 611 .LBE54: + 612 .LBB56: + 613 .LBB57: + 614 .LSM80: + 615 003e 8091 A600 lds r24,166 + 616 .LBE57: + 617 .LBE56: + 618 .LSM81: + 619 0042 80FF sbrs r24,0 + 620 0044 00C0 rjmp .L27 + 621 .LBB58: + 622 .LBB59: + 623 .LBB60: + 624 .LSM82: + 625 0046 8091 AF00 lds r24,175 + 626 .LSM83: + 627 004a 4091 AF00 lds r20,175 + 628 .LVL23: + 629 .LBE60: + 630 .LBE59: + 631 .LBB61: + 632 .LBB62: + 633 .LSM84: + 634 004e 8091 A600 lds r24,166 + 635 .LBE62: + 636 .LBE61: + 637 .LSM85: + 638 0052 85FD sbrc r24,5 + 639 0054 00C0 rjmp .L28 + 640 .LBB63: + 641 .LBB64: + 642 .LSM86: + 643 0056 8091 A600 lds r24,166 + 644 005a 8E77 andi r24,lo8(126) + 645 005c 8093 A600 sts 166,r24 + 646 .L28: + 647 .LBE64: + 648 .LBE63: + 649 .LSM87: + 650 0060 842F mov r24,r20 + 651 0062 9927 clr r25 + 652 0064 87FD sbrc r24,7 + 653 0066 9095 com r25 + 654 0068 20E8 ldi r18,lo8(128) + 655 006a 30E0 ldi r19,hi8(128) + 656 006c 8227 eor r24,r18 + 657 006e 9327 eor r25,r19 + 658 0070 9093 9900 sts 152+1,r25 + 659 0074 8093 9800 sts 152,r24 + 660 .LVL24: + 661 .LSM88: + 662 0078 4131 cpi r20,lo8(17) + 663 007a 04F4 brge .L30 + 664 .LSM89: + 665 007c 4930 cpi r20,lo8(9) + 666 007e 04F4 brge .L31 + 667 .LSM90: + 668 0080 4530 cpi r20,lo8(5) + 669 0082 04F4 brge .L32 + 670 .LSM91: + 671 0084 4330 cpi r20,lo8(3) + 672 0086 04F4 brge .L33 + 673 .LSM92: + 674 0088 80E0 ldi r24,lo8(0) + 675 008a 00C0 rjmp .L29 + 676 .L30: + 677 .LSM93: + 678 008c 80EF ldi r24,lo8(-16) + 679 008e 00C0 rjmp .L29 + 680 .L31: + 681 .LSM94: + 682 0090 80EB ldi r24,lo8(-80) + 683 0092 00C0 rjmp .L29 + 684 .L32: + 685 .LSM95: + 686 0094 80E3 ldi r24,lo8(48) + 687 0096 00C0 rjmp .L29 + 688 .L33: + 689 .LSM96: + 690 0098 80E1 ldi r24,lo8(16) + 691 .L29: + 692 .LVL25: + 693 .LSM97: + 694 009a 0E94 0000 call LEDs_SetAllLEDs + 695 .LVL26: + 696 .L27: + 697 .LBE58: + 698 .LBB65: + 699 .LBB66: + 700 .LSM98: + 701 009e 8091 A900 lds r24,169 + 702 00a2 8064 ori r24,lo8(64) + 703 00a4 8093 A900 sts 169,r24 + 704 .LVL27: + 705 .LBE66: + 706 .LBE65: + 707 .LBB67: + 708 .LBB68: + 709 .LSM99: + 710 00a8 1093 A700 sts 167,r17 + 711 /* epilogue start */ + 712 .LBE68: + 713 .LBE67: + 714 .LSM100: + 715 00ac FF91 pop r31 + 716 00ae EF91 pop r30 + 717 00b0 BF91 pop r27 + 718 00b2 AF91 pop r26 + 719 00b4 9F91 pop r25 + 720 00b6 8F91 pop r24 + 721 00b8 7F91 pop r23 + 722 00ba 6F91 pop r22 + 723 00bc 5F91 pop r21 + 724 00be 4F91 pop r20 + 725 00c0 3F91 pop r19 + 726 00c2 2F91 pop r18 + 727 00c4 1F91 pop r17 + 728 .LVL28: + 729 00c6 0F90 pop r0 + 730 00c8 0BBE out 91-32,r0 + 731 00ca 0F90 pop r0 + 732 00cc 0FBE out __SREG__,r0 + 733 00ce 0F90 pop r0 + 734 00d0 1F90 pop __zero_reg__ + 735 00d2 1895 reti + 736 .LFE139: + 738 .section .progmem.data,"a",@progbits + 741 __c.3939: + 742 0000 4D69 6372 .string "Microphone Enumerated.\r\n" + 742 6F70 686F + 742 6E65 2045 + 742 6E75 6D65 + 742 7261 7465 + 745 __c.3935: + 746 0019 1B5B 3331 .ascii "\033[31mCould not set alt" + 746 6D43 6F75 + 746 6C64 206E + 746 6F74 2073 + 746 6574 2061 + 747 002f 6572 6E61 .string "ernative streaming interface setting.\r\n -- Error Code: %d\r\n\033[37m" + 747 7469 7665 + 747 2073 7472 + 747 6561 6D69 + 747 6E67 2069 + 750 __c.3933: + 751 0070 1B5B .ascii "\033[" + 752 0072 3331 6D43 .string "31mControl Error (Set Configuration).\r\n -- Error Code: %d\r\n\033[37m" + 752 6F6E 7472 + 752 6F6C 2045 + 752 7272 6F72 + 752 2028 5365 + 755 __c.3930: + 756 00b3 202D 2D20 .string " -- Error Code: %d\r\n\033[37m" + 756 4572 726F + 756 7220 436F + 756 6465 3A20 + 756 2564 0D0A + 759 __c.3928: + 760 00cd 1B5B 3331 .string "\033[31mInvalid Device.\r\n" + 760 6D49 6E76 + 760 616C 6964 + 760 2044 6576 + 760 6963 652E + 763 __c.3926: + 764 00e4 1B5B 3331 .string "\033[31mControl Error (Get Configuration).\r\n" + 764 6D43 6F6E + 764 7472 6F6C + 764 2045 7272 + 764 6F72 2028 + 767 __c.3924: + 768 010e 4765 7474 .string "Getting Config Data.\r\n" + 768 696E 6720 + 768 436F 6E66 + 768 6967 2044 + 768 6174 612E + 769 .data + 772 C.5.5024: + 773 0000 80 .byte -128 + 774 0001 BB .byte -69 + 775 0002 00 .byte 0 + 776 .section .progmem.data + 779 __c.3917: + 780 0125 1B5B 3331 .ascii "\033[31mDev Enum Error\r\n" + 780 6D44 6576 + 780 2045 6E75 + 780 6D20 4572 + 780 726F 720D + 781 013a 202D 2D20 .string " -- Error Code %d\r\n -- Sub Error Code %d\r\n -- In State %d\r\n\033[37m" + 781 4572 726F + 781 7220 436F + 781 6465 2025 + 781 640D 0A20 + 784 __c.3910: + 785 017b 1B5B 3331 .string "\033[31mHost Mode Error\r\n -- Error Code %d\r\n\033[37m" + 785 6D48 6F73 + 785 7420 4D6F + 785 6465 2045 + 785 7272 6F72 + 788 __c.3902: + 789 01aa 1B5B 3332 .string "\033[32mDevice Unattached.\r\n\033[37m" + 789 6D44 6576 + 789 6963 6520 + 789 556E 6174 + 789 7461 6368 + 792 __c.3897: + 793 01c9 1B5B 3332 .string "\033[32mDevice Attached.\r\n\033[37m" + 793 6D44 6576 + 793 6963 6520 + 793 4174 7461 + 793 6368 6564 + 796 __c.3888: + 797 01e6 1B5B 3336 .string "\033[36mAudio Host Demo running.\r\n\033[37m" + 797 6D41 7564 + 797 696F 2048 + 797 6F73 7420 + 797 4465 6D6F + 894 .Letext0: +DEFINED SYMBOLS + *ABS*:00000000 AudioInputHost.c +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:2 *ABS*:0000003f __SREG__ +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:3 *ABS*:0000003e __SP_H__ +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:4 *ABS*:0000003d __SP_L__ +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:5 *ABS*:00000034 __CCP__ +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:6 *ABS*:00000000 __tmp_reg__ +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:7 *ABS*:00000001 __zero_reg__ +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:18 .text.LEDs_SetAllLEDs:00000000 LEDs_SetAllLEDs +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:39 .text.SetupHardware:00000000 SetupHardware +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:151 .text.EVENT_USB_Host_DeviceAttached:00000000 EVENT_USB_Host_DeviceAttached +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:792 .progmem.data:000001c9 __c.3897 +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:173 .text.EVENT_USB_Host_DeviceUnattached:00000000 EVENT_USB_Host_DeviceUnattached +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:788 .progmem.data:000001aa __c.3902 +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:195 .text.EVENT_USB_Host_DeviceEnumerationComplete:00000000 EVENT_USB_Host_DeviceEnumerationComplete +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:213 .text.EVENT_USB_Host_HostError:00000000 EVENT_USB_Host_HostError +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:784 .progmem.data:0000017b __c.3910 +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:262 .text.EVENT_USB_Host_DeviceEnumerationFailed:00000000 EVENT_USB_Host_DeviceEnumerationFailed +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:779 .progmem.data:00000125 __c.3917 +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:320 .text.Audio_Task:00000000 Audio_Task +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:767 .progmem.data:0000010e __c.3924 +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:763 .progmem.data:000000e4 __c.3926 +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:759 .progmem.data:000000cd __c.3928 +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:755 .progmem.data:000000b3 __c.3930 +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:750 .progmem.data:00000070 __c.3933 +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:745 .progmem.data:00000019 __c.3935 +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:772 .data:00000000 C.5.5024 +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:741 .progmem.data:00000000 __c.3939 +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:529 .text.main:00000000 main +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:796 .progmem.data:000001e6 __c.3888 +C:\Users\Dean\AppData\Local\Temp\ccMWbd5S.s:562 .text.__vector_21:00000000 __vector_21 + +UNDEFINED SYMBOLS +USB_Init +USARTSerialStream +__iob +Serial_putchar +Serial_getchar +puts_P +USB_Disable +printf_P +USB_HostState +ProcessConfigurationDescriptor +USB_Host_SetDeviceConfiguration +StreamingInterfaceIndex +StreamingInterfaceAltSetting +USB_Host_SetInterfaceAltSetting +StreamingEndpointAddress +USB_ControlRequest +USB_Host_SendControlRequest +USB_USBTask +__do_copy_data diff --git a/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.map b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.map new file mode 100644 index 0000000000..189341a7d4 --- /dev/null +++ b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.map @@ -0,0 +1,1169 @@ +Archive member included because of file (symbol) + +c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_exit.o) + c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o (exit) +c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_copy_data.o) + AudioInputHost.o (__do_copy_data) +c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_clear_bss.o) + ConfigDescriptor.o (__do_clear_bss) +c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(iob.o) + AudioInputHost.o (__iob) +c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(printf_p.o) + AudioInputHost.o (printf_P) +c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(puts_p.o) + AudioInputHost.o (puts_P) +c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) + c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(printf_p.o) (vfprintf) +c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(eerd_byte_at90usb1287.o) + ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o (__eerd_byte_usb1287) +c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(eeupd_byte_at90usb1287.o) + ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o (__eeupd_byte_usb1287) +c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(strnlen_P.o) + c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) (strnlen_P) +c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(strnlen.o) + c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) (strnlen) +c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(fputc.o) + c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) (fputc) +c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(ultoa_invert.o) + c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) (__ultoa_invert) + +Allocating common symbols +Common symbol size file + +USB_IsInitialized 0x1 ../../../../LUFA/Drivers/USB/Core/USBTask.o +USARTSerialStream 0xe ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o +USB_ControlRequest 0x8 ../../../../LUFA/Drivers/USB/Core/USBTask.o +USB_HostState 0x1 ../../../../LUFA/Drivers/USB/Core/USBTask.o +__iob 0x6 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(iob.o) + +Discarded input sections + + .data 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o + .bss 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o + .text 0x00000000 0x0 AudioInputHost.o + .bss 0x00000000 0x0 AudioInputHost.o + .text 0x00000000 0x0 ConfigDescriptor.o + .data 0x00000000 0x0 ConfigDescriptor.o + .text 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .data 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .bss 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .text 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .data 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .bss 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .text 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .text.USB_Host_GetDeviceDescriptor + 0x00000000 0x1c ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .text.USB_Host_GetDeviceStringDescriptor + 0x00000000 0x34 ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .text.USB_Host_ClearPipeStall + 0x00000000 0x32 ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .text 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .bss 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .text.Pipe_IsEndpointBound + 0x00000000 0x5c ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .text.Pipe_WaitUntilReady + 0x00000000 0x5e ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .text 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .data 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .bss 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .text 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .data 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .bss 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .text 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .data 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .bss 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .text 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .data 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .bss 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .text.Pipe_Discard_Stream + 0x00000000 0x9a ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .text.Pipe_Null_Stream + 0x00000000 0x9e ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .text.Pipe_Write_Stream_LE + 0x00000000 0xca ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .text.Pipe_Write_Stream_BE + 0x00000000 0xba ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .text.Pipe_Read_Stream_LE + 0x00000000 0xca ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .text.Pipe_Read_Stream_BE + 0x00000000 0xba ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .text.Pipe_Write_PStream_LE + 0x00000000 0xce ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .text.Pipe_Write_PStream_BE + 0x00000000 0xba ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .text.Pipe_Write_EStream_LE + 0x00000000 0xd0 ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .text.Pipe_Write_EStream_BE + 0x00000000 0xbc ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .text.Pipe_Read_EStream_LE + 0x00000000 0xce ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .text.Pipe_Read_EStream_BE + 0x00000000 0xbe ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .text 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + .data 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + .bss 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + .text.USB_GetNextDescriptorOfType + 0x00000000 0x4c ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + .text.USB_GetNextDescriptorOfTypeBefore + 0x00000000 0x56 ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + .text.USB_GetNextDescriptorOfTypeAfter + 0x00000000 0x34 ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + .text 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .data 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .bss 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .text 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/Events.o + .data 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/Events.o + .bss 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/Events.o + .text 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/HostStandardReq.o + .data 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/HostStandardReq.o + .bss 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/HostStandardReq.o + .text 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/USBTask.o + .data 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/USBTask.o + .bss 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Core/USBTask.o + .text 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .data 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .bss 0x00000000 0x0 ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .text.USB_ProcessHIDReport + 0x00000000 0x766 ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .text.USB_GetHIDReportItemInfo + 0x00000000 0xb6 ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .text.USB_SetHIDReportItemInfo + 0x00000000 0xc2 ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .text.USB_GetHIDReportSize + 0x00000000 0x58 ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .text 0x00000000 0x0 ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + .data 0x00000000 0x0 ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + .bss 0x00000000 0x0 ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + .text.Serial_getchar_Blocking + 0x00000000 0x20 ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + .text.Serial_SendString_P + 0x00000000 0x1a ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + .text.Serial_SendString + 0x00000000 0x1c ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + .text.Serial_SendData + 0x00000000 0x1e ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + .text 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_exit.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_exit.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_exit.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_exit.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_copy_data.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_copy_data.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_copy_data.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_copy_data.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_clear_bss.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_clear_bss.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_clear_bss.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_clear_bss.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(iob.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(iob.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(iob.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(printf_p.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(printf_p.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(printf_p.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(puts_p.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(puts_p.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(puts_p.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(eerd_byte_at90usb1287.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(eerd_byte_at90usb1287.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(eerd_byte_at90usb1287.o) + .text.avr-libc + 0x00000000 0x10 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(eerd_byte_at90usb1287.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(eeupd_byte_at90usb1287.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(eeupd_byte_at90usb1287.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(eeupd_byte_at90usb1287.o) + .text.avr-libc + 0x00000000 0x24 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(eeupd_byte_at90usb1287.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(strnlen_P.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(strnlen_P.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(strnlen_P.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(strnlen.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(strnlen.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(strnlen.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(fputc.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(fputc.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(fputc.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(ultoa_invert.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(ultoa_invert.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(ultoa_invert.o) + +Memory Configuration + +Name Origin Length Attributes +text 0x00000000 0x00020000 xr +data 0x00800100 0x0000ff00 rw !x +eeprom 0x00810000 0x00010000 rw !x +fuse 0x00820000 0x00000400 rw !x +lock 0x00830000 0x00000400 rw !x +signature 0x00840000 0x00000400 rw !x +*default* 0x00000000 0xffffffff + +Linker script and memory map + +Address of section .data set to 0x800100 +LOAD c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +LOAD AudioInputHost.o +LOAD ConfigDescriptor.o +LOAD ../../../../LUFA/Drivers/USB/Core/AVR8/Device_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/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/AVR8/EndpointStream_AVR8.o +LOAD ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o +LOAD ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.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/Common/HIDParser.o +LOAD ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o +LOAD c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libm.a +LOAD c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a +LOAD c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a +LOAD c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\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 0x00000000 0x18fa + *(.vectors) + .vectors 0x00000000 0x98 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o + 0x00000000 __vector_default + 0x00000000 __vectors + *(.vectors) + *(.progmem.gcc*) + *(.progmem*) + .progmem.data 0x00000098 0x20b AudioInputHost.o + 0x000002a4 . = ALIGN (0x2) + *fill* 0x000002a3 0x1 00 + 0x000002a4 __trampolines_start = . + *(.trampolines) + .trampolines 0x000002a4 0x0 linker stubs + *(.trampolines*) + 0x000002a4 __trampolines_end = . + *(.jumptables) + *(.jumptables*) + *(.lowtext) + *(.lowtext*) + 0x000002a4 __ctors_start = . + *(.ctors) + 0x000002a4 __ctors_end = . + 0x000002a4 __dtors_start = . + *(.dtors) + 0x000002a4 __dtors_end = . + SORT(*)(.ctors) + SORT(*)(.dtors) + *(.init0) + .init0 0x000002a4 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o + 0x000002a4 __init + *(.init0) + *(.init1) + *(.init1) + *(.init2) + .init2 0x000002a4 0xc c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o + *(.init2) + *(.init3) + *(.init3) + *(.init4) + .init4 0x000002b0 0x1a c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_copy_data.o) + 0x000002b0 __do_copy_data + .init4 0x000002ca 0x10 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_clear_bss.o) + 0x000002ca __do_clear_bss + *(.init4) + *(.init5) + *(.init5) + *(.init6) + *(.init6) + *(.init7) + *(.init7) + *(.init8) + *(.init8) + *(.init9) + .init9 0x000002da 0x6 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o + *(.init9) + *(.text) + .text 0x000002e0 0x2 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o + 0x000002e0 __vector_22 + 0x000002e0 __vector_28 + 0x000002e0 __vector_1 + 0x000002e0 __vector_32 + 0x000002e0 __vector_34 + 0x000002e0 __vector_24 + 0x000002e0 __vector_12 + 0x000002e0 __bad_interrupt + 0x000002e0 __vector_6 + 0x000002e0 __vector_31 + 0x000002e0 __vector_35 + 0x000002e0 __vector_3 + 0x000002e0 __vector_23 + 0x000002e0 __vector_30 + 0x000002e0 __vector_25 + 0x000002e0 __vector_11 + 0x000002e0 __vector_13 + 0x000002e0 __vector_17 + 0x000002e0 __vector_19 + 0x000002e0 __vector_7 + 0x000002e0 __vector_27 + 0x000002e0 __vector_5 + 0x000002e0 __vector_33 + 0x000002e0 __vector_37 + 0x000002e0 __vector_4 + 0x000002e0 __vector_9 + 0x000002e0 __vector_2 + 0x000002e0 __vector_15 + 0x000002e0 __vector_36 + 0x000002e0 __vector_29 + 0x000002e0 __vector_8 + 0x000002e0 __vector_26 + 0x000002e0 __vector_14 + 0x000002e0 __vector_16 + 0x000002e0 __vector_18 + 0x000002e0 __vector_20 + 0x000002e2 . = ALIGN (0x2) + *(.text.*) + .text.LEDs_SetAllLEDs + 0x000002e2 0xa AudioInputHost.o + .text.SetupHardware + 0x000002ec 0x92 AudioInputHost.o + 0x000002ec SetupHardware + .text.EVENT_USB_Host_DeviceAttached + 0x0000037e 0xa AudioInputHost.o + 0x0000037e EVENT_USB_Host_DeviceAttached + .text.EVENT_USB_Host_DeviceUnattached + 0x00000388 0xa AudioInputHost.o + 0x00000388 EVENT_USB_Host_DeviceUnattached + .text.EVENT_USB_Host_DeviceEnumerationComplete + 0x00000392 0x4 AudioInputHost.o + 0x00000392 EVENT_USB_Host_DeviceEnumerationComplete + .text.EVENT_USB_Host_HostError + 0x00000396 0x3e AudioInputHost.o + 0x00000396 EVENT_USB_Host_HostError + .text.EVENT_USB_Host_DeviceEnumerationFailed + 0x000003d4 0x50 AudioInputHost.o + 0x000003d4 EVENT_USB_Host_DeviceEnumerationFailed + .text.Audio_Task + 0x00000424 0x134 AudioInputHost.o + 0x00000424 Audio_Task + .text.main 0x00000558 0x14 AudioInputHost.o + 0x00000558 main + .text.__vector_21 + 0x0000056c 0xd2 AudioInputHost.o + 0x0000056c __vector_21 + .text.DComp_NextAudioControlInterface + 0x0000063e 0x22 ConfigDescriptor.o + 0x0000063e DComp_NextAudioControlInterface + .text.DComp_NextAudioStreamInterface + 0x00000660 0x22 ConfigDescriptor.o + 0x00000660 DComp_NextAudioStreamInterface + .text.DComp_NextAudioInterfaceDataEndpoint + 0x00000682 0x22 ConfigDescriptor.o + 0x00000682 DComp_NextAudioInterfaceDataEndpoint + .text.ProcessConfigurationDescriptor + 0x000006a4 0x132 ConfigDescriptor.o + 0x000006a4 ProcessConfigurationDescriptor + .text.USB_Host_ResetDevice + 0x000007d6 0xa8 ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .text.USB_Host_WaitMS + 0x0000087e 0xaa ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + 0x0000087e USB_Host_WaitMS + .text.USB_Host_ProcessNextHostState + 0x00000928 0x264 ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + 0x00000928 USB_Host_ProcessNextHostState + .text.USB_Host_SetDeviceConfiguration + 0x00000b8c 0x2c ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + 0x00000b8c USB_Host_SetDeviceConfiguration + .text.USB_Host_SetInterfaceAltSetting + 0x00000bb8 0x2e ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + 0x00000bb8 USB_Host_SetInterfaceAltSetting + .text.Pipe_ConfigurePipe + 0x00000be6 0xce ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + 0x00000be6 Pipe_ConfigurePipe + .text.Pipe_ClearPipes + 0x00000cb4 0x28 ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + 0x00000cb4 Pipe_ClearPipes + .text.USB_Disable + 0x00000cdc 0x30 ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + 0x00000cdc USB_Disable + .text.USB_ResetInterface + 0x00000d0c 0x9c ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + 0x00000d0c USB_ResetInterface + .text.USB_Init + 0x00000da8 0x12 ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + 0x00000da8 USB_Init + .text.USB_INT_DisableAllInterrupts + 0x00000dba 0x10 ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x00000dba USB_INT_DisableAllInterrupts + .text.USB_INT_ClearAllInterrupts + 0x00000dca 0xa ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x00000dca USB_INT_ClearAllInterrupts + .text.__vector_10 + 0x00000dd4 0x126 ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x00000dd4 __vector_10 + .text.USB_Host_GetDeviceConfigDescriptor + 0x00000efa 0xae ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + 0x00000efa USB_Host_GetDeviceConfigDescriptor + .text.USB_GetNextDescriptorComp + 0x00000fa8 0x86 ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + 0x00000fa8 USB_GetNextDescriptorComp + .text.USB_Event_Stub + 0x0000102e 0x2 ../../../../LUFA/Drivers/USB/Core/Events.o + 0x0000102e EVENT_USB_Host_StartOfFrame + 0x0000102e USB_Event_Stub + .text.USB_Host_WaitForIOS + 0x00001030 0x52 ../../../../LUFA/Drivers/USB/Core/HostStandardReq.o + .text.USB_Host_SendControlRequest + 0x00001082 0x22c ../../../../LUFA/Drivers/USB/Core/HostStandardReq.o + 0x00001082 USB_Host_SendControlRequest + .text.USB_USBTask + 0x000012ae 0x1c ../../../../LUFA/Drivers/USB/Core/USBTask.o + 0x000012ae USB_USBTask + .text.Serial_putchar + 0x000012ca 0x12 ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + 0x000012ca Serial_putchar + .text.Serial_getchar + 0x000012dc 0x26 ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + 0x000012dc Serial_getchar + .text.avr-libc + 0x00001302 0x3e c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(printf_p.o) + 0x00001302 printf_P + .text.avr-libc + 0x00001340 0x70 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(puts_p.o) + 0x00001340 puts_P + .text.avr-libc + 0x000013b0 0x406 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) + 0x000013b0 vfprintf + .text.avr-libc + 0x000017b6 0x16 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(strnlen_P.o) + 0x000017b6 strnlen_P + .text.avr-libc + 0x000017cc 0x16 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(strnlen.o) + 0x000017cc strnlen + .text.avr-libc + 0x000017e2 0x58 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(fputc.o) + 0x000017e2 fputc + .text.avr-libc + 0x0000183a 0xbc c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(ultoa_invert.o) + 0x0000183a __ultoa_invert + 0x000018f6 . = ALIGN (0x2) + *(.fini9) + .fini9 0x000018f6 0x0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_exit.o) + 0x000018f6 _exit + 0x000018f6 exit + *(.fini9) + *(.fini8) + *(.fini8) + *(.fini7) + *(.fini7) + *(.fini6) + *(.fini6) + *(.fini5) + *(.fini5) + *(.fini4) + *(.fini4) + *(.fini3) + *(.fini3) + *(.fini2) + *(.fini2) + *(.fini1) + *(.fini1) + *(.fini0) + .fini0 0x000018f6 0x4 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_exit.o) + *(.fini0) + 0x000018fa _etext = . + +.data 0x00800100 0x1c load address 0x000018fa + 0x00800100 PROVIDE (__data_start, .) + *(.data) + .data 0x00800100 0x3 AudioInputHost.o + .data 0x00800103 0x18 ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .data 0x0080011b 0x1 ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + 0x0080011b USB_ControlPipeSize + *(.data*) + *(.rodata) + *(.rodata*) + *(.gnu.linkonce.d*) + 0x0080011c . = ALIGN (0x2) + 0x0080011c _edata = . + 0x0080011c PROVIDE (__data_end, .) + +.bss 0x0080011c 0x24 + 0x0080011c PROVIDE (__bss_start, .) + *(.bss) + .bss 0x0080011c 0x3 ConfigDescriptor.o + 0x0080011c StreamingInterfaceIndex + 0x0080011d StreamingInterfaceAltSetting + 0x0080011e StreamingEndpointAddress + .bss 0x0080011f 0x3 ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + *(.bss*) + *(COMMON) + COMMON 0x00800122 0xa ../../../../LUFA/Drivers/USB/Core/USBTask.o + 0x00800122 USB_IsInitialized + 0x00800123 USB_ControlRequest + 0x0080012b USB_HostState + COMMON 0x0080012c 0xe ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + 0x0080012c USARTSerialStream + COMMON 0x0080013a 0x6 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(iob.o) + 0x0080013a __iob + 0x00800140 PROVIDE (__bss_end, .) + 0x000018fa __data_load_start = LOADADDR (.data) + 0x00001916 __data_load_end = (__data_load_start + SIZEOF (.data)) + +.noinit 0x00800140 0x0 + 0x00800140 PROVIDE (__noinit_start, .) + *(.noinit*) + 0x00800140 PROVIDE (__noinit_end, .) + 0x00800140 _end = . + 0x00800140 PROVIDE (__heap_start, .) + +.eeprom 0x00810000 0x0 + *(.eeprom*) + 0x00810000 __eeprom_end = . + +.fuse + *(.fuse) + *(.lfuse) + *(.hfuse) + *(.efuse) + +.lock + *(.lock*) + +.signature + *(.signature*) + +.stab 0x00000000 0xe28 + *(.stab) + .stab 0x00000000 0x6cc c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o + .stab 0x000006cc 0x90 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(eerd_byte_at90usb1287.o) + 0x9c (size before relaxing) + .stab 0x0000075c 0x114 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(eeupd_byte_at90usb1287.o) + 0x120 (size before relaxing) + .stab 0x00000870 0x9c c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(strnlen_P.o) + 0xa8 (size before relaxing) + .stab 0x0000090c 0x9c c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(strnlen.o) + 0xa8 (size before relaxing) + .stab 0x000009a8 0x480 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(ultoa_invert.o) + 0x48c (size before relaxing) + +.stabstr 0x00000000 0x26b + *(.stabstr) + .stabstr 0x00000000 0x26b c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.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 0x00000000 0x3b0 + *(.debug_aranges) + .debug_aranges + 0x00000000 0x68 AudioInputHost.o + .debug_aranges + 0x00000068 0x38 ConfigDescriptor.o + .debug_aranges + 0x000000a0 0x58 ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_aranges + 0x000000f8 0x38 ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_aranges + 0x00000130 0x30 ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_aranges + 0x00000160 0x30 ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_aranges + 0x00000190 0x78 ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_aranges + 0x00000208 0x40 ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + .debug_aranges + 0x00000248 0x20 ../../../../LUFA/Drivers/USB/Core/Events.o + .debug_aranges + 0x00000268 0x28 ../../../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_aranges + 0x00000290 0x20 ../../../../LUFA/Drivers/USB/Core/USBTask.o + .debug_aranges + 0x000002b0 0x38 ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_aranges + 0x000002e8 0x48 ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + .debug_aranges + 0x00000330 0x20 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(printf_p.o) + .debug_aranges + 0x00000350 0x20 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(puts_p.o) + .debug_aranges + 0x00000370 0x20 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) + .debug_aranges + 0x00000390 0x20 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(fputc.o) + +.debug_pubnames + 0x00000000 0x89a + *(.debug_pubnames) + .debug_pubnames + 0x00000000 0x107 AudioInputHost.o + .debug_pubnames + 0x00000107 0xff ConfigDescriptor.o + .debug_pubnames + 0x00000206 0xf4 ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_pubnames + 0x000002fa 0x86 ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_pubnames + 0x00000380 0x46 ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_pubnames + 0x000003c6 0x62 ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_pubnames + 0x00000428 0x13b ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_pubnames + 0x00000563 0xc2 ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + .debug_pubnames + 0x00000625 0x25 ../../../../LUFA/Drivers/USB/Core/Events.o + .debug_pubnames + 0x0000064a 0x32 ../../../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_pubnames + 0x0000067c 0x61 ../../../../LUFA/Drivers/USB/Core/USBTask.o + .debug_pubnames + 0x000006dd 0x7e ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_pubnames + 0x0000075b 0xac ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + .debug_pubnames + 0x00000807 0x1c c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(iob.o) + .debug_pubnames + 0x00000823 0x1f c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(printf_p.o) + .debug_pubnames + 0x00000842 0x1d c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(puts_p.o) + .debug_pubnames + 0x0000085f 0x1f c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) + .debug_pubnames + 0x0000087e 0x1c c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(fputc.o) + +.debug_info 0x00000000 0x56c7 + *(.debug_info) + .debug_info 0x00000000 0x81f AudioInputHost.o + .debug_info 0x0000081f 0x5dd ConfigDescriptor.o + .debug_info 0x00000dfc 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .debug_info 0x00000dfc 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_info 0x00000dfc 0xc19 ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_info 0x00001a15 0x5b1 ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_info 0x00001fc6 0x409 ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_info 0x000023cf 0x495 ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_info 0x00002864 0x0 ../../../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_info 0x00002864 0xac6 ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_info 0x0000332a 0x642 ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + .debug_info 0x0000396c 0x0 ../../../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_info 0x0000396c 0x85 ../../../../LUFA/Drivers/USB/Core/Events.o + .debug_info 0x000039f1 0x62a ../../../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_info 0x0000401b 0x1e8 ../../../../LUFA/Drivers/USB/Core/USBTask.o + .debug_info 0x00004203 0x6f9 ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_info 0x000048fc 0x413 ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + .debug_info 0x00004d0f 0x14f c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(iob.o) + .debug_info 0x00004e5e 0x1c6 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(printf_p.o) + .debug_info 0x00005024 0x1ec c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(puts_p.o) + .debug_info 0x00005210 0x350 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) + .debug_info 0x00005560 0x167 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(fputc.o) + *(.gnu.linkonce.wi.*) + +.debug_abbrev 0x00000000 0x1b65 + *(.debug_abbrev) + .debug_abbrev 0x00000000 0x334 AudioInputHost.o + .debug_abbrev 0x00000334 0x185 ConfigDescriptor.o + .debug_abbrev 0x000004b9 0x1 ../../../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .debug_abbrev 0x000004ba 0x1 ../../../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_abbrev 0x000004bb 0x2f6 ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_abbrev 0x000007b1 0x1d9 ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_abbrev 0x0000098a 0x14d ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_abbrev 0x00000ad7 0x12a ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_abbrev 0x00000c01 0x1 ../../../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_abbrev 0x00000c02 0x164 ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_abbrev 0x00000d66 0x1ca ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + .debug_abbrev 0x00000f30 0x1 ../../../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_abbrev 0x00000f31 0x41 ../../../../LUFA/Drivers/USB/Core/Events.o + .debug_abbrev 0x00000f72 0x1ea ../../../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_abbrev 0x0000115c 0x11a ../../../../LUFA/Drivers/USB/Core/USBTask.o + .debug_abbrev 0x00001276 0x1ec ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_abbrev 0x00001462 0x1d1 ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + .debug_abbrev 0x00001633 0xc5 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(iob.o) + .debug_abbrev 0x000016f8 0x11c c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(printf_p.o) + .debug_abbrev 0x00001814 0x119 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(puts_p.o) + .debug_abbrev 0x0000192d 0x15f c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) + .debug_abbrev 0x00001a8c 0xd9 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(fputc.o) + +.debug_line 0x00000000 0x53bf + *(.debug_line) + .debug_line 0x00000000 0x725 AudioInputHost.o + .debug_line 0x00000725 0x3df ConfigDescriptor.o + .debug_line 0x00000b04 0x24 ../../../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .debug_line 0x00000b28 0x24 ../../../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_line 0x00000b4c 0xa69 ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_line 0x000015b5 0x5f9 ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_line 0x00001bae 0x3f1 ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_line 0x00001f9f 0x464 ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_line 0x00002403 0x24 ../../../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_line 0x00002427 0xcf7 ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_line 0x0000311e 0x3e3 ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + .debug_line 0x00003501 0x24 ../../../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_line 0x00003525 0x86 ../../../../LUFA/Drivers/USB/Core/Events.o + .debug_line 0x000035ab 0x5f5 ../../../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_line 0x00003ba0 0x1e4 ../../../../LUFA/Drivers/USB/Core/USBTask.o + .debug_line 0x00003d84 0x7b0 ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_line 0x00004534 0x326 ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + .debug_line 0x0000485a 0xe5 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(iob.o) + .debug_line 0x0000493f 0x1a4 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(printf_p.o) + .debug_line 0x00004ae3 0x142 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(puts_p.o) + .debug_line 0x00004c25 0x659 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) + .debug_line 0x0000527e 0x141 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(fputc.o) + +.debug_frame 0x00000000 0x540 + *(.debug_frame) + .debug_frame 0x00000000 0xb0 AudioInputHost.o + .debug_frame 0x000000b0 0x50 ConfigDescriptor.o + .debug_frame 0x00000100 0x90 ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_frame 0x00000190 0x50 ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_frame 0x000001e0 0x40 ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_frame 0x00000220 0x40 ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_frame 0x00000260 0xd0 ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_frame 0x00000330 0x60 ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + .debug_frame 0x00000390 0x20 ../../../../LUFA/Drivers/USB/Core/Events.o + .debug_frame 0x000003b0 0x30 ../../../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_frame 0x000003e0 0x20 ../../../../LUFA/Drivers/USB/Core/USBTask.o + .debug_frame 0x00000400 0x50 ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_frame 0x00000450 0x70 ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + .debug_frame 0x000004c0 0x20 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(printf_p.o) + .debug_frame 0x000004e0 0x20 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(puts_p.o) + .debug_frame 0x00000500 0x20 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) + .debug_frame 0x00000520 0x20 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(fputc.o) + +.debug_str 0x00000000 0x26bf + *(.debug_str) + .debug_str 0x00000000 0x830 AudioInputHost.o + 0x8aa (size before relaxing) + .debug_str 0x00000830 0x53e ConfigDescriptor.o + 0x7d0 (size before relaxing) + .debug_str 0x00000d6e 0x6cc ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + 0xbc8 (size before relaxing) + .debug_str 0x0000143a 0x269 ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + 0x5b7 (size before relaxing) + .debug_str 0x000016a3 0x16d ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + 0x516 (size before relaxing) + .debug_str 0x00001810 0xaf ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x4f5 (size before relaxing) + .debug_str 0x000018bf 0x260 ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + 0x3a4 (size before relaxing) + .debug_str 0x00001b1f 0x234 ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + 0x81e (size before relaxing) + .debug_str 0x00001d53 0x3a ../../../../LUFA/Drivers/USB/Core/Events.o + 0x11f (size before relaxing) + .debug_str 0x00001d8d 0x15b ../../../../LUFA/Drivers/USB/Core/HostStandardReq.o + 0x519 (size before relaxing) + .debug_str 0x00001ee8 0x45 ../../../../LUFA/Drivers/USB/Core/USBTask.o + 0x1ee (size before relaxing) + .debug_str 0x00001f2d 0x487 ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o + 0x60d (size before relaxing) + .debug_str 0x000023b4 0xfd ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + 0x26d (size before relaxing) + .debug_str 0x000024b1 0x4b c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(iob.o) + 0xef (size before relaxing) + .debug_str 0x000024fc 0x7a c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(printf_p.o) + 0x126 (size before relaxing) + .debug_str 0x00002576 0x55 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(puts_p.o) + 0x120 (size before relaxing) + .debug_str 0x000025cb 0xa1 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) + 0x174 (size before relaxing) + .debug_str 0x0000266c 0x53 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(fputc.o) + 0xf8 (size before relaxing) + +.debug_loc 0x00000000 0x3422 + *(.debug_loc) + .debug_loc 0x00000000 0xff AudioInputHost.o + .debug_loc 0x000000ff 0x280 ConfigDescriptor.o + .debug_loc 0x0000037f 0x3de ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_loc 0x0000075d 0x400 ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_loc 0x00000b5d 0x13 ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_loc 0x00000b70 0x118 ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_loc 0x00000c88 0xfe0 ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_loc 0x00001c68 0x365 ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + .debug_loc 0x00001fcd 0x2c5 ../../../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_loc 0x00002292 0x1f ../../../../LUFA/Drivers/USB/Core/USBTask.o + .debug_loc 0x000022b1 0x832 ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_loc 0x00002ae3 0x15e ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + .debug_loc 0x00002c41 0xe0 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(puts_p.o) + .debug_loc 0x00002d21 0x6b1 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) + .debug_loc 0x000033d2 0x50 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(fputc.o) + +.debug_macinfo + *(.debug_macinfo) +OUTPUT(AudioInputHost.elf elf32-avr) +LOAD linker stubs + +.debug_pubtypes + 0x00000000 0xa86 + .debug_pubtypes + 0x00000000 0x117 AudioInputHost.o + .debug_pubtypes + 0x00000117 0x179 ConfigDescriptor.o + .debug_pubtypes + 0x00000290 0x146 ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_pubtypes + 0x000003d6 0x66 ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_pubtypes + 0x0000043c 0x59 ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_pubtypes + 0x00000495 0x88 ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_pubtypes + 0x0000051d 0x4b ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_pubtypes + 0x00000568 0x17e ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + .debug_pubtypes + 0x000006e6 0x12 ../../../../LUFA/Drivers/USB/Core/Events.o + .debug_pubtypes + 0x000006f8 0xa0 ../../../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_pubtypes + 0x00000798 0x44 ../../../../LUFA/Drivers/USB/Core/USBTask.o + .debug_pubtypes + 0x000007dc 0x145 ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_pubtypes + 0x00000921 0x42 ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + .debug_pubtypes + 0x00000963 0x29 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(iob.o) + .debug_pubtypes + 0x0000098c 0x48 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(printf_p.o) + .debug_pubtypes + 0x000009d4 0x36 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(puts_p.o) + .debug_pubtypes + 0x00000a0a 0x53 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) + .debug_pubtypes + 0x00000a5d 0x29 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(fputc.o) + +.debug_ranges 0x00000000 0x490 + .debug_ranges 0x00000000 0x58 AudioInputHost.o + .debug_ranges 0x00000058 0x58 ConfigDescriptor.o + .debug_ranges 0x000000b0 0x60 ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_ranges 0x00000110 0xb0 ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_ranges 0x000001c0 0x20 ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_ranges 0x000001e0 0x20 ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_ranges 0x00000200 0x68 ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_ranges 0x00000268 0x30 ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + .debug_ranges 0x00000298 0x10 ../../../../LUFA/Drivers/USB/Core/Events.o + .debug_ranges 0x000002a8 0x30 ../../../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_ranges 0x000002d8 0x10 ../../../../LUFA/Drivers/USB/Core/USBTask.o + .debug_ranges 0x000002e8 0x100 ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_ranges 0x000003e8 0x50 ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + .debug_ranges 0x00000438 0x10 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(printf_p.o) + .debug_ranges 0x00000448 0x10 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(puts_p.o) + .debug_ranges 0x00000458 0x28 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) + .debug_ranges 0x00000480 0x10 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(fputc.o) + +Cross Reference Table + +Symbol File +Audio_Task AudioInputHost.o +CALLBACK_HIDParser_FilterHIDReportItem ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o +DComp_NextAudioControlInterface ConfigDescriptor.o +DComp_NextAudioInterfaceDataEndpoint ConfigDescriptor.o +DComp_NextAudioStreamInterface ConfigDescriptor.o +EVENT_USB_Host_DeviceAttached AudioInputHost.o + ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o +EVENT_USB_Host_DeviceEnumerationComplete AudioInputHost.o + ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o +EVENT_USB_Host_DeviceEnumerationFailed AudioInputHost.o + ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o +EVENT_USB_Host_DeviceUnattached AudioInputHost.o + ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o +EVENT_USB_Host_HostError AudioInputHost.o + ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o +EVENT_USB_Host_StartOfFrame ../../../../LUFA/Drivers/USB/Core/Events.o + ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o +Pipe_ClearPipes ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o +Pipe_ConfigurePipe ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + ConfigDescriptor.o +Pipe_Discard_Stream ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o +Pipe_IsEndpointBound ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o +Pipe_Null_Stream ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o +Pipe_Read_EStream_BE ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o +Pipe_Read_EStream_LE ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o +Pipe_Read_Stream_BE ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o +Pipe_Read_Stream_LE ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o +Pipe_WaitUntilReady ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o +Pipe_Write_EStream_BE ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o +Pipe_Write_EStream_LE ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o +Pipe_Write_PStream_BE ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o +Pipe_Write_PStream_LE ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o +Pipe_Write_Stream_BE ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o +Pipe_Write_Stream_LE ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o +ProcessConfigurationDescriptor ConfigDescriptor.o + AudioInputHost.o +Serial_SendData ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o +Serial_SendString ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o +Serial_SendString_P ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o +Serial_getchar ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + AudioInputHost.o +Serial_getchar_Blocking ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o +Serial_putchar ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + AudioInputHost.o +SetupHardware AudioInputHost.o +StreamingEndpointAddress ConfigDescriptor.o + AudioInputHost.o +StreamingInterfaceAltSetting ConfigDescriptor.o + AudioInputHost.o +StreamingInterfaceIndex ConfigDescriptor.o + AudioInputHost.o +USARTSerialStream ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + AudioInputHost.o +USB_ControlPipeSize ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + ../../../../LUFA/Drivers/USB/Core/HostStandardReq.o + ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o +USB_ControlRequest ../../../../LUFA/Drivers/USB/Core/USBTask.o + ../../../../LUFA/Drivers/USB/Core/HostStandardReq.o + ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + AudioInputHost.o +USB_Disable ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + AudioInputHost.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/ConfigDescriptor.o + ConfigDescriptor.o +USB_GetNextDescriptorOfType ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o +USB_GetNextDescriptorOfTypeAfter ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o +USB_GetNextDescriptorOfTypeBefore ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o +USB_HostState ../../../../LUFA/Drivers/USB/Core/USBTask.o + ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + ../../../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + AudioInputHost.o +USB_Host_ClearPipeStall ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o +USB_Host_GetDeviceConfigDescriptor ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + ConfigDescriptor.o +USB_Host_GetDeviceDescriptor ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o +USB_Host_GetDeviceStringDescriptor ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o +USB_Host_ProcessNextHostState ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + ../../../../LUFA/Drivers/USB/Core/USBTask.o +USB_Host_SendControlRequest ../../../../LUFA/Drivers/USB/Core/HostStandardReq.o + ../../../../LUFA/Drivers/USB/Core/ConfigDescriptor.o + ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + AudioInputHost.o +USB_Host_SetDeviceConfiguration ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + AudioInputHost.o +USB_Host_SetInterfaceAltSetting ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + AudioInputHost.o +USB_Host_WaitMS ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + ../../../../LUFA/Drivers/USB/Core/HostStandardReq.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 + AudioInputHost.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 + ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o +USB_SetHIDReportItemInfo ../../../../LUFA/Drivers/USB/Class/Common/HIDParser.o +USB_USBTask ../../../../LUFA/Drivers/USB/Core/USBTask.o + ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + AudioInputHost.o +__bad_interrupt c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__bss_end c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_clear_bss.o) +__bss_start c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_clear_bss.o) +__data_end c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_copy_data.o) +__data_load_start c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_copy_data.o) +__data_start c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_copy_data.o) +__do_clear_bss c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_clear_bss.o) + c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(iob.o) + ../../../../LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.o + ../../../../LUFA/Drivers/USB/Core/USBTask.o + ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + ConfigDescriptor.o +__do_copy_data c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_copy_data.o) + ../../../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + ../../../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + AudioInputHost.o +__eerd_byte_usb1287 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(eerd_byte_at90usb1287.o) + ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o +__eeupd_byte_usb1287 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(eeupd_byte_at90usb1287.o) + ../../../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o +__eeupd_r18_usb1287 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(eeupd_byte_at90usb1287.o) +__heap_end c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__init c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__iob c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(puts_p.o) + c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(printf_p.o) + c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(iob.o) + AudioInputHost.o +__stack c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__ultoa_invert c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(ultoa_invert.o) + c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) +__vector_1 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_10 ../../../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_11 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_12 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_13 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_14 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_15 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_16 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_17 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_18 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_19 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_2 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_20 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_21 AudioInputHost.o + c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_22 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_23 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_24 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_25 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_26 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_27 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_28 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_29 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_3 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_30 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_31 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_32 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_33 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_34 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_35 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_36 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_37 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_4 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_5 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_6 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_7 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_8 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_9 c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vector_default c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +__vectors c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +_exit c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_exit.o) +exit c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr51\libgcc.a(_exit.o) + c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +fputc c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(fputc.o) + c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) +main AudioInputHost.o + c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51/crtusb1286.o +printf_P c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(printf_p.o) + AudioInputHost.o +puts_P c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(puts_p.o) + AudioInputHost.o +strnlen c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(strnlen.o) + c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) +strnlen_P c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(strnlen_P.o) + c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) +vfprintf c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(vfprintf_std.o) + c:/program files (x86)/atmel/avr studio 5.0/extensions/application/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr51\libc.a(printf_p.o) diff --git a/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.o b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.o new file mode 100644 index 0000000000..f8bafd3d13 Binary files /dev/null and b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.o differ diff --git a/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.sym b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.sym new file mode 100644 index 0000000000..498ebbca4b --- /dev/null +++ b/Demos/Host/Incomplete/AudioInputHost/AudioInputHost.sym @@ -0,0 +1,267 @@ + U CALLBACK_HIDParser_FilterHIDReportItem +00000000 W __heap_end +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 a __tmp_reg__ +00000000 W __vector_default +00000000 T __vectors +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000001 a __zero_reg__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +00000034 a __CCP__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003d a __SP_L__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003e a __SP_H__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +0000003f a __SREG__ +00000098 t __c.3939 +000000b1 t __c.3935 +00000108 t __c.3933 +0000014b t __c.3930 +00000165 t __c.3928 +0000017c t __c.3926 +000001a6 t __c.3924 +000001bd t __c.3917 +00000213 t __c.3910 +00000242 t __c.3902 +00000261 t __c.3897 +0000027e t __c.3888 +000002a4 T __ctors_end +000002a4 T __ctors_start +000002a4 T __dtors_end +000002a4 T __dtors_start +000002a4 W __init +000002a4 T __trampolines_end +000002a4 T __trampolines_start +000002b0 T __do_copy_data +000002ca T __do_clear_bss +000002d2 t .do_clear_bss_loop +000002d4 t .do_clear_bss_start +000002e0 T __bad_interrupt +000002e0 W __vector_1 +000002e0 W __vector_11 +000002e0 W __vector_12 +000002e0 W __vector_13 +000002e0 W __vector_14 +000002e0 W __vector_15 +000002e0 W __vector_16 +000002e0 W __vector_17 +000002e0 W __vector_18 +000002e0 W __vector_19 +000002e0 W __vector_2 +000002e0 W __vector_20 +000002e0 W __vector_22 +000002e0 W __vector_23 +000002e0 W __vector_24 +000002e0 W __vector_25 +000002e0 W __vector_26 +000002e0 W __vector_27 +000002e0 W __vector_28 +000002e0 W __vector_29 +000002e0 W __vector_3 +000002e0 W __vector_30 +000002e0 W __vector_31 +000002e0 W __vector_32 +000002e0 W __vector_33 +000002e0 W __vector_34 +000002e0 W __vector_35 +000002e0 W __vector_36 +000002e0 W __vector_37 +000002e0 W __vector_4 +000002e0 W __vector_5 +000002e0 W __vector_6 +000002e0 W __vector_7 +000002e0 W __vector_8 +000002e0 W __vector_9 +000002e2 t LEDs_SetAllLEDs +000002ec T SetupHardware +0000037e T EVENT_USB_Host_DeviceAttached +00000388 T EVENT_USB_Host_DeviceUnattached +00000392 T EVENT_USB_Host_DeviceEnumerationComplete +00000396 T EVENT_USB_Host_HostError +000003d4 T EVENT_USB_Host_DeviceEnumerationFailed +00000424 T Audio_Task +00000558 T main +0000056c T __vector_21 +0000063e T DComp_NextAudioControlInterface +00000660 T DComp_NextAudioStreamInterface +00000682 T DComp_NextAudioInterfaceDataEndpoint +000006a4 T ProcessConfigurationDescriptor +000007d6 t USB_Host_ResetDevice +0000087e T USB_Host_WaitMS +00000928 T USB_Host_ProcessNextHostState +00000b8c T USB_Host_SetDeviceConfiguration +00000bb8 T USB_Host_SetInterfaceAltSetting +00000be6 T Pipe_ConfigurePipe +00000cb4 T Pipe_ClearPipes +00000cdc T USB_Disable +00000d0c T USB_ResetInterface +00000da8 T USB_Init +00000dba T USB_INT_DisableAllInterrupts +00000dca T USB_INT_ClearAllInterrupts +00000dd4 T __vector_10 +00000efa T USB_Host_GetDeviceConfigDescriptor +00000fa8 T USB_GetNextDescriptorComp +0000102e W EVENT_USB_Host_StartOfFrame +0000102e T USB_Event_Stub +00001030 t USB_Host_WaitForIOS +00001082 T USB_Host_SendControlRequest +000012ae T USB_USBTask +000012ca T Serial_putchar +000012dc T Serial_getchar +00001302 T printf_P +00001340 T puts_P +000013b0 T vfprintf +000017b6 T strnlen_P +000017cc T strnlen +000017e2 T fputc +0000183a T __ultoa_invert +000018f6 T _exit +000018f6 W exit +000018f8 t __stop_program +000018fa A __data_load_start +000018fa T _etext +00001916 A __data_load_end +000020ff W __stack +00800100 d C.5.5024 +00800100 D __data_start +00800103 d C.0.3420 +0080010b d C.10.3637 +00800113 d C.7.3627 +0080011b D USB_ControlPipeSize +0080011c B StreamingInterfaceIndex +0080011c B __bss_start +0080011c D __data_end +0080011c D _edata +0080011d B StreamingInterfaceAltSetting +0080011e B StreamingEndpointAddress +0080011f b PostWaitState.2492 +00800120 b WaitMSRemaining.2491 +00800122 B USB_IsInitialized +00800123 B USB_ControlRequest +0080012b B USB_HostState +0080012c B USARTSerialStream +0080013a B __iob +00800140 B __bss_end +00800140 N _end +00810000 N __eeprom_end diff --git a/Demos/Host/Incomplete/AudioInputHost/ConfigDescriptor.c b/Demos/Host/Incomplete/AudioInputHost/ConfigDescriptor.c new file mode 100644 index 0000000000..d0ca91a08d --- /dev/null +++ b/Demos/Host/Incomplete/AudioInputHost/ConfigDescriptor.c @@ -0,0 +1,183 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * USB Device Configuration Descriptor processing routines, to determine the correct pipe configurations + * needed to communication with an attached USB device. Descriptors are special computer-readable structures + * which the host requests upon device enumeration, to determine the device's capabilities and functions. + */ + +#include "ConfigDescriptor.h" + +uint8_t StreamingInterfaceIndex = 0; +uint8_t StreamingInterfaceAltSetting = 0; +uint8_t StreamingEndpointAddress = 0; + +uint8_t ProcessConfigurationDescriptor(void) +{ + uint8_t ConfigDescriptorData[512]; + void* CurrConfigLocation = ConfigDescriptorData; + uint16_t CurrConfigBytesRem; + + USB_Descriptor_Interface_t* AudioControlInterface = NULL; + USB_Descriptor_Interface_t* AudioStreamingInterface = NULL; + USB_Descriptor_Endpoint_t* DataINEndpoint = NULL; + + /* Retrieve the entire configuration descriptor into the allocated buffer */ + switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData))) + { + case HOST_GETCONFIG_Successful: + break; + case HOST_GETCONFIG_InvalidData: + return InvalidConfigDataReturned; + case HOST_GETCONFIG_BuffOverflow: + return DescriptorTooLarge; + default: + return ControlError; + } + + while (!(DataINEndpoint)) + { + if (!(AudioControlInterface) || + USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, + DComp_NextAudioInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) + { + if (!(AudioControlInterface)) + { + if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, + DComp_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found) + { + /* Descriptor not found, error out */ + return NoCompatibleInterfaceFound; + } + + /* Save the interface in case we need to refer back to it later */ + AudioControlInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t); + } + + if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, + DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found) + { + if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, + DComp_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found) + { + /* Descriptor not found, error out */ + return NoCompatibleInterfaceFound; + } + + /* Save the interface in case we need to refer back to it later */ + AudioControlInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t); + } + + /* Save the interface in case we need to refer back to it later */ + AudioStreamingInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t); + + /* Skip the remainder of the loop as we have not found an endpoint yet */ + continue; + } + + /* Retrieve the endpoint address from the endpoint descriptor */ + USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t); + + /* If the endpoint is a IN type endpoint */ + if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN) + DataINEndpoint = EndpointData; + } + + StreamingInterfaceIndex = AudioStreamingInterface->InterfaceNumber; + StreamingInterfaceAltSetting = AudioStreamingInterface->AlternateSetting; + StreamingEndpointAddress = DataINEndpoint->EndpointAddress; + + /* Configure the HID data IN pipe */ + Pipe_ConfigurePipe(AUDIO_DATA_IN_PIPE, EP_TYPE_ISOCHRONOUS, PIPE_TOKEN_IN, + DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_DOUBLE); + + /* Valid data found, return success */ + return SuccessfulConfigRead; +} + +uint8_t DComp_NextAudioControlInterface(void* CurrentDescriptor) +{ + USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + + if (Header->Type == DTYPE_Interface) + { + USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); + + if ((Interface->Class == AUDIO_CSCP_AudioClass) && + (Interface->SubClass == AUDIO_CSCP_ControlSubclass) && + (Interface->Protocol == AUDIO_CSCP_ControlProtocol)) + { + return DESCRIPTOR_SEARCH_Found; + } + } + + return DESCRIPTOR_SEARCH_NotFound; +} + +uint8_t DComp_NextAudioStreamInterface(void* CurrentDescriptor) +{ + USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + + if (Header->Type == DTYPE_Interface) + { + USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); + + if ((Interface->Class == AUDIO_CSCP_AudioClass) && + (Interface->SubClass == AUDIO_CSCP_AudioStreamingSubclass) && + (Interface->Protocol == AUDIO_CSCP_StreamingProtocol)) + { + return DESCRIPTOR_SEARCH_Found; + } + } + + return DESCRIPTOR_SEARCH_NotFound; +} + +uint8_t DComp_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor) +{ + USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + + if (Header->Type == DTYPE_Endpoint) + { + USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t); + + if ((Endpoint->Attributes & EP_TYPE_MASK) == EP_TYPE_ISOCHRONOUS) + return DESCRIPTOR_SEARCH_Found; + } + else if (Header->Type == DTYPE_Interface) + { + return DESCRIPTOR_SEARCH_Fail; + } + + return DESCRIPTOR_SEARCH_NotFound; +} + diff --git a/Demos/Host/Incomplete/AudioInputHost/ConfigDescriptor.h b/Demos/Host/Incomplete/AudioInputHost/ConfigDescriptor.h new file mode 100644 index 0000000000..4a1cf90935 --- /dev/null +++ b/Demos/Host/Incomplete/AudioInputHost/ConfigDescriptor.h @@ -0,0 +1,72 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for ConfigDescriptor.c. + */ + +#ifndef _CONFIGDESCRIPTOR_H_ +#define _CONFIGDESCRIPTOR_H_ + + /* Includes: */ + #include + + #include "AudioInputHost.h" + + /* Macros: */ + /** Pipe number for the Audio data IN pipe. */ + #define AUDIO_DATA_IN_PIPE 1 + + /* Enums: */ + /** Enum for the possible return codes of the \ref ProcessConfigurationDescriptor() function. */ + enum KeyboardHost_GetConfigDescriptorDataCodes_t + { + SuccessfulConfigRead = 0, /**< Configuration Descriptor was processed successfully */ + ControlError = 1, /**< A control request to the device failed to complete successfully */ + DescriptorTooLarge = 2, /**< The device's Configuration Descriptor is too large to process */ + InvalidConfigDataReturned = 3, /**< The device returned an invalid Configuration Descriptor */ + NoCompatibleInterfaceFound = 4, /**< A compatible interface with the required endpoints was not found */ + }; + + /* External Variables: */ + extern uint8_t StreamingInterfaceIndex; + extern uint8_t StreamingInterfaceAltSetting; + extern uint8_t StreamingEndpointAddress; + + /* Function Prototypes: */ + uint8_t ProcessConfigurationDescriptor(void); + + uint8_t DComp_NextAudioControlInterface(void* CurrentDescriptor); + uint8_t DComp_NextAudioStreamInterface(void* CurrentDescriptor); + uint8_t DComp_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor); + +#endif + diff --git a/Demos/Host/Incomplete/AudioInputHost/ConfigDescriptor.lst b/Demos/Host/Incomplete/AudioInputHost/ConfigDescriptor.lst new file mode 100644 index 0000000000..9a63786294 --- /dev/null +++ b/Demos/Host/Incomplete/AudioInputHost/ConfigDescriptor.lst @@ -0,0 +1,400 @@ + 1 .file "ConfigDescriptor.c" + 2 __SREG__ = 0x3f + 3 __SP_H__ = 0x3e + 4 __SP_L__ = 0x3d + 5 __CCP__ = 0x34 + 6 __tmp_reg__ = 0 + 7 __zero_reg__ = 1 + 15 .Ltext0: + 16 .section .text.DComp_NextAudioControlInterface,"ax",@progbits + 17 .global DComp_NextAudioControlInterface + 19 DComp_NextAudioControlInterface: + 20 .LFB132: + 21 .LSM0: + 22 .LVL0: + 23 /* prologue: function */ + 24 /* frame size = 0 */ + 25 /* stack size = 0 */ + 26 .L__stack_usage = 0 + 27 0000 FC01 movw r30,r24 + 28 .LVL1: + 29 .LSM1: + 30 0002 8181 ldd r24,Z+1 + 31 .LVL2: + 32 0004 8430 cpi r24,lo8(4) + 33 0006 01F4 brne .L5 + 34 .LVL3: + 35 .LBB2: + 36 .LSM2: + 37 0008 8581 ldd r24,Z+5 + 38 000a 8130 cpi r24,lo8(1) + 39 000c 01F4 brne .L5 + 40 .LSM3: + 41 000e 8681 ldd r24,Z+6 + 42 0010 8130 cpi r24,lo8(1) + 43 0012 01F4 brne .L5 + 44 .LSM4: + 45 0014 8781 ldd r24,Z+7 + 46 0016 8823 tst r24 + 47 0018 01F0 breq .L6 + 48 .LVL4: + 49 .L5: + 50 .LSM5: + 51 001a 82E0 ldi r24,lo8(2) + 52 001c 0895 ret + 53 .LVL5: + 54 .L6: + 55 .LSM6: + 56 001e 80E0 ldi r24,lo8(0) + 57 .LBE2: + 58 .LSM7: + 59 0020 0895 ret + 60 .LFE132: + 62 .section .text.DComp_NextAudioStreamInterface,"ax",@progbits + 63 .global DComp_NextAudioStreamInterface + 65 DComp_NextAudioStreamInterface: + 66 .LFB133: + 67 .LSM8: + 68 .LVL6: + 69 /* prologue: function */ + 70 /* frame size = 0 */ + 71 /* stack size = 0 */ + 72 .L__stack_usage = 0 + 73 0000 FC01 movw r30,r24 + 74 .LVL7: + 75 .LSM9: + 76 0002 8181 ldd r24,Z+1 + 77 .LVL8: + 78 0004 8430 cpi r24,lo8(4) + 79 0006 01F4 brne .L11 + 80 .LVL9: + 81 .LBB3: + 82 .LSM10: + 83 0008 8581 ldd r24,Z+5 + 84 000a 8130 cpi r24,lo8(1) + 85 000c 01F4 brne .L11 + 86 .LSM11: + 87 000e 8681 ldd r24,Z+6 + 88 0010 8230 cpi r24,lo8(2) + 89 0012 01F4 brne .L11 + 90 .LSM12: + 91 0014 8781 ldd r24,Z+7 + 92 0016 8823 tst r24 + 93 0018 01F0 breq .L12 + 94 .LVL10: + 95 .L11: + 96 .LSM13: + 97 001a 82E0 ldi r24,lo8(2) + 98 001c 0895 ret + 99 .LVL11: + 100 .L12: + 101 .LSM14: + 102 001e 80E0 ldi r24,lo8(0) + 103 .LBE3: + 104 .LSM15: + 105 0020 0895 ret + 106 .LFE133: + 108 .section .text.DComp_NextAudioInterfaceDataEndpoint,"ax",@progbits + 109 .global DComp_NextAudioInterfaceDataEndpoint + 111 DComp_NextAudioInterfaceDataEndpoint: + 112 .LFB134: + 113 .LSM16: + 114 .LVL12: + 115 /* prologue: function */ + 116 /* frame size = 0 */ + 117 /* stack size = 0 */ + 118 .L__stack_usage = 0 + 119 0000 FC01 movw r30,r24 + 120 .LVL13: + 121 .LSM17: + 122 0002 8181 ldd r24,Z+1 + 123 .LVL14: + 124 0004 8530 cpi r24,lo8(5) + 125 0006 01F4 brne .L14 + 126 .LVL15: + 127 .LBB4: + 128 .LSM18: + 129 0008 8381 ldd r24,Z+3 + 130 000a 8370 andi r24,lo8(3) + 131 000c 8130 cpi r24,lo8(1) + 132 000e 01F4 brne .L18 + 133 0010 00C0 rjmp .L16 + 134 .LVL16: + 135 .L14: + 136 .LBE4: + 137 .LSM19: + 138 0012 8430 cpi r24,lo8(4) + 139 0014 01F0 breq .L17 + 140 .L18: + 141 .LSM20: + 142 0016 82E0 ldi r24,lo8(2) + 143 0018 0895 ret + 144 .LVL17: + 145 .L16: + 146 .LBB5: + 147 .LSM21: + 148 001a 80E0 ldi r24,lo8(0) + 149 001c 0895 ret + 150 .LVL18: + 151 .L17: + 152 .LBE5: + 153 .LSM22: + 154 001e 81E0 ldi r24,lo8(1) + 155 .LSM23: + 156 0020 0895 ret + 157 .LFE134: + 159 .section .text.ProcessConfigurationDescriptor,"ax",@progbits + 160 .global ProcessConfigurationDescriptor + 162 ProcessConfigurationDescriptor: + 163 .LFB131: + 164 .LSM24: + 165 0000 AF92 push r10 + 166 0002 BF92 push r11 + 167 0004 CF92 push r12 + 168 0006 DF92 push r13 + 169 0008 EF92 push r14 + 170 000a FF92 push r15 + 171 000c 0F93 push r16 + 172 000e 1F93 push r17 + 173 0010 DF93 push r29 + 174 0012 CF93 push r28 + 175 0014 CDB7 in r28,__SP_L__ + 176 0016 DEB7 in r29,__SP_H__ + 177 0018 C450 subi r28,lo8(-(-516)) + 178 001a D240 sbci r29,hi8(-(-516)) + 179 001c 0FB6 in __tmp_reg__,__SREG__ + 180 001e F894 cli + 181 0020 DEBF out __SP_H__,r29 + 182 0022 0FBE out __SREG__,__tmp_reg__ + 183 0024 CDBF out __SP_L__,r28 + 184 /* prologue: function */ + 185 /* frame size = 516 */ + 186 /* stack size = 526 */ + 187 .L__stack_usage = 526 + 188 .LSM25: + 189 0026 AE01 movw r20,r28 + 190 0028 4B5F subi r20,lo8(-(5)) + 191 002a 5F4F sbci r21,hi8(-(5)) + 192 002c 5A83 std Y+2,r21 + 193 002e 4983 std Y+1,r20 + 194 .LVL19: + 195 .LSM26: + 196 0030 23E0 ldi r18,lo8(3) + 197 0032 E22E mov r14,r18 + 198 0034 F12C mov r15,__zero_reg__ + 199 0036 EC0E add r14,r28 + 200 0038 FD1E adc r15,r29 + 201 003a 81E0 ldi r24,lo8(1) + 202 003c B701 movw r22,r14 + 203 003e 20E0 ldi r18,lo8(512) + 204 0040 32E0 ldi r19,hi8(512) + 205 0042 0E94 0000 call USB_Host_GetDeviceConfigDescriptor + 206 0046 8530 cpi r24,lo8(5) + 207 0048 01F4 brne .+2 + 208 004a 00C0 rjmp .L31 + 209 004c 8630 cpi r24,lo8(6) + 210 004e 01F0 breq .L23 + 211 0050 8823 tst r24 + 212 0052 01F4 brne .L34 + 213 0054 00E0 ldi r16,lo8(0) + 214 0056 10E0 ldi r17,hi8(0) + 215 0058 CC24 clr r12 + 216 005a DD24 clr r13 + 217 005c 5701 movw r10,r14 + 218 005e 7E01 movw r14,r28 + 219 0060 0894 sec + 220 0062 E11C adc r14,__zero_reg__ + 221 0064 F11C adc r15,__zero_reg__ + 222 0066 00C0 rjmp .L24 + 223 .L23: + 224 .LSM27: + 225 0068 83E0 ldi r24,lo8(3) + 226 006a 00C0 rjmp .L22 + 227 .L34: + 228 .LSM28: + 229 006c 81E0 ldi r24,lo8(1) + 230 006e 00C0 rjmp .L22 + 231 .LVL20: + 232 .L30: + 233 .LSM29: + 234 0070 9C01 movw r18,r24 + 235 0072 032F mov r16,r19 + 236 0074 182F mov r17,r24 + 237 .LVL21: + 238 .L24: + 239 .LBB6: + 240 .LSM30: + 241 0076 C114 cp r12,__zero_reg__ + 242 0078 D104 cpc r13,__zero_reg__ + 243 007a 01F0 breq .L25 + 244 .LSM31: + 245 007c C501 movw r24,r10 + 246 007e B701 movw r22,r14 + 247 0080 40E0 ldi r20,lo8(gs(DComp_NextAudioInterfaceDataEndpoint)) + 248 0082 50E0 ldi r21,hi8(gs(DComp_NextAudioInterfaceDataEndpoint)) + 249 0084 0E94 0000 call USB_GetNextDescriptorComp + 250 .LSM32: + 251 0088 8823 tst r24 + 252 008a 01F4 brne .L26 + 253 008c 00C0 rjmp .L36 + 254 .L25: + 255 .LSM33: + 256 008e C501 movw r24,r10 + 257 0090 B701 movw r22,r14 + 258 0092 40E0 ldi r20,lo8(gs(DComp_NextAudioControlInterface)) + 259 0094 50E0 ldi r21,hi8(gs(DComp_NextAudioControlInterface)) + 260 0096 0E94 0000 call USB_GetNextDescriptorComp + 261 009a 8823 tst r24 + 262 009c 01F4 brne .L33 + 263 .LSM34: + 264 009e C980 ldd r12,Y+1 + 265 00a0 DA80 ldd r13,Y+2 + 266 .LVL22: + 267 .L26: + 268 .LSM35: + 269 00a2 C501 movw r24,r10 + 270 00a4 B701 movw r22,r14 + 271 00a6 40E0 ldi r20,lo8(gs(DComp_NextAudioStreamInterface)) + 272 00a8 50E0 ldi r21,hi8(gs(DComp_NextAudioStreamInterface)) + 273 00aa 0E94 0000 call USB_GetNextDescriptorComp + 274 00ae 8823 tst r24 + 275 00b0 01F0 breq .L28 + 276 .LSM36: + 277 00b2 C501 movw r24,r10 + 278 00b4 B701 movw r22,r14 + 279 00b6 40E0 ldi r20,lo8(gs(DComp_NextAudioControlInterface)) + 280 00b8 50E0 ldi r21,hi8(gs(DComp_NextAudioControlInterface)) + 281 00ba 0E94 0000 call USB_GetNextDescriptorComp + 282 00be 8823 tst r24 + 283 00c0 01F4 brne .L33 + 284 .LSM37: + 285 00c2 C980 ldd r12,Y+1 + 286 00c4 DA80 ldd r13,Y+2 + 287 .LVL23: + 288 .L28: + 289 .LSM38: + 290 00c6 0981 ldd r16,Y+1 + 291 00c8 1A81 ldd r17,Y+2 + 292 .LVL24: + 293 .LSM39: + 294 00ca 00C0 rjmp .L29 + 295 .LVL25: + 296 .L36: + 297 .LSM40: + 298 00cc E981 ldd r30,Y+1 + 299 00ce FA81 ldd r31,Y+2 + 300 .LVL26: + 301 .LSM41: + 302 00d0 8281 ldd r24,Z+2 + 303 00d2 87FF sbrs r24,7 + 304 00d4 00C0 rjmp .L29 + 305 .LSM42: + 306 00d6 902F mov r25,r16 + 307 00d8 812F mov r24,r17 + 308 .LVL27: + 309 .LBE6: + 310 .LSM43: + 311 00da 3097 sbiw r30,0 + 312 00dc 01F0 breq .L30 + 313 .LSM44: + 314 00de D801 movw r26,r16 + 315 00e0 1296 adiw r26,2 + 316 00e2 8C91 ld r24,X + 317 00e4 1297 sbiw r26,2 + 318 00e6 8093 0000 sts StreamingInterfaceIndex,r24 + 319 .LSM45: + 320 00ea 1396 adiw r26,3 + 321 00ec 8C91 ld r24,X + 322 00ee 8093 0000 sts StreamingInterfaceAltSetting,r24 + 323 .LSM46: + 324 00f2 2281 ldd r18,Z+2 + 325 00f4 2093 0000 sts StreamingEndpointAddress,r18 + 326 .LSM47: + 327 00f8 0481 ldd r16,Z+4 + 328 00fa 1581 ldd r17,Z+5 + 329 .LVL28: + 330 00fc 81E0 ldi r24,lo8(1) + 331 00fe 61E0 ldi r22,lo8(1) + 332 0100 40E1 ldi r20,lo8(16) + 333 0102 94E0 ldi r25,lo8(4) + 334 0104 E92E mov r14,r25 + 335 .LVL29: + 336 0106 0E94 0000 call Pipe_ConfigurePipe + 337 .LVL30: + 338 .LSM48: + 339 010a 80E0 ldi r24,lo8(0) + 340 010c 00C0 rjmp .L22 + 341 .LVL31: + 342 .L31: + 343 .LSM49: + 344 010e 82E0 ldi r24,lo8(2) + 345 0110 00C0 rjmp .L22 + 346 .LVL32: + 347 .L33: + 348 .LBB7: + 349 .LSM50: + 350 0112 84E0 ldi r24,lo8(4) + 351 .L22: + 352 /* epilogue start */ + 353 .LBE7: + 354 .LSM51: + 355 0114 CC5F subi r28,lo8(-(516)) + 356 0116 DD4F sbci r29,hi8(-(516)) + 357 0118 0FB6 in __tmp_reg__,__SREG__ + 358 011a F894 cli + 359 011c DEBF out __SP_H__,r29 + 360 011e 0FBE out __SREG__,__tmp_reg__ + 361 0120 CDBF out __SP_L__,r28 + 362 0122 CF91 pop r28 + 363 0124 DF91 pop r29 + 364 0126 1F91 pop r17 + 365 0128 0F91 pop r16 + 366 012a FF90 pop r15 + 367 012c EF90 pop r14 + 368 012e DF90 pop r13 + 369 0130 CF90 pop r12 + 370 0132 BF90 pop r11 + 371 0134 AF90 pop r10 + 372 0136 0895 ret + 373 .L29: + 374 .LVL33: + 375 .LSM52: + 376 0138 902F mov r25,r16 + 377 013a 812F mov r24,r17 + 378 013c 00C0 rjmp .L30 + 379 .LFE131: + 381 .global StreamingInterfaceIndex + 382 .global StreamingInterfaceIndex + 383 .section .bss + 386 StreamingInterfaceIndex: + 387 0000 00 .skip 1,0 + 388 .global StreamingInterfaceAltSetting + 389 .global StreamingInterfaceAltSetting + 392 StreamingInterfaceAltSetting: + 393 0001 00 .skip 1,0 + 394 .global StreamingEndpointAddress + 395 .global StreamingEndpointAddress + 398 StreamingEndpointAddress: + 399 0002 00 .skip 1,0 + 448 .Letext0: +DEFINED SYMBOLS + *ABS*:00000000 ConfigDescriptor.c +C:\Users\Dean\AppData\Local\Temp\cc2CU2Sj.s:2 *ABS*:0000003f __SREG__ +C:\Users\Dean\AppData\Local\Temp\cc2CU2Sj.s:3 *ABS*:0000003e __SP_H__ +C:\Users\Dean\AppData\Local\Temp\cc2CU2Sj.s:4 *ABS*:0000003d __SP_L__ +C:\Users\Dean\AppData\Local\Temp\cc2CU2Sj.s:5 *ABS*:00000034 __CCP__ +C:\Users\Dean\AppData\Local\Temp\cc2CU2Sj.s:6 *ABS*:00000000 __tmp_reg__ +C:\Users\Dean\AppData\Local\Temp\cc2CU2Sj.s:7 *ABS*:00000001 __zero_reg__ +C:\Users\Dean\AppData\Local\Temp\cc2CU2Sj.s:19 .text.DComp_NextAudioControlInterface:00000000 DComp_NextAudioControlInterface +C:\Users\Dean\AppData\Local\Temp\cc2CU2Sj.s:65 .text.DComp_NextAudioStreamInterface:00000000 DComp_NextAudioStreamInterface +C:\Users\Dean\AppData\Local\Temp\cc2CU2Sj.s:111 .text.DComp_NextAudioInterfaceDataEndpoint:00000000 DComp_NextAudioInterfaceDataEndpoint +C:\Users\Dean\AppData\Local\Temp\cc2CU2Sj.s:162 .text.ProcessConfigurationDescriptor:00000000 ProcessConfigurationDescriptor +C:\Users\Dean\AppData\Local\Temp\cc2CU2Sj.s:386 .bss:00000000 StreamingInterfaceIndex +C:\Users\Dean\AppData\Local\Temp\cc2CU2Sj.s:392 .bss:00000001 StreamingInterfaceAltSetting +C:\Users\Dean\AppData\Local\Temp\cc2CU2Sj.s:398 .bss:00000002 StreamingEndpointAddress + +UNDEFINED SYMBOLS +USB_Host_GetDeviceConfigDescriptor +USB_GetNextDescriptorComp +Pipe_ConfigurePipe +__do_clear_bss diff --git a/Demos/Host/Incomplete/AudioInputHost/ConfigDescriptor.o b/Demos/Host/Incomplete/AudioInputHost/ConfigDescriptor.o new file mode 100644 index 0000000000..8c4ba0511b Binary files /dev/null and b/Demos/Host/Incomplete/AudioInputHost/ConfigDescriptor.o differ diff --git a/Demos/Host/Incomplete/AudioInputHost/makefile b/Demos/Host/Incomplete/AudioInputHost/makefile new file mode 100644 index 0000000000..6febc161d1 --- /dev/null +++ b/Demos/Host/Incomplete/AudioInputHost/makefile @@ -0,0 +1,714 @@ +# Hey Emacs, this is a -*- makefile -*- +#---------------------------------------------------------------------------- +# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al. +# >> Modified for use with the LUFA project. << +# +# Released to the Public Domain +# +# Additional material for this makefile was written by: +# Peter Fleury +# Tim Henigan +# Colin O'Flynn +# Reiner Patommel +# Markus Pfaff +# Sander Pool +# Frederik Rouleau +# Carlos Lamas +# Dean Camera +# Opendous Inc. +# Denver Gingerich +# +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device, using avrdude. +# Please customize the avrdude settings below first! +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make doxygen = Generate DoxyGen documentation for the project (must have +# DoxyGen installed) +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + + +# MCU name +MCU = at90usb1287 + + +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + + +# Target board (see library "Board Types" documentation, NONE for projects not requiring +# LUFA board drivers). If USER is selected, put custom board drivers in a directory called +# "Board" inside the application directory. +BOARD = USBKEY + + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 8000000 + + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + + +# Target file name (without extension). +TARGET = AudioInputHost + + +# Object files directory +# To put object files in current directory, use a dot (.), do NOT make +# this an empty or blank macro! +OBJDIR = . + + +# Path to the LUFA library +LUFA_PATH = ../../../.. + + +# LUFA library compile-time options and predefined tokens +LUFA_OPTS = -D USB_HOST_ONLY +LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" + + +# Create the LUFA source path variables by including the LUFA root makefile +include $(LUFA_PATH)/LUFA/makefile + + +# List C source files here. (C dependencies are automatically generated.) +SRC = $(TARGET).c \ + ConfigDescriptor.c \ + $(LUFA_SRC_USB) \ + $(LUFA_SRC_SERIAL) + + +# List C++ source files here. (C dependencies are automatically generated.) +CPPSRC = + + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRAINCDIRS = $(LUFA_PATH)/ + + +# Compiler flag to set the C Standard level. +# c89 = "ANSI" C +# gnu89 = c89 plus GCC extensions +# c99 = ISO C99 standard (not yet fully implemented) +# gnu99 = c99 plus GCC extensions +CSTANDARD = -std=c99 + + +# Place -D or -U options here for C sources +CDEFS = -DF_CPU=$(F_CPU)UL +CDEFS += -DF_USB=$(F_USB)UL +CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH) +CDEFS += $(LUFA_OPTS) + + +# Place -D or -U options here for ASM sources +ADEFS = -DF_CPU=$(F_CPU) +ADEFS += -DF_USB=$(F_USB)UL +ADEFS += -DBOARD=BOARD_$(BOARD) +ADEFS += $(LUFA_OPTS) + +# Place -D or -U options here for C++ sources +CPPDEFS = -DF_CPU=$(F_CPU)UL +CPPDEFS += -DF_USB=$(F_USB)UL +CPPDEFS += -DBOARD=BOARD_$(BOARD) +CPPDEFS += $(LUFA_OPTS) +#CPPDEFS += -D__STDC_LIMIT_MACROS +#CPPDEFS += -D__STDC_CONSTANT_MACROS + + + +#---------------- Compiler Options C ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char +CFLAGS += -funsigned-bitfields +CFLAGS += -ffunction-sections +CFLAGS += -fno-inline-small-functions +CFLAGS += -fpack-struct +CFLAGS += -fshort-enums +CFLAGS += -fno-strict-aliasing +CFLAGS += -Wall +CFLAGS += -Wstrict-prototypes +#CFLAGS += -mshort-calls +#CFLAGS += -fno-unit-at-a-time +#CFLAGS += -Wundef +#CFLAGS += -Wunreachable-code +#CFLAGS += -Wsign-compare +CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) + + +#---------------- Compiler Options C++ ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CPPFLAGS = -g$(DEBUG) +CPPFLAGS += $(CPPDEFS) +CPPFLAGS += -O$(OPT) +CPPFLAGS += -funsigned-char +CPPFLAGS += -funsigned-bitfields +CPPFLAGS += -fpack-struct +CPPFLAGS += -fshort-enums +CPPFLAGS += -fno-exceptions +CPPFLAGS += -Wall +CPPFLAGS += -Wundef +#CPPFLAGS += -mshort-calls +#CPPFLAGS += -fno-unit-at-a-time +#CPPFLAGS += -Wstrict-prototypes +#CPPFLAGS += -Wunreachable-code +#CPPFLAGS += -Wsign-compare +CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) +CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +#CPPFLAGS += $(CSTANDARD) + + +#---------------- Assembler Options ---------------- +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +# -listing-cont-lines: Sets the maximum number of continuation lines of hex +# dump that will be displayed for a given single line of source input. +ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 + + +#---------------- Library Options ---------------- +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +# If this is left blank, then it will use the Standard printf version. +PRINTF_LIB = +#PRINTF_LIB = $(PRINTF_LIB_MIN) +#PRINTF_LIB = $(PRINTF_LIB_FLOAT) + + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +# If this is left blank, then it will use the Standard scanf version. +SCANF_LIB = +#SCANF_LIB = $(SCANF_LIB_MIN) +#SCANF_LIB = $(SCANF_LIB_FLOAT) + + +MATH_LIB = -lm + + +# List any extra directories to look for libraries here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRALIBDIRS = + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + +#---------------- Linker Options ---------------- +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += -Wl,--relax +LDFLAGS += -Wl,--gc-sections +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) +#LDFLAGS += -T linker_script.x + + + +#---------------- Programming Options (avrdude) ---------------- + +# Programming hardware +# Type: avrdude -c ? +# to get a full listing. +# +AVRDUDE_PROGRAMMER = jtagmkII + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = usb + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) + + + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +AR = avr-ar rcs +NM = avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +REMOVEDIR = rm -rf +COPY = cp +WINSHELL = cmd + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling C: +MSG_COMPILING_CPP = Compiling C++: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: +MSG_CREATING_LIBRARY = Creating library: + + + + +# Define all object files. +OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) + +# Define all listing files. +LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) + + +# Compiler flags to generate dependency files. +GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d + + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + + + +# Default target. +all: begin gccversion sizebefore build sizeafter end + +# Change the build target to build a HEX file or a library. +build: elf hex eep lss sym +#build: lib + + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym +LIBNAME=lib$(TARGET).a +lib: $(LIBNAME) + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf +MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) +FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) + + +sizebefore: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ + 2>/dev/null; echo; fi + +sizeafter: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ + 2>/dev/null; echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + +flip: $(TARGET).hex + batchisp -hardware usb -device $(MCU) -operation erase f + batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program + batchisp -hardware usb -device $(MCU) -operation start reset 0 + +dfu: $(TARGET).hex + dfu-programmer $(MCU) erase + dfu-programmer $(MCU) flash $(TARGET).hex + dfu-programmer $(MCU) reset + +flip-ee: $(TARGET).hex $(TARGET).eep + $(COPY) $(TARGET).eep $(TARGET)eep.hex + batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase + batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $(TARGET)eep.hex program + batchisp -hardware usb -device $(MCU) -operation start reset 0 + $(REMOVE) $(TARGET)eep.hex + +dfu-ee: $(TARGET).hex $(TARGET).eep + dfu-programmer $(MCU) eeprom-flash $(TARGET).eep + dfu-programmer $(MCU) reset + + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause + +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT = $(OBJCOPY) --debugging +COFFCONVERT += --change-section-address .data-0x800000 +COFFCONVERT += --change-section-address .bss-0x800000 +COFFCONVERT += --change-section-address .noinit-0x800000 +COFFCONVERT += --change-section-address .eeprom-0x810000 + + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S -z $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Create library from object files. +.SECONDARY : $(TARGET).a +.PRECIOUS : $(OBJ) +%.a: $(OBJ) + @echo + @echo $(MSG_CREATING_LIBRARY) $@ + $(AR) $@ $(OBJ) + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +$(OBJDIR)/%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create object files from C++ source files. +$(OBJDIR)/%.o : %.cpp + @echo + @echo $(MSG_COMPILING_CPP) $< + $(CC) -c $(ALL_CPPFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C++ source files. +%.s : %.cpp + $(CC) -S $(ALL_CPPFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +$(OBJDIR)/%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + +# Create preprocessed source for use in sending a bug report. +%.i : %.c + $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ + + +# Target: clean project. +clean: begin clean_list end + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lss + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) $(SRC:.c=.i) + $(REMOVEDIR) .dep + +doxygen: + @echo Generating Project Documentation... + @doxygen Doxygen.conf + @echo Documentation Generation Complete. + +clean_doxygen: + rm -rf Documentation + +# Create object files directory +$(shell mkdir $(OBJDIR) 2>/dev/null) + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff doxygen clean \ +clean_list clean_doxygen program dfu flip flip-ee dfu-ee \ +debug gdb-config + diff --git a/LUFA.pnproj b/LUFA.pnproj index c2426bda71..8b0155b272 100644 --- a/LUFA.pnproj +++ b/LUFA.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/LUFA/Drivers/USB/Class/Common/Audio.h b/LUFA/Drivers/USB/Class/Common/Audio.h index c838411f06..713c96f7c7 100644 --- a/LUFA/Drivers/USB/Class/Common/Audio.h +++ b/LUFA/Drivers/USB/Class/Common/Audio.h @@ -204,7 +204,7 @@ * * \param[in] freq Required audio sampling frequency in HZ */ - #define AUDIO_SAMPLE_FREQ(freq) {.Byte1 = (freq & 0x0000FF), .Byte2 = ((freq >> 8) & 0xFF), .Byte3 = ((freq >> 16) & 0xFF)} + #define AUDIO_SAMPLE_FREQ(freq) {.Byte1 = ((uint32_t)freq & 0x0000FF), .Byte2 = (((uint32_t)freq >> 8) & 0xFF), .Byte3 = (((uint32_t)freq >> 16) & 0xFF)} /** Mask for the attributes parameter of an Audio class-specific Endpoint descriptor, indicating that the endpoint * accepts only filled endpoint packets of audio samples. @@ -215,7 +215,7 @@ * will accept partially filled endpoint packets of audio samples. */ #define AUDIO_EP_ACCEPTS_SMALL_PACKETS (0 << 7) - + /* Enums: */ /** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the Audio * device class. @@ -269,6 +269,22 @@ AUDIO_DSUBTYPE_CSEndpoint_General = 0x01, /**< Audio class specific endpoint general descriptor. */ }; + /** Enum for the Audio class specific control requests that can be issued by the USB bus host. */ + enum Audio_ClassRequests_t + { + AUDIO_REQ_SetCurrent = 0x01, /**< Audio class-specific request to set the current value of a parameter within the device. */ + AUDIO_REQ_SetMinimum = 0x02, /**< Audio class-specific request to set the minimum value of a parameter within the device. */ + AUDIO_REQ_SetMaximum = 0x03, /**< Audio class-specific request to set the maximum value of a parameter within the device. */ + AUDIO_REQ_SetResolution = 0x04, /**< Audio class-specific request to set the resolution value of a parameter within the device. */ + AUDIO_REQ_SetMemory = 0x05, /**< Audio class-specific request to set the memory value of a parameter within the device. */ + AUDIO_REQ_GetCurrent = 0x81, /**< Audio class-specific request to get the current value of a parameter within the device. */ + AUDIO_REQ_GetMinimum = 0x82, /**< Audio class-specific request to get the minimum value of a parameter within the device. */ + AUDIO_REQ_GetMaximum = 0x83, /**< Audio class-specific request to get the maximum value of a parameter within the device. */ + AUDIO_REQ_GetResolution = 0x84, /**< Audio class-specific request to get the resolution value of a parameter within the device. */ + AUDIO_REQ_GetMemory = 0x85, /**< Audio class-specific request to get the memory value of a parameter within the device. */ + AUDIO_REQ_GetStatus = 0xFF, /**< Audio class-specific request to get the device status. */ + }; + /* Type Defines: */ /** \brief Audio class-specific Input Terminal Descriptor (LUFA naming conventions). * diff --git a/LUFA/Drivers/USB/Class/Device/Audio.c b/LUFA/Drivers/USB/Class/Device/Audio.c index f18db74560..8c5c9960d5 100644 --- a/LUFA/Drivers/USB/Class/Device/Audio.c +++ b/LUFA/Drivers/USB/Class/Device/Audio.c @@ -57,6 +57,13 @@ void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const Audi } break; + case AUDIO_REQ_GetStatus: + if ((USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) || + (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))) + { + Endpoint_ClearSETUP(); + Endpoint_ClearStatusStage(); + } } } diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index f619983ec1..4fe30411e0 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -12,14 +12,16 @@ * - Added USE_LUFA_CONFIG_HEADER compile time option to include a LUFAConfig.h header in the user director for LUFA configuration * tokens as an alternative to tokens defined in the project makefile * - Added new USB_Host_SetInterfaceAltSetting() convenience function for the selection of an interface's alternative setting + * - Added Audio class control request definitions * - Library Applications: + * - Added RNDIS device mode to the Webserver project * - Added new MediaControl project * - Added new incomplete AndroidAccessoryHost Host LowLevel demo - * - Added RNDIS device mode to the Webserver project + * - Added new incomplete AudioInputHost Host LowLevel demo * * Changed: * - Core: - * - None + * - Added support for the Audio class GET STATUS request so that it is correctly ACKed when sent by the host * - Library Applications: * - None * diff --git a/LUFA/ManPages/FutureChanges.txt b/LUFA/ManPages/FutureChanges.txt index 4e16d3afa2..154f86243d 100644 --- a/LUFA/ManPages/FutureChanges.txt +++ b/LUFA/ManPages/FutureChanges.txt @@ -29,11 +29,10 @@ * - Demos/Projects * -# Device/Host USB bridge * -# Alternative (USB-IF endorsed) USB-CDC Ethernet Class - * -# Finish Test and Measurement Class demo - * -# Finish BluetoothHost demo - * -# Finish SideShow demo - * -# Finish StandaloneProgrammer project - * -# Arduino Uno compatible USB-MIDI, USB-HID + * -# Finish incomplete demos and projects + * -# Add class driver support for Audio Host class + * -# Add class driver support for Test and Measurement class + * -# Fix up Audio class support - add support for mixers, etc., add support for GET/SET commands * - Ports * -# Atmel ARM7 series microcontrollers * -# Other (commercial) C compilers diff --git a/Projects/AVRISP-MKII/AVRISP-MKII.c b/Projects/AVRISP-MKII/AVRISP-MKII.c index 654ce54716..d774b11191 100644 --- a/Projects/AVRISP-MKII/AVRISP-MKII.c +++ b/Projects/AVRISP-MKII/AVRISP-MKII.c @@ -45,14 +45,14 @@ int main(void) V2Protocol_Init(); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); - sei(); - + GlobalInterruptEnable(); + for (;;) { #if (BOARD == BOARD_USBTINYMKII) - /* On the USBTINY-MKII target, there is a secondary LED which indicates the current selected power - mode - either VBUS, or sourced from the VTARGET pin of the programming connectors */ - LEDs_ChangeLEDs(LEDMASK_VBUSPOWER, (PIND & (1 << 0)) ? 0 : LEDMASK_VBUSPOWER); + /* On the USBTINY-MKII board target, there is a secondary LED which indicates the current selected + power mode - either VBUS, or sourced from the VTARGET pin of the programming connectors */ + LEDs_ChangeLEDs(LEDS_LED3, (PIND & (1 << 0)) ? 0 : LEDS_LED3); #endif AVRISP_Task(); @@ -63,13 +63,35 @@ int main(void) /** 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); - + #if (ARCH == ARCH_AVR8) + /* Disable watchdog if enabled by bootloader/fuses */ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + /* Disable clock division */ + clock_prescale_set(clock_div_1); + #elif (ARCH == ARCH_UC3) + /* Select slow startup, external high frequency crystal attached to OSC0 */ + AVR32_PM.OSCCTRL0.mode = 7; + AVR32_PM.OSCCTRL0.startup = 6; + AVR32_PM.MCCTRL.osc0en = true; + while (!(AVR32_PM.POSCSR.osc0rdy)); + + /* Switch CPU core to use OSC0 as the system clock */ + AVR32_PM.MCCTRL.mcsel = 1; + + /* Start PLL1 to feed into the USB generic clock module */ + AVR32_PM.PLL[1].pllmul = (F_USB / F_CPU) ? (((F_USB / F_CPU) - 1) / 2) : 0; + AVR32_PM.PLL[1].plldiv = 0; + AVR32_PM.PLL[1].pllosc = 0; + AVR32_PM.PLL[1].pllen = true; + while (!(AVR32_PM.POSCSR.lock1)); + + /* Configure interrupt management peripheral */ +// INTC_Init(); + INTC_RegisterGroupHandler(AVR32_USBB_IRQ, AVR32_INTC_INT0, USB_GEN_vect); + #endif + /* Hardware Initialization */ LEDs_Init(); USB_Init(); diff --git a/Projects/AVRISP-MKII/AVRISP-MKII.h b/Projects/AVRISP-MKII/AVRISP-MKII.h index 2650b4939b..5a0d09111a 100644 --- a/Projects/AVRISP-MKII/AVRISP-MKII.h +++ b/Projects/AVRISP-MKII/AVRISP-MKII.h @@ -37,11 +37,7 @@ #define _AVRISP_H_ /* Includes: */ - #include - #include - #include - #include - + #include #include #include #include @@ -50,6 +46,17 @@ #include #endif + #if (ARCH == ARCH_AVR8) + #include + #include + #include + #include + #elif (ARCH == ARCH_UC3) + #include + + #include // TODO: FIXME + #endif + #include "Descriptors.h" #include "Lib/V2Protocol.h" @@ -69,9 +76,6 @@ /** LED mask for the library LED driver, to indicate that the USB interface is busy. */ #define LEDMASK_BUSY (LEDS_LED1 | LEDS_LED2) - /** LED mask for the library LED driver, to indicate that the target is being powered by VBUS. */ - #define LEDMASK_VBUSPOWER LEDS_LED3 - /* Function Prototypes: */ void SetupHardware(void); void AVRISP_Task(void); diff --git a/Projects/AVRISP-MKII/Descriptors.c b/Projects/AVRISP-MKII/Descriptors.c index a84b75f380..9889820cf3 100644 --- a/Projects/AVRISP-MKII/Descriptors.c +++ b/Projects/AVRISP-MKII/Descriptors.c @@ -53,8 +53,8 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, - .VendorID = 0x03EB, - .ProductID = 0x2104, + .VendorID = CPU_TO_LE16(0x03EB), + .ProductID = CPU_TO_LE16(0x2104), .ReleaseNumber = VERSION_BCD(02.00), .ManufacturerStrIndex = 0x01, @@ -75,7 +75,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = { .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, - .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), + .TotalConfigurationSize = CPU_TO_LE16(sizeof(USB_Descriptor_Configuration_t)), .TotalInterfaces = 1, .ConfigurationNumber = 1, @@ -108,7 +108,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_IN | AVRISP_DATA_IN_EPNUM), .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = AVRISP_DATA_EPSIZE, + .EndpointSize = CPU_TO_LE16(AVRISP_DATA_EPSIZE), .PollingIntervalMS = 0x0A }, @@ -118,7 +118,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_OUT | AVRISP_DATA_OUT_EPNUM), .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = AVRISP_DATA_EPSIZE, + .EndpointSize = CPU_TO_LE16(AVRISP_DATA_EPSIZE), .PollingIntervalMS = 0x0A }, }; @@ -142,7 +142,17 @@ const USB_Descriptor_String_t PROGMEM ManufacturerString = { .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, - .UnicodeString = L"Dean Camera" + .UnicodeString = {CPU_TO_LE16('D'), + CPU_TO_LE16('e'), + CPU_TO_LE16('a'), + CPU_TO_LE16('n'), + CPU_TO_LE16(' '), + CPU_TO_LE16('C'), + CPU_TO_LE16('a'), + CPU_TO_LE16('m'), + CPU_TO_LE16('e'), + CPU_TO_LE16('r'), + CPU_TO_LE16('a')} }; /** Product descriptor string. This is a Unicode string containing the product's details in human readable form, @@ -153,7 +163,28 @@ const USB_Descriptor_String_t PROGMEM ProductString = { .Header = {.Size = USB_STRING_LEN(22), .Type = DTYPE_String}, - .UnicodeString = L"LUFA AVRISP MkII Clone" + .UnicodeString = {CPU_TO_LE16('L'), + CPU_TO_LE16('U'), + CPU_TO_LE16('F'), + CPU_TO_LE16('A'), + CPU_TO_LE16(' '), + CPU_TO_LE16('A'), + CPU_TO_LE16('V'), + CPU_TO_LE16('R'), + CPU_TO_LE16('I'), + CPU_TO_LE16('S'), + CPU_TO_LE16('P'), + CPU_TO_LE16(' '), + CPU_TO_LE16('M'), + CPU_TO_LE16('k'), + CPU_TO_LE16('I'), + CPU_TO_LE16('I'), + CPU_TO_LE16(' '), + CPU_TO_LE16('C'), + CPU_TO_LE16('l'), + CPU_TO_LE16('o'), + CPU_TO_LE16('n'), + CPU_TO_LE16('e')} }; /** Serial number string. This is a Unicode string containing the device's unique serial number, expressed as a @@ -163,7 +194,19 @@ const USB_Descriptor_String_t PROGMEM SerialString = { .Header = {.Size = USB_STRING_LEN(13), .Type = DTYPE_String}, - .UnicodeString = L"0000A00128255" + .UnicodeString = {CPU_TO_LE16('0'), + CPU_TO_LE16('0'), + CPU_TO_LE16('0'), + CPU_TO_LE16('0'), + CPU_TO_LE16('A'), + CPU_TO_LE16('0'), + CPU_TO_LE16('0'), + CPU_TO_LE16('1'), + CPU_TO_LE16('2'), + CPU_TO_LE16('8'), + CPU_TO_LE16('2'), + CPU_TO_LE16('5'), + CPU_TO_LE16('5')} }; /** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" diff --git a/Projects/AVRISP-MKII/Descriptors.h b/Projects/AVRISP-MKII/Descriptors.h index ca68fd5187..c831cffd62 100644 --- a/Projects/AVRISP-MKII/Descriptors.h +++ b/Projects/AVRISP-MKII/Descriptors.h @@ -37,11 +37,18 @@ #define _DESCRIPTORS_H_ /* Includes: */ - #include - + #include #include + #if (ARCH == ARCH_AVR8) + #include + #endif + /* Macros: */ + #if (ARCH == ARCH_UC3) // TODO: FIXME + #define PROGMEM const + #endif + #if !defined(LIBUSB_DRIVER_COMPAT) /** Endpoint number of the AVRISP data OUT endpoint. */ #define AVRISP_DATA_OUT_EPNUM 2 @@ -70,7 +77,7 @@ USB_Descriptor_Interface_t AVRISP_Interface; USB_Descriptor_Endpoint_t AVRISP_DataInEndpoint; USB_Descriptor_Endpoint_t AVRISP_DataOutEndpoint; - } USB_Descriptor_Configuration_t; + } ATTR_PACKED USB_Descriptor_Configuration_t; /* Function Prototypes: */ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, diff --git a/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c b/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c index ccd31f3d28..2e31c1819a 100644 --- a/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c +++ b/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c @@ -52,7 +52,7 @@ void ISPProtocol_EnterISPMode(void) uint8_t PollValue; uint8_t PollIndex; uint8_t EnterProgBytes[4]; - } Enter_ISP_Params; + } ATTR_PACKED Enter_ISP_Params; Endpoint_Read_Stream_LE(&Enter_ISP_Params, sizeof(Enter_ISP_Params), NULL); @@ -107,7 +107,7 @@ void ISPProtocol_LeaveISPMode(void) { uint8_t PreDelayMS; uint8_t PostDelayMS; - } Leave_ISP_Params; + } ATTR_PACKED Leave_ISP_Params; Endpoint_Read_Stream_LE(&Leave_ISP_Params, sizeof(Leave_ISP_Params), NULL); @@ -141,12 +141,12 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command) uint8_t ProgrammingCommands[3]; uint8_t PollValue1; uint8_t PollValue2; - uint8_t ProgData[256]; // Note, the Jungo driver has a very short ACK timeout period, need to buffer the - } Write_Memory_Params; // whole page and ACK the packet as fast as possible to prevent it from aborting + uint8_t ProgData[256]; // Note, the Jungo driver has a very short ACK timeout period, need to buffer the + } ATTR_PACKED Write_Memory_Params; // whole page and ACK the packet as fast as possible to prevent it from aborting Endpoint_Read_Stream_LE(&Write_Memory_Params, (sizeof(Write_Memory_Params) - sizeof(Write_Memory_Params.ProgData)), NULL); - Write_Memory_Params.BytesToWrite = SwapEndian_16(Write_Memory_Params.BytesToWrite); + Write_Memory_Params.BytesToWrite = be16_to_cpu(Write_Memory_Params.BytesToWrite); if (Write_Memory_Params.BytesToWrite > sizeof(Write_Memory_Params.ProgData)) { @@ -286,10 +286,10 @@ void ISPProtocol_ReadMemory(uint8_t V2Command) { uint16_t BytesToRead; uint8_t ReadMemoryCommand; - } Read_Memory_Params; + } ATTR_PACKED Read_Memory_Params; Endpoint_Read_Stream_LE(&Read_Memory_Params, sizeof(Read_Memory_Params), NULL); - Read_Memory_Params.BytesToRead = SwapEndian_16(Read_Memory_Params.BytesToRead); + Read_Memory_Params.BytesToRead = be16_to_cpu(Read_Memory_Params.BytesToRead); Endpoint_ClearOUT(); Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM); @@ -360,7 +360,7 @@ void ISPProtocol_ChipErase(void) uint8_t EraseDelayMS; uint8_t PollMethod; uint8_t EraseCommandBytes[4]; - } Erase_Chip_Params; + } ATTR_PACKED Erase_Chip_Params; Endpoint_Read_Stream_LE(&Erase_Chip_Params, sizeof(Erase_Chip_Params), NULL); @@ -396,7 +396,7 @@ void ISPProtocol_ReadFuseLockSigOSCCAL(uint8_t V2Command) { uint8_t RetByte; uint8_t ReadCommandBytes[4]; - } Read_FuseLockSigOSCCAL_Params; + } ATTR_PACKED Read_FuseLockSigOSCCAL_Params; Endpoint_Read_Stream_LE(&Read_FuseLockSigOSCCAL_Params, sizeof(Read_FuseLockSigOSCCAL_Params), NULL); @@ -427,7 +427,7 @@ void ISPProtocol_WriteFuseLock(uint8_t V2Command) struct { uint8_t WriteCommandBytes[4]; - } Write_FuseLockSig_Params; + } ATTR_PACKED Write_FuseLockSig_Params; Endpoint_Read_Stream_LE(&Write_FuseLockSig_Params, sizeof(Write_FuseLockSig_Params), NULL); @@ -454,7 +454,7 @@ void ISPProtocol_SPIMulti(void) uint8_t RxBytes; uint8_t RxStartAddr; uint8_t TxData[255]; - } SPI_Multi_Params; + } ATTR_PACKED SPI_Multi_Params; Endpoint_Read_Stream_LE(&SPI_Multi_Params, (sizeof(SPI_Multi_Params) - sizeof(SPI_Multi_Params.TxData)), NULL); Endpoint_Read_Stream_LE(&SPI_Multi_Params.TxData, SPI_Multi_Params.TxBytes, NULL); diff --git a/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.h b/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.h index 213ce5ce69..8b08619711 100644 --- a/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.h +++ b/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.h @@ -37,10 +37,14 @@ #define _ISP_PROTOCOL_ /* Includes: */ - #include - #include - + #include #include + + #if (ARCH == ARCH_AVR8) + #include + #elif (ARCH == ARCH_UC3) + #include + #endif #include "../V2Protocol.h" diff --git a/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.h b/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.h index 057aa7ad17..e183dee0f9 100644 --- a/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.h +++ b/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.h @@ -37,12 +37,19 @@ #define _ISP_TARGET_ /* Includes: */ - #include - #include - #include - + #include #include - #include + + #if defined(ENABLE_ISP_PROTOCOL) || defined(__DOXYGEN__) + #include // TODO: FIXME + #endif + + #if (ARCH == ARCH_AVR8) + #include + #include + #elif (ARCH == ARCH_UC3) + #include + #endif #include "../V2ProtocolParams.h" @@ -84,6 +91,7 @@ const uint8_t ReadMemCommand); /* Inline Functions: */ + #if defined(ENABLE_ISP_PROTOCOL) || defined(__DOXYGEN__) /** Sends a byte of ISP data to the attached target, using the appropriate SPI hardware or * software routines depending on the selected ISP speed. * @@ -124,6 +132,7 @@ else return ISPTarget_TransferSoftSPIByte(Byte); } + #endif #endif diff --git a/Projects/AVRISP-MKII/Lib/V2Protocol.c b/Projects/AVRISP-MKII/Lib/V2Protocol.c index f763d6333b..a955a95a8e 100644 --- a/Projects/AVRISP-MKII/Lib/V2Protocol.c +++ b/Projects/AVRISP-MKII/Lib/V2Protocol.c @@ -42,13 +42,17 @@ uint32_t CurrentAddress; /** Flag to indicate that the next read/write operation must update the device's current extended FLASH address */ bool MustLoadExtendedAddress; +/** Command timeout expiration flag. */ +volatile bool TimeoutExpired; +#if (ARCH == ARCH_AVR8) // TODO: FIXME /** ISR to manage timeouts whilst processing a V2Protocol command */ ISR(WDT_vect, ISR_BLOCK) { TimeoutExpired = true; wdt_disable(); } +#endif /** Initialises the hardware and software associated with the V2 protocol command handling. */ void V2Protocol_Init(void) @@ -75,10 +79,12 @@ void V2Protocol_ProcessCommand(void) { uint8_t V2Command = Endpoint_Read_8(); + #if (ARCH == ARCH_AVR8) // TODO: FIXME /* Start the watchdog with timeout interrupt enabled to manage the timeout */ TimeoutExpired = false; wdt_enable(WDTO_1S); WDTCSR |= (1 << WDIE); + #endif switch (V2Command) { @@ -140,8 +146,10 @@ void V2Protocol_ProcessCommand(void) break; } + #if (ARCH == ARCH_AVR8) // TODO: FIXME /* Disable the timeout management watchdog timer */ wdt_disable(); + #endif Endpoint_WaitUntilReady(); Endpoint_SelectEndpoint(AVRISP_DATA_OUT_EPNUM); diff --git a/Projects/AVRISP-MKII/Lib/V2Protocol.h b/Projects/AVRISP-MKII/Lib/V2Protocol.h index 8e9e6ff38f..c2f0ee072a 100644 --- a/Projects/AVRISP-MKII/Lib/V2Protocol.h +++ b/Projects/AVRISP-MKII/Lib/V2Protocol.h @@ -37,12 +37,17 @@ #define _V2_PROTOCOL_ /* Includes: */ - #include - #include - #include - + #include #include + #if (ARCH == ARCH_AVR8) + #include + #include + #include + #elif (ARCH == ARCH_UC3) + #include + #endif + #include "../Descriptors.h" #include "V2ProtocolConstants.h" #include "V2ProtocolParams.h" @@ -69,15 +74,13 @@ /** Timeout period for each issued command from the host before it is aborted (in 10ms ticks). */ #define COMMAND_TIMEOUT_TICKS 100 - /** Command timeout expiration flag, GPIOR for speed. */ - #define TimeoutExpired GPIOR1 - /** MUX mask for the VTARGET ADC channel number. */ #define VTARGET_ADC_CHANNEL_MASK ADC_GET_CHANNEL_MASK(VTARGET_ADC_CHANNEL) /* External Variables: */ - extern uint32_t CurrentAddress; - extern bool MustLoadExtendedAddress; + extern uint32_t CurrentAddress; + extern bool MustLoadExtendedAddress; + extern volatile bool TimeoutExpired; /* Function Prototypes: */ void V2Protocol_Init(void); diff --git a/Projects/AVRISP-MKII/Lib/V2ProtocolConstants.h b/Projects/AVRISP-MKII/Lib/V2ProtocolConstants.h index 716e5fadbd..f4fad5effd 100644 --- a/Projects/AVRISP-MKII/Lib/V2ProtocolConstants.h +++ b/Projects/AVRISP-MKII/Lib/V2ProtocolConstants.h @@ -73,6 +73,7 @@ #define STATUS_CONN_FAIL_SCK 0x04 #define STATUS_TGT_NOT_DETECTED 0x10 #define STATUS_TGT_REVERSE_INSERTED 0x20 + #define STATUS_ANSWER_CKSUM_ERROR 0xB0 #define PARAM_BUILD_NUMBER_LOW 0x80 #define PARAM_BUILD_NUMBER_HIGH 0x81 diff --git a/Projects/AVRISP-MKII/Lib/V2ProtocolParams.c b/Projects/AVRISP-MKII/Lib/V2ProtocolParams.c index 3c1a88130a..6342d75b34 100644 --- a/Projects/AVRISP-MKII/Lib/V2ProtocolParams.c +++ b/Projects/AVRISP-MKII/Lib/V2ProtocolParams.c @@ -37,7 +37,7 @@ #include "V2ProtocolParams.h" /* Non-Volatile Parameter Values for EEPROM storage */ -static uint8_t EEMEM EEPROM_Rest_Polarity = 0x00; +static uint8_t EEMEM EEPROM_Reset_Polarity = 0x00; /* Volatile Parameter Values for RAM storage */ static ParameterItem_t ParameterTable[] = @@ -88,7 +88,7 @@ static ParameterItem_t ParameterTable[] = void V2Params_LoadNonVolatileParamValues(void) { /* Target RESET line polarity is a non-volatile value, retrieve current parameter value from EEPROM */ - V2Params_GetParamFromTable(PARAM_RESET_POLARITY)->ParamValue = eeprom_read_byte(&EEPROM_Rest_Polarity); + V2Params_GetParamFromTable(PARAM_RESET_POLARITY)->ParamValue = eeprom_read_byte(&EEPROM_Reset_Polarity); } /** Updates any parameter values that are sourced from hardware rather than explicitly set by the host, such as @@ -163,7 +163,7 @@ void V2Params_SetParameterValue(const uint8_t ParamID, /* The target RESET line polarity is a non-volatile parameter, save to EEPROM when changed */ if (ParamID == PARAM_RESET_POLARITY) - eeprom_update_byte(&EEPROM_Rest_Polarity, Value); + eeprom_update_byte(&EEPROM_Reset_Polarity, Value); } /** Retrieves a parameter entry (including ID, value and privileges) from the parameter table that matches the given diff --git a/Projects/AVRISP-MKII/Lib/V2ProtocolParams.h b/Projects/AVRISP-MKII/Lib/V2ProtocolParams.h index f4479d308a..4ef091ce77 100644 --- a/Projects/AVRISP-MKII/Lib/V2ProtocolParams.h +++ b/Projects/AVRISP-MKII/Lib/V2ProtocolParams.h @@ -37,15 +37,20 @@ #define _V2_PROTOCOL_PARAMS_ /* Includes: */ - #include - #include - + #include #include #if defined(ADC) #include #endif + #if (ARCH == ARCH_AVR8) + #include + #include + #elif (ARCH == ARCH_UC3) + #include + #endif + #include "V2Protocol.h" #include "V2ProtocolConstants.h" #include "ISP/ISPTarget.h" @@ -59,6 +64,12 @@ /** Total number of parameters in the parameter table */ #define TABLE_PARAM_COUNT (sizeof(ParameterTable) / sizeof(ParameterTable[0])) + + #if (ARCH == ARCH_UC3) // TODO: FIXME + #define EEMEM + #define eeprom_read_byte(x) *x + #define eeprom_update_byte(x,y) *x=y + #endif /* Type Defines: */ /** Type define for a parameter table entry indicating a PC readable or writable device parameter. */ diff --git a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.h b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.h index b2b37e9164..0893415929 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.h +++ b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.h @@ -37,12 +37,17 @@ #define _TINY_NVM_ /* Includes: */ - #include - #include - #include - #include + #if (ARCH == ARCH_AVR8) + #include + #include + #elif (ARCH == ARCH_UC3) + #include + #endif + + #include + #include "XPROGProtocol.h" #include "XPROGTarget.h" diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.h b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.h index 48fa8eb96a..11f79326b2 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.h +++ b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.h @@ -37,12 +37,17 @@ #define _XMEGA_NVM_ /* Includes: */ - #include - #include - #include - #include + #if (ARCH == ARCH_AVR8) + #include + #include + #elif (ARCH == ARCH_UC3) + #include + #endif + + #include + #include "XPROGProtocol.h" #include "XPROGTarget.h" diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c index 72cc536363..778a7df9bd 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c @@ -60,7 +60,7 @@ void XPROGProtocol_SetMode(void) struct { uint8_t Protocol; - } SetMode_XPROG_Params; + } ATTR_PACKED SetMode_XPROG_Params; Endpoint_Read_Stream_LE(&SetMode_XPROG_Params, sizeof(SetMode_XPROG_Params), NULL); @@ -163,10 +163,10 @@ static void XPROGProtocol_Erase(void) { uint8_t MemoryType; uint32_t Address; - } Erase_XPROG_Params; + } ATTR_PACKED Erase_XPROG_Params; Endpoint_Read_Stream_LE(&Erase_XPROG_Params, sizeof(Erase_XPROG_Params), NULL); - Erase_XPROG_Params.Address = SwapEndian_32(Erase_XPROG_Params.Address); + Erase_XPROG_Params.Address = be32_to_cpu(Erase_XPROG_Params.Address); Endpoint_ClearOUT(); Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM); @@ -242,12 +242,12 @@ static void XPROGProtocol_WriteMemory(void) uint32_t Address; uint16_t Length; uint8_t ProgData[256]; - } WriteMemory_XPROG_Params; + } ATTR_PACKED WriteMemory_XPROG_Params; Endpoint_Read_Stream_LE(&WriteMemory_XPROG_Params, (sizeof(WriteMemory_XPROG_Params) - sizeof(WriteMemory_XPROG_Params).ProgData), NULL); - WriteMemory_XPROG_Params.Address = SwapEndian_32(WriteMemory_XPROG_Params.Address); - WriteMemory_XPROG_Params.Length = SwapEndian_16(WriteMemory_XPROG_Params.Length); + WriteMemory_XPROG_Params.Address = be32_to_cpu(WriteMemory_XPROG_Params.Address); + WriteMemory_XPROG_Params.Length = be16_to_cpu(WriteMemory_XPROG_Params.Length); Endpoint_Read_Stream_LE(&WriteMemory_XPROG_Params.ProgData, WriteMemory_XPROG_Params.Length, NULL); // The driver will terminate transfers that are a round multiple of the endpoint bank in size with a ZLP, need @@ -335,11 +335,11 @@ static void XPROGProtocol_ReadMemory(void) uint8_t MemoryType; uint32_t Address; uint16_t Length; - } ReadMemory_XPROG_Params; + } ATTR_PACKED ReadMemory_XPROG_Params; Endpoint_Read_Stream_LE(&ReadMemory_XPROG_Params, sizeof(ReadMemory_XPROG_Params), NULL); - ReadMemory_XPROG_Params.Address = SwapEndian_32(ReadMemory_XPROG_Params.Address); - ReadMemory_XPROG_Params.Length = SwapEndian_16(ReadMemory_XPROG_Params.Length); + ReadMemory_XPROG_Params.Address = be32_to_cpu(ReadMemory_XPROG_Params.Address); + ReadMemory_XPROG_Params.Length = be16_to_cpu(ReadMemory_XPROG_Params.Length); Endpoint_ClearOUT(); Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM); @@ -380,7 +380,7 @@ static void XPROGProtocol_ReadCRC(void) struct { uint8_t CRCType; - } ReadCRC_XPROG_Params; + } ATTR_PACKED ReadCRC_XPROG_Params; Endpoint_Read_Stream_LE(&ReadCRC_XPROG_Params, sizeof(ReadCRC_XPROG_Params), NULL); diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.h b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.h index d637c79ea9..9c7986e55e 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.h +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.h @@ -37,12 +37,18 @@ #define _XPROG_PROTOCOL_ /* Includes: */ - #include - #include - #include - + #include #include + #if (ARCH == ARCH_AVR8) + #include + #elif (ARCH == ARCH_UC3) + #include + #endif + + #include + #include + #include "../V2Protocol.h" #include "XMEGANVM.h" #include "TINYNVM.h" diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c index 0a2dee73b3..70e49f7c67 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c @@ -46,18 +46,22 @@ void XPROGTarget_EnableTargetPDI(void) { IsSending = false; - /* Set Tx and XCK as outputs, Rx as input */ - DDRD |= (1 << 5) | (1 << 3); - DDRD &= ~(1 << 2); - - /* Set DATA line high for at least 90ns to disable /RESET functionality */ - PORTD |= (1 << 3); - _delay_us(1); - - /* Set up the synchronous USART for XMEGA communications - 8 data bits, even parity, 2 stop bits */ - UBRR1 = ((F_CPU / 2 / XPROG_HARDWARE_SPEED) - 1); - UCSR1B = (1 << TXEN1); - UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); + #if (ARCH == ARCH_AVR8) + /* Set Tx and XCK as outputs, Rx as input */ + DDRD |= (1 << 5) | (1 << 3); + DDRD &= ~(1 << 2); + + /* Set DATA line high for at least 90ns to disable /RESET functionality */ + PORTD |= (1 << 3); + Delay_MS(1); + + /* Set up the synchronous USART for XMEGA communications - 8 data bits, even parity, 2 stop bits */ + UBRR1 = ((F_CPU / 2 / XPROG_HARDWARE_SPEED) - 1); + UCSR1B = (1 << TXEN1); + UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); + #elif (ARCH == ARCH_UC3) + // TODO: FIXME + #endif /* Send two IDLEs of 12 bits each to enable PDI interface (need at least 16 idle bits) */ XPROGTarget_SendIdle(); @@ -69,19 +73,23 @@ void XPROGTarget_EnableTargetTPI(void) { IsSending = false; - /* Set /RESET line low for at least 400ns to enable TPI functionality */ - AUX_LINE_DDR |= AUX_LINE_MASK; - AUX_LINE_PORT &= ~AUX_LINE_MASK; - _delay_us(1); + #if (ARCH == ARCH_AVR8) + /* Set /RESET line low for at least 400ns to enable TPI functionality */ + AUX_LINE_DDR |= AUX_LINE_MASK; + AUX_LINE_PORT &= ~AUX_LINE_MASK; + Delay_MS(1); - /* Set Tx and XCK as outputs, Rx as input */ - DDRD |= (1 << 5) | (1 << 3); - DDRD &= ~(1 << 2); + /* Set Tx and XCK as outputs, Rx as input */ + DDRD |= (1 << 5) | (1 << 3); + DDRD &= ~(1 << 2); - /* Set up the synchronous USART for TINY communications - 8 data bits, even parity, 2 stop bits */ - UBRR1 = ((F_CPU / 2 / XPROG_HARDWARE_SPEED) - 1); - UCSR1B = (1 << TXEN1); - UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); + /* Set up the synchronous USART for TINY communications - 8 data bits, even parity, 2 stop bits */ + UBRR1 = ((F_CPU / 2 / XPROG_HARDWARE_SPEED) - 1); + UCSR1B = (1 << TXEN1); + UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); + #elif (ARCH == ARCH_UC3) + // TODO: FIXME + #endif /* Send two IDLEs of 12 bits each to enable TPI interface (need at least 16 idle bits) */ XPROGTarget_SendIdle(); @@ -94,14 +102,18 @@ void XPROGTarget_DisableTargetPDI(void) /* Switch to Rx mode to ensure that all pending transmissions are complete */ XPROGTarget_SetRxMode(); - /* Turn off receiver and transmitter of the USART, clear settings */ - UCSR1A = ((1 << TXC1) | (1 << RXC1)); - UCSR1B = 0; - UCSR1C = 0; - - /* Tristate all pins */ - DDRD &= ~((1 << 5) | (1 << 3)); - PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2)); + #if (ARCH == ARCH_AVR8) + /* Turn off receiver and transmitter of the USART, clear settings */ + UCSR1A = ((1 << TXC1) | (1 << RXC1)); + UCSR1B = 0; + UCSR1C = 0; + + /* Tristate all pins */ + DDRD &= ~((1 << 5) | (1 << 3)); + PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2)); + #elif (ARCH == ARCH_UC3) + // TODO: FIXME + #endif } /** Disables the target's TPI interface, exits programming mode and starts the target's application. */ @@ -110,18 +122,22 @@ void XPROGTarget_DisableTargetTPI(void) /* Switch to Rx mode to ensure that all pending transmissions are complete */ XPROGTarget_SetRxMode(); - /* Turn off receiver and transmitter of the USART, clear settings */ - UCSR1A |= (1 << TXC1) | (1 << RXC1); - UCSR1B = 0; - UCSR1C = 0; - - /* Set all USART lines as inputs, tristate */ - DDRD &= ~((1 << 5) | (1 << 3)); - PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2)); - - /* Tristate target /RESET line */ - AUX_LINE_DDR &= ~AUX_LINE_MASK; - AUX_LINE_PORT &= ~AUX_LINE_MASK; + #if (ARCH == ARCH_AVR8) + /* Turn off receiver and transmitter of the USART, clear settings */ + UCSR1A |= (1 << TXC1) | (1 << RXC1); + UCSR1B = 0; + UCSR1C = 0; + + /* Set all USART lines as inputs, tristate */ + DDRD &= ~((1 << 5) | (1 << 3)); + PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2)); + + /* Tristate target /RESET line */ + AUX_LINE_DDR &= ~AUX_LINE_MASK; + AUX_LINE_PORT &= ~AUX_LINE_MASK; + #elif (ARCH == ARCH_UC3) + // TODO: FIXME + #endif } /** Sends a byte via the USART. @@ -134,10 +150,14 @@ void XPROGTarget_SendByte(const uint8_t Byte) if (!(IsSending)) XPROGTarget_SetTxMode(); - /* Wait until there is space in the hardware Tx buffer before writing */ - while (!(UCSR1A & (1 << UDRE1))); - UCSR1A |= (1 << TXC1); - UDR1 = Byte; + #if (ARCH == ARCH_AVR8) + /* Wait until there is space in the hardware Tx buffer before writing */ + while (!(UCSR1A & (1 << UDRE1))); + UCSR1A |= (1 << TXC1); + UDR1 = Byte; + #elif (ARCH == ARCH_UC3) + // TODO: FIXME + #endif } /** Receives a byte via the software USART, blocking until data is received. @@ -150,10 +170,15 @@ uint8_t XPROGTarget_ReceiveByte(void) if (IsSending) XPROGTarget_SetRxMode(); - /* Wait until a byte has been received before reading */ - while (!(UCSR1A & (1 << RXC1)) && !(TimeoutExpired)); + #if (ARCH == ARCH_AVR8) + /* Wait until a byte has been received before reading */ + while (!(UCSR1A & (1 << RXC1)) && !(TimeoutExpired)); - return UDR1; + return UDR1; + #elif (ARCH == ARCH_UC3) + // TODO: FIXME + return 0; + #endif } /** Sends an IDLE via the USART to the attached target, consisting of a full frame of idle bits. */ @@ -163,40 +188,52 @@ void XPROGTarget_SendIdle(void) if (!(IsSending)) XPROGTarget_SetTxMode(); - /* Need to do nothing for a full frame to send an IDLE */ - for (uint8_t i = 0; i < BITS_IN_USART_FRAME; i++) - { - /* Wait for a full cycle of the clock */ - while (PIND & (1 << 5)); - while (!(PIND & (1 << 5))); - } + #if (ARCH == ARCH_AVR8) + /* Need to do nothing for a full frame to send an IDLE */ + for (uint8_t i = 0; i < BITS_IN_USART_FRAME; i++) + { + /* Wait for a full cycle of the clock */ + while (PIND & (1 << 5)); + while (!(PIND & (1 << 5))); + } + #elif (ARCH == ARCH_UC3) + // TODO: FIXME + #endif } static void XPROGTarget_SetTxMode(void) { - /* Wait for a full cycle of the clock */ - while (PIND & (1 << 5)); - while (!(PIND & (1 << 5))); + #if (ARCH == ARCH_AVR8) + /* Wait for a full cycle of the clock */ + while (PIND & (1 << 5)); + while (!(PIND & (1 << 5))); - PORTD |= (1 << 3); - DDRD |= (1 << 3); + PORTD |= (1 << 3); + DDRD |= (1 << 3); - UCSR1B &= ~(1 << RXEN1); - UCSR1B |= (1 << TXEN1); + UCSR1B &= ~(1 << RXEN1); + UCSR1B |= (1 << TXEN1); + #elif (ARCH == ARCH_UC3) + // TODO: FIXME + #endif IsSending = true; } static void XPROGTarget_SetRxMode(void) { - while (!(UCSR1A & (1 << TXC1))); - UCSR1A |= (1 << TXC1); - - UCSR1B &= ~(1 << TXEN1); - UCSR1B |= (1 << RXEN1); - - DDRD &= ~(1 << 3); - PORTD &= ~(1 << 3); + #if (ARCH == ARCH_AVR8) + while (!(UCSR1A & (1 << TXC1))); + UCSR1A |= (1 << TXC1); + + UCSR1B &= ~(1 << TXEN1); + UCSR1B |= (1 << RXEN1); + + DDRD &= ~(1 << 3); + PORTD &= ~(1 << 3); + #elif (ARCH == ARCH_UC3) + // TODO: FIXME + #endif IsSending = false; } diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h index ebc563933f..e2194b3fe5 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h @@ -37,12 +37,15 @@ #define _XPROG_TARGET_ /* Includes: */ - #include - #include - #include - #include + #if (ARCH == ARCH_AVR8) + #include + #include + #elif (ARCH == ARCH_UC3) + #include + #endif + #include "../V2Protocol.h" #include "XPROGProtocol.h" diff --git a/Projects/AVRISP-MKII/makefile b/Projects/AVRISP-MKII/makefile index de1e225dac..d9129237eb 100644 --- a/Projects/AVRISP-MKII/makefile +++ b/Projects/AVRISP-MKII/makefile @@ -174,7 +174,7 @@ CPPSRC = # Even though the DOS/Win* filesystem matches both .s and .S the same, # it will preserve the spelling of the filenames, and gcc itself does # care about how the name is spelled on its command-line. -ASRC = +ASRC = # Optimization level, can be [0, 1, 2, 3, s].