X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/a8871c7fba73307226bd13e2cad4c840c850e6f1..0019fbd1294ccc9ecb0ac4ddb5d8c71efcf9597f:/LUFA/Drivers/USB/LowLevel/Pipe.h diff --git a/LUFA/Drivers/USB/LowLevel/Pipe.h b/LUFA/Drivers/USB/LowLevel/Pipe.h index 58a5c9464..75cdf7a7d 100644 --- a/LUFA/Drivers/USB/LowLevel/Pipe.h +++ b/LUFA/Drivers/USB/LowLevel/Pipe.h @@ -1,21 +1,21 @@ /* LUFA Library - Copyright (C) Dean Camera, 2010. - + Copyright (C) Dean Camera, 2011. + dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com + www.lufa-lib.org */ /* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -27,7 +27,7 @@ arising out of or in connection with the use or performance of this software. */ - + /** \file * \brief USB host pipe management definitions. * @@ -36,27 +36,27 @@ * * \note This file should not be included directly. It is automatically included as needed by the USB driver * dispatch header located in LUFA/Drivers/USB/USB.h. - */ + */ /** \ingroup Group_PipeManagement * @defgroup Group_PipeRW Pipe Data Reading and Writing * * Functions, macros, variables, enums and types related to data reading and writing from and to pipes. */ - -/** \ingroup Group_PipeRW + +/** \ingroup Group_PipeRW * @defgroup Group_PipePrimitiveRW Read/Write of Primitive Data Types * * Functions, macros, variables, enums and types related to data reading and writing of primitive data types * from and to pipes. */ - + /** \ingroup Group_PipeManagement * @defgroup Group_PipePacketManagement Pipe Packet Management * * Functions, macros, variables, enums and types related to packet management of pipes. */ - + /** \ingroup Group_PipeManagement * @defgroup Group_PipeControlReq Pipe Control Request Management * @@ -64,7 +64,7 @@ * vendor control requests to the default control endpoint of an attached device while in host mode. * * \see Chapter 9 of the USB 2.0 specification. - */ + */ /** \ingroup Group_USB * @defgroup Group_PipeManagement Pipe Management @@ -85,7 +85,7 @@ #include "../../../Common/Common.h" #include "../HighLevel/USBTask.h" - + /* Enable C linkage for C++ Compilers: */ #if defined(__cplusplus) extern "C" { @@ -95,9 +95,11 @@ #if !defined(__INCLUDE_FROM_USB_DRIVER) #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead. #endif - + /* Public Interface - May be used in end-application: */ /* Macros: */ + /** \name Pipe Error Flag Masks */ + //@{ /** Mask for \ref Pipe_GetErrorFlags(), indicating that an overflow error occurred in the pipe on the received data. */ #define PIPE_ERRORFLAG_OVERFLOW (1 << 6) @@ -118,7 +120,10 @@ /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware data toggle error occurred in the pipe. */ #define PIPE_ERRORFLAG_DATATGL (1 << 0) + //@} + /** \name Pipe Token Masks */ + //@{ /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a SETUP token (for CONTROL type pipes), * which will trigger a control request on the attached device when data is written to the pipe. */ @@ -133,7 +138,10 @@ * indicating that the pipe data will flow from host to device. */ #define PIPE_TOKEN_OUT (2 << PTOKEN0) - + //@} + + /** \name Pipe Bank Mode Masks */ + //@{ /** Mask for the bank mode selection for the \ref Pipe_ConfigurePipe() macro. This indicates that the pipe * should have one single bank, which requires less USB FIFO memory but results in slower transfers as * only one USB device (the AVR or the attached device) can access the pipe's bank at the one time. @@ -146,17 +154,18 @@ * bank. */ #define PIPE_BANK_DOUBLE (1 << EPBK0) + //@} /** Pipe address for the default control pipe, which always resides in address 0. This is * defined for convenience to give more readable code when used with the pipe macros. */ #define PIPE_CONTROLPIPE 0 - /** Default size of the default control pipe's bank, until altered by the Endpoint0Size value + /** Default size of the default control pipe's bank, until altered by the Endpoint0Size value * in the device descriptor of the attached device. */ #define PIPE_CONTROLPIPE_DEFAULT_SIZE 64 - + /** Pipe number mask, for masking against pipe addresses to retrieve the pipe's numerical address * in the device. */ @@ -181,19 +190,19 @@ #define PIPE_EPNUM_MASK 0x0F /** Endpoint direction mask, for masking against endpoint addresses to retrieve the endpoint's - * direction for comparing with the ENDPOINT_DESCRIPTOR_DIR_* masks. + * direction for comparing with the \c ENDPOINT_DESCRIPTOR_DIR_* masks. */ #define PIPE_EPDIR_MASK 0x80 /* Enums: */ - /** Enum for the possible error return codes of the Pipe_WaitUntilReady function. + /** Enum for the possible error return codes of the \ref Pipe_WaitUntilReady() function. * * \ingroup Group_PipeRW */ enum Pipe_WaitUntilReady_ErrorCodes_t { PIPE_READYWAIT_NoError = 0, /**< Pipe ready for next packet, no error. */ - PIPE_READYWAIT_PipeStalled = 1, /**< The device stalled the pipe while waiting. */ + PIPE_READYWAIT_PipeStalled = 1, /**< The device stalled the pipe while waiting. */ PIPE_READYWAIT_DeviceDisconnected = 2, /**< Device was disconnected from the host while waiting. */ PIPE_READYWAIT_Timeout = 3, /**< The device failed to accept or send the next packet * within the software timeout period set by the @@ -209,14 +218,14 @@ * * \ingroup Group_PipeRW * - * \return Total number of bytes in the currently selected Pipe's FIFO buffer. + * \return Total number of bytes in the currently selected pipe's FIFO buffer. */ static inline uint16_t Pipe_BytesInPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint16_t Pipe_BytesInPipe(void) { return UPBCX; } - + /** Returns the pipe address of the currently selected pipe. This is typically used to save the * currently selected pipe number so that it can be restored after another pipe has been manipulated. * @@ -238,7 +247,7 @@ { UPNUM = PipeNumber; } - + /** Resets the desired pipe, including the pipe banks and flags. * * \param[in] PipeNumber Index of the pipe to reset. @@ -249,7 +258,7 @@ UPRST = (1 << PipeNumber); UPRST = 0; } - + /** Enables the currently selected pipe so that data can be sent and received through it to and from * an attached device. * @@ -272,44 +281,44 @@ /** Determines if the currently selected pipe is enabled, but not necessarily configured. * - * \return Boolean True if the currently selected pipe is enabled, false otherwise. + * \return Boolean \c true if the currently selected pipe is enabled, \c false otherwise. */ static inline bool Pipe_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsEnabled(void) { return ((UPCONX & (1 << PEN)) ? true : false); } - + /** Gets the current pipe token, indicating the pipe's data direction and type. * - * \return The current pipe token, as a PIPE_TOKEN_* mask. + * \return The current pipe token, as a \c PIPE_TOKEN_* mask. */ static inline uint8_t Pipe_GetPipeToken(void) ATTR_ALWAYS_INLINE; static inline uint8_t Pipe_GetPipeToken(void) { return (UPCFG0X & (0x03 << PTOKEN0)); } - - /** Sets the token for the currently selected pipe to one of the tokens specified by the PIPE_TOKEN_* + + /** Sets the token for the currently selected pipe to one of the tokens specified by the \c PIPE_TOKEN_* * masks. This can be used on CONTROL type pipes, to allow for bidirectional transfer of data during * control requests, or on regular pipes to allow for half-duplex bidirectional data transfer to devices * which have two endpoints of opposite direction sharing the same endpoint address within the device. * - * \param[in] Token New pipe token to set the selected pipe to, as a PIPE_TOKEN_* mask. + * \param[in] Token New pipe token to set the selected pipe to, as a \c PIPE_TOKEN_* mask. */ static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_ALWAYS_INLINE; static inline void Pipe_SetPipeToken(const uint8_t Token) { UPCFG0X = ((UPCFG0X & ~(0x03 << PTOKEN0)) | Token); } - + /** Configures the currently selected pipe to allow for an unlimited number of IN requests. */ static inline void Pipe_SetInfiniteINRequests(void) ATTR_ALWAYS_INLINE; static inline void Pipe_SetInfiniteINRequests(void) { UPCONX |= (1 << INMODE); } - + /** Configures the currently selected pipe to only allow the specified number of IN requests to be * accepted by the pipe before it is automatically frozen. * @@ -324,14 +333,14 @@ /** Determines if the currently selected pipe is configured. * - * \return Boolean true if the selected pipe is configured, false otherwise. + * \return Boolean \c true if the selected pipe is configured, \c false otherwise. */ static inline bool Pipe_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsConfigured(void) { return ((UPSTAX & (1 << CFGOK)) ? true : false); } - + /** Retrieves the endpoint number of the endpoint within the attached device that the currently selected * pipe is bound to. * @@ -352,7 +361,7 @@ { UPCFG2X = Milliseconds; } - + /** Returns a mask indicating which pipe's interrupt periods have elapsed, indicating that the pipe should * be serviced. * @@ -363,27 +372,27 @@ { return UPINT; } - + /** Determines if the specified pipe number has interrupted (valid only for INTERRUPT type * pipes). * * \param[in] PipeNumber Index of the pipe whose interrupt flag should be tested. * - * \return Boolean true if the specified pipe has interrupted, false otherwise. + * \return Boolean \c true if the specified pipe has interrupted, \c false otherwise. */ static inline bool Pipe_HasPipeInterrupted(const uint8_t PipeNumber) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_HasPipeInterrupted(const uint8_t PipeNumber) { return ((UPINT & (1 << PipeNumber)) ? true : false); } - + /** Unfreezes the selected pipe, allowing it to communicate with an attached device. */ static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE; static inline void Pipe_Unfreeze(void) { UPCONX &= ~(1 << PFREEZE); } - + /** Freezes the selected pipe, preventing it from communicating with an attached device. */ static inline void Pipe_Freeze(void) ATTR_ALWAYS_INLINE; static inline void Pipe_Freeze(void) @@ -393,34 +402,34 @@ /** Determines if the currently selected pipe is frozen, and not able to accept data. * - * \return Boolean true if the currently selected pipe is frozen, false otherwise. + * \return Boolean \c true if the currently selected pipe is frozen, \c false otherwise. */ static inline bool Pipe_IsFrozen(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsFrozen(void) { return ((UPCONX & (1 << PFREEZE)) ? true : false); } - + /** Clears the master pipe error flag. */ static inline void Pipe_ClearError(void) ATTR_ALWAYS_INLINE; static inline void Pipe_ClearError(void) { UPINTX &= ~(1 << PERRI); } - + /** Determines if the master pipe error flag is set for the currently selected pipe, indicating that * some sort of hardware error has occurred on the pipe. * * \see \ref Pipe_GetErrorFlags() macro for information on retrieving the exact error flag. * - * \return Boolean true if an error has occurred on the selected pipe, false otherwise. + * \return Boolean \c true if an error has occurred on the selected pipe, \c false otherwise. */ static inline bool Pipe_IsError(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsError(void) { return ((UPINTX & (1 << PERRI)) ? true : false); } - + /** Clears all the currently selected pipe's hardware error flags, but does not clear the master error * flag for the pipe. */ @@ -429,11 +438,11 @@ { UPERRX = 0; } - + /** Gets a mask of the hardware error flags which have occurred on the currently selected pipe. This - * value can then be masked against the PIPE_ERRORFLAG_* masks to determine what error has occurred. + * value can then be masked against the \c PIPE_ERRORFLAG_* masks to determine what error has occurred. * - * \return Mask comprising of PIPE_ERRORFLAG_* bits indicating what error has occurred on the selected pipe. + * \return Mask comprising of \c PIPE_ERRORFLAG_* bits indicating what error has occurred on the selected pipe. */ static inline uint8_t Pipe_GetErrorFlags(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Pipe_GetErrorFlags(void) @@ -444,6 +453,19 @@ (UPSTAX & (PIPE_ERRORFLAG_OVERFLOW | PIPE_ERRORFLAG_UNDERFLOW))); } + /** Retrieves the number of busy banks in the currently selected pipe, which have been queued for + * transmission via the \ref Pipe_ClearOUT() command, or are awaiting acknowledgement via the + * \ref Pipe_ClearIN() command. + * + * \ingroup Group_PipePacketManagement + * + * \return Total number of busy banks in the selected pipe. + */ + static inline uint8_t Pipe_GetBusyBanks(void) + { + return (UPSTAX & (0x03 << NBUSYBK0)); + } + /** Determines if the currently selected pipe may be read from (if data is waiting in the pipe * bank and the pipe is an IN direction, or if the bank is not yet full if the pipe is an OUT * direction). This function will return false if an error has occurred in the pipe, or if the pipe @@ -453,32 +475,33 @@ * \note This function is not valid on CONTROL type pipes. * * \ingroup Group_PipePacketManagement - * - * \return Boolean true if the currently selected pipe may be read from or written to, depending on its direction. + * + * \return Boolean \c true if the currently selected pipe may be read from or written to, depending + * on its direction. */ static inline bool Pipe_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsReadWriteAllowed(void) { return ((UPINTX & (1 << RWAL)) ? true : false); } - + /** Determines if a packet has been received on the currently selected IN pipe from the attached device. * * \ingroup Group_PipePacketManagement * - * \return Boolean true if the current pipe has received an IN packet, false otherwise. + * \return Boolean \c true if the current pipe has received an IN packet, \c false otherwise. */ static inline bool Pipe_IsINReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsINReceived(void) { return ((UPINTX & (1 << RXINI)) ? true : false); } - + /** Determines if the currently selected OUT pipe is ready to send an OUT packet to the attached device. * * \ingroup Group_PipePacketManagement * - * \return Boolean true if the current pipe is ready for an OUT packet, false otherwise. + * \return Boolean \c true if the current pipe is ready for an OUT packet, \c false otherwise. */ static inline bool Pipe_IsOUTReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsOUTReady(void) @@ -491,17 +514,17 @@ * * \ingroup Group_PipePacketManagement * - * \return Boolean true if the current pipe is ready for a SETUP packet, false otherwise. + * \return Boolean \c true if the current pipe is ready for a SETUP packet, \c false otherwise. */ static inline bool Pipe_IsSETUPSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsSETUPSent(void) { return ((UPINTX & (1 << TXSTPI)) ? true : false); } - + /** Sends the currently selected CONTROL type pipe's contents to the device as a SETUP packet. * - * \ingroup Group_PipePacketManagement + * \ingroup Group_PipePacketManagement */ static inline void Pipe_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Pipe_ClearSETUP(void) @@ -539,7 +562,7 @@ * * \ingroup Group_PipePacketManagement * - * \return Boolean true if an NAK has been received on the current pipe, false otherwise. + * \return Boolean \c true if an NAK has been received on the current pipe, \c false otherwise. */ static inline bool Pipe_IsNAKReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsNAKReceived(void) @@ -558,19 +581,19 @@ { UPINTX &= ~(1 << NAKEDI); } - + /** Determines if the currently selected pipe has had the STALL condition set by the attached device. * * \ingroup Group_PipePacketManagement * - * \return Boolean true if the current pipe has been stalled by the attached device, false otherwise. + * \return Boolean \c true if the current pipe has been stalled by the attached device, \c false otherwise. */ static inline bool Pipe_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsStalled(void) { return ((UPINTX & (1 << RXSTALLI)) ? true : false); } - + /** Clears the STALL condition detection flag on the currently selected pipe, but does not clear the * STALL condition itself (this must be done via a ClearFeature control request to the device). * @@ -614,10 +637,10 @@ static inline void Pipe_Discard_Byte(void) { uint8_t Dummy; - + Dummy = UPDATX; } - + /** Reads two bytes from the currently selected pipe's bank in little endian format, for OUT * direction pipes. * @@ -633,10 +656,10 @@ uint16_t Word; uint8_t Bytes[2]; } Data; - + Data.Bytes[0] = UPDATX; Data.Bytes[1] = UPDATX; - + return Data.Word; } @@ -655,13 +678,13 @@ uint16_t Word; uint8_t Bytes[2]; } Data; - + Data.Bytes[1] = UPDATX; Data.Bytes[0] = UPDATX; - + return Data.Word; } - + /** Writes two bytes to the currently selected pipe's bank in little endian format, for IN * direction pipes. * @@ -675,7 +698,7 @@ UPDATX = (Word & 0xFF); UPDATX = (Word >> 8); } - + /** Writes two bytes to the currently selected pipe's bank in big endian format, for IN * direction pipes. * @@ -698,7 +721,7 @@ static inline void Pipe_Discard_Word(void) { uint8_t Dummy; - + Dummy = UPDATX; Dummy = UPDATX; } @@ -718,12 +741,12 @@ uint32_t DWord; uint8_t Bytes[4]; } Data; - + Data.Bytes[0] = UPDATX; Data.Bytes[1] = UPDATX; Data.Bytes[2] = UPDATX; Data.Bytes[3] = UPDATX; - + return Data.DWord; } @@ -742,12 +765,12 @@ uint32_t DWord; uint8_t Bytes[4]; } Data; - + Data.Bytes[3] = UPDATX; Data.Bytes[2] = UPDATX; Data.Bytes[1] = UPDATX; Data.Bytes[0] = UPDATX; - + return Data.DWord; } @@ -766,7 +789,7 @@ UPDATX = (DWord >> 16); UPDATX = (DWord >> 24); } - + /** Writes four bytes to the currently selected pipe's bank in big endian format, for IN * direction pipes. * @@ -781,9 +804,9 @@ UPDATX = (DWord >> 16); UPDATX = (DWord >> 8); UPDATX = (DWord & 0xFF); - } - - /** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes. + } + + /** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes. * * \ingroup Group_PipePrimitiveRW */ @@ -791,7 +814,7 @@ static inline void Pipe_Discard_DWord(void) { uint8_t Dummy; - + Dummy = UPDATX; Dummy = UPDATX; Dummy = UPDATX; @@ -821,25 +844,26 @@ * * \param[in] Number Pipe number to configure. This must be more than 0 and less than \ref PIPE_TOTAL_PIPES. * - * \param[in] Type Type of pipe to configure, a EP_TYPE_* mask. Not all pipe types are available on Low + * \param[in] Type Type of pipe to configure, an \c EP_TYPE_* mask. Not all pipe types are available on Low * Speed USB devices - refer to the USB 2.0 specification. * * \param[in] Token Pipe data token, either \ref PIPE_TOKEN_SETUP, \ref PIPE_TOKEN_OUT or \ref PIPE_TOKEN_IN. - * All pipes (except Control type) are unidirectional - data may only be read from or + * All pipes (except Control type) are unidirectional - data may only be read from or * written to the pipe bank based on its direction, not both. * * \param[in] EndpointNumber Endpoint index within the attached device that the pipe should interface to. * * \param[in] Size Size of the pipe's bank, where packets are stored before they are transmitted to - * the USB device, or after they have been received from the USB device (depending on - * the pipe's data direction). The bank size must indicate the maximum packet size that + * the USB device, or after they have been received from the USB device (depending on + * the pipe's data direction). The bank size must indicate the maximum packet size that * the pipe can handle. * - * \param[in] Banks Number of banks to use for the pipe being configured, a PIPE_BANK_* mask. More banks + * \param[in] Banks Number of banks to use for the pipe being configured, a \c PIPE_BANK_* mask. More banks * uses more USB DPRAM, but offers better performance. Isochronous type pipes must * have at least two banks. * - * \note Endpoints must be configured in ascending order, or bank corruption will occur. + * \note When the \c ORDERED_EP_CONFIG compile time option is used, Pipes must be configured in ascending order, + * or bank corruption will occur. * \n\n * * \note Certain models of USB AVR's pipes may have different maximum packet sizes based on the pipe's @@ -853,7 +877,7 @@ * \note This routine will automatically select the specified pipe upon success. Upon failure, the pipe which * failed to reconfigure correctly will be selected. * - * \return Boolean true if the configuration succeeded, false otherwise. + * \return Boolean \c true if the configuration succeeded, \c false otherwise. */ bool Pipe_ConfigurePipe(const uint8_t Number, const uint8_t Type, @@ -862,7 +886,7 @@ const uint16_t Size, const uint8_t Banks); - /** Spin-loops until the currently selected non-control pipe is ready for the next packed of data to be read + /** Spin-loops until the currently selected non-control pipe is ready for the next packed of data to be read * or written to it, aborting in the case of an error condition (such as a timeout or device disconnect). * * \ingroup Group_PipeRW @@ -870,14 +894,14 @@ * \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum. */ uint8_t Pipe_WaitUntilReady(void); - + /** Determines if a pipe has been bound to the given device endpoint address. If a pipe which is bound to the given * endpoint is found, it is automatically selected. * * \param[in] EndpointAddress Address and direction mask of the endpoint within the attached device to check. * - * \return Boolean true if a pipe bound to the given endpoint address of the specified direction is found, false - * otherwise. + * \return Boolean \c true if a pipe bound to the given endpoint address of the specified direction is found, + * \c false otherwise. */ bool Pipe_IsEndpointBound(const uint8_t EndpointAddress); @@ -887,20 +911,20 @@ #if !defined(ENDPOINT_CONTROLEP) #define ENDPOINT_CONTROLEP 0 #endif - + /* Inline Functions: */ static inline uint8_t Pipe_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE; static inline uint8_t Pipe_BytesToEPSizeMask(const uint16_t Bytes) { uint8_t MaskVal = 0; uint16_t CheckBytes = 8; - + while ((CheckBytes < Bytes) && (CheckBytes < PIPE_MAX_SIZE)) { MaskVal++; CheckBytes <<= 1; } - + return (MaskVal << EPSIZE0); } @@ -912,7 +936,8 @@ #if defined(__cplusplus) } #endif - + #endif /** @} */ +