Added PRNT_Host_SendByte() and PRNT_Host_Flush() functions to the Host mode Printer...
[pub/USBasp.git] / LUFA / Drivers / USB / LowLevel / Endpoint.c
index f1ed2f9..d4f10db 100644 (file)
@@ -33,7 +33,6 @@
 
 #if defined(USB_CAN_BE_DEVICE)
 
-#define  __INCLUDE_FROM_ENDPOINT_C
 #include "Endpoint.h"
 
 #if !defined(FIXED_CONTROL_ENDPOINT_SIZE)
@@ -44,18 +43,31 @@ bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
                                     const uint8_t UECFG0XData,
                                     const uint8_t UECFG1XData)
 {
+#if defined(CONTROL_ONLY_DEVICE)
+       Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
+       Endpoint_EnableEndpoint();
+
+       UECFG1X = 0;
+       UECFG0X = UECFG0XData;
+       UECFG1X = UECFG1XData;
+
+       return Endpoint_IsConfigured();
+#else
        uint8_t UECFG0XTemp[ENDPOINT_TOTAL_ENDPOINTS];
        uint8_t UECFG1XTemp[ENDPOINT_TOTAL_ENDPOINTS];
+       uint8_t UEIENXTemp[ENDPOINT_TOTAL_ENDPOINTS];
        
        for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
        {
                Endpoint_SelectEndpoint(EPNum);
                UECFG0XTemp[EPNum] = UECFG0X;
                UECFG1XTemp[EPNum] = UECFG1X;
+               UEIENXTemp[EPNum]  = UEIENX;
        }
        
        UECFG0XTemp[Number] = UECFG0XData;
        UECFG1XTemp[Number] = UECFG1XData;
+       UEIENXTemp[Number]  = 0;
        
        for (uint8_t EPNum = 1; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
        {
@@ -76,6 +88,7 @@ bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
 
                UECFG0X = UECFG0XTemp[EPNum];
                UECFG1X = UECFG1XTemp[EPNum];
+               UEIENX  = UEIENXTemp[EPNum];
                
                if (!(Endpoint_IsConfigured()))
                  return false;
@@ -83,6 +96,7 @@ bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
        
        Endpoint_SelectEndpoint(Number);
        return true;
+#endif
 }
 
 void Endpoint_ClearEndpoints(void)
@@ -132,6 +146,8 @@ uint8_t Endpoint_WaitUntilReady(void)
        uint16_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
        #endif
 
+       uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber();
+
        for (;;)
        {
                if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN)
@@ -151,215 +167,18 @@ uint8_t Endpoint_WaitUntilReady(void)
                  return ENDPOINT_READYWAIT_BusSuspended;
                else if (Endpoint_IsStalled())
                  return ENDPOINT_READYWAIT_EndpointStalled;
-                         
-               if (USB_INT_HasOccurred(USB_INT_SOFI))
-               {
-                       USB_INT_Clear(USB_INT_SOFI);
-
-                       if (!(TimeoutMSRem--))
-                         return ENDPOINT_READYWAIT_Timeout;
-               }
-       }
-}
-
-uint8_t Endpoint_Discard_Stream(uint16_t Length
-#if !defined(NO_STREAM_CALLBACKS)
-                                , StreamCallbackPtr_t Callback
-#endif
-                                )
-{
-       uint8_t  ErrorCode;
-       
-       if ((ErrorCode = Endpoint_WaitUntilReady()))
-         return ErrorCode;
-
-       #if defined(FAST_STREAM_TRANSFERS)
-       uint8_t BytesRemToAlignment = (Endpoint_BytesInEndpoint() & 0x07);
-
-       if (Length >= 8)
-       {
-               Length -= BytesRemToAlignment;
-
-               switch (BytesRemToAlignment)
-               {
-                       default:
-                               do
-                               {
-                                       if (!(Endpoint_IsReadWriteAllowed()))
-                                       {
-                                               Endpoint_ClearOUT();
-
-                                               #if !defined(NO_STREAM_CALLBACKS)
-                                               if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
-                                                 return ENDPOINT_RWSTREAM_CallbackAborted;
-                                               #endif
 
-                                               if ((ErrorCode = Endpoint_WaitUntilReady()))
-                                                 return ErrorCode;
-                                       }
+               uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber();
 
-                                       Length -= 8;
-                                       
-                                       Endpoint_Discard_Byte();
-                       case 7: Endpoint_Discard_Byte();
-                       case 6: Endpoint_Discard_Byte();
-                       case 5: Endpoint_Discard_Byte();
-                       case 4: Endpoint_Discard_Byte();
-                       case 3: Endpoint_Discard_Byte();
-                       case 2: Endpoint_Discard_Byte();
-                       case 1: Endpoint_Discard_Byte();
-                               } while (Length >= 8);  
-               }
-       }
-       #endif
-
-       while (Length)
-       {
-               if (!(Endpoint_IsReadWriteAllowed()))
+               if (CurrentFrameNumber != PreviousFrameNumber)
                {
-                       Endpoint_ClearOUT();
-
-                       #if !defined(NO_STREAM_CALLBACKS)
-                       if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
-                         return ENDPOINT_RWSTREAM_CallbackAborted;
-                       #endif
+                       PreviousFrameNumber = CurrentFrameNumber;
 
-                       if ((ErrorCode = Endpoint_WaitUntilReady()))
-                         return ErrorCode;
-               }
-               else
-               {
-                       Endpoint_Discard_Byte();
-                       Length--;
+                       if (!(TimeoutMSRem--))
+                         return ENDPOINT_READYWAIT_Timeout;
                }
        }
-       
-       return ENDPOINT_RWSTREAM_NoError;
 }
-
-/* The following abuses the C preprocessor in order to copy-past common code with slight alterations,
- * so that the code needs to be written once. It is a crude form of templating to reduce code maintenance. */
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_LE
-#define  TEMPLATE_BUFFER_TYPE                      const void*
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*((uint8_t*)BufferPtr++))
-#include "Template/Template_Endpoint_RW.c"
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_LE
-#define  TEMPLATE_BUFFER_TYPE                      const void*
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte((uint8_t*)BufferPtr++))
-#include "Template/Template_Endpoint_RW.c"
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_LE
-#define  TEMPLATE_BUFFER_TYPE                      const void*
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte((uint8_t*)BufferPtr++))
-#include "Template/Template_Endpoint_RW.c"
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_BE
-#define  TEMPLATE_BUFFER_TYPE                      const void*
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*((uint8_t*)BufferPtr--))
-#include "Template/Template_Endpoint_RW.c"
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_BE
-#define  TEMPLATE_BUFFER_TYPE                      const void*
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte((uint8_t*)BufferPtr--))
-#include "Template/Template_Endpoint_RW.c"
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_BE
-#define  TEMPLATE_BUFFER_TYPE                      const void*
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte((uint8_t*)BufferPtr--))
-#include "Template/Template_Endpoint_RW.c"
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_LE
-#define  TEMPLATE_BUFFER_TYPE                      void*
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *((uint8_t*)BufferPtr++) = Endpoint_Read_Byte()
-#include "Template/Template_Endpoint_RW.c"
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_LE
-#define  TEMPLATE_BUFFER_TYPE                      void*
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte((uint8_t*)BufferPtr++, Endpoint_Read_Byte())
-#include "Template/Template_Endpoint_RW.c"
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_BE
-#define  TEMPLATE_BUFFER_TYPE                      void*
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *((uint8_t*)BufferPtr--) = Endpoint_Read_Byte()
-#include "Template/Template_Endpoint_RW.c"
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_BE
-#define  TEMPLATE_BUFFER_TYPE                      void*
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte((uint8_t*)BufferPtr--, Endpoint_Read_Byte())
-#include "Template/Template_Endpoint_RW.c"
-
 #endif
 
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_LE
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*((uint8_t*)BufferPtr++))
-#include "Template/Template_Endpoint_Control_W.c"
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_LE
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte((uint8_t*)BufferPtr++))
-#include "Template/Template_Endpoint_Control_W.c"
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_LE
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte((uint8_t*)BufferPtr++))
-#include "Template/Template_Endpoint_Control_W.c"
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_BE
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*((uint8_t*)BufferPtr--))
-#include "Template/Template_Endpoint_Control_W.c"
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_BE
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte((uint8_t*)BufferPtr--))
-#include "Template/Template_Endpoint_Control_W.c"
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_BE
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte((uint8_t*)BufferPtr--))
-#include "Template/Template_Endpoint_Control_W.c"
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_LE
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *((uint8_t*)BufferPtr++) = Endpoint_Read_Byte()
-#include "Template/Template_Endpoint_Control_R.c"
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_LE
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte((uint8_t*)BufferPtr++, Endpoint_Read_Byte())
-#include "Template/Template_Endpoint_Control_R.c"
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_BE
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *((uint8_t*)BufferPtr--) = Endpoint_Read_Byte()
-#include "Template/Template_Endpoint_Control_R.c"
-
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_BE
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte((uint8_t*)BufferPtr--, Endpoint_Read_Byte())
-#include "Template/Template_Endpoint_Control_R.c"
-
 #endif