From 0c0436f47c296513dace43d3ba20e3cc36f8f527 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sun, 25 Mar 2012 17:46:26 +0200 Subject: Board, rev A. --- firmware/LUFA/Drivers/USB/Class/Device/Audio.c | 98 ++ firmware/LUFA/Drivers/USB/Class/Device/Audio.h | 336 +++++ firmware/LUFA/Drivers/USB/Class/Device/Audio.lst | 184 +++ firmware/LUFA/Drivers/USB/Class/Device/Audio.o | Bin 0 -> 7724 bytes firmware/LUFA/Drivers/USB/Class/Device/CDC.c | 332 +++++ firmware/LUFA/Drivers/USB/Class/Device/CDC.h | 342 +++++ firmware/LUFA/Drivers/USB/Class/Device/CDC.lst | 1059 ++++++++++++++ firmware/LUFA/Drivers/USB/Class/Device/CDC.o | Bin 0 -> 25224 bytes firmware/LUFA/Drivers/USB/Class/Device/HID.c | 190 +++ firmware/LUFA/Drivers/USB/Class/Device/HID.h | 222 +++ firmware/LUFA/Drivers/USB/Class/Device/HID.lst | 769 ++++++++++ firmware/LUFA/Drivers/USB/Class/Device/HID.o | Bin 0 -> 13920 bytes firmware/LUFA/Drivers/USB/Class/Device/MIDI.c | 148 ++ firmware/LUFA/Drivers/USB/Class/Device/MIDI.h | 189 +++ firmware/LUFA/Drivers/USB/Class/Device/MIDI.lst | 346 +++++ firmware/LUFA/Drivers/USB/Class/Device/MIDI.o | Bin 0 -> 12248 bytes .../LUFA/Drivers/USB/Class/Device/MassStorage.c | 247 ++++ .../LUFA/Drivers/USB/Class/Device/MassStorage.h | 177 +++ .../LUFA/Drivers/USB/Class/Device/MassStorage.lst | 643 +++++++++ .../LUFA/Drivers/USB/Class/Device/MassStorage.o | Bin 0 -> 15196 bytes firmware/LUFA/Drivers/USB/Class/Device/RNDIS.c | 496 +++++++ firmware/LUFA/Drivers/USB/Class/Device/RNDIS.h | 186 +++ firmware/LUFA/Drivers/USB/Class/Device/RNDIS.lst | 1519 ++++++++++++++++++++ firmware/LUFA/Drivers/USB/Class/Device/RNDIS.o | Bin 0 -> 23344 bytes 24 files changed, 7483 insertions(+) create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/Audio.c create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/Audio.h create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/Audio.lst create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/Audio.o create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/CDC.c create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/CDC.h create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/CDC.lst create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/CDC.o create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/HID.c create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/HID.h create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/HID.lst create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/HID.o create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/MIDI.c create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/MIDI.h create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/MIDI.lst create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/MIDI.o create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/MassStorage.c create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/MassStorage.h create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/MassStorage.lst create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/MassStorage.o create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/RNDIS.c create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/RNDIS.h create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/RNDIS.lst create mode 100644 firmware/LUFA/Drivers/USB/Class/Device/RNDIS.o (limited to 'firmware/LUFA/Drivers/USB/Class/Device') diff --git a/firmware/LUFA/Drivers/USB/Class/Device/Audio.c b/firmware/LUFA/Drivers/USB/Class/Device/Audio.c new file mode 100644 index 0000000..cc847e5 --- /dev/null +++ b/firmware/LUFA/Drivers/USB/Class/Device/Audio.c @@ -0,0 +1,98 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2010 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. +*/ + +#define __INCLUDE_FROM_USB_DRIVER +#include "../../HighLevel/USBMode.h" +#if defined(USB_CAN_BE_DEVICE) + +#define __INCLUDE_FROM_AUDIO_DRIVER +#define __INCLUDE_FROM_AUDIO_DEVICE_C +#include "Audio.h" + +void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) +{ + if (!(Endpoint_IsSETUPReceived())) + return; + + if (USB_ControlRequest.wIndex != AudioInterfaceInfo->Config.StreamingInterfaceNumber) + return; + + switch (USB_ControlRequest.bRequest) + { + case REQ_SetInterface: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + Endpoint_ClearStatusStage(); + + AudioInterfaceInfo->State.InterfaceEnabled = ((USB_ControlRequest.wValue & 0xFF) != 0); + } + + break; + } +} + +bool Audio_Device_ConfigureEndpoints(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) +{ + memset(&AudioInterfaceInfo->State, 0x00, sizeof(AudioInterfaceInfo->State)); + + for (uint8_t EndpointNum = 1; EndpointNum < ENDPOINT_TOTAL_ENDPOINTS; EndpointNum++) + { + uint16_t Size; + uint8_t Type; + uint8_t Direction; + + if (EndpointNum == AudioInterfaceInfo->Config.DataINEndpointNumber) + { + Size = AudioInterfaceInfo->Config.DataINEndpointSize; + Direction = ENDPOINT_DIR_IN; + Type = EP_TYPE_ISOCHRONOUS; + } + else if (EndpointNum == AudioInterfaceInfo->Config.DataOUTEndpointNumber) + { + Size = AudioInterfaceInfo->Config.DataOUTEndpointSize; + Direction = ENDPOINT_DIR_OUT; + Type = EP_TYPE_ISOCHRONOUS; + } + else + { + continue; + } + + if (!(Endpoint_ConfigureEndpoint(EndpointNum, Type, Direction, Size, ENDPOINT_BANK_DOUBLE))) + { + return false; + } + } + + return true; +} + +#endif diff --git a/firmware/LUFA/Drivers/USB/Class/Device/Audio.h b/firmware/LUFA/Drivers/USB/Class/Device/Audio.h new file mode 100644 index 0000000..5ba688a --- /dev/null +++ b/firmware/LUFA/Drivers/USB/Class/Device/Audio.h @@ -0,0 +1,336 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief Device mode driver for the library USB Audio 1.0 Class driver. + * + * Device mode driver for the library USB Audio 1.0 Class driver. + * + * \note This file should not be included directly. It is automatically included as needed by the USB module driver + * dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassAudio + * @defgroup Group_USBClassAudioDevice Audio Class Device Mode Driver + * + * \section Sec_Dependencies Module Source Dependencies + * The following files must be built with any user project that uses this module: + * - LUFA/Drivers/USB/Class/Device/Audio.c (Makefile source module name: LUFA_SRC_USBCLASS) + * + * \section Module Description + * Device Mode USB Class driver framework interface, for the Audio 1.0 USB Class driver. + * + * @{ + */ + +#ifndef _AUDIO_CLASS_DEVICE_H_ +#define _AUDIO_CLASS_DEVICE_H_ + + /* Includes: */ + #include "../../USB.h" + #include "../Common/Audio.h" + + #include + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(__INCLUDE_FROM_AUDIO_DRIVER) + #error Do not include this file directly. Include LUFA/Drivers/USB.h instead. + #endif + + #if defined(__INCLUDE_FROM_AUDIO_DEVICE_C) && defined(NO_STREAM_CALLBACKS) + #error The NO_STREAM_CALLBACKS compile time option cannot be used in projects using the library Class drivers. + #endif + + /* Public Interface - May be used in end-application: */ + /* Type Defines: */ + /** \brief Audio Class Device Mode Configuration and State Structure. + * + * Class state structure. An instance of this structure should be made for each Audio interface + * within the user application, and passed to each of the Audio class driver functions as the + * AudioInterfaceInfo parameter. This stores each Audio interface's configuration and state information. + */ + typedef struct + { + const struct + { + uint8_t StreamingInterfaceNumber; /**< Index of the Audio Streaming interface within the device this + * structure controls. + */ + + uint8_t DataINEndpointNumber; /**< Endpoint number of the incoming Audio Streaming data, if available + * (zero if unused). + */ + uint16_t DataINEndpointSize; /**< Size in bytes of the incoming Audio Streaming data endpoint, if available + * (zero if unused). + */ + + uint8_t DataOUTEndpointNumber; /**< Endpoint number of the outgoing Audio Streaming data, if available + * (zero if unused). + */ + uint16_t DataOUTEndpointSize; /**< Size in bytes of the outgoing Audio Streaming data endpoint, if available + * (zero if unused). + */ + } Config; /**< Config data for the USB class interface within the device. All elements in this section + * must be set or the interface will fail to enumerate and operate correctly. + */ + struct + { + bool InterfaceEnabled; /**< Set and cleared by the class driver to indicate if the host has enabled the streaming endpoints + * of the Audio Streaming interface. + */ + } State; /**< State data for the USB class interface within the device. All elements in this section + * are reset to their defaults when the interface is enumerated. + */ + } USB_ClassInfo_Audio_Device_t; + + /* Function Prototypes: */ + /** Configures the endpoints of a given Audio interface, ready for use. This should be linked to the library + * \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration containing the + * given Audio interface is selected. + * + * \note The endpoint index numbers as given in the interface's configuration structure must not overlap with any other + * interface, or endpoint bank corruption will occur. Gaps in the allocated endpoint numbers or non-sequential indexes + * within a single interface is allowed, but no two interfaces of any type have have interleaved endpoint indexes. + * + * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. + * + * \return Boolean true if the endpoints were successfully configured, false otherwise. + */ + bool Audio_Device_ConfigureEndpoints(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** Processes incoming control requests from the host, that are directed to the given Audio class interface. This should be + * linked to the library \ref EVENT_USB_Device_ControlRequest() event. + * + * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. + */ + void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /* Inline Functions: */ + /** General management task for a given Audio class interface, required for the correct operation of the interface. This should + * be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). + * + * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. + */ + static inline void Audio_Device_USBTask(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) + ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; + static inline void Audio_Device_USBTask(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) + { + (void)AudioInterfaceInfo; + } + + /** Determines if the given audio interface is ready for a sample to be read from it, and selects the streaming + * OUT endpoint ready for reading. + * + * \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or + * the call will fail. + * + * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. + * + * \return Boolean true if the given Audio interface has a sample to be read, false otherwise. + */ + static inline bool Audio_Device_IsSampleReceived(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) + ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; + static inline bool Audio_Device_IsSampleReceived(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) + { + if ((USB_DeviceState != DEVICE_STATE_Configured) || !(AudioInterfaceInfo->State.InterfaceEnabled)) + return false; + + Endpoint_SelectEndpoint(AudioInterfaceInfo->Config.DataOUTEndpointNumber); + return Endpoint_IsOUTReceived(); + } + + /** Determines if the given audio interface is ready to accept the next sample to be written to it, and selects + * the streaming IN endpoint ready for writing. + * + * \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or + * the call will fail. + * + * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. + * + * \return Boolean true if the given Audio interface is ready to accept the next sample, false otherwise. + */ + static inline bool Audio_Device_IsReadyForNextSample(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) + ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; + static inline bool Audio_Device_IsReadyForNextSample(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) + { + if ((USB_DeviceState != DEVICE_STATE_Configured) || !(AudioInterfaceInfo->State.InterfaceEnabled)) + return false; + + Endpoint_SelectEndpoint(AudioInterfaceInfo->Config.DataINEndpointNumber); + return Endpoint_IsINReady(); + } + + /** Reads the next 8-bit audio sample from the current audio interface. + * + * \pre This should be preceded immediately by a call to the \ref Audio_Device_IsSampleReceived() function to ensure + * ensure the correct endpoint is selected and ready for data. + * + * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. + * + * \return Signed 8-bit audio sample from the audio interface. + */ + static inline int8_t Audio_Device_ReadSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) + ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; + static inline int8_t Audio_Device_ReadSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) + { + int8_t Sample; + + (void)AudioInterfaceInfo; + + Sample = Endpoint_Read_Byte(); + + if (!(Endpoint_BytesInEndpoint())) + Endpoint_ClearOUT(); + + return Sample; + } + + /** Reads the next 16-bit audio sample from the current audio interface. + * + * \pre This should be preceded immediately by a call to the \ref Audio_Device_IsSampleReceived() function to ensure + * that the correct endpoint is selected and ready for data. + * + * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. + * + * \return Signed 16-bit audio sample from the audio interface. + */ + static inline int16_t Audio_Device_ReadSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) + ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; + static inline int16_t Audio_Device_ReadSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) + { + int16_t Sample; + + (void)AudioInterfaceInfo; + + Sample = (int16_t)Endpoint_Read_Word_LE(); + + if (!(Endpoint_BytesInEndpoint())) + Endpoint_ClearOUT(); + + return Sample; + } + + /** Reads the next 24-bit audio sample from the current audio interface. + * + * \pre This should be preceded immediately by a call to the \ref Audio_Device_IsSampleReceived() function to ensure + * that the correct endpoint is selected and ready for data. + * + * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. + * + * \return Signed 24-bit audio sample from the audio interface. + */ + static inline int32_t Audio_Device_ReadSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) + ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; + static inline int32_t Audio_Device_ReadSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) + { + int32_t Sample; + + (void)AudioInterfaceInfo; + + Sample = (((uint32_t)Endpoint_Read_Byte() << 16) | Endpoint_Read_Word_LE()); + + if (!(Endpoint_BytesInEndpoint())) + Endpoint_ClearOUT(); + + return Sample; + } + + /** Writes the next 8-bit audio sample to the current audio interface. + * + * \pre This should be preceded immediately by a call to the \ref Audio_Device_IsReadyForNextSample() function to + * ensure that the correct endpoint is selected and ready for data. + * + * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. + * \param[in] Sample Signed 8-bit audio sample. + */ + static inline void Audio_Device_WriteSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, + const int8_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; + static inline void Audio_Device_WriteSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, + const int8_t Sample) + { + Endpoint_Write_Byte(Sample); + + if (Endpoint_BytesInEndpoint() == AudioInterfaceInfo->Config.DataINEndpointSize) + Endpoint_ClearIN(); + } + + /** Writes the next 16-bit audio sample to the current audio interface. + * + * \pre This should be preceded immediately by a call to the \ref Audio_Device_IsReadyForNextSample() function to + * ensure that the correct endpoint is selected and ready for data. + * + * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. + * \param[in] Sample Signed 16-bit audio sample. + */ + static inline void Audio_Device_WriteSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, + const int16_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; + static inline void Audio_Device_WriteSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, + const int16_t Sample) + { + Endpoint_Write_Word_LE(Sample); + + if (Endpoint_BytesInEndpoint() == AudioInterfaceInfo->Config.DataINEndpointSize) + Endpoint_ClearIN(); + } + + /** Writes the next 24-bit audio sample to the current audio interface. + * + * \pre This should be preceded immediately by a call to the \ref Audio_Device_IsReadyForNextSample() function to + * ensure that the correct endpoint is selected and ready for data. + * + * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. + * \param[in] Sample Signed 24-bit audio sample. + */ + static inline void Audio_Device_WriteSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, + const int32_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; + static inline void Audio_Device_WriteSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, + const int32_t Sample) + { + Endpoint_Write_Byte(Sample >> 16); + Endpoint_Write_Word_LE(Sample); + + if (Endpoint_BytesInEndpoint() == AudioInterfaceInfo->Config.DataINEndpointSize) + Endpoint_ClearIN(); + } + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + +/** @} */ + diff --git a/firmware/LUFA/Drivers/USB/Class/Device/Audio.lst b/firmware/LUFA/Drivers/USB/Class/Device/Audio.lst new file mode 100644 index 0000000..711e651 --- /dev/null +++ b/firmware/LUFA/Drivers/USB/Class/Device/Audio.lst @@ -0,0 +1,184 @@ + 1 .file "Audio.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.Audio_Device_ConfigureEndpoints,"ax",@progbits + 17 .global Audio_Device_ConfigureEndpoints + 19 Audio_Device_ConfigureEndpoints: + 20 .LFB82: + 21 .LSM0: + 22 .LVL0: + 23 0000 1F93 push r17 + 24 0002 CF93 push r28 + 25 0004 DF93 push r29 + 26 /* prologue: function */ + 27 /* frame size = 0 */ + 28 0006 EC01 movw r28,r24 + 29 .LSM1: + 30 0008 1F82 std Y+7,__zero_reg__ + 31 000a 11E0 ldi r17,lo8(1) + 32 .LVL1: + 33 .L8: + 34 .LBB14: + 35 .LBB15: + 36 .LSM2: + 37 000c 8981 ldd r24,Y+1 + 38 000e 1817 cp r17,r24 + 39 0010 01F4 brne .L2 + 40 .LSM3: + 41 0012 2A81 ldd r18,Y+2 + 42 0014 3B81 ldd r19,Y+3 + 43 .LVL2: + 44 0016 61E0 ldi r22,lo8(1) + 45 .LVL3: + 46 0018 00C0 rjmp .L3 + 47 .LVL4: + 48 .L2: + 49 .LSM4: + 50 001a 8C81 ldd r24,Y+4 + 51 001c 1817 cp r17,r24 + 52 001e 01F4 brne .L4 + 53 .LSM5: + 54 0020 2D81 ldd r18,Y+5 + 55 0022 3E81 ldd r19,Y+6 + 56 .LVL5: + 57 0024 60E0 ldi r22,lo8(0) + 58 .LVL6: + 59 .L3: + 60 0026 40E0 ldi r20,lo8(0) + 61 .LVL7: + 62 0028 88E0 ldi r24,lo8(8) + 63 002a 90E0 ldi r25,hi8(8) + 64 .LVL8: + 65 002c 00C0 rjmp .L5 + 66 .L6: + 67 .LBB16: + 68 .LBB17: + 69 .LBB18: + 70 .LBB19: + 71 .LSM6: + 72 002e 4F5F subi r20,lo8(-(1)) + 73 .LSM7: + 74 0030 880F lsl r24 + 75 0032 991F rol r25 + 76 .L5: + 77 .LSM8: + 78 0034 8217 cp r24,r18 + 79 0036 9307 cpc r25,r19 + 80 0038 00F0 brlo .L6 + 81 .LBE19: + 82 .LBE18: + 83 .LBE17: + 84 .LSM9: + 85 003a 6064 ori r22,lo8(64) + 86 003c 4295 swap r20 + 87 003e 407F andi r20,lo8(-16) + 88 0040 4660 ori r20,lo8(6) + 89 0042 812F mov r24,r17 + 90 .LVL9: + 91 0044 0E94 0000 call Endpoint_ConfigureEndpoint_Prv + 92 .LVL10: + 93 .LBE16: + 94 .LSM10: + 95 0048 8823 tst r24 + 96 004a 01F0 breq .L7 + 97 .L4: + 98 .LBE15: + 99 .LSM11: + 100 004c 1F5F subi r17,lo8(-(1)) + 101 004e 1530 cpi r17,lo8(5) + 102 0050 01F4 brne .L8 + 103 0052 81E0 ldi r24,lo8(1) + 104 .L7: + 105 /* epilogue start */ + 106 .LBE14: + 107 .LSM12: + 108 0054 DF91 pop r29 + 109 0056 CF91 pop r28 + 110 .LVL11: + 111 0058 1F91 pop r17 + 112 .LVL12: + 113 005a 0895 ret + 114 .LFE82: + 116 .section .text.Audio_Device_ProcessControlRequest,"ax",@progbits + 117 .global Audio_Device_ProcessControlRequest + 119 Audio_Device_ProcessControlRequest: + 120 .LFB81: + 121 .LSM13: + 122 .LVL13: + 123 0000 CF93 push r28 + 124 0002 DF93 push r29 + 125 /* prologue: function */ + 126 /* frame size = 0 */ + 127 0004 EC01 movw r28,r24 + 128 .LBB20: + 129 .LBB21: + 130 .LSM14: + 131 0006 8091 E800 lds r24,232 + 132 .LVL14: + 133 .LBE21: + 134 .LBE20: + 135 .LSM15: + 136 000a 83FF sbrs r24,3 + 137 000c 00C0 rjmp .L15 + 138 .LSM16: + 139 000e 8881 ld r24,Y + 140 0010 90E0 ldi r25,lo8(0) + 141 0012 2091 0000 lds r18,USB_ControlRequest+4 + 142 0016 3091 0000 lds r19,(USB_ControlRequest+4)+1 + 143 001a 2817 cp r18,r24 + 144 001c 3907 cpc r19,r25 + 145 001e 01F4 brne .L15 + 146 .LSM17: + 147 0020 8091 0000 lds r24,USB_ControlRequest+1 + 148 0024 8B30 cpi r24,lo8(11) + 149 0026 01F4 brne .L15 + 150 .LSM18: + 151 0028 8091 0000 lds r24,USB_ControlRequest + 152 002c 8130 cpi r24,lo8(1) + 153 002e 01F4 brne .L15 + 154 .LBB22: + 155 .LBB23: + 156 .LSM19: + 157 0030 8091 E800 lds r24,232 + 158 0034 877F andi r24,lo8(-9) + 159 0036 8093 E800 sts 232,r24 + 160 .LBE23: + 161 .LBE22: + 162 .LSM20: + 163 003a 0E94 0000 call Endpoint_ClearStatusStage + 164 .LSM21: + 165 003e 90E0 ldi r25,lo8(0) + 166 0040 8091 0000 lds r24,USB_ControlRequest+2 + 167 0044 8111 cpse r24,__zero_reg__ + 168 0046 91E0 ldi r25,lo8(1) + 169 .L14: + 170 0048 9F83 std Y+7,r25 + 171 .L15: + 172 /* epilogue start */ + 173 .LSM22: + 174 004a DF91 pop r29 + 175 004c CF91 pop r28 + 176 .LVL15: + 177 004e 0895 ret + 178 .LFE81: + 212 .Letext0: +DEFINED SYMBOLS + *ABS*:0000000000000000 Audio.c + /tmp/ccVOq125.s:2 *ABS*:000000000000003f __SREG__ + /tmp/ccVOq125.s:3 *ABS*:000000000000003e __SP_H__ + /tmp/ccVOq125.s:4 *ABS*:000000000000003d __SP_L__ + /tmp/ccVOq125.s:5 *ABS*:0000000000000034 __CCP__ + /tmp/ccVOq125.s:6 *ABS*:0000000000000000 __tmp_reg__ + /tmp/ccVOq125.s:7 *ABS*:0000000000000001 __zero_reg__ + /tmp/ccVOq125.s:19 .text.Audio_Device_ConfigureEndpoints:0000000000000000 Audio_Device_ConfigureEndpoints + /tmp/ccVOq125.s:119 .text.Audio_Device_ProcessControlRequest:0000000000000000 Audio_Device_ProcessControlRequest + +UNDEFINED SYMBOLS +Endpoint_ConfigureEndpoint_Prv +USB_ControlRequest +Endpoint_ClearStatusStage diff --git a/firmware/LUFA/Drivers/USB/Class/Device/Audio.o b/firmware/LUFA/Drivers/USB/Class/Device/Audio.o new file mode 100644 index 0000000..6658370 Binary files /dev/null and b/firmware/LUFA/Drivers/USB/Class/Device/Audio.o differ diff --git a/firmware/LUFA/Drivers/USB/Class/Device/CDC.c b/firmware/LUFA/Drivers/USB/Class/Device/CDC.c new file mode 100644 index 0000000..0da5cc6 --- /dev/null +++ b/firmware/LUFA/Drivers/USB/Class/Device/CDC.c @@ -0,0 +1,332 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2010 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. +*/ + +#define __INCLUDE_FROM_USB_DRIVER +#include "../../HighLevel/USBMode.h" +#if defined(USB_CAN_BE_DEVICE) + +#define __INCLUDE_FROM_CDC_DRIVER +#define __INCLUDE_FROM_CDC_DEVICE_C +#include "CDC.h" + +void CDC_Device_Event_Stub(void) +{ + +} + +void CDC_Device_ProcessControlRequest(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ + if (!(Endpoint_IsSETUPReceived())) + return; + + if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) + return; + + switch (USB_ControlRequest.bRequest) + { + case CDC_REQ_GetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + Endpoint_Write_Control_Stream_LE(&CDCInterfaceInfo->State.LineEncoding, sizeof(CDCInterfaceInfo->State.LineEncoding)); + Endpoint_ClearOUT(); + } + + break; + case CDC_REQ_SetLineEncoding: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + Endpoint_Read_Control_Stream_LE(&CDCInterfaceInfo->State.LineEncoding, sizeof(CDCInterfaceInfo->State.LineEncoding)); + Endpoint_ClearIN(); + + EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); + } + + break; + case CDC_REQ_SetControlLineState: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + Endpoint_ClearStatusStage(); + + CDCInterfaceInfo->State.ControlLineStates.HostToDevice = USB_ControlRequest.wValue; + + EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); + } + + break; + case CDC_REQ_SendBreak: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + Endpoint_ClearStatusStage(); + + EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); + } + + break; + } +} + +bool CDC_Device_ConfigureEndpoints(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ + memset(&CDCInterfaceInfo->State, 0x00, sizeof(CDCInterfaceInfo->State)); + + for (uint8_t EndpointNum = 1; EndpointNum < ENDPOINT_TOTAL_ENDPOINTS; EndpointNum++) + { + uint16_t Size; + uint8_t Type; + uint8_t Direction; + bool DoubleBanked; + + if (EndpointNum == CDCInterfaceInfo->Config.DataINEndpointNumber) + { + Size = CDCInterfaceInfo->Config.DataINEndpointSize; + Direction = ENDPOINT_DIR_IN; + Type = EP_TYPE_BULK; + DoubleBanked = CDCInterfaceInfo->Config.DataINEndpointDoubleBank; + } + else if (EndpointNum == CDCInterfaceInfo->Config.DataOUTEndpointNumber) + { + Size = CDCInterfaceInfo->Config.DataOUTEndpointSize; + Direction = ENDPOINT_DIR_OUT; + Type = EP_TYPE_BULK; + DoubleBanked = CDCInterfaceInfo->Config.DataOUTEndpointDoubleBank; + } + else if (EndpointNum == CDCInterfaceInfo->Config.NotificationEndpointNumber) + { + Size = CDCInterfaceInfo->Config.NotificationEndpointSize; + Direction = ENDPOINT_DIR_IN; + Type = EP_TYPE_INTERRUPT; + DoubleBanked = CDCInterfaceInfo->Config.NotificationEndpointDoubleBank; + } + else + { + continue; + } + + if (!(Endpoint_ConfigureEndpoint(EndpointNum, Type, Direction, Size, + DoubleBanked ? ENDPOINT_BANK_DOUBLE : ENDPOINT_BANK_SINGLE))) + { + return false; + } + } + + return true; +} + +void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ + if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) + return; + + #if !defined(NO_CLASS_DRIVER_AUTOFLUSH) + CDC_Device_Flush(CDCInterfaceInfo); + #endif +} + +uint8_t CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, + const char* const Data, + const uint16_t Length) +{ + if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) + return ENDPOINT_RWSTREAM_DeviceDisconnected; + + Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpointNumber); + return Endpoint_Write_Stream_LE(Data, Length, NO_STREAM_CALLBACK); +} + +uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, + const uint8_t Data) +{ + if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) + return ENDPOINT_RWSTREAM_DeviceDisconnected; + + Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpointNumber); + + if (!(Endpoint_IsReadWriteAllowed())) + { + Endpoint_ClearIN(); + + uint8_t ErrorCode; + + if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) + return ErrorCode; + } + + Endpoint_Write_Byte(Data); + return ENDPOINT_READYWAIT_NoError; +} + +uint8_t CDC_Device_Flush(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ + if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) + return ENDPOINT_RWSTREAM_DeviceDisconnected; + + uint8_t ErrorCode; + + Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpointNumber); + + if (!(Endpoint_BytesInEndpoint())) + return ENDPOINT_READYWAIT_NoError; + + bool BankFull = !(Endpoint_IsReadWriteAllowed()); + + Endpoint_ClearIN(); + + if (BankFull) + { + if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) + return ErrorCode; + + Endpoint_ClearIN(); + } + + return ENDPOINT_READYWAIT_NoError; +} + +uint16_t CDC_Device_BytesReceived(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ + if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) + return 0; + + Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpointNumber); + + if (Endpoint_IsOUTReceived()) + { + if (!(Endpoint_BytesInEndpoint())) + { + Endpoint_ClearOUT(); + return 0; + } + else + { + return Endpoint_BytesInEndpoint(); + } + } + else + { + return 0; + } +} + +int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ + if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) + return -1; + + int16_t ReceivedByte = -1; + + Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpointNumber); + + if (Endpoint_IsOUTReceived()) + { + if (Endpoint_BytesInEndpoint()) + ReceivedByte = Endpoint_Read_Byte(); + + if (!(Endpoint_BytesInEndpoint())) + Endpoint_ClearOUT(); + } + + return ReceivedByte; +} + +void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ + if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) + return; + + Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.NotificationEndpointNumber); + + USB_Request_Header_t Notification = (USB_Request_Header_t) + { + .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE), + .bRequest = CDC_NOTIF_SerialState, + .wValue = 0, + .wIndex = 0, + .wLength = sizeof(CDCInterfaceInfo->State.ControlLineStates.DeviceToHost), + }; + + Endpoint_Write_Stream_LE(&Notification, sizeof(USB_Request_Header_t), NO_STREAM_CALLBACK); + Endpoint_Write_Stream_LE(&CDCInterfaceInfo->State.ControlLineStates.DeviceToHost, + sizeof(CDCInterfaceInfo->State.ControlLineStates.DeviceToHost), + NO_STREAM_CALLBACK); + Endpoint_ClearIN(); +} + +void CDC_Device_CreateStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, + FILE* const Stream) +{ + *Stream = (FILE)FDEV_SETUP_STREAM(CDC_Device_putchar, CDC_Device_getchar, _FDEV_SETUP_RW); + fdev_set_udata(Stream, CDCInterfaceInfo); +} + +void CDC_Device_CreateBlockingStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, + FILE* const Stream) +{ + *Stream = (FILE)FDEV_SETUP_STREAM(CDC_Device_putchar, CDC_Device_getchar_Blocking, _FDEV_SETUP_RW); + fdev_set_udata(Stream, CDCInterfaceInfo); +} + +static int CDC_Device_putchar(char c, + FILE* Stream) +{ + return CDC_Device_SendByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream), c) ? _FDEV_ERR : 0; +} + +static int CDC_Device_getchar(FILE* Stream) +{ + int16_t ReceivedByte = CDC_Device_ReceiveByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream)); + + if (ReceivedByte < 0) + return _FDEV_EOF; + + return ReceivedByte; +} + +static int CDC_Device_getchar_Blocking(FILE* Stream) +{ + int16_t ReceivedByte; + + while ((ReceivedByte = CDC_Device_ReceiveByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream))) < 0) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return _FDEV_EOF; + + CDC_Device_USBTask((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream)); + USB_USBTask(); + } + + return ReceivedByte; +} + +#endif + diff --git a/firmware/LUFA/Drivers/USB/Class/Device/CDC.h b/firmware/LUFA/Drivers/USB/Class/Device/CDC.h new file mode 100644 index 0000000..4fa823a --- /dev/null +++ b/firmware/LUFA/Drivers/USB/Class/Device/CDC.h @@ -0,0 +1,342 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief Device mode driver for the library USB CDC Class driver. + * + * Device mode driver for the library USB CDC Class driver. + * + * \note This file should not be included directly. It is automatically included as needed by the USB module driver + * dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassCDC + * @defgroup Group_USBClassCDCDevice CDC Class Device Mode Driver + * + * \section Sec_Dependencies Module Source Dependencies + * The following files must be built with any user project that uses this module: + * - LUFA/Drivers/USB/Class/Device/CDC.c (Makefile source module name: LUFA_SRC_USBCLASS) + * + * \section Module Description + * Device Mode USB Class driver framework interface, for the CDC USB Class driver. + * + * \note There are several major drawbacks to the CDC-ACM standard USB class, however + * it is very standardized and thus usually available as a built-in driver on + * most platforms, and so is a better choice than a proprietary serial class. + * + * One major issue with CDC-ACM is that it requires two Interface descriptors, + * which will upset most hosts when part of a multi-function "Composite" USB + * device, as each interface will be loaded into a separate driver instance. To + * combat this, you should use the "Interface Association Descriptor" addendum to + * the USB standard which is available on most OSes when creating Composite devices. + * + * Another major oversight is that there is no mechanism for the host to notify the + * device that there is a data sink on the host side ready to accept data. This + * means that the device may try to send data while the host isn't listening, causing + * lengthy blocking timeouts in the transmission routines. To combat this, it is + * recommended that the virtual serial line DTR (Data Terminal Ready) be used where + * possible to determine if a host application is ready for data. + * + * @{ + */ + +#ifndef _CDC_CLASS_DEVICE_H_ +#define _CDC_CLASS_DEVICE_H_ + + /* Includes: */ + #include "../../USB.h" + #include "../Common/CDC.h" + + #include + #include + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(__INCLUDE_FROM_CDC_DRIVER) + #error Do not include this file directly. Include LUFA/Drivers/USB.h instead. + #endif + + #if defined(__INCLUDE_FROM_CDC_DEVICE_C) && defined(NO_STREAM_CALLBACKS) + #error The NO_STREAM_CALLBACKS compile time option cannot be used in projects using the library Class drivers. + #endif + + /* Public Interface - May be used in end-application: */ + /* Type Defines: */ + /** \brief CDC Class Device Mode Configuration and State Structure. + * + * Class state structure. An instance of this structure should be made for each CDC interface + * within the user application, and passed to each of the CDC class driver functions as the + * CDCInterfaceInfo parameter. This stores each CDC interface's configuration and state information. + */ + typedef struct + { + const struct + { + uint8_t ControlInterfaceNumber; /**< Interface number of the CDC control interface within the device. */ + + uint8_t DataINEndpointNumber; /**< Endpoint number of the CDC interface's IN data endpoint. */ + uint16_t DataINEndpointSize; /**< Size in bytes of the CDC interface's IN data endpoint. */ + bool DataINEndpointDoubleBank; /**< Indicates if the CDC interface's IN data endpoint should use double banking. */ + + uint8_t DataOUTEndpointNumber; /**< Endpoint number of the CDC interface's OUT data endpoint. */ + uint16_t DataOUTEndpointSize; /**< Size in bytes of the CDC interface's OUT data endpoint. */ + bool DataOUTEndpointDoubleBank; /**< Indicates if the CDC interface's OUT data endpoint should use double banking. */ + + uint8_t NotificationEndpointNumber; /**< Endpoint number of the CDC interface's IN notification endpoint, if used. */ + uint16_t NotificationEndpointSize; /**< Size in bytes of the CDC interface's IN notification endpoint, if used. */ + bool NotificationEndpointDoubleBank; /**< Indicates if the CDC interface's notification endpoint should use double banking. */ + } Config; /**< Config data for the USB class interface within the device. All elements in this section + * must be set or the interface will fail to enumerate and operate correctly. + */ + struct + { + struct + { + uint8_t HostToDevice; /**< Control line states from the host to device, as a set of CDC_CONTROL_LINE_OUT_* + * masks. This value is updated each time \ref CDC_Device_USBTask() is called. + */ + uint8_t DeviceToHost; /**< Control line states from the device to host, as a set of CDC_CONTROL_LINE_IN_* + * masks - to notify the host of changes to these values, call the + * \ref CDC_Device_SendControlLineStateChange() function. + */ + } ControlLineStates; /**< Current states of the virtual serial port's control lines between the device and host. */ + + CDC_LineEncoding_t LineEncoding; /** Line encoding used in the virtual serial port, for the device's information. + * This is generally only used if the virtual serial port data is to be + * reconstructed on a physical UART. + */ + } State; /**< State data for the USB class interface within the device. All elements in this section + * are reset to their defaults when the interface is enumerated. + */ + } USB_ClassInfo_CDC_Device_t; + + /* Function Prototypes: */ + /** Configures the endpoints of a given CDC interface, ready for use. This should be linked to the library + * \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration containing + * the given CDC interface is selected. + * + * \note The endpoint index numbers as given in the interface's configuration structure must not overlap with any other + * interface, or endpoint bank corruption will occur. Gaps in the allocated endpoint numbers or non-sequential indexes + * within a single interface is allowed, but no two interfaces of any type have have interleaved endpoint indexes. + * + * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. + * + * \return Boolean true if the endpoints were successfully configured, false otherwise. + */ + bool CDC_Device_ConfigureEndpoints(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** Processes incoming control requests from the host, that are directed to the given CDC class interface. This should be + * linked to the library \ref EVENT_USB_Device_ControlRequest() event. + * + * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. + */ + void CDC_Device_ProcessControlRequest(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** General management task for a given CDC class interface, required for the correct operation of the interface. This should + * be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). + * + * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. + */ + void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** CDC class driver event for a line encoding change on a CDC interface. This event fires each time the host requests a + * line encoding change (containing the serial parity, baud and other configuration information) and may be hooked in the + * user program by declaring a handler function with the same name and parameters listed here. The new line encoding + * settings are available in the LineEncoding structure inside the CDC interface structure passed as a parameter. + * + * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. + */ + void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** CDC class driver event for a control line state change on a CDC interface. This event fires each time the host requests a + * control line state change (containing the virtual serial control line states, such as DTR) and may be hooked in the + * user program by declaring a handler function with the same name and parameters listed here. The new control line states + * are available in the ControlLineStates.HostToDevice value inside the CDC interface structure passed as a parameter, set as + * a mask of CDC_CONTROL_LINE_OUT_* masks. + * + * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. + */ + void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** CDC class driver event for a send break request sent to the device from the host. This is generally used to separate + * data or to indicate a special condition to the receiving device. + * + * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. + * \param[in] Duration Duration of the break that has been sent by the host, in milliseconds. + */ + void EVENT_CDC_Device_BreakSent(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, + const uint8_t Duration) ATTR_NON_NULL_PTR_ARG(1); + + /** Sends a given string to the attached USB host, if connected. If a host is not connected when the function is called, the + * string is discarded. Bytes will be queued for transmission to the host until either the endpoint bank becomes full, or the + * \ref CDC_Device_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be + * packed into a single endpoint packet, increasing data throughput. + * + * \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or + * the call will fail. + * + * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. + * \param[in] Data Pointer to the string to send to the host. + * \param[in] Length Size in bytes of the string to send to the host. + * + * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. + */ + uint8_t CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, + const char* const Data, + const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + + /** Sends a given byte to the attached USB host, if connected. If a host is not connected when the function is called, the + * byte is discarded. Bytes will be queued for transmission to the host until either the endpoint bank becomes full, or the + * \ref CDC_Device_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be + * packed into a single endpoint packet, increasing data throughput. + * + * \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or + * the call will fail. + * + * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. + * \param[in] Data Byte of data to send to the host. + * + * \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum. + */ + uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, + const uint8_t Data) ATTR_NON_NULL_PTR_ARG(1); + + /** Determines the number of bytes received by the CDC interface from the host, waiting to be read. This indicates the number + * of bytes in the OUT endpoint bank only, and thus the number of calls to \ref CDC_Device_ReceiveByte() which are guaranteed to + * succeed immediately. If multiple bytes are to be received, they should be buffered by the user application, as the endpoint + * bank will not be released back to the USB controller until all bytes are read. + * + * \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or + * the call will fail. + * + * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. + * + * \return Total number of buffered bytes received from the host. + */ + uint16_t CDC_Device_BytesReceived(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** Reads a byte of data from the host. If no data is waiting to be read of if a USB host is not connected, the function + * returns a negative value. The \ref CDC_Device_BytesReceived() function may be queried in advance to determine how many + * bytes are currently buffered in the CDC interface's data receive endpoint bank, and thus how many repeated calls to this + * function which are guaranteed to succeed. + * + * \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or + * the call will fail. + * + * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. + * + * \return Next received byte from the host, or a negative value if no data received. + */ + int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** Flushes any data waiting to be sent, ensuring that the send buffer is cleared. + * + * \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or + * the call will fail. + * + * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. + * + * \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum. + */ + uint8_t CDC_Device_Flush(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** Sends a Serial Control Line State Change notification to the host. This should be called when the virtual serial + * control lines (DCD, DSR, etc.) have changed states, or to give BREAK notifications to the host. Line states persist + * until they are cleared via a second notification. This should be called each time the CDC class driver's + * ControlLineStates.DeviceToHost value is updated to push the new states to the USB host. + * + * \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or + * the call will fail. + * + * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. + */ + void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** Creates a standard character stream for the given CDC Device instance so that it can be used with all the regular + * functions in the avr-libc library that accept a FILE stream as a destination (e.g. fprintf). The created + * stream is bidirectional and can be used for both input and output functions. + * + * Reading data from this stream is non-blocking, i.e. in most instances, complete strings cannot be read in by a single + * fetch, as the endpoint will not be ready at some point in the transmission, aborting the transfer. However, this may + * be used when the read data is processed byte-per-bye (via getc()) or when the user application will implement its own + * line buffering. + * + * \note The created stream can be given as stdout if desired to direct the standard output from all functions + * to the given CDC interface. + * + * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. + * \param[in,out] Stream Pointer to a FILE structure where the created stream should be placed. + */ + void CDC_Device_CreateStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, + FILE* const Stream) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + + /** Identical to CDC_Device_CreateStream(), except that reads are blocking until the calling stream function terminates + * the transfer. While blocking, the USB and CDC service tasks are called repeatedly to maintain USB communications. + * + * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. + * \param[in,out] Stream Pointer to a FILE structure where the created stream should be placed. + */ + void CDC_Device_CreateBlockingStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, + FILE* const Stream) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + + /* Private Interface - For use in library only: */ + #if !defined(__DOXYGEN__) + /* Function Prototypes: */ + #if defined(__INCLUDE_FROM_CDC_DEVICE_C) + static int CDC_Device_putchar(char c, + FILE* Stream) ATTR_NON_NULL_PTR_ARG(2); + static int CDC_Device_getchar(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); + static int CDC_Device_getchar_Blocking(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); + + void CDC_Device_Event_Stub(void); + void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) + ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Device_Event_Stub); + void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) + ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Device_Event_Stub); + void EVENT_CDC_Device_BreakSent(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, + const uint8_t Duration) ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) + ATTR_ALIAS(CDC_Device_Event_Stub); + #endif + + #endif + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + +/** @} */ + diff --git a/firmware/LUFA/Drivers/USB/Class/Device/CDC.lst b/firmware/LUFA/Drivers/USB/Class/Device/CDC.lst new file mode 100644 index 0000000..ceb9593 --- /dev/null +++ b/firmware/LUFA/Drivers/USB/Class/Device/CDC.lst @@ -0,0 +1,1059 @@ + 1 .file "CDC.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.CDC_Device_Event_Stub,"ax",@progbits + 17 .global CDC_Device_Event_Stub + 19 CDC_Device_Event_Stub: + 20 .LFB81: + 21 .LSM0: + 22 /* prologue: function */ + 23 /* frame size = 0 */ + 24 /* epilogue start */ + 25 .LSM1: + 26 0000 0895 ret + 27 .LFE81: + 29 .section .text.CDC_Device_BytesReceived,"ax",@progbits + 30 .global CDC_Device_BytesReceived + 32 CDC_Device_BytesReceived: + 33 .LFB88: + 34 .LSM2: + 35 .LVL0: + 36 /* prologue: function */ + 37 /* frame size = 0 */ + 38 0000 FC01 movw r30,r24 + 39 .LSM3: + 40 0002 8091 0000 lds r24,USB_DeviceState + 41 .LVL1: + 42 0006 8430 cpi r24,lo8(4) + 43 0008 01F4 brne .L4 + 44 000a 8785 ldd r24,Z+15 + 45 000c 9089 ldd r25,Z+16 + 46 000e A189 ldd r26,Z+17 + 47 0010 B289 ldd r27,Z+18 + 48 0012 0097 sbiw r24,0 + 49 0014 A105 cpc r26,__zero_reg__ + 50 0016 B105 cpc r27,__zero_reg__ + 51 0018 01F0 breq .L4 + 52 .LSM4: + 53 001a 8581 ldd r24,Z+5 + 54 .LBB71: + 55 .LBB72: + 56 .LSM5: + 57 001c 8093 E900 sts 233,r24 + 58 .LBE72: + 59 .LBE71: + 60 .LBB73: + 61 .LBB74: + 62 .LSM6: + 63 0020 8091 E800 lds r24,232 + 64 .LBE74: + 65 .LBE73: + 66 .LSM7: + 67 0024 82FF sbrs r24,2 + 68 0026 00C0 rjmp .L4 + 69 .LBB75: + 70 .LBB76: + 71 .LSM8: + 72 0028 8091 F200 lds r24,242 + 73 .LBE76: + 74 .LBE75: + 75 .LSM9: + 76 002c 8823 tst r24 + 77 002e 01F4 brne .L5 + 78 .LBB77: + 79 .LBB78: + 80 .LSM10: + 81 0030 8091 E800 lds r24,232 + 82 0034 8B77 andi r24,lo8(123) + 83 0036 8093 E800 sts 232,r24 + 84 003a 00C0 rjmp .L4 + 85 .L5: + 86 .LBE78: + 87 .LBE77: + 88 .LBB79: + 89 .LBB80: + 90 .LSM11: + 91 003c 8091 F200 lds r24,242 + 92 0040 282F mov r18,r24 + 93 0042 30E0 ldi r19,lo8(0) + 94 0044 00C0 rjmp .L6 + 95 .L4: + 96 .LSM12: + 97 0046 20E0 ldi r18,lo8(0) + 98 0048 30E0 ldi r19,hi8(0) + 99 .L6: + 100 .LBE80: + 101 .LBE79: + 102 .LSM13: + 103 004a C901 movw r24,r18 + 104 /* epilogue start */ + 105 004c 0895 ret + 106 .LFE88: + 108 .section .text.CDC_Device_ReceiveByte,"ax",@progbits + 109 .global CDC_Device_ReceiveByte + 111 CDC_Device_ReceiveByte: + 112 .LFB89: + 113 .LSM14: + 114 .LVL2: + 115 /* prologue: function */ + 116 /* frame size = 0 */ + 117 0000 FC01 movw r30,r24 + 118 .LSM15: + 119 0002 8091 0000 lds r24,USB_DeviceState + 120 .LVL3: + 121 0006 8430 cpi r24,lo8(4) + 122 0008 01F4 brne .L9 + 123 000a 8785 ldd r24,Z+15 + 124 000c 9089 ldd r25,Z+16 + 125 000e A189 ldd r26,Z+17 + 126 0010 B289 ldd r27,Z+18 + 127 0012 0097 sbiw r24,0 + 128 0014 A105 cpc r26,__zero_reg__ + 129 0016 B105 cpc r27,__zero_reg__ + 130 0018 01F0 breq .L9 + 131 .LSM16: + 132 001a 8581 ldd r24,Z+5 + 133 .LBB81: + 134 .LBB82: + 135 .LSM17: + 136 001c 8093 E900 sts 233,r24 + 137 .LBE82: + 138 .LBE81: + 139 .LBB83: + 140 .LBB84: + 141 .LSM18: + 142 0020 8091 E800 lds r24,232 + 143 .LBE84: + 144 .LBE83: + 145 .LSM19: + 146 0024 82FF sbrs r24,2 + 147 0026 00C0 rjmp .L9 + 148 .L10: + 149 .LBB85: + 150 .LBB86: + 151 .LSM20: + 152 0028 8091 F200 lds r24,242 + 153 .LBE86: + 154 .LBE85: + 155 .LSM21: + 156 002c 8823 tst r24 + 157 002e 01F4 brne .L12 + 158 0030 2FEF ldi r18,lo8(-1) + 159 0032 3FEF ldi r19,hi8(-1) + 160 .LVL4: + 161 0034 00C0 rjmp .L13 + 162 .LVL5: + 163 .L12: + 164 .LBB87: + 165 .LBB88: + 166 .LSM22: + 167 0036 8091 F100 lds r24,241 + 168 .LBE88: + 169 .LBE87: + 170 .LSM23: + 171 003a 282F mov r18,r24 + 172 .LVL6: + 173 003c 30E0 ldi r19,lo8(0) + 174 .LVL7: + 175 .L13: + 176 .LBB89: + 177 .LBB90: + 178 .LSM24: + 179 003e 8091 F200 lds r24,242 + 180 .LBE90: + 181 .LBE89: + 182 .LSM25: + 183 0042 8823 tst r24 + 184 0044 01F4 brne .L11 + 185 .LBB91: + 186 .LBB92: + 187 .LSM26: + 188 0046 8091 E800 lds r24,232 + 189 004a 8B77 andi r24,lo8(123) + 190 004c 8093 E800 sts 232,r24 + 191 0050 00C0 rjmp .L11 + 192 .LVL8: + 193 .L9: + 194 0052 2FEF ldi r18,lo8(-1) + 195 0054 3FEF ldi r19,hi8(-1) + 196 .LVL9: + 197 .L11: + 198 .LBE92: + 199 .LBE91: + 200 .LSM27: + 201 0056 C901 movw r24,r18 + 202 .LVL10: + 203 /* epilogue start */ + 204 0058 0895 ret + 205 .LFE89: + 207 .section .text.CDC_Device_CreateStream,"ax",@progbits + 208 .global CDC_Device_CreateStream + 210 CDC_Device_CreateStream: + 211 .LFB91: + 212 .LSM28: + 213 .LVL11: + 214 /* prologue: function */ + 215 /* frame size = 0 */ + 216 0000 FB01 movw r30,r22 + 217 .LSM29: + 218 0002 2EE0 ldi r18,lo8(14) + 219 0004 DB01 movw r26,r22 + 220 0006 1D92 st X+,__zero_reg__ + 221 0008 2A95 dec r18 + 222 000a 01F4 brne .-6 + 223 000c 23E0 ldi r18,lo8(3) + 224 000e 2383 std Z+3,r18 + 225 0010 20E0 ldi r18,lo8(gs(CDC_Device_putchar)) + 226 0012 30E0 ldi r19,hi8(gs(CDC_Device_putchar)) + 227 0014 3187 std Z+9,r19 + 228 0016 2087 std Z+8,r18 + 229 0018 20E0 ldi r18,lo8(gs(CDC_Device_getchar)) + 230 001a 30E0 ldi r19,hi8(gs(CDC_Device_getchar)) + 231 001c 3387 std Z+11,r19 + 232 001e 2287 std Z+10,r18 + 233 .LSM30: + 234 0020 9587 std Z+13,r25 + 235 0022 8487 std Z+12,r24 + 236 /* epilogue start */ + 237 .LSM31: + 238 0024 0895 ret + 239 .LFE91: + 241 .section .text.CDC_Device_CreateBlockingStream,"ax",@progbits + 242 .global CDC_Device_CreateBlockingStream + 244 CDC_Device_CreateBlockingStream: + 245 .LFB92: + 246 .LSM32: + 247 .LVL12: + 248 /* prologue: function */ + 249 /* frame size = 0 */ + 250 0000 FB01 movw r30,r22 + 251 .LSM33: + 252 0002 2EE0 ldi r18,lo8(14) + 253 0004 DB01 movw r26,r22 + 254 0006 1D92 st X+,__zero_reg__ + 255 0008 2A95 dec r18 + 256 000a 01F4 brne .-6 + 257 000c 23E0 ldi r18,lo8(3) + 258 000e 2383 std Z+3,r18 + 259 0010 20E0 ldi r18,lo8(gs(CDC_Device_putchar)) + 260 0012 30E0 ldi r19,hi8(gs(CDC_Device_putchar)) + 261 0014 3187 std Z+9,r19 + 262 0016 2087 std Z+8,r18 + 263 0018 20E0 ldi r18,lo8(gs(CDC_Device_getchar_Blocking)) + 264 001a 30E0 ldi r19,hi8(gs(CDC_Device_getchar_Blocking)) + 265 001c 3387 std Z+11,r19 + 266 001e 2287 std Z+10,r18 + 267 .LSM34: + 268 0020 9587 std Z+13,r25 + 269 0022 8487 std Z+12,r24 + 270 /* epilogue start */ + 271 .LSM35: + 272 0024 0895 ret + 273 .LFE92: + 275 .section .text.CDC_Device_getchar,"ax",@progbits + 277 CDC_Device_getchar: + 278 .LFB94: + 279 .LSM36: + 280 .LVL13: + 281 /* prologue: function */ + 282 /* frame size = 0 */ + 283 .LSM37: + 284 0000 FC01 movw r30,r24 + 285 0002 8485 ldd r24,Z+12 + 286 0004 9585 ldd r25,Z+13 + 287 .LVL14: + 288 0006 0E94 0000 call CDC_Device_ReceiveByte + 289 000a 9C01 movw r18,r24 + 290 .LVL15: + 291 .LSM38: + 292 000c 97FF sbrs r25,7 + 293 000e 00C0 rjmp .L20 + 294 .LVL16: + 295 0010 2EEF ldi r18,lo8(-2) + 296 0012 3FEF ldi r19,hi8(-2) + 297 .LVL17: + 298 .L20: + 299 .LSM39: + 300 0014 C901 movw r24,r18 + 301 .LVL18: + 302 /* epilogue start */ + 303 0016 0895 ret + 304 .LFE94: + 306 .section .text.CDC_Device_SendControlLineStateChange,"ax",@progbits + 307 .global CDC_Device_SendControlLineStateChange + 309 CDC_Device_SendControlLineStateChange: + 310 .LFB90: + 311 .LSM40: + 312 .LVL19: + 313 0000 0F93 push r16 + 314 0002 1F93 push r17 + 315 0004 DF93 push r29 + 316 0006 CF93 push r28 + 317 0008 CDB7 in r28,__SP_L__ + 318 000a DEB7 in r29,__SP_H__ + 319 000c 2897 sbiw r28,8 + 320 000e 0FB6 in __tmp_reg__,__SREG__ + 321 0010 F894 cli + 322 0012 DEBF out __SP_H__,r29 + 323 0014 0FBE out __SREG__,__tmp_reg__ + 324 0016 CDBF out __SP_L__,r28 + 325 /* prologue: function */ + 326 /* frame size = 8 */ + 327 0018 8C01 movw r16,r24 + 328 .LSM41: + 329 001a 8091 0000 lds r24,USB_DeviceState + 330 .LVL20: + 331 001e 8430 cpi r24,lo8(4) + 332 0020 01F4 brne .L25 + 333 0022 F801 movw r30,r16 + 334 0024 8785 ldd r24,Z+15 + 335 0026 9089 ldd r25,Z+16 + 336 0028 A189 ldd r26,Z+17 + 337 002a B289 ldd r27,Z+18 + 338 002c 0097 sbiw r24,0 + 339 002e A105 cpc r26,__zero_reg__ + 340 0030 B105 cpc r27,__zero_reg__ + 341 0032 01F0 breq .L25 + 342 .LSM42: + 343 0034 8185 ldd r24,Z+9 + 344 .LBB93: + 345 .LBB94: + 346 .LSM43: + 347 0036 8093 E900 sts 233,r24 + 348 .LBE94: + 349 .LBE93: + 350 .LSM44: + 351 003a DE01 movw r26,r28 + 352 003c 1196 adiw r26,1 + 353 003e E0E0 ldi r30,lo8(C.17.3562) + 354 0040 F0E0 ldi r31,hi8(C.17.3562) + 355 0042 88E0 ldi r24,lo8(8) + 356 .L24: + 357 0044 0190 ld r0,Z+ + 358 0046 0D92 st X+,r0 + 359 0048 8150 subi r24,lo8(-(-1)) + 360 004a 01F4 brne .L24 + 361 .LSM45: + 362 004c CE01 movw r24,r28 + 363 004e 0196 adiw r24,1 + 364 0050 68E0 ldi r22,lo8(8) + 365 0052 70E0 ldi r23,hi8(8) + 366 0054 40E0 ldi r20,lo8(0) + 367 0056 50E0 ldi r21,hi8(0) + 368 0058 0E94 0000 call Endpoint_Write_Stream_LE + 369 .LSM46: + 370 005c C801 movw r24,r16 + 371 005e 0E96 adiw r24,14 + 372 0060 61E0 ldi r22,lo8(1) + 373 0062 70E0 ldi r23,hi8(1) + 374 0064 40E0 ldi r20,lo8(0) + 375 0066 50E0 ldi r21,hi8(0) + 376 0068 0E94 0000 call Endpoint_Write_Stream_LE + 377 .LBB95: + 378 .LBB96: + 379 .LSM47: + 380 006c 8091 E800 lds r24,232 + 381 0070 8E77 andi r24,lo8(126) + 382 0072 8093 E800 sts 232,r24 + 383 .L25: + 384 /* epilogue start */ + 385 .LBE96: + 386 .LBE95: + 387 .LSM48: + 388 0076 2896 adiw r28,8 + 389 0078 0FB6 in __tmp_reg__,__SREG__ + 390 007a F894 cli + 391 007c DEBF out __SP_H__,r29 + 392 007e 0FBE out __SREG__,__tmp_reg__ + 393 0080 CDBF out __SP_L__,r28 + 394 0082 CF91 pop r28 + 395 0084 DF91 pop r29 + 396 0086 1F91 pop r17 + 397 0088 0F91 pop r16 + 398 .LVL21: + 399 008a 0895 ret + 400 .LFE90: + 402 .section .text.CDC_Device_SendString,"ax",@progbits + 403 .global CDC_Device_SendString + 405 CDC_Device_SendString: + 406 .LFB85: + 407 .LSM49: + 408 .LVL22: + 409 /* prologue: function */ + 410 /* frame size = 0 */ + 411 0000 FC01 movw r30,r24 + 412 .LSM50: + 413 0002 8091 0000 lds r24,USB_DeviceState + 414 .LVL23: + 415 0006 8430 cpi r24,lo8(4) + 416 0008 01F4 brne .L28 + 417 000a 8785 ldd r24,Z+15 + 418 000c 9089 ldd r25,Z+16 + 419 000e A189 ldd r26,Z+17 + 420 0010 B289 ldd r27,Z+18 + 421 0012 0097 sbiw r24,0 + 422 0014 A105 cpc r26,__zero_reg__ + 423 0016 B105 cpc r27,__zero_reg__ + 424 0018 01F0 breq .L28 + 425 .LSM51: + 426 001a 8181 ldd r24,Z+1 + 427 .LBB97: + 428 .LBB98: + 429 .LSM52: + 430 001c 8093 E900 sts 233,r24 + 431 .LBE98: + 432 .LBE97: + 433 .LSM53: + 434 0020 CB01 movw r24,r22 + 435 0022 BA01 movw r22,r20 + 436 .LVL24: + 437 0024 40E0 ldi r20,lo8(0) + 438 0026 50E0 ldi r21,hi8(0) + 439 .LVL25: + 440 0028 0E94 0000 call Endpoint_Write_Stream_LE + 441 .LVL26: + 442 002c 0895 ret + 443 .LVL27: + 444 .L28: + 445 002e 82E0 ldi r24,lo8(2) + 446 .LSM54: + 447 0030 0895 ret + 448 .LFE85: + 450 .section .text.CDC_Device_Flush,"ax",@progbits + 451 .global CDC_Device_Flush + 453 CDC_Device_Flush: + 454 .LFB87: + 455 .LSM55: + 456 .LVL28: + 457 /* prologue: function */ + 458 /* frame size = 0 */ + 459 0000 FC01 movw r30,r24 + 460 .LSM56: + 461 0002 8091 0000 lds r24,USB_DeviceState + 462 .LVL29: + 463 0006 8430 cpi r24,lo8(4) + 464 0008 01F4 brne .L32 + 465 000a 8785 ldd r24,Z+15 + 466 000c 9089 ldd r25,Z+16 + 467 000e A189 ldd r26,Z+17 + 468 0010 B289 ldd r27,Z+18 + 469 0012 0097 sbiw r24,0 + 470 0014 A105 cpc r26,__zero_reg__ + 471 0016 B105 cpc r27,__zero_reg__ + 472 0018 01F0 breq .L32 + 473 .LSM57: + 474 001a 8181 ldd r24,Z+1 + 475 .LBB99: + 476 .LBB100: + 477 .LSM58: + 478 001c 8093 E900 sts 233,r24 + 479 .LBE100: + 480 .LBE99: + 481 .LBB101: + 482 .LBB102: + 483 .LSM59: + 484 0020 8091 F200 lds r24,242 + 485 .LBE102: + 486 .LBE101: + 487 .LSM60: + 488 0024 8823 tst r24 + 489 0026 01F0 breq .L33 + 490 .LBB103: + 491 .LBB104: + 492 .LSM61: + 493 0028 9091 E800 lds r25,232 + 494 .LBE104: + 495 .LBE103: + 496 .LBB105: + 497 .LBB106: + 498 .LSM62: + 499 002c 8091 E800 lds r24,232 + 500 0030 8E77 andi r24,lo8(126) + 501 0032 8093 E800 sts 232,r24 + 502 .LBE106: + 503 .LBE105: + 504 .LSM63: + 505 0036 95FD sbrc r25,5 + 506 0038 00C0 rjmp .L33 + 507 .LSM64: + 508 003a 0E94 0000 call Endpoint_WaitUntilReady + 509 .LVL30: + 510 003e 982F mov r25,r24 + 511 .LVL31: + 512 0040 8823 tst r24 + 513 0042 01F4 brne .L34 + 514 .LVL32: + 515 .LBB107: + 516 .LBB108: + 517 .LSM65: + 518 0044 8091 E800 lds r24,232 + 519 .LVL33: + 520 0048 8E77 andi r24,lo8(126) + 521 004a 8093 E800 sts 232,r24 + 522 004e 00C0 rjmp .L34 + 523 .LVL34: + 524 .L32: + 525 0050 92E0 ldi r25,lo8(2) + 526 .LVL35: + 527 0052 00C0 rjmp .L34 + 528 .LVL36: + 529 .L33: + 530 0054 90E0 ldi r25,lo8(0) + 531 .LVL37: + 532 .L34: + 533 .LBE108: + 534 .LBE107: + 535 .LSM66: + 536 0056 892F mov r24,r25 + 537 /* epilogue start */ + 538 0058 0895 ret + 539 .LFE87: + 541 .section .text.CDC_Device_USBTask,"ax",@progbits + 542 .global CDC_Device_USBTask + 544 CDC_Device_USBTask: + 545 .LFB84: + 546 .LSM67: + 547 .LVL38: + 548 /* prologue: function */ + 549 /* frame size = 0 */ + 550 0000 FC01 movw r30,r24 + 551 .LSM68: + 552 0002 8091 0000 lds r24,USB_DeviceState + 553 .LVL39: + 554 0006 8430 cpi r24,lo8(4) + 555 0008 01F4 brne .L38 + 556 000a 8785 ldd r24,Z+15 + 557 000c 9089 ldd r25,Z+16 + 558 000e A189 ldd r26,Z+17 + 559 0010 B289 ldd r27,Z+18 + 560 0012 0097 sbiw r24,0 + 561 0014 A105 cpc r26,__zero_reg__ + 562 0016 B105 cpc r27,__zero_reg__ + 563 0018 01F0 breq .L38 + 564 .LSM69: + 565 001a CF01 movw r24,r30 + 566 001c 0E94 0000 call CDC_Device_Flush + 567 .LVL40: + 568 .L38: + 569 0020 0895 ret + 570 .LFE84: + 572 .section .text.CDC_Device_getchar_Blocking,"ax",@progbits + 574 CDC_Device_getchar_Blocking: + 575 .LFB95: + 576 .LSM70: + 577 .LVL41: + 578 0000 CF93 push r28 + 579 0002 DF93 push r29 + 580 /* prologue: function */ + 581 /* frame size = 0 */ + 582 0004 EC01 movw r28,r24 + 583 0006 00C0 rjmp .L40 + 584 .LVL42: + 585 .L43: + 586 .LSM71: + 587 0008 8091 0000 lds r24,USB_DeviceState + 588 .LVL43: + 589 000c 8823 tst r24 + 590 000e 01F4 brne .L41 + 591 0010 2EEF ldi r18,lo8(-2) + 592 0012 3FEF ldi r19,hi8(-2) + 593 0014 00C0 rjmp .L42 + 594 .L41: + 595 .LSM72: + 596 0016 8C85 ldd r24,Y+12 + 597 0018 9D85 ldd r25,Y+13 + 598 001a 0E94 0000 call CDC_Device_USBTask + 599 .LVL44: + 600 .LSM73: + 601 001e 0E94 0000 call USB_USBTask + 602 .LVL45: + 603 .L40: + 604 .LSM74: + 605 0022 8C85 ldd r24,Y+12 + 606 0024 9D85 ldd r25,Y+13 + 607 0026 0E94 0000 call CDC_Device_ReceiveByte + 608 002a 9C01 movw r18,r24 + 609 .LVL46: + 610 002c 97FD sbrc r25,7 + 611 002e 00C0 rjmp .L43 + 612 .L42: + 613 .LSM75: + 614 0030 C901 movw r24,r18 + 615 .LVL47: + 616 /* epilogue start */ + 617 0032 DF91 pop r29 + 618 0034 CF91 pop r28 + 619 .LVL48: + 620 0036 0895 ret + 621 .LFE95: + 623 .section .text.CDC_Device_SendByte,"ax",@progbits + 624 .global CDC_Device_SendByte + 626 CDC_Device_SendByte: + 627 .LFB86: + 628 .LSM76: + 629 .LVL49: + 630 0000 1F93 push r17 + 631 /* prologue: function */ + 632 /* frame size = 0 */ + 633 0002 FC01 movw r30,r24 + 634 0004 162F mov r17,r22 + 635 .LSM77: + 636 0006 8091 0000 lds r24,USB_DeviceState + 637 .LVL50: + 638 000a 8430 cpi r24,lo8(4) + 639 000c 01F4 brne .L46 + 640 .LVL51: + 641 000e 8785 ldd r24,Z+15 + 642 0010 9089 ldd r25,Z+16 + 643 0012 A189 ldd r26,Z+17 + 644 0014 B289 ldd r27,Z+18 + 645 0016 0097 sbiw r24,0 + 646 0018 A105 cpc r26,__zero_reg__ + 647 001a B105 cpc r27,__zero_reg__ + 648 001c 01F0 breq .L46 + 649 .LSM78: + 650 001e 8181 ldd r24,Z+1 + 651 .LBB109: + 652 .LBB110: + 653 .LSM79: + 654 0020 8093 E900 sts 233,r24 + 655 .LBE110: + 656 .LBE109: + 657 .LBB111: + 658 .LBB112: + 659 .LSM80: + 660 0024 8091 E800 lds r24,232 + 661 .LBE112: + 662 .LBE111: + 663 .LSM81: + 664 0028 85FD sbrc r24,5 + 665 002a 00C0 rjmp .L47 + 666 .LBB113: + 667 .LBB114: + 668 .LBB115: + 669 .LSM82: + 670 002c 8091 E800 lds r24,232 + 671 0030 8E77 andi r24,lo8(126) + 672 0032 8093 E800 sts 232,r24 + 673 .LBE115: + 674 .LBE114: + 675 .LSM83: + 676 0036 0E94 0000 call Endpoint_WaitUntilReady + 677 .LVL52: + 678 003a 8823 tst r24 + 679 .LVL53: + 680 003c 01F4 brne .L48 + 681 .LVL54: + 682 .L47: + 683 .LBE113: + 684 .LBB116: + 685 .LBB117: + 686 .LSM84: + 687 003e 1093 F100 sts 241,r17 + 688 0042 80E0 ldi r24,lo8(0) + 689 0044 00C0 rjmp .L48 + 690 .LVL55: + 691 .L46: + 692 .LSM85: + 693 0046 82E0 ldi r24,lo8(2) + 694 .LVL56: + 695 .L48: + 696 .LVL57: + 697 /* epilogue start */ + 698 .LBE117: + 699 .LBE116: + 700 .LSM86: + 701 0048 1F91 pop r17 + 702 .LVL58: + 703 004a 0895 ret + 704 .LFE86: + 706 .section .text.CDC_Device_putchar,"ax",@progbits + 708 CDC_Device_putchar: + 709 .LFB93: + 710 .LSM87: + 711 .LVL59: + 712 /* prologue: function */ + 713 /* frame size = 0 */ + 714 0000 282F mov r18,r24 + 715 0002 FB01 movw r30,r22 + 716 .LSM88: + 717 0004 8485 ldd r24,Z+12 + 718 0006 9585 ldd r25,Z+13 + 719 .LVL60: + 720 0008 622F mov r22,r18 + 721 .LVL61: + 722 000a 0E94 0000 call CDC_Device_SendByte + 723 .LVL62: + 724 000e 8823 tst r24 + 725 0010 01F4 brne .L51 + 726 0012 20E0 ldi r18,lo8(0) + 727 0014 30E0 ldi r19,hi8(0) + 728 0016 00C0 rjmp .L52 + 729 .L51: + 730 0018 2FEF ldi r18,lo8(-1) + 731 001a 3FEF ldi r19,hi8(-1) + 732 .L52: + 733 .LSM89: + 734 001c C901 movw r24,r18 + 735 /* epilogue start */ + 736 001e 0895 ret + 737 .LFE93: + 739 .section .text.CDC_Device_ConfigureEndpoints,"ax",@progbits + 740 .global CDC_Device_ConfigureEndpoints + 742 CDC_Device_ConfigureEndpoints: + 743 .LFB83: + 744 .LSM90: + 745 .LVL63: + 746 0000 1F93 push r17 + 747 0002 CF93 push r28 + 748 0004 DF93 push r29 + 749 /* prologue: function */ + 750 /* frame size = 0 */ + 751 0006 EC01 movw r28,r24 + 752 .LSM91: + 753 0008 0D96 adiw r24,13 + 754 .LVL64: + 755 000a FC01 movw r30,r24 + 756 000c 89E0 ldi r24,lo8(9) + 757 000e DF01 movw r26,r30 + 758 0010 1D92 st X+,__zero_reg__ + 759 0012 8A95 dec r24 + 760 0014 01F4 brne .-6 + 761 0016 11E0 ldi r17,lo8(1) + 762 .LVL65: + 763 .L64: + 764 .LBB118: + 765 .LBB119: + 766 .LSM92: + 767 0018 8981 ldd r24,Y+1 + 768 001a 1817 cp r17,r24 + 769 001c 01F4 brne .L55 + 770 .LSM93: + 771 001e EA81 ldd r30,Y+2 + 772 0020 FB81 ldd r31,Y+3 + 773 .LVL66: + 774 .LSM94: + 775 0022 8C81 ldd r24,Y+4 + 776 .LVL67: + 777 0024 62E0 ldi r22,lo8(2) + 778 .LVL68: + 779 0026 00C0 rjmp .L67 + 780 .LVL69: + 781 .L55: + 782 .LSM95: + 783 0028 8D81 ldd r24,Y+5 + 784 002a 1817 cp r17,r24 + 785 002c 01F4 brne .L57 + 786 .LSM96: + 787 002e EE81 ldd r30,Y+6 + 788 0030 FF81 ldd r31,Y+7 + 789 .LVL70: + 790 .LSM97: + 791 0032 8885 ldd r24,Y+8 + 792 .LVL71: + 793 0034 62E0 ldi r22,lo8(2) + 794 .LVL72: + 795 0036 30E0 ldi r19,lo8(0) + 796 .LVL73: + 797 0038 00C0 rjmp .L56 + 798 .LVL74: + 799 .L57: + 800 .LSM98: + 801 003a 8985 ldd r24,Y+9 + 802 003c 1817 cp r17,r24 + 803 003e 01F4 brne .L58 + 804 .LSM99: + 805 0040 EA85 ldd r30,Y+10 + 806 0042 FB85 ldd r31,Y+11 + 807 .LVL75: + 808 .LSM100: + 809 0044 8C85 ldd r24,Y+12 + 810 .LVL76: + 811 0046 63E0 ldi r22,lo8(3) + 812 .LVL77: + 813 .L67: + 814 0048 31E0 ldi r19,lo8(1) + 815 .LVL78: + 816 .L56: + 817 .LSM101: + 818 004a 8823 tst r24 + 819 004c 01F4 brne .L59 + 820 004e 40E0 ldi r20,lo8(0) + 821 0050 00C0 rjmp .L60 + 822 .L59: + 823 0052 44E0 ldi r20,lo8(4) + 824 .L60: + 825 0054 20E0 ldi r18,lo8(0) + 826 .LVL79: + 827 0056 88E0 ldi r24,lo8(8) + 828 0058 90E0 ldi r25,hi8(8) + 829 .LVL80: + 830 005a 00C0 rjmp .L61 + 831 .L62: + 832 .LBB120: + 833 .LBB121: + 834 .LBB122: + 835 .LBB123: + 836 .LSM102: + 837 005c 2F5F subi r18,lo8(-(1)) + 838 .LSM103: + 839 005e 880F lsl r24 + 840 0060 991F rol r25 + 841 .L61: + 842 .LSM104: + 843 0062 8E17 cp r24,r30 + 844 0064 9F07 cpc r25,r31 + 845 0066 00F0 brlo .L62 + 846 .LBE123: + 847 .LBE122: + 848 .LBE121: + 849 .LSM105: + 850 0068 6295 swap r22 + 851 006a 660F lsl r22 + 852 006c 660F lsl r22 + 853 006e 607C andi r22,lo8(-64) + 854 0070 632B or r22,r19 + 855 0072 4260 ori r20,lo8(2) + 856 0074 2295 swap r18 + 857 0076 207F andi r18,lo8(-16) + 858 0078 422B or r20,r18 + 859 007a 812F mov r24,r17 + 860 .LVL81: + 861 007c 0E94 0000 call Endpoint_ConfigureEndpoint_Prv + 862 .LVL82: + 863 .LBE120: + 864 .LSM106: + 865 0080 8823 tst r24 + 866 0082 01F0 breq .L63 + 867 .L58: + 868 .LBE119: + 869 .LSM107: + 870 0084 1F5F subi r17,lo8(-(1)) + 871 0086 1530 cpi r17,lo8(5) + 872 0088 01F4 brne .L64 + 873 008a 81E0 ldi r24,lo8(1) + 874 .L63: + 875 /* epilogue start */ + 876 .LBE118: + 877 .LSM108: + 878 008c DF91 pop r29 + 879 008e CF91 pop r28 + 880 .LVL83: + 881 0090 1F91 pop r17 + 882 .LVL84: + 883 0092 0895 ret + 884 .LFE83: + 886 .section .text.CDC_Device_ProcessControlRequest,"ax",@progbits + 887 .global CDC_Device_ProcessControlRequest + 889 CDC_Device_ProcessControlRequest: + 890 .LFB82: + 891 .LSM109: + 892 .LVL85: + 893 0000 CF93 push r28 + 894 0002 DF93 push r29 + 895 /* prologue: function */ + 896 /* frame size = 0 */ + 897 0004 EC01 movw r28,r24 + 898 .LBB124: + 899 .LBB125: + 900 .LSM110: + 901 0006 8091 E800 lds r24,232 + 902 .LVL86: + 903 .LBE125: + 904 .LBE124: + 905 .LSM111: + 906 000a 83FF sbrs r24,3 + 907 000c 00C0 rjmp .L75 + 908 .LSM112: + 909 000e 8881 ld r24,Y + 910 0010 90E0 ldi r25,lo8(0) + 911 0012 2091 0000 lds r18,USB_ControlRequest+4 + 912 0016 3091 0000 lds r19,(USB_ControlRequest+4)+1 + 913 001a 2817 cp r18,r24 + 914 001c 3907 cpc r19,r25 + 915 001e 01F0 breq .+2 + 916 0020 00C0 rjmp .L75 + 917 .LSM113: + 918 0022 8091 0000 lds r24,USB_ControlRequest+1 + 919 0026 8132 cpi r24,lo8(33) + 920 0028 01F0 breq .L71 + 921 002a 8232 cpi r24,lo8(34) + 922 002c 00F4 brsh .L74 + 923 002e 8032 cpi r24,lo8(32) + 924 0030 01F0 breq .+2 + 925 0032 00C0 rjmp .L75 + 926 0034 00C0 rjmp .L76 + 927 .L74: + 928 0036 8232 cpi r24,lo8(34) + 929 0038 01F0 breq .L72 + 930 003a 8332 cpi r24,lo8(35) + 931 003c 01F0 breq .+2 + 932 003e 00C0 rjmp .L75 + 933 0040 00C0 rjmp .L77 + 934 .L71: + 935 .LSM114: + 936 0042 8091 0000 lds r24,USB_ControlRequest + 937 0046 813A cpi r24,lo8(-95) + 938 0048 01F0 breq .+2 + 939 004a 00C0 rjmp .L75 + 940 .LBB126: + 941 .LBB127: + 942 .LSM115: + 943 004c 8091 E800 lds r24,232 + 944 0050 877F andi r24,lo8(-9) + 945 0052 8093 E800 sts 232,r24 + 946 .LBE127: + 947 .LBE126: + 948 .LSM116: + 949 0056 CE01 movw r24,r28 + 950 0058 0F96 adiw r24,15 + 951 005a 67E0 ldi r22,lo8(7) + 952 005c 70E0 ldi r23,hi8(7) + 953 005e 0E94 0000 call Endpoint_Write_Control_Stream_LE + 954 .LBB128: + 955 .LBB129: + 956 .LSM117: + 957 0062 8091 E800 lds r24,232 + 958 0066 8B77 andi r24,lo8(123) + 959 0068 8093 E800 sts 232,r24 + 960 006c 00C0 rjmp .L75 + 961 .L76: + 962 .LBE129: + 963 .LBE128: + 964 .LSM118: + 965 006e 8091 0000 lds r24,USB_ControlRequest + 966 0072 8132 cpi r24,lo8(33) + 967 0074 01F4 brne .L75 + 968 .LBB130: + 969 .LBB131: + 970 .LSM119: + 971 0076 8091 E800 lds r24,232 + 972 007a 877F andi r24,lo8(-9) + 973 007c 8093 E800 sts 232,r24 + 974 .LBE131: + 975 .LBE130: + 976 .LSM120: + 977 0080 CE01 movw r24,r28 + 978 0082 0F96 adiw r24,15 + 979 0084 67E0 ldi r22,lo8(7) + 980 0086 70E0 ldi r23,hi8(7) + 981 0088 0E94 0000 call Endpoint_Read_Control_Stream_LE + 982 .LBB132: + 983 .LBB133: + 984 .LSM121: + 985 008c 8091 E800 lds r24,232 + 986 0090 8E77 andi r24,lo8(126) + 987 0092 8093 E800 sts 232,r24 + 988 .LBE133: + 989 .LBE132: + 990 .LSM122: + 991 0096 CE01 movw r24,r28 + 992 0098 0E94 0000 call EVENT_CDC_Device_LineEncodingChanged + 993 009c 00C0 rjmp .L75 + 994 .L72: + 995 .LSM123: + 996 009e 8091 0000 lds r24,USB_ControlRequest + 997 00a2 8132 cpi r24,lo8(33) + 998 00a4 01F4 brne .L75 + 999 .LBB134: + 1000 .LBB135: + 1001 .LSM124: + 1002 00a6 8091 E800 lds r24,232 + 1003 00aa 877F andi r24,lo8(-9) + 1004 00ac 8093 E800 sts 232,r24 + 1005 .LBE135: + 1006 .LBE134: + 1007 .LSM125: + 1008 00b0 0E94 0000 call Endpoint_ClearStatusStage + 1009 .LSM126: + 1010 00b4 8091 0000 lds r24,USB_ControlRequest+2 + 1011 00b8 8D87 std Y+13,r24 + 1012 .LSM127: + 1013 00ba CE01 movw r24,r28 + 1014 00bc 0E94 0000 call EVENT_CDC_Device_ControLineStateChanged + 1015 00c0 00C0 rjmp .L75 + 1016 .L77: + 1017 .LSM128: + 1018 00c2 8091 0000 lds r24,USB_ControlRequest + 1019 00c6 8132 cpi r24,lo8(33) + 1020 00c8 01F4 brne .L75 + 1021 .LBB136: + 1022 .LBB137: + 1023 .LSM129: + 1024 00ca 8091 E800 lds r24,232 + 1025 00ce 877F andi r24,lo8(-9) + 1026 00d0 8093 E800 sts 232,r24 + 1027 .LBE137: + 1028 .LBE136: + 1029 .LSM130: + 1030 00d4 0E94 0000 call Endpoint_ClearStatusStage + 1031 .LSM131: + 1032 00d8 CE01 movw r24,r28 + 1033 00da 6091 0000 lds r22,USB_ControlRequest+2 + 1034 00de 0E94 0000 call EVENT_CDC_Device_BreakSent + 1035 .L75: + 1036 /* epilogue start */ + 1037 .LSM132: + 1038 00e2 DF91 pop r29 + 1039 00e4 CF91 pop r28 + 1040 .LVL87: + 1041 00e6 0895 ret + 1042 .LFE82: + 1044 .data + 1047 C.17.3562: + 1048 0000 A1 .byte -95 + 1049 0001 20 .byte 32 + 1050 0002 0000 .word 0 + 1051 0004 0000 .word 0 + 1052 0006 0100 .word 1 + 1053 .weak EVENT_CDC_Device_LineEncodingChanged + 1054 .set EVENT_CDC_Device_LineEncodingChanged,CDC_Device_Event_Stub + 1055 .weak EVENT_CDC_Device_ControLineStateChanged + 1056 .set EVENT_CDC_Device_ControLineStateChanged,CDC_Device_Event_Stub + 1057 .weak EVENT_CDC_Device_BreakSent + 1058 .set EVENT_CDC_Device_BreakSent,CDC_Device_Event_Stub + 1195 .Letext0: +DEFINED SYMBOLS + *ABS*:0000000000000000 CDC.c + /tmp/cc6wpRq4.s:2 *ABS*:000000000000003f __SREG__ + /tmp/cc6wpRq4.s:3 *ABS*:000000000000003e __SP_H__ + /tmp/cc6wpRq4.s:4 *ABS*:000000000000003d __SP_L__ + /tmp/cc6wpRq4.s:5 *ABS*:0000000000000034 __CCP__ + /tmp/cc6wpRq4.s:6 *ABS*:0000000000000000 __tmp_reg__ + /tmp/cc6wpRq4.s:7 *ABS*:0000000000000001 __zero_reg__ + /tmp/cc6wpRq4.s:19 .text.CDC_Device_Event_Stub:0000000000000000 CDC_Device_Event_Stub + /tmp/cc6wpRq4.s:32 .text.CDC_Device_BytesReceived:0000000000000000 CDC_Device_BytesReceived + /tmp/cc6wpRq4.s:111 .text.CDC_Device_ReceiveByte:0000000000000000 CDC_Device_ReceiveByte + /tmp/cc6wpRq4.s:210 .text.CDC_Device_CreateStream:0000000000000000 CDC_Device_CreateStream + /tmp/cc6wpRq4.s:708 .text.CDC_Device_putchar:0000000000000000 CDC_Device_putchar + /tmp/cc6wpRq4.s:277 .text.CDC_Device_getchar:0000000000000000 CDC_Device_getchar + /tmp/cc6wpRq4.s:244 .text.CDC_Device_CreateBlockingStream:0000000000000000 CDC_Device_CreateBlockingStream + /tmp/cc6wpRq4.s:574 .text.CDC_Device_getchar_Blocking:0000000000000000 CDC_Device_getchar_Blocking + /tmp/cc6wpRq4.s:309 .text.CDC_Device_SendControlLineStateChange:0000000000000000 CDC_Device_SendControlLineStateChange + /tmp/cc6wpRq4.s:1047 .data:0000000000000000 C.17.3562 + /tmp/cc6wpRq4.s:405 .text.CDC_Device_SendString:0000000000000000 CDC_Device_SendString + /tmp/cc6wpRq4.s:453 .text.CDC_Device_Flush:0000000000000000 CDC_Device_Flush + /tmp/cc6wpRq4.s:544 .text.CDC_Device_USBTask:0000000000000000 CDC_Device_USBTask + /tmp/cc6wpRq4.s:626 .text.CDC_Device_SendByte:0000000000000000 CDC_Device_SendByte + /tmp/cc6wpRq4.s:742 .text.CDC_Device_ConfigureEndpoints:0000000000000000 CDC_Device_ConfigureEndpoints + /tmp/cc6wpRq4.s:889 .text.CDC_Device_ProcessControlRequest:0000000000000000 CDC_Device_ProcessControlRequest + /tmp/cc6wpRq4.s:19 .text.CDC_Device_Event_Stub:0000000000000000 EVENT_CDC_Device_LineEncodingChanged + /tmp/cc6wpRq4.s:19 .text.CDC_Device_Event_Stub:0000000000000000 EVENT_CDC_Device_ControLineStateChanged + /tmp/cc6wpRq4.s:19 .text.CDC_Device_Event_Stub:0000000000000000 EVENT_CDC_Device_BreakSent + +UNDEFINED SYMBOLS +USB_DeviceState +Endpoint_Write_Stream_LE +Endpoint_WaitUntilReady +USB_USBTask +Endpoint_ConfigureEndpoint_Prv +USB_ControlRequest +Endpoint_Write_Control_Stream_LE +Endpoint_Read_Control_Stream_LE +Endpoint_ClearStatusStage +__do_copy_data diff --git a/firmware/LUFA/Drivers/USB/Class/Device/CDC.o b/firmware/LUFA/Drivers/USB/Class/Device/CDC.o new file mode 100644 index 0000000..4e47b49 Binary files /dev/null and b/firmware/LUFA/Drivers/USB/Class/Device/CDC.o differ diff --git a/firmware/LUFA/Drivers/USB/Class/Device/HID.c b/firmware/LUFA/Drivers/USB/Class/Device/HID.c new file mode 100644 index 0000000..f538610 --- /dev/null +++ b/firmware/LUFA/Drivers/USB/Class/Device/HID.c @@ -0,0 +1,190 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2010 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. +*/ + +#define __INCLUDE_FROM_USB_DRIVER +#include "../../HighLevel/USBMode.h" +#if defined(USB_CAN_BE_DEVICE) + +#define __INCLUDE_FROM_HID_DRIVER +#define __INCLUDE_FROM_HID_DEVICE_C +#include "HID.h" + +void HID_Device_ProcessControlRequest(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) +{ + if (!(Endpoint_IsSETUPReceived())) + return; + + if (USB_ControlRequest.wIndex != HIDInterfaceInfo->Config.InterfaceNumber) + return; + + switch (USB_ControlRequest.bRequest) + { + case HID_REQ_GetReport: + if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) + { + uint16_t ReportSize = 0; + uint8_t ReportID = (USB_ControlRequest.wValue & 0xFF); + uint8_t ReportType = (USB_ControlRequest.wValue >> 8) - 1; + uint8_t ReportData[HIDInterfaceInfo->Config.PrevReportINBufferSize]; + + memset(ReportData, 0, sizeof(ReportData)); + + CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, ReportType, ReportData, &ReportSize); + + if (HIDInterfaceInfo->Config.PrevReportINBuffer != NULL) + memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportData, HIDInterfaceInfo->Config.PrevReportINBufferSize); + + Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + + Endpoint_ClearSETUP(); + Endpoint_Write_Control_Stream_LE(ReportData, ReportSize); + Endpoint_ClearOUT(); + } + + break; + case HID_REQ_SetReport: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + uint16_t ReportSize = USB_ControlRequest.wLength; + uint8_t ReportID = (USB_ControlRequest.wValue & 0xFF); + uint8_t ReportType = (USB_ControlRequest.wValue >> 8) - 1; + uint8_t ReportData[ReportSize]; + + Endpoint_ClearSETUP(); + Endpoint_Read_Control_Stream_LE(ReportData, ReportSize); + Endpoint_ClearIN(); + + CALLBACK_HID_Device_ProcessHIDReport(HIDInterfaceInfo, ReportID, ReportType, ReportData, ReportSize); + } + + break; + case HID_REQ_GetProtocol: + if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + Endpoint_Write_Byte(HIDInterfaceInfo->State.UsingReportProtocol); + Endpoint_ClearIN(); + Endpoint_ClearStatusStage(); + } + + break; + case HID_REQ_SetProtocol: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + Endpoint_ClearStatusStage(); + + HIDInterfaceInfo->State.UsingReportProtocol = ((USB_ControlRequest.wValue & 0xFF) != 0x00); + } + + break; + case HID_REQ_SetIdle: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + Endpoint_ClearStatusStage(); + + HIDInterfaceInfo->State.IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6); + } + + break; + case HID_REQ_GetIdle: + if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + Endpoint_Write_Byte(HIDInterfaceInfo->State.IdleCount >> 2); + Endpoint_ClearIN(); + Endpoint_ClearStatusStage(); + } + + break; + } +} + +bool HID_Device_ConfigureEndpoints(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) +{ + memset(&HIDInterfaceInfo->State, 0x00, sizeof(HIDInterfaceInfo->State)); + HIDInterfaceInfo->State.UsingReportProtocol = true; + HIDInterfaceInfo->State.IdleCount = 500; + + if (!(Endpoint_ConfigureEndpoint(HIDInterfaceInfo->Config.ReportINEndpointNumber, EP_TYPE_INTERRUPT, + ENDPOINT_DIR_IN, HIDInterfaceInfo->Config.ReportINEndpointSize, + HIDInterfaceInfo->Config.ReportINEndpointDoubleBank ? ENDPOINT_BANK_DOUBLE : ENDPOINT_BANK_SINGLE))) + { + return false; + } + + return true; +} + +void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) +{ + if (USB_DeviceState != DEVICE_STATE_Configured) + return; + + Endpoint_SelectEndpoint(HIDInterfaceInfo->Config.ReportINEndpointNumber); + + if (Endpoint_IsReadWriteAllowed()) + { + uint8_t ReportINData[HIDInterfaceInfo->Config.PrevReportINBufferSize]; + uint8_t ReportID = 0; + uint16_t ReportINSize = 0; + + memset(ReportINData, 0, sizeof(ReportINData)); + + bool ForceSend = CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, HID_REPORT_ITEM_In, + ReportINData, &ReportINSize); + bool StatesChanged = false; + bool IdlePeriodElapsed = (HIDInterfaceInfo->State.IdleCount && !(HIDInterfaceInfo->State.IdleMSRemaining)); + + if (HIDInterfaceInfo->Config.PrevReportINBuffer != NULL) + { + StatesChanged = (memcmp(ReportINData, HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINSize) != 0); + memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINData, HIDInterfaceInfo->Config.PrevReportINBufferSize); + } + + if (ReportINSize && (ForceSend || StatesChanged || IdlePeriodElapsed)) + { + HIDInterfaceInfo->State.IdleMSRemaining = HIDInterfaceInfo->State.IdleCount; + + Endpoint_SelectEndpoint(HIDInterfaceInfo->Config.ReportINEndpointNumber); + + if (ReportID) + Endpoint_Write_Byte(ReportID); + + Endpoint_Write_Stream_LE(ReportINData, ReportINSize, NO_STREAM_CALLBACK); + + Endpoint_ClearIN(); + } + } +} + +#endif + diff --git a/firmware/LUFA/Drivers/USB/Class/Device/HID.h b/firmware/LUFA/Drivers/USB/Class/Device/HID.h new file mode 100644 index 0000000..49358f5 --- /dev/null +++ b/firmware/LUFA/Drivers/USB/Class/Device/HID.h @@ -0,0 +1,222 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief Device mode driver for the library USB HID Class driver. + * + * Device mode driver for the library USB HID Class driver. + * + * \note This file should not be included directly. It is automatically included as needed by the USB module driver + * dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassHID + * @defgroup Group_USBClassHIDDevice HID Class Device Mode Driver + * + * \section Sec_Dependencies Module Source Dependencies + * The following files must be built with any user project that uses this module: + * - LUFA/Drivers/USB/Class/Device/HID.c (Makefile source module name: LUFA_SRC_USBCLASS) + * + * \section Module Description + * Device Mode USB Class driver framework interface, for the HID USB Class driver. + * + * @{ + */ + +#ifndef _HID_CLASS_DEVICE_H_ +#define _HID_CLASS_DEVICE_H_ + + /* Includes: */ + #include "../../USB.h" + #include "../Common/HID.h" + + #include + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(__INCLUDE_FROM_HID_DRIVER) + #error Do not include this file directly. Include LUFA/Drivers/USB.h instead. + #endif + + #if defined(__INCLUDE_FROM_HID_DEVICE_C) && defined(NO_STREAM_CALLBACKS) + #error The NO_STREAM_CALLBACKS compile time option cannot be used in projects using the library Class drivers. + #endif + + + /* Public Interface - May be used in end-application: */ + /* Type Defines: */ + /** \brief HID Class Device Mode Configuration and State Structure. + * + * Class state structure. An instance of this structure should be made for each HID interface + * within the user application, and passed to each of the HID class driver functions as the + * HIDInterfaceInfo parameter. This stores each HID interface's configuration and state information. + * + * \note Due to technical limitations, the HID device class driver does not utilize a separate OUT + * endpoint for host->device communications. Instead, the host->device data (if any) is sent to + * the device via the control endpoint. + */ + typedef struct + { + const struct + { + uint8_t InterfaceNumber; /**< Interface number of the HID interface within the device. */ + + uint8_t ReportINEndpointNumber; /**< Endpoint number of the HID interface's IN report endpoint. */ + uint16_t ReportINEndpointSize; /**< Size in bytes of the HID interface's IN report endpoint. */ + bool ReportINEndpointDoubleBank; /**< Indicates if the HID interface's IN report endpoint should use double banking. */ + + void* PrevReportINBuffer; /**< Pointer to a buffer where the previously created HID input report can be + * stored by the driver, for comparison purposes to detect report changes that + * must be sent immediately to the host. This should point to a buffer big enough + * to hold the largest HID input report sent from the HID interface. If this is set + * to NULL, it is up to the user to force transfers when needed in the + * \ref CALLBACK_HID_Device_CreateHIDReport() callback function. + * + * \note Due to the single buffer, the internal driver can only correctly compare + * subsequent reports with identical report IDs. In multiple report devices, + * this buffer should be set to NULL and the decision to send reports made + * by the user application instead. + */ + uint8_t PrevReportINBufferSize; /**< Size in bytes of the given input report buffer. This is used to create a + * second buffer of the same size within the driver so that subsequent reports + * can be compared. If the user app is to determine when reports are to be sent + * exclusively (i.e. \ref PrevReportINBuffer is NULL) this value must still be + * set to the size of the largest report the device can issue to the host. + */ + } Config; /**< Config data for the USB class interface within the device. All elements in this section + * must be set or the interface will fail to enumerate and operate correctly. + */ + struct + { + bool UsingReportProtocol; /**< Indicates if the HID interface is set to Boot or Report protocol mode. */ + uint16_t IdleCount; /**< Report idle period, in milliseconds, set by the host. */ + uint16_t IdleMSRemaining; /**< Total number of milliseconds remaining before the idle period elapsed - this + * should be decremented by the user application if non-zero each millisecond. */ + } State; /**< State data for the USB class interface within the device. All elements in this section + * are reset to their defaults when the interface is enumerated. + */ + } USB_ClassInfo_HID_Device_t; + + /* Function Prototypes: */ + /** Configures the endpoints of a given HID interface, ready for use. This should be linked to the library + * \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration + * containing the given HID interface is selected. + * + * \note The endpoint index numbers as given in the interface's configuration structure must not overlap with any other + * interface, or endpoint bank corruption will occur. Gaps in the allocated endpoint numbers or non-sequential indexes + * within a single interface is allowed, but no two interfaces of any type have have interleaved endpoint indexes. + * + * \param[in,out] HIDInterfaceInfo Pointer to a structure containing a HID Class configuration and state. + * + * \return Boolean true if the endpoints were successfully configured, false otherwise. + */ + bool HID_Device_ConfigureEndpoints(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** Processes incoming control requests from the host, that are directed to the given HID class interface. This should be + * linked to the library \ref EVENT_USB_Device_ControlRequest() event. + * + * \param[in,out] HIDInterfaceInfo Pointer to a structure containing a HID Class configuration and state. + */ + void HID_Device_ProcessControlRequest(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** General management task for a given HID class interface, required for the correct operation of the interface. This should + * be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). + * + * \param[in,out] HIDInterfaceInfo Pointer to a structure containing a HID Class configuration and state. + */ + void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** HID class driver callback for the user creation of a HID IN report. This callback may fire in response to either + * HID class control requests from the host, or by the normal HID endpoint polling procedure. Inside this callback the + * user is responsible for the creation of the next HID input report to be sent to the host. + * + * \param[in,out] HIDInterfaceInfo Pointer to a structure containing a HID Class configuration and state. + * \param[in,out] ReportID If preset to a non-zero value, this is the report ID being requested by the host. If zero, + * this should be set to the report ID of the generated HID input report (if any). If multiple + * reports are not sent via the given HID interface, this parameter should be ignored. + * \param[in] ReportType Type of HID report to generate, either \ref HID_REPORT_ITEM_In or \ref HID_REPORT_ITEM_Feature. + * \param[out] ReportData Pointer to a buffer where the generated HID report should be stored. + * \param[out] ReportSize Number of bytes in the generated input report, or zero if no report is to be sent. + * + * \return Boolean true to force the sending of the report even if it is identical to the previous report and still within + * the idle period (useful for devices which report relative movement), false otherwise. + */ + bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, + uint8_t* const ReportID, + const uint8_t ReportType, + void* ReportData, + uint16_t* const ReportSize) ATTR_NON_NULL_PTR_ARG(1) + ATTR_NON_NULL_PTR_ARG(2) ATTR_NON_NULL_PTR_ARG(4) ATTR_NON_NULL_PTR_ARG(5); + + /** HID class driver callback for the user processing of a received HID OUT report. This callback may fire in response to + * either HID class control requests from the host, or by the normal HID endpoint polling procedure. Inside this callback + * the user is responsible for the processing of the received HID output report from the host. + * + * \param[in,out] HIDInterfaceInfo Pointer to a structure containing a HID Class configuration and state. + * \param[in] ReportID Report ID of the received output report. If multiple reports are not received via the given HID + * interface, this parameter should be ignored. + * \param[in] ReportType Type of received HID report, either \ref HID_REPORT_ITEM_Out or \ref HID_REPORT_ITEM_Feature. + * \param[in] ReportData Pointer to a buffer where the received HID report is stored. + * \param[in] ReportSize Size in bytes of the received report from the host. + */ + void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, + const uint8_t ReportID, + const uint8_t ReportType, + const void* ReportData, + const uint16_t ReportSize) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(4); + + /* Inline Functions: */ + /** Indicates that a millisecond of idle time has elapsed on the given HID interface, and the interface's idle count should be + * decremented. This should be called once per millisecond so that hardware key-repeats function correctly. It is recommended + * that this be called by the \ref EVENT_USB_Device_StartOfFrame() event, once SOF events have been enabled via + * \ref USB_Device_EnableSOFEvents(). + * + * \param[in,out] HIDInterfaceInfo Pointer to a structure containing a HID Class configuration and state. + */ + static inline void HID_Device_MillisecondElapsed(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1); + static inline void HID_Device_MillisecondElapsed(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) + { + if (HIDInterfaceInfo->State.IdleMSRemaining) + HIDInterfaceInfo->State.IdleMSRemaining--; + } + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + +/** @} */ + diff --git a/firmware/LUFA/Drivers/USB/Class/Device/HID.lst b/firmware/LUFA/Drivers/USB/Class/Device/HID.lst new file mode 100644 index 0000000..46fb481 --- /dev/null +++ b/firmware/LUFA/Drivers/USB/Class/Device/HID.lst @@ -0,0 +1,769 @@ + 1 .file "HID.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.HID_Device_USBTask,"ax",@progbits + 17 .global HID_Device_USBTask + 19 HID_Device_USBTask: + 20 .LFB83: + 21 .LSM0: + 22 .LVL0: + 23 0000 4F92 push r4 + 24 0002 5F92 push r5 + 25 0004 6F92 push r6 + 26 0006 7F92 push r7 + 27 0008 8F92 push r8 + 28 000a 9F92 push r9 + 29 000c AF92 push r10 + 30 000e BF92 push r11 + 31 0010 CF92 push r12 + 32 0012 DF92 push r13 + 33 0014 EF92 push r14 + 34 0016 FF92 push r15 + 35 0018 0F93 push r16 + 36 001a 1F93 push r17 + 37 001c DF93 push r29 + 38 001e CF93 push r28 + 39 0020 00D0 rcall . + 40 0022 0F92 push __tmp_reg__ + 41 0024 CDB7 in r28,__SP_L__ + 42 0026 DEB7 in r29,__SP_H__ + 43 /* prologue: function */ + 44 /* frame size = 3 */ + 45 0028 7C01 movw r14,r24 + 46 .LSM1: + 47 002a 6DB6 in r6,__SP_L__ + 48 002c 7EB6 in r7,__SP_H__ + 49 .LSM2: + 50 002e 8091 0000 lds r24,USB_DeviceState + 51 .LVL1: + 52 0032 8430 cpi r24,lo8(4) + 53 0034 01F0 breq .+2 + 54 0036 00C0 rjmp .L13 + 55 .LSM3: + 56 0038 F701 movw r30,r14 + 57 003a 8181 ldd r24,Z+1 + 58 .LBB49: + 59 .LBB50: + 60 .LSM4: + 61 003c 8093 E900 sts 233,r24 + 62 .LBE50: + 63 .LBE49: + 64 .LBB51: + 65 .LBB52: + 66 .LSM5: + 67 0040 8091 E800 lds r24,232 + 68 .LBE52: + 69 .LBE51: + 70 .LSM6: + 71 0044 85FF sbrs r24,5 + 72 0046 00C0 rjmp .L13 + 73 0048 5DB6 in r5,__SP_L__ + 74 004a 4EB6 in r4,__SP_H__ + 75 .LBB53: + 76 .LSM7: + 77 004c 4781 ldd r20,Z+7 + 78 004e 8DB7 in r24,__SP_L__ + 79 0050 9EB7 in r25,__SP_H__ + 80 0052 841B sub r24,r20 + 81 0054 9109 sbc r25,__zero_reg__ + 82 0056 0FB6 in __tmp_reg__,__SREG__ + 83 0058 F894 cli + 84 005a 9EBF out __SP_H__,r25 + 85 005c 0FBE out __SREG__,__tmp_reg__ + 86 005e 8DBF out __SP_L__,r24 + 87 0060 0DB7 in r16,__SP_L__ + 88 0062 1EB7 in r17,__SP_H__ + 89 0064 0F5F subi r16,lo8(-(1)) + 90 0066 1F4F sbci r17,hi8(-(1)) + 91 .LSM8: + 92 0068 1982 std Y+1,__zero_reg__ + 93 .LVL2: + 94 .LSM9: + 95 006a 1B82 std Y+3,__zero_reg__ + 96 006c 1A82 std Y+2,__zero_reg__ + 97 .LVL3: + 98 .LSM10: + 99 006e C02E mov r12,r16 + 100 0070 912E mov r9,r17 + 101 0072 C801 movw r24,r16 + 102 0074 60E0 ldi r22,lo8(0) + 103 0076 70E0 ldi r23,hi8(0) + 104 0078 50E0 ldi r21,lo8(0) + 105 007a 0E94 0000 call memset + 106 .LSM11: + 107 007e C701 movw r24,r14 + 108 0080 BE01 movw r22,r28 + 109 0082 6F5F subi r22,lo8(-(1)) + 110 0084 7F4F sbci r23,hi8(-(1)) + 111 0086 40E0 ldi r20,lo8(0) + 112 0088 9801 movw r18,r16 + 113 008a 8E01 movw r16,r28 + 114 008c 0E5F subi r16,lo8(-(2)) + 115 008e 1F4F sbci r17,hi8(-(2)) + 116 0090 0E94 0000 call CALLBACK_HID_Device_CreateHIDReport + 117 0094 882E mov r8,r24 + 118 .LVL4: + 119 .LSM12: + 120 0096 F701 movw r30,r14 + 121 0098 8185 ldd r24,Z+9 + 122 009a 9285 ldd r25,Z+10 + 123 009c 892B or r24,r25 + 124 009e 01F4 brne .L3 + 125 00a0 AA24 clr r10 + 126 00a2 BB24 clr r11 + 127 00a4 00C0 rjmp .L4 + 128 .L3: + 129 00a6 20E0 ldi r18,lo8(0) + 130 00a8 F701 movw r30,r14 + 131 00aa 8385 ldd r24,Z+11 + 132 00ac 9485 ldd r25,Z+12 + 133 00ae 892B or r24,r25 + 134 00b0 01F0 breq .L5 + 135 00b2 21E0 ldi r18,lo8(1) + 136 .L5: + 137 00b4 81E0 ldi r24,lo8(1) + 138 00b6 2827 eor r18,r24 + 139 00b8 A22E mov r10,r18 + 140 00ba BB24 clr r11 + 141 .L4: + 142 .LSM13: + 143 00bc F701 movw r30,r14 + 144 00be 0581 ldd r16,Z+5 + 145 00c0 1681 ldd r17,Z+6 + 146 00c2 0115 cp r16,__zero_reg__ + 147 00c4 1105 cpc r17,__zero_reg__ + 148 00c6 01F4 brne .L6 + 149 00c8 DD24 clr r13 + 150 .LVL5: + 151 00ca 00C0 rjmp .L7 + 152 .LVL6: + 153 .L6: + 154 .LSM14: + 155 00cc 4A81 ldd r20,Y+2 + 156 00ce 5B81 ldd r21,Y+3 + 157 00d0 8C2D mov r24,r12 + 158 00d2 992D mov r25,r9 + 159 00d4 B801 movw r22,r16 + 160 00d6 0E94 0000 call memcmp + 161 00da DD24 clr r13 + 162 .LVL7: + 163 00dc 0097 sbiw r24,0 + 164 00de 01F0 breq .L8 + 165 00e0 DD24 clr r13 + 166 00e2 D394 inc r13 + 167 .L8: + 168 .LSM15: + 169 00e4 F701 movw r30,r14 + 170 00e6 4781 ldd r20,Z+7 + 171 00e8 C801 movw r24,r16 + 172 00ea 6C2D mov r22,r12 + 173 00ec 792D mov r23,r9 + 174 00ee 50E0 ldi r21,lo8(0) + 175 00f0 0E94 0000 call memcpy + 176 .L7: + 177 .LSM16: + 178 00f4 8A81 ldd r24,Y+2 + 179 00f6 9B81 ldd r25,Y+3 + 180 00f8 892B or r24,r25 + 181 00fa 01F0 breq .L10 + 182 .LVL8: + 183 00fc 8820 tst r8 + 184 00fe 01F4 brne .L11 + 185 0100 DD20 tst r13 + 186 0102 01F4 brne .L11 + 187 0104 AB28 or r10,r11 + 188 0106 01F0 breq .L10 + 189 .L11: + 190 .LSM17: + 191 0108 F701 movw r30,r14 + 192 010a 8185 ldd r24,Z+9 + 193 010c 9285 ldd r25,Z+10 + 194 .LVL9: + 195 010e 9487 std Z+12,r25 + 196 0110 8387 std Z+11,r24 + 197 .LSM18: + 198 0112 8181 ldd r24,Z+1 + 199 .LBB54: + 200 .LBB55: + 201 .LSM19: + 202 0114 8093 E900 sts 233,r24 + 203 .LBE55: + 204 .LBE54: + 205 .LSM20: + 206 0118 8981 ldd r24,Y+1 + 207 011a 8823 tst r24 + 208 011c 01F0 breq .L12 + 209 .LBB56: + 210 .LBB57: + 211 .LSM21: + 212 011e 8093 F100 sts 241,r24 + 213 .L12: + 214 .LBE57: + 215 .LBE56: + 216 .LSM22: + 217 0122 6A81 ldd r22,Y+2 + 218 0124 7B81 ldd r23,Y+3 + 219 0126 8C2D mov r24,r12 + 220 0128 992D mov r25,r9 + 221 012a 40E0 ldi r20,lo8(0) + 222 012c 50E0 ldi r21,hi8(0) + 223 012e 0E94 0000 call Endpoint_Write_Stream_LE + 224 .LBB58: + 225 .LBB59: + 226 .LSM23: + 227 0132 8091 E800 lds r24,232 + 228 0136 8E77 andi r24,lo8(126) + 229 0138 8093 E800 sts 232,r24 + 230 .LVL10: + 231 .L10: + 232 013c 852D mov r24,r5 + 233 013e 942D mov r25,r4 + 234 0140 9C01 movw r18,r24 + 235 0142 0FB6 in __tmp_reg__,__SREG__ + 236 0144 F894 cli + 237 0146 3EBF out __SP_H__,r19 + 238 0148 0FBE out __SREG__,__tmp_reg__ + 239 014a 2DBF out __SP_L__,r18 + 240 .L13: + 241 .LBE59: + 242 .LBE58: + 243 .LBE53: + 244 .LSM24: + 245 014c 0FB6 in __tmp_reg__,__SREG__ + 246 014e F894 cli + 247 0150 7EBE out __SP_H__,r7 + 248 0152 0FBE out __SREG__,__tmp_reg__ + 249 0154 6DBE out __SP_L__,r6 + 250 /* epilogue start */ + 251 0156 0F90 pop __tmp_reg__ + 252 0158 0F90 pop __tmp_reg__ + 253 015a 0F90 pop __tmp_reg__ + 254 015c CF91 pop r28 + 255 015e DF91 pop r29 + 256 0160 1F91 pop r17 + 257 0162 0F91 pop r16 + 258 0164 FF90 pop r15 + 259 0166 EF90 pop r14 + 260 .LVL11: + 261 0168 DF90 pop r13 + 262 .LVL12: + 263 016a CF90 pop r12 + 264 016c BF90 pop r11 + 265 016e AF90 pop r10 + 266 0170 9F90 pop r9 + 267 0172 8F90 pop r8 + 268 .LVL13: + 269 0174 7F90 pop r7 + 270 0176 6F90 pop r6 + 271 0178 5F90 pop r5 + 272 017a 4F90 pop r4 + 273 017c 0895 ret + 274 .LFE83: + 276 .section .text.HID_Device_ConfigureEndpoints,"ax",@progbits + 277 .global HID_Device_ConfigureEndpoints + 279 HID_Device_ConfigureEndpoints: + 280 .LFB82: + 281 .LSM25: + 282 .LVL14: + 283 0000 CF93 push r28 + 284 0002 DF93 push r29 + 285 /* prologue: function */ + 286 /* frame size = 0 */ + 287 0004 DC01 movw r26,r24 + 288 .LSM26: + 289 0006 0896 adiw r24,8 + 290 .LVL15: + 291 0008 FC01 movw r30,r24 + 292 000a 85E0 ldi r24,lo8(5) + 293 000c EF01 movw r28,r30 + 294 000e 1992 st Y+,__zero_reg__ + 295 0010 8A95 dec r24 + 296 0012 01F4 brne .-6 + 297 .LSM27: + 298 0014 81E0 ldi r24,lo8(1) + 299 0016 1896 adiw r26,8 + 300 0018 8C93 st X,r24 + 301 001a 1897 sbiw r26,8 + 302 .LSM28: + 303 001c 84EF ldi r24,lo8(500) + 304 001e 91E0 ldi r25,hi8(500) + 305 0020 1A96 adiw r26,9+1 + 306 0022 9C93 st X,r25 + 307 0024 8E93 st -X,r24 + 308 0026 1997 sbiw r26,9 + 309 .LSM29: + 310 0028 1196 adiw r26,1 + 311 002a 3C91 ld r19,X + 312 002c 1197 sbiw r26,1 + 313 002e 1296 adiw r26,2 + 314 0030 6D91 ld r22,X+ + 315 0032 7C91 ld r23,X + 316 0034 1397 sbiw r26,2+1 + 317 0036 1496 adiw r26,4 + 318 0038 8C91 ld r24,X + 319 003a 8823 tst r24 + 320 003c 01F4 brne .L15 + 321 003e 40E0 ldi r20,lo8(0) + 322 0040 00C0 rjmp .L16 + 323 .L15: + 324 0042 44E0 ldi r20,lo8(4) + 325 .L16: + 326 0044 20E0 ldi r18,lo8(0) + 327 .LVL16: + 328 0046 88E0 ldi r24,lo8(8) + 329 0048 90E0 ldi r25,hi8(8) + 330 .LVL17: + 331 004a 00C0 rjmp .L17 + 332 .L18: + 333 .LBB60: + 334 .LBB61: + 335 .LBB62: + 336 .LBB63: + 337 .LSM30: + 338 004c 2F5F subi r18,lo8(-(1)) + 339 .LSM31: + 340 004e 880F lsl r24 + 341 0050 991F rol r25 + 342 .L17: + 343 .LSM32: + 344 0052 8617 cp r24,r22 + 345 0054 9707 cpc r25,r23 + 346 0056 00F0 brlo .L18 + 347 .LBE63: + 348 .LBE62: + 349 .LBE61: + 350 .LSM33: + 351 0058 4260 ori r20,lo8(2) + 352 005a 2295 swap r18 + 353 005c 207F andi r18,lo8(-16) + 354 005e 422B or r20,r18 + 355 0060 832F mov r24,r19 + 356 .LVL18: + 357 0062 61EC ldi r22,lo8(-63) + 358 0064 0E94 0000 call Endpoint_ConfigureEndpoint_Prv + 359 .LVL19: + 360 0068 8111 cpse r24,__zero_reg__ + 361 006a 81E0 ldi r24,lo8(1) + 362 .L19: + 363 /* epilogue start */ + 364 .LBE60: + 365 .LSM34: + 366 006c DF91 pop r29 + 367 006e CF91 pop r28 + 368 0070 0895 ret + 369 .LFE82: + 371 .section .text.HID_Device_ProcessControlRequest,"ax",@progbits + 372 .global HID_Device_ProcessControlRequest + 374 HID_Device_ProcessControlRequest: + 375 .LFB81: + 376 .LSM35: + 377 .LVL20: + 378 0000 6F92 push r6 + 379 0002 7F92 push r7 + 380 0004 8F92 push r8 + 381 0006 9F92 push r9 + 382 0008 AF92 push r10 + 383 000a BF92 push r11 + 384 000c CF92 push r12 + 385 000e DF92 push r13 + 386 0010 EF92 push r14 + 387 0012 FF92 push r15 + 388 0014 0F93 push r16 + 389 0016 1F93 push r17 + 390 0018 DF93 push r29 + 391 001a CF93 push r28 + 392 001c 00D0 rcall . + 393 001e 0F92 push __tmp_reg__ + 394 0020 CDB7 in r28,__SP_L__ + 395 0022 DEB7 in r29,__SP_H__ + 396 /* prologue: function */ + 397 /* frame size = 3 */ + 398 0024 4C01 movw r8,r24 + 399 .LSM36: + 400 0026 6DB6 in r6,__SP_L__ + 401 0028 7EB6 in r7,__SP_H__ + 402 .LBB64: + 403 .LBB65: + 404 .LSM37: + 405 002a 8091 E800 lds r24,232 + 406 .LVL21: + 407 .LBE65: + 408 .LBE64: + 409 .LSM38: + 410 002e 83FF sbrs r24,3 + 411 0030 00C0 rjmp .L33 + 412 .LSM39: + 413 0032 F401 movw r30,r8 + 414 0034 8081 ld r24,Z + 415 0036 90E0 ldi r25,lo8(0) + 416 0038 2091 0000 lds r18,USB_ControlRequest+4 + 417 003c 3091 0000 lds r19,(USB_ControlRequest+4)+1 + 418 0040 2817 cp r18,r24 + 419 0042 3907 cpc r19,r25 + 420 0044 01F0 breq .+2 + 421 0046 00C0 rjmp .L33 + 422 .LSM40: + 423 0048 8091 0000 lds r24,USB_ControlRequest+1 + 424 004c 8330 cpi r24,lo8(3) + 425 004e 01F4 brne .+2 + 426 0050 00C0 rjmp .L25 + 427 0052 8430 cpi r24,lo8(4) + 428 0054 00F4 brsh .L29 + 429 0056 8130 cpi r24,lo8(1) + 430 0058 01F0 breq .L23 + 431 005a 8230 cpi r24,lo8(2) + 432 005c 01F0 breq .+2 + 433 005e 00C0 rjmp .L33 + 434 0060 00C0 rjmp .L36 + 435 .L29: + 436 0062 8A30 cpi r24,lo8(10) + 437 0064 01F4 brne .+2 + 438 0066 00C0 rjmp .L27 + 439 0068 8B30 cpi r24,lo8(11) + 440 006a 01F4 brne .+2 + 441 006c 00C0 rjmp .L28 + 442 006e 8930 cpi r24,lo8(9) + 443 0070 01F0 breq .+2 + 444 0072 00C0 rjmp .L33 + 445 0074 00C0 rjmp .L37 + 446 .L23: + 447 .LSM41: + 448 0076 8091 0000 lds r24,USB_ControlRequest + 449 007a 813A cpi r24,lo8(-95) + 450 007c 01F0 breq .+2 + 451 007e 00C0 rjmp .L33 + 452 0080 ADB6 in r10,__SP_L__ + 453 0082 FEB6 in r15,__SP_H__ + 454 .LBB66: + 455 .LSM42: + 456 0084 1B82 std Y+3,__zero_reg__ + 457 0086 1A82 std Y+2,__zero_reg__ + 458 .LVL22: + 459 .LSM43: + 460 0088 8091 0000 lds r24,USB_ControlRequest+2 + 461 008c 1091 0000 lds r17,USB_ControlRequest+3 + 462 0090 8983 std Y+1,r24 + 463 .LVL23: + 464 .LSM44: + 465 0092 F401 movw r30,r8 + 466 0094 4781 ldd r20,Z+7 + 467 0096 8DB7 in r24,__SP_L__ + 468 0098 9EB7 in r25,__SP_H__ + 469 009a 841B sub r24,r20 + 470 009c 9109 sbc r25,__zero_reg__ + 471 009e 0FB6 in __tmp_reg__,__SREG__ + 472 00a0 F894 cli + 473 00a2 9EBF out __SP_H__,r25 + 474 00a4 0FBE out __SREG__,__tmp_reg__ + 475 00a6 8DBF out __SP_L__,r24 + 476 00a8 CDB6 in r12,__SP_L__ + 477 00aa DEB6 in r13,__SP_H__ + 478 00ac 0894 sec + 479 00ae C11C adc r12,__zero_reg__ + 480 00b0 D11C adc r13,__zero_reg__ + 481 .LSM45: + 482 00b2 EC2C mov r14,r12 + 483 00b4 BD2C mov r11,r13 + 484 00b6 C601 movw r24,r12 + 485 00b8 60E0 ldi r22,lo8(0) + 486 00ba 70E0 ldi r23,hi8(0) + 487 00bc 50E0 ldi r21,lo8(0) + 488 00be 0E94 0000 call memset + 489 .LSM46: + 490 00c2 1150 subi r17,lo8(-(-1)) + 491 00c4 C401 movw r24,r8 + 492 00c6 BE01 movw r22,r28 + 493 00c8 6F5F subi r22,lo8(-(1)) + 494 00ca 7F4F sbci r23,hi8(-(1)) + 495 00cc 412F mov r20,r17 + 496 00ce 9601 movw r18,r12 + 497 00d0 8E01 movw r16,r28 + 498 00d2 0E5F subi r16,lo8(-(2)) + 499 00d4 1F4F sbci r17,hi8(-(2)) + 500 00d6 0E94 0000 call CALLBACK_HID_Device_CreateHIDReport + 501 .LSM47: + 502 00da F401 movw r30,r8 + 503 00dc 2581 ldd r18,Z+5 + 504 00de 3681 ldd r19,Z+6 + 505 00e0 2115 cp r18,__zero_reg__ + 506 00e2 3105 cpc r19,__zero_reg__ + 507 00e4 01F0 breq .L30 + 508 .LSM48: + 509 00e6 4781 ldd r20,Z+7 + 510 00e8 C901 movw r24,r18 + 511 00ea B601 movw r22,r12 + 512 00ec 50E0 ldi r21,lo8(0) + 513 00ee 0E94 0000 call memcpy + 514 .L30: + 515 .LBB67: + 516 .LBB68: + 517 .LSM49: + 518 00f2 1092 E900 sts 233,__zero_reg__ + 519 .LBE68: + 520 .LBE67: + 521 .LBB69: + 522 .LBB70: + 523 .LSM50: + 524 00f6 8091 E800 lds r24,232 + 525 00fa 877F andi r24,lo8(-9) + 526 00fc 8093 E800 sts 232,r24 + 527 .LBE70: + 528 .LBE69: + 529 .LSM51: + 530 0100 6A81 ldd r22,Y+2 + 531 0102 7B81 ldd r23,Y+3 + 532 0104 8E2D mov r24,r14 + 533 0106 9B2D mov r25,r11 + 534 0108 0E94 0000 call Endpoint_Write_Control_Stream_LE + 535 .LBB71: + 536 .LBB72: + 537 .LSM52: + 538 010c 8091 E800 lds r24,232 + 539 0110 8B77 andi r24,lo8(123) + 540 0112 8093 E800 sts 232,r24 + 541 0116 2A2D mov r18,r10 + 542 0118 3F2D mov r19,r15 + 543 011a 00C0 rjmp .L34 + 544 .LVL24: + 545 .L37: + 546 .LBE72: + 547 .LBE71: + 548 .LBE66: + 549 .LSM53: + 550 011c 8091 0000 lds r24,USB_ControlRequest + 551 0120 8132 cpi r24,lo8(33) + 552 0122 01F0 breq .+2 + 553 0124 00C0 rjmp .L33 + 554 0126 AEB6 in r10,__SP_H__ + 555 .LBB73: + 556 .LSM54: + 557 0128 0091 0000 lds r16,USB_ControlRequest+6 + 558 012c 1091 0000 lds r17,(USB_ControlRequest+6)+1 + 559 .LVL25: + 560 .LSM55: + 561 0130 C090 0000 lds r12,USB_ControlRequest+2 + 562 0134 D090 0000 lds r13,USB_ControlRequest+3 + 563 .LSM56: + 564 0138 8DB7 in r24,__SP_L__ + 565 013a 9EB7 in r25,__SP_H__ + 566 013c 801B sub r24,r16 + 567 013e 910B sbc r25,r17 + 568 0140 0FB6 in __tmp_reg__,__SREG__ + 569 0142 F894 cli + 570 0144 9EBF out __SP_H__,r25 + 571 0146 0FBE out __SREG__,__tmp_reg__ + 572 0148 8DBF out __SP_L__,r24 + 573 014a EDB6 in r14,__SP_L__ + 574 014c FEB6 in r15,__SP_H__ + 575 014e 0894 sec + 576 0150 E11C adc r14,__zero_reg__ + 577 0152 F11C adc r15,__zero_reg__ + 578 .LBB74: + 579 .LBB75: + 580 .LSM57: + 581 0154 8091 E800 lds r24,232 + 582 0158 877F andi r24,lo8(-9) + 583 015a 8093 E800 sts 232,r24 + 584 .LBE75: + 585 .LBE74: + 586 .LSM58: + 587 015e C701 movw r24,r14 + 588 0160 B801 movw r22,r16 + 589 0162 0E94 0000 call Endpoint_Read_Control_Stream_LE + 590 .LBB76: + 591 .LBB77: + 592 .LSM59: + 593 0166 8091 E800 lds r24,232 + 594 016a 8E77 andi r24,lo8(126) + 595 016c 8093 E800 sts 232,r24 + 596 .LBE77: + 597 .LBE76: + 598 .LSM60: + 599 0170 DA94 dec r13 + 600 0172 C401 movw r24,r8 + 601 0174 6C2D mov r22,r12 + 602 0176 4D2D mov r20,r13 + 603 0178 9701 movw r18,r14 + 604 017a 0E94 0000 call CALLBACK_HID_Device_ProcessHIDReport + 605 017e 262D mov r18,r6 + 606 0180 3A2D mov r19,r10 + 607 .LVL26: + 608 .L34: + 609 0182 0FB6 in __tmp_reg__,__SREG__ + 610 0184 F894 cli + 611 0186 3EBF out __SP_H__,r19 + 612 0188 0FBE out __SREG__,__tmp_reg__ + 613 018a 2DBF out __SP_L__,r18 + 614 018c 00C0 rjmp .L33 + 615 .LVL27: + 616 .L25: + 617 .LBE73: + 618 .LSM61: + 619 018e 8091 0000 lds r24,USB_ControlRequest + 620 0192 813A cpi r24,lo8(-95) + 621 0194 01F0 breq .+2 + 622 0196 00C0 rjmp .L33 + 623 .LBB78: + 624 .LBB79: + 625 .LSM62: + 626 0198 8091 E800 lds r24,232 + 627 019c 877F andi r24,lo8(-9) + 628 019e 8093 E800 sts 232,r24 + 629 .LBE79: + 630 .LBE78: + 631 .LSM63: + 632 01a2 F401 movw r30,r8 + 633 01a4 8085 ldd r24,Z+8 + 634 01a6 00C0 rjmp .L35 + 635 .L28: + 636 .LSM64: + 637 01a8 8091 0000 lds r24,USB_ControlRequest + 638 01ac 8132 cpi r24,lo8(33) + 639 01ae 01F0 breq .+2 + 640 01b0 00C0 rjmp .L33 + 641 .LBB80: + 642 .LBB81: + 643 .LSM65: + 644 01b2 8091 E800 lds r24,232 + 645 01b6 877F andi r24,lo8(-9) + 646 01b8 8093 E800 sts 232,r24 + 647 .LBE81: + 648 .LBE80: + 649 .LSM66: + 650 01bc 0E94 0000 call Endpoint_ClearStatusStage + 651 .LSM67: + 652 01c0 90E0 ldi r25,lo8(0) + 653 01c2 8091 0000 lds r24,USB_ControlRequest+2 + 654 01c6 8111 cpse r24,__zero_reg__ + 655 01c8 91E0 ldi r25,lo8(1) + 656 .L32: + 657 01ca F401 movw r30,r8 + 658 01cc 9087 std Z+8,r25 + 659 01ce 00C0 rjmp .L33 + 660 .L27: + 661 .LSM68: + 662 01d0 8091 0000 lds r24,USB_ControlRequest + 663 01d4 8132 cpi r24,lo8(33) + 664 01d6 01F4 brne .L33 + 665 .LBB82: + 666 .LBB83: + 667 .LSM69: + 668 01d8 8091 E800 lds r24,232 + 669 01dc 877F andi r24,lo8(-9) + 670 01de 8093 E800 sts 232,r24 + 671 .LBE83: + 672 .LBE82: + 673 .LSM70: + 674 01e2 0E94 0000 call Endpoint_ClearStatusStage + 675 .LSM71: + 676 01e6 8091 0000 lds r24,USB_ControlRequest+2 + 677 01ea 9091 0000 lds r25,(USB_ControlRequest+2)+1 + 678 01ee 8070 andi r24,lo8(-256) + 679 01f0 76E0 ldi r23,6 + 680 01f2 9695 1: lsr r25 + 681 01f4 8795 ror r24 + 682 01f6 7A95 dec r23 + 683 01f8 01F4 brne 1b + 684 01fa F401 movw r30,r8 + 685 01fc 9287 std Z+10,r25 + 686 01fe 8187 std Z+9,r24 + 687 0200 00C0 rjmp .L33 + 688 .L36: + 689 .LSM72: + 690 0202 8091 0000 lds r24,USB_ControlRequest + 691 0206 813A cpi r24,lo8(-95) + 692 0208 01F4 brne .L33 + 693 .LBB84: + 694 .LBB85: + 695 .LSM73: + 696 020a 8091 E800 lds r24,232 + 697 020e 877F andi r24,lo8(-9) + 698 0210 8093 E800 sts 232,r24 + 699 .LBE85: + 700 .LBE84: + 701 .LSM74: + 702 0214 F401 movw r30,r8 + 703 0216 8185 ldd r24,Z+9 + 704 0218 9285 ldd r25,Z+10 + 705 021a 9695 lsr r25 + 706 021c 8795 ror r24 + 707 021e 9695 lsr r25 + 708 0220 8795 ror r24 + 709 .L35: + 710 .LBB86: + 711 .LBB87: + 712 .LSM75: + 713 0222 8093 F100 sts 241,r24 + 714 .LBE87: + 715 .LBE86: + 716 .LBB88: + 717 .LBB89: + 718 .LSM76: + 719 0226 8091 E800 lds r24,232 + 720 022a 8E77 andi r24,lo8(126) + 721 022c 8093 E800 sts 232,r24 + 722 .LBE89: + 723 .LBE88: + 724 .LSM77: + 725 0230 0E94 0000 call Endpoint_ClearStatusStage + 726 .LVL28: + 727 .L33: + 728 .LSM78: + 729 0234 0FB6 in __tmp_reg__,__SREG__ + 730 0236 F894 cli + 731 0238 7EBE out __SP_H__,r7 + 732 023a 0FBE out __SREG__,__tmp_reg__ + 733 023c 6DBE out __SP_L__,r6 + 734 /* epilogue start */ + 735 023e 0F90 pop __tmp_reg__ + 736 0240 0F90 pop __tmp_reg__ + 737 0242 0F90 pop __tmp_reg__ + 738 0244 CF91 pop r28 + 739 0246 DF91 pop r29 + 740 0248 1F91 pop r17 + 741 024a 0F91 pop r16 + 742 .LVL29: + 743 024c FF90 pop r15 + 744 024e EF90 pop r14 + 745 0250 DF90 pop r13 + 746 0252 CF90 pop r12 + 747 0254 BF90 pop r11 + 748 0256 AF90 pop r10 + 749 0258 9F90 pop r9 + 750 025a 8F90 pop r8 + 751 .LVL30: + 752 025c 7F90 pop r7 + 753 025e 6F90 pop r6 + 754 0260 0895 ret + 755 .LFE81: + 797 .Letext0: +DEFINED SYMBOLS + *ABS*:0000000000000000 HID.c + /tmp/ccYdlTY9.s:2 *ABS*:000000000000003f __SREG__ + /tmp/ccYdlTY9.s:3 *ABS*:000000000000003e __SP_H__ + /tmp/ccYdlTY9.s:4 *ABS*:000000000000003d __SP_L__ + /tmp/ccYdlTY9.s:5 *ABS*:0000000000000034 __CCP__ + /tmp/ccYdlTY9.s:6 *ABS*:0000000000000000 __tmp_reg__ + /tmp/ccYdlTY9.s:7 *ABS*:0000000000000001 __zero_reg__ + /tmp/ccYdlTY9.s:19 .text.HID_Device_USBTask:0000000000000000 HID_Device_USBTask + /tmp/ccYdlTY9.s:279 .text.HID_Device_ConfigureEndpoints:0000000000000000 HID_Device_ConfigureEndpoints + /tmp/ccYdlTY9.s:374 .text.HID_Device_ProcessControlRequest:0000000000000000 HID_Device_ProcessControlRequest + +UNDEFINED SYMBOLS +USB_DeviceState +memset +CALLBACK_HID_Device_CreateHIDReport +memcmp +memcpy +Endpoint_Write_Stream_LE +Endpoint_ConfigureEndpoint_Prv +USB_ControlRequest +Endpoint_Write_Control_Stream_LE +Endpoint_Read_Control_Stream_LE +CALLBACK_HID_Device_ProcessHIDReport +Endpoint_ClearStatusStage diff --git a/firmware/LUFA/Drivers/USB/Class/Device/HID.o b/firmware/LUFA/Drivers/USB/Class/Device/HID.o new file mode 100644 index 0000000..d3f9f75 Binary files /dev/null and b/firmware/LUFA/Drivers/USB/Class/Device/HID.o differ diff --git a/firmware/LUFA/Drivers/USB/Class/Device/MIDI.c b/firmware/LUFA/Drivers/USB/Class/Device/MIDI.c new file mode 100644 index 0000000..9d2a1a8 --- /dev/null +++ b/firmware/LUFA/Drivers/USB/Class/Device/MIDI.c @@ -0,0 +1,148 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2010 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. +*/ + +#define __INCLUDE_FROM_USB_DRIVER +#include "../../HighLevel/USBMode.h" +#if defined(USB_CAN_BE_DEVICE) + +#define __INCLUDE_FROM_MIDI_DRIVER +#define __INCLUDE_FROM_MIDI_DEVICE_C +#include "MIDI.h" + +bool MIDI_Device_ConfigureEndpoints(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) +{ + memset(&MIDIInterfaceInfo->State, 0x00, sizeof(MIDIInterfaceInfo->State)); + + for (uint8_t EndpointNum = 1; EndpointNum < ENDPOINT_TOTAL_ENDPOINTS; EndpointNum++) + { + uint16_t Size; + uint8_t Type; + uint8_t Direction; + bool DoubleBanked; + + if (EndpointNum == MIDIInterfaceInfo->Config.DataINEndpointNumber) + { + Size = MIDIInterfaceInfo->Config.DataINEndpointSize; + Direction = ENDPOINT_DIR_IN; + Type = EP_TYPE_BULK; + DoubleBanked = MIDIInterfaceInfo->Config.DataINEndpointDoubleBank; + } + else if (EndpointNum == MIDIInterfaceInfo->Config.DataOUTEndpointNumber) + { + Size = MIDIInterfaceInfo->Config.DataOUTEndpointSize; + Direction = ENDPOINT_DIR_OUT; + Type = EP_TYPE_BULK; + DoubleBanked = MIDIInterfaceInfo->Config.DataOUTEndpointDoubleBank; + } + else + { + continue; + } + + if (!(Endpoint_ConfigureEndpoint(EndpointNum, Type, Direction, Size, + DoubleBanked ? ENDPOINT_BANK_DOUBLE : ENDPOINT_BANK_SINGLE))) + { + return false; + } + } + + return true; +} + +void MIDI_Device_USBTask(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) +{ + if (USB_DeviceState != DEVICE_STATE_Configured) + return; + + #if !defined(NO_CLASS_DRIVER_AUTOFLUSH) + MIDI_Device_Flush(MIDIInterfaceInfo); + #endif +} + +uint8_t MIDI_Device_SendEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo, + const MIDI_EventPacket_t* const Event) +{ + if (USB_DeviceState != DEVICE_STATE_Configured) + return ENDPOINT_RWSTREAM_DeviceDisconnected; + + uint8_t ErrorCode; + + Endpoint_SelectEndpoint(MIDIInterfaceInfo->Config.DataINEndpointNumber); + + if ((ErrorCode = Endpoint_Write_Stream_LE(Event, sizeof(MIDI_EventPacket_t), NO_STREAM_CALLBACK)) != ENDPOINT_RWSTREAM_NoError) + return ErrorCode; + + if (!(Endpoint_IsReadWriteAllowed())) + Endpoint_ClearIN(); + + return ENDPOINT_RWSTREAM_NoError; +} + +uint8_t MIDI_Device_Flush(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) +{ + if (USB_DeviceState != DEVICE_STATE_Configured) + return ENDPOINT_RWSTREAM_DeviceDisconnected; + + uint8_t ErrorCode; + + Endpoint_SelectEndpoint(MIDIInterfaceInfo->Config.DataINEndpointNumber); + + if (Endpoint_BytesInEndpoint()) + { + Endpoint_ClearIN(); + + if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) + return ErrorCode; + } + + return ENDPOINT_READYWAIT_NoError; +} + +bool MIDI_Device_ReceiveEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo, + MIDI_EventPacket_t* const Event) +{ + if (USB_DeviceState != DEVICE_STATE_Configured) + return false; + + Endpoint_SelectEndpoint(MIDIInterfaceInfo->Config.DataOUTEndpointNumber); + + if (!(Endpoint_IsReadWriteAllowed())) + return false; + + Endpoint_Read_Stream_LE(Event, sizeof(MIDI_EventPacket_t), NO_STREAM_CALLBACK); + + if (!(Endpoint_IsReadWriteAllowed())) + Endpoint_ClearOUT(); + + return true; +} + +#endif + diff --git a/firmware/LUFA/Drivers/USB/Class/Device/MIDI.h b/firmware/LUFA/Drivers/USB/Class/Device/MIDI.h new file mode 100644 index 0000000..8ac7146 --- /dev/null +++ b/firmware/LUFA/Drivers/USB/Class/Device/MIDI.h @@ -0,0 +1,189 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief Device mode driver for the library USB MIDI Class driver. + * + * Device mode driver for the library USB MIDI Class driver. + * + * \note This file should not be included directly. It is automatically included as needed by the USB module driver + * dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassMIDI + * @defgroup Group_USBClassMIDIDevice MIDI Class Device Mode Driver + * + * \section Sec_Dependencies Module Source Dependencies + * The following files must be built with any user project that uses this module: + * - LUFA/Drivers/USB/Class/Device/MIDI.c (Makefile source module name: LUFA_SRC_USBCLASS) + * + * \section Module Description + * Device Mode USB Class driver framework interface, for the MIDI USB Class driver. + * + * @{ + */ + +#ifndef _MIDI_CLASS_DEVICE_H_ +#define _MIDI_CLASS_DEVICE_H_ + + /* Includes: */ + #include "../../USB.h" + #include "../Common/MIDI.h" + + #include + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(__INCLUDE_FROM_MIDI_DRIVER) + #error Do not include this file directly. Include LUFA/Drivers/USB.h instead. + #endif + + #if defined(__INCLUDE_FROM_MIDI_DEVICE_C) && defined(NO_STREAM_CALLBACKS) + #error The NO_STREAM_CALLBACKS compile time option cannot be used in projects using the library Class drivers. + #endif + + /* Public Interface - May be used in end-application: */ + /* Type Define: */ + /** \brief MIDI Class Device Mode Configuration and State Structure. + * + * Class state structure. An instance of this structure should be made for each MIDI interface + * within the user application, and passed to each of the MIDI class driver functions as the + * MIDIInterfaceInfo parameter. This stores each MIDI interface's configuration and state information. + */ + typedef struct + { + const struct + { + uint8_t StreamingInterfaceNumber; /**< Index of the Audio Streaming interface within the device this structure controls. */ + + uint8_t DataINEndpointNumber; /**< Endpoint number of the incoming MIDI data, if available (zero if unused). */ + uint16_t DataINEndpointSize; /**< Size in bytes of the incoming MIDI data endpoint, if available (zero if unused). */ + bool DataINEndpointDoubleBank; /**< Indicates if the MIDI interface's IN data endpoint should use double banking. */ + + uint8_t DataOUTEndpointNumber; /**< Endpoint number of the outgoing MIDI data, if available (zero if unused). */ + uint16_t DataOUTEndpointSize; /**< Size in bytes of the outgoing MIDI data endpoint, if available (zero if unused). */ + bool DataOUTEndpointDoubleBank; /**< Indicates if the MIDI interface's IN data endpoint should use double banking. */ + } Config; /**< Config data for the USB class interface within the device. All elements in this section + * must be set or the interface will fail to enumerate and operate correctly. + */ + struct + { + // No state information for this class + } State; /**< State data for the USB class interface within the device. All elements in this section + * are reset to their defaults when the interface is enumerated. + */ + } USB_ClassInfo_MIDI_Device_t; + + /* Function Prototypes: */ + /** Configures the endpoints of a given MIDI interface, ready for use. This should be linked to the library + * \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration + * containing the given MIDI interface is selected. + * + * \note The endpoint index numbers as given in the interface's configuration structure must not overlap with any other + * interface, or endpoint bank corruption will occur. Gaps in the allocated endpoint numbers or non-sequential indexes + * within a single interface is allowed, but no two interfaces of any type have have interleaved endpoint indexes. + * + * \param[in,out] MIDIInterfaceInfo Pointer to a structure containing a MIDI Class configuration and state. + * + * \return Boolean true if the endpoints were successfully configured, false otherwise. + */ + bool MIDI_Device_ConfigureEndpoints(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** General management task for a given MIDI class interface, required for the correct operation of the interface. This should + * be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). + * + * \param[in,out] MIDIInterfaceInfo Pointer to a structure containing a MIDI Class configuration and state. + */ + void MIDI_Device_USBTask(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** Sends a MIDI event packet to the host. If no host is connected, the event packet is discarded. Events are queued into the + * endpoint bank until either the endpoint bank is full, or \ref MIDI_Device_Flush() is called. This allows for multiple + * MIDI events to be packed into a single endpoint packet, increasing data throughput. + * + * \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the + * call will fail. + * + * \param[in,out] MIDIInterfaceInfo Pointer to a structure containing a MIDI Class configuration and state. + * \param[in] Event Pointer to a populated \ref MIDI_EventPacket_t structure containing the MIDI event to send. + * + * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. + */ + uint8_t MIDI_Device_SendEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo, + const MIDI_EventPacket_t* const Event) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + + + /** Flushes the MIDI send buffer, sending any queued MIDI events to the host. This should be called to override the + * \ref MIDI_Device_SendEventPacket() function's packing behaviour, to flush queued events. + * + * \param[in,out] MIDIInterfaceInfo Pointer to a structure containing a MIDI Class configuration and state. + * + * \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum. + */ + uint8_t MIDI_Device_Flush(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** Receives a MIDI event packet from the host. Events are unpacked from the endpoint, thus if the endpoint bank contains + * multiple MIDI events from the host in the one packet, multiple calls to this function will return each individual event. + * + * \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the + * call will fail. + * + * \param[in,out] MIDIInterfaceInfo Pointer to a structure containing a MIDI Class configuration and state. + * \param[out] Event Pointer to a USB_MIDI_EventPacket_t structure where the received MIDI event is to be placed. + * + * \return Boolean true if a MIDI event packet was received, false otherwise. + */ + bool MIDI_Device_ReceiveEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo, + MIDI_EventPacket_t* const Event) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + + /* Inline Functions: */ + /** Processes incoming control requests from the host, that are directed to the given MIDI class interface. This should be + * linked to the library \ref EVENT_USB_Device_ControlRequest() event. + * + * \param[in,out] MIDIInterfaceInfo Pointer to a structure containing a MIDI Class configuration and state. + */ + static inline void MIDI_Device_ProcessControlRequest(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + static inline void MIDI_Device_ProcessControlRequest(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) + { + (void)MIDIInterfaceInfo; + } + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + +/** @} */ + diff --git a/firmware/LUFA/Drivers/USB/Class/Device/MIDI.lst b/firmware/LUFA/Drivers/USB/Class/Device/MIDI.lst new file mode 100644 index 0000000..cb878a0 --- /dev/null +++ b/firmware/LUFA/Drivers/USB/Class/Device/MIDI.lst @@ -0,0 +1,346 @@ + 1 .file "MIDI.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.MIDI_Device_ReceiveEventPacket,"ax",@progbits + 17 .global MIDI_Device_ReceiveEventPacket + 19 MIDI_Device_ReceiveEventPacket: + 20 .LFB85: + 21 .LSM0: + 22 .LVL0: + 23 /* prologue: function */ + 24 /* frame size = 0 */ + 25 0000 FC01 movw r30,r24 + 26 .LSM1: + 27 0002 8091 0000 lds r24,USB_DeviceState + 28 .LVL1: + 29 0006 8430 cpi r24,lo8(4) + 30 0008 01F4 brne .L2 + 31 .LSM2: + 32 000a 8581 ldd r24,Z+5 + 33 .LBB30: + 34 .LBB31: + 35 .LSM3: + 36 000c 8093 E900 sts 233,r24 + 37 .LBE31: + 38 .LBE30: + 39 .LBB32: + 40 .LBB33: + 41 .LSM4: + 42 0010 8091 E800 lds r24,232 + 43 .LBE33: + 44 .LBE32: + 45 .LSM5: + 46 0014 85FF sbrs r24,5 + 47 0016 00C0 rjmp .L2 + 48 .LSM6: + 49 0018 CB01 movw r24,r22 + 50 001a 64E0 ldi r22,lo8(4) + 51 001c 70E0 ldi r23,hi8(4) + 52 .LVL2: + 53 001e 40E0 ldi r20,lo8(0) + 54 0020 50E0 ldi r21,hi8(0) + 55 0022 0E94 0000 call Endpoint_Read_Stream_LE + 56 .LVL3: + 57 .LBB34: + 58 .LBB35: + 59 .LSM7: + 60 0026 8091 E800 lds r24,232 + 61 .LBE35: + 62 .LBE34: + 63 .LSM8: + 64 002a 85FD sbrc r24,5 + 65 002c 00C0 rjmp .L6 + 66 .L3: + 67 .LBB36: + 68 .LBB37: + 69 .LSM9: + 70 002e 8091 E800 lds r24,232 + 71 0032 8B77 andi r24,lo8(123) + 72 0034 8093 E800 sts 232,r24 + 73 .L6: + 74 0038 81E0 ldi r24,lo8(1) + 75 003a 0895 ret + 76 .LVL4: + 77 .L2: + 78 003c 80E0 ldi r24,lo8(0) + 79 .LBE37: + 80 .LBE36: + 81 .LSM10: + 82 003e 0895 ret + 83 .LFE85: + 85 .section .text.MIDI_Device_Flush,"ax",@progbits + 86 .global MIDI_Device_Flush + 88 MIDI_Device_Flush: + 89 .LFB84: + 90 .LSM11: + 91 .LVL5: + 92 /* prologue: function */ + 93 /* frame size = 0 */ + 94 0000 FC01 movw r30,r24 + 95 .LSM12: + 96 0002 8091 0000 lds r24,USB_DeviceState + 97 .LVL6: + 98 0006 8430 cpi r24,lo8(4) + 99 0008 01F0 breq .L8 + 100 000a 82E0 ldi r24,lo8(2) + 101 .LVL7: + 102 000c 0895 ret + 103 .LVL8: + 104 .L8: + 105 .LSM13: + 106 000e 8181 ldd r24,Z+1 + 107 .LBB38: + 108 .LBB39: + 109 .LSM14: + 110 0010 8093 E900 sts 233,r24 + 111 .LBE39: + 112 .LBE38: + 113 .LBB40: + 114 .LBB41: + 115 .LSM15: + 116 0014 8091 F200 lds r24,242 + 117 .LBE41: + 118 .LBE40: + 119 .LSM16: + 120 0018 8823 tst r24 + 121 001a 01F0 breq .L9 + 122 .LBB42: + 123 .LBB43: + 124 .LSM17: + 125 001c 8091 E800 lds r24,232 + 126 0020 8E77 andi r24,lo8(126) + 127 0022 8093 E800 sts 232,r24 + 128 .LBE43: + 129 .LBE42: + 130 .LSM18: + 131 0026 0E94 0000 call Endpoint_WaitUntilReady + 132 .LVL9: + 133 .L9: + 134 .LSM19: + 135 002a 0895 ret + 136 .LFE84: + 138 .section .text.MIDI_Device_USBTask,"ax",@progbits + 139 .global MIDI_Device_USBTask + 141 MIDI_Device_USBTask: + 142 .LFB82: + 143 .LSM20: + 144 .LVL10: + 145 /* prologue: function */ + 146 /* frame size = 0 */ + 147 0000 9C01 movw r18,r24 + 148 .LSM21: + 149 0002 8091 0000 lds r24,USB_DeviceState + 150 .LVL11: + 151 0006 8430 cpi r24,lo8(4) + 152 0008 01F4 brne .L14 + 153 .LSM22: + 154 000a C901 movw r24,r18 + 155 000c 0E94 0000 call MIDI_Device_Flush + 156 .LVL12: + 157 .L14: + 158 0010 0895 ret + 159 .LFE82: + 161 .section .text.MIDI_Device_SendEventPacket,"ax",@progbits + 162 .global MIDI_Device_SendEventPacket + 164 MIDI_Device_SendEventPacket: + 165 .LFB83: + 166 .LSM23: + 167 .LVL13: + 168 /* prologue: function */ + 169 /* frame size = 0 */ + 170 0000 FC01 movw r30,r24 + 171 .LSM24: + 172 0002 8091 0000 lds r24,USB_DeviceState + 173 .LVL14: + 174 0006 8430 cpi r24,lo8(4) + 175 0008 01F0 breq .L16 + 176 000a 92E0 ldi r25,lo8(2) + 177 .LVL15: + 178 000c 00C0 rjmp .L17 + 179 .LVL16: + 180 .L16: + 181 .LSM25: + 182 000e 8181 ldd r24,Z+1 + 183 .LBB44: + 184 .LBB45: + 185 .LSM26: + 186 0010 8093 E900 sts 233,r24 + 187 .LBE45: + 188 .LBE44: + 189 .LSM27: + 190 0014 CB01 movw r24,r22 + 191 0016 64E0 ldi r22,lo8(4) + 192 0018 70E0 ldi r23,hi8(4) + 193 .LVL17: + 194 001a 40E0 ldi r20,lo8(0) + 195 001c 50E0 ldi r21,hi8(0) + 196 001e 0E94 0000 call Endpoint_Write_Stream_LE + 197 .LVL18: + 198 0022 982F mov r25,r24 + 199 .LVL19: + 200 0024 8823 tst r24 + 201 0026 01F4 brne .L17 + 202 .LVL20: + 203 .LBB46: + 204 .LBB47: + 205 .LSM28: + 206 0028 8091 E800 lds r24,232 + 207 .LVL21: + 208 .LBE47: + 209 .LBE46: + 210 .LSM29: + 211 002c 85FD sbrc r24,5 + 212 002e 00C0 rjmp .L17 + 213 .LBB48: + 214 .LBB49: + 215 .LSM30: + 216 0030 8091 E800 lds r24,232 + 217 0034 8E77 andi r24,lo8(126) + 218 0036 8093 E800 sts 232,r24 + 219 .LVL22: + 220 .L17: + 221 .LBE49: + 222 .LBE48: + 223 .LSM31: + 224 003a 892F mov r24,r25 + 225 /* epilogue start */ + 226 003c 0895 ret + 227 .LFE83: + 229 .section .text.MIDI_Device_ConfigureEndpoints,"ax",@progbits + 230 .global MIDI_Device_ConfigureEndpoints + 232 MIDI_Device_ConfigureEndpoints: + 233 .LFB81: + 234 .LSM32: + 235 .LVL23: + 236 0000 1F93 push r17 + 237 0002 CF93 push r28 + 238 0004 DF93 push r29 + 239 /* prologue: function */ + 240 /* frame size = 0 */ + 241 0006 EC01 movw r28,r24 + 242 .LSM33: + 243 0008 11E0 ldi r17,lo8(1) + 244 .LVL24: + 245 .L28: + 246 .LBB50: + 247 .LBB51: + 248 .LSM34: + 249 000a 8981 ldd r24,Y+1 + 250 000c 1817 cp r17,r24 + 251 000e 01F4 brne .L20 + 252 .LSM35: + 253 0010 EA81 ldd r30,Y+2 + 254 0012 FB81 ldd r31,Y+3 + 255 .LVL25: + 256 .LSM36: + 257 0014 8C81 ldd r24,Y+4 + 258 .LVL26: + 259 0016 61E0 ldi r22,lo8(1) + 260 .LVL27: + 261 0018 00C0 rjmp .L21 + 262 .LVL28: + 263 .L20: + 264 .LSM37: + 265 001a 8D81 ldd r24,Y+5 + 266 001c 1817 cp r17,r24 + 267 001e 01F4 brne .L22 + 268 .LSM38: + 269 0020 EE81 ldd r30,Y+6 + 270 0022 FF81 ldd r31,Y+7 + 271 .LVL29: + 272 .LSM39: + 273 0024 8885 ldd r24,Y+8 + 274 .LVL30: + 275 0026 60E0 ldi r22,lo8(0) + 276 .LVL31: + 277 .L21: + 278 .LSM40: + 279 0028 8823 tst r24 + 280 002a 01F4 brne .L23 + 281 002c 40E0 ldi r20,lo8(0) + 282 002e 00C0 rjmp .L24 + 283 .L23: + 284 0030 44E0 ldi r20,lo8(4) + 285 .L24: + 286 0032 20E0 ldi r18,lo8(0) + 287 .LVL32: + 288 0034 88E0 ldi r24,lo8(8) + 289 0036 90E0 ldi r25,hi8(8) + 290 .LVL33: + 291 0038 00C0 rjmp .L25 + 292 .L26: + 293 .LBB52: + 294 .LBB53: + 295 .LBB54: + 296 .LBB55: + 297 .LSM41: + 298 003a 2F5F subi r18,lo8(-(1)) + 299 .LSM42: + 300 003c 880F lsl r24 + 301 003e 991F rol r25 + 302 .L25: + 303 .LSM43: + 304 0040 8E17 cp r24,r30 + 305 0042 9F07 cpc r25,r31 + 306 0044 00F0 brlo .L26 + 307 .LBE55: + 308 .LBE54: + 309 .LBE53: + 310 .LSM44: + 311 0046 6068 ori r22,lo8(-128) + 312 0048 4260 ori r20,lo8(2) + 313 004a 2295 swap r18 + 314 004c 207F andi r18,lo8(-16) + 315 004e 422B or r20,r18 + 316 0050 812F mov r24,r17 + 317 .LVL34: + 318 0052 0E94 0000 call Endpoint_ConfigureEndpoint_Prv + 319 .LVL35: + 320 .LBE52: + 321 .LSM45: + 322 0056 8823 tst r24 + 323 0058 01F0 breq .L27 + 324 .L22: + 325 .LBE51: + 326 .LSM46: + 327 005a 1F5F subi r17,lo8(-(1)) + 328 005c 1530 cpi r17,lo8(5) + 329 005e 01F4 brne .L28 + 330 0060 81E0 ldi r24,lo8(1) + 331 .L27: + 332 /* epilogue start */ + 333 .LBE50: + 334 .LSM47: + 335 0062 DF91 pop r29 + 336 0064 CF91 pop r28 + 337 .LVL36: + 338 0066 1F91 pop r17 + 339 .LVL37: + 340 0068 0895 ret + 341 .LFE81: + 399 .Letext0: +DEFINED SYMBOLS + *ABS*:0000000000000000 MIDI.c + /tmp/cc3Ze3Jq.s:2 *ABS*:000000000000003f __SREG__ + /tmp/cc3Ze3Jq.s:3 *ABS*:000000000000003e __SP_H__ + /tmp/cc3Ze3Jq.s:4 *ABS*:000000000000003d __SP_L__ + /tmp/cc3Ze3Jq.s:5 *ABS*:0000000000000034 __CCP__ + /tmp/cc3Ze3Jq.s:6 *ABS*:0000000000000000 __tmp_reg__ + /tmp/cc3Ze3Jq.s:7 *ABS*:0000000000000001 __zero_reg__ + /tmp/cc3Ze3Jq.s:19 .text.MIDI_Device_ReceiveEventPacket:0000000000000000 MIDI_Device_ReceiveEventPacket + /tmp/cc3Ze3Jq.s:88 .text.MIDI_Device_Flush:0000000000000000 MIDI_Device_Flush + /tmp/cc3Ze3Jq.s:141 .text.MIDI_Device_USBTask:0000000000000000 MIDI_Device_USBTask + /tmp/cc3Ze3Jq.s:164 .text.MIDI_Device_SendEventPacket:0000000000000000 MIDI_Device_SendEventPacket + /tmp/cc3Ze3Jq.s:232 .text.MIDI_Device_ConfigureEndpoints:0000000000000000 MIDI_Device_ConfigureEndpoints + +UNDEFINED SYMBOLS +USB_DeviceState +Endpoint_Read_Stream_LE +Endpoint_WaitUntilReady +Endpoint_Write_Stream_LE +Endpoint_ConfigureEndpoint_Prv diff --git a/firmware/LUFA/Drivers/USB/Class/Device/MIDI.o b/firmware/LUFA/Drivers/USB/Class/Device/MIDI.o new file mode 100644 index 0000000..80100ad Binary files /dev/null and b/firmware/LUFA/Drivers/USB/Class/Device/MIDI.o differ diff --git a/firmware/LUFA/Drivers/USB/Class/Device/MassStorage.c b/firmware/LUFA/Drivers/USB/Class/Device/MassStorage.c new file mode 100644 index 0000000..64d61df --- /dev/null +++ b/firmware/LUFA/Drivers/USB/Class/Device/MassStorage.c @@ -0,0 +1,247 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2010 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. +*/ + +#define __INCLUDE_FROM_USB_DRIVER +#include "../../HighLevel/USBMode.h" +#if defined(USB_CAN_BE_DEVICE) + +#define __INCLUDE_FROM_MS_DRIVER +#define __INCLUDE_FROM_MASSSTORAGE_DEVICE_C +#include "MassStorage.h" + +static volatile bool* CallbackIsResetSource; + +void MS_Device_ProcessControlRequest(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) +{ + if (!(Endpoint_IsSETUPReceived())) + return; + + if (USB_ControlRequest.wIndex != MSInterfaceInfo->Config.InterfaceNumber) + return; + + switch (USB_ControlRequest.bRequest) + { + case MS_REQ_MassStorageReset: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + Endpoint_ClearStatusStage(); + + MSInterfaceInfo->State.IsMassStoreReset = true; + } + + break; + case MS_REQ_GetMaxLUN: + if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + Endpoint_Write_Byte(MSInterfaceInfo->Config.TotalLUNs - 1); + Endpoint_ClearIN(); + Endpoint_ClearStatusStage(); + } + + break; + } +} + +bool MS_Device_ConfigureEndpoints(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) +{ + memset(&MSInterfaceInfo->State, 0x00, sizeof(MSInterfaceInfo->State)); + + for (uint8_t EndpointNum = 1; EndpointNum < ENDPOINT_TOTAL_ENDPOINTS; EndpointNum++) + { + uint16_t Size; + uint8_t Type; + uint8_t Direction; + bool DoubleBanked; + + if (EndpointNum == MSInterfaceInfo->Config.DataINEndpointNumber) + { + Size = MSInterfaceInfo->Config.DataINEndpointSize; + Direction = ENDPOINT_DIR_IN; + Type = EP_TYPE_BULK; + DoubleBanked = MSInterfaceInfo->Config.DataINEndpointDoubleBank; + } + else if (EndpointNum == MSInterfaceInfo->Config.DataOUTEndpointNumber) + { + Size = MSInterfaceInfo->Config.DataOUTEndpointSize; + Direction = ENDPOINT_DIR_OUT; + Type = EP_TYPE_BULK; + DoubleBanked = MSInterfaceInfo->Config.DataOUTEndpointDoubleBank; + } + else + { + continue; + } + + if (!(Endpoint_ConfigureEndpoint(EndpointNum, Type, Direction, Size, + DoubleBanked ? ENDPOINT_BANK_DOUBLE : ENDPOINT_BANK_SINGLE))) + { + return false; + } + } + + return true; +} + +void MS_Device_USBTask(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) +{ + if (USB_DeviceState != DEVICE_STATE_Configured) + return; + + Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataOUTEndpointNumber); + + if (Endpoint_IsReadWriteAllowed()) + { + if (MS_Device_ReadInCommandBlock(MSInterfaceInfo)) + { + if (MSInterfaceInfo->State.CommandBlock.Flags & MS_COMMAND_DIR_DATA_IN) + Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataINEndpointNumber); + + MSInterfaceInfo->State.CommandStatus.Status = CALLBACK_MS_Device_SCSICommandReceived(MSInterfaceInfo) ? + MS_SCSI_COMMAND_Pass : MS_SCSI_COMMAND_Fail; + MSInterfaceInfo->State.CommandStatus.Signature = MS_CSW_SIGNATURE; + MSInterfaceInfo->State.CommandStatus.Tag = MSInterfaceInfo->State.CommandBlock.Tag; + MSInterfaceInfo->State.CommandStatus.DataTransferResidue = MSInterfaceInfo->State.CommandBlock.DataTransferLength; + + if ((MSInterfaceInfo->State.CommandStatus.Status == MS_SCSI_COMMAND_Fail) && + (MSInterfaceInfo->State.CommandStatus.DataTransferResidue)) + { + Endpoint_StallTransaction(); + } + + MS_Device_ReturnCommandStatus(MSInterfaceInfo); + } + } + + if (MSInterfaceInfo->State.IsMassStoreReset) + { + Endpoint_ResetFIFO(MSInterfaceInfo->Config.DataOUTEndpointNumber); + Endpoint_ResetFIFO(MSInterfaceInfo->Config.DataINEndpointNumber); + + Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataOUTEndpointNumber); + Endpoint_ClearStall(); + Endpoint_ResetDataToggle(); + Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataINEndpointNumber); + Endpoint_ClearStall(); + Endpoint_ResetDataToggle(); + + MSInterfaceInfo->State.IsMassStoreReset = false; + } +} + +static bool MS_Device_ReadInCommandBlock(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) +{ + Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataOUTEndpointNumber); + + CallbackIsResetSource = &MSInterfaceInfo->State.IsMassStoreReset; + if (Endpoint_Read_Stream_LE(&MSInterfaceInfo->State.CommandBlock, + (sizeof(MS_CommandBlockWrapper_t) - 16), + StreamCallback_MS_Device_AbortOnMassStoreReset)) + { + return false; + } + + if ((MSInterfaceInfo->State.CommandBlock.Signature != MS_CBW_SIGNATURE) || + (MSInterfaceInfo->State.CommandBlock.LUN >= MSInterfaceInfo->Config.TotalLUNs) || + (MSInterfaceInfo->State.CommandBlock.Flags & 0x1F) || + (MSInterfaceInfo->State.CommandBlock.SCSICommandLength == 0) || + (MSInterfaceInfo->State.CommandBlock.SCSICommandLength > 16)) + { + Endpoint_StallTransaction(); + Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataINEndpointNumber); + Endpoint_StallTransaction(); + + return false; + } + + CallbackIsResetSource = &MSInterfaceInfo->State.IsMassStoreReset; + if (Endpoint_Read_Stream_LE(&MSInterfaceInfo->State.CommandBlock.SCSICommandData, + MSInterfaceInfo->State.CommandBlock.SCSICommandLength, + StreamCallback_MS_Device_AbortOnMassStoreReset)) + { + return false; + } + + Endpoint_ClearOUT(); + + return true; +} + +static void MS_Device_ReturnCommandStatus(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) +{ + Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataOUTEndpointNumber); + + while (Endpoint_IsStalled()) + { + #if !defined(INTERRUPT_CONTROL_ENDPOINT) + USB_USBTask(); + #endif + + if (MSInterfaceInfo->State.IsMassStoreReset) + return; + } + + Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataINEndpointNumber); + + while (Endpoint_IsStalled()) + { + #if !defined(INTERRUPT_CONTROL_ENDPOINT) + USB_USBTask(); + #endif + + if (MSInterfaceInfo->State.IsMassStoreReset) + return; + } + + CallbackIsResetSource = &MSInterfaceInfo->State.IsMassStoreReset; + if (Endpoint_Write_Stream_LE(&MSInterfaceInfo->State.CommandStatus, sizeof(MS_CommandStatusWrapper_t), + StreamCallback_MS_Device_AbortOnMassStoreReset)) + { + return; + } + + Endpoint_ClearIN(); +} + +static uint8_t StreamCallback_MS_Device_AbortOnMassStoreReset(void) +{ + #if !defined(INTERRUPT_CONTROL_ENDPOINT) + USB_USBTask(); + #endif + + if (*CallbackIsResetSource) + return STREAMCALLBACK_Abort; + else + return STREAMCALLBACK_Continue; +} + +#endif + diff --git a/firmware/LUFA/Drivers/USB/Class/Device/MassStorage.h b/firmware/LUFA/Drivers/USB/Class/Device/MassStorage.h new file mode 100644 index 0000000..31d3ba9 --- /dev/null +++ b/firmware/LUFA/Drivers/USB/Class/Device/MassStorage.h @@ -0,0 +1,177 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief Device mode driver for the library USB Mass Storage Class driver. + * + * Device mode driver for the library USB Mass Storage Class driver. + * + * \note This file should not be included directly. It is automatically included as needed by the USB module driver + * dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassMS + * @defgroup Group_USBClassMSDevice Mass Storage Class Device Mode Driver + * + * \section Sec_Dependencies Module Source Dependencies + * The following files must be built with any user project that uses this module: + * - LUFA/Drivers/USB/Class/Device/MassStorage.c (Makefile source module name: LUFA_SRC_USBCLASS) + * + * \section Module Description + * Device Mode USB Class driver framework interface, for the Mass Storage USB Class driver. + * + * @{ + */ + +#ifndef _MS_CLASS_DEVICE_H_ +#define _MS_CLASS_DEVICE_H_ + + /* Includes: */ + #include "../../USB.h" + #include "../Common/MassStorage.h" + + #include + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(__INCLUDE_FROM_MS_DRIVER) + #error Do not include this file directly. Include LUFA/Drivers/USB.h instead. + #endif + + #if defined(__INCLUDE_FROM_MASSSTORAGE_DEVICE_C) && defined(NO_STREAM_CALLBACKS) + #error The NO_STREAM_CALLBACKS compile time option cannot be used in projects using the library Class drivers. + #endif + + /* Public Interface - May be used in end-application: */ + /* Type Defines: */ + /** \brief Mass Storage Class Device Mode Configuration and State Structure. + * + * Class state structure. An instance of this structure should be made for each Mass Storage interface + * within the user application, and passed to each of the Mass Storage class driver functions as the + * MSInterfaceInfo parameter. This stores each Mass Storage interface's configuration and state information. + */ + typedef struct + { + const struct + { + uint8_t InterfaceNumber; /**< Interface number of the Mass Storage interface within the device. */ + + uint8_t DataINEndpointNumber; /**< Endpoint number of the Mass Storage interface's IN data endpoint. */ + uint16_t DataINEndpointSize; /**< Size in bytes of the Mass Storage interface's IN data endpoint. */ + bool DataINEndpointDoubleBank; /**< Indicates if the Mass Storage interface's IN data endpoint should use double banking. */ + + uint8_t DataOUTEndpointNumber; /**< Endpoint number of the Mass Storage interface's OUT data endpoint. */ + uint16_t DataOUTEndpointSize; /**< Size in bytes of the Mass Storage interface's OUT data endpoint. */ + bool DataOUTEndpointDoubleBank; /**< Indicates if the Mass Storage interface's OUT data endpoint should use double banking. */ + + uint8_t TotalLUNs; /**< Total number of logical drives in the Mass Storage interface. */ + } Config; /**< Config data for the USB class interface within the device. All elements in this section + * must be set or the interface will fail to enumerate and operate correctly. + */ + struct + { + MS_CommandBlockWrapper_t CommandBlock; /**< Mass Storage class command block structure, stores the received SCSI + * command from the host which is to be processed. + */ + MS_CommandStatusWrapper_t CommandStatus; /**< Mass Storage class command status structure, set elements to indicate + * the issued command's success or failure to the host. + */ + volatile bool IsMassStoreReset; /**< Flag indicating that the host has requested that the Mass Storage interface be reset + * and that all current Mass Storage operations should immediately abort. + */ + } State; /**< State data for the USB class interface within the device. All elements in this section + * are reset to their defaults when the interface is enumerated. + */ + } USB_ClassInfo_MS_Device_t; + + /* Function Prototypes: */ + /** Configures the endpoints of a given Mass Storage interface, ready for use. This should be linked to the library + * \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration + * containing the given Mass Storage interface is selected. + * + * \note The endpoint index numbers as given in the interface's configuration structure must not overlap with any other + * interface, or endpoint bank corruption will occur. Gaps in the allocated endpoint numbers or non-sequential indexes + * within a single interface is allowed, but no two interfaces of any type have have interleaved endpoint indexes. + * + * \param[in,out] MSInterfaceInfo Pointer to a structure containing a Mass Storage Class configuration and state. + * + * \return Boolean true if the endpoints were successfully configured, false otherwise. + */ + bool MS_Device_ConfigureEndpoints(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** Processes incoming control requests from the host, that are directed to the given Mass Storage class interface. This should be + * linked to the library \ref EVENT_USB_Device_ControlRequest() event. + * + * \param[in,out] MSInterfaceInfo Pointer to a structure containing a Mass Storage Class configuration and state. + */ + void MS_Device_ProcessControlRequest(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** General management task for a given Mass Storage class interface, required for the correct operation of the interface. This should + * be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). + * + * \param[in,out] MSInterfaceInfo Pointer to a structure containing a Mass Storage configuration and state. + */ + void MS_Device_USBTask(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** Mass Storage class driver callback for the user processing of a received SCSI command. This callback will fire each time the + * host sends a SCSI command which requires processing by the user application. Inside this callback the user is responsible + * for the processing of the received SCSI command from the host. The SCSI command is available in the CommandBlock structure + * inside the Mass Storage class state structure passed as a parameter to the callback function. + * + * \param[in,out] MSInterfaceInfo Pointer to a structure containing a Mass Storage Class configuration and state. + * + * \return Boolean true if the SCSI command was successfully processed, false otherwise. + */ + bool CALLBACK_MS_Device_SCSICommandReceived(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /* Private Interface - For use in library only: */ + #if !defined(__DOXYGEN__) + /* Function Prototypes: */ + #if defined(__INCLUDE_FROM_MASSSTORAGE_DEVICE_C) + static void MS_Device_ReturnCommandStatus(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + static bool MS_Device_ReadInCommandBlock(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + static uint8_t StreamCallback_MS_Device_AbortOnMassStoreReset(void); + #endif + + #endif + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + +/** @} */ + diff --git a/firmware/LUFA/Drivers/USB/Class/Device/MassStorage.lst b/firmware/LUFA/Drivers/USB/Class/Device/MassStorage.lst new file mode 100644 index 0000000..12dc787 --- /dev/null +++ b/firmware/LUFA/Drivers/USB/Class/Device/MassStorage.lst @@ -0,0 +1,643 @@ + 1 .file "MassStorage.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.StreamCallback_MS_Device_AbortOnMassStoreReset,"ax",@progbits + 18 StreamCallback_MS_Device_AbortOnMassStoreReset: + 19 .LFB86: + 20 .LSM0: + 21 /* prologue: function */ + 22 /* frame size = 0 */ + 23 .LSM1: + 24 0000 0E94 0000 call USB_USBTask + 25 .LSM2: + 26 0004 E091 0000 lds r30,CallbackIsResetSource + 27 0008 F091 0000 lds r31,(CallbackIsResetSource)+1 + 28 000c 8081 ld r24,Z + 29 /* epilogue start */ + 30 .LSM3: + 31 000e 0895 ret + 32 .LFE86: + 34 .section .text.MS_Device_USBTask,"ax",@progbits + 35 .global MS_Device_USBTask + 37 MS_Device_USBTask: + 38 .LFB83: + 39 .LSM4: + 40 .LVL0: + 41 0000 0F93 push r16 + 42 0002 1F93 push r17 + 43 0004 CF93 push r28 + 44 0006 DF93 push r29 + 45 /* prologue: function */ + 46 /* frame size = 0 */ + 47 0008 EC01 movw r28,r24 + 48 .LSM5: + 49 000a 8091 0000 lds r24,USB_DeviceState + 50 .LVL1: + 51 000e 8430 cpi r24,lo8(4) + 52 0010 01F0 breq .+2 + 53 0012 00C0 rjmp .L14 + 54 .LSM6: + 55 0014 9D81 ldd r25,Y+5 + 56 .LBB112: + 57 .LBB113: + 58 .LSM7: + 59 0016 9093 E900 sts 233,r25 + 60 .LBE113: + 61 .LBE112: + 62 .LBB114: + 63 .LBB115: + 64 .LSM8: + 65 001a 8091 E800 lds r24,232 + 66 .LBE115: + 67 .LBE114: + 68 .LSM9: + 69 001e 85FF sbrs r24,5 + 70 0020 00C0 rjmp .L5 + 71 .LBB116: + 72 .LBB117: + 73 .LBB124: + 74 .LBB125: + 75 .LSM10: + 76 0022 9093 E900 sts 233,r25 + 77 .LBE125: + 78 .LBE124: + 79 .LSM11: + 80 0026 8E01 movw r16,r28 + 81 0028 0A5C subi r16,lo8(-(54)) + 82 002a 1F4F sbci r17,hi8(-(54)) + 83 002c 1093 0000 sts (CallbackIsResetSource)+1,r17 + 84 0030 0093 0000 sts CallbackIsResetSource,r16 + 85 .LBE117: + 86 .LSM12: + 87 0034 CE01 movw r24,r28 + 88 0036 0A96 adiw r24,10 + 89 0038 6FE0 ldi r22,lo8(15) + 90 003a 70E0 ldi r23,hi8(15) + 91 003c 40E0 ldi r20,lo8(gs(StreamCallback_MS_Device_AbortOnMassStoreReset)) + 92 003e 50E0 ldi r21,hi8(gs(StreamCallback_MS_Device_AbortOnMassStoreReset)) + 93 0040 0E94 0000 call Endpoint_Read_Stream_LE + 94 .LBB128: + 95 0044 8823 tst r24 + 96 0046 01F0 breq .+2 + 97 0048 00C0 rjmp .L5 + 98 .LSM13: + 99 004a 8A85 ldd r24,Y+10 + 100 004c 9B85 ldd r25,Y+11 + 101 004e AC85 ldd r26,Y+12 + 102 0050 BD85 ldd r27,Y+13 + 103 0052 8555 subi r24,lo8(1128420181) + 104 0054 9345 sbci r25,hi8(1128420181) + 105 0056 A244 sbci r26,hlo8(1128420181) + 106 0058 B344 sbci r27,hhi8(1128420181) + 107 005a 01F4 brne .L6 + 108 005c 9F89 ldd r25,Y+23 + 109 005e 8985 ldd r24,Y+9 + 110 0060 9817 cp r25,r24 + 111 0062 00F4 brsh .L6 + 112 0064 8E89 ldd r24,Y+22 + 113 0066 90E0 ldi r25,lo8(0) + 114 0068 8F71 andi r24,lo8(31) + 115 006a 9070 andi r25,hi8(31) + 116 006c 892B or r24,r25 + 117 006e 01F4 brne .L6 + 118 0070 688D ldd r22,Y+24 + 119 0072 6623 tst r22 + 120 0074 01F0 breq .L6 + 121 0076 6131 cpi r22,lo8(17) + 122 0078 00F0 brlo .L7 + 123 .L6: + 124 .LBB122: + 125 .LBB123: + 126 .LSM14: + 127 007a 8091 EB00 lds r24,235 + 128 007e 8062 ori r24,lo8(32) + 129 0080 8093 EB00 sts 235,r24 + 130 .LBE123: + 131 .LBE122: + 132 .LSM15: + 133 0084 8981 ldd r24,Y+1 + 134 .LBB120: + 135 .LBB121: + 136 .LSM16: + 137 0086 8093 E900 sts 233,r24 + 138 .LBE121: + 139 .LBE120: + 140 .LBB118: + 141 .LBB119: + 142 .LSM17: + 143 008a 8091 EB00 lds r24,235 + 144 008e 8062 ori r24,lo8(32) + 145 0090 8093 EB00 sts 235,r24 + 146 0094 00C0 rjmp .L5 + 147 .L7: + 148 .LBE119: + 149 .LBE118: + 150 .LSM18: + 151 0096 1093 0000 sts (CallbackIsResetSource)+1,r17 + 152 009a 0093 0000 sts CallbackIsResetSource,r16 + 153 .LBE128: + 154 .LSM19: + 155 009e CE01 movw r24,r28 + 156 00a0 4996 adiw r24,25 + 157 00a2 70E0 ldi r23,lo8(0) + 158 00a4 40E0 ldi r20,lo8(gs(StreamCallback_MS_Device_AbortOnMassStoreReset)) + 159 00a6 50E0 ldi r21,hi8(gs(StreamCallback_MS_Device_AbortOnMassStoreReset)) + 160 00a8 0E94 0000 call Endpoint_Read_Stream_LE + 161 .LBB129: + 162 00ac 8823 tst r24 + 163 00ae 01F0 breq .+2 + 164 00b0 00C0 rjmp .L5 + 165 .LBB126: + 166 .LBB127: + 167 .LSM20: + 168 00b2 8091 E800 lds r24,232 + 169 00b6 8B77 andi r24,lo8(123) + 170 00b8 8093 E800 sts 232,r24 + 171 .LBE127: + 172 .LBE126: + 173 .LBE129: + 174 .LBE116: + 175 .LSM21: + 176 00bc 8E89 ldd r24,Y+22 + 177 00be 87FF sbrs r24,7 + 178 00c0 00C0 rjmp .L8 + 179 .LSM22: + 180 00c2 8981 ldd r24,Y+1 + 181 .LBB130: + 182 .LBB131: + 183 .LSM23: + 184 00c4 8093 E900 sts 233,r24 + 185 .L8: + 186 .LBE131: + 187 .LBE130: + 188 .LSM24: + 189 00c8 CE01 movw r24,r28 + 190 00ca 0E94 0000 call CALLBACK_MS_Device_SCSICommandReceived + 191 00ce 91E0 ldi r25,lo8(1) + 192 00d0 9827 eor r25,r24 + 193 00d2 9DAB std Y+53,r25 + 194 .LSM25: + 195 00d4 25E5 ldi r18,lo8(1396855637) + 196 00d6 33E5 ldi r19,hi8(1396855637) + 197 00d8 42E4 ldi r20,hlo8(1396855637) + 198 00da 53E5 ldi r21,hhi8(1396855637) + 199 00dc 29A7 std Y+41,r18 + 200 00de 3AA7 std Y+42,r19 + 201 00e0 4BA7 std Y+43,r20 + 202 00e2 5CA7 std Y+44,r21 + 203 .LSM26: + 204 00e4 2E85 ldd r18,Y+14 + 205 00e6 3F85 ldd r19,Y+15 + 206 00e8 4889 ldd r20,Y+16 + 207 00ea 5989 ldd r21,Y+17 + 208 00ec 2DA7 std Y+45,r18 + 209 00ee 3EA7 std Y+46,r19 + 210 00f0 4FA7 std Y+47,r20 + 211 00f2 58AB std Y+48,r21 + 212 .LSM27: + 213 00f4 2A89 ldd r18,Y+18 + 214 00f6 3B89 ldd r19,Y+19 + 215 00f8 4C89 ldd r20,Y+20 + 216 00fa 5D89 ldd r21,Y+21 + 217 00fc 29AB std Y+49,r18 + 218 00fe 3AAB std Y+50,r19 + 219 0100 4BAB std Y+51,r20 + 220 0102 5CAB std Y+52,r21 + 221 .LSM28: + 222 0104 9130 cpi r25,lo8(1) + 223 0106 01F4 brne .L9 + 224 0108 2115 cp r18,__zero_reg__ + 225 010a 3105 cpc r19,__zero_reg__ + 226 010c 4105 cpc r20,__zero_reg__ + 227 010e 5105 cpc r21,__zero_reg__ + 228 0110 01F0 breq .L9 + 229 .LBB132: + 230 .LBB133: + 231 .LSM29: + 232 0112 8091 EB00 lds r24,235 + 233 0116 8062 ori r24,lo8(32) + 234 0118 8093 EB00 sts 235,r24 + 235 .L9: + 236 .LBE133: + 237 .LBE132: + 238 .LBB134: + 239 .LBB135: + 240 .LSM30: + 241 011c 8D81 ldd r24,Y+5 + 242 .LBB142: + 243 .LBB143: + 244 .LSM31: + 245 011e 8093 E900 sts 233,r24 + 246 0122 00C0 rjmp .L10 + 247 .L11: + 248 .LBE143: + 249 .LBE142: + 250 .LSM32: + 251 0124 0E94 0000 call USB_USBTask + 252 .LSM33: + 253 0128 8EA9 ldd r24,Y+54 + 254 012a 8823 tst r24 + 255 012c 01F4 brne .L5 + 256 .L10: + 257 .LBB140: + 258 .LBB141: + 259 .LSM34: + 260 012e 8091 EB00 lds r24,235 + 261 .LBE141: + 262 .LBE140: + 263 .LSM35: + 264 0132 85FD sbrc r24,5 + 265 0134 00C0 rjmp .L11 + 266 .LSM36: + 267 0136 8981 ldd r24,Y+1 + 268 .LBB138: + 269 .LBB139: + 270 .LSM37: + 271 0138 8093 E900 sts 233,r24 + 272 013c 00C0 rjmp .L12 + 273 .L13: + 274 .LBE139: + 275 .LBE138: + 276 .LSM38: + 277 013e 0E94 0000 call USB_USBTask + 278 .LSM39: + 279 0142 8EA9 ldd r24,Y+54 + 280 0144 8823 tst r24 + 281 0146 01F4 brne .L5 + 282 .L12: + 283 .LBB136: + 284 .LBB137: + 285 .LSM40: + 286 0148 8091 EB00 lds r24,235 + 287 .LBE137: + 288 .LBE136: + 289 .LSM41: + 290 014c 85FD sbrc r24,5 + 291 014e 00C0 rjmp .L13 + 292 .LSM42: + 293 0150 E696 adiw r28,54 + 294 0152 D093 0000 sts (CallbackIsResetSource)+1,r29 + 295 0156 C093 0000 sts CallbackIsResetSource,r28 + 296 015a E697 sbiw r28,54 + 297 .LBE135: + 298 .LSM43: + 299 015c CE01 movw r24,r28 + 300 015e 8996 adiw r24,41 + 301 0160 6DE0 ldi r22,lo8(13) + 302 0162 70E0 ldi r23,hi8(13) + 303 0164 40E0 ldi r20,lo8(gs(StreamCallback_MS_Device_AbortOnMassStoreReset)) + 304 0166 50E0 ldi r21,hi8(gs(StreamCallback_MS_Device_AbortOnMassStoreReset)) + 305 0168 0E94 0000 call Endpoint_Write_Stream_LE + 306 .LBB146: + 307 016c 8823 tst r24 + 308 016e 01F4 brne .L5 + 309 .LBB144: + 310 .LBB145: + 311 .LSM44: + 312 0170 8091 E800 lds r24,232 + 313 0174 8E77 andi r24,lo8(126) + 314 0176 8093 E800 sts 232,r24 + 315 .L5: + 316 .LBE145: + 317 .LBE144: + 318 .LBE146: + 319 .LBE134: + 320 .LSM45: + 321 017a 8EA9 ldd r24,Y+54 + 322 017c 8823 tst r24 + 323 017e 01F0 breq .L14 + 324 .LSM46: + 325 0180 4D81 ldd r20,Y+5 + 326 .LBB147: + 327 .LBB148: + 328 .LSM47: + 329 0182 21E0 ldi r18,lo8(1) + 330 0184 30E0 ldi r19,hi8(1) + 331 0186 C901 movw r24,r18 + 332 0188 042E mov r0,r20 + 333 018a 00C0 rjmp 2f + 334 018c 880F 1: lsl r24 + 335 018e 991F rol r25 + 336 0190 0A94 2: dec r0 + 337 0192 02F4 brpl 1b + 338 0194 8093 EA00 sts 234,r24 + 339 .LSM48: + 340 0198 1092 EA00 sts 234,__zero_reg__ + 341 .LBE148: + 342 .LBE147: + 343 .LSM49: + 344 019c 9981 ldd r25,Y+1 + 345 .LBB149: + 346 .LBB150: + 347 .LSM50: + 348 019e 092E mov r0,r25 + 349 01a0 00C0 rjmp 2f + 350 01a2 220F 1: lsl r18 + 351 01a4 331F rol r19 + 352 01a6 0A94 2: dec r0 + 353 01a8 02F4 brpl 1b + 354 01aa 2093 EA00 sts 234,r18 + 355 .LSM51: + 356 01ae 1092 EA00 sts 234,__zero_reg__ + 357 .LBE150: + 358 .LBE149: + 359 .LBB151: + 360 .LBB152: + 361 .LSM52: + 362 01b2 4093 E900 sts 233,r20 + 363 .LBE152: + 364 .LBE151: + 365 .LBB153: + 366 .LBB154: + 367 .LSM53: + 368 01b6 8091 EB00 lds r24,235 + 369 01ba 8061 ori r24,lo8(16) + 370 01bc 8093 EB00 sts 235,r24 + 371 .LBE154: + 372 .LBE153: + 373 .LBB155: + 374 .LBB156: + 375 .LSM54: + 376 01c0 8091 EB00 lds r24,235 + 377 01c4 8860 ori r24,lo8(8) + 378 01c6 8093 EB00 sts 235,r24 + 379 .LBE156: + 380 .LBE155: + 381 .LBB157: + 382 .LBB158: + 383 .LSM55: + 384 01ca 9093 E900 sts 233,r25 + 385 .LBE158: + 386 .LBE157: + 387 .LBB159: + 388 .LBB160: + 389 .LSM56: + 390 01ce 8091 EB00 lds r24,235 + 391 01d2 8061 ori r24,lo8(16) + 392 01d4 8093 EB00 sts 235,r24 + 393 .LBE160: + 394 .LBE159: + 395 .LBB161: + 396 .LBB162: + 397 .LSM57: + 398 01d8 8091 EB00 lds r24,235 + 399 01dc 8860 ori r24,lo8(8) + 400 01de 8093 EB00 sts 235,r24 + 401 .LBE162: + 402 .LBE161: + 403 .LSM58: + 404 01e2 1EAA std Y+54,__zero_reg__ + 405 .L14: + 406 /* epilogue start */ + 407 .LSM59: + 408 01e4 DF91 pop r29 + 409 01e6 CF91 pop r28 + 410 .LVL2: + 411 01e8 1F91 pop r17 + 412 01ea 0F91 pop r16 + 413 01ec 0895 ret + 414 .LFE83: + 416 .section .text.MS_Device_ConfigureEndpoints,"ax",@progbits + 417 .global MS_Device_ConfigureEndpoints + 419 MS_Device_ConfigureEndpoints: + 420 .LFB82: + 421 .LSM60: + 422 .LVL3: + 423 0000 1F93 push r17 + 424 0002 CF93 push r28 + 425 0004 DF93 push r29 + 426 /* prologue: function */ + 427 /* frame size = 0 */ + 428 0006 EC01 movw r28,r24 + 429 .LSM61: + 430 0008 0A96 adiw r24,10 + 431 .LVL4: + 432 000a FC01 movw r30,r24 + 433 000c 8DE2 ldi r24,lo8(45) + 434 000e DF01 movw r26,r30 + 435 0010 1D92 st X+,__zero_reg__ + 436 0012 8A95 dec r24 + 437 0014 01F4 brne .-6 + 438 0016 11E0 ldi r17,lo8(1) + 439 .LVL5: + 440 .L24: + 441 .LBB163: + 442 .LBB164: + 443 .LSM62: + 444 0018 8981 ldd r24,Y+1 + 445 001a 1817 cp r17,r24 + 446 001c 01F4 brne .L16 + 447 .LSM63: + 448 001e EA81 ldd r30,Y+2 + 449 0020 FB81 ldd r31,Y+3 + 450 .LVL6: + 451 .LSM64: + 452 0022 8C81 ldd r24,Y+4 + 453 .LVL7: + 454 0024 61E0 ldi r22,lo8(1) + 455 .LVL8: + 456 0026 00C0 rjmp .L17 + 457 .LVL9: + 458 .L16: + 459 .LSM65: + 460 0028 8D81 ldd r24,Y+5 + 461 002a 1817 cp r17,r24 + 462 002c 01F4 brne .L18 + 463 .LSM66: + 464 002e EE81 ldd r30,Y+6 + 465 0030 FF81 ldd r31,Y+7 + 466 .LVL10: + 467 .LSM67: + 468 0032 8885 ldd r24,Y+8 + 469 .LVL11: + 470 0034 60E0 ldi r22,lo8(0) + 471 .LVL12: + 472 .L17: + 473 .LSM68: + 474 0036 8823 tst r24 + 475 0038 01F4 brne .L19 + 476 003a 40E0 ldi r20,lo8(0) + 477 003c 00C0 rjmp .L20 + 478 .L19: + 479 003e 44E0 ldi r20,lo8(4) + 480 .L20: + 481 0040 20E0 ldi r18,lo8(0) + 482 .LVL13: + 483 0042 88E0 ldi r24,lo8(8) + 484 0044 90E0 ldi r25,hi8(8) + 485 .LVL14: + 486 0046 00C0 rjmp .L21 + 487 .L22: + 488 .LBB165: + 489 .LBB166: + 490 .LBB167: + 491 .LBB168: + 492 .LSM69: + 493 0048 2F5F subi r18,lo8(-(1)) + 494 .LSM70: + 495 004a 880F lsl r24 + 496 004c 991F rol r25 + 497 .L21: + 498 .LSM71: + 499 004e 8E17 cp r24,r30 + 500 0050 9F07 cpc r25,r31 + 501 0052 00F0 brlo .L22 + 502 .LBE168: + 503 .LBE167: + 504 .LBE166: + 505 .LSM72: + 506 0054 6068 ori r22,lo8(-128) + 507 0056 4260 ori r20,lo8(2) + 508 0058 2295 swap r18 + 509 005a 207F andi r18,lo8(-16) + 510 005c 422B or r20,r18 + 511 005e 812F mov r24,r17 + 512 .LVL15: + 513 0060 0E94 0000 call Endpoint_ConfigureEndpoint_Prv + 514 .LVL16: + 515 .LBE165: + 516 .LSM73: + 517 0064 8823 tst r24 + 518 0066 01F0 breq .L23 + 519 .L18: + 520 .LBE164: + 521 .LSM74: + 522 0068 1F5F subi r17,lo8(-(1)) + 523 006a 1530 cpi r17,lo8(5) + 524 006c 01F4 brne .L24 + 525 006e 81E0 ldi r24,lo8(1) + 526 .L23: + 527 /* epilogue start */ + 528 .LBE163: + 529 .LSM75: + 530 0070 DF91 pop r29 + 531 0072 CF91 pop r28 + 532 .LVL17: + 533 0074 1F91 pop r17 + 534 .LVL18: + 535 0076 0895 ret + 536 .LFE82: + 538 .section .text.MS_Device_ProcessControlRequest,"ax",@progbits + 539 .global MS_Device_ProcessControlRequest + 541 MS_Device_ProcessControlRequest: + 542 .LFB81: + 543 .LSM76: + 544 .LVL19: + 545 0000 CF93 push r28 + 546 0002 DF93 push r29 + 547 /* prologue: function */ + 548 /* frame size = 0 */ + 549 0004 EC01 movw r28,r24 + 550 .LBB169: + 551 .LBB170: + 552 .LSM77: + 553 0006 8091 E800 lds r24,232 + 554 .LVL20: + 555 .LBE170: + 556 .LBE169: + 557 .LSM78: + 558 000a 83FF sbrs r24,3 + 559 000c 00C0 rjmp .L31 + 560 .LSM79: + 561 000e 8881 ld r24,Y + 562 0010 90E0 ldi r25,lo8(0) + 563 0012 2091 0000 lds r18,USB_ControlRequest+4 + 564 0016 3091 0000 lds r19,(USB_ControlRequest+4)+1 + 565 001a 2817 cp r18,r24 + 566 001c 3907 cpc r19,r25 + 567 001e 01F4 brne .L31 + 568 .LSM80: + 569 0020 8091 0000 lds r24,USB_ControlRequest+1 + 570 0024 8E3F cpi r24,lo8(-2) + 571 0026 01F0 breq .L29 + 572 0028 8F3F cpi r24,lo8(-1) + 573 002a 01F4 brne .L31 + 574 .LSM81: + 575 002c 8091 0000 lds r24,USB_ControlRequest + 576 0030 8132 cpi r24,lo8(33) + 577 0032 01F4 brne .L31 + 578 .LBB171: + 579 .LBB172: + 580 .LSM82: + 581 0034 8091 E800 lds r24,232 + 582 0038 877F andi r24,lo8(-9) + 583 003a 8093 E800 sts 232,r24 + 584 .LBE172: + 585 .LBE171: + 586 .LSM83: + 587 003e 0E94 0000 call Endpoint_ClearStatusStage + 588 .LSM84: + 589 0042 81E0 ldi r24,lo8(1) + 590 0044 8EAB std Y+54,r24 + 591 0046 00C0 rjmp .L31 + 592 .L29: + 593 .LSM85: + 594 0048 8091 0000 lds r24,USB_ControlRequest + 595 004c 813A cpi r24,lo8(-95) + 596 004e 01F4 brne .L31 + 597 .LBB173: + 598 .LBB174: + 599 .LSM86: + 600 0050 8091 E800 lds r24,232 + 601 0054 877F andi r24,lo8(-9) + 602 0056 8093 E800 sts 232,r24 + 603 .LBE174: + 604 .LBE173: + 605 .LSM87: + 606 005a 8985 ldd r24,Y+9 + 607 005c 8150 subi r24,lo8(-(-1)) + 608 .LBB175: + 609 .LBB176: + 610 .LSM88: + 611 005e 8093 F100 sts 241,r24 + 612 .LBE176: + 613 .LBE175: + 614 .LBB177: + 615 .LBB178: + 616 .LSM89: + 617 0062 8091 E800 lds r24,232 + 618 0066 8E77 andi r24,lo8(126) + 619 0068 8093 E800 sts 232,r24 + 620 .LBE178: + 621 .LBE177: + 622 .LSM90: + 623 006c 0E94 0000 call Endpoint_ClearStatusStage + 624 .L31: + 625 /* epilogue start */ + 626 .LSM91: + 627 0070 DF91 pop r29 + 628 0072 CF91 pop r28 + 629 .LVL21: + 630 0074 0895 ret + 631 .LFE81: + 633 .lcomm CallbackIsResetSource,2 + 682 .Letext0: +DEFINED SYMBOLS + *ABS*:0000000000000000 MassStorage.c + /tmp/ccHFx5pp.s:2 *ABS*:000000000000003f __SREG__ + /tmp/ccHFx5pp.s:3 *ABS*:000000000000003e __SP_H__ + /tmp/ccHFx5pp.s:4 *ABS*:000000000000003d __SP_L__ + /tmp/ccHFx5pp.s:5 *ABS*:0000000000000034 __CCP__ + /tmp/ccHFx5pp.s:6 *ABS*:0000000000000000 __tmp_reg__ + /tmp/ccHFx5pp.s:7 *ABS*:0000000000000001 __zero_reg__ + /tmp/ccHFx5pp.s:18 .text.StreamCallback_MS_Device_AbortOnMassStoreReset:0000000000000000 StreamCallback_MS_Device_AbortOnMassStoreReset + .bss:0000000000000000 CallbackIsResetSource + /tmp/ccHFx5pp.s:37 .text.MS_Device_USBTask:0000000000000000 MS_Device_USBTask + /tmp/ccHFx5pp.s:419 .text.MS_Device_ConfigureEndpoints:0000000000000000 MS_Device_ConfigureEndpoints + /tmp/ccHFx5pp.s:541 .text.MS_Device_ProcessControlRequest:0000000000000000 MS_Device_ProcessControlRequest + +UNDEFINED SYMBOLS +USB_USBTask +USB_DeviceState +Endpoint_Read_Stream_LE +CALLBACK_MS_Device_SCSICommandReceived +Endpoint_Write_Stream_LE +Endpoint_ConfigureEndpoint_Prv +USB_ControlRequest +Endpoint_ClearStatusStage +__do_clear_bss diff --git a/firmware/LUFA/Drivers/USB/Class/Device/MassStorage.o b/firmware/LUFA/Drivers/USB/Class/Device/MassStorage.o new file mode 100644 index 0000000..2dbf5cd Binary files /dev/null and b/firmware/LUFA/Drivers/USB/Class/Device/MassStorage.o differ diff --git a/firmware/LUFA/Drivers/USB/Class/Device/RNDIS.c b/firmware/LUFA/Drivers/USB/Class/Device/RNDIS.c new file mode 100644 index 0000000..c6de9e5 --- /dev/null +++ b/firmware/LUFA/Drivers/USB/Class/Device/RNDIS.c @@ -0,0 +1,496 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2010 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. +*/ + +#define __INCLUDE_FROM_USB_DRIVER +#include "../../HighLevel/USBMode.h" +#if defined(USB_CAN_BE_DEVICE) + +#define __INCLUDE_FROM_RNDIS_DRIVER +#define __INCLUDE_FROM_RNDIS_DEVICE_C +#include "RNDIS.h" + +static const uint32_t PROGMEM AdapterSupportedOIDList[] = + { + OID_GEN_SUPPORTED_LIST, + OID_GEN_PHYSICAL_MEDIUM, + OID_GEN_HARDWARE_STATUS, + OID_GEN_MEDIA_SUPPORTED, + OID_GEN_MEDIA_IN_USE, + OID_GEN_MAXIMUM_FRAME_SIZE, + OID_GEN_MAXIMUM_TOTAL_SIZE, + OID_GEN_LINK_SPEED, + OID_GEN_TRANSMIT_BLOCK_SIZE, + OID_GEN_RECEIVE_BLOCK_SIZE, + OID_GEN_VENDOR_ID, + OID_GEN_VENDOR_DESCRIPTION, + OID_GEN_CURRENT_PACKET_FILTER, + OID_GEN_MAXIMUM_TOTAL_SIZE, + OID_GEN_MEDIA_CONNECT_STATUS, + OID_GEN_XMIT_OK, + OID_GEN_RCV_OK, + OID_GEN_XMIT_ERROR, + OID_GEN_RCV_ERROR, + OID_GEN_RCV_NO_BUFFER, + OID_802_3_PERMANENT_ADDRESS, + OID_802_3_CURRENT_ADDRESS, + OID_802_3_MULTICAST_LIST, + OID_802_3_MAXIMUM_LIST_SIZE, + OID_802_3_RCV_ERROR_ALIGNMENT, + OID_802_3_XMIT_ONE_COLLISION, + OID_802_3_XMIT_MORE_COLLISIONS, + }; + +void RNDIS_Device_ProcessControlRequest(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) +{ + if (!(Endpoint_IsSETUPReceived())) + return; + + if (USB_ControlRequest.wIndex != RNDISInterfaceInfo->Config.ControlInterfaceNumber) + return; + + switch (USB_ControlRequest.bRequest) + { + case RNDIS_REQ_SendEncapsulatedCommand: + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + { + Endpoint_ClearSETUP(); + Endpoint_Read_Control_Stream_LE(RNDISInterfaceInfo->State.RNDISMessageBuffer, USB_ControlRequest.wLength); + Endpoint_ClearIN(); + + RNDIS_Device_ProcessRNDISControlMessage(RNDISInterfaceInfo); + } + + break; + case RNDIS_REQ_GetEncapsulatedResponse: + if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) + { + RNDIS_Message_Header_t* MessageHeader = (RNDIS_Message_Header_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer; + + if (!(MessageHeader->MessageLength)) + { + RNDISInterfaceInfo->State.RNDISMessageBuffer[0] = 0; + MessageHeader->MessageLength = 1; + } + + Endpoint_ClearSETUP(); + Endpoint_Write_Control_Stream_LE(RNDISInterfaceInfo->State.RNDISMessageBuffer, MessageHeader->MessageLength); + Endpoint_ClearOUT(); + + MessageHeader->MessageLength = 0; + } + + break; + } +} + +bool RNDIS_Device_ConfigureEndpoints(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) +{ + memset(&RNDISInterfaceInfo->State, 0x00, sizeof(RNDISInterfaceInfo->State)); + + for (uint8_t EndpointNum = 1; EndpointNum < ENDPOINT_TOTAL_ENDPOINTS; EndpointNum++) + { + uint16_t Size; + uint8_t Type; + uint8_t Direction; + bool DoubleBanked; + + if (EndpointNum == RNDISInterfaceInfo->Config.DataINEndpointNumber) + { + Size = RNDISInterfaceInfo->Config.DataINEndpointSize; + Direction = ENDPOINT_DIR_IN; + Type = EP_TYPE_BULK; + DoubleBanked = RNDISInterfaceInfo->Config.DataINEndpointDoubleBank; + } + else if (EndpointNum == RNDISInterfaceInfo->Config.DataOUTEndpointNumber) + { + Size = RNDISInterfaceInfo->Config.DataOUTEndpointSize; + Direction = ENDPOINT_DIR_OUT; + Type = EP_TYPE_BULK; + DoubleBanked = RNDISInterfaceInfo->Config.DataOUTEndpointDoubleBank; + } + else if (EndpointNum == RNDISInterfaceInfo->Config.NotificationEndpointNumber) + { + Size = RNDISInterfaceInfo->Config.NotificationEndpointSize; + Direction = ENDPOINT_DIR_IN; + Type = EP_TYPE_INTERRUPT; + DoubleBanked = RNDISInterfaceInfo->Config.NotificationEndpointDoubleBank; + } + else + { + continue; + } + + if (!(Endpoint_ConfigureEndpoint(EndpointNum, Type, Direction, Size, + DoubleBanked ? ENDPOINT_BANK_DOUBLE : ENDPOINT_BANK_SINGLE))) + { + return false; + } + } + + return true; +} + +void RNDIS_Device_USBTask(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) +{ + if (USB_DeviceState != DEVICE_STATE_Configured) + return; + + RNDIS_Message_Header_t* MessageHeader = (RNDIS_Message_Header_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer; + + Endpoint_SelectEndpoint(RNDISInterfaceInfo->Config.NotificationEndpointNumber); + + if (Endpoint_IsINReady() && RNDISInterfaceInfo->State.ResponseReady) + { + USB_Request_Header_t Notification = (USB_Request_Header_t) + { + .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE), + .bRequest = RNDIS_NOTIF_ResponseAvailable, + .wValue = 0, + .wIndex = 0, + .wLength = 0, + }; + + Endpoint_Write_Stream_LE(&Notification, sizeof(USB_Request_Header_t), NO_STREAM_CALLBACK); + + Endpoint_ClearIN(); + + RNDISInterfaceInfo->State.ResponseReady = false; + } + + if ((RNDISInterfaceInfo->State.CurrRNDISState == RNDIS_Data_Initialized) && !(MessageHeader->MessageLength)) + { + RNDIS_Packet_Message_t RNDISPacketHeader; + + Endpoint_SelectEndpoint(RNDISInterfaceInfo->Config.DataOUTEndpointNumber); + + if (Endpoint_IsOUTReceived() && !(RNDISInterfaceInfo->State.FrameIN.FrameInBuffer)) + { + Endpoint_Read_Stream_LE(&RNDISPacketHeader, sizeof(RNDIS_Packet_Message_t), NO_STREAM_CALLBACK); + + if (RNDISPacketHeader.DataLength > ETHERNET_FRAME_SIZE_MAX) + { + Endpoint_StallTransaction(); + return; + } + + Endpoint_Read_Stream_LE(RNDISInterfaceInfo->State.FrameIN.FrameData, RNDISPacketHeader.DataLength, NO_STREAM_CALLBACK); + + Endpoint_ClearOUT(); + + RNDISInterfaceInfo->State.FrameIN.FrameLength = RNDISPacketHeader.DataLength; + + RNDISInterfaceInfo->State.FrameIN.FrameInBuffer = true; + } + + Endpoint_SelectEndpoint(RNDISInterfaceInfo->Config.DataINEndpointNumber); + + if (Endpoint_IsINReady() && RNDISInterfaceInfo->State.FrameOUT.FrameInBuffer) + { + memset(&RNDISPacketHeader, 0, sizeof(RNDIS_Packet_Message_t)); + + RNDISPacketHeader.MessageType = REMOTE_NDIS_PACKET_MSG; + RNDISPacketHeader.MessageLength = (sizeof(RNDIS_Packet_Message_t) + RNDISInterfaceInfo->State.FrameOUT.FrameLength); + RNDISPacketHeader.DataOffset = (sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t)); + RNDISPacketHeader.DataLength = RNDISInterfaceInfo->State.FrameOUT.FrameLength; + + Endpoint_Write_Stream_LE(&RNDISPacketHeader, sizeof(RNDIS_Packet_Message_t), NO_STREAM_CALLBACK); + Endpoint_Write_Stream_LE(RNDISInterfaceInfo->State.FrameOUT.FrameData, RNDISPacketHeader.DataLength, NO_STREAM_CALLBACK); + Endpoint_ClearIN(); + + RNDISInterfaceInfo->State.FrameOUT.FrameInBuffer = false; + } + } +} + +void RNDIS_Device_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) +{ + /* Note: Only a single buffer is used for both the received message and its response to save SRAM. Because of + this, response bytes should be filled in order so that they do not clobber unread data in the buffer. */ + + RNDIS_Message_Header_t* MessageHeader = (RNDIS_Message_Header_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer; + + switch (MessageHeader->MessageType) + { + case REMOTE_NDIS_INITIALIZE_MSG: + RNDISInterfaceInfo->State.ResponseReady = true; + + RNDIS_Initialize_Message_t* INITIALIZE_Message = + (RNDIS_Initialize_Message_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer; + RNDIS_Initialize_Complete_t* INITIALIZE_Response = + (RNDIS_Initialize_Complete_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer; + + INITIALIZE_Response->MessageType = REMOTE_NDIS_INITIALIZE_CMPLT; + INITIALIZE_Response->MessageLength = sizeof(RNDIS_Initialize_Complete_t); + INITIALIZE_Response->RequestId = INITIALIZE_Message->RequestId; + INITIALIZE_Response->Status = REMOTE_NDIS_STATUS_SUCCESS; + + INITIALIZE_Response->MajorVersion = REMOTE_NDIS_VERSION_MAJOR; + INITIALIZE_Response->MinorVersion = REMOTE_NDIS_VERSION_MINOR; + INITIALIZE_Response->DeviceFlags = REMOTE_NDIS_DF_CONNECTIONLESS; + INITIALIZE_Response->Medium = REMOTE_NDIS_MEDIUM_802_3; + INITIALIZE_Response->MaxPacketsPerTransfer = 1; + INITIALIZE_Response->MaxTransferSize = (sizeof(RNDIS_Packet_Message_t) + ETHERNET_FRAME_SIZE_MAX); + INITIALIZE_Response->PacketAlignmentFactor = 0; + INITIALIZE_Response->AFListOffset = 0; + INITIALIZE_Response->AFListSize = 0; + + RNDISInterfaceInfo->State.CurrRNDISState = RNDIS_Initialized; + + break; + case REMOTE_NDIS_HALT_MSG: + RNDISInterfaceInfo->State.ResponseReady = false; + MessageHeader->MessageLength = 0; + + RNDISInterfaceInfo->State.CurrRNDISState = RNDIS_Uninitialized; + + break; + case REMOTE_NDIS_QUERY_MSG: + RNDISInterfaceInfo->State.ResponseReady = true; + + RNDIS_Query_Message_t* QUERY_Message = (RNDIS_Query_Message_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer; + RNDIS_Query_Complete_t* QUERY_Response = (RNDIS_Query_Complete_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer; + uint32_t Query_Oid = QUERY_Message->Oid; + + void* QueryData = &RNDISInterfaceInfo->State.RNDISMessageBuffer[sizeof(RNDIS_Message_Header_t) + + QUERY_Message->InformationBufferOffset]; + void* ResponseData = &RNDISInterfaceInfo->State.RNDISMessageBuffer[sizeof(RNDIS_Query_Complete_t)]; + uint16_t ResponseSize; + + QUERY_Response->MessageType = REMOTE_NDIS_QUERY_CMPLT; + QUERY_Response->MessageLength = sizeof(RNDIS_Query_Complete_t); + + if (RNDIS_Device_ProcessNDISQuery(RNDISInterfaceInfo, Query_Oid, QueryData, QUERY_Message->InformationBufferLength, + ResponseData, &ResponseSize)) + { + QUERY_Response->Status = REMOTE_NDIS_STATUS_SUCCESS; + QUERY_Response->MessageLength += ResponseSize; + + QUERY_Response->InformationBufferLength = ResponseSize; + QUERY_Response->InformationBufferOffset = (sizeof(RNDIS_Query_Complete_t) - sizeof(RNDIS_Message_Header_t)); + } + else + { + QUERY_Response->Status = REMOTE_NDIS_STATUS_NOT_SUPPORTED; + + QUERY_Response->InformationBufferLength = 0; + QUERY_Response->InformationBufferOffset = 0; + } + + break; + case REMOTE_NDIS_SET_MSG: + RNDISInterfaceInfo->State.ResponseReady = true; + + RNDIS_Set_Message_t* SET_Message = (RNDIS_Set_Message_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer; + RNDIS_Set_Complete_t* SET_Response = (RNDIS_Set_Complete_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer; + uint32_t SET_Oid = SET_Message->Oid; + + SET_Response->MessageType = REMOTE_NDIS_SET_CMPLT; + SET_Response->MessageLength = sizeof(RNDIS_Set_Complete_t); + SET_Response->RequestId = SET_Message->RequestId; + + void* SetData = &RNDISInterfaceInfo->State.RNDISMessageBuffer[sizeof(RNDIS_Message_Header_t) + + SET_Message->InformationBufferOffset]; + + SET_Response->Status = RNDIS_Device_ProcessNDISSet(RNDISInterfaceInfo, SET_Oid, SetData, + SET_Message->InformationBufferLength) ? + REMOTE_NDIS_STATUS_SUCCESS : REMOTE_NDIS_STATUS_NOT_SUPPORTED; + break; + case REMOTE_NDIS_RESET_MSG: + RNDISInterfaceInfo->State.ResponseReady = true; + + RNDIS_Reset_Complete_t* RESET_Response = (RNDIS_Reset_Complete_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer; + + RESET_Response->MessageType = REMOTE_NDIS_RESET_CMPLT; + RESET_Response->MessageLength = sizeof(RNDIS_Reset_Complete_t); + RESET_Response->Status = REMOTE_NDIS_STATUS_SUCCESS; + RESET_Response->AddressingReset = 0; + + break; + case REMOTE_NDIS_KEEPALIVE_MSG: + RNDISInterfaceInfo->State.ResponseReady = true; + + RNDIS_KeepAlive_Message_t* KEEPALIVE_Message = + (RNDIS_KeepAlive_Message_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer; + RNDIS_KeepAlive_Complete_t* KEEPALIVE_Response = + (RNDIS_KeepAlive_Complete_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer; + + KEEPALIVE_Response->MessageType = REMOTE_NDIS_KEEPALIVE_CMPLT; + KEEPALIVE_Response->MessageLength = sizeof(RNDIS_KeepAlive_Complete_t); + KEEPALIVE_Response->RequestId = KEEPALIVE_Message->RequestId; + KEEPALIVE_Response->Status = REMOTE_NDIS_STATUS_SUCCESS; + + break; + } +} + +static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo, + const uint32_t OId, + void* const QueryData, + const uint16_t QuerySize, + void* ResponseData, + uint16_t* const ResponseSize) +{ + (void)QueryData; + (void)QuerySize; + + switch (OId) + { + case OID_GEN_SUPPORTED_LIST: + *ResponseSize = sizeof(AdapterSupportedOIDList); + + memcpy_P(ResponseData, AdapterSupportedOIDList, sizeof(AdapterSupportedOIDList)); + + return true; + case OID_GEN_PHYSICAL_MEDIUM: + *ResponseSize = sizeof(uint32_t); + + /* Indicate that the device is a true ethernet link */ + *((uint32_t*)ResponseData) = 0; + + return true; + case OID_GEN_HARDWARE_STATUS: + *ResponseSize = sizeof(uint32_t); + + *((uint32_t*)ResponseData) = NDIS_HardwareStatus_Ready; + + return true; + case OID_GEN_MEDIA_SUPPORTED: + case OID_GEN_MEDIA_IN_USE: + *ResponseSize = sizeof(uint32_t); + + *((uint32_t*)ResponseData) = REMOTE_NDIS_MEDIUM_802_3; + + return true; + case OID_GEN_VENDOR_ID: + *ResponseSize = sizeof(uint32_t); + + /* Vendor ID 0x0xFFFFFF is reserved for vendors who have not purchased a NDIS VID */ + *((uint32_t*)ResponseData) = 0x00FFFFFF; + + return true; + case OID_GEN_MAXIMUM_FRAME_SIZE: + case OID_GEN_TRANSMIT_BLOCK_SIZE: + case OID_GEN_RECEIVE_BLOCK_SIZE: + *ResponseSize = sizeof(uint32_t); + + *((uint32_t*)ResponseData) = ETHERNET_FRAME_SIZE_MAX; + + return true; + case OID_GEN_VENDOR_DESCRIPTION: + *ResponseSize = (strlen(RNDISInterfaceInfo->Config.AdapterVendorDescription) + 1); + + memcpy(ResponseData, RNDISInterfaceInfo->Config.AdapterVendorDescription, *ResponseSize); + + return true; + case OID_GEN_MEDIA_CONNECT_STATUS: + *ResponseSize = sizeof(uint32_t); + + *((uint32_t*)ResponseData) = REMOTE_NDIS_MEDIA_STATE_CONNECTED; + + return true; + case OID_GEN_LINK_SPEED: + *ResponseSize = sizeof(uint32_t); + + /* Indicate 10Mb/s link speed */ + *((uint32_t*)ResponseData) = 100000; + + return true; + case OID_802_3_PERMANENT_ADDRESS: + case OID_802_3_CURRENT_ADDRESS: + *ResponseSize = sizeof(MAC_Address_t); + + memcpy(ResponseData, &RNDISInterfaceInfo->Config.AdapterMACAddress, sizeof(MAC_Address_t)); + + return true; + case OID_802_3_MAXIMUM_LIST_SIZE: + *ResponseSize = sizeof(uint32_t); + + /* Indicate only one multicast address supported */ + *((uint32_t*)ResponseData) = 1; + + return true; + case OID_GEN_CURRENT_PACKET_FILTER: + *ResponseSize = sizeof(uint32_t); + + *((uint32_t*)ResponseData) = RNDISInterfaceInfo->State.CurrPacketFilter; + + return true; + case OID_GEN_XMIT_OK: + case OID_GEN_RCV_OK: + case OID_GEN_XMIT_ERROR: + case OID_GEN_RCV_ERROR: + case OID_GEN_RCV_NO_BUFFER: + case OID_802_3_RCV_ERROR_ALIGNMENT: + case OID_802_3_XMIT_ONE_COLLISION: + case OID_802_3_XMIT_MORE_COLLISIONS: + *ResponseSize = sizeof(uint32_t); + + /* Unused statistic OIDs - always return 0 for each */ + *((uint32_t*)ResponseData) = 0; + + return true; + case OID_GEN_MAXIMUM_TOTAL_SIZE: + *ResponseSize = sizeof(uint32_t); + + /* Indicate maximum overall buffer (Ethernet frame and RNDIS header) the adapter can handle */ + *((uint32_t*)ResponseData) = (RNDIS_MESSAGE_BUFFER_SIZE + ETHERNET_FRAME_SIZE_MAX); + + return true; + default: + return false; + } +} + +static bool RNDIS_Device_ProcessNDISSet(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo, + const uint32_t OId, + const void* SetData, + const uint16_t SetSize) +{ + (void)SetSize; + + switch (OId) + { + case OID_GEN_CURRENT_PACKET_FILTER: + RNDISInterfaceInfo->State.CurrPacketFilter = *((uint32_t*)SetData); + RNDISInterfaceInfo->State.CurrRNDISState = ((RNDISInterfaceInfo->State.CurrPacketFilter) ? + RNDIS_Data_Initialized : RNDIS_Data_Initialized); + + return true; + case OID_802_3_MULTICAST_LIST: + /* Do nothing - throw away the value from the host as it is unused */ + + return true; + default: + return false; + } +} + +#endif + diff --git a/firmware/LUFA/Drivers/USB/Class/Device/RNDIS.h b/firmware/LUFA/Drivers/USB/Class/Device/RNDIS.h new file mode 100644 index 0000000..9f24f29 --- /dev/null +++ b/firmware/LUFA/Drivers/USB/Class/Device/RNDIS.h @@ -0,0 +1,186 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief Device mode driver for the library USB RNDIS Class driver. + * + * Device mode driver for the library USB RNDIS Class driver. + * + * \note This file should not be included directly. It is automatically included as needed by the USB module driver + * dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassRNDIS + * @defgroup Group_USBClassRNDISDevice RNDIS Class Device Mode Driver + * + * \section Sec_Dependencies Module Source Dependencies + * The following files must be built with any user project that uses this module: + * - LUFA/Drivers/USB/Class/Device/RNDIS.c (Makefile source module name: LUFA_SRC_USBCLASS) + * + * \section Module Description + * Device Mode USB Class driver framework interface, for the RNDIS USB Class driver. + * + * @{ + */ + +#ifndef _RNDIS_CLASS_DEVICE_H_ +#define _RNDIS_CLASS_DEVICE_H_ + + /* Includes: */ + #include "../../USB.h" + #include "../Common/RNDIS.h" + + #include + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(__INCLUDE_FROM_RNDIS_DRIVER) + #error Do not include this file directly. Include LUFA/Drivers/USB.h instead. + #endif + + #if defined(__INCLUDE_FROM_RNDIS_DEVICE_C) && defined(NO_STREAM_CALLBACKS) + #error The NO_STREAM_CALLBACKS compile time option cannot be used in projects using the library Class drivers. + #endif + + + /* Public Interface - May be used in end-application: */ + /* Type Defines: */ + /** \brief RNDIS Class Device Mode Configuration and State Structure. + * + * Class state structure. An instance of this structure should be made for each RNDIS interface + * within the user application, and passed to each of the RNDIS class driver functions as the + * RNDISInterfaceInfo parameter. This stores each RNDIS interface's configuration and state information. + */ + typedef struct + { + const struct + { + uint8_t ControlInterfaceNumber; /**< Interface number of the CDC control interface within the device. */ + + uint8_t DataINEndpointNumber; /**< Endpoint number of the CDC interface's IN data endpoint. */ + uint16_t DataINEndpointSize; /**< Size in bytes of the CDC interface's IN data endpoint. */ + bool DataINEndpointDoubleBank; /**< Indicates if the RNDIS interface's IN data endpoint should use double banking. */ + + uint8_t DataOUTEndpointNumber; /**< Endpoint number of the CDC interface's OUT data endpoint. */ + uint16_t DataOUTEndpointSize; /**< Size in bytes of the CDC interface's OUT data endpoint. */ + bool DataOUTEndpointDoubleBank; /**< Indicates if the RNDIS interface's OUT data endpoint should use double banking. */ + + uint8_t NotificationEndpointNumber; /**< Endpoint number of the CDC interface's IN notification endpoint, if used. */ + uint16_t NotificationEndpointSize; /**< Size in bytes of the CDC interface's IN notification endpoint, if used. */ + bool NotificationEndpointDoubleBank; /**< Indicates if the RNDIS interface's notification endpoint should use double banking. */ + + char* AdapterVendorDescription; /**< String description of the adapter vendor. */ + MAC_Address_t AdapterMACAddress; /**< MAC address of the adapter. */ + } Config; /**< Config data for the USB class interface within the device. All elements in this section. + * must be set or the interface will fail to enumerate and operate correctly. + */ + struct + { + uint8_t RNDISMessageBuffer[RNDIS_MESSAGE_BUFFER_SIZE]; /**< Buffer to hold RNDIS messages to and from the host, + * managed by the class driver. + */ + bool ResponseReady; /**< Internal flag indicating if a RNDIS message is waiting to be returned to the host. */ + uint8_t CurrRNDISState; /**< Current RNDIS state of the adapter, a value from the \ref RNDIS_States_t enum. */ + uint32_t CurrPacketFilter; /**< Current packet filter mode, used internally by the class driver. */ + Ethernet_Frame_Info_t FrameIN; /**< Structure holding the last received Ethernet frame from the host, for user + * processing. + */ + Ethernet_Frame_Info_t FrameOUT; /**< Structure holding the next Ethernet frame to send to the host, populated by the + * user application. + */ + } State; /**< State data for the USB class interface within the device. All elements in this section + * are reset to their defaults when the interface is enumerated. + */ + } USB_ClassInfo_RNDIS_Device_t; + + /* Function Prototypes: */ + /** Configures the endpoints of a given RNDIS interface, ready for use. This should be linked to the library + * \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration + * containing the given HID interface is selected. + * + * \note The endpoint index numbers as given in the interface's configuration structure must not overlap with any other + * interface, or endpoint bank corruption will occur. Gaps in the allocated endpoint numbers or non-sequential indexes + * within a single interface is allowed, but no two interfaces of any type have have interleaved endpoint indexes. + * + * \param[in,out] RNDISInterfaceInfo Pointer to a structure containing a RNDIS Class configuration and state. + * + * \return Boolean true if the endpoints were successfully configured, false otherwise. + */ + bool RNDIS_Device_ConfigureEndpoints(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** Processes incoming control requests from the host, that are directed to the given RNDIS class interface. This should be + * linked to the library \ref EVENT_USB_Device_ControlRequest() event. + * + * \param[in,out] RNDISInterfaceInfo Pointer to a structure containing a RNDIS Class configuration and state. + */ + void RNDIS_Device_ProcessControlRequest(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /** General management task for a given HID class interface, required for the correct operation of the interface. This should + * be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). + * + * \param[in,out] RNDISInterfaceInfo Pointer to a structure containing a RNDIS Class configuration and state. + */ + void RNDIS_Device_USBTask(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + + /* Private Interface - For use in library only: */ + #if !defined(__DOXYGEN__) + /* Function Prototypes: */ + #if defined(__INCLUDE_FROM_RNDIS_DEVICE_C) + static void RNDIS_Device_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) + ATTR_NON_NULL_PTR_ARG(1); + static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo, + const uint32_t OId, + void* const QueryData, + const uint16_t QuerySize, + void* ResponseData, + uint16_t* const ResponseSize) ATTR_NON_NULL_PTR_ARG(1) + ATTR_NON_NULL_PTR_ARG(5) ATTR_NON_NULL_PTR_ARG(6); + static bool RNDIS_Device_ProcessNDISSet(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo, + const uint32_t OId, + const void* SetData, + const uint16_t SetSize) ATTR_NON_NULL_PTR_ARG(1) + ATTR_NON_NULL_PTR_ARG(3); + #endif + + #endif + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + +/** @} */ + diff --git a/firmware/LUFA/Drivers/USB/Class/Device/RNDIS.lst b/firmware/LUFA/Drivers/USB/Class/Device/RNDIS.lst new file mode 100644 index 0000000..3ae93a2 --- /dev/null +++ b/firmware/LUFA/Drivers/USB/Class/Device/RNDIS.lst @@ -0,0 +1,1519 @@ + 1 .file "RNDIS.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.RNDIS_Device_USBTask,"ax",@progbits + 17 .global RNDIS_Device_USBTask + 19 RNDIS_Device_USBTask: + 20 .LFB83: + 21 .LSM0: + 22 .LVL0: + 23 0000 EF92 push r14 + 24 0002 FF92 push r15 + 25 0004 0F93 push r16 + 26 0006 1F93 push r17 + 27 0008 DF93 push r29 + 28 000a CF93 push r28 + 29 000c CDB7 in r28,__SP_L__ + 30 000e DEB7 in r29,__SP_H__ + 31 0010 AC97 sbiw r28,44 + 32 0012 0FB6 in __tmp_reg__,__SREG__ + 33 0014 F894 cli + 34 0016 DEBF out __SP_H__,r29 + 35 0018 0FBE out __SREG__,__tmp_reg__ + 36 001a CDBF out __SP_L__,r28 + 37 /* prologue: function */ + 38 /* frame size = 44 */ + 39 001c 8C01 movw r16,r24 + 40 .LSM1: + 41 001e 8091 0000 lds r24,USB_DeviceState + 42 .LVL1: + 43 0022 8430 cpi r24,lo8(4) + 44 0024 01F0 breq .+2 + 45 0026 00C0 rjmp .L7 + 46 .LSM2: + 47 0028 D801 movw r26,r16 + 48 002a 1996 adiw r26,9 + 49 002c 8C91 ld r24,X + 50 .LBB43: + 51 .LBB44: + 52 .LSM3: + 53 002e 8093 E900 sts 233,r24 + 54 .LBE44: + 55 .LBE43: + 56 .LBB45: + 57 .LBB46: + 58 .LSM4: + 59 0032 8091 E800 lds r24,232 + 60 .LBE46: + 61 .LBE45: + 62 .LSM5: + 63 0036 80FF sbrs r24,0 + 64 0038 00C0 rjmp .L3 + 65 003a 0B56 subi r16,lo8(-(149)) + 66 003c 1F4F sbci r17,hi8(-(149)) + 67 003e F801 movw r30,r16 + 68 0040 8081 ld r24,Z + 69 0042 0559 subi r16,lo8(-(-149)) + 70 0044 1040 sbci r17,hi8(-(-149)) + 71 0046 8823 tst r24 + 72 0048 01F0 breq .L3 + 73 .LBB47: + 74 .LSM6: + 75 004a DE01 movw r26,r28 + 76 004c 1196 adiw r26,1 + 77 004e E0E0 ldi r30,lo8(C.9.3485) + 78 0050 F0E0 ldi r31,hi8(C.9.3485) + 79 0052 88E0 ldi r24,lo8(8) + 80 .L4: + 81 0054 0190 ld r0,Z+ + 82 0056 0D92 st X+,r0 + 83 0058 8150 subi r24,lo8(-(-1)) + 84 005a 01F4 brne .L4 + 85 .LSM7: + 86 005c CE01 movw r24,r28 + 87 005e 0196 adiw r24,1 + 88 0060 68E0 ldi r22,lo8(8) + 89 0062 70E0 ldi r23,hi8(8) + 90 0064 40E0 ldi r20,lo8(0) + 91 0066 50E0 ldi r21,hi8(0) + 92 0068 0E94 0000 call Endpoint_Write_Stream_LE + 93 .LBB48: + 94 .LBB49: + 95 .LSM8: + 96 006c 8091 E800 lds r24,232 + 97 0070 8E77 andi r24,lo8(126) + 98 0072 8093 E800 sts 232,r24 + 99 .LBE49: + 100 .LBE48: + 101 .LSM9: + 102 0076 0B56 subi r16,lo8(-(149)) + 103 0078 1F4F sbci r17,hi8(-(149)) + 104 007a D801 movw r26,r16 + 105 007c 1C92 st X,__zero_reg__ + 106 007e 0559 subi r16,lo8(-(-149)) + 107 0080 1040 sbci r17,hi8(-(-149)) + 108 .L3: + 109 .LBE47: + 110 .LSM10: + 111 0082 0A56 subi r16,lo8(-(150)) + 112 0084 1F4F sbci r17,hi8(-(150)) + 113 0086 F801 movw r30,r16 + 114 0088 8081 ld r24,Z + 115 008a 0659 subi r16,lo8(-(-150)) + 116 008c 1040 sbci r17,hi8(-(-150)) + 117 008e 8230 cpi r24,lo8(2) + 118 0090 01F0 breq .+2 + 119 0092 00C0 rjmp .L7 + 120 0094 F801 movw r30,r16 + 121 0096 818D ldd r24,Z+25 + 122 0098 928D ldd r25,Z+26 + 123 009a A38D ldd r26,Z+27 + 124 009c B48D ldd r27,Z+28 + 125 009e 0097 sbiw r24,0 + 126 00a0 A105 cpc r26,__zero_reg__ + 127 00a2 B105 cpc r27,__zero_reg__ + 128 00a4 01F0 breq .+2 + 129 00a6 00C0 rjmp .L7 + 130 .LBB50: + 131 .LSM11: + 132 00a8 8581 ldd r24,Z+5 + 133 .LBB51: + 134 .LBB52: + 135 .LSM12: + 136 00aa 8093 E900 sts 233,r24 + 137 .LBE52: + 138 .LBE51: + 139 .LBB53: + 140 .LBB54: + 141 .LSM13: + 142 00ae 8091 E800 lds r24,232 + 143 .LBE54: + 144 .LBE53: + 145 .LSM14: + 146 00b2 82FF sbrs r24,2 + 147 00b4 00C0 rjmp .L5 + 148 00b6 99E7 ldi r25,lo8(1657) + 149 00b8 E92E mov r14,r25 + 150 00ba 96E0 ldi r25,hi8(1657) + 151 00bc F92E mov r15,r25 + 152 00be E00E add r14,r16 + 153 00c0 F11E adc r15,r17 + 154 00c2 D701 movw r26,r14 + 155 00c4 8C91 ld r24,X + 156 00c6 8823 tst r24 + 157 00c8 01F4 brne .L5 + 158 .LSM15: + 159 00ca CE01 movw r24,r28 + 160 00cc 0196 adiw r24,1 + 161 00ce 6CE2 ldi r22,lo8(44) + 162 00d0 70E0 ldi r23,hi8(44) + 163 00d2 40E0 ldi r20,lo8(0) + 164 00d4 50E0 ldi r21,hi8(0) + 165 00d6 0E94 0000 call Endpoint_Read_Stream_LE + 166 .LSM16: + 167 00da 2D85 ldd r18,Y+13 + 168 00dc 3E85 ldd r19,Y+14 + 169 00de 4F85 ldd r20,Y+15 + 170 00e0 5889 ldd r21,Y+16 + 171 00e2 2D3D cpi r18,lo8(1501) + 172 00e4 B5E0 ldi r27,hi8(1501) + 173 00e6 3B07 cpc r19,r27 + 174 00e8 B0E0 ldi r27,hlo8(1501) + 175 00ea 4B07 cpc r20,r27 + 176 00ec B0E0 ldi r27,hhi8(1501) + 177 00ee 5B07 cpc r21,r27 + 178 00f0 00F0 brlo .L6 + 179 .LBB55: + 180 .LBB56: + 181 .LSM17: + 182 00f2 8091 EB00 lds r24,235 + 183 00f6 8062 ori r24,lo8(32) + 184 00f8 8093 EB00 sts 235,r24 + 185 00fc 00C0 rjmp .L7 + 186 .L6: + 187 .LBE56: + 188 .LBE55: + 189 .LSM18: + 190 00fe C801 movw r24,r16 + 191 0100 8556 subi r24,lo8(-(155)) + 192 0102 9F4F sbci r25,hi8(-(155)) + 193 0104 B901 movw r22,r18 + 194 0106 40E0 ldi r20,lo8(0) + 195 0108 50E0 ldi r21,hi8(0) + 196 010a 0E94 0000 call Endpoint_Read_Stream_LE + 197 .LBB57: + 198 .LBB58: + 199 .LSM19: + 200 010e 8091 E800 lds r24,232 + 201 0112 8B77 andi r24,lo8(123) + 202 0114 8093 E800 sts 232,r24 + 203 .LBE58: + 204 .LBE57: + 205 .LSM20: + 206 0118 0958 subi r16,lo8(-(1655)) + 207 011a 194F sbci r17,hi8(-(1655)) + 208 011c 8D85 ldd r24,Y+13 + 209 011e 9E85 ldd r25,Y+14 + 210 0120 F801 movw r30,r16 + 211 0122 9183 std Z+1,r25 + 212 0124 8083 st Z,r24 + 213 0126 0757 subi r16,lo8(-(-1655)) + 214 0128 1640 sbci r17,hi8(-(-1655)) + 215 .LSM21: + 216 012a 81E0 ldi r24,lo8(1) + 217 012c D701 movw r26,r14 + 218 012e 8C93 st X,r24 + 219 .L5: + 220 .LSM22: + 221 0130 F801 movw r30,r16 + 222 0132 8181 ldd r24,Z+1 + 223 .LBB59: + 224 .LBB60: + 225 .LSM23: + 226 0134 8093 E900 sts 233,r24 + 227 .LBE60: + 228 .LBE59: + 229 .LBB61: + 230 .LBB62: + 231 .LSM24: + 232 0138 8091 E800 lds r24,232 + 233 .LBE62: + 234 .LBE61: + 235 .LSM25: + 236 013c 80FF sbrs r24,0 + 237 013e 00C0 rjmp .L7 + 238 0140 88E5 ldi r24,lo8(3160) + 239 0142 E82E mov r14,r24 + 240 0144 8CE0 ldi r24,hi8(3160) + 241 0146 F82E mov r15,r24 + 242 0148 E00E add r14,r16 + 243 014a F11E adc r15,r17 + 244 014c D701 movw r26,r14 + 245 014e 8C91 ld r24,X + 246 0150 8823 tst r24 + 247 0152 01F4 brne .+2 + 248 0154 00C0 rjmp .L7 + 249 .LSM26: + 250 0156 FE01 movw r30,r28 + 251 0158 3196 adiw r30,1 + 252 015a 8CE2 ldi r24,lo8(44) + 253 015c DF01 movw r26,r30 + 254 015e 1D92 st X+,__zero_reg__ + 255 0160 8A95 dec r24 + 256 0162 01F4 brne .-6 + 257 .LSM27: + 258 0164 81E0 ldi r24,lo8(1) + 259 0166 90E0 ldi r25,hi8(1) + 260 0168 A0E0 ldi r26,hlo8(1) + 261 016a B0E0 ldi r27,hhi8(1) + 262 016c 8983 std Y+1,r24 + 263 016e 9A83 std Y+2,r25 + 264 0170 AB83 std Y+3,r26 + 265 0172 BC83 std Y+4,r27 + 266 .LSM28: + 267 0174 0A5A subi r16,lo8(-(3158)) + 268 0176 134F sbci r17,hi8(-(3158)) + 269 0178 D801 movw r26,r16 + 270 017a 8D91 ld r24,X+ + 271 017c 9C91 ld r25,X + 272 017e 8C96 adiw r24,44 + 273 0180 9C01 movw r18,r24 + 274 0182 40E0 ldi r20,lo8(0) + 275 0184 50E0 ldi r21,hi8(0) + 276 0186 8C97 sbiw r24,44 + 277 0188 2D83 std Y+5,r18 + 278 018a 3E83 std Y+6,r19 + 279 018c 4F83 std Y+7,r20 + 280 018e 5887 std Y+8,r21 + 281 .LSM29: + 282 0190 24E2 ldi r18,lo8(36) + 283 0192 30E0 ldi r19,hi8(36) + 284 0194 40E0 ldi r20,hlo8(36) + 285 0196 50E0 ldi r21,hhi8(36) + 286 0198 2987 std Y+9,r18 + 287 019a 3A87 std Y+10,r19 + 288 019c 4B87 std Y+11,r20 + 289 019e 5C87 std Y+12,r21 + 290 .LSM30: + 291 01a0 A0E0 ldi r26,lo8(0) + 292 01a2 B0E0 ldi r27,hi8(0) + 293 01a4 8D87 std Y+13,r24 + 294 01a6 9E87 std Y+14,r25 + 295 01a8 AF87 std Y+15,r26 + 296 01aa B88B std Y+16,r27 + 297 .LSM31: + 298 01ac CF01 movw r24,r30 + 299 01ae 6CE2 ldi r22,lo8(44) + 300 01b0 70E0 ldi r23,hi8(44) + 301 01b2 40E0 ldi r20,lo8(0) + 302 01b4 50E0 ldi r21,hi8(0) + 303 01b6 0E94 0000 call Endpoint_Write_Stream_LE + 304 .LSM32: + 305 01ba 6D85 ldd r22,Y+13 + 306 01bc 7E85 ldd r23,Y+14 + 307 01be C801 movw r24,r16 + 308 01c0 8C5D subi r24,lo8(-(-1500)) + 309 01c2 9540 sbci r25,hi8(-(-1500)) + 310 01c4 40E0 ldi r20,lo8(0) + 311 01c6 50E0 ldi r21,hi8(0) + 312 01c8 0E94 0000 call Endpoint_Write_Stream_LE + 313 .LBB63: + 314 .LBB64: + 315 .LSM33: + 316 01cc 8091 E800 lds r24,232 + 317 01d0 8E77 andi r24,lo8(126) + 318 01d2 8093 E800 sts 232,r24 + 319 .LBE64: + 320 .LBE63: + 321 .LSM34: + 322 01d6 F701 movw r30,r14 + 323 01d8 1082 st Z,__zero_reg__ + 324 .L7: + 325 /* epilogue start */ + 326 .LBE50: + 327 .LSM35: + 328 01da AC96 adiw r28,44 + 329 01dc 0FB6 in __tmp_reg__,__SREG__ + 330 01de F894 cli + 331 01e0 DEBF out __SP_H__,r29 + 332 01e2 0FBE out __SREG__,__tmp_reg__ + 333 01e4 CDBF out __SP_L__,r28 + 334 01e6 CF91 pop r28 + 335 01e8 DF91 pop r29 + 336 01ea 1F91 pop r17 + 337 01ec 0F91 pop r16 + 338 .LVL2: + 339 01ee FF90 pop r15 + 340 01f0 EF90 pop r14 + 341 01f2 0895 ret + 342 .LFE83: + 344 .section .text.RNDIS_Device_ConfigureEndpoints,"ax",@progbits + 345 .global RNDIS_Device_ConfigureEndpoints + 347 RNDIS_Device_ConfigureEndpoints: + 348 .LFB82: + 349 .LSM36: + 350 .LVL3: + 351 0000 1F93 push r17 + 352 0002 CF93 push r28 + 353 0004 DF93 push r29 + 354 /* prologue: function */ + 355 /* frame size = 0 */ + 356 0006 EC01 movw r28,r24 + 357 .LSM37: + 358 0008 4596 adiw r24,21 + 359 .LVL4: + 360 000a FC01 movw r30,r24 + 361 000c 84E4 ldi r24,lo8(3140) + 362 000e 9CE0 ldi r25,hi8(3140) + 363 0010 DF01 movw r26,r30 + 364 0012 9C01 movw r18,r24 + 365 0014 1D92 st X+,__zero_reg__ + 366 0016 2150 subi r18,1 + 367 0018 3040 sbci r19,0 + 368 001a 01F4 brne .-8 + 369 001c 11E0 ldi r17,lo8(1) + 370 .LVL5: + 371 .L19: + 372 .LBB65: + 373 .LBB66: + 374 .LSM38: + 375 001e 8981 ldd r24,Y+1 + 376 0020 1817 cp r17,r24 + 377 0022 01F4 brne .L10 + 378 .LSM39: + 379 0024 EA81 ldd r30,Y+2 + 380 0026 FB81 ldd r31,Y+3 + 381 .LVL6: + 382 .LSM40: + 383 0028 8C81 ldd r24,Y+4 + 384 .LVL7: + 385 002a 62E0 ldi r22,lo8(2) + 386 .LVL8: + 387 002c 00C0 rjmp .L22 + 388 .LVL9: + 389 .L10: + 390 .LSM41: + 391 002e 8D81 ldd r24,Y+5 + 392 0030 1817 cp r17,r24 + 393 0032 01F4 brne .L12 + 394 .LSM42: + 395 0034 EE81 ldd r30,Y+6 + 396 0036 FF81 ldd r31,Y+7 + 397 .LVL10: + 398 .LSM43: + 399 0038 8885 ldd r24,Y+8 + 400 .LVL11: + 401 003a 62E0 ldi r22,lo8(2) + 402 .LVL12: + 403 003c 30E0 ldi r19,lo8(0) + 404 .LVL13: + 405 003e 00C0 rjmp .L11 + 406 .LVL14: + 407 .L12: + 408 .LSM44: + 409 0040 8985 ldd r24,Y+9 + 410 0042 1817 cp r17,r24 + 411 0044 01F4 brne .L13 + 412 .LSM45: + 413 0046 EA85 ldd r30,Y+10 + 414 0048 FB85 ldd r31,Y+11 + 415 .LVL15: + 416 .LSM46: + 417 004a 8C85 ldd r24,Y+12 + 418 .LVL16: + 419 004c 63E0 ldi r22,lo8(3) + 420 .LVL17: + 421 .L22: + 422 004e 31E0 ldi r19,lo8(1) + 423 .LVL18: + 424 .L11: + 425 .LSM47: + 426 0050 8823 tst r24 + 427 0052 01F4 brne .L14 + 428 0054 40E0 ldi r20,lo8(0) + 429 0056 00C0 rjmp .L15 + 430 .L14: + 431 0058 44E0 ldi r20,lo8(4) + 432 .L15: + 433 005a 20E0 ldi r18,lo8(0) + 434 .LVL19: + 435 005c 88E0 ldi r24,lo8(8) + 436 005e 90E0 ldi r25,hi8(8) + 437 .LVL20: + 438 0060 00C0 rjmp .L16 + 439 .L17: + 440 .LBB67: + 441 .LBB68: + 442 .LBB69: + 443 .LBB70: + 444 .LSM48: + 445 0062 2F5F subi r18,lo8(-(1)) + 446 .LSM49: + 447 0064 880F lsl r24 + 448 0066 991F rol r25 + 449 .L16: + 450 .LSM50: + 451 0068 8E17 cp r24,r30 + 452 006a 9F07 cpc r25,r31 + 453 006c 00F0 brlo .L17 + 454 .LBE70: + 455 .LBE69: + 456 .LBE68: + 457 .LSM51: + 458 006e 6295 swap r22 + 459 0070 660F lsl r22 + 460 0072 660F lsl r22 + 461 0074 607C andi r22,lo8(-64) + 462 0076 632B or r22,r19 + 463 0078 4260 ori r20,lo8(2) + 464 007a 2295 swap r18 + 465 007c 207F andi r18,lo8(-16) + 466 007e 422B or r20,r18 + 467 0080 812F mov r24,r17 + 468 .LVL21: + 469 0082 0E94 0000 call Endpoint_ConfigureEndpoint_Prv + 470 .LVL22: + 471 .LBE67: + 472 .LSM52: + 473 0086 8823 tst r24 + 474 0088 01F0 breq .L18 + 475 .L13: + 476 .LBE66: + 477 .LSM53: + 478 008a 1F5F subi r17,lo8(-(1)) + 479 008c 1530 cpi r17,lo8(5) + 480 008e 01F4 brne .L19 + 481 0090 81E0 ldi r24,lo8(1) + 482 .L18: + 483 /* epilogue start */ + 484 .LBE65: + 485 .LSM54: + 486 0092 DF91 pop r29 + 487 0094 CF91 pop r28 + 488 .LVL23: + 489 0096 1F91 pop r17 + 490 .LVL24: + 491 0098 0895 ret + 492 .LFE82: + 494 .section .text.RNDIS_Device_ProcessControlRequest,"ax",@progbits + 495 .global RNDIS_Device_ProcessControlRequest + 497 RNDIS_Device_ProcessControlRequest: + 498 .LFB81: + 499 .LSM55: + 500 .LVL25: + 501 0000 EF92 push r14 + 502 0002 FF92 push r15 + 503 0004 0F93 push r16 + 504 0006 1F93 push r17 + 505 0008 CF93 push r28 + 506 000a DF93 push r29 + 507 /* prologue: function */ + 508 /* frame size = 0 */ + 509 000c EC01 movw r28,r24 + 510 .LBB89: + 511 .LBB90: + 512 .LSM56: + 513 000e 8091 E800 lds r24,232 + 514 .LVL26: + 515 .LBE90: + 516 .LBE89: + 517 .LSM57: + 518 0012 83FF sbrs r24,3 + 519 0014 00C0 rjmp .L63 + 520 .LSM58: + 521 0016 8881 ld r24,Y + 522 0018 90E0 ldi r25,lo8(0) + 523 001a 2091 0000 lds r18,USB_ControlRequest+4 + 524 001e 3091 0000 lds r19,(USB_ControlRequest+4)+1 + 525 0022 2817 cp r18,r24 + 526 0024 3907 cpc r19,r25 + 527 0026 01F0 breq .+2 + 528 0028 00C0 rjmp .L63 + 529 .LSM59: + 530 002a 8091 0000 lds r24,USB_ControlRequest+1 + 531 002e 8823 tst r24 + 532 0030 01F0 breq .L25 + 533 0032 8130 cpi r24,lo8(1) + 534 0034 01F0 breq .+2 + 535 0036 00C0 rjmp .L63 + 536 0038 00C0 rjmp .L71 + 537 .L25: + 538 .LSM60: + 539 003a 8091 0000 lds r24,USB_ControlRequest + 540 003e 8132 cpi r24,lo8(33) + 541 0040 01F0 breq .+2 + 542 0042 00C0 rjmp .L63 + 543 .LBB91: + 544 .LBB92: + 545 .LSM61: + 546 0044 8091 E800 lds r24,232 + 547 0048 877F andi r24,lo8(-9) + 548 004a 8093 E800 sts 232,r24 + 549 .LBE92: + 550 .LBE91: + 551 .LSM62: + 552 004e 8E01 movw r16,r28 + 553 0050 0B5E subi r16,lo8(-(21)) + 554 0052 1F4F sbci r17,hi8(-(21)) + 555 0054 6091 0000 lds r22,USB_ControlRequest+6 + 556 0058 7091 0000 lds r23,(USB_ControlRequest+6)+1 + 557 005c C801 movw r24,r16 + 558 005e 0E94 0000 call Endpoint_Read_Control_Stream_LE + 559 .LBB93: + 560 .LBB94: + 561 .LSM63: + 562 0062 8091 E800 lds r24,232 + 563 0066 8E77 andi r24,lo8(126) + 564 0068 8093 E800 sts 232,r24 + 565 .LBE94: + 566 .LBE93: + 567 .LBB95: + 568 .LBB96: + 569 .LSM64: + 570 006c 8D89 ldd r24,Y+21 + 571 006e 9E89 ldd r25,Y+22 + 572 0070 AF89 ldd r26,Y+23 + 573 0072 B88D ldd r27,Y+24 + 574 0074 8430 cpi r24,lo8(4) + 575 0076 9105 cpc r25,__zero_reg__ + 576 0078 A105 cpc r26,__zero_reg__ + 577 007a B105 cpc r27,__zero_reg__ + 578 007c 01F4 brne .+2 + 579 007e 00C0 rjmp .L29 + 580 0080 8530 cpi r24,lo8(5) + 581 0082 9105 cpc r25,__zero_reg__ + 582 0084 A105 cpc r26,__zero_reg__ + 583 0086 B105 cpc r27,__zero_reg__ + 584 0088 00F4 brsh .L33 + 585 008a 8230 cpi r24,lo8(2) + 586 008c 9105 cpc r25,__zero_reg__ + 587 008e A105 cpc r26,__zero_reg__ + 588 0090 B105 cpc r27,__zero_reg__ + 589 0092 01F0 breq .L27 + 590 0094 0397 sbiw r24,3 + 591 0096 A105 cpc r26,__zero_reg__ + 592 0098 B105 cpc r27,__zero_reg__ + 593 009a 01F0 breq .+2 + 594 009c 00C0 rjmp .L63 + 595 009e 00C0 rjmp .L72 + 596 .L33: + 597 00a0 8630 cpi r24,lo8(6) + 598 00a2 9105 cpc r25,__zero_reg__ + 599 00a4 A105 cpc r26,__zero_reg__ + 600 00a6 B105 cpc r27,__zero_reg__ + 601 00a8 01F4 brne .+2 + 602 00aa 00C0 rjmp .L31 + 603 00ac 8630 cpi r24,lo8(6) + 604 00ae 9105 cpc r25,__zero_reg__ + 605 00b0 A105 cpc r26,__zero_reg__ + 606 00b2 B105 cpc r27,__zero_reg__ + 607 00b4 00F4 brsh .+2 + 608 00b6 00C0 rjmp .L30 + 609 00b8 0897 sbiw r24,8 + 610 00ba A105 cpc r26,__zero_reg__ + 611 00bc B105 cpc r27,__zero_reg__ + 612 00be 01F0 breq .+2 + 613 00c0 00C0 rjmp .L63 + 614 00c2 00C0 rjmp .L73 + 615 .L27: + 616 .LBB97: + 617 .LSM65: + 618 00c4 CB56 subi r28,lo8(-(149)) + 619 00c6 DF4F sbci r29,hi8(-(149)) + 620 00c8 21E0 ldi r18,lo8(1) + 621 00ca 2883 st Y,r18 + 622 00cc C559 subi r28,lo8(-(-149)) + 623 00ce D040 sbci r29,hi8(-(-149)) + 624 .LSM66: + 625 00d0 82E0 ldi r24,lo8(-2147483646) + 626 00d2 90E0 ldi r25,hi8(-2147483646) + 627 00d4 A0E0 ldi r26,hlo8(-2147483646) + 628 00d6 B0E8 ldi r27,hhi8(-2147483646) + 629 00d8 8D8B std Y+21,r24 + 630 00da 9E8B std Y+22,r25 + 631 00dc AF8B std Y+23,r26 + 632 00de B88F std Y+24,r27 + 633 .LSM67: + 634 00e0 84E3 ldi r24,lo8(52) + 635 00e2 90E0 ldi r25,hi8(52) + 636 00e4 A0E0 ldi r26,hlo8(52) + 637 00e6 B0E0 ldi r27,hhi8(52) + 638 00e8 F801 movw r30,r16 + 639 00ea 8483 std Z+4,r24 + 640 00ec 9583 std Z+5,r25 + 641 00ee A683 std Z+6,r26 + 642 00f0 B783 std Z+7,r27 + 643 .LSM68: + 644 00f2 1486 std Z+12,__zero_reg__ + 645 00f4 1586 std Z+13,__zero_reg__ + 646 00f6 1686 std Z+14,__zero_reg__ + 647 00f8 1786 std Z+15,__zero_reg__ + 648 .LSM69: + 649 00fa 81E0 ldi r24,lo8(1) + 650 00fc 90E0 ldi r25,hi8(1) + 651 00fe A0E0 ldi r26,hlo8(1) + 652 0100 B0E0 ldi r27,hhi8(1) + 653 0102 808B std Z+16,r24 + 654 0104 918B std Z+17,r25 + 655 0106 A28B std Z+18,r26 + 656 0108 B38B std Z+19,r27 + 657 .LSM70: + 658 010a 148A std Z+20,__zero_reg__ + 659 010c 158A std Z+21,__zero_reg__ + 660 010e 168A std Z+22,__zero_reg__ + 661 0110 178A std Z+23,__zero_reg__ + 662 .LSM71: + 663 0112 808F std Z+24,r24 + 664 0114 918F std Z+25,r25 + 665 0116 A28F std Z+26,r26 + 666 0118 B38F std Z+27,r27 + 667 .LSM72: + 668 011a 148E std Z+28,__zero_reg__ + 669 011c 158E std Z+29,__zero_reg__ + 670 011e 168E std Z+30,__zero_reg__ + 671 0120 178E std Z+31,__zero_reg__ + 672 .LSM73: + 673 0122 80A3 std Z+32,r24 + 674 0124 91A3 std Z+33,r25 + 675 0126 A2A3 std Z+34,r26 + 676 0128 B3A3 std Z+35,r27 + 677 .LSM74: + 678 012a 88E0 ldi r24,lo8(1544) + 679 012c 96E0 ldi r25,hi8(1544) + 680 012e A0E0 ldi r26,hlo8(1544) + 681 0130 B0E0 ldi r27,hhi8(1544) + 682 0132 84A3 std Z+36,r24 + 683 0134 95A3 std Z+37,r25 + 684 0136 A6A3 std Z+38,r26 + 685 0138 B7A3 std Z+39,r27 + 686 .LSM75: + 687 013a 10A6 std Z+40,__zero_reg__ + 688 013c 11A6 std Z+41,__zero_reg__ + 689 013e 12A6 std Z+42,__zero_reg__ + 690 0140 13A6 std Z+43,__zero_reg__ + 691 .LSM76: + 692 0142 14A6 std Z+44,__zero_reg__ + 693 0144 15A6 std Z+45,__zero_reg__ + 694 0146 16A6 std Z+46,__zero_reg__ + 695 0148 17A6 std Z+47,__zero_reg__ + 696 .LSM77: + 697 014a 10AA std Z+48,__zero_reg__ + 698 014c 11AA std Z+49,__zero_reg__ + 699 014e 12AA std Z+50,__zero_reg__ + 700 0150 13AA std Z+51,__zero_reg__ + 701 .LSM78: + 702 0152 CA56 subi r28,lo8(-(150)) + 703 0154 DF4F sbci r29,hi8(-(150)) + 704 0156 2883 st Y,r18 + 705 0158 00C0 rjmp .L63 + 706 .L72: + 707 .LSM79: + 708 015a CB56 subi r28,lo8(-(149)) + 709 015c DF4F sbci r29,hi8(-(149)) + 710 015e 1992 st Y+,__zero_reg__ + 711 .LSM80: + 712 0160 F801 movw r30,r16 + 713 0162 1482 std Z+4,__zero_reg__ + 714 0164 1582 std Z+5,__zero_reg__ + 715 0166 1682 std Z+6,__zero_reg__ + 716 0168 1782 std Z+7,__zero_reg__ + 717 .LSM81: + 718 016a 1882 st Y,__zero_reg__ + 719 .LVL27: + 720 016c 00C0 rjmp .L63 + 721 .LVL28: + 722 .L29: + 723 .LSM82: + 724 016e CB56 subi r28,lo8(-(149)) + 725 0170 DF4F sbci r29,hi8(-(149)) + 726 0172 81E0 ldi r24,lo8(1) + 727 0174 8883 st Y,r24 + 728 0176 C559 subi r28,lo8(-(-149)) + 729 0178 D040 sbci r29,hi8(-(-149)) + 730 .LSM83: + 731 017a F801 movw r30,r16 + 732 017c 2485 ldd r18,Z+12 + 733 017e 3585 ldd r19,Z+13 + 734 0180 4685 ldd r20,Z+14 + 735 0182 5785 ldd r21,Z+15 + 736 .LVL29: + 737 .LSM84: + 738 0184 6DE2 ldi r22,lo8(45) + 739 0186 E62E mov r14,r22 + 740 0188 F12C mov r15,__zero_reg__ + 741 .LVL30: + 742 018a EC0E add r14,r28 + 743 018c FD1E adc r15,r29 + 744 .LSM85: + 745 018e 84E0 ldi r24,lo8(-2147483644) + 746 0190 90E0 ldi r25,hi8(-2147483644) + 747 0192 A0E0 ldi r26,hlo8(-2147483644) + 748 0194 B0E8 ldi r27,hhi8(-2147483644) + 749 0196 8D8B std Y+21,r24 + 750 0198 9E8B std Y+22,r25 + 751 019a AF8B std Y+23,r26 + 752 019c B88F std Y+24,r27 + 753 .LSM86: + 754 019e 88E1 ldi r24,lo8(24) + 755 01a0 90E0 ldi r25,hi8(24) + 756 01a2 A0E0 ldi r26,hlo8(24) + 757 01a4 B0E0 ldi r27,hhi8(24) + 758 01a6 8483 std Z+4,r24 + 759 01a8 9583 std Z+5,r25 + 760 01aa A683 std Z+6,r26 + 761 01ac B783 std Z+7,r27 + 762 .LBB100: + 763 .LBB101: + 764 .LSM87: + 765 01ae 2E30 cpi r18,lo8(65806) + 766 01b0 F1E0 ldi r31,hi8(65806) + 767 01b2 3F07 cpc r19,r31 + 768 01b4 F1E0 ldi r31,hlo8(65806) + 769 01b6 4F07 cpc r20,r31 + 770 01b8 F0E0 ldi r31,hhi8(65806) + 771 01ba 5F07 cpc r21,r31 + 772 01bc 01F4 brne .+2 + 773 01be 00C0 rjmp .L42 + 774 01c0 2F30 cpi r18,lo8(65807) + 775 01c2 61E0 ldi r22,hi8(65807) + 776 01c4 3607 cpc r19,r22 + 777 01c6 61E0 ldi r22,hlo8(65807) + 778 01c8 4607 cpc r20,r22 + 779 01ca 60E0 ldi r22,hhi8(65807) + 780 01cc 5607 cpc r21,r22 + 781 01ce 00F0 brlo .+2 + 782 01d0 00C0 rjmp .L49 + 783 01d2 2630 cpi r18,lo8(65798) + 784 01d4 81E0 ldi r24,hi8(65798) + 785 01d6 3807 cpc r19,r24 + 786 01d8 81E0 ldi r24,hlo8(65798) + 787 01da 4807 cpc r20,r24 + 788 01dc 80E0 ldi r24,hhi8(65798) + 789 01de 5807 cpc r21,r24 + 790 01e0 01F4 brne .+2 + 791 01e2 00C0 rjmp .L38 + 792 01e4 2730 cpi r18,lo8(65799) + 793 01e6 E1E0 ldi r30,hi8(65799) + 794 01e8 3E07 cpc r19,r30 + 795 01ea E1E0 ldi r30,hlo8(65799) + 796 01ec 4E07 cpc r20,r30 + 797 01ee E0E0 ldi r30,hhi8(65799) + 798 01f0 5E07 cpc r21,r30 + 799 01f2 00F4 brsh .L50 + 800 01f4 2230 cpi r18,lo8(65794) + 801 01f6 F1E0 ldi r31,hi8(65794) + 802 01f8 3F07 cpc r19,r31 + 803 01fa F1E0 ldi r31,hlo8(65794) + 804 01fc 4F07 cpc r20,r31 + 805 01fe F0E0 ldi r31,hhi8(65794) + 806 0200 5F07 cpc r21,r31 + 807 0202 01F4 brne .+2 + 808 0204 00C0 rjmp .L46 + 809 0206 2330 cpi r18,lo8(65795) + 810 0208 61E0 ldi r22,hi8(65795) + 811 020a 3607 cpc r19,r22 + 812 020c 61E0 ldi r22,hlo8(65795) + 813 020e 4607 cpc r20,r22 + 814 0210 60E0 ldi r22,hhi8(65795) + 815 0212 5607 cpc r21,r22 + 816 0214 00F4 brsh .L51 + 817 0216 2150 subi r18,lo8(65793) + 818 0218 3140 sbci r19,hi8(65793) + 819 021a 4140 sbci r20,hlo8(65793) + 820 021c 5040 sbci r21,hhi8(65793) + 821 021e 01F0 breq .+2 + 822 0220 00C0 rjmp .L34 + 823 0222 00C0 rjmp .L74 + 824 .L51: + 825 0224 2550 subi r18,lo8(65797) + 826 0226 3140 sbci r19,hi8(65797) + 827 0228 4140 sbci r20,hlo8(65797) + 828 022a 5040 sbci r21,hhi8(65797) + 829 022c 00F0 brlo .+2 + 830 022e 00C0 rjmp .L34 + 831 0230 00C0 rjmp .L46 + 832 .L50: + 833 0232 2C30 cpi r18,lo8(65804) + 834 0234 F1E0 ldi r31,hi8(65804) + 835 0236 3F07 cpc r19,r31 + 836 0238 F1E0 ldi r31,hlo8(65804) + 837 023a 4F07 cpc r20,r31 + 838 023c F0E0 ldi r31,hhi8(65804) + 839 023e 5F07 cpc r21,r31 + 840 0240 00F4 brsh .L52 + 841 0242 2A30 cpi r18,lo8(65802) + 842 0244 61E0 ldi r22,hi8(65802) + 843 0246 3607 cpc r19,r22 + 844 0248 61E0 ldi r22,hlo8(65802) + 845 024a 4607 cpc r20,r22 + 846 024c 60E0 ldi r22,hhi8(65802) + 847 024e 5607 cpc r21,r22 + 848 0250 00F0 brlo .+2 + 849 0252 00C0 rjmp .L38 + 850 0254 2750 subi r18,lo8(65799) + 851 0256 3140 sbci r19,hi8(65799) + 852 0258 4140 sbci r20,hlo8(65799) + 853 025a 5040 sbci r21,hhi8(65799) + 854 025c 01F0 breq .+2 + 855 025e 00C0 rjmp .L34 + 856 0260 00C0 rjmp .L75 + 857 .L52: + 858 0262 2C30 cpi r18,lo8(65804) + 859 0264 E1E0 ldi r30,hi8(65804) + 860 0266 3E07 cpc r19,r30 + 861 0268 E1E0 ldi r30,hlo8(65804) + 862 026a 4E07 cpc r20,r30 + 863 026c E0E0 ldi r30,hhi8(65804) + 864 026e 5E07 cpc r21,r30 + 865 0270 01F4 brne .+2 + 866 0272 00C0 rjmp .L40 + 867 0274 2D50 subi r18,lo8(65805) + 868 0276 3140 sbci r19,hi8(65805) + 869 0278 4140 sbci r20,hlo8(65805) + 870 027a 5040 sbci r21,hhi8(65805) + 871 027c 01F0 breq .+2 + 872 027e 00C0 rjmp .L34 + 873 0280 00C0 rjmp .L76 + 874 .L49: + 875 0282 2630 cpi r18,lo8(131334) + 876 0284 61E0 ldi r22,hi8(131334) + 877 0286 3607 cpc r19,r22 + 878 0288 62E0 ldi r22,hlo8(131334) + 879 028a 4607 cpc r20,r22 + 880 028c 60E0 ldi r22,hhi8(131334) + 881 028e 5607 cpc r21,r22 + 882 0290 00F4 brsh .L53 + 883 0292 2130 cpi r18,lo8(131329) + 884 0294 81E0 ldi r24,hi8(131329) + 885 0296 3807 cpc r19,r24 + 886 0298 82E0 ldi r24,hlo8(131329) + 887 029a 4807 cpc r20,r24 + 888 029c 80E0 ldi r24,hhi8(131329) + 889 029e 5807 cpc r21,r24 + 890 02a0 00F0 brlo .+2 + 891 02a2 00C0 rjmp .L46 + 892 02a4 2431 cpi r18,lo8(65812) + 893 02a6 E1E0 ldi r30,hi8(65812) + 894 02a8 3E07 cpc r19,r30 + 895 02aa E1E0 ldi r30,hlo8(65812) + 896 02ac 4E07 cpc r20,r30 + 897 02ae E0E0 ldi r30,hhi8(65812) + 898 02b0 5E07 cpc r21,r30 + 899 02b2 01F4 brne .+2 + 900 02b4 00C0 rjmp .L46 + 901 02b6 2230 cpi r18,lo8(66050) + 902 02b8 F2E0 ldi r31,hi8(66050) + 903 02ba 3F07 cpc r19,r31 + 904 02bc F1E0 ldi r31,hlo8(66050) + 905 02be 4F07 cpc r20,r31 + 906 02c0 F0E0 ldi r31,hhi8(66050) + 907 02c2 5F07 cpc r21,r31 + 908 02c4 01F4 brne .+2 + 909 02c6 00C0 rjmp .L46 + 910 02c8 2151 subi r18,lo8(65809) + 911 02ca 3140 sbci r19,hi8(65809) + 912 02cc 4140 sbci r20,hlo8(65809) + 913 02ce 5040 sbci r21,hhi8(65809) + 914 02d0 01F0 breq .+2 + 915 02d2 00C0 rjmp .L34 + 916 02d4 00C0 rjmp .L77 + 917 .L53: + 918 02d6 2430 cpi r18,lo8(16843012) + 919 02d8 81E0 ldi r24,hi8(16843012) + 920 02da 3807 cpc r19,r24 + 921 02dc 81E0 ldi r24,hlo8(16843012) + 922 02de 4807 cpc r20,r24 + 923 02e0 81E0 ldi r24,hhi8(16843012) + 924 02e2 5807 cpc r21,r24 + 925 02e4 01F4 brne .+2 + 926 02e6 00C0 rjmp .L48 + 927 02e8 2530 cpi r18,lo8(16843013) + 928 02ea E1E0 ldi r30,hi8(16843013) + 929 02ec 3E07 cpc r19,r30 + 930 02ee E1E0 ldi r30,hlo8(16843013) + 931 02f0 4E07 cpc r20,r30 + 932 02f2 E1E0 ldi r30,hhi8(16843013) + 933 02f4 5E07 cpc r21,r30 + 934 02f6 00F4 brsh .L54 + 935 02f8 2150 subi r18,lo8(-(-16843009)) + 936 02fa 3140 sbci r19,hi8(-(-16843009)) + 937 02fc 4140 sbci r20,hlo8(-(-16843009)) + 938 02fe 5140 sbci r21,hhi8(-(-16843009)) + 939 0300 2230 cpi r18,lo8(2) + 940 0302 3105 cpc r19,__zero_reg__ + 941 0304 4105 cpc r20,__zero_reg__ + 942 0306 5105 cpc r21,__zero_reg__ + 943 0308 00F0 brlo .+2 + 944 030a 00C0 rjmp .L34 + 945 030c 00C0 rjmp .L78 + 946 .L54: + 947 030e 2150 subi r18,lo8(-(-16908545)) + 948 0310 3140 sbci r19,hi8(-(-16908545)) + 949 0312 4240 sbci r20,hlo8(-(-16908545)) + 950 0314 5140 sbci r21,hhi8(-(-16908545)) + 951 0316 2330 cpi r18,lo8(3) + 952 0318 3105 cpc r19,__zero_reg__ + 953 031a 4105 cpc r20,__zero_reg__ + 954 031c 5105 cpc r21,__zero_reg__ + 955 031e 00F0 brlo .+2 + 956 0320 00C0 rjmp .L34 + 957 0322 00C0 rjmp .L46 + 958 .L74: + 959 .LSM88: + 960 0324 C701 movw r24,r14 + 961 0326 60E0 ldi r22,lo8(AdapterSupportedOIDList) + 962 0328 70E0 ldi r23,hi8(AdapterSupportedOIDList) + 963 032a 4CE6 ldi r20,lo8(108) + 964 032c 50E0 ldi r21,hi8(108) + 965 032e 0E94 0000 call memcpy_P + 966 .LVL31: + 967 0332 CCE6 ldi r28,lo8(108) + 968 0334 D0E0 ldi r29,hi8(108) + 969 .LVL32: + 970 0336 00C0 rjmp .L55 + 971 .LVL33: + 972 .L40: + 973 .LSM89: + 974 0338 8FEF ldi r24,lo8(16777215) + 975 033a 9FEF ldi r25,hi8(16777215) + 976 033c AFEF ldi r26,hlo8(16777215) + 977 033e B0E0 ldi r27,hhi8(16777215) + 978 0340 00C0 rjmp .L70 + 979 .L38: + 980 .LSM90: + 981 0342 8CED ldi r24,lo8(1500) + 982 0344 95E0 ldi r25,hi8(1500) + 983 0346 A0E0 ldi r26,hlo8(1500) + 984 0348 B0E0 ldi r27,hhi8(1500) + 985 034a 00C0 rjmp .L70 + 986 .L76: + 987 .LSM91: + 988 034c 6D85 ldd r22,Y+13 + 989 034e 7E85 ldd r23,Y+14 + 990 .LBE101: + 991 0350 FB01 movw r30,r22 + 992 0352 EF01 movw r28,r30 + 993 .LVL34: + 994 0354 0990 ld __tmp_reg__,Y+ + 995 0356 0020 tst __tmp_reg__ + 996 0358 01F4 brne .-6 + 997 .LBB102: + 998 035a CE1B sub r28,r30 + 999 035c DF0B sbc r29,r31 + 1000 .LSM92: + 1001 035e C701 movw r24,r14 + 1002 .LVL35: + 1003 0360 AE01 movw r20,r28 + 1004 .LVL36: + 1005 0362 0E94 0000 call memcpy + 1006 .LVL37: + 1007 0366 00C0 rjmp .L55 + 1008 .LVL38: + 1009 .L75: + 1010 .LSM93: + 1011 0368 80EA ldi r24,lo8(100000) + 1012 036a 96E8 ldi r25,hi8(100000) + 1013 036c A1E0 ldi r26,hlo8(100000) + 1014 036e B0E0 ldi r27,hhi8(100000) + 1015 0370 00C0 rjmp .L70 + 1016 .L78: + 1017 .LSM94: + 1018 0372 D701 movw r26,r14 + 1019 0374 FE01 movw r30,r28 + 1020 0376 3F96 adiw r30,15 + 1021 0378 86E0 ldi r24,lo8(6) + 1022 .LVL39: + 1023 .L57: + 1024 037a 0190 ld r0,Z+ + 1025 037c 0D92 st X+,r0 + 1026 037e 8150 subi r24,lo8(-(-1)) + 1027 0380 01F4 brne .L57 + 1028 0382 C6E0 ldi r28,lo8(6) + 1029 0384 D0E0 ldi r29,hi8(6) + 1030 .LVL40: + 1031 0386 00C0 rjmp .L55 + 1032 .LVL41: + 1033 .L48: + 1034 .LSM95: + 1035 0388 81E0 ldi r24,lo8(1) + 1036 038a 90E0 ldi r25,hi8(1) + 1037 038c A0E0 ldi r26,hlo8(1) + 1038 038e B0E0 ldi r27,hhi8(1) + 1039 0390 00C0 rjmp .L70 + 1040 .L42: + 1041 .LSM96: + 1042 0392 C956 subi r28,lo8(-(151)) + 1043 0394 DF4F sbci r29,hi8(-(151)) + 1044 0396 8881 ld r24,Y + 1045 0398 9981 ldd r25,Y+1 + 1046 039a AA81 ldd r26,Y+2 + 1047 039c BB81 ldd r27,Y+3 + 1048 039e C759 subi r28,lo8(-(-151)) + 1049 03a0 D040 sbci r29,hi8(-(-151)) + 1050 03a2 00C0 rjmp .L70 + 1051 .L46: + 1052 .LSM97: + 1053 03a4 1DA6 std Y+45,__zero_reg__ + 1054 03a6 1EA6 std Y+46,__zero_reg__ + 1055 03a8 1FA6 std Y+47,__zero_reg__ + 1056 03aa 18AA std Y+48,__zero_reg__ + 1057 03ac 00C0 rjmp .L68 + 1058 .L77: + 1059 .LSM98: + 1060 03ae 8CE5 ldi r24,lo8(1628) + 1061 03b0 96E0 ldi r25,hi8(1628) + 1062 03b2 A0E0 ldi r26,hlo8(1628) + 1063 03b4 B0E0 ldi r27,hhi8(1628) + 1064 .L70: + 1065 03b6 8DA7 std Y+45,r24 + 1066 03b8 9EA7 std Y+46,r25 + 1067 03ba AFA7 std Y+47,r26 + 1068 03bc B8AB std Y+48,r27 + 1069 .L68: + 1070 03be C4E0 ldi r28,lo8(4) + 1071 03c0 D0E0 ldi r29,hi8(4) + 1072 .LVL42: + 1073 03c2 00C0 rjmp .L55 + 1074 .LVL43: + 1075 .L34: + 1076 .LBE102: + 1077 .LBE100: + 1078 .LSM99: + 1079 03c4 8BEB ldi r24,lo8(-1073741637) + 1080 03c6 90E0 ldi r25,hi8(-1073741637) + 1081 03c8 A0E0 ldi r26,hlo8(-1073741637) + 1082 03ca B0EC ldi r27,hhi8(-1073741637) + 1083 03cc F801 movw r30,r16 + 1084 03ce 8487 std Z+12,r24 + 1085 03d0 9587 std Z+13,r25 + 1086 03d2 A687 std Z+14,r26 + 1087 03d4 B787 std Z+15,r27 + 1088 .LSM100: + 1089 03d6 108A std Z+16,__zero_reg__ + 1090 03d8 118A std Z+17,__zero_reg__ + 1091 03da 128A std Z+18,__zero_reg__ + 1092 03dc 138A std Z+19,__zero_reg__ + 1093 .LSM101: + 1094 03de 148A std Z+20,__zero_reg__ + 1095 03e0 158A std Z+21,__zero_reg__ + 1096 03e2 168A std Z+22,__zero_reg__ + 1097 03e4 178A std Z+23,__zero_reg__ + 1098 03e6 00C0 rjmp .L63 + 1099 .LVL44: + 1100 .L30: + 1101 .LSM102: + 1102 03e8 CB56 subi r28,lo8(-(149)) + 1103 03ea DF4F sbci r29,hi8(-(149)) + 1104 03ec 81E0 ldi r24,lo8(1) + 1105 03ee 8883 st Y,r24 + 1106 03f0 C559 subi r28,lo8(-(-149)) + 1107 03f2 D040 sbci r29,hi8(-(-149)) + 1108 .LSM103: + 1109 03f4 F801 movw r30,r16 + 1110 03f6 2485 ldd r18,Z+12 + 1111 03f8 3585 ldd r19,Z+13 + 1112 03fa 4685 ldd r20,Z+14 + 1113 03fc 5785 ldd r21,Z+15 + 1114 .LVL45: + 1115 .LSM104: + 1116 03fe 85E0 ldi r24,lo8(-2147483643) + 1117 0400 90E0 ldi r25,hi8(-2147483643) + 1118 0402 A0E0 ldi r26,hlo8(-2147483643) + 1119 0404 B0E8 ldi r27,hhi8(-2147483643) + 1120 0406 8D8B std Y+21,r24 + 1121 0408 9E8B std Y+22,r25 + 1122 040a AF8B std Y+23,r26 + 1123 040c B88F std Y+24,r27 + 1124 .LSM105: + 1125 040e 80E1 ldi r24,lo8(16) + 1126 0410 90E0 ldi r25,hi8(16) + 1127 0412 A0E0 ldi r26,hlo8(16) + 1128 0414 B0E0 ldi r27,hhi8(16) + 1129 0416 8483 std Z+4,r24 + 1130 0418 9583 std Z+5,r25 + 1131 041a A683 std Z+6,r26 + 1132 041c B783 std Z+7,r27 + 1133 .LSM106: + 1134 041e 8489 ldd r24,Z+20 + 1135 0420 9589 ldd r25,Z+21 + 1136 0422 A689 ldd r26,Z+22 + 1137 0424 B789 ldd r27,Z+23 + 1138 .LBB98: + 1139 .LBB99: + 1140 .LSM107: + 1141 0426 2E30 cpi r18,lo8(65806) + 1142 0428 F1E0 ldi r31,hi8(65806) + 1143 042a 3F07 cpc r19,r31 + 1144 042c F1E0 ldi r31,hlo8(65806) + 1145 042e 4F07 cpc r20,r31 + 1146 0430 F0E0 ldi r31,hhi8(65806) + 1147 0432 5F07 cpc r21,r31 + 1148 0434 01F0 breq .L59 + 1149 0436 2350 subi r18,lo8(16843011) + 1150 0438 3140 sbci r19,hi8(16843011) + 1151 043a 4140 sbci r20,hlo8(16843011) + 1152 043c 5140 sbci r21,hhi8(16843011) + 1153 043e 01F0 breq .L67 + 1154 0440 8BEB ldi r24,lo8(-1073741637) + 1155 0442 90E0 ldi r25,hi8(-1073741637) + 1156 0444 A0E0 ldi r26,hlo8(-1073741637) + 1157 0446 B0EC ldi r27,hhi8(-1073741637) + 1158 0448 00C0 rjmp .L61 + 1159 .L59: + 1160 .LSM108: + 1161 044a FE01 movw r30,r28 + 1162 044c E80F add r30,r24 + 1163 044e F91F adc r31,r25 + 1164 0450 858D ldd r24,Z+29 + 1165 0452 968D ldd r25,Z+30 + 1166 0454 A78D ldd r26,Z+31 + 1167 0456 B0A1 ldd r27,Z+32 + 1168 0458 C956 subi r28,lo8(-(151)) + 1169 045a DF4F sbci r29,hi8(-(151)) + 1170 045c 8883 st Y,r24 + 1171 045e 9983 std Y+1,r25 + 1172 0460 AA83 std Y+2,r26 + 1173 0462 BB83 std Y+3,r27 + 1174 .LSM109: + 1175 0464 FE01 movw r30,r28 + 1176 0466 82E0 ldi r24,lo8(2) + 1177 0468 8293 st -Z,r24 + 1178 .L67: + 1179 046a 80E0 ldi r24,lo8(0) + 1180 046c 90E0 ldi r25,hi8(0) + 1181 046e A0E0 ldi r26,hlo8(0) + 1182 0470 B0E0 ldi r27,hhi8(0) + 1183 .L61: + 1184 .LBE99: + 1185 .LBE98: + 1186 .LSM110: + 1187 0472 F801 movw r30,r16 + 1188 0474 8487 std Z+12,r24 + 1189 0476 9587 std Z+13,r25 + 1190 0478 A687 std Z+14,r26 + 1191 047a B787 std Z+15,r27 + 1192 047c 00C0 rjmp .L63 + 1193 .LVL46: + 1194 .L31: + 1195 .LSM111: + 1196 047e CB56 subi r28,lo8(-(149)) + 1197 0480 DF4F sbci r29,hi8(-(149)) + 1198 0482 81E0 ldi r24,lo8(1) + 1199 0484 8883 st Y,r24 + 1200 0486 C559 subi r28,lo8(-(-149)) + 1201 0488 D040 sbci r29,hi8(-(-149)) + 1202 .LSM112: + 1203 048a 86E0 ldi r24,lo8(-2147483642) + 1204 048c 90E0 ldi r25,hi8(-2147483642) + 1205 048e A0E0 ldi r26,hlo8(-2147483642) + 1206 0490 B0E8 ldi r27,hhi8(-2147483642) + 1207 0492 8D8B std Y+21,r24 + 1208 0494 9E8B std Y+22,r25 + 1209 0496 AF8B std Y+23,r26 + 1210 0498 B88F std Y+24,r27 + 1211 .LSM113: + 1212 049a 80E1 ldi r24,lo8(16) + 1213 049c 90E0 ldi r25,hi8(16) + 1214 049e A0E0 ldi r26,hlo8(16) + 1215 04a0 B0E0 ldi r27,hhi8(16) + 1216 04a2 F801 movw r30,r16 + 1217 04a4 8483 std Z+4,r24 + 1218 04a6 9583 std Z+5,r25 + 1219 04a8 A683 std Z+6,r26 + 1220 04aa B783 std Z+7,r27 + 1221 .LSM114: + 1222 04ac 1086 std Z+8,__zero_reg__ + 1223 04ae 1186 std Z+9,__zero_reg__ + 1224 04b0 1286 std Z+10,__zero_reg__ + 1225 04b2 1386 std Z+11,__zero_reg__ + 1226 04b4 00C0 rjmp .L69 + 1227 .L73: + 1228 .LSM115: + 1229 04b6 CB56 subi r28,lo8(-(149)) + 1230 04b8 DF4F sbci r29,hi8(-(149)) + 1231 04ba 81E0 ldi r24,lo8(1) + 1232 04bc 8883 st Y,r24 + 1233 04be C559 subi r28,lo8(-(-149)) + 1234 04c0 D040 sbci r29,hi8(-(-149)) + 1235 .LSM116: + 1236 04c2 88E0 ldi r24,lo8(-2147483640) + 1237 04c4 90E0 ldi r25,hi8(-2147483640) + 1238 04c6 A0E0 ldi r26,hlo8(-2147483640) + 1239 04c8 B0E8 ldi r27,hhi8(-2147483640) + 1240 04ca 8D8B std Y+21,r24 + 1241 04cc 9E8B std Y+22,r25 + 1242 04ce AF8B std Y+23,r26 + 1243 04d0 B88F std Y+24,r27 + 1244 .LSM117: + 1245 04d2 80E1 ldi r24,lo8(16) + 1246 04d4 90E0 ldi r25,hi8(16) + 1247 04d6 A0E0 ldi r26,hlo8(16) + 1248 04d8 B0E0 ldi r27,hhi8(16) + 1249 04da F801 movw r30,r16 + 1250 04dc 8483 std Z+4,r24 + 1251 04de 9583 std Z+5,r25 + 1252 04e0 A683 std Z+6,r26 + 1253 04e2 B783 std Z+7,r27 + 1254 .L69: + 1255 .LSM118: + 1256 04e4 1486 std Z+12,__zero_reg__ + 1257 04e6 1586 std Z+13,__zero_reg__ + 1258 04e8 1686 std Z+14,__zero_reg__ + 1259 04ea 1786 std Z+15,__zero_reg__ + 1260 04ec 00C0 rjmp .L63 + 1261 .L71: + 1262 .LBE97: + 1263 .LBE96: + 1264 .LBE95: + 1265 .LSM119: + 1266 04ee 8091 0000 lds r24,USB_ControlRequest + 1267 04f2 813A cpi r24,lo8(-95) + 1268 04f4 01F0 breq .+2 + 1269 04f6 00C0 rjmp .L63 + 1270 .LBB105: + 1271 .LSM120: + 1272 04f8 8E01 movw r16,r28 + 1273 .LVL47: + 1274 04fa 0B5E subi r16,lo8(-(21)) + 1275 04fc 1F4F sbci r17,hi8(-(21)) + 1276 .LSM121: + 1277 04fe F801 movw r30,r16 + 1278 0500 8481 ldd r24,Z+4 + 1279 0502 9581 ldd r25,Z+5 + 1280 0504 A681 ldd r26,Z+6 + 1281 0506 B781 ldd r27,Z+7 + 1282 0508 0097 sbiw r24,0 + 1283 050a A105 cpc r26,__zero_reg__ + 1284 050c B105 cpc r27,__zero_reg__ + 1285 050e 01F4 brne .L62 + 1286 .LSM122: + 1287 0510 1D8A std Y+21,__zero_reg__ + 1288 .LSM123: + 1289 0512 81E0 ldi r24,lo8(1) + 1290 0514 90E0 ldi r25,hi8(1) + 1291 0516 A0E0 ldi r26,hlo8(1) + 1292 0518 B0E0 ldi r27,hhi8(1) + 1293 051a 8483 std Z+4,r24 + 1294 051c 9583 std Z+5,r25 + 1295 051e A683 std Z+6,r26 + 1296 0520 B783 std Z+7,r27 + 1297 .L62: + 1298 .LBB106: + 1299 .LBB107: + 1300 .LSM124: + 1301 0522 8091 E800 lds r24,232 + 1302 0526 877F andi r24,lo8(-9) + 1303 0528 8093 E800 sts 232,r24 + 1304 .LBE107: + 1305 .LBE106: + 1306 .LSM125: + 1307 052c F801 movw r30,r16 + 1308 052e 6481 ldd r22,Z+4 + 1309 0530 7581 ldd r23,Z+5 + 1310 0532 CE01 movw r24,r28 + 1311 0534 4596 adiw r24,21 + 1312 0536 0E94 0000 call Endpoint_Write_Control_Stream_LE + 1313 .LBB108: + 1314 .LBB109: + 1315 .LSM126: + 1316 053a 8091 E800 lds r24,232 + 1317 053e 8B77 andi r24,lo8(123) + 1318 0540 8093 E800 sts 232,r24 + 1319 .LBE109: + 1320 .LBE108: + 1321 .LSM127: + 1322 0544 F801 movw r30,r16 + 1323 0546 1482 std Z+4,__zero_reg__ + 1324 0548 1582 std Z+5,__zero_reg__ + 1325 054a 1682 std Z+6,__zero_reg__ + 1326 054c 1782 std Z+7,__zero_reg__ + 1327 054e 00C0 rjmp .L63 + 1328 .LVL48: + 1329 .L55: + 1330 .LBE105: + 1331 .LBB110: + 1332 .LBB104: + 1333 .LBB103: + 1334 .LSM128: + 1335 0550 F801 movw r30,r16 + 1336 0552 1486 std Z+12,__zero_reg__ + 1337 0554 1586 std Z+13,__zero_reg__ + 1338 0556 1686 std Z+14,__zero_reg__ + 1339 0558 1786 std Z+15,__zero_reg__ + 1340 .LSM129: + 1341 055a CE01 movw r24,r28 + 1342 055c A0E0 ldi r26,lo8(0) + 1343 055e B0E0 ldi r27,hi8(0) + 1344 0560 2481 ldd r18,Z+4 + 1345 0562 3581 ldd r19,Z+5 + 1346 0564 4681 ldd r20,Z+6 + 1347 0566 5781 ldd r21,Z+7 + 1348 .LVL49: + 1349 0568 280F add r18,r24 + 1350 056a 391F adc r19,r25 + 1351 056c 4A1F adc r20,r26 + 1352 056e 5B1F adc r21,r27 + 1353 0570 2483 std Z+4,r18 + 1354 0572 3583 std Z+5,r19 + 1355 0574 4683 std Z+6,r20 + 1356 0576 5783 std Z+7,r21 + 1357 .LSM130: + 1358 0578 808B std Z+16,r24 + 1359 057a 918B std Z+17,r25 + 1360 057c A28B std Z+18,r26 + 1361 057e B38B std Z+19,r27 + 1362 .LSM131: + 1363 0580 80E1 ldi r24,lo8(16) + 1364 0582 90E0 ldi r25,hi8(16) + 1365 0584 A0E0 ldi r26,hlo8(16) + 1366 0586 B0E0 ldi r27,hhi8(16) + 1367 0588 848B std Z+20,r24 + 1368 058a 958B std Z+21,r25 + 1369 058c A68B std Z+22,r26 + 1370 058e B78B std Z+23,r27 + 1371 .LVL50: + 1372 .L63: + 1373 /* epilogue start */ + 1374 .LBE103: + 1375 .LBE104: + 1376 .LBE110: + 1377 .LSM132: + 1378 0590 DF91 pop r29 + 1379 0592 CF91 pop r28 + 1380 .LVL51: + 1381 0594 1F91 pop r17 + 1382 0596 0F91 pop r16 + 1383 .LVL52: + 1384 0598 FF90 pop r15 + 1385 059a EF90 pop r14 + 1386 .LVL53: + 1387 059c 0895 ret + 1388 .LFE81: + 1390 .data + 1393 C.9.3485: + 1394 0000 A1 .byte -95 + 1395 0001 01 .byte 1 + 1396 0002 0000 .word 0 + 1397 0004 0000 .word 0 + 1398 0006 0000 .word 0 + 1399 .section .progmem.data,"a",@progbits + 1402 AdapterSupportedOIDList: + 1403 0000 01 .byte 1 + 1404 0001 01 .byte 1 + 1405 0002 01 .byte 1 + 1406 0003 00 .byte 0 + 1407 0004 02 .byte 2 + 1408 0005 02 .byte 2 + 1409 0006 01 .byte 1 + 1410 0007 00 .byte 0 + 1411 0008 02 .byte 2 + 1412 0009 01 .byte 1 + 1413 000a 01 .byte 1 + 1414 000b 00 .byte 0 + 1415 000c 03 .byte 3 + 1416 000d 01 .byte 1 + 1417 000e 01 .byte 1 + 1418 000f 00 .byte 0 + 1419 0010 04 .byte 4 + 1420 0011 01 .byte 1 + 1421 0012 01 .byte 1 + 1422 0013 00 .byte 0 + 1423 0014 06 .byte 6 + 1424 0015 01 .byte 1 + 1425 0016 01 .byte 1 + 1426 0017 00 .byte 0 + 1427 0018 11 .byte 17 + 1428 0019 01 .byte 1 + 1429 001a 01 .byte 1 + 1430 001b 00 .byte 0 + 1431 001c 07 .byte 7 + 1432 001d 01 .byte 1 + 1433 001e 01 .byte 1 + 1434 001f 00 .byte 0 + 1435 0020 0A .byte 10 + 1436 0021 01 .byte 1 + 1437 0022 01 .byte 1 + 1438 0023 00 .byte 0 + 1439 0024 0B .byte 11 + 1440 0025 01 .byte 1 + 1441 0026 01 .byte 1 + 1442 0027 00 .byte 0 + 1443 0028 0C .byte 12 + 1444 0029 01 .byte 1 + 1445 002a 01 .byte 1 + 1446 002b 00 .byte 0 + 1447 002c 0D .byte 13 + 1448 002d 01 .byte 1 + 1449 002e 01 .byte 1 + 1450 002f 00 .byte 0 + 1451 0030 0E .byte 14 + 1452 0031 01 .byte 1 + 1453 0032 01 .byte 1 + 1454 0033 00 .byte 0 + 1455 0034 11 .byte 17 + 1456 0035 01 .byte 1 + 1457 0036 01 .byte 1 + 1458 0037 00 .byte 0 + 1459 0038 14 .byte 20 + 1460 0039 01 .byte 1 + 1461 003a 01 .byte 1 + 1462 003b 00 .byte 0 + 1463 003c 01 .byte 1 + 1464 003d 01 .byte 1 + 1465 003e 02 .byte 2 + 1466 003f 00 .byte 0 + 1467 0040 02 .byte 2 + 1468 0041 01 .byte 1 + 1469 0042 02 .byte 2 + 1470 0043 00 .byte 0 + 1471 0044 03 .byte 3 + 1472 0045 01 .byte 1 + 1473 0046 02 .byte 2 + 1474 0047 00 .byte 0 + 1475 0048 04 .byte 4 + 1476 0049 01 .byte 1 + 1477 004a 02 .byte 2 + 1478 004b 00 .byte 0 + 1479 004c 05 .byte 5 + 1480 004d 01 .byte 1 + 1481 004e 02 .byte 2 + 1482 004f 00 .byte 0 + 1483 0050 01 .byte 1 + 1484 0051 01 .byte 1 + 1485 0052 01 .byte 1 + 1486 0053 01 .byte 1 + 1487 0054 02 .byte 2 + 1488 0055 01 .byte 1 + 1489 0056 01 .byte 1 + 1490 0057 01 .byte 1 + 1491 0058 03 .byte 3 + 1492 0059 01 .byte 1 + 1493 005a 01 .byte 1 + 1494 005b 01 .byte 1 + 1495 005c 04 .byte 4 + 1496 005d 01 .byte 1 + 1497 005e 01 .byte 1 + 1498 005f 01 .byte 1 + 1499 0060 01 .byte 1 + 1500 0061 01 .byte 1 + 1501 0062 02 .byte 2 + 1502 0063 01 .byte 1 + 1503 0064 02 .byte 2 + 1504 0065 01 .byte 1 + 1505 0066 02 .byte 2 + 1506 0067 01 .byte 1 + 1507 0068 03 .byte 3 + 1508 0069 01 .byte 1 + 1509 006a 02 .byte 2 + 1510 006b 01 .byte 1 + 1551 .Letext0: +DEFINED SYMBOLS + *ABS*:0000000000000000 RNDIS.c + /tmp/ccEJ1rts.s:2 *ABS*:000000000000003f __SREG__ + /tmp/ccEJ1rts.s:3 *ABS*:000000000000003e __SP_H__ + /tmp/ccEJ1rts.s:4 *ABS*:000000000000003d __SP_L__ + /tmp/ccEJ1rts.s:5 *ABS*:0000000000000034 __CCP__ + /tmp/ccEJ1rts.s:6 *ABS*:0000000000000000 __tmp_reg__ + /tmp/ccEJ1rts.s:7 *ABS*:0000000000000001 __zero_reg__ + /tmp/ccEJ1rts.s:19 .text.RNDIS_Device_USBTask:0000000000000000 RNDIS_Device_USBTask + /tmp/ccEJ1rts.s:1393 .data:0000000000000000 C.9.3485 + /tmp/ccEJ1rts.s:347 .text.RNDIS_Device_ConfigureEndpoints:0000000000000000 RNDIS_Device_ConfigureEndpoints + /tmp/ccEJ1rts.s:497 .text.RNDIS_Device_ProcessControlRequest:0000000000000000 RNDIS_Device_ProcessControlRequest + /tmp/ccEJ1rts.s:1402 .progmem.data:0000000000000000 AdapterSupportedOIDList + +UNDEFINED SYMBOLS +USB_DeviceState +Endpoint_Write_Stream_LE +Endpoint_Read_Stream_LE +Endpoint_ConfigureEndpoint_Prv +USB_ControlRequest +Endpoint_Read_Control_Stream_LE +memcpy_P +memcpy +Endpoint_Write_Control_Stream_LE +__do_copy_data diff --git a/firmware/LUFA/Drivers/USB/Class/Device/RNDIS.o b/firmware/LUFA/Drivers/USB/Class/Device/RNDIS.o new file mode 100644 index 0000000..f525cda Binary files /dev/null and b/firmware/LUFA/Drivers/USB/Class/Device/RNDIS.o differ -- cgit v1.2.3