/*
              LUFA Library
-     Copyright (C) Dean Camera, 2011.
+     Copyright (C) Dean Camera, 2012.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2012  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
        struct
        {
                uint8_t Protocol;
-       } ATTR_PACKED SetMode_XPROG_Params;
+       } SetMode_XPROG_Params;
 
        Endpoint_Read_Stream_LE(&SetMode_XPROG_Params, sizeof(SetMode_XPROG_Params), NULL);
 
        Endpoint_ClearOUT();
-       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
+       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPADDR);
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 
        XPROG_SelectedProtocol = SetMode_XPROG_Params.Protocol;
 static void XPROGProtocol_EnterXPROGMode(void)
 {
        Endpoint_ClearOUT();
-       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
+       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPADDR);
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 
        bool NVMBusEnabled = false;
 static void XPROGProtocol_LeaveXPROGMode(void)
 {
        Endpoint_ClearOUT();
-       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
+       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPADDR);
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 
        if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)
          TINYNVM_DisableTPI();
 
        #if defined(XCK_RESCUE_CLOCK_ENABLE) && defined(ENABLE_ISP_PROTOCOL)
-       /* If the XCK rescue clock option is enabled, we need to restart it once the 
+       /* If the XCK rescue clock option is enabled, we need to restart it once the
         * XPROG mode has been exited, since the XPROG protocol stops it after use. */
        ISPTarget_ConfigureRescueClock();
        #endif
        {
                uint8_t  MemoryType;
                uint32_t Address;
-       } ATTR_PACKED Erase_XPROG_Params;
+       } Erase_XPROG_Params;
 
        Endpoint_Read_Stream_LE(&Erase_XPROG_Params, sizeof(Erase_XPROG_Params), NULL);
-       Erase_XPROG_Params.Address = be32_to_cpu(Erase_XPROG_Params.Address);
+       Erase_XPROG_Params.Address = SwapEndian_32(Erase_XPROG_Params.Address);
 
        Endpoint_ClearOUT();
-       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
+       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPADDR);
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 
        uint8_t EraseCommand;
                uint32_t Address;
                uint16_t Length;
                uint8_t  ProgData[256];
-       } ATTR_PACKED WriteMemory_XPROG_Params;
+       } WriteMemory_XPROG_Params;
 
        Endpoint_Read_Stream_LE(&WriteMemory_XPROG_Params, (sizeof(WriteMemory_XPROG_Params) -
                                                            sizeof(WriteMemory_XPROG_Params).ProgData), NULL);
-       WriteMemory_XPROG_Params.Address = be32_to_cpu(WriteMemory_XPROG_Params.Address);
-       WriteMemory_XPROG_Params.Length  = be16_to_cpu(WriteMemory_XPROG_Params.Length);
+       WriteMemory_XPROG_Params.Address = SwapEndian_32(WriteMemory_XPROG_Params.Address);
+       WriteMemory_XPROG_Params.Length  = SwapEndian_16(WriteMemory_XPROG_Params.Length);
        Endpoint_Read_Stream_LE(&WriteMemory_XPROG_Params.ProgData, WriteMemory_XPROG_Params.Length, NULL);
 
        // The driver will terminate transfers that are a round multiple of the endpoint bank in size with a ZLP, need
                Endpoint_ClearOUT();
                Endpoint_WaitUntilReady();
        }
-       
+
        Endpoint_ClearOUT();
-       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
+       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPADDR);
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 
        if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)
                uint8_t  MemoryType;
                uint32_t Address;
                uint16_t Length;
-       } ATTR_PACKED ReadMemory_XPROG_Params;
+       } ReadMemory_XPROG_Params;
 
        Endpoint_Read_Stream_LE(&ReadMemory_XPROG_Params, sizeof(ReadMemory_XPROG_Params), NULL);
-       ReadMemory_XPROG_Params.Address = be32_to_cpu(ReadMemory_XPROG_Params.Address);
-       ReadMemory_XPROG_Params.Length  = be16_to_cpu(ReadMemory_XPROG_Params.Length);
+       ReadMemory_XPROG_Params.Address = SwapEndian_32(ReadMemory_XPROG_Params.Address);
+       ReadMemory_XPROG_Params.Length  = SwapEndian_16(ReadMemory_XPROG_Params.Length);
 
        Endpoint_ClearOUT();
-       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
+       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPADDR);
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 
        uint8_t ReadBuffer[256];
        struct
        {
                uint8_t CRCType;
-       } ATTR_PACKED ReadCRC_XPROG_Params;
+       } ReadCRC_XPROG_Params;
 
        Endpoint_Read_Stream_LE(&ReadCRC_XPROG_Params, sizeof(ReadCRC_XPROG_Params), NULL);
 
        Endpoint_ClearOUT();
-       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
+       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPADDR);
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 
        uint32_t MemoryCRC;
        switch (XPROGParam)
        {
                case XPRG_PARAM_NVMBASE:
-                       XPROG_Param_NVMBase = Endpoint_Read_32_BE();
+                       XPROG_Param_NVMBase       = Endpoint_Read_32_BE();
                        break;
                case XPRG_PARAM_EEPPAGESIZE:
-                       XPROG_Param_EEPageSize = Endpoint_Read_16_BE();
+                       XPROG_Param_EEPageSize    = Endpoint_Read_16_BE();
                        break;
                case XPRG_PARAM_NVMCMD_REG:
                        XPROG_Param_NVMCMDRegAddr = Endpoint_Read_8();
                case XPRG_PARAM_NVMCSR_REG:
                        XPROG_Param_NVMCSRRegAddr = Endpoint_Read_8();
                        break;
+               case XPRG_PARAM_UNKNOWN_1:
+                       /* TODO: Undocumented parameter added in AVRStudio 5.1, purpose unknown. Must ACK and discard or
+                                the communication with AVRStudio 5.1 will fail.
+                       */
+                       Endpoint_Discard_16();
+                       break;
                default:
                        ReturnStatus = XPRG_ERR_FAILED;
                        break;
        }
 
        Endpoint_ClearOUT();
-       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
+       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPADDR);
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 
        Endpoint_Write_8(CMD_XPROG);