35 typedef enum _EP_DBUF_DIR
52 #define RegBase (0x40005C00L)
53 #define PMAAddr (0x40006000L)
60 #define CNTR ((__IO unsigned *)(RegBase + 0x40))
62 #define ISTR ((__IO unsigned *)(RegBase + 0x44))
64 #define FNR ((__IO unsigned *)(RegBase + 0x48))
66 #define DADDR ((__IO unsigned *)(RegBase + 0x4C))
68 #define BTABLE ((__IO unsigned *)(RegBase + 0x50))
72 #define EP0REG ((__IO unsigned *)(RegBase))
75 #define EP0_OUT ((uint8_t)0x00)
76 #define EP0_IN ((uint8_t)0x80)
77 #define EP1_OUT ((uint8_t)0x01)
78 #define EP1_IN ((uint8_t)0x81)
79 #define EP2_OUT ((uint8_t)0x02)
80 #define EP2_IN ((uint8_t)0x82)
81 #define EP3_OUT ((uint8_t)0x03)
82 #define EP3_IN ((uint8_t)0x83)
83 #define EP4_OUT ((uint8_t)0x04)
84 #define EP4_IN ((uint8_t)0x84)
85 #define EP5_OUT ((uint8_t)0x05)
86 #define EP5_IN ((uint8_t)0x85)
87 #define EP6_OUT ((uint8_t)0x06)
88 #define EP6_IN ((uint8_t)0x86)
89 #define EP7_OUT ((uint8_t)0x07)
90 #define EP7_IN ((uint8_t)0x87)
93 #define ENDP0 ((uint8_t)0)
94 #define ENDP1 ((uint8_t)1)
95 #define ENDP2 ((uint8_t)2)
96 #define ENDP3 ((uint8_t)3)
97 #define ENDP4 ((uint8_t)4)
98 #define ENDP5 ((uint8_t)5)
99 #define ENDP6 ((uint8_t)6)
100 #define ENDP7 ((uint8_t)7)
105 #define ISTR_CTR (0x8000)
106 #define ISTR_DOVR (0x4000)
107 #define ISTR_ERR (0x2000)
108 #define ISTR_WKUP (0x1000)
109 #define ISTR_SUSP (0x0800)
110 #define ISTR_RESET (0x0400)
111 #define ISTR_SOF (0x0200)
112 #define ISTR_ESOF (0x0100)
115 #define ISTR_DIR (0x0010)
116 #define ISTR_EP_ID (0x000F)
118 #define CLR_CTR (~ISTR_CTR)
119 #define CLR_DOVR (~ISTR_DOVR)
120 #define CLR_ERR (~ISTR_ERR)
121 #define CLR_WKUP (~ISTR_WKUP)
122 #define CLR_SUSP (~ISTR_SUSP)
123 #define CLR_RESET (~ISTR_RESET)
124 #define CLR_SOF (~ISTR_SOF)
125 #define CLR_ESOF (~ISTR_ESOF)
130 #define CNTR_CTRM (0x8000)
131 #define CNTR_DOVRM (0x4000)
132 #define CNTR_ERRM (0x2000)
133 #define CNTR_WKUPM (0x1000)
134 #define CNTR_SUSPM (0x0800)
135 #define CNTR_RESETM (0x0400)
136 #define CNTR_SOFM (0x0200)
137 #define CNTR_ESOFM (0x0100)
140 #define CNTR_RESUME (0x0010)
141 #define CNTR_FSUSP (0x0008)
142 #define CNTR_LPMODE (0x0004)
143 #define CNTR_PDWN (0x0002)
144 #define CNTR_FRES (0x0001)
149 #define FNR_RXDP (0x8000)
150 #define FNR_RXDM (0x4000)
151 #define FNR_LCK (0x2000)
152 #define FNR_LSOF (0x1800)
153 #define FNR_FN (0x07FF)
157 #define DADDR_EF (0x80)
158 #define DADDR_ADD (0x7F)
163 #define EP_CTR_RX (0x8000)
164 #define EP_DTOG_RX (0x4000)
165 #define EPRX_STAT (0x3000)
166 #define EP_SETUP (0x0800)
167 #define EP_T_FIELD (0x0600)
168 #define EP_KIND (0x0100)
169 #define EP_CTR_TX (0x0080)
170 #define EP_DTOG_TX (0x0040)
171 #define EPTX_STAT (0x0030)
172 #define EPADDR_FIELD (0x000F)
175 #define EPREG_MASK (EP_CTR_RX|EP_SETUP|EP_T_FIELD|EP_KIND|EP_CTR_TX|EPADDR_FIELD)
178 #define EP_TYPE_MASK (0x0600)
179 #define EP_BULK (0x0000)
180 #define EP_CONTROL (0x0200)
181 #define EP_ISOCHRONOUS (0x0400)
182 #define EP_INTERRUPT (0x0600)
183 #define EP_T_MASK (~EP_T_FIELD & EPREG_MASK)
187 #define EPKIND_MASK (~EP_KIND & EPREG_MASK)
190 #define EP_TX_DIS (0x0000)
191 #define EP_TX_STALL (0x0010)
192 #define EP_TX_NAK (0x0020)
193 #define EP_TX_VALID (0x0030)
194 #define EPTX_DTOG1 (0x0010)
195 #define EPTX_DTOG2 (0x0020)
196 #define EPTX_DTOGMASK (EPTX_STAT|EPREG_MASK)
199 #define EP_RX_DIS (0x0000)
200 #define EP_RX_STALL (0x1000)
201 #define EP_RX_NAK (0x2000)
202 #define EP_RX_VALID (0x3000)
203 #define EPRX_DTOG1 (0x1000)
204 #define EPRX_DTOG2 (0x2000)
205 #define EPRX_DTOGMASK (EPRX_STAT|EPREG_MASK)
208 #define _SetCNTR(wRegValue) (*CNTR = (uint16_t)wRegValue)
211 #define _SetISTR(wRegValue) (*ISTR = (uint16_t)wRegValue)
214 #define _SetDADDR(wRegValue) (*DADDR = (uint16_t)wRegValue)
217 #define _SetBTABLE(wRegValue)(*BTABLE = (uint16_t)(wRegValue & 0xFFF8))
220 #define _GetCNTR() ((uint16_t) *CNTR)
223 #define _GetISTR() ((uint16_t) *ISTR)
226 #define _GetFNR() ((uint16_t) *FNR)
229 #define _GetDADDR() ((uint16_t) *DADDR)
232 #define _GetBTABLE() ((uint16_t) *BTABLE)
235 #define _SetENDPOINT(bEpNum,wRegValue) (*(EP0REG + bEpNum)= \
239 #define _GetENDPOINT(bEpNum) ((uint16_t)(*(EP0REG + bEpNum)))
249 #define _SetEPType(bEpNum,wType) (_SetENDPOINT(bEpNum,\
250 ((_GetENDPOINT(bEpNum) & EP_T_MASK) | wType )))
259 #define _GetEPType(bEpNum) (_GetENDPOINT(bEpNum) & EP_T_FIELD)
269 #define _SetEPTxStatus(bEpNum,wState) {\
270 register uint16_t _wRegVal; \
271 _wRegVal = _GetENDPOINT(bEpNum) & EPTX_DTOGMASK;\
273 if((EPTX_DTOG1 & wState)!= 0) \
274 _wRegVal ^= EPTX_DTOG1; \
276 if((EPTX_DTOG2 & wState)!= 0) \
277 _wRegVal ^= EPTX_DTOG2; \
278 _SetENDPOINT(bEpNum, (_wRegVal | EP_CTR_RX|EP_CTR_TX)); \
289 #define _SetEPRxStatus(bEpNum,wState) {\
290 register uint16_t _wRegVal; \
292 _wRegVal = _GetENDPOINT(bEpNum) & EPRX_DTOGMASK;\
294 if((EPRX_DTOG1 & wState)!= 0) \
295 _wRegVal ^= EPRX_DTOG1; \
297 if((EPRX_DTOG2 & wState)!= 0) \
298 _wRegVal ^= EPRX_DTOG2; \
299 _SetENDPOINT(bEpNum, (_wRegVal | EP_CTR_RX|EP_CTR_TX)); \
311 #define _SetEPRxTxStatus(bEpNum,wStaterx,wStatetx) {\
312 register uint32_t _wRegVal; \
314 _wRegVal = _GetENDPOINT(bEpNum) & (EPRX_DTOGMASK |EPTX_STAT) ;\
316 if((EPRX_DTOG1 & wStaterx)!= 0) \
317 _wRegVal ^= EPRX_DTOG1; \
319 if((EPRX_DTOG2 & wStaterx)!= 0) \
320 _wRegVal ^= EPRX_DTOG2; \
322 if((EPTX_DTOG1 & wStatetx)!= 0) \
323 _wRegVal ^= EPTX_DTOG1; \
325 if((EPTX_DTOG2 & wStatetx)!= 0) \
326 _wRegVal ^= EPTX_DTOG2; \
327 _SetENDPOINT(bEpNum, _wRegVal | EP_CTR_RX|EP_CTR_TX); \
337 #define _GetEPTxStatus(bEpNum) ((uint16_t)_GetENDPOINT(bEpNum) & EPTX_STAT)
339 #define _GetEPRxStatus(bEpNum) ((uint16_t)_GetENDPOINT(bEpNum) & EPRX_STAT)
348 #define _SetEPTxValid(bEpNum) (_SetEPTxStatus(bEpNum, EP_TX_VALID))
350 #define _SetEPRxValid(bEpNum) (_SetEPRxStatus(bEpNum, EP_RX_VALID))
359 #define _GetTxStallStatus(bEpNum) (_GetEPTxStatus(bEpNum) \
361 #define _GetRxStallStatus(bEpNum) (_GetEPRxStatus(bEpNum) \
371 #define _SetEP_KIND(bEpNum) (_SetENDPOINT(bEpNum, \
372 (EP_CTR_RX|EP_CTR_TX|((_GetENDPOINT(bEpNum) | EP_KIND) & EPREG_MASK))))
373 #define _ClearEP_KIND(bEpNum) (_SetENDPOINT(bEpNum, \
374 (EP_CTR_RX|EP_CTR_TX|(_GetENDPOINT(bEpNum) & EPKIND_MASK))))
383 #define _Set_Status_Out(bEpNum) _SetEP_KIND(bEpNum)
384 #define _Clear_Status_Out(bEpNum) _ClearEP_KIND(bEpNum)
393 #define _SetEPDoubleBuff(bEpNum) _SetEP_KIND(bEpNum)
394 #define _ClearEPDoubleBuff(bEpNum) _ClearEP_KIND(bEpNum)
403 #define _ClearEP_CTR_RX(bEpNum) (_SetENDPOINT(bEpNum,\
404 _GetENDPOINT(bEpNum) & 0x7FFF & EPREG_MASK))
405 #define _ClearEP_CTR_TX(bEpNum) (_SetENDPOINT(bEpNum,\
406 _GetENDPOINT(bEpNum) & 0xFF7F & EPREG_MASK))
415 #define _ToggleDTOG_RX(bEpNum) (_SetENDPOINT(bEpNum, \
416 EP_CTR_RX|EP_CTR_TX|EP_DTOG_RX | (_GetENDPOINT(bEpNum) & EPREG_MASK)))
417 #define _ToggleDTOG_TX(bEpNum) (_SetENDPOINT(bEpNum, \
418 EP_CTR_RX|EP_CTR_TX|EP_DTOG_TX | (_GetENDPOINT(bEpNum) & EPREG_MASK)))
427 #define _ClearDTOG_RX(bEpNum) if((_GetENDPOINT(bEpNum) & EP_DTOG_RX) != 0)\
428 _ToggleDTOG_RX(bEpNum)
429 #define _ClearDTOG_TX(bEpNum) if((_GetENDPOINT(bEpNum) & EP_DTOG_TX) != 0)\
430 _ToggleDTOG_TX(bEpNum)
439 #define _SetEPAddress(bEpNum,bAddr) _SetENDPOINT(bEpNum,\
440 EP_CTR_RX|EP_CTR_TX|(_GetENDPOINT(bEpNum) & EPREG_MASK) | bAddr)
449 #define _GetEPAddress(bEpNum) ((uint8_t)(_GetENDPOINT(bEpNum) & EPADDR_FIELD))
451 #define _pEPTxAddr(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8 )*2 + PMAAddr))
452 #define _pEPTxCount(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8+2)*2 + PMAAddr))
453 #define _pEPRxAddr(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8+4)*2 + PMAAddr))
454 #define _pEPRxCount(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8+6)*2 + PMAAddr))
464 #define _SetEPTxAddr(bEpNum,wAddr) (*_pEPTxAddr(bEpNum) = ((wAddr >> 1) << 1))
465 #define _SetEPRxAddr(bEpNum,wAddr) (*_pEPRxAddr(bEpNum) = ((wAddr >> 1) << 1))
474 #define _GetEPTxAddr(bEpNum) ((uint16_t)*_pEPTxAddr(bEpNum))
475 #define _GetEPRxAddr(bEpNum) ((uint16_t)*_pEPRxAddr(bEpNum))
485 #define _BlocksOf32(dwReg,wCount,wNBlocks) {\
486 wNBlocks = wCount >> 5;\
487 if((wCount & 0x1f) == 0)\
489 *pdwReg = (uint32_t)((wNBlocks << 10) | 0x8000);\
492 #define _BlocksOf2(dwReg,wCount,wNBlocks) {\
493 wNBlocks = wCount >> 1;\
494 if((wCount & 0x1) != 0)\
496 *pdwReg = (uint32_t)(wNBlocks << 10);\
499 #define _SetEPCountRxReg(dwReg,wCount) {\
501 if(wCount > 62){_BlocksOf32(dwReg,wCount,wNBlocks);}\
502 else {_BlocksOf2(dwReg,wCount,wNBlocks);}\
507 #define _SetEPRxDblBuf0Count(bEpNum,wCount) {\
508 uint32_t *pdwReg = _pEPTxCount(bEpNum); \
509 _SetEPCountRxReg(pdwReg, wCount);\
519 #define _SetEPTxCount(bEpNum,wCount) (*_pEPTxCount(bEpNum) = wCount)
520 #define _SetEPRxCount(bEpNum,wCount) {\
521 uint32_t *pdwReg = _pEPRxCount(bEpNum); \
522 _SetEPCountRxReg(pdwReg, wCount);\
531 #define _GetEPTxCount(bEpNum)((uint16_t)(*_pEPTxCount(bEpNum)) & 0x3ff)
532 #define _GetEPRxCount(bEpNum)((uint16_t)(*_pEPRxCount(bEpNum)) & 0x3ff)
542 #define _SetEPDblBuf0Addr(bEpNum,wBuf0Addr) {_SetEPTxAddr(bEpNum, wBuf0Addr);}
543 #define _SetEPDblBuf1Addr(bEpNum,wBuf1Addr) {_SetEPRxAddr(bEpNum, wBuf1Addr);}
554 #define _SetEPDblBuffAddr(bEpNum,wBuf0Addr,wBuf1Addr) { \
555 _SetEPDblBuf0Addr(bEpNum, wBuf0Addr);\
556 _SetEPDblBuf1Addr(bEpNum, wBuf1Addr);\
566 #define _GetEPDblBuf0Addr(bEpNum) (_GetEPTxAddr(bEpNum))
567 #define _GetEPDblBuf1Addr(bEpNum) (_GetEPRxAddr(bEpNum))
579 #define _SetEPDblBuf0Count(bEpNum, bDir, wCount) { \
580 if(bDir == EP_DBUF_OUT)\
582 {_SetEPRxDblBuf0Count(bEpNum,wCount);} \
583 else if(bDir == EP_DBUF_IN)\
585 *_pEPTxCount(bEpNum) = (uint32_t)wCount; \
588 #define _SetEPDblBuf1Count(bEpNum, bDir, wCount) { \
589 if(bDir == EP_DBUF_OUT)\
591 {_SetEPRxCount(bEpNum,wCount);}\
592 else if(bDir == EP_DBUF_IN)\
594 *_pEPRxCount(bEpNum) = (uint32_t)wCount; \
597 #define _SetEPDblBuffCount(bEpNum, bDir, wCount) {\
598 _SetEPDblBuf0Count(bEpNum, bDir, wCount); \
599 _SetEPDblBuf1Count(bEpNum, bDir, wCount); \
609 #define _GetEPDblBuf0Count(bEpNum) (_GetEPTxCount(bEpNum))
610 #define _GetEPDblBuf1Count(bEpNum) (_GetEPRxCount(bEpNum))
614 extern __IO uint16_t wIstr;
617 void SetCNTR(uint16_t );
618 void SetISTR(uint16_t );
619 void SetDADDR(uint16_t );
620 void SetBTABLE(uint16_t );
621 uint16_t GetCNTR(
void);
622 uint16_t GetISTR(
void);
623 uint16_t GetFNR(
void);
624 uint16_t GetDADDR(
void);
625 uint16_t GetBTABLE(
void);
626 void SetENDPOINT(uint8_t , uint16_t );
627 uint16_t GetENDPOINT(uint8_t );
628 void SetEPType(uint8_t , uint16_t );
629 uint16_t GetEPType(uint8_t );
630 void SetEPTxStatus(uint8_t , uint16_t );
631 void SetEPRxStatus(uint8_t , uint16_t );
632 void SetDouBleBuffEPStall(uint8_t , uint8_t bDir);
633 uint16_t GetEPTxStatus(uint8_t );
634 uint16_t GetEPRxStatus(uint8_t );
635 void SetEPTxValid(uint8_t );
636 void SetEPRxValid(uint8_t );
637 uint16_t GetTxStallStatus(uint8_t );
638 uint16_t GetRxStallStatus(uint8_t );
639 void SetEP_KIND(uint8_t );
640 void ClearEP_KIND(uint8_t );
641 void Set_Status_Out(uint8_t );
642 void Clear_Status_Out(uint8_t );
643 void SetEPDoubleBuff(uint8_t );
644 void ClearEPDoubleBuff(uint8_t );
645 void ClearEP_CTR_RX(uint8_t );
646 void ClearEP_CTR_TX(uint8_t );
647 void ToggleDTOG_RX(uint8_t );
648 void ToggleDTOG_TX(uint8_t );
649 void ClearDTOG_RX(uint8_t );
650 void ClearDTOG_TX(uint8_t );
651 void SetEPAddress(uint8_t , uint8_t );
652 uint8_t GetEPAddress(uint8_t );
653 void SetEPTxAddr(uint8_t , uint16_t );
654 void SetEPRxAddr(uint8_t , uint16_t );
655 uint16_t GetEPTxAddr(uint8_t );
656 uint16_t GetEPRxAddr(uint8_t );
657 void SetEPCountRxReg(uint32_t * , uint16_t );
658 void SetEPTxCount(uint8_t , uint16_t );
659 void SetEPRxCount(uint8_t , uint16_t );
660 uint16_t GetEPTxCount(uint8_t );
661 uint16_t GetEPRxCount(uint8_t );
662 void SetEPDblBuf0Addr(uint8_t , uint16_t );
663 void SetEPDblBuf1Addr(uint8_t , uint16_t );
664 void SetEPDblBuffAddr(uint8_t , uint16_t , uint16_t );
665 uint16_t GetEPDblBuf0Addr(uint8_t );
666 uint16_t GetEPDblBuf1Addr(uint8_t );
667 void SetEPDblBuffCount(uint8_t , uint8_t , uint16_t );
668 void SetEPDblBuf0Count(uint8_t , uint8_t , uint16_t );
669 void SetEPDblBuf1Count(uint8_t , uint8_t , uint16_t );
670 uint16_t GetEPDblBuf0Count(uint8_t );
671 uint16_t GetEPDblBuf1Count(uint8_t );
672 EP_DBUF_DIR GetEPDblBufDir(uint8_t );
673 void FreeUserBuffer(uint8_t bEpNum, uint8_t bDir);
674 uint16_t ToWord(uint8_t, uint8_t);
675 uint16_t ByteSwap(uint16_t);