LPCOpen Platform
LPCOpen Platform for NXP LPC Microcontrollers
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Pipe_LPC.h
Go to the documentation of this file.
1 /*
2  * @brief USB Pipe definitions for the LPC microcontrollers
3  *
4  * @note
5  * Copyright(C) NXP Semiconductors, 2012
6  * All rights reserved.
7  *
8  * @par
9  * Software that is described herein is for illustrative purposes only
10  * which provides customers with programming information regarding the
11  * LPC products. This software is supplied "AS IS" without any warranties of
12  * any kind, and NXP Semiconductors and its licensor disclaim any and
13  * all warranties, express or implied, including all implied warranties of
14  * merchantability, fitness for a particular purpose and non-infringement of
15  * intellectual property rights. NXP Semiconductors assumes no responsibility
16  * or liability for the use of the software, conveys no license or rights under any
17  * patent, copyright, mask work right, or any other intellectual property rights in
18  * or to any products. NXP Semiconductors reserves the right to make changes
19  * in the software without notification. NXP Semiconductors also makes no
20  * representation or warranty that such application will be suitable for the
21  * specified use without further testing or modification.
22  *
23  * @par
24  * Permission to use, copy, modify, and distribute this software and its
25  * documentation is hereby granted, under NXP Semiconductors' and its
26  * licensor's relevant copyrights in the software, without fee, provided that it
27  * is used in conjunction with NXP Semiconductors microcontrollers. This
28  * copyright, permission, and disclaimer notice must appear in all copies of
29  * this code.
30  */
31 
75 #ifndef __PIPE_LPC_H__
76 #define __PIPE_LPC_H__
77 
78 /* Includes: */
79  #include "../../../../Common/Common.h"
80  #include "../USBTask.h"
81  #include "HCD/HCD.h"
82  #include "../USBMemory.h" // FIXME move later
83  #include <stdbool.h>
84 
85 /* Enable C linkage for C++ Compilers: */
86  #if defined(__cplusplus)
87 extern "C" {
88  #endif
89 
90 /* Preprocessor Checks: */
91  #if !defined(__INCLUDE_FROM_USB_DRIVER)
92  #error Do not include this file directly. Include lpcroot/libraries/LPCUSBlib/Drivers/USB/USB.h instead.
93  #endif
94 
95 /* Public Interface - May be used in end-application: */
96 /* Macros: */
98 // @{
100  #define PIPE_ERRORFLAG_OVERFLOW (1 << 6)
101 
103  #define PIPE_ERRORFLAG_UNDERFLOW (1 << 5)
104 
106  #define PIPE_ERRORFLAG_CRC16 (1 << 4)
107 
109  #define PIPE_ERRORFLAG_TIMEOUT (1 << 3)
110 
112  #define PIPE_ERRORFLAG_PID (1 << 2)
113 
115  #define PIPE_ERRORFLAG_DATAPID (1 << 1)
116 
118  #define PIPE_ERRORFLAG_DATATGL (1 << 0)
119 
120 
126  #define PIPE_TOKEN_SETUP (0)
127 
131  #define PIPE_TOKEN_IN (1)
132 
136  #define PIPE_TOKEN_OUT (2)
137 
138 
145  #define PIPE_BANK_SINGLE (0 << 1)
146 
152  #define PIPE_BANK_DOUBLE (1 << 1)
153 
154 
158  #define PIPE_CONTROLPIPE_DEFAULT_SIZE 8
159 
164  #define PIPE_TOTAL_PIPES HCD_MAX_ENDPOINT
165 
171  #define PIPE_MAX_SIZE 512
172 
173 /* Enums: */
186 };
187 
188 typedef struct {
190  uint8_t *Buffer;
191  uint16_t BufferSize;
192  uint16_t StartIdx;
193  uint16_t ByteTransfered;
194  uint8_t EndponitAddress; /* with direction */
196 
197 extern uint8_t hostselected;
199 
200 extern uint8_t pipeselected[MAX_USB_CORE];
201 extern USB_Pipe_Data_t PipeInfo[MAX_USB_CORE][PIPE_TOTAL_PIPES];
202 
203 /* Inline Functions: */
215 static inline uint16_t Pipe_BytesInPipe(const uint8_t corenum) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
216 
217 static inline uint16_t Pipe_BytesInPipe(const uint8_t corenum)
218 {
219  return PipeInfo[corenum][pipeselected[corenum]].ByteTransfered - PipeInfo[corenum][pipeselected[corenum]].StartIdx;
220 }
221 
229 static inline uint8_t Pipe_GetCurrentPipe(const uint8_t corenum) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
230 
231 static inline uint8_t Pipe_GetCurrentPipe(const uint8_t corenum)
232 {
233  return pipeselected[corenum];
234 }
235 
244 static inline void Pipe_SelectPipe(const uint8_t corenum, const uint8_t PipeNumber) ATTR_ALWAYS_INLINE;
245 
246 static inline void Pipe_SelectPipe(const uint8_t corenum, const uint8_t PipeNumber)
247 {
248  pipeselected[corenum] = PipeNumber;
249 }
250 
257 static inline void Pipe_ResetPipe(const uint8_t corenum, const uint8_t PipeNumber) ATTR_ALWAYS_INLINE;
258 
259 static inline void Pipe_ResetPipe(const uint8_t corenum, const uint8_t PipeNumber)
260 {
261  PipeInfo[corenum][pipeselected[corenum]].StartIdx = PipeInfo[corenum][pipeselected[corenum]].ByteTransfered = 0;
262 }
263 
269 static inline void Pipe_EnablePipe(void) ATTR_ALWAYS_INLINE;
270 
271 static inline void Pipe_EnablePipe(void)
272 {
273  // TODO implement later
274 }
275 
279 static inline void Pipe_DisablePipe(void) ATTR_ALWAYS_INLINE;
280 
281 static inline void Pipe_DisablePipe(void)
282 {
283  // TODO implement later
284 }
285 
290 static inline bool Pipe_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
291 
292 static inline bool Pipe_IsEnabled(void)
293 {
294  // TODO implement later
295  return true;
296 }
297 
303 static inline uint8_t Pipe_GetPipeToken(const uint8_t corenum) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
304 
305 static inline uint8_t Pipe_GetPipeToken(const uint8_t corenum)
306 {
307  return (PipeInfo[corenum][pipeselected[corenum]].EndponitAddress &
309 }
310 
320 static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_DEPRECATED ATTR_ALWAYS_INLINE;
321 
322 static inline void Pipe_SetPipeToken(const uint8_t Token)
323 {}
324 
326 static inline void Pipe_SetInfiniteINRequests(void) ATTR_DEPRECATED ATTR_ALWAYS_INLINE;
327 
328 static inline void Pipe_SetInfiniteINRequests(void)
329 {}
330 
338 static inline void Pipe_SetFiniteINRequests(const uint8_t TotalINRequests) ATTR_DEPRECATED ATTR_ALWAYS_INLINE;
339 
340 static inline void Pipe_SetFiniteINRequests(const uint8_t TotalINRequests)
341 {}
342 
348 static inline bool Pipe_IsConfigured(const uint8_t corenum) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
349 
350 static inline bool Pipe_IsConfigured(const uint8_t corenum)
351 {
352  return PipeInfo[corenum][pipeselected[corenum]].Buffer != NULL; // TODO implement using status later
353 }
354 
362 static inline uint8_t Pipe_GetBoundEndpointAddress(const uint8_t corenum) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
363 
364 static inline uint8_t Pipe_GetBoundEndpointAddress(const uint8_t corenum)
365 {
366  return PipeInfo[corenum][pipeselected[corenum]].EndponitAddress;
367 }
368 
374 static inline void Pipe_SetInterruptPeriod(const uint8_t Milliseconds) ATTR_ALWAYS_INLINE;
375 
376 static inline void Pipe_SetInterruptPeriod(const uint8_t Milliseconds)
377 {
378  // TODO implement later
379 }
380 
386 static inline uint8_t Pipe_GetPipeInterrupts(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
387 
388 static inline uint8_t Pipe_GetPipeInterrupts(void)
389 {
390  return 0; // TODO implement later
391 }
392 
400 static inline bool Pipe_HasPipeInterrupted(const uint8_t PipeNumber) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
401 
402 static inline bool Pipe_HasPipeInterrupted(const uint8_t PipeNumber)
403 {
404  return false; // TODO implement later
405 }
406 
408 static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE;
409 
410 static inline void Pipe_Unfreeze(void)
411 {
412  // TODO implement later
413 }
414 
416 static inline void Pipe_Freeze(void) ATTR_ALWAYS_INLINE;
417 
418 static inline void Pipe_Freeze(void)
419 {
420  // TODO implement later
421 }
422 
427 static inline bool Pipe_IsFrozen(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
428 
429 static inline bool Pipe_IsFrozen(void)
430 {
431  return false; // TODO implement later
432 }
433 
435 static inline void Pipe_ClearError(void) ATTR_ALWAYS_INLINE;
436 
437 static inline void Pipe_ClearError(void)
438 {
439  // TODO implement later
440 }
441 
450 static inline bool Pipe_IsError(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
451 
452 static inline bool Pipe_IsError(void)
453 {
454  return false; // TODO implement later
455 }
456 
463 static inline uint8_t Pipe_GetErrorFlags(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
464 
465 static inline uint8_t Pipe_GetErrorFlags(void)
466 {
467  return 0; // TODO implement later
468 }
469 
479 static inline uint8_t Pipe_GetBusyBanks(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
480 
481 static inline uint8_t Pipe_GetBusyBanks(void)
482 {
483  return 0; // TODO implement later
484 }
485 
494 // static inline bool Pipe_IsINReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
495 bool Pipe_IsINReceived(const uint8_t corenum) ATTR_WARN_UNUSED_RESULT;
496 
505 static inline bool Pipe_IsOUTReady(const uint8_t corenum) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
506 
507 static inline bool Pipe_IsOUTReady(const uint8_t corenum)
508 {
509  return (HcdGetPipeStatus(PipeInfo[corenum][pipeselected[corenum]].PipeHandle) == HCD_STATUS_OK)
510  && (PipeInfo[corenum][pipeselected[corenum]].ByteTransfered <
511  PipeInfo[corenum][pipeselected[corenum]].BufferSize);
512 }
513 
529 static inline bool Pipe_IsReadWriteAllowed(const uint8_t corenum) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
530 
531 static inline bool Pipe_IsReadWriteAllowed(const uint8_t corenum)
532 {
533  if (Pipe_GetPipeToken(corenum) == PIPE_TOKEN_IN) {
534  return (HCD_STATUS_OK == HcdGetPipeStatus(PipeInfo[corenum][pipeselected[corenum]].PipeHandle)) &&
535  Pipe_BytesInPipe(corenum);
536  }
537  else {
538  return Pipe_IsOUTReady(corenum);
539  }
540 }
541 
550 static inline bool Pipe_IsSETUPSent(void) ATTR_DEPRECATED ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
551 
552 static inline bool Pipe_IsSETUPSent(void)
553 {
554  return true;
555 }
556 
561 static inline void Pipe_ClearSETUP(void) ATTR_DEPRECATED ATTR_ALWAYS_INLINE;
562 
563 static inline void Pipe_ClearSETUP(void)
564 {}
565 
572 static inline void Pipe_ClearIN(const uint8_t corenum) ATTR_ALWAYS_INLINE;
573 
574 static inline void Pipe_ClearIN(const uint8_t corenum)
575 {
576  PipeInfo[corenum][pipeselected[corenum]].StartIdx = PipeInfo[corenum][pipeselected[corenum]].ByteTransfered = 0;
577 }
578 
585 static inline void Pipe_ClearOUT(const uint8_t corenum) ATTR_ALWAYS_INLINE;
586 
587 static inline void Pipe_ClearOUT(const uint8_t corenum)
588 {
589  HcdDataTransfer(PipeInfo[corenum][pipeselected[corenum]].PipeHandle,
590  PipeInfo[corenum][pipeselected[corenum]].Buffer,
591  PipeInfo[corenum][pipeselected[corenum]].ByteTransfered,
592  NULL /* FIXME &PipeInfo[pipeselected].ByteTransfered*/);
593  PipeInfo[corenum][pipeselected[corenum]].StartIdx = PipeInfo[corenum][pipeselected[corenum]].ByteTransfered = 0;
594 }
595 
607 static inline bool Pipe_IsNAKReceived(void) ATTR_DEPRECATED ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
608 
609 static inline bool Pipe_IsNAKReceived(void)
610 {
611  return false;
612 }
613 
620 static inline void Pipe_ClearNAKReceived(void) ATTR_DEPRECATED ATTR_ALWAYS_INLINE;
621 
622 static inline void Pipe_ClearNAKReceived(void)
623 {}
624 
633 static inline bool Pipe_IsStalled(const uint8_t corenum) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
634 
635 static inline bool Pipe_IsStalled(const uint8_t corenum)
636 {
637  return HcdGetPipeStatus(PipeInfo[corenum][pipeselected[corenum]].PipeHandle) == HCD_STATUS_TRANSFER_Stall;
638 }
639 
646 static inline void Pipe_ClearStall(const uint8_t corenum) ATTR_ALWAYS_INLINE;
647 
648 static inline void Pipe_ClearStall(const uint8_t corenum)
649 {
650  HcdClearEndpointHalt(PipeInfo[corenum][pipeselected[corenum]].PipeHandle);
651 }
652 
661 static inline uint8_t Pipe_Read_8(const uint8_t corenum) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
662 
663 static inline uint8_t Pipe_Read_8(const uint8_t corenum)
664 {
665  if (PipeInfo[corenum][pipeselected[corenum]].StartIdx < PipeInfo[corenum][pipeselected[corenum]].ByteTransfered ) {
666  uint8_t temp =
667  PipeInfo[corenum][pipeselected[corenum]].Buffer[PipeInfo[corenum][pipeselected[corenum]].StartIdx];
668  PipeInfo[corenum][pipeselected[corenum]].StartIdx++;
669  return temp;
670  }
671  else {
672  return 0;
673  }
674 }
675 
685 static inline void Pipe_Write_8(const uint8_t corenum, const uint8_t Data) ATTR_ALWAYS_INLINE;
686 
687 static inline void Pipe_Write_8(const uint8_t corenum, const uint8_t Data)
688 {
689  if (PipeInfo[corenum][pipeselected[corenum]].ByteTransfered <
690  PipeInfo[corenum][pipeselected[corenum]].BufferSize) {
691  PipeInfo[corenum][pipeselected[corenum]].Buffer[PipeInfo[corenum][pipeselected[corenum]].ByteTransfered] = Data;
692  PipeInfo[corenum][pipeselected[corenum]].ByteTransfered++;
693  }
694 }
695 
700 static inline void Pipe_Discard_8(void) ATTR_ALWAYS_INLINE;
701 
702 static inline void Pipe_Discard_8(void)
703 {}
704 
714 static inline uint16_t Pipe_Read_16_LE(const uint8_t corenum) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
715 
716 static inline uint16_t Pipe_Read_16_LE(const uint8_t corenum)
717 {
718  uint16_t tem = 0;
719  uint8_t tem1, tem2;
720 
721  tem1 = Pipe_Read_8(corenum);
722  tem2 = Pipe_Read_8(corenum);
723  tem = (tem2 << 8) | tem1;
724  return tem;
725 }
726 
736 static inline uint16_t Pipe_Read_16_BE(const uint8_t corenum) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
737 
738 static inline uint16_t Pipe_Read_16_BE(const uint8_t corenum)
739 {
740  uint16_t tem = 0;
741  uint8_t tem1, tem2;
742 
743  tem1 = Pipe_Read_8(corenum);
744  tem2 = Pipe_Read_8(corenum);
745  tem = (tem1 << 8) | tem2;
746  return tem;
747 }
748 
759 static inline void Pipe_Write_16_LE(const uint8_t corenum, const uint16_t Data) ATTR_ALWAYS_INLINE;
760 
761 static inline void Pipe_Write_16_LE(const uint8_t corenum, const uint16_t Data)
762 {
763  Pipe_Write_8(corenum, Data & 0xFF);
764  Pipe_Write_8(corenum, (Data >> 8) & 0xFF);
765 }
766 
777 static inline void Pipe_Write_16_BE(const uint8_t corenum, const uint16_t Data) ATTR_ALWAYS_INLINE;
778 
779 static inline void Pipe_Write_16_BE(const uint8_t corenum, const uint16_t Data)
780 {
781  Pipe_Write_8(corenum, (Data >> 8) & 0xFF);
782  Pipe_Write_8(corenum, Data & 0xFF);
783 }
784 
789 static inline void Pipe_Discard_16(void) ATTR_ALWAYS_INLINE;
790 
791 static inline void Pipe_Discard_16(void)
792 {}
793 
803 static inline uint32_t Pipe_Read_32_LE(const uint8_t corenum) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
804 
805 static inline uint32_t Pipe_Read_32_LE(const uint8_t corenum)
806 {
807  uint32_t tem = 0;
808  uint8_t tem1, tem2, tem3, tem4;
809 
810  tem1 = Pipe_Read_8(corenum);
811  tem2 = Pipe_Read_8(corenum);
812  tem3 = Pipe_Read_8(corenum);
813  tem4 = Pipe_Read_8(corenum);
814  tem = (tem4 << 24) | (tem3 << 16) | (tem2 << 8) | tem1;
815  return tem;
816 }
817 
827 static inline uint32_t Pipe_Read_32_BE(const uint8_t corenum) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
828 
829 static inline uint32_t Pipe_Read_32_BE(const uint8_t corenum)
830 {
831  uint32_t tem = 0;
832  uint8_t tem1, tem2, tem3, tem4;
833 
834  tem1 = Pipe_Read_8(corenum);
835  tem2 = Pipe_Read_8(corenum);
836  tem3 = Pipe_Read_8(corenum);
837  tem4 = Pipe_Read_8(corenum);
838  tem = (tem1 << 24) | (tem2 << 16) | (tem3 << 8) | tem4;
839  return tem;
840 }
841 
852 static inline void Pipe_Write_32_LE(const uint8_t corenum, const uint32_t Data) ATTR_ALWAYS_INLINE;
853 
854 static inline void Pipe_Write_32_LE(const uint8_t corenum, const uint32_t Data)
855 {
856  Pipe_Write_8(corenum, Data & 0xFF);
857  Pipe_Write_8(corenum, (Data >> 8) & 0xFF);
858  Pipe_Write_8(corenum, (Data >> 16) & 0xFF);
859  Pipe_Write_8(corenum, (Data >> 24) & 0xFF);
860 }
861 
872 static inline void Pipe_Write_32_BE(const uint8_t corenum, const uint32_t Data) ATTR_ALWAYS_INLINE;
873 
874 static inline void Pipe_Write_32_BE(const uint8_t corenum, const uint32_t Data)
875 {
876  Pipe_Write_8(corenum, (Data >> 24) & 0xFF);
877  Pipe_Write_8(corenum, (Data >> 16) & 0xFF);
878  Pipe_Write_8(corenum, (Data >> 8) & 0xFF);
879  Pipe_Write_8(corenum, Data & 0xFF);
880 }
881 
886 static inline void Pipe_Discard_32(void) ATTR_ALWAYS_INLINE;
887 
888 static inline void Pipe_Discard_32(void)
889 {}
890 
891 /* External Variables: */
901 /* Function Prototypes: */
943 bool Pipe_ConfigurePipe(const uint8_t corenum,
944  const uint8_t Number,
945  const uint8_t Type,
946  const uint8_t Token,
947  const uint8_t EndpointNumber,
948  const uint16_t Size,
949  const uint8_t Banks);
950 
951 void Pipe_ClosePipe(const uint8_t corenum, uint8_t pipenum);
952 
961 uint8_t Pipe_WaitUntilReady(const uint8_t corenum);
962 
972 
973 /* Private Interface - For use in library only: */
974  #if !defined(__DOXYGEN__)
975 /* Macros: */
976  #if !defined(ENDPOINT_CONTROLEP)
977  #define ENDPOINT_CONTROLEP 0
978  #endif
979 
980 /* Inline Functions: */
981 static inline uint8_t Pipe_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST
983 
984 static inline uint8_t Pipe_BytesToEPSizeMask(const uint16_t Bytes)
985 {
986  return 0; // implement later
987 }
988 
989 /* Function Prototypes: */
990 void Pipe_ClearPipes(void);
991 
992  #endif
993 
994 /* Disable C linkage for C++ Compilers: */
995  #if defined(__cplusplus)
996 }
997  #endif
998 
999 #endif
1000