More fixes to the AVRISP command timeout system so that it should no longer lock...
[pub/USBasp.git] / LUFA / Drivers / USB / LowLevel / Pipe.h
index beee2eb..3e25d49 100644 (file)
@@ -1,21 +1,21 @@
 /*\r
              LUFA Library\r
 /*\r
              LUFA Library\r
-     Copyright (C) Dean Camera, 2009.\r
+     Copyright (C) Dean Camera, 2010.\r
               \r
   dean [at] fourwalledcubicle [dot] com\r
       www.fourwalledcubicle.com\r
 */\r
 \r
 /*\r
               \r
   dean [at] fourwalledcubicle [dot] com\r
       www.fourwalledcubicle.com\r
 */\r
 \r
 /*\r
-  Copyright 2009  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
-  Permission to use, copy, modify, and distribute this software\r
-  and its documentation for any purpose and without fee is hereby\r
-  granted, provided that the above copyright notice appear in all\r
-  copies and that both that the copyright notice and this\r
-  permission notice and warranty disclaimer appear in supporting\r
-  documentation, and that the name of the author not be used in\r
-  advertising or publicity pertaining to distribution of the\r
+  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this \r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in \r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting \r
+  documentation, and that the name of the author not be used in \r
+  advertising or publicity pertaining to distribution of the \r
   software without specific, written prior permission.\r
 \r
   The author disclaim all warranties with regard to this\r
   software without specific, written prior permission.\r
 \r
   The author disclaim all warranties with regard to this\r
@@ -32,7 +32,7 @@
  *  @defgroup Group_PipeManagement Pipe Management\r
  *\r
  *  This module contains functions, macros and enums related to pipe management when in USB Host mode. This\r
  *  @defgroup Group_PipeManagement Pipe Management\r
  *\r
  *  This module contains functions, macros and enums related to pipe management when in USB Host mode. This\r
- *  module contains the pipe management macros, as well as pipe interrupt and data send/recieve functions\r
+ *  module contains the pipe management macros, as well as pipe interrupt and data send/receive functions\r
  *  for various data types.\r
  *\r
  *  @{\r
  *  for various data types.\r
  *\r
  *  @{\r
                        extern "C" {\r
                #endif\r
 \r
                        extern "C" {\r
                #endif\r
 \r
+       /* Preprocessor Checks: */\r
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)\r
+                       #error Do not include this file directly. Include LUFA/Drivers/USB.h instead.\r
+               #endif\r
+               \r
        /* Public Interface - May be used in end-application: */\r
                /* Macros: */\r
                        /** Mask for \ref Pipe_GetErrorFlags(), indicating that an overflow error occurred in the pipe on the received data. */\r
        /* Public Interface - May be used in end-application: */\r
                /* Macros: */\r
                        /** Mask for \ref Pipe_GetErrorFlags(), indicating that an overflow error occurred in the pipe on the received data. */\r
                         */\r
                        #define PIPE_TOKEN_IN                   (1 << PTOKEN0)\r
 \r
                         */\r
                        #define PIPE_TOKEN_IN                   (1 << PTOKEN0)\r
 \r
-                       /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a IN token (for non-CONTROL type pipes),\r
+                       /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a OUT token (for non-CONTROL type pipes),\r
                         *  indicating that the pipe data will flow from host to device.\r
                         */\r
                        #define PIPE_TOKEN_OUT                  (2 << PTOKEN0)\r
                         *  indicating that the pipe data will flow from host to device.\r
                         */\r
                        #define PIPE_TOKEN_OUT                  (2 << PTOKEN0)\r
                         */\r
                        #define PIPE_EPNUM_MASK                 0x0F\r
 \r
                         */\r
                        #define PIPE_EPNUM_MASK                 0x0F\r
 \r
+                       /** Endpoint direction mask, for masking against endpoint addresses to retrieve the endpoint's\r
+                        *  direction for comparing with the ENDPOINT_DESCRIPTOR_DIR_* masks.\r
+                        */\r
+                       #define PIPE_EPDIR_MASK                 0x80\r
+\r
                /* Pseudo-Function Macros: */\r
                        #if defined(__DOXYGEN__)\r
                                /** Indicates the number of bytes currently stored in the current pipes's selected bank.\r
                /* Pseudo-Function Macros: */\r
                        #if defined(__DOXYGEN__)\r
                                /** Indicates the number of bytes currently stored in the current pipes's selected bank.\r
                                /** Freezes the selected pipe, preventing it from communicating with an attached device. */\r
                                static inline void Pipe_Freeze(void);\r
 \r
                                /** Freezes the selected pipe, preventing it from communicating with an attached device. */\r
                                static inline void Pipe_Freeze(void);\r
 \r
+                               /** Determines if the currently selected pipe is frozen, and not able to accept data.\r
+                                *\r
+                                *  \return Boolean true if the currently selected pipe is frozen, false otherwise\r
+                                */\r
+                               static inline bool Pipe_IsFrozen(void);\r
+                               \r
                                /** Clears the master pipe error flag. */\r
                                static inline void Pipe_ClearError(void);\r
                                \r
                                /** Clears the master pipe error flag. */\r
                                static inline void Pipe_ClearError(void);\r
                                \r
 \r
                                #define Pipe_GetCurrentPipe()          (UPNUM & PIPE_PIPENUM_MASK)\r
 \r
 \r
                                #define Pipe_GetCurrentPipe()          (UPNUM & PIPE_PIPENUM_MASK)\r
 \r
-                               #define Pipe_SelectPipe(pipenum)       MACROS{ UPNUM = pipenum; }MACROE\r
+                               #define Pipe_SelectPipe(pipenum)       MACROS{ UPNUM = (pipenum); }MACROE\r
                                \r
                                \r
-                               #define Pipe_ResetPipe(pipenum)        MACROS{ UPRST = (1 << pipenum); UPRST = 0; }MACROE\r
+                               #define Pipe_ResetPipe(pipenum)        MACROS{ UPRST = (1 << (pipenum)); UPRST = 0; }MACROE\r
 \r
                                #define Pipe_EnablePipe()              MACROS{ UPCONX |= (1 << PEN); }MACROE\r
 \r
 \r
                                #define Pipe_EnablePipe()              MACROS{ UPCONX |= (1 << PEN); }MACROE\r
 \r
 \r
                                #define Pipe_GetPipeToken()            (UPCFG0X & PIPE_TOKEN_MASK)\r
 \r
 \r
                                #define Pipe_GetPipeToken()            (UPCFG0X & PIPE_TOKEN_MASK)\r
 \r
-                               #define Pipe_SetToken(token)           MACROS{ UPCFG0X = ((UPCFG0X & ~PIPE_TOKEN_MASK) | token); }MACROE\r
+                               #define Pipe_SetPipeToken(token)       MACROS{ UPCFG0X = ((UPCFG0X & ~PIPE_TOKEN_MASK) | (token)); }MACROE\r
                                \r
                                #define Pipe_SetInfiniteINRequests()   MACROS{ UPCONX |= (1 << INMODE); }MACROE\r
 \r
                                \r
                                #define Pipe_SetInfiniteINRequests()   MACROS{ UPCONX |= (1 << INMODE); }MACROE\r
 \r
-                               #define Pipe_SetFiniteINRequests(n)    MACROS{ UPCONX &= ~(1 << INMODE); UPINRQX = n; }MACROE\r
+                               #define Pipe_SetFiniteINRequests(n)    MACROS{ UPCONX &= ~(1 << INMODE); UPINRQX = (n); }MACROE\r
 \r
                                #define Pipe_IsConfigured()            ((UPSTAX  & (1 << CFGOK)) ? true : false)\r
 \r
                                #define Pipe_BoundEndpointNumber()     ((UPCFG0X >> PEPNUM0) & PIPE_EPNUM_MASK)\r
                                \r
 \r
                                #define Pipe_IsConfigured()            ((UPSTAX  & (1 << CFGOK)) ? true : false)\r
 \r
                                #define Pipe_BoundEndpointNumber()     ((UPCFG0X >> PEPNUM0) & PIPE_EPNUM_MASK)\r
                                \r
-                               #define Pipe_SetInterruptPeriod(ms)    MACROS{ UPCFG2X = ms; }MACROE\r
+                               #define Pipe_SetInterruptPeriod(ms)    MACROS{ UPCFG2X = (ms); }MACROE\r
 \r
                                #define Pipe_GetPipeInterrupts()       UPINT\r
 \r
 \r
                                #define Pipe_GetPipeInterrupts()       UPINT\r
 \r
-                               #define Pipe_HasPipeInterrupted(n)     ((UPINT & (1 << n)) ? true : false)\r
+                               #define Pipe_HasPipeInterrupted(n)     ((UPINT & (1 << (n))) ? true : false)\r
 \r
                                #define Pipe_Unfreeze()                MACROS{ UPCONX &= ~(1 << PFREEZE); }MACROE\r
 \r
                                #define Pipe_Freeze()                  MACROS{ UPCONX |= (1 << PFREEZE); }MACROE\r
 \r
                                #define Pipe_Unfreeze()                MACROS{ UPCONX &= ~(1 << PFREEZE); }MACROE\r
 \r
                                #define Pipe_Freeze()                  MACROS{ UPCONX |= (1 << PFREEZE); }MACROE\r
+                               \r
+                               #define Pipe_IsFrozen()                ((UPCONX & (1 << PFREEZE)) ? true : false)\r
 \r
                                #define Pipe_ClearError()              MACROS{ UPINTX &= ~(1 << PERRI); }MACROE\r
 \r
 \r
                                #define Pipe_ClearError()              MACROS{ UPINTX &= ~(1 << PERRI); }MACROE\r
 \r
                        static inline void Pipe_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE;\r
                        static inline void Pipe_Write_DWord_LE(const uint32_t DWord)\r
                        {\r
                        static inline void Pipe_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE;\r
                        static inline void Pipe_Write_DWord_LE(const uint32_t DWord)\r
                        {\r
-                               Pipe_Write_Word_LE(DWord);\r
-                               Pipe_Write_Word_LE(DWord >> 16);\r
+                               UPDATX = (DWord &  0xFF);\r
+                               UPDATX = (DWord >> 8);\r
+                               UPDATX = (DWord >> 16);\r
+                               UPDATX = (DWord >> 24);\r
                        }\r
                        \r
                        /** Writes four bytes to the currently selected pipe's bank in big endian format, for IN\r
                        }\r
                        \r
                        /** Writes four bytes to the currently selected pipe's bank in big endian format, for IN\r
                        static inline void Pipe_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE;\r
                        static inline void Pipe_Write_DWord_BE(const uint32_t DWord)\r
                        {\r
                        static inline void Pipe_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE;\r
                        static inline void Pipe_Write_DWord_BE(const uint32_t DWord)\r
                        {\r
-                               Pipe_Write_Word_BE(DWord >> 16);\r
-                               Pipe_Write_Word_BE(DWord);\r
+                               UPDATX = (DWord >> 24);\r
+                               UPDATX = (DWord >> 16);\r
+                               UPDATX = (DWord >> 8);\r
+                               UPDATX = (DWord &  0xFF);\r
                        }                       \r
                        \r
                        /** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes.       \r
                        }                       \r
                        \r
                        /** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes.       \r
 \r
                /* Function Prototypes: */\r
                        #if !defined(NO_STREAM_CALLBACKS) || defined(__DOXYGEN__)\r
 \r
                /* Function Prototypes: */\r
                        #if !defined(NO_STREAM_CALLBACKS) || defined(__DOXYGEN__)\r
-                               #define _CALLBACK_PARAM     , StreamCallbackPtr_t Callback\r
+                               #define __CALLBACK_PARAM     , StreamCallbackPtr_t Callback\r
                        #else\r
                        #else\r
-                               #define _CALLBACK_PARAM                 \r
+                               #define __CALLBACK_PARAM                        \r
                        #endif\r
 \r
                        /** Configures the specified pipe number with the given pipe type, token, target endpoint number in the\r
                        #endif\r
 \r
                        /** Configures the specified pipe number with the given pipe type, token, target endpoint number in the\r
                        bool Pipe_ConfigurePipe(const uint8_t  Number, const uint8_t Type, const uint8_t Token, const uint8_t EndpointNumber,\r
                                                const uint16_t Size, const uint8_t Banks);\r
 \r
                        bool Pipe_ConfigurePipe(const uint8_t  Number, const uint8_t Type, const uint8_t Token, const uint8_t EndpointNumber,\r
                                                const uint16_t Size, const uint8_t Banks);\r
 \r
-                       /** Spinloops until the currently selected non-control pipe is ready for the next packed of data to be read \r
+                       /** Spin-loops until the currently selected non-control pipe is ready for the next packed of data to be read \r
                         *  or written to it, aborting in the case of an error condition (such as a timeout or device disconnect).\r
                         *\r
                         *  \ingroup Group_PipeRW\r
                         *  or written to it, aborting in the case of an error condition (such as a timeout or device disconnect).\r
                         *\r
                         *  \ingroup Group_PipeRW\r
                        /** Determines if a pipe has been bound to the given device endpoint address. If a pipe which is bound to the given\r
                         *  endpoint is found, it is automatically selected.\r
                         *\r
                        /** Determines if a pipe has been bound to the given device endpoint address. If a pipe which is bound to the given\r
                         *  endpoint is found, it is automatically selected.\r
                         *\r
-                        *  \param EndpointAddress Address of the endpoint within the attached device to check\r
+                        *  \param[in] EndpointAddress Address and direction mask of the endpoint within the attached device to check\r
                         *\r
                         *\r
-                        *  \return Boolean true if a pipe bound to the given endpoint address is found, false otherwise\r
+                        *  \return Boolean true if a pipe bound to the given endpoint address of the specified direction is found, false\r
+                        *          otherwise\r
                         */\r
                         */\r
-                       bool Pipe_IsEndpointBound(uint8_t EndpointAddress);\r
+                       bool Pipe_IsEndpointBound(const uint8_t EndpointAddress);\r
                \r
                        /** Reads and discards the given number of bytes from the pipe, discarding fully read packets from the host\r
                         *  as needed. The last packet is not automatically discarded once the remaining bytes has been read; the\r
                \r
                        /** Reads and discards the given number of bytes from the pipe, discarding fully read packets from the host\r
                         *  as needed. The last packet is not automatically discarded once the remaining bytes has been read; the\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
-                       uint8_t Pipe_Discard_Stream(uint16_t Length _CALLBACK_PARAM);\r
+                       uint8_t Pipe_Discard_Stream(uint16_t Length __CALLBACK_PARAM);\r
 \r
                        /** Writes the given number of bytes to the pipe from the given buffer in little endian,\r
                         *  sending full packets to the device as needed. The last packet filled is not automatically sent;\r
 \r
                        /** Writes the given number of bytes to the pipe from the given buffer in little endian,\r
                         *  sending full packets to the device as needed. The last packet filled is not automatically sent;\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
-                       uint8_t Pipe_Write_Stream_LE(void* Buffer, uint16_t Length _CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);                           \r
+                       uint8_t Pipe_Write_Stream_LE(const void* Buffer, uint16_t Length __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);                            \r
 \r
                        /** EEPROM buffer source version of \ref Pipe_Write_Stream_LE().\r
                         *\r
 \r
                        /** EEPROM buffer source version of \ref Pipe_Write_Stream_LE().\r
                         *\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
-                       uint8_t Pipe_Write_EStream_LE(void* Buffer, uint16_t Length _CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);\r
+                       uint8_t Pipe_Write_EStream_LE(const void* Buffer, uint16_t Length __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);\r
                        \r
                        /** FLASH buffer source version of \ref Pipe_Write_Stream_LE().\r
                         *\r
                        \r
                        /** FLASH buffer source version of \ref Pipe_Write_Stream_LE().\r
                         *\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
-                       uint8_t Pipe_Write_PStream_LE(void* Buffer, uint16_t Length _CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);\r
+                       uint8_t Pipe_Write_PStream_LE(const void* Buffer, uint16_t Length __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);\r
                                                \r
                        /** Writes the given number of bytes to the pipe from the given buffer in big endian,\r
                         *  sending full packets to the device as needed. The last packet filled is not automatically sent;\r
                                                \r
                        /** Writes the given number of bytes to the pipe from the given buffer in big endian,\r
                         *  sending full packets to the device as needed. The last packet filled is not automatically sent;\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
-                       uint8_t Pipe_Write_Stream_BE(void* Buffer, uint16_t Length _CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);\r
+                       uint8_t Pipe_Write_Stream_BE(const void* Buffer, uint16_t Length __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);\r
 \r
                        /** EEPROM buffer source version of \ref Pipe_Write_Stream_BE().\r
                         *\r
 \r
                        /** EEPROM buffer source version of \ref Pipe_Write_Stream_BE().\r
                         *\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
-                       uint8_t Pipe_Write_EStream_BE(void* Buffer, uint16_t Length _CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);\r
+                       uint8_t Pipe_Write_EStream_BE(const void* Buffer, uint16_t Length __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);\r
                        \r
                        /** FLASH buffer source version of \ref Pipe_Write_Stream_BE().\r
                         *\r
                        \r
                        /** FLASH buffer source version of \ref Pipe_Write_Stream_BE().\r
                         *\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
-                       uint8_t Pipe_Write_PStream_BE(void* Buffer, uint16_t Length _CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);\r
+                       uint8_t Pipe_Write_PStream_BE(const void* Buffer, uint16_t Length __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);\r
 \r
                        /** Reads the given number of bytes from the pipe into the given buffer in little endian,\r
                         *  sending full packets to the device as needed. The last packet filled is not automatically sent;\r
 \r
                        /** Reads the given number of bytes from the pipe into the given buffer in little endian,\r
                         *  sending full packets to the device as needed. The last packet filled is not automatically sent;\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
-                       uint8_t Pipe_Read_Stream_LE(void* Buffer, uint16_t Length _CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);\r
+                       uint8_t Pipe_Read_Stream_LE(void* Buffer, uint16_t Length __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);\r
 \r
                        /** EEPROM buffer source version of \ref Pipe_Read_Stream_LE().\r
                         *\r
 \r
                        /** EEPROM buffer source version of \ref Pipe_Read_Stream_LE().\r
                         *\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
-                       uint8_t Pipe_Read_EStream_LE(void* Buffer, uint16_t Length _CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);\r
+                       uint8_t Pipe_Read_EStream_LE(void* Buffer, uint16_t Length __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);\r
 \r
                        /** Reads the given number of bytes from the pipe into the given buffer in big endian,\r
                         *  sending full packets to the device as needed. The last packet filled is not automatically sent;\r
 \r
                        /** Reads the given number of bytes from the pipe into the given buffer in big endian,\r
                         *  sending full packets to the device as needed. The last packet filled is not automatically sent;\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
-                       uint8_t Pipe_Read_Stream_BE(void* Buffer, uint16_t Length _CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);\r
+                       uint8_t Pipe_Read_Stream_BE(void* Buffer, uint16_t Length __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);\r
                        \r
                        /** EEPROM buffer source version of \ref Pipe_Read_Stream_BE().\r
                         *\r
                        \r
                        /** EEPROM buffer source version of \ref Pipe_Read_Stream_BE().\r
                         *\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
                         *\r
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
                         */\r
-                       uint8_t Pipe_Read_EStream_BE(void* Buffer, uint16_t Length _CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);\r
+                       uint8_t Pipe_Read_EStream_BE(void* Buffer, uint16_t Length __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);\r
 \r
        /* Private Interface - For use in library only: */\r
        #if !defined(__DOXYGEN__)\r
 \r
        /* Private Interface - For use in library only: */\r
        #if !defined(__DOXYGEN__)\r
                                  return (4 << EPSIZE0);\r
                                else\r
                                  return (5 << EPSIZE0);\r
                                  return (4 << EPSIZE0);\r
                                else\r
                                  return (5 << EPSIZE0);\r
-                       };\r
+                       }\r
 \r
        #endif\r
 \r
 \r
        #endif\r
 \r