Pipe.h 38 KB
 Dean Camera committed Feb 23, 2009 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 /* LUFA Library Copyright (C) Dean Camera, 2009. dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ /* Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, 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 software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */  Dean Camera committed Apr 16, 2009 31 32 33 /** \ingroup Group_USB * @defgroup Group_PipeManagement Pipe Management *  Dean Camera committed Apr 17, 2009 34 35 36  * This module contains functions, macros and enums related to pipe management when in USB Host mode. This * module contains the pipe management macros, as well as pipe interrupt and data send/recieve functions * for various data types.  Dean Camera committed Apr 16, 2009 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52  * * @{ */ /** @defgroup Group_PipeRW Pipe Data Reading and Writing * * Functions, macros, variables, enums and types related to data reading and writing from and to pipes. */ /** @defgroup Group_PipePacketManagement Pipe Packet Management * * Functions, macros, variables, enums and types related to packet management of pipes. */ /** @defgroup Group_PipeControlReq Pipe Control Request Management *  Dean Camera committed Apr 17, 2009 53 54 55 56 57  * Module for host mode request processing. This module allows for the transmission of standard, class and * 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. */  Dean Camera committed Apr 16, 2009 58   Dean Camera committed Feb 23, 2009 59 60 61 62 63 64 65 66 67 68 69 #ifndef __PIPE_H__ #define __PIPE_H__ /* Includes: */ #include #include #include "../../../Common/Common.h" #include "../HighLevel/USBTask.h" #if !defined(NO_STREAM_CALLBACKS) || defined(__DOXYGEN__)  Dean Camera committed Apr 05, 2009 70  #include "../HighLevel/StreamCallbacks.h"  Dean Camera committed Feb 23, 2009 71  #endif  Dean Camera committed Mar 26, 2009 72   Dean Camera committed Feb 23, 2009 73 74 75 76 77 78 79  /* Enable C linkage for C++ Compilers: */ #if defined(__cplusplus) extern "C" { #endif /* Public Interface - May be used in end-application: */ /* Macros: */  Dean Camera committed Apr 22, 2009 80  /** Mask for \ref Pipe_GetErrorFlags(), indicating that a CRC error occurred in the pipe on the received data. */  Dean Camera committed Mar 04, 2009 81  #define PIPE_ERRORFLAG_CRC16 (1 << 4)  Dean Camera committed Feb 23, 2009 82   Dean Camera committed Apr 22, 2009 83  /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware timeout error occurred in the pipe. */  Dean Camera committed Mar 04, 2009 84  #define PIPE_ERRORFLAG_TIMEOUT (1 << 3)  Dean Camera committed Feb 23, 2009 85   Dean Camera committed Apr 22, 2009 86  /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware PID error occurred in the pipe. */  Dean Camera committed Mar 04, 2009 87  #define PIPE_ERRORFLAG_PID (1 << 2)  Dean Camera committed Feb 23, 2009 88   Dean Camera committed Apr 22, 2009 89  /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware data PID error occurred in the pipe. */  Dean Camera committed Mar 04, 2009 90  #define PIPE_ERRORFLAG_DATAPID (1 << 1)  Dean Camera committed Feb 23, 2009 91   Dean Camera committed Apr 22, 2009 92  /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware data toggle error occurred in the pipe. */  Dean Camera committed Mar 04, 2009 93  #define PIPE_ERRORFLAG_DATATGL (1 << 0)  Dean Camera committed Feb 23, 2009 94   Dean Camera committed Apr 22, 2009 95  /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a SETUP token (for CONTROL type pipes),  Dean Camera committed Feb 23, 2009 96 97  * which will trigger a control request on the attached device when data is written to the pipe. */  Dean Camera committed Apr 05, 2009 98  #define PIPE_TOKEN_SETUP (0 << PTOKEN0)  Dean Camera committed Feb 23, 2009 99   Dean Camera committed Apr 22, 2009 100  /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a IN token (for non-CONTROL type pipes),  Dean Camera committed Feb 23, 2009 101 102  * indicating that the pipe data will flow from device to host. */  Dean Camera committed Apr 05, 2009 103  #define PIPE_TOKEN_IN (1 << PTOKEN0)  Dean Camera committed Feb 23, 2009 104   Dean Camera committed Apr 22, 2009 105  /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a IN token (for non-CONTROL type pipes),  Dean Camera committed Feb 23, 2009 106 107  * indicating that the pipe data will flow from host to device. */  Dean Camera committed Apr 05, 2009 108  #define PIPE_TOKEN_OUT (2 << PTOKEN0)  Dean Camera committed Feb 23, 2009 109   Dean Camera committed Apr 22, 2009 110  /** Mask for the bank mode selection for the \ref Pipe_ConfigurePipe() macro. This indicates that the pipe  Dean Camera committed Feb 23, 2009 111 112 113  * 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. */  Dean Camera committed Mar 04, 2009 114  #define PIPE_BANK_SINGLE (0 << EPBK0)  Dean Camera committed Feb 23, 2009 115   Dean Camera committed Apr 22, 2009 116  /** Mask for the bank mode selection for the \ref Pipe_ConfigurePipe() macro. This indicates that the pipe  Dean Camera committed Feb 23, 2009 117 118 119 120  * should have two banks, which requires more USB FIFO memory but results in faster transfers as one * USB device (the AVR or the attached device) can access one bank while the other accesses the second * bank. */  Dean Camera committed Mar 04, 2009 121  #define PIPE_BANK_DOUBLE (1 << EPBK0)  Dean Camera committed Feb 23, 2009 122 123 124 125  /** 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. */  Dean Camera committed Mar 04, 2009 126  #define PIPE_CONTROLPIPE 0  Dean Camera committed Feb 23, 2009 127 128 129 130  /** Default size of the default control pipe's bank, until altered by the Endpoint0Size value * in the device descriptor of the attached device. */  Dean Camera committed May 04, 2009 131  #define PIPE_CONTROLPIPE_DEFAULT_SIZE 64  Dean Camera committed Feb 23, 2009 132 133 134 135  /** Pipe number mask, for masking against pipe addresses to retrieve the pipe's numerical address * in the device. */  Dean Camera committed Mar 04, 2009 136  #define PIPE_PIPENUM_MASK 0x07  Dean Camera committed Feb 23, 2009 137 138 139 140 141  /** Total number of pipes (including the default control pipe at address 0) which may be used in * the device. Different USB AVR models support different amounts of pipes, this value reflects * the maximum number of pipes for the currently selected AVR model. */  Dean Camera committed Mar 04, 2009 142  #define PIPE_TOTAL_PIPES 7  Dean Camera committed Feb 23, 2009 143 144 145 146 147 148  /** Size in bytes of the largest pipe bank size possible in the device. Not all banks on each AVR * model supports the largest bank size possible on the device; different pipe numbers support * different maximum bank sizes. This value reflects the largest possible bank of any pipe on the * currently selected USB AVR model. */  Dean Camera committed Mar 04, 2009 149  #define PIPE_MAX_SIZE 256  Dean Camera committed Feb 23, 2009 150 151 152 153  /** Endpoint number mask, for masking against endpoint addresses to retrieve the endpoint's * numerical address in the attached device. */  Dean Camera committed Mar 04, 2009 154  #define PIPE_EPNUM_MASK 0x07  Dean Camera committed Feb 23, 2009 155 156 157 158  /** Endpoint bank size mask, for masking against endpoint addresses to retrieve the endpoint's * bank size in the attached device. */  Dean Camera committed Mar 04, 2009 159  #define PIPE_EPSIZE_MASK 0x7FF  Dean Camera committed Feb 23, 2009 160   Dean Camera committed Apr 19, 2009 161  /* Pseudo-Function Macros: */  Dean Camera committed Apr 16, 2009 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196  #if defined(__DOXYGEN__) /** Indicates the number of bytes currently stored in the current pipes's selected bank. * * \note The return width of this function may differ, depending on the maximum pipe bank size * of the selected AVR model. * * \ingroup Group_PipeRW * * \return Total number of bytes in the currently selected Pipe's FIFO buffer */ static inline uint16_t Pipe_BytesInPipe(void); /** 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. * * \return Index of the currently selected pipe */ static inline uint8_t Pipe_GetCurrentPipe(void); /** Selects the given pipe number. Any pipe operations which do not require the pipe number to be * indicated will operate on the currently selected pipe. * * \param PipeNumber Index of the pipe to select */ static inline void Pipe_SelectPipe(uint8_t PipeNumber); /** Resets the desired pipe, including the pipe banks and flags. * * \param PipeNumber Index of the pipe to reset */ static inline void Pipe_ResetPipe(uint8_t PipeNumber); /** Enables the currently selected pipe so that data can be sent and received through it to and from * an attached device. *  Dean Camera committed Apr 22, 2009 197  * \note Pipes must first be configured properly via \ref Pipe_ConfigurePipe().  Dean Camera committed Apr 16, 2009 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269  */ static inline void Pipe_EnablePipe(void); /** Disables the currently selected pipe so that data cannot be sent and received through it to and * from an attached device. */ static inline void Pipe_DisablePipe(void); /** Determines if the currently selected pipe is enabled, but not necessarily configured. * * \return Boolean True if the currently selected pipe is enabled, false otherwise */ static inline bool Pipe_IsEnabled(void); /** Gets the current pipe token, indicating the pipe's data direction and type. * * \return The current pipe token, as a PIPE_TOKEN_* mask */ static inline uint8_t Pipe_GetCurrentToken(void); /** Sets the token for the currently selected pipe to one of the tokens specified by the 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 Token New pipe token to set the selected pipe to, as a PIPE_TOKEN_* mask */ static inline void Pipe_SetPipeToken(uint8_t Token); /** Configures the currently selected pipe to allow for an unlimited number of IN requests. */ static inline void Pipe_SetInfiniteINRequests(void); /** 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. * * \param TotalINRequests Total number of IN requests that the pipe may receive before freezing */ static inline void Pipe_SetFiniteINRequests(uint8_t TotalINRequests); /** Determines if the currently selected pipe is configured. * * \return Boolean true if the selected pipe is configured, false otherwise */ static inline bool Pipe_IsConfigured(void); /** Sets the period between interrupts for an INTERRUPT type pipe to a specified number of milliseconds. * * \param Milliseconds Number of milliseconds between each pipe poll */ static inline void Pipe_SetInterruptPeriod(uint8_t Milliseconds); /** Returns a mask indicating which pipe's interrupt periods have elapsed, indicating that the pipe should * be serviced. * * \return Mask whose bits indicate which pipes have interrupted */ static inline uint8_t Pipe_GetPipeInterrupts(void); /** Determines if the specified pipe number has interrupted (valid only for INTERRUPT type * pipes). * * \param PipeNumber Index of the pipe whose interrupt flag should be tested * * \return Boolean true if the specified pipe has interrupted, false otherwise */ static inline bool Pipe_HasPipeInterrupted(uint8_t PipeNumber); /** Unfreezes the selected pipe, allowing it to communicate with an attached device. */ static inline void Pipe_Unfreeze(void); /** Freezes the selected pipe, preventing it from communicating with an attached device. */ static inline void Pipe_Freeze(void);  Dean Camera committed Feb 23, 2009 270   Dean Camera committed Apr 16, 2009 271 272 273 274 275 276  /** Clears the master pipe error flag. */ static inline void Pipe_ClearError(void); /** 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. *  Dean Camera committed Apr 22, 2009 277  * \see \ref Pipe_GetErrorFlags() macro for information on retrieving the exact error flag.  Dean Camera committed Apr 16, 2009 278  *  Dean Camera committed Apr 19, 2009 279  * \return Boolean true if an error has occurred on the selected pipe, false otherwise  Dean Camera committed Apr 16, 2009 280 281 282 283 284 285 286 287 288 289 290  */ static inline bool Pipe_IsError(void); /** Clears all the currently selected pipe's hardware error flags, but does not clear the master error * flag for the pipe. */ static inline void Pipe_ClearErrorFlags(void); /** 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. *  Dean Camera committed Apr 19, 2009 291  * \return Mask comprising of PIPE_ERRORFLAG_* bits indicating what error has occurred on the selected pipe  Dean Camera committed Apr 16, 2009 292 293 294 295 296 297 298 299 300  */ static inline uint8_t Pipe_GetErrorFlags(void); /** 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 * is an IN direction and no packet (or an empty packet) has been received, or if the pipe is an OUT * direction and the pipe bank is full. *  Dean Camera committed Apr 22, 2009 301 302  * \note This function is not valid on CONTROL type pipes. *  Dean Camera committed Apr 16, 2009 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335  * \ingroup Group_PipePacketManagement * * \return Boolean true if the currently selected pipe may be read from or written to, depending on its direction */ static inline bool Pipe_IsReadWriteAllowed(void); /** Determines if an IN request has been received on the currently selected pipe. * * \ingroup Group_PipePacketManagement * * \return Boolean true if the current pipe has received an IN packet, false otherwise. */ static inline bool Pipe_IsINReceived(void); /** Determines if the currently selected pipe is ready to send an OUT request. * * \ingroup Group_PipePacketManagement * * \return Boolean true if the current pipe is ready for an OUT packet, false otherwise. */ static inline bool Pipe_IsOUTReady(void); /** Determines if no SETUP request is currently being sent to the attached device on the selected * CONTROL type pipe. * * \ingroup Group_PipePacketManagement * * \return Boolean true if the current pipe is ready for a SETUP packet, false otherwise. */ static inline bool Pipe_IsSETUPSent(void); /** Sends the currently selected CONTROL type pipe's contents to the device as a SETUP packet. *  Dean Camera committed Apr 21, 2009 336  * \ingroup Group_PipePacketManagement  Dean Camera committed Apr 16, 2009 337  */  Dean Camera committed Apr 21, 2009 338  static inline void Pipe_ClearSETUP(void);  Dean Camera committed Apr 16, 2009 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356  /** Acknowledges the reception of a setup IN request from the attached device on the currently selected * pipe, freeing the bank ready for the next packet. * * \ingroup Group_PipePacketManagement */ static inline void Pipe_ClearIN(void); /** Sends the currently selected pipe's contents to the device as an OUT packet on the selected pipe, freeing * the bank ready for the next packet. * * \ingroup Group_PipePacketManagement */ static inline void Pipe_ClearOUT(void); /** Determines if the device sent a NAK (Negative Acknowledge) in response to the last sent packet on * the currently selected pipe. This occurs when the host sends a packet to the device, but the device * is not currently ready to handle the packet (i.e. its endpoint banks are full). Once a NAK has been  Dean Camera committed Apr 22, 2009 357  * received, it must be cleared using \ref Pipe_ClearNAKReceived() before the previous (or any other) packet  Dean Camera committed Apr 16, 2009 358 359 360 361 362 363 364 365 366 367 368 369  * can be re-sent. * * \ingroup Group_PipePacketManagement * * \return Boolean true if an NAK has been received on the current pipe, false otherwise */ static inline bool Pipe_IsNAKReceived(void); /** Clears the NAK condition on the currently selected pipe. * * \ingroup Group_PipePacketManagement *  Dean Camera committed Apr 22, 2009 370  * \see \ref Pipe_IsNAKReceived() for more details.  Dean Camera committed Apr 16, 2009 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389  */ static inline void Pipe_ClearNAKReceived(void); /** 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 */ static inline bool Pipe_IsStalled(void); /** 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). * * \ingroup Group_PipePacketManagement */ static inline void Pipe_ClearStall(void); #else #define Pipe_BytesInPipe() UPBCX  Dean Camera committed Feb 23, 2009 390   Dean Camera committed Apr 16, 2009 391  #define Pipe_GetCurrentPipe() (UPNUM & PIPE_PIPENUM_MASK)  Dean Camera committed Feb 23, 2009 392   Dean Camera committed Apr 16, 2009 393 394 395  #define Pipe_SelectPipe(pipenum) MACROS{ UPNUM = pipenum; }MACROE #define Pipe_ResetPipe(pipenum) MACROS{ UPRST = (1 << pipenum); UPRST = 0; }MACROE  Dean Camera committed Feb 23, 2009 396   Dean Camera committed Apr 16, 2009 397  #define Pipe_EnablePipe() MACROS{ UPCONX |= (1 << PEN); }MACROE  Dean Camera committed Feb 23, 2009 398   Dean Camera committed Apr 16, 2009 399  #define Pipe_DisablePipe() MACROS{ UPCONX &= ~(1 << PEN); }MACROE  Dean Camera committed Feb 23, 2009 400   Dean Camera committed Apr 16, 2009 401  #define Pipe_IsEnabled() ((UPCONX & (1 << PEN)) ? true : false)  Dean Camera committed Feb 23, 2009 402   Dean Camera committed Apr 16, 2009 403  #define Pipe_GetPipeToken() (UPCFG0X & PIPE_TOKEN_MASK)  Dean Camera committed Feb 23, 2009 404   Dean Camera committed Apr 16, 2009 405 406 407  #define Pipe_SetToken(token) MACROS{ UPCFG0X = ((UPCFG0X & ~PIPE_TOKEN_MASK) | token); }MACROE #define Pipe_SetInfiniteINRequests() MACROS{ UPCONX |= (1 << INMODE); }MACROE  Dean Camera committed Feb 23, 2009 408   Dean Camera committed Apr 16, 2009 409  #define Pipe_SetFiniteINRequests(n) MACROS{ UPCONX &= ~(1 << INMODE); UPINRQX = n; }MACROE  Dean Camera committed Feb 23, 2009 410   Dean Camera committed Apr 16, 2009 411  #define Pipe_IsConfigured() ((UPSTAX & (1 << CFGOK)) ? true : false)  Dean Camera committed Feb 23, 2009 412   Dean Camera committed Apr 16, 2009 413  #define Pipe_SetInterruptPeriod(ms) MACROS{ UPCFG2X = ms; }MACROE  Dean Camera committed Feb 23, 2009 414   Dean Camera committed Apr 16, 2009 415  #define Pipe_GetPipeInterrupts() UPINT  Dean Camera committed Feb 23, 2009 416   Dean Camera committed Apr 16, 2009 417  #define Pipe_HasPipeInterrupted(n) ((UPINT & (1 << n)) ? true : false)  Dean Camera committed Feb 23, 2009 418   Dean Camera committed Apr 16, 2009 419  #define Pipe_Unfreeze() MACROS{ UPCONX &= ~(1 << PFREEZE); }MACROE  Dean Camera committed Feb 23, 2009 420   Dean Camera committed Apr 16, 2009 421  #define Pipe_Freeze() MACROS{ UPCONX |= (1 << PFREEZE); }MACROE  Dean Camera committed Feb 23, 2009 422   Dean Camera committed Apr 16, 2009 423  #define Pipe_ClearError() MACROS{ UPINTX &= ~(1 << PERRI); }MACROE  Dean Camera committed Feb 23, 2009 424   Dean Camera committed Apr 16, 2009 425 426 427  #define Pipe_IsError() ((UPINTX & (1 << PERRI)) ? true : false) #define Pipe_ClearErrorFlags() MACROS{ UPERRX = 0; }MACROE  Dean Camera committed Feb 23, 2009 428   Dean Camera committed Apr 16, 2009 429  #define Pipe_GetErrorFlags() UPERRX  Dean Camera committed Feb 23, 2009 430   Dean Camera committed Apr 16, 2009 431  #define Pipe_IsReadWriteAllowed() ((UPINTX & (1 << RWAL)) ? true : false)  Dean Camera committed Feb 23, 2009 432   Dean Camera committed Apr 16, 2009 433  #define Pipe_IsINReceived() ((UPINTX & (1 << RXINI)) ? true : false)  Dean Camera committed Feb 23, 2009 434   Dean Camera committed Apr 16, 2009 435  #define Pipe_IsOUTReady() ((UPINTX & (1 << TXOUTI)) ? true : false)  Dean Camera committed Feb 23, 2009 436   Dean Camera committed Apr 16, 2009 437  #define Pipe_IsSETUPSent() ((UPINTX & (1 << TXSTPI)) ? true : false)  Dean Camera committed Feb 23, 2009 438   Dean Camera committed Apr 16, 2009 439 440  #define Pipe_ClearIN() MACROS{ uint8_t Temp = UPINTX; UPINTX = (Temp & ~(1 << RXINI)); \ UPINTX = (Temp & ~(1 << FIFOCON)); }MACROE  Dean Camera committed Feb 23, 2009 441   Dean Camera committed Apr 16, 2009 442 443  #define Pipe_ClearOUT() MACROS{ uint8_t Temp = UPINTX; UPINTX = (Temp & ~(1 << TXOUTI)); \ UPINTX = (Temp & ~(1 << FIFOCON)); }MACROE  Dean Camera committed Apr 16, 2009 444   Dean Camera committed Apr 21, 2009 445  #define Pipe_ClearSETUP() MACROS{ uint8_t Temp = UPINTX; UPINTX = (Temp & ~(1 << TXSTPI)); \  Dean Camera committed Apr 16, 2009 446  UPINTX = (Temp & ~(1 << FIFOCON)); }MACROE  Dean Camera committed Feb 23, 2009 447   Dean Camera committed Apr 16, 2009 448 449 450 451 452 453 454 455  #define Pipe_IsNAKReceived() ((UPINTX & (1 << NAKEDI)) ? true : false) #define Pipe_ClearNAKReceived() MACROS{ UPINTX &= ~(1 << NAKEDI); }MACROE #define Pipe_IsStalled() ((UPINTX & (1 << RXSTALLI)) ? true : false) #define Pipe_ClearStall() MACROS{ UPINTX &= ~(1 << RXSTALLI); }MACROE #endif  Dean Camera committed Feb 23, 2009 456 457  /* Enums: */  Dean Camera committed Apr 16, 2009 458 459 460 461  /** Enum for the possible error return codes of the Pipe_WaitUntilReady function * * \ingroup Group_PipeRW */  Dean Camera committed Feb 23, 2009 462 463 464 465 466 467 468  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_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  Dean Camera committed Apr 22, 2009 469  * \ref USB_STREAM_TIMEOUT_MS macro.  Dean Camera committed Feb 23, 2009 470 471 472  */ };  Dean Camera committed Apr 16, 2009 473 474 475 476  /** Enum for the possible error return codes of the Pipe_*_Stream_* functions. * * \ingroup Group_PipeRW */  Dean Camera committed Feb 23, 2009 477 478  enum Pipe_Stream_RW_ErrorCodes_t {  479 480 481 482 483 484 485 486 487 488 489 490  PIPE_RWSTREAM_NoError = 0, /**< Command completed successfully, no error. */ PIPE_RWSTREAM_PipeStalled = 1, /**< The device stalled the pipe during the transfer. */ PIPE_RWSTREAM_DeviceDisconnected = 2, /**< Device was disconnected from the host during * the transfer. */ PIPE_RWSTREAM_Timeout = 3, /**< The device failed to accept or send the next packet * within the software timeout period set by the * \ref USB_STREAM_TIMEOUT_MS macro. */ PIPE_RWSTREAM_CallbackAborted = 4, /**< Indicates that the stream's callback function aborted * the transfer early. */  Dean Camera committed Feb 23, 2009 491 492 493  }; /* Inline Functions: */  Dean Camera committed Apr 16, 2009 494 495 496 497 498 499  /** Reads one byte from the currently selected pipe's bank, for OUT direction pipes. * * \ingroup Group_PipeRW * * \return Next byte in the currently selected pipe's FIFO buffer */  Dean Camera committed Mar 04, 2009 500  static inline uint8_t Pipe_Read_Byte(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;  Dean Camera committed Feb 23, 2009 501 502 503 504 505  static inline uint8_t Pipe_Read_Byte(void) { return UPDATX; }  Dean Camera committed Apr 16, 2009 506 507 508 509 510 511  /** Writes one byte from the currently selected pipe's bank, for IN direction pipes. * * \ingroup Group_PipeRW * * \param Byte Next byte to write into the the currently selected pipe's FIFO buffer */  Dean Camera committed Mar 04, 2009 512  static inline void Pipe_Write_Byte(const uint8_t Byte) ATTR_ALWAYS_INLINE;  Dean Camera committed Feb 23, 2009 513 514 515 516 517  static inline void Pipe_Write_Byte(const uint8_t Byte) { UPDATX = Byte; }  Dean Camera committed Apr 16, 2009 518 519 520 521  /** Discards one byte from the currently selected pipe's bank, for OUT direction pipes. * * \ingroup Group_PipeRW */  Dean Camera committed Mar 04, 2009 522  static inline void Pipe_Discard_Byte(void) ATTR_ALWAYS_INLINE;  Dean Camera committed Feb 23, 2009 523 524 525 526 527 528 529 530 531  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.  Dean Camera committed Apr 16, 2009 532 533 534 535  * * \ingroup Group_PipeRW * * \return Next word in the currently selected pipe's FIFO buffer  Dean Camera committed Feb 23, 2009 536  */  Dean Camera committed Mar 04, 2009 537  static inline uint16_t Pipe_Read_Word_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;  Dean Camera committed Feb 23, 2009 538 539 540 541 542 543 544 545 546 547 548 549  static inline uint16_t Pipe_Read_Word_LE(void) { uint16_t Data; Data = UPDATX; Data |= (((uint16_t)UPDATX) << 8); return Data; } /** Reads two bytes from the currently selected pipe's bank in big endian format, for OUT * direction pipes.  Dean Camera committed Apr 16, 2009 550 551 552 553  * * \ingroup Group_PipeRW * * \return Next word in the currently selected pipe's FIFO buffer  Dean Camera committed Feb 23, 2009 554  */  Dean Camera committed Mar 04, 2009 555  static inline uint16_t Pipe_Read_Word_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;  Dean Camera committed Feb 23, 2009 556 557 558 559 560 561 562 563 564 565 566 567  static inline uint16_t Pipe_Read_Word_BE(void) { uint16_t Data; Data = (((uint16_t)UPDATX) << 8); Data |= UPDATX; return Data; } /** Writes two bytes to the currently selected pipe's bank in little endian format, for IN * direction pipes.  Dean Camera committed Apr 16, 2009 568 569 570 571  * * \ingroup Group_PipeRW * * \param Word Next word to write to the currently selected pipe's FIFO buffer  Dean Camera committed Feb 23, 2009 572  */  Dean Camera committed Mar 04, 2009 573  static inline void Pipe_Write_Word_LE(const uint16_t Word) ATTR_ALWAYS_INLINE;  Dean Camera committed Feb 23, 2009 574 575 576 577 578 579 580 581  static inline void Pipe_Write_Word_LE(const uint16_t Word) { UPDATX = (Word & 0xFF); UPDATX = (Word >> 8); } /** Writes two bytes to the currently selected pipe's bank in big endian format, for IN * direction pipes.  Dean Camera committed Apr 16, 2009 582 583 584 585  * * \ingroup Group_PipeRW * * \param Word Next word to write to the currently selected pipe's FIFO buffer  Dean Camera committed Feb 23, 2009 586  */  Dean Camera committed Mar 04, 2009 587  static inline void Pipe_Write_Word_BE(const uint16_t Word) ATTR_ALWAYS_INLINE;  Dean Camera committed Feb 23, 2009 588 589 590 591 592 593  static inline void Pipe_Write_Word_BE(const uint16_t Word) { UPDATX = (Word >> 8); UPDATX = (Word & 0xFF); }  Dean Camera committed Apr 16, 2009 594 595 596 597 598 599  /** Discards two bytes from the currently selected pipe's bank, for OUT direction pipes. * * \ingroup Group_PipeRW */ static inline void Pipe_Discard_Word(void) ATTR_ALWAYS_INLINE; static inline void Pipe_Discard_Word(void)  Dean Camera committed Feb 23, 2009 600 601 602 603 604 605 606 607 608  { uint8_t Dummy; Dummy = UPDATX; Dummy = UPDATX; } /** Reads four bytes from the currently selected pipe's bank in little endian format, for OUT * direction pipes.  Dean Camera committed Apr 16, 2009 609 610 611 612  * * \ingroup Group_PipeRW * * \return Next double word in the currently selected pipe's FIFO buffer  Dean Camera committed Feb 23, 2009 613  */  Dean Camera committed Mar 04, 2009 614  static inline uint32_t Pipe_Read_DWord_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;  Dean Camera committed Feb 23, 2009 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632  static inline uint32_t Pipe_Read_DWord_LE(void) { union { 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; } /** Reads four bytes from the currently selected pipe's bank in big endian format, for OUT * direction pipes.  Dean Camera committed Apr 16, 2009 633 634 635 636  * * \ingroup Group_PipeRW * * \return Next double word in the currently selected pipe's FIFO buffer  Dean Camera committed Feb 23, 2009 637  */  Dean Camera committed Mar 04, 2009 638  static inline uint32_t Pipe_Read_DWord_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;  Dean Camera committed Feb 23, 2009 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656  static inline uint32_t Pipe_Read_DWord_BE(void) { union { 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; } /** Writes four bytes to the currently selected pipe's bank in little endian format, for IN * direction pipes.  Dean Camera committed Apr 16, 2009 657 658 659 660  * * \ingroup Group_PipeRW * * \param DWord Next double word to write to the currently selected pipe's FIFO buffer  Dean Camera committed Feb 23, 2009 661  */  Dean Camera committed Mar 04, 2009 662  static inline void Pipe_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE;  Dean Camera committed Feb 23, 2009 663 664 665 666 667 668 669 670  static inline void Pipe_Write_DWord_LE(const uint32_t DWord) { Pipe_Write_Word_LE(DWord); Pipe_Write_Word_LE(DWord >> 16); } /** Writes four bytes to the currently selected pipe's bank in big endian format, for IN * direction pipes.  Dean Camera committed Apr 16, 2009 671 672 673 674  * * \ingroup Group_PipeRW * * \param DWord Next double word to write to the currently selected pipe's FIFO buffer  Dean Camera committed Mar 04, 2009 675 676  */ static inline void Pipe_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE;  Dean Camera committed Feb 23, 2009 677 678 679 680 681 682  static inline void Pipe_Write_DWord_BE(const uint32_t DWord) { Pipe_Write_Word_BE(DWord >> 16); Pipe_Write_Word_BE(DWord); }  Dean Camera committed Apr 16, 2009 683 684 685 686  /** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes. * * \ingroup Group_PipeRW */  Dean Camera committed Apr 20, 2009 687 688  static inline void Pipe_Discard_DWord(void) ATTR_ALWAYS_INLINE; static inline void Pipe_Discard_DWord(void)  Dean Camera committed Feb 23, 2009 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720  { uint8_t Dummy; Dummy = UPDATX; Dummy = UPDATX; Dummy = UPDATX; Dummy = UPDATX; } /* External Variables: */ /** Global indicating the maximum packet size of the default control pipe located at address * 0 in the device. This value is set to the value indicated in the attached device's device * descriptor once the USB interface is initialized into host mode and a device is attached * to the USB bus. * * \note This variable should be treated as read-only in the user application, and never manually * changed in value. */ extern uint8_t USB_ControlPipeSize; /* Function Prototypes: */ /** Configures the specified pipe number with the given pipe type, token, target endpoint number in the * attached device, bank size and banking mode. Pipes should be allocated in ascending order by their * address in the device (i.e. pipe 1 should be configured before pipe 2 and so on). * * The pipe type may be one of the EP_TYPE_* macros listed in LowLevel.h, the token may be one of the * PIPE_TOKEN_* masks. * * The bank size must indicate the maximum packet size that the pipe can handle. Different pipe * numbers can handle different maximum packet sizes - refer to the chosen USB AVR's datasheet to * determine the maximum bank size for each pipe. *  Dean Camera committed Apr 22, 2009 721  * The banking mode may be either \ref PIPE_BANK_SINGLE or \ref PIPE_BANK_DOUBLE.  Dean Camera committed Feb 23, 2009 722  *  Dean Camera committed Apr 22, 2009 723  * A newly configured pipe is frozen by default, and must be unfrozen before use via the \ref Pipe_Unfreeze() macro.  Dean Camera committed Feb 23, 2009 724 725 726 727 728 729 730 731 732 733 734 735  * * \note This routine will select the specified pipe, and the pipe will remain selected once the * routine completes regardless of if the pipe configuration succeeds. * * \return Boolean true if the configuration is successful, false otherwise */ bool Pipe_ConfigurePipe(const uint8_t Number, const uint8_t Type, const uint8_t Token, const uint8_t EndpointNumber, const uint16_t Size, const uint8_t Banks); /** Spinloops until the currently selected non-control pipe is ready for the next packed of data * to be read or written to it. *  Dean Camera committed Apr 16, 2009 736 737  * \ingroup Group_PipeRW *  Dean Camera committed Feb 23, 2009 738 739 740 741 742 743 744  * \return A value from the Pipe_WaitUntilReady_ErrorCodes_t enum. */ uint8_t Pipe_WaitUntilReady(void); /** Writes the given number of bytes to the pipe from the given buffer in little endian, * sending full packets to the device as needed. The last packet filled is not automatically sent; * the user is responsible for manually sending the last written packet to the host via the  Dean Camera committed Apr 22, 2009 745  * \ref Pipe_ClearOUT() macro. Between each USB packet, the given stream callback function is  Dean Camera committed Feb 23, 2009 746 747  * executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers. *  Dean Camera committed Apr 22, 2009 748  * The callback routine should be created using the \ref STREAM_CALLBACK() macro. If the token  Dean Camera committed Feb 23, 2009 749  * NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are disabled  Dean Camera committed Apr 01, 2009 750  * and this function has the Callback parameter omitted.  Dean Camera committed Feb 23, 2009 751  *  Dean Camera committed Apr 16, 2009 752 753  * \ingroup Group_PipeRW *  Dean Camera committed Feb 23, 2009 754 755  * \param Buffer Pointer to the source data buffer to read from. * \param Length Number of bytes to read for the currently selected pipe into the buffer.  Dean Camera committed Apr 01, 2009 756  * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback  Dean Camera committed Feb 23, 2009 757  *  Dean Camera committed Apr 22, 2009 758  * \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.  Dean Camera committed Feb 23, 2009 759 760 761  */ uint8_t Pipe_Write_Stream_LE(const void* Buffer, uint16_t Length #if !defined(NO_STREAM_CALLBACKS) || defined(__DOXYGEN__)  Dean Camera committed May 15, 2009 762  , StreamCallbackPtr_t Callback  Dean Camera committed Feb 23, 2009 763 764 765 766 767 768  #endif ) ATTR_NON_NULL_PTR_ARG(1); /** Writes the given number of bytes to the pipe from the given buffer in big endian, * sending full packets to the device as needed. The last packet filled is not automatically sent; * the user is responsible for manually sending the last written packet to the host via the  Dean Camera committed Apr 22, 2009 769  * \ref Pipe_ClearOUT() macro. Between each USB packet, the given stream callback function is  Dean Camera committed Feb 23, 2009 770 771  * executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers. *  Dean Camera committed Apr 22, 2009 772  * The callback routine should be created using the \ref STREAM_CALLBACK() macro. If the token  Dean Camera committed Feb 23, 2009 773  * NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are disabled  Dean Camera committed Apr 01, 2009 774  * and this function has the Callback parameter omitted.  Dean Camera committed Feb 23, 2009 775  *  Dean Camera committed Apr 16, 2009 776 777  * \ingroup Group_PipeRW *  Dean Camera committed Feb 23, 2009 778 779  * \param Buffer Pointer to the source data buffer to read from. * \param Length Number of bytes to read for the currently selected pipe into the buffer.  Dean Camera committed Apr 01, 2009 780  * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback  Dean Camera committed Feb 23, 2009 781  *  Dean Camera committed Apr 22, 2009 782  * \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.  Dean Camera committed Feb 23, 2009 783 784 785  */ uint8_t Pipe_Write_Stream_BE(const void* Buffer, uint16_t Length #if !defined(NO_STREAM_CALLBACKS) || defined(__DOXYGEN__)  Dean Camera committed May 15, 2009 786  , StreamCallbackPtr_t Callback  Dean Camera committed Feb 23, 2009 787 788 789 790 791  #endif ) ATTR_NON_NULL_PTR_ARG(1); /** Reads and discards the given number of bytes from the pipe, discarding fully read packets from the host * as needed. The last packet is not automatically discarded once the remaining bytes has been read; the  Dean Camera committed Apr 22, 2009 792  * user is responsible for manually discarding the last packet from the device via the \ref Pipe_ClearIN() macro.  Dean Camera committed Feb 23, 2009 793 794 795  * Between each USB packet, the given stream callback function is executed repeatedly until the next packet is ready, * allowing for early aborts of stream transfers. *  Dean Camera committed Apr 22, 2009 796  * The callback routine should be created using the \ref STREAM_CALLBACK() macro. If the token  Dean Camera committed Feb 23, 2009 797  * NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are disabled  Dean Camera committed Apr 01, 2009 798  * and this function has the Callback parameter omitted.  Dean Camera committed Feb 23, 2009 799  *  Dean Camera committed Apr 16, 2009 800 801  * \ingroup Group_PipeRW *  Dean Camera committed Feb 23, 2009 802  * \param Length Number of bytes to send via the currently selected pipe.  Dean Camera committed Apr 01, 2009 803  * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback  Dean Camera committed Feb 23, 2009 804  *  Dean Camera committed Apr 22, 2009 805  * \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.  Dean Camera committed Feb 23, 2009 806 807 808  */ uint8_t Pipe_Discard_Stream(uint16_t Length #if !defined(NO_STREAM_CALLBACKS) || defined(__DOXYGEN__)  Dean Camera committed May 15, 2009 809  , StreamCallbackPtr_t Callback  Dean Camera committed Feb 23, 2009 810 811 812 813 814 815  #endif ); /** Reads the given number of bytes from the pipe into the given buffer in little endian, * sending full packets to the device as needed. The last packet filled is not automatically sent; * the user is responsible for manually sending the last written packet to the host via the  Dean Camera committed Apr 22, 2009 816  * \ref Pipe_ClearIN() macro. Between each USB packet, the given stream callback function is  Dean Camera committed Feb 23, 2009 817 818  * executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers. *  Dean Camera committed Apr 22, 2009 819  * The callback routine should be created using the \ref STREAM_CALLBACK() macro. If the token  Dean Camera committed Feb 23, 2009 820  * NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are disabled  Dean Camera committed Apr 01, 2009 821  * and this function has the Callback parameter omitted.  Dean Camera committed Feb 23, 2009 822  *  Dean Camera committed Apr 16, 2009 823 824  * \ingroup Group_PipeRW *  Dean Camera committed Feb 23, 2009 825 826  * \param Buffer Pointer to the source data buffer to write to. * \param Length Number of bytes to read for the currently selected pipe to read from.  Dean Camera committed Apr 01, 2009 827  * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback  Dean Camera committed Feb 23, 2009 828  *  Dean Camera committed Apr 22, 2009 829  * \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.  Dean Camera committed Feb 23, 2009 830 831 832  */ uint8_t Pipe_Read_Stream_LE(void* Buffer, uint16_t Length #if !defined(NO_STREAM_CALLBACKS) || defined(__DOXYGEN__)  Dean Camera committed May 15, 2009 833  , StreamCallbackPtr_t Callback  Dean Camera committed Feb 23, 2009 834 835 836 837 838 839  #endif ) ATTR_NON_NULL_PTR_ARG(1); /** Reads the given number of bytes from the pipe into the given buffer in big endian, * sending full packets to the device as needed. The last packet filled is not automatically sent; * the user is responsible for manually sending the last written packet to the host via the  Dean Camera committed Apr 22, 2009 840  * \ref Pipe_ClearIN() macro. Between each USB packet, the given stream callback function is  Dean Camera committed Feb 23, 2009 841 842  * executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers. *  Dean Camera committed Apr 22, 2009 843  * The callback routine should be created using the \ref STREAM_CALLBACK() macro. If the token  Dean Camera committed Feb 23, 2009 844  * NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are disabled  Dean Camera committed Apr 01, 2009 845  * and this function has the Callback parameter omitted.  Dean Camera committed Feb 23, 2009 846  *  Dean Camera committed Apr 16, 2009 847 848  * \ingroup Group_PipeRW *  Dean Camera committed Feb 23, 2009 849 850  * \param Buffer Pointer to the source data buffer to write to. * \param Length Number of bytes to read for the currently selected pipe to read from.  Dean Camera committed Apr 01, 2009 851  * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback  Dean Camera committed Feb 23, 2009 852  *  Dean Camera committed Apr 22, 2009 853  * \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.  Dean Camera committed Feb 23, 2009 854 855 856  */ uint8_t Pipe_Read_Stream_BE(void* Buffer, uint16_t Length #if !defined(NO_STREAM_CALLBACKS) || defined(__DOXYGEN__)  Dean Camera committed May 15, 2009 857  , StreamCallbackPtr_t Callback  Dean Camera committed Feb 23, 2009 858  #endif  Dean Camera committed Apr 16, 2009 859  ) ATTR_NON_NULL_PTR_ARG(1);  Dean Camera committed Feb 23, 2009 860 861 862 863  /* Private Interface - For use in library only: */ #if !defined(__DOXYGEN__) /* Macros: */  864  #define PIPE_TOKEN_MASK (0x03 << PTOKEN0)  Dean Camera committed Feb 23, 2009 865   Dean Camera committed May 04, 2009 866 867 868 869  #if !defined(ENDPOINT_CONTROLEP) #define ENDPOINT_CONTROLEP 0 #endif  Dean Camera committed Mar 04, 2009 870 871  #define Pipe_AllocateMemory() MACROS{ UPCFG1X |= (1 << ALLOC); }MACROE #define Pipe_DeallocateMemory() MACROS{ UPCFG1X &= ~(1 << ALLOC); }MACROE  Dean Camera committed Feb 23, 2009 872 873 874 875 876  /* Function Prototypes: */ void Pipe_ClearPipes(void); /* Inline Functions: */  Dean Camera committed Mar 04, 2009 877  static inline uint8_t Pipe_BytesToEPSizeMask(uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE;  Dean Camera committed Feb 23, 2009 878 879 880 881 882 883 884 885 886 887  static inline uint8_t Pipe_BytesToEPSizeMask(uint16_t Bytes) { if (Bytes <= 8) return (0 << EPSIZE0); else if (Bytes <= 16) return (1 << EPSIZE0); else if (Bytes <= 32) return (2 << EPSIZE0); else if (Bytes <= 64) return (3 << EPSIZE0);  888  else if (Bytes <= 128)  Dean Camera committed Feb 23, 2009 889 890 891 892 893 894 895 896 897 898 899  return (4 << EPSIZE0); else return (5 << EPSIZE0); }; #endif /* Disable C linkage for C++ Compilers: */ #if defined(__cplusplus) } #endif  Dean Camera committed Apr 16, 2009 900   Dean Camera committed Feb 23, 2009 901 #endif  Dean Camera committed Apr 16, 2009 902 903  /** @} */