More endianness porting of the LUFA device mode class drivers.
authorDean Camera <dean@fourwalledcubicle.com>
Mon, 11 Jul 2011 09:50:54 +0000 (09:50 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Mon, 11 Jul 2011 09:50:54 +0000 (09:50 +0000)
Add endianness information to the class driver and core structure definitions.

Move out the unused Ethernet_Frame_Info_t structure definition to the RNDIS device demos where it is needed.

18 files changed:
Demos/Device/ClassDriver/RNDISEthernet/Lib/Ethernet.c
Demos/Device/ClassDriver/RNDISEthernet/Lib/EthernetProtocols.h
Demos/Device/ClassDriver/RNDISEthernet/Lib/ProtocolDecoders.c
Demos/Device/ClassDriver/RNDISEthernet/Lib/ProtocolDecoders.h
Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.h
Demos/Device/LowLevel/RNDISEthernet/Lib/ProtocolDecoders.c
LUFA/Drivers/USB/Class/Common/Audio.h
LUFA/Drivers/USB/Class/Common/CDC.h
LUFA/Drivers/USB/Class/Common/HID.h
LUFA/Drivers/USB/Class/Common/MIDI.h
LUFA/Drivers/USB/Class/Common/MassStorage.h
LUFA/Drivers/USB/Class/Common/RNDIS.h
LUFA/Drivers/USB/Class/Common/StillImage.h
LUFA/Drivers/USB/Class/Device/CDC.c
LUFA/Drivers/USB/Class/Device/MassStorage.c
LUFA/Drivers/USB/Class/Device/RNDIS.c
LUFA/Drivers/USB/Core/StdDescriptors.h
LUFA/Drivers/USB/Core/USBTask.h

index dacbdbf..e65ad77 100644 (file)
@@ -59,7 +59,7 @@ const IP_Address_t  ClientIPAddress     = {CLIENT_IP_ADDRESS};
 void Ethernet_ProcessPacket(Ethernet_Frame_Info_t* const FrameIN,
                             Ethernet_Frame_Info_t* const FrameOUT)
 {
-       DecodeEthernetFrameHeader(FrameIN);
+       DecodeEthernetFrameHeader(FrameIN->FrameData);
 
        /* Cast the incoming Ethernet frame to the Ethernet header type */
        Ethernet_Frame_Header_t* FrameINHeader  = (Ethernet_Frame_Header_t*)&FrameIN->FrameData;
index cb8e16c..a67aca9 100644 (file)
@@ -37,6 +37,9 @@
 #ifndef _ETHERNET_PROTOCOLS_H_
 #define _ETHERNET_PROTOCOLS_H_
 
+       /* Includes: */
+               #include <LUFA/Drivers/USB/Class/RNDIS.h>
+
        /* Macros: */
                #define ETHERTYPE_IPV4                   0x0800
                #define ETHERTYPE_ARP                    0x0806
                #define PROTOCOL_SCTP                    132
 
        /* Type Defines: */
+               /** Type define for an Ethernet frame buffer data and information structure. */
+               typedef struct
+               {
+                       uint8_t  FrameData[ETHERNET_FRAME_SIZE_MAX]; /**< Ethernet frame contents. */
+                       uint16_t FrameLength; /**< Length in bytes of the Ethernet frame stored in the buffer. */
+               } Ethernet_Frame_Info_t;
+
                /** Type define for a protocol IP address of a device on a network. */
                typedef struct
                {
index de61495..2c8c398 100644 (file)
 
 /** Decodes an Ethernet frame header and prints its contents to through the USART in a human readable format.
  *
- *  \param[in] FrameINData  Pointer to the start of an Ethernet frame information structure
+ *  \param[in] FrameINData  Pointer to the start of an Ethernet frame data
  */
-void DecodeEthernetFrameHeader(Ethernet_Frame_Info_t* const FrameINData)
+void DecodeEthernetFrameHeader(void* InDataStart)
 {
        #if !defined(NO_DECODE_ETHERNET)
-       Ethernet_Frame_Header_t* FrameHeader = (Ethernet_Frame_Header_t*)FrameINData->FrameData;
+       Ethernet_Frame_Header_t* FrameHeader = (Ethernet_Frame_Header_t*)InDataStart;
 
        printf_P(PSTR("\r\n"));
 
@@ -84,10 +84,7 @@ void DecodeEthernetFrameHeader(Ethernet_Frame_Info_t* const FrameINData)
                                                                             FrameHeader->Destination.Octets[4],
                                                                             FrameHeader->Destination.Octets[5]);
 
-       if (SwapEndian_16(FrameINData->FrameLength) > ETHERNET_VER2_MINSIZE)
-         printf_P(PSTR("  + Protocol: 0x%04x\r\n"), SwapEndian_16(FrameHeader->EtherType));
-       else
-         printf_P(PSTR("  + Protocol: UNKNOWN E1\r\n"));
+       printf_P(PSTR("  + Protocol: 0x%04x\r\n"), SwapEndian_16(FrameHeader->EtherType));
        #endif
 }
 
index d798c22..aeece37 100644 (file)
@@ -47,7 +47,7 @@
                #include "Ethernet.h"
 
        /* Function Prototypes: */
-               void DecodeEthernetFrameHeader(Ethernet_Frame_Info_t* const FrameINData);
+               void DecodeEthernetFrameHeader(void* InDataStart);
                void DecodeARPHeader(void* InDataStart);
                void DecodeIPHeader(void* InDataStart);
                void DecodeICMPHeader(void* InDataStart);
index 7749e79..3ce6212 100644 (file)
                #define NO_PROCESS                       -1
 
        /* Type Defines: */
+               /** Type define for an Ethernet frame buffer data and information structure. */
+               typedef struct
+               {
+                       uint8_t  FrameData[ETHERNET_FRAME_SIZE_MAX]; /**< Ethernet frame contents. */
+                       uint16_t FrameLength; /**< Length in bytes of the Ethernet frame stored in the buffer. */
+               } Ethernet_Frame_Info_t;
+
                /** Type define for an Ethernet frame header. */
                typedef struct
                {
index cadd335..827dc1a 100644 (file)
@@ -84,10 +84,7 @@ void DecodeEthernetFrameHeader(void* InDataStart)
                                                                             FrameHeader->Destination.Octets[4],
                                                                             FrameHeader->Destination.Octets[5]);
 
-       if (SwapEndian_16(FrameIN.FrameLength) > ETHERNET_VER2_MINSIZE)
-         printf_P(PSTR("  + Protocol: 0x%04x\r\n"), SwapEndian_16(FrameHeader->EtherType));
-       else
-         printf_P(PSTR("  + Protocol: UNKNOWN E1\r\n"));
+       printf_P(PSTR("  + Protocol: 0x%04x\r\n"), SwapEndian_16(FrameHeader->EtherType));
        #endif
 }
 
index 247f7f6..32a6640 100644 (file)
                 *  a USB endpoint). See the USB Audio specification for more details.
                 *
                 *  \see \ref USB_Audio_StdDescriptor_InputTerminal_t for the version of this type with standard element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *
                 *  \see \ref USB_Audio_Descriptor_InputTerminal_t for the version of this type with non-standard LUFA specific
                 *       element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *  a USB endpoint). See the USB Audio specification for more details.
                 *
                 *  \see \ref USB_Audio_StdDescriptor_OutputTerminal_t for the version of this type with standard element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *
                 *  \see \ref USB_Audio_Descriptor_OutputTerminal_t for the version of this type with non-standard LUFA specific
                 *       element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *  details.
                 *
                 *  \see \ref USB_Audio_StdDescriptor_Interface_AC_t for the version of this type with standard element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *
                 *  \see \ref USB_Audio_Descriptor_Interface_AC_t for the version of this type with non-standard LUFA specific
                 *       element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *  specification for more details.
                 *
                 *  \see \ref USB_Audio_StdDescriptor_FeatureUnit_t for the version of this type with standard element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *
                 *  \see \ref USB_Audio_Descriptor_FeatureUnit_t for the version of this type with non-standard LUFA specific
                 *       element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *  how audio streams within the device are formatted. See the USB Audio specification for more details.
                 *
                 *  \see \ref USB_Audio_StdDescriptor_Interface_AS_t for the version of this type with standard element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *
                 *  \see \ref USB_Audio_Descriptor_Interface_AS_t for the version of this type with non-standard LUFA specific
                 *       element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *        the continuous or discrete sample frequencies.
                 *
                 *  \see \ref USB_Audio_StdDescriptor_Format_t for the version of this type with standard element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *
                 *  Type define for a 24bit audio sample frequency structure. As GCC does not contain a built in 24-bit datatype,
                 *  this this structure is used to build up the value instead. Fill this structure with the \ref AUDIO_SAMPLE_FREQ() macro.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *
                 *  \see \ref USB_Audio_Descriptor_Format_t for the version of this type with non-standard LUFA specific
                 *       element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *  descriptor with a few Audio-class-specific extensions. See the USB Audio specification for more details.
                 *
                 *  \see \ref USB_Audio_StdDescriptor_StreamEndpoint_Std_t for the version of this type with standard element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *
                 *  \see \ref USB_Audio_Descriptor_StreamEndpoint_Std_t for the version of this type with non-standard LUFA specific
                 *       element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *  class-specific extended endpoint descriptor. See the USB Audio specification for more details.
                 *
                 *  \see \ref USB_Audio_StdDescriptor_StreamEndpoint_Spc_t for the version of this type with standard element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *
                 *  \see \ref USB_Audio_Descriptor_StreamEndpoint_Spc_t for the version of this type with non-standard LUFA specific
                 *       element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
index e74b0f1..45e0c58 100644 (file)
                 *  See the CDC class specification for more details.
                 *
                 *  \see \ref USB_CDC_StdDescriptor_FunctionalHeader_t for the version of this type with standard element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *
                 *  \see \ref USB_CDC_Descriptor_FunctionalHeader_t for the version of this type with non-standard LUFA specific
                 *       element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *  supports the CDC ACM subclass of the CDC specification. See the CDC class specification for more details.
                 *
                 *  \see \ref USB_CDC_StdDescriptor_FunctionalACM_t for the version of this type with standard element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *
                 *  \see \ref USB_CDC_Descriptor_FunctionalACM_t for the version of this type with non-standard LUFA specific
                 *       element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *  CDC control and data interfaces are related. See the CDC class specification for more details.
                 *
                 *  \see \ref USB_CDC_StdDescriptor_FunctionalUnion_t for the version of this type with standard element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *
                 *  \see \ref USB_CDC_Descriptor_FunctionalUnion_t for the version of this type with non-standard LUFA specific
                 *       element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *
                 *  Type define for a CDC Line Encoding structure, used to hold the various encoding parameters for a virtual
                 *  serial port.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
index ce28d34..4e3c701 100644 (file)
                 *  specification for details on the structure elements.
                 *
                 *  \see \ref USB_HID_StdDescriptor_HID_t for the version of this type with standard element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *
                 *  \see \ref USB_HID_Descriptor_HID_t for the version of this type with non-standard LUFA specific
                 *       element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
index 1d6eb70..a273589 100644 (file)
                 *  See the USB Audio specification for more details.
                 *
                 *  \see \ref USB_MIDI_StdDescriptor_AudioInterface_AS_t for the version of this type with standard element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *
                 *  \see \ref USB_MIDI_Descriptor_AudioInterface_AS_t for the version of this type with non-standard LUFA specific
                 *       element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *  a physical input jack, or a logical jack (receiving input data internally, or from the host via an endpoint).
                 *
                 *  \see \ref USB_MIDI_StdDescriptor_InputJack_t for the version of this type with standard element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *
                 *  \see \ref USB_MIDI_Descriptor_InputJack_t for the version of this type with non-standard LUFA specific
                 *       element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *  a physical output jack, or a logical jack (sending output data internally, or to the host via an endpoint).
                 *
                 *  \see \ref USB_MIDI_StdDescriptor_OutputJack_t for the version of this type with standard element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *
                 *  \see \ref USB_MIDI_Descriptor_OutputJack_t for the version of this type with non-standard LUFA specific
                 *       element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *  class-specific extended MIDI endpoint descriptor. See the USB Audio specification for more details.
                 *
                 *  \see \ref USB_MIDI_StdDescriptor_Jack_Endpoint_t for the version of this type with standard element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                 *
                 *  \see \ref USB_MIDI_Descriptor_Jack_Endpoint_t for the version of this type with non-standard LUFA specific
                 *       element names.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                /** \brief MIDI Class Driver Event Packet.
                 *
                 *  Type define for a USB MIDI event packet, used to encapsulate sent and received MIDI messages from a USB MIDI interface.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
index 9f8de4e..49246ba 100644 (file)
        /* Type Defines: */
                /** \brief Mass Storage Class Command Block Wrapper.
                 *
-                *  Type define for a Command Block Wrapper, used in the Mass Storage Bulk-Only Transport protocol. */
+                *  Type define for a Command Block Wrapper, used in the Mass Storage Bulk-Only Transport protocol.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
+                */
                typedef struct
                {
                        uint32_t Signature; /**< Command block signature, must be \ref MS_CBW_SIGNATURE to indicate a valid Command Block. */
                /** \brief Mass Storage Class Command Status Wrapper.
                 *
                 *  Type define for a Command Status Wrapper, used in the Mass Storage Bulk-Only Transport protocol.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
index 0ca50d5..05ab13b 100644 (file)
                };
 
        /* Type Defines: */
-               /** \brief Ethernet Frame Packet Information Structure.
-                *
-                *  Type define for an Ethernet frame buffer data and information structure. This can be used to conveniently
-                *  store both the size and data in an Ethernet frame.
-                */
-               typedef struct
-               {
-                       uint8_t  FrameData[ETHERNET_FRAME_SIZE_MAX]; /**< Ethernet frame contents. */
-                       uint16_t FrameLength; /**< Length in bytes of the Ethernet frame stored in the buffer. */
-               } Ethernet_Frame_Info_t;
-
                /** \brief MAC Address Structure.
                 *
                 *  Type define for a physical MAC address of a device on a network.
                /** \brief RNDIS Common Message Header Structure.
                 *
                 *  Type define for a RNDIS message header, sent before RNDIS messages.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                /** \brief RNDIS Message Structure.
                 *
                 *  Type define for a RNDIS packet message, used to encapsulate Ethernet packets sent to and from the adapter.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                /** \brief RNDIS Initialization Message Structure.
                 *
                 *  Type define for a RNDIS Initialize command message.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                /** \brief RNDIS Initialize Complete Message Structure.
                 *
                 *  Type define for a RNDIS Initialize Complete response message.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                /** \brief RNDIS Keep Alive Message Structure.
                 *
                 *  Type define for a RNDIS Keep Alive command message.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                /** \brief RNDIS Keep Alive Complete Message Structure.
                 *
                 *  Type define for a RNDIS Keep Alive Complete response message.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                /** \brief RNDIS Reset Complete Message Structure.
                 *
                 *  Type define for a RNDIS Reset Complete response message.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                /** \brief RNDIS OID Property Set Message Structure.
                 *
                 *  Type define for a RNDIS OID Property Set command message.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                /** \brief RNDIS OID Property Set Complete Message Structure.
                 *
                 *  Type define for a RNDIS OID Property Set Complete response message.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                /** \brief RNDIS OID Property Query Message Structure.
                 *
                 *  Type define for a RNDIS OID Property Query command message.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
                /** \brief RNDIS OID Property Query Complete Message Structure.
                 *
                 *  Type define for a RNDIS OID Property Query Complete response message.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
index dd48650..4f418ad 100644 (file)
                 *
                 *  Type define for a PIMA container, use to send commands and receive responses to and from an
                 *  attached Still Image device.
+                *
+                *  \note Regardless of CPU architecture, these values should be stored as little endian.
                 */
                typedef struct
                {
index 7398ce6..da880ab 100644 (file)
@@ -276,9 +276,9 @@ void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDC
                {
                        .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),
                        .bRequest      = CDC_NOTIF_SerialState,
-                       .wValue        = 0,
-                       .wIndex        = 0,
-                       .wLength       = sizeof(CDCInterfaceInfo->State.ControlLineStates.DeviceToHost),
+                       .wValue        = CPU_TO_LE16(0),
+                       .wIndex        = CPU_TO_LE16(0),
+                       .wLength       = CPU_TO_LE16(sizeof(CDCInterfaceInfo->State.ControlLineStates.DeviceToHost)),
                };
 
        Endpoint_Write_Stream_LE(&Notification, sizeof(USB_Request_Header_t), NULL);
index efc9cd4..4f1542a 100644 (file)
@@ -124,17 +124,15 @@ void MS_Device_USBTask(USB_ClassInfo_MS_Device_t* const 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;
+                       bool SCSICommandResult = CALLBACK_MS_Device_SCSICommandReceived(MSInterfaceInfo);
+
+                       MSInterfaceInfo->State.CommandStatus.Status              = (SCSICommandResult) ? MS_SCSI_COMMAND_Pass : MS_SCSI_COMMAND_Fail;
+                       MSInterfaceInfo->State.CommandStatus.Signature           = CPU_TO_LE32(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();
-                       }
+                       if (!(SCSICommandResult) && (le32_to_cpu(MSInterfaceInfo->State.CommandStatus.DataTransferResidue)))
+                         Endpoint_StallTransaction();
 
                        MS_Device_ReturnCommandStatus(MSInterfaceInfo);
                }
@@ -167,11 +165,15 @@ static bool MS_Device_ReadInCommandBlock(USB_ClassInfo_MS_Device_t* const MSInte
                                       (sizeof(MS_CommandBlockWrapper_t) - 16), &BytesProcessed) ==
                                       ENDPOINT_RWSTREAM_IncompleteTransfer)
        {
+               #if !defined(INTERRUPT_CONTROL_ENDPOINT)
+               USB_USBTask();
+               #endif
+
                if (MSInterfaceInfo->State.IsMassStoreReset)
                  return false;
        }
 
-       if ((MSInterfaceInfo->State.CommandBlock.Signature         != MS_CBW_SIGNATURE)                  ||
+       if ((MSInterfaceInfo->State.CommandBlock.Signature         != CPU_TO_LE32(MS_CBW_SIGNATURE))     ||
            (MSInterfaceInfo->State.CommandBlock.LUN               >= MSInterfaceInfo->Config.TotalLUNs) ||
                (MSInterfaceInfo->State.CommandBlock.Flags              & 0x1F)                              ||
                (MSInterfaceInfo->State.CommandBlock.SCSICommandLength == 0)                                 ||
@@ -189,6 +191,10 @@ static bool MS_Device_ReadInCommandBlock(USB_ClassInfo_MS_Device_t* const MSInte
                                        MSInterfaceInfo->State.CommandBlock.SCSICommandLength, &BytesProcessed) ==
                                        ENDPOINT_RWSTREAM_IncompleteTransfer)
        {
+               #if !defined(INTERRUPT_CONTROL_ENDPOINT)
+               USB_USBTask();
+               #endif
+
                if (MSInterfaceInfo->State.IsMassStoreReset)
                  return false;
        }
@@ -229,6 +235,10 @@ static void MS_Device_ReturnCommandStatus(USB_ClassInfo_MS_Device_t* const MSInt
                                        sizeof(MS_CommandStatusWrapper_t), &BytesProcessed) ==
                                        ENDPOINT_RWSTREAM_IncompleteTransfer)
        {
+               #if !defined(INTERRUPT_CONTROL_ENDPOINT)
+               USB_USBTask();
+               #endif
+
                if (MSInterfaceInfo->State.IsMassStoreReset)
                  return;
        }
index a9bbcfa..9a89ae0 100644 (file)
 
 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,
+               CPU_TO_LE32(OID_GEN_SUPPORTED_LIST),
+               CPU_TO_LE32(OID_GEN_PHYSICAL_MEDIUM),
+               CPU_TO_LE32(OID_GEN_HARDWARE_STATUS),
+               CPU_TO_LE32(OID_GEN_MEDIA_SUPPORTED),
+               CPU_TO_LE32(OID_GEN_MEDIA_IN_USE),
+               CPU_TO_LE32(OID_GEN_MAXIMUM_FRAME_SIZE),
+               CPU_TO_LE32(OID_GEN_MAXIMUM_TOTAL_SIZE),
+               CPU_TO_LE32(OID_GEN_LINK_SPEED),
+               CPU_TO_LE32(OID_GEN_TRANSMIT_BLOCK_SIZE),
+               CPU_TO_LE32(OID_GEN_RECEIVE_BLOCK_SIZE),
+               CPU_TO_LE32(OID_GEN_VENDOR_ID),
+               CPU_TO_LE32(OID_GEN_VENDOR_DESCRIPTION),
+               CPU_TO_LE32(OID_GEN_CURRENT_PACKET_FILTER),
+               CPU_TO_LE32(OID_GEN_MAXIMUM_TOTAL_SIZE),
+               CPU_TO_LE32(OID_GEN_MEDIA_CONNECT_STATUS),
+               CPU_TO_LE32(OID_GEN_XMIT_OK),
+               CPU_TO_LE32(OID_GEN_RCV_OK),
+               CPU_TO_LE32(OID_GEN_XMIT_ERROR),
+               CPU_TO_LE32(OID_GEN_RCV_ERROR),
+               CPU_TO_LE32(OID_GEN_RCV_NO_BUFFER),
+               CPU_TO_LE32(OID_802_3_PERMANENT_ADDRESS),
+               CPU_TO_LE32(OID_802_3_CURRENT_ADDRESS),
+               CPU_TO_LE32(OID_802_3_MULTICAST_LIST),
+               CPU_TO_LE32(OID_802_3_MAXIMUM_LIST_SIZE),
+               CPU_TO_LE32(OID_802_3_RCV_ERROR_ALIGNMENT),
+               CPU_TO_LE32(OID_802_3_XMIT_ONE_COLLISION),
+               CPU_TO_LE32(OID_802_3_XMIT_MORE_COLLISIONS),
        };
 
 void RNDIS_Device_ProcessControlRequest(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo)
@@ -97,14 +97,14 @@ void RNDIS_Device_ProcessControlRequest(USB_ClassInfo_RNDIS_Device_t* const RNDI
                                if (!(MessageHeader->MessageLength))
                                {
                                        RNDISInterfaceInfo->State.RNDISMessageBuffer[0] = 0;
-                                       MessageHeader->MessageLength = 1;
+                                       MessageHeader->MessageLength                    = CPU_TO_LE32(1);
                                }
 
                                Endpoint_ClearSETUP();
-                               Endpoint_Write_Control_Stream_LE(RNDISInterfaceInfo->State.RNDISMessageBuffer, MessageHeader->MessageLength);
+                               Endpoint_Write_Control_Stream_LE(RNDISInterfaceInfo->State.RNDISMessageBuffer, le32_to_cpu(MessageHeader->MessageLength));
                                Endpoint_ClearOUT();
 
-                               MessageHeader->MessageLength = 0;
+                               MessageHeader->MessageLength = CPU_TO_LE32(0);
                        }
 
                        break;
@@ -171,9 +171,9 @@ void RNDIS_Device_USBTask(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo
                        {
                                .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),
                                .bRequest      = RNDIS_NOTIF_ResponseAvailable,
-                               .wValue        = 0,
-                               .wIndex        = 0,
-                               .wLength       = 0,
+                               .wValue        = CPU_TO_LE16(0),
+                               .wIndex        = CPU_TO_LE16(0),
+                               .wLength       = CPU_TO_LE16(0),
                        };
 
                Endpoint_Write_Stream_LE(&Notification, sizeof(USB_Request_Header_t), NULL);
@@ -191,115 +191,114 @@ void RNDIS_Device_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_Device_t* const
 
        RNDIS_Message_Header_t* MessageHeader = (RNDIS_Message_Header_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer;
 
-       switch (MessageHeader->MessageType)
+       switch (le32_to_cpu(MessageHeader->MessageType))
        {
                case REMOTE_NDIS_INITIALIZE_MSG:
-                       RNDISInterfaceInfo->State.ResponseReady = true;
+                       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;
-
+                       INITIALIZE_Response->MessageType            = CPU_TO_LE32(REMOTE_NDIS_INITIALIZE_CMPLT);
+                       INITIALIZE_Response->MessageLength          = CPU_TO_LE32(sizeof(RNDIS_Initialize_Complete_t));
+                       INITIALIZE_Response->RequestId              = INITIALIZE_Message->RequestId;
+                       INITIALIZE_Response->Status                 = CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS);
+
+                       INITIALIZE_Response->MajorVersion           = CPU_TO_LE32(REMOTE_NDIS_VERSION_MAJOR);
+                       INITIALIZE_Response->MinorVersion           = CPU_TO_LE32(REMOTE_NDIS_VERSION_MINOR);
+                       INITIALIZE_Response->DeviceFlags            = CPU_TO_LE32(REMOTE_NDIS_DF_CONNECTIONLESS);
+                       INITIALIZE_Response->Medium                 = CPU_TO_LE32(REMOTE_NDIS_MEDIUM_802_3);
+                       INITIALIZE_Response->MaxPacketsPerTransfer  = CPU_TO_LE32(1);
+                       INITIALIZE_Response->MaxTransferSize        = CPU_TO_LE32(sizeof(RNDIS_Packet_Message_t) + ETHERNET_FRAME_SIZE_MAX);
+                       INITIALIZE_Response->PacketAlignmentFactor  = CPU_TO_LE32(0);
+                       INITIALIZE_Response->AFListOffset           = CPU_TO_LE32(0);
+                       INITIALIZE_Response->AFListSize             = CPU_TO_LE32(0);
+
+                       RNDISInterfaceInfo->State.CurrRNDISState    = RNDIS_Initialized;
                        break;
                case REMOTE_NDIS_HALT_MSG:
-                       RNDISInterfaceInfo->State.ResponseReady = false;
-                       MessageHeader->MessageLength = 0;
+                       RNDISInterfaceInfo->State.ResponseReady     = false;
 
-                       RNDISInterfaceInfo->State.CurrRNDISState = RNDIS_Uninitialized;
+                       MessageHeader->MessageLength                = CPU_TO_LE32(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;
+                       RNDISInterfaceInfo->State.ResponseReady     = true;
 
-                       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;
+                       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           = CPU_TO_LE32(QUERY_Message->Oid);
 
-                       QUERY_Response->MessageType   = REMOTE_NDIS_QUERY_CMPLT;
-                       QUERY_Response->MessageLength = sizeof(RNDIS_Query_Complete_t);
+                       void*    QueryData    = &RNDISInterfaceInfo->State.RNDISMessageBuffer[sizeof(RNDIS_Message_Header_t) +
+                                                                                             le32_to_cpu(QUERY_Message->InformationBufferOffset)];
+                       void*    ResponseData = &RNDISInterfaceInfo->State.RNDISMessageBuffer[sizeof(RNDIS_Query_Complete_t)];
+                       uint16_t ResponseSize;
 
-                       if (RNDIS_Device_ProcessNDISQuery(RNDISInterfaceInfo, Query_Oid, QueryData, QUERY_Message->InformationBufferLength,
+                       QUERY_Response->MessageType                 = CPU_TO_LE32(REMOTE_NDIS_QUERY_CMPLT);
+                       
+                       if (RNDIS_Device_ProcessNDISQuery(RNDISInterfaceInfo, Query_Oid, QueryData, le32_to_cpu(QUERY_Message->InformationBufferLength),
                                                          ResponseData, &ResponseSize))
                        {
-                               QUERY_Response->Status                  = REMOTE_NDIS_STATUS_SUCCESS;
-                               QUERY_Response->MessageLength          += ResponseSize;
+                               QUERY_Response->Status                  = CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS);
+                               QUERY_Response->MessageLength           = cpu_to_le32(sizeof(RNDIS_Query_Complete_t) + ResponseSize);
 
-                               QUERY_Response->InformationBufferLength = ResponseSize;
-                               QUERY_Response->InformationBufferOffset = (sizeof(RNDIS_Query_Complete_t) - sizeof(RNDIS_Message_Header_t));
+                               QUERY_Response->InformationBufferLength = CPU_TO_LE32(ResponseSize);
+                               QUERY_Response->InformationBufferOffset = CPU_TO_LE32(sizeof(RNDIS_Query_Complete_t) - sizeof(RNDIS_Message_Header_t));
                        }
                        else
                        {
-                               QUERY_Response->Status                  = REMOTE_NDIS_STATUS_NOT_SUPPORTED;
+                               QUERY_Response->Status                  = CPU_TO_LE32(REMOTE_NDIS_STATUS_NOT_SUPPORTED);
+                               QUERY_Response->MessageLength           = CPU_TO_LE32(sizeof(RNDIS_Query_Complete_t));
 
-                               QUERY_Response->InformationBufferLength = 0;
-                               QUERY_Response->InformationBufferOffset = 0;
+                               QUERY_Response->InformationBufferLength = CPU_TO_LE32(0);
+                               QUERY_Response->InformationBufferOffset = CPU_TO_LE32(0);
                        }
 
                        break;
                case REMOTE_NDIS_SET_MSG:
-                       RNDISInterfaceInfo->State.ResponseReady = true;
+                       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;
+                       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               = le32_to_cpu(SET_Message->Oid);
 
-                       SET_Response->MessageType   = REMOTE_NDIS_SET_CMPLT;
-                       SET_Response->MessageLength = sizeof(RNDIS_Set_Complete_t);
-                       SET_Response->RequestId     = SET_Message->RequestId;
+                       SET_Response->MessageType                   = CPU_TO_LE32(REMOTE_NDIS_SET_CMPLT);
+                       SET_Response->MessageLength                 = CPU_TO_LE32(sizeof(RNDIS_Set_Complete_t));
+                       SET_Response->RequestId                     = SET_Message->RequestId;
 
                        void* SetData = &RNDISInterfaceInfo->State.RNDISMessageBuffer[sizeof(RNDIS_Message_Header_t) +
-                                                                                     SET_Message->InformationBufferOffset];
+                                                                                     le32_to_cpu(SET_Message->InformationBufferOffset)];
 
                        SET_Response->Status = RNDIS_Device_ProcessNDISSet(RNDISInterfaceInfo, SET_Oid, SetData,
-                                                                          SET_Message->InformationBufferLength) ?
+                                                                          le32_to_cpu(SET_Message->InformationBufferLength)) ?
                                                                           REMOTE_NDIS_STATUS_SUCCESS : REMOTE_NDIS_STATUS_NOT_SUPPORTED;
                        break;
                case REMOTE_NDIS_RESET_MSG:
-                       RNDISInterfaceInfo->State.ResponseReady = true;
+                       RNDISInterfaceInfo->State.ResponseReady     = true;
 
-                       RNDIS_Reset_Complete_t* RESET_Response = (RNDIS_Reset_Complete_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer;
+                       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;
+                       RESET_Response->MessageType                 = CPU_TO_LE32(REMOTE_NDIS_RESET_CMPLT);
+                       RESET_Response->MessageLength               = CPU_TO_LE32(sizeof(RNDIS_Reset_Complete_t));
+                       RESET_Response->Status                      = CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS);
+                       RESET_Response->AddressingReset             = CPU_TO_LE32(0);
 
                        break;
                case REMOTE_NDIS_KEEPALIVE_MSG:
-                       RNDISInterfaceInfo->State.ResponseReady = true;
+                       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;
+                       KEEPALIVE_Response->MessageType             = CPU_TO_LE32(REMOTE_NDIS_KEEPALIVE_CMPLT);
+                       KEEPALIVE_Response->MessageLength           = CPU_TO_LE32(sizeof(RNDIS_KeepAlive_Complete_t));
+                       KEEPALIVE_Response->RequestId               = KEEPALIVE_Message->RequestId;
+                       KEEPALIVE_Response->Status                  = CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS);
 
                        break;
        }
@@ -327,27 +326,27 @@ static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t* const RN
                        *ResponseSize = sizeof(uint32_t);
 
                        /* Indicate that the device is a true ethernet link */
-                       *((uint32_t*)ResponseData) = 0;
+                       *((uint32_t*)ResponseData) = CPU_TO_LE32(0);
 
                        return true;
                case OID_GEN_HARDWARE_STATUS:
                        *ResponseSize = sizeof(uint32_t);
 
-                       *((uint32_t*)ResponseData) = NDIS_HardwareStatus_Ready;
+                       *((uint32_t*)ResponseData) = CPU_TO_LE32(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;
+                       *((uint32_t*)ResponseData) = CPU_TO_LE32(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;
+                       *((uint32_t*)ResponseData) = CPU_TO_LE32(0x00FFFFFF);
 
                        return true;
                case OID_GEN_MAXIMUM_FRAME_SIZE:
@@ -355,7 +354,7 @@ static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t* const RN
                case OID_GEN_RECEIVE_BLOCK_SIZE:
                        *ResponseSize = sizeof(uint32_t);
 
-                       *((uint32_t*)ResponseData) = ETHERNET_FRAME_SIZE_MAX;
+                       *((uint32_t*)ResponseData) = CPU_TO_LE32(ETHERNET_FRAME_SIZE_MAX);
 
                        return true;
                case OID_GEN_VENDOR_DESCRIPTION:
@@ -367,14 +366,14 @@ static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t* const RN
                case OID_GEN_MEDIA_CONNECT_STATUS:
                        *ResponseSize = sizeof(uint32_t);
 
-                       *((uint32_t*)ResponseData) = REMOTE_NDIS_MEDIA_STATE_CONNECTED;
+                       *((uint32_t*)ResponseData) = CPU_TO_LE32(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;
+                       *((uint32_t*)ResponseData) = CPU_TO_LE32(100000);
 
                        return true;
                case OID_802_3_PERMANENT_ADDRESS:
@@ -388,13 +387,13 @@ static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t* const RN
                        *ResponseSize = sizeof(uint32_t);
 
                        /* Indicate only one multicast address supported */
-                       *((uint32_t*)ResponseData) = 1;
+                       *((uint32_t*)ResponseData) = CPU_TO_LE32(1);
 
                        return true;
                case OID_GEN_CURRENT_PACKET_FILTER:
                        *ResponseSize = sizeof(uint32_t);
 
-                       *((uint32_t*)ResponseData) = RNDISInterfaceInfo->State.CurrPacketFilter;
+                       *((uint32_t*)ResponseData) = cpu_to_le32(RNDISInterfaceInfo->State.CurrPacketFilter);
 
                        return true;
                case OID_GEN_XMIT_OK:
@@ -408,14 +407,14 @@ static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t* const RN
                        *ResponseSize = sizeof(uint32_t);
 
                        /* Unused statistic OIDs - always return 0 for each */
-                       *((uint32_t*)ResponseData) = 0;
+                       *((uint32_t*)ResponseData) = CPU_TO_LE32(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);
+                       *((uint32_t*)ResponseData) = CPU_TO_LE32(RNDIS_MESSAGE_BUFFER_SIZE + ETHERNET_FRAME_SIZE_MAX);
 
                        return true;
                default:
@@ -433,9 +432,9 @@ static bool RNDIS_Device_ProcessNDISSet(USB_ClassInfo_RNDIS_Device_t* const RNDI
        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);
+                       RNDISInterfaceInfo->State.CurrPacketFilter = le32_to_cpu(*((uint32_t*)SetData));
+                       RNDISInterfaceInfo->State.CurrRNDISState   = le32_to_cpu((RNDISInterfaceInfo->State.CurrPacketFilter) ?
+                                                                                RNDIS_Data_Initialized : RNDIS_Data_Initialized);
 
                        return true;
                case OID_802_3_MULTICAST_LIST:
@@ -479,16 +478,16 @@ uint8_t RNDIS_Device_ReadPacket(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfa
        RNDIS_Packet_Message_t RNDISPacketHeader;       
        Endpoint_Read_Stream_LE(&RNDISPacketHeader, sizeof(RNDIS_Packet_Message_t), NULL);
 
-       if (RNDISPacketHeader.DataLength > ETHERNET_FRAME_SIZE_MAX)
+       if (le32_to_cpu(RNDISPacketHeader.DataLength) > ETHERNET_FRAME_SIZE_MAX)
        {
                Endpoint_StallTransaction();
 
                return RNDIS_ERROR_LOGICAL_CMD_FAILED;
        }
        
-       *PacketLength = (uint16_t)RNDISPacketHeader.DataLength;
+       *PacketLength = (uint16_t)le32_to_cpu(RNDISPacketHeader.DataLength);
 
-       Endpoint_Read_Stream_LE(Buffer, RNDISPacketHeader.DataLength, NULL);
+       Endpoint_Read_Stream_LE(Buffer, *PacketLength, NULL);
        Endpoint_ClearOUT();
        
        return ENDPOINT_RWSTREAM_NoError;
@@ -515,10 +514,10 @@ uint8_t RNDIS_Device_SendPacket(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfa
 
        memset(&RNDISPacketHeader, 0, sizeof(RNDIS_Packet_Message_t));
 
-       RNDISPacketHeader.MessageType   = REMOTE_NDIS_PACKET_MSG;
-       RNDISPacketHeader.MessageLength = (sizeof(RNDIS_Packet_Message_t) + PacketLength);
-       RNDISPacketHeader.DataOffset    = (sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t));
-       RNDISPacketHeader.DataLength    = PacketLength;
+       RNDISPacketHeader.MessageType   = CPU_TO_LE32(REMOTE_NDIS_PACKET_MSG);
+       RNDISPacketHeader.MessageLength = cpu_to_le32(sizeof(RNDIS_Packet_Message_t) + PacketLength);
+       RNDISPacketHeader.DataOffset    = CPU_TO_LE32(sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t));
+       RNDISPacketHeader.DataLength    = cpu_to_le32(PacketLength);
 
        Endpoint_Write_Stream_LE(&RNDISPacketHeader, sizeof(RNDIS_Packet_Message_t), NULL);
        Endpoint_Write_Stream_LE(Buffer, PacketLength, NULL);
index 864a1c4..e3d9255 100644 (file)
                         *  uses LUFA-specific element names to make each element's purpose clearer.
                         *
                         *  \see \ref USB_StdDescriptor_Header_t for the version of this type with standard element names.
+                        *
+                        *  \note Regardless of CPU architecture, these values should be stored as little endian.
                         */
                        typedef struct
                        {
                         *  uses the relevant standard's given element names to ensure compatibility with the standard.
                         *
                         *  \see \ref USB_Descriptor_Header_t for the version of this type with non-standard LUFA specific element names.
+                        *
+                        *  \note Regardless of CPU architecture, these values should be stored as little endian.
                         */
                        typedef struct
                        {
                         *  element's purpose clearer.
                         *
                         *  \see \ref USB_StdDescriptor_Device_t for the version of this type with standard element names.
+                        *
+                        *  \note Regardless of CPU architecture, these values should be stored as little endian.
                         */
                        typedef struct
                        {
                         *  to ensure compatibility with the standard.
                         *
                         *  \see \ref USB_Descriptor_Device_t for the version of this type with non-standard LUFA specific element names.
+                        *
+                        *  \note Regardless of CPU architecture, these values should be stored as little endian.
                         */
                        typedef struct
                        {
                         *  to make each element's purpose clearer.
                         *
                         *  \see \ref USB_StdDescriptor_Configuration_Header_t for the version of this type with standard element names.
+                        *
+                        *  \note Regardless of CPU architecture, these values should be stored as little endian.
                         */
                        typedef struct
                        {
                         *  to ensure compatibility with the standard.
                         *
                         *  \see \ref USB_Descriptor_Device_t for the version of this type with non-standard LUFA specific element names.
+                        *
+                        *  \note Regardless of CPU architecture, these values should be stored as little endian.
                         */
                        typedef struct
                        {
                         *  to make each element's purpose clearer.
                         *
                         *  \see \ref USB_StdDescriptor_Interface_t for the version of this type with standard element names.
+                        *
+                        *  \note Regardless of CPU architecture, these values should be stored as little endian.
                         */
                        typedef struct
                        {
                         *  to ensure compatibility with the standard.
                         *
                         *  \see \ref USB_Descriptor_Interface_t for the version of this type with non-standard LUFA specific element names.
+                        *
+                        *  \note Regardless of CPU architecture, these values should be stored as little endian.
                         */
                        typedef struct
                        {
                         *  function. Read the ECN for more information.
                         *
                         *  \see \ref USB_StdDescriptor_Interface_Association_t for the version of this type with standard element names.
+                        *
+                        *  \note Regardless of CPU architecture, these values should be stored as little endian.
                         */
                        typedef struct
                        {
                         *
                         *  \see \ref USB_Descriptor_Interface_Association_t for the version of this type with non-standard LUFA specific
                         *       element names.
+                        *
+                        *  \note Regardless of CPU architecture, these values should be stored as little endian.
                         */
                        typedef struct
                        {
                         *  to make each element's purpose clearer.
                         *
                         *  \see \ref USB_StdDescriptor_Endpoint_t for the version of this type with standard element names.
+                        *
+                        *  \note Regardless of CPU architecture, these values should be stored as little endian.
                         */
                        typedef struct
                        {
                         *
                         *  \see \ref USB_Descriptor_Endpoint_t for the version of this type with non-standard LUFA specific
                         *       element names.
+                        *
+                        *  \note Regardless of CPU architecture, these values should be stored as little endian.
                         */
                        typedef struct
                        {
                         *  This structure uses LUFA-specific element names to make each element's purpose clearer.
                         *
                         *  \see \ref USB_StdDescriptor_String_t for the version of this type with standard element names.
+                        *
+                        *  \note Regardless of CPU architecture, these values should be stored as little endian.
                         */
                        typedef struct
                        {
                         *
                         *  \see \ref USB_Descriptor_String_t for the version of this type with with non-standard LUFA specific
                         *       element names.
+                        *
+                        *  \note Regardless of CPU architecture, these values should be stored as little endian.
                         */
                        typedef struct
                        {
index 586ce6e..6084268 100644 (file)
@@ -84,6 +84,8 @@
                         *  inside of the \ref EVENT_USB_Device_ControlRequest() event, or for filling up with a control request to 
                         *  issue when in Host mode before calling \ref USB_Host_SendControlRequest().
                         *
+                        *  \note The contents of this structure is automatically endian-corrected for the current CPU architecture.
+                        *
                         *  \ingroup Group_USBManagement
                         */
                         extern USB_Request_Header_t USB_ControlRequest;