usb_regs.h
上传用户:yyyd609
上传日期:2022-07-18
资源大小:183k
文件大小:26k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /******************** (C) COPYRIGHT 2003 STMicroelectronics ********************
  2. * File Name          : usb_regs.h
  3. * Author             : MCD Application Team
  4. * Date First Issued  : 27/10/2003
  5. * Description        : Interface functions to USB cell registers
  6. *
  7. ********************************************************************************/
  8. #define RegBase  (0xC0008800L)  /* USB_IP Peripheral Registers base address */
  9. #define PMAAddr  (0xC0008000L)  /* USB_IP Packet Memory Area base address */
  10. /* General registers */
  11. #define GCNTR    ((volatile unsigned *)(RegBase + 0x40)) /* Control register           */
  12. #define GISTR    ((volatile unsigned *)(RegBase + 0x44)) /* Interrupt status register  */
  13. #define GFNR     ((volatile unsigned *)(RegBase + 0x48)) /* Frame number register      */
  14. #define GDADDR   ((volatile unsigned *)(RegBase + 0x4C)) /* Device address register    */
  15. #define GBTABLE  ((volatile unsigned *)(RegBase + 0x50)) /* Buffer Table address register */
  16. /* Endpoint registers */
  17. #define EP0REG  ((volatile unsigned *)(RegBase)) /* endpoint 0 register address */
  18. /* endpoints enumeration */
  19. #define ENDP0  ((BYTE)0)
  20. #define ENDP1  ((BYTE)1)
  21. #define ENDP2  ((BYTE)2)
  22. #define ENDP3  ((BYTE)3)
  23. #define ENDP4  ((BYTE)4)
  24. #define ENDP5  ((BYTE)5)
  25. #define ENDP6  ((BYTE)6)
  26. #define ENDP7  ((BYTE)7)
  27. #define ENDP8  ((BYTE)8)
  28. #define ENDP9  ((BYTE)9)
  29. #define ENDP10  ((BYTE)10)
  30. #define ENDP11  ((BYTE)11)
  31. #define ENDP12  ((BYTE)12)
  32. #define ENDP13  ((BYTE)13)
  33. #define ENDP14  ((BYTE)14)
  34. #define ENDP15  ((BYTE)15)
  35. /*******************************************************************************/
  36. /*  ISTR interrupt events      */
  37. /*******************************************************************************/
  38. #define ISTR_CTR    (0x8000) /* Correct TRansfer         (clear-only bit) */
  39. #define ISTR_DOVR   (0x4000) /* DMA OVeR/underrun (clear-only bit) */
  40. #define ISTR_ERR    (0x2000) /* ERRor (clear-only bit) */
  41. #define ISTR_WKUP   (0x1000) /* WaKe UP (clear-only bit) */
  42. #define ISTR_SUSP   (0x0800) /* SUSPend (clear-only bit) */
  43. #define ISTR_RESET  (0x0400) /* RESET (clear-only bit) */
  44. #define ISTR_SOF    (0x0200) /* Start Of Frame (clear-only bit) */
  45. #define ISTR_ESOF   (0x0100) /* Expected Start Of Frame (clear-only bit) */
  46. #define ISTR_DIR    (0x0010) /* DIRection of transaction (read-only bit)  */
  47. #define ISTR_EP_ID  (0x000F) /* EndPoint IDentifier (read-only bit)  */
  48. #define CLR_CTR    (~ISTR_CTR)  /* clear Correct TRansfer bit */
  49. #define CLR_DOVR   (~ISTR_DOVR) /* clear DMA OVeR/underrun bit*/
  50. #define CLR_ERR    (~ISTR_ERR)  /* clear ERRor bit */
  51. #define CLR_WKUP   (~ISTR_WKUP) /* clear WaKe UP bit    */
  52. #define CLR_SUSP   (~ISTR_SUSP) /* clear SUSPend bit    */
  53. #define CLR_RESET  (~ISTR_RESET)/* clear RESET bit    */
  54. #define CLR_SOF    (~ISTR_SOF)  /* clear Start Of Frame bit   */
  55. #define CLR_ESOF   (~ISTR_ESOF) /* clear Expected Start Of Frame bit */
  56. /*******************************************************************************/
  57. /*  CNTR control register bits definitions    */
  58. /*******************************************************************************/
  59. #define CNTR_CTRM   (0x8000) /* Correct TRansfer Mask */
  60. #define CNTR_DOVRM  (0x4000) /* DMA OVeR/underrun Mask */
  61. #define CNTR_ERRM   (0x2000) /* ERRor Mask */
  62. #define CNTR_WKUPM  (0x1000) /* WaKe UP Mask */
  63. #define CNTR_SUSPM  (0x0800) /* SUSPend Mask */
  64. #define CNTR_RESETM (0x0400) /* RESET Mask   */
  65. #define CNTR_SOFM   (0x0200) /* Start Of Frame Mask */
  66. #define CNTR_ESOFM  (0x0100) /* Expected Start Of Frame Mask */
  67. #define CNTR_RESUME (0x0010) /* RESUME request */
  68. #define CNTR_FSUSP  (0x0008) /* Force SUSPend */
  69. #define CNTR_LPMODE (0x0004) /* Low-power MODE */
  70. #define CNTR_PDWN   (0x0002) /* Power DoWN */
  71. #define CNTR_FRES   (0x0001) /* Force USB RESet */
  72. /*******************************************************************************/
  73. /*  FNR Frame Number Register bit definitions    */
  74. /*******************************************************************************/
  75. #define FNR_RXDP (0x8000) /* status of D+ data line */
  76. #define FNR_RXDM (0x4000) /* status of D- data line */
  77. #define FNR_LCK (0x2000) /* LoCKed */
  78. #define FNR_LSOF (0x1800) /* Lost SOF */
  79. #define FNR_FN (0x07FF) /* Frame Number */
  80. /*******************************************************************************/
  81. /* DADDR Device ADDRess bit definitions    */
  82. /*******************************************************************************/
  83. #define DADDR_EF (0x80)
  84. #define DADDR_ADD (0x7F)
  85. /*===============================================================================*/
  86. /* Endpoint register */
  87. /*===============================================================================*/
  88. /* bit positions */
  89. #define EP_CTR_RX      (0x8000) /* EndPoint Correct TRansfer RX  */
  90. #define EP_DTOG_RX     (0x4000) /* EndPoint Data TOGGLE RX */
  91. #define EPRX_STAT      (0x3000) /* EndPoint RX STATus bit field */
  92. #define EP_SETUP       (0x0800) /* EndPoint SETUP */
  93. #define EP_T_FIELD     (0x0600) /* EndPoint TYPE */
  94. #define EP_KIND        (0x0100) /* EndPoint KIND */
  95. #define EP_CTR_TX      (0x0080) /* EndPoint Correct TRansfer TX */
  96. #define EP_DTOG_TX     (0x0040) /* EndPoint Data TOGGLE TX */
  97. #define EPTX_STAT      (0x0030) /* EndPoint TX STATus bit field */
  98. #define EPADDR_FIELD   (0x000F) /* EndPoint ADDRess FIELD */
  99. /* EndPoint REGister MASK (no toggle fields) */
  100. #define EPREG_MASK     (EP_CTR_RX|EP_SETUP|EP_T_FIELD|EP_KIND|EP_CTR_TX|EPADDR_FIELD)
  101. /* EP_TYPE[1:0] EndPoint TYPE */
  102. #define EP_BULK        (0x0000) /* EndPoint BULK */
  103. #define EP_CONTROL     (0x0200) /* EndPoint CONTROL */
  104. #define EP_ISOCHRONOUS (0x0400) /* EndPoint ISOCHRONOUS */
  105. #define EP_INTERRUPT   (0x0600) /* EndPoint INTERRUPT */
  106. #define EP_T_MASK      (~EP_T_FIELD & EPREG_MASK)
  107. /* EP_KIND EndPoint KIND */
  108. #define EPKIND_MASK    (~EP_KIND & EPREG_MASK)
  109. /* STAT_TX[1:0] STATus for TX transfer */
  110. #define EP_TX_DIS      (0x0000) /* EndPoint TX DISabled */
  111. #define EP_TX_STALL    (0x0010) /* EndPoint TX STALLed */
  112. #define EP_TX_NAK      (0x0020) /* EndPoint TX NAKed */
  113. #define EP_TX_VALID    (0x0030) /* EndPoint TX VALID */
  114. #define EPTX_DTOG1     (0x0010) /* EndPoint TX Data TOGgle bit1 */
  115. #define EPTX_DTOG2     (0x0020) /* EndPoint TX Data TOGgle bit2 */
  116. #define EPTX_DTOGMASK  (EPTX_STAT|EPREG_MASK)
  117. /* STAT_RX[1:0] STATus for RX transfer */
  118. #define EP_RX_DIS      (0x0000) /* EndPoint RX DISabled */
  119. #define EP_RX_STALL    (0x1000) /* EndPoint RX STALLed */
  120. #define EP_RX_NAK      (0x2000) /* EndPoint RX NAKed */
  121. #define EP_RX_VALID    (0x3000) /* EndPoint RX VALID */
  122. #define EPRX_DTOG1     (0x1000) /* EndPoint RX Data TOGgle bit1 */
  123. #define EPRX_DTOG2     (0x2000) /* EndPoint RX Data TOGgle bit1 */
  124. #define EPRX_DTOGMASK  (EPRX_STAT|EPREG_MASK)
  125. typedef enum _EP_DBUF_DIR{ /* double buffered endpoint direction */
  126.  EP_DBUF_ERR,
  127.  EP_DBUF_OUT,
  128.  EP_DBUF_IN
  129. }EP_DBUF_DIR;
  130. enum EP_BUF_NUM{ /* endpoint buffer number */
  131.  EP_NOBUF,
  132.  EP_BUF0 ,
  133.  EP_BUF1
  134. };
  135. /*----------------------------------------------------------------*/
  136. extern volatile WORD wIstr;  /* ISTR register last read value */
  137. /*----------------------------------------------------------------*/
  138. /*    FUNCTION PROTOTYPES   */
  139. /* &   */
  140. /* M A C R O s    */
  141. /*----------------------------------------------------------------*/
  142. /*----------------------------------------------------------------*/
  143. /* SetCNTR */
  144. /*----------------------------------------------------------------*/
  145. void SetCNTR(WORD /*wRegValue*/);
  146. #define _SetCNTR(wRegValue)  (*GCNTR   = (WORD)wRegValue)
  147. /*----------------------------------------------------------------*/
  148. /* SetISTR */
  149. /*----------------------------------------------------------------*/
  150. void SetISTR(WORD /*wRegValue*/);
  151. #define _SetISTR(wRegValue)  (*GISTR   = (WORD)wRegValue)
  152. /*----------------------------------------------------------------*/
  153. /* SetDADDR */
  154. /*----------------------------------------------------------------*/
  155. void SetDADDR(WORD /*wRegValue*/);
  156. #define _SetDADDR(wRegValue) (*GDADDR  = (WORD)wRegValue)
  157. /*----------------------------------------------------------------*/
  158. /* SetBTABLE */
  159. /*----------------------------------------------------------------*/
  160. void SetBTABLE(WORD /*wRegValue*/);
  161. #define _SetBTABLE(wRegValue)(*GBTABLE = (WORD)(wRegValue & 0xFFF8))
  162. /*----------------------------------------------------------------*/
  163. /* GetCNTR */
  164. /*----------------------------------------------------------------*/
  165. WORD GetCNTR(void);
  166. #define _GetCNTR()   ((WORD) *GCNTR)
  167. /*----------------------------------------------------------------*/
  168. /* GetISTR */
  169. /*----------------------------------------------------------------*/
  170. WORD GetISTR(void);
  171. #define _GetISTR()   ((WORD) *GISTR)
  172. /*----------------------------------------------------------------*/
  173. /* GetFNR */
  174. /*----------------------------------------------------------------*/
  175. WORD GetFNR(void);
  176. #define _GetFNR()    ((WORD) *GFNR)
  177. /*----------------------------------------------------------------*/
  178. /* GetDADDR */
  179. /*----------------------------------------------------------------*/
  180. WORD GetDADDR(void);
  181. #define _GetDADDR()  ((WORD) *GDADDR)
  182. /*----------------------------------------------------------------*/
  183. /* GetBTABLE */
  184. /*----------------------------------------------------------------*/
  185. WORD GetBTABLE(void);
  186. #define _GetBTABLE() ((WORD) *GBTABLE)
  187. /*----------------------------------------------------------------*/
  188. /* SetENDPOINT */
  189. /*----------------------------------------------------------------*/
  190. void SetENDPOINT(BYTE /*bEpNum*/,WORD /*wRegValue*/);
  191. #define _SetENDPOINT(bEpNum,wRegValue)  (*(EP0REG + bEpNum)= 
  192.  (WORD)wRegValue)
  193. /*----------------------------------------------------------------*/
  194. /* GetENDPOINT */
  195. /*----------------------------------------------------------------*/
  196. WORD GetENDPOINT(BYTE /*bEpNum*/);
  197. #define _GetENDPOINT(bEpNum)       ((WORD)(*(EP0REG + bEpNum)))
  198. /*----------------------------------------------------------------*/
  199. /* SetEPType */
  200. /* sets the type in the endpoint register(bits EP_TYPE[1:0]) */
  201. /* IN : bEpNum = endpoint number */
  202. /* wType  = type definition */
  203. /* OUT: none */
  204. /*----------------------------------------------------------------*/
  205. void SetEPType(BYTE /*bEpNum*/,WORD /*wType*/);
  206. #define _SetEPType(bEpNum,wType) (_SetENDPOINT(bEpNum,
  207. ((_GetENDPOINT(bEpNum) & EP_T_MASK) | wType)))
  208. /*----------------------------------------------------------------*/
  209. /* GetEPType */
  210. /* gets the type in the endpoint register(bits EP_TYPE[1:0]) */
  211. /* IN : bEpNum  = endpoint number */
  212. /* OUT: type definition */
  213. /*----------------------------------------------------------------*/
  214. WORD GetEPType(BYTE /*bEpNum*/);
  215. #define _GetEPType(bEpNum) (_GetENDPOINT(bEpNum) & EP_T_FIELD)
  216. /*----------------------------------------------------------------*/
  217. /* SetEPTxStatus */
  218. /* sets the status for tx transfer (bits STAT_TX[1:0]) */
  219. /* IN : bEpNum = endpoint number */
  220. /* wState = new state */
  221. /* OUT: none */
  222. /*----------------------------------------------------------------*/
  223. void SetEPTxStatus(BYTE /*bEpNum*/,WORD /*wState*/);
  224. #define _SetEPTxStatus(bEpNum,wState) {
  225.  register WORD _wRegVal;     
  226. _wRegVal = _GetENDPOINT(bEpNum) & EPTX_DTOGMASK;
  227. /* toggle first bit ? */    
  228. if((EPTX_DTOG1 & wState)!= 0)      
  229. _wRegVal ^= EPTX_DTOG1;        
  230. /* toggle second bit ?  */         
  231. if((EPTX_DTOG2 & wState)!= 0)      
  232. _wRegVal ^= EPTX_DTOG2;        
  233. _SetENDPOINT(bEpNum, _wRegVal);    
  234. } /* _SetEPTxStatus */
  235. /*----------------------------------------------------------------*/
  236. /* SetEPRxStatus */
  237. /* sets the status for rx transfer (bits STAT_TX[1:0]) */
  238. /* IN : bEpNum = endpoint number */
  239. /* wState = new state */
  240. /* OUT: none */
  241. /*----------------------------------------------------------------*/
  242. void SetEPRxStatus(BYTE /*bEpNum*/,WORD /*wState*/);
  243. #define _SetEPRxStatus(bEpNum,wState) {
  244.  register WORD _wRegVal;
  245. _wRegVal = _GetENDPOINT(bEpNum) & EPRX_DTOGMASK;
  246. /* toggle first bit ? */
  247. if((EPRX_DTOG1 & wState)!= 0)
  248. _wRegVal ^= EPRX_DTOG1;
  249. /* toggle second bit ? */
  250. if((EPRX_DTOG2 & wState)!= 0)
  251. _wRegVal ^= EPRX_DTOG2;
  252. _SetENDPOINT(bEpNum, _wRegVal);
  253. } /* _SetEPRxStatus */
  254. /*----------------------------------------------------------------*/
  255. /* GetEPTxStatus / GetEPRxStatus */
  256. /* gets the status for tx/rx transfer (bits STAT_TX[1:0]/STAT_RX[1:0]) */
  257. /* IN : bEpNum  = endpoint number */
  258. /* OUT: WORD status  */
  259. /*----------------------------------------------------------------*/
  260. WORD GetEPTxStatus(BYTE /*bEpNum*/);
  261. WORD GetEPRxStatus(BYTE /*bEpNum*/);
  262. #define _GetEPTxStatus(bEpNum) ((WORD)_GetENDPOINT(bEpNum) & EPTX_STAT)
  263. #define _GetEPRxStatus(bEpNum) ((WORD)_GetENDPOINT(bEpNum) & EPRX_STAT)
  264. /*----------------------------------------------------------------*/
  265. /* SetEPTxValid / SetEPRxValid */
  266. /* sets directly the VALID tx/rx-status into the enpoint register */
  267. /* IN : bEpNum = endpoint number */
  268. /* OUT: none */
  269. /*----------------------------------------------------------------*/
  270. void SetEPTxValid(BYTE /*bEpNum*/);
  271. void SetEPRxValid(BYTE /*bEpNum*/);
  272. #define _SetEPTxValid(bEpNum)     (_SetEPTxStatus(bEpNum, EP_TX_VALID))
  273. #define _SetEPRxValid(bEpNum)     (_SetEPRxStatus(bEpNum, EP_RX_VALID))
  274. /*----------------------------------------------------------------*/
  275. /* GetTxStallStatus / GetRxStallStatus */
  276. /* checks stall condition in an endpoint */
  277. /* IN : bEpNum = endpoint number */
  278. /* OUT: TRUE = endpoint in stall condition */
  279. /*----------------------------------------------------------------*/
  280. BOOL GetTxStallStatus(BYTE /*bEpNum*/);
  281. BOOL GetRxStallStatus(BYTE /*bEpNum*/);
  282. #define _GetTxStallStatus(bEpNum) (_GetEPTxStatus(bEpNum) 
  283.  == EP_TX_STALL)
  284. #define _GetRxStallStatus(bEpNum) (_GetEPRxStatus(bEpNum) 
  285.  == EP_RX_STALL)
  286. /*----------------------------------------------------------------*/
  287. /* SetEP_KIND / ClearEP_KIND */
  288. /* IN : bEpNum  = endpoint number */
  289. /* OUT: none */
  290. /*----------------------------------------------------------------*/
  291. void SetEP_KIND(BYTE /*bEpNum*/);
  292. void ClearEP_KIND(BYTE /*bEpNum*/);
  293. #define _SetEP_KIND(bEpNum)    (_SetENDPOINT(bEpNum, 
  294.     (_GetENDPOINT(bEpNum) | EP_KIND) & EPREG_MASK))
  295. #define _ClearEP_KIND(bEpNum)  (_SetENDPOINT(bEpNum, 
  296.          (_GetENDPOINT(bEpNum) & EPKIND_MASK)))
  297. /*----------------------------------------------------------------*/
  298. /* Set_Status_Out / Clear_Status_Out */
  299. /* sets/clears directly STATUS_OUT bit in the endpoint register */
  300. /* to be used only during control transfers */
  301. /* IN : bEpNum = endpoint number */
  302. /* OUT: none */
  303. /*----------------------------------------------------------------*/
  304. void Set_Status_Out(BYTE /*bEpNum*/);
  305. void Clear_Status_Out(BYTE /*bEpNum*/);
  306. #define _Set_Status_Out(bEpNum)    _SetEP_KIND(bEpNum)
  307. #define _Clear_Status_Out(bEpNum)  _ClearEP_KIND(bEpNum)
  308. /*----------------------------------------------------------------*/
  309. /* SetEPDoubleBuff / ClearEPDoubleBuff */
  310. /* sets/clears directly EP_KIND bit in the endpoint register */
  311. /* IN : bEpNum = endpoint number */
  312. /* OUT: none */
  313. /*----------------------------------------------------------------*/
  314. void SetEPDoubleBuff(BYTE /*bEpNum*/);
  315. void ClearEPDoubleBuff(BYTE /*bEpNum*/);
  316. #define _SetEPDoubleBuff(bEpNum)   _SetEP_KIND(bEpNum)
  317. #define _ClearEPDoubleBuff(bEpNum) _ClearEP_KIND(bEpNum)
  318. /*----------------------------------------------------------------*/
  319. /* ClearEP_CTR_RX / ClearEP_CTR_TX */
  320. /* clears bit CTR_RX / CTR_RX in the endpoint register */
  321. /* IN : bEpNum = endpoint number */
  322. /* OUT: none */
  323. /*----------------------------------------------------------------*/
  324. void ClearEP_CTR_RX(BYTE /*bEpNum*/);
  325. void ClearEP_CTR_TX(BYTE /*bEpNum*/);
  326. #define _ClearEP_CTR_RX(bEpNum)   (_SetENDPOINT(bEpNum,
  327.    _GetENDPOINT(bEpNum) & 0x7FFF & EPREG_MASK))
  328. #define _ClearEP_CTR_TX(bEpNum)   (_SetENDPOINT(bEpNum,
  329.    _GetENDPOINT(bEpNum) & 0xFF7F & EPREG_MASK))
  330. /*----------------------------------------------------------------*/
  331. /* ToggleDTOG_RX / ToggleDTOG_TX */
  332. /* toggles DTOG_RX / DTOG_TX bit in the endpoint register */
  333. /* IN : bEpNum  = endpoint number */
  334. /* OUT: none */
  335. /*----------------------------------------------------------------*/
  336. void ToggleDTOG_RX(BYTE /*bEpNum*/);
  337. void ToggleDTOG_TX(BYTE /*bEpNum*/);
  338. #define _ToggleDTOG_RX(bEpNum)    (_SetENDPOINT(bEpNum, 
  339.    EP_DTOG_RX | _GetENDPOINT(bEpNum) & EPREG_MASK))
  340. #define _ToggleDTOG_TX(bEpNum)    (_SetENDPOINT(bEpNum, 
  341.    EP_DTOG_TX | _GetENDPOINT(bEpNum) & EPREG_MASK))
  342. /*----------------------------------------------------------------*/
  343. /* ClearDTOG_RX / ClearDTOG_TX */
  344. /* IN : bEpNum  = endpoint number */
  345. /* OUT: none */
  346. /*----------------------------------------------------------------*/
  347. void ClearDTOG_RX(BYTE /*bEpNum*/);
  348. void ClearDTOG_TX(BYTE /*bEpNum*/);
  349. #define _ClearDTOG_RX(bEpNum)  if((_GetENDPOINT(bEpNum) & EP_DTOG_RX) != 0)
  350.   _ToggleDTOG_RX(bEpNum)
  351. #define _ClearDTOG_TX(bEpNum)  if((_GetENDPOINT(bEpNum) & EP_DTOG_TX) != 0)
  352.   _ToggleDTOG_TX(bEpNum)
  353. /*----------------------------------------------------------------*/
  354. /* SetEPAddress */
  355. /* sets address in an endpoint register */
  356. /* IN : bEpNum  = endpoint number */
  357. /*  bAddr   = address */
  358. /* OUT: none */
  359. /*----------------------------------------------------------------*/
  360. void SetEPAddress(BYTE /*bEpNum*/,BYTE /*bAddr*/);
  361. #define _SetEPAddress(bEpNum,bAddr) _SetENDPOINT(bEpNum,
  362. _GetENDPOINT(bEpNum) & EPREG_MASK | bAddr)
  363. /*----------------------------------------------------------------*/
  364. /* GetEPAddress */
  365. /* IN : bEpNum  = endpoint number */
  366. /* OUT: none */
  367. /*----------------------------------------------------------------*/
  368. BYTE GetEPAddress(BYTE /*bEpNum*/);
  369. #define _GetEPAddress(bEpNum) ((BYTE)(_GetENDPOINT(bEpNum) & EPADDR_FIELD))
  370. /*----------------------------------------------------------------*/
  371. #define _pEPTxAddr(bEpNum) ((DWORD *)((_GetBTABLE()+bEpNum*8  )*2 + PMAAddr))
  372. #define _pEPTxCount(bEpNum) ((DWORD *)((_GetBTABLE()+bEpNum*8+2)*2 + PMAAddr))
  373. #define _pEPRxAddr(bEpNum) ((DWORD *)((_GetBTABLE()+bEpNum*8+4)*2 + PMAAddr))
  374. #define _pEPRxCount(bEpNum) ((DWORD *)((_GetBTABLE()+bEpNum*8+6)*2 + PMAAddr))
  375. /*----------------------------------------------------------------*/
  376. /* SetEPTxAddr / SetEPRxAddr */
  377. /* sets address of the tx/rx buffer */
  378. /* IN : bEpNum = endpoint number */
  379. /*      wAddr  = address to be set ( must be word aligned ) */
  380. /* OUT: none */
  381. /*----------------------------------------------------------------*/
  382. void SetEPTxAddr(BYTE /*bEpNum*/,WORD /*wAddr*/);
  383. void SetEPRxAddr(BYTE /*bEpNum*/,WORD /*wAddr*/);
  384. /*#define _SetEPTxAddr(bEpNum,wAddr) (*_pEPTxAddr(bEpNum) = (wAddr & 0xFFFE))*/
  385. /*#define _SetEPRxAddr(bEpNum,wAddr) (*_pEPRxAddr(bEpNum) = (wAddr & 0xFFFE))*/
  386. #define _SetEPTxAddr(bEpNum,wAddr) (*_pEPTxAddr(bEpNum) = ((wAddr >> 1) << 1))
  387. #define _SetEPRxAddr(bEpNum,wAddr) (*_pEPRxAddr(bEpNum) = ((wAddr >> 1) << 1))
  388. /*----------------------------------------------------------------*/
  389. /* GetEPTxAddr / GetEPRxAddr */
  390. /* gets address of the tx/rx buffer */
  391. /* IN : bEpNum = endpoint number */
  392. /* IN : */
  393. /* OUT: address of the buffer */
  394. /*----------------------------------------------------------------*/
  395. WORD GetEPTxAddr(BYTE /*bEpNum*/);
  396. WORD GetEPRxAddr(BYTE /*bEpNum*/);
  397. #define _GetEPTxAddr(bEpNum) ((WORD)*_pEPTxAddr(bEpNum))
  398. #define _GetEPRxAddr(bEpNum) ((WORD)*_pEPRxAddr(bEpNum))
  399. /*----------------------------------------------------------------*/
  400. /* SetEPCountRxReg */
  401. /* sets counter of rx buffer with no. of blocks */
  402. /* IN : pdwReg = pointer to counter */
  403. /*      wCount = counter */
  404. /* OUT: none */
  405. /*----------------------------------------------------------------*/
  406. void SetEPCountRxReg(DWORD * /*pdwReg*/, WORD /*wCount*/);
  407. #define _BlocksOf32(dwReg,wCount,wNBlocks) {
  408.   wNBlocks = wCount >> 5;   
  409.   if((wCount & 0x1f) == 0)
  410.   wNBlocks--;  
  411. *pdwReg = (DWORD)((wNBlocks << 10) | 0x8000);
  412. }/* _BlocksOf32 */
  413. #define _BlocksOf2(dwReg,wCount,wNBlocks) {
  414.   wNBlocks = wCount >> 1;
  415.   if((wCount & 0x1) != 0)
  416.    wNBlocks++;
  417. *pdwReg = (DWORD)(wNBlocks << 10);
  418. }/* _BlocksOf2 */
  419. #define _SetEPCountRxReg(dwReg,wCount)  {
  420.  WORD wNBlocks;
  421.  if(wCount > 62){_BlocksOf32(dwReg,wCount,wNBlocks);}
  422.  else {_BlocksOf2(dwReg,wCount,wNBlocks);}
  423. }/* _SetEPCountRxReg */
  424. #define _SetEPRxDblBuf0Count(bEpNum,wCount) {
  425.  DWORD *pdwReg = _pEPTxCount(bEpNum);   
  426.    _SetEPCountRxReg(pdwReg, wCount);  
  427. }
  428. /*----------------------------------------------------------------*/
  429. /* SetEPTxCount / SetEPRxCount */
  430. /* sets counter for the tx/rx buffer */
  431. /* IN : bEpNum = endpoint number */
  432. /* wCount = counter value */
  433. /* OUT: none */
  434. /*----------------------------------------------------------------*/
  435. void SetEPTxCount(BYTE /*bEpNum*/,WORD /*wCount*/);
  436. void SetEPRxCount(BYTE /*bEpNum*/,WORD /*wCount*/);
  437. #define _SetEPTxCount(bEpNum,wCount) (*_pEPTxCount(bEpNum) = wCount)
  438. #define _SetEPRxCount(bEpNum,wCount) {
  439.  DWORD *pdwReg = _pEPRxCount(bEpNum); 
  440.    _SetEPCountRxReg(pdwReg, wCount);
  441. }
  442. /*----------------------------------------------------------------*/
  443. /* GetEPTxCount / GetEPRxCount */
  444. /* gets counter of the tx buffer */
  445. /* IN : bEpNum = endpoint number */
  446. /* OUT: counter value */
  447. /*----------------------------------------------------------------*/
  448. WORD GetEPTxCount(BYTE /*bEpNum*/);
  449. WORD GetEPRxCount(BYTE /*bEpNum*/);
  450. #define _GetEPTxCount(bEpNum)((WORD)(*_pEPTxCount(bEpNum)) & 0x3ff)
  451. #define _GetEPRxCount(bEpNum)((WORD)(*_pEPRxCount(bEpNum)) & 0x3ff)
  452. /*----------------------------------------------------------------*/
  453. /*----------------------------------------------------------------*/
  454. /* SetEPDblBuf0Addr / SetEPDblBuf1Addr */
  455. /* sets buffer 0/1 address in a double buffer endpoint */
  456. /* IN : bEpNum = endpoint number */
  457. /*      wBuf0Addr = buffer 0 address */
  458. /* OUT: none */
  459. /*----------------------------------------------------------------*/
  460. void SetEPDblBuf0Addr(BYTE /*bEpNum*/,WORD /*wBuf0Addr*/);
  461. void SetEPDblBuf1Addr(BYTE /*bEpNum*/,WORD /*wBuf1Addr*/);
  462. #define _SetEPDblBuf0Addr(bEpNum,wBuf0Addr) (_SetEPTxAddr(bEpNum, wBuf0Addr))
  463. #define _SetEPDblBuf1Addr(bEpNum,wBuf1Addr) (_SetEPRxAddr(bEpNum, wBuf1Addr))
  464. /*----------------------------------------------------------------*/
  465. /* SetEPDblBuffAddr */
  466. /* sets addresses in a double buffer endpoint */
  467. /* IN : bEpNum = endpoint number */
  468. /*      wBuf0Addr = buffer 0 address */
  469. /*      wBuf1Addr = buffer 1 address */
  470. /* OUT: none */
  471. /*----------------------------------------------------------------*/
  472. void SetEPDblBuffAddr(BYTE /*bEpNum*/,WORD /*wBuf0Addr*/,WORD /*wBuf1Addr*/);
  473. #define _SetEPDblBuffAddr(bEpNum,wBuf0Addr,wBuf1Addr) { 
  474. _SetEPDblBuf0Addr(bEpNum, wBuf0Addr);
  475. _SetEPDblBuf1Addr(bEpNum, wBuf1Addr);
  476. } /* _SetEPDblBuffAddr */
  477. /*----------------------------------------------------------------*/
  478. /* GetEPDblBuf0Addr / GetEPDblBuf1Addr */
  479. /* gets buffer 0/1 address of a double buffer endpoint */
  480. /* IN : bEpNum = endpoint number */
  481. /* OUT: none */
  482. /*----------------------------------------------------------------*/
  483. WORD GetEPDblBuf0Addr(BYTE /*bEpNum*/);
  484. WORD GetEPDblBuf1Addr(BYTE /*bEpNum*/);
  485. #define _GetEPDblBuf0Addr(bEpNum) (_GetEPTxAddr(bEpNum))
  486. #define _GetEPDblBuf1Addr(bEpNum) (_GetEPRxAddr(bEpNum))
  487. /*----------------------------------------------------------------*/
  488. /* SetEPDblBuffCount / SetEPDblBuf0Count / SetEPDblBuf1Count */
  489. /* sets both buffers or buff0 or buff1 counter for double buffering */
  490. /* IN : bEpNum  = endpoint number */
  491. /* bDir    = endpoint dir  EP_DBUF_OUT = OUT */
  492. /* EP_DBUF_IN  = IN */
  493. /* wCount  = counter value     */
  494. /* OUT: none */
  495. /*----------------------------------------------------------------*/
  496. void SetEPDblBuffCount(BYTE /*bEpNum*/, BYTE /*bDir*/, WORD /*wCount*/);
  497. void SetEPDblBuf0Count(BYTE /*bEpNum*/, BYTE /*bDir*/, WORD /*wCount*/);
  498. void SetEPDblBuf1Count(BYTE /*bEpNum*/, BYTE /*bDir*/, WORD /*wCount*/);
  499. #define _SetEPDblBuf0Count(bEpNum, bDir, wCount)  { 
  500.  if(bDir == EP_DBUF_OUT)
  501.      /* OUT endpoint */
  502.      {_SetEPRxDblBuf0Count(bEpNum,wCount);} 
  503.  else if(bDir == EP_DBUF_IN)
  504.      /* IN endpoint */
  505.  *_pEPTxCount(bEpNum) = (DWORD)wCount;  
  506. } /* SetEPDblBuf0Count*/
  507. #define _SetEPDblBuf1Count(bEpNum, bDir, wCount)  { 
  508.  if(bDir == EP_DBUF_OUT)   
  509.      /* OUT endpoint */
  510.      {_SetEPRxCount(bEpNum,wCount); }
  511.  else if(bDir == EP_DBUF_IN)
  512.      /* IN endpoint */
  513.  *_pEPRxCount(bEpNum) = (DWORD)wCount;  
  514. } /* SetEPDblBuf1Count */
  515. #define _SetEPDblBuffCount(bEpNum, bDir, wCount) {
  516. _SetEPDblBuf0Count(bEpNum, bDir, wCount); 
  517.   _SetEPDblBuf1Count(bEpNum, bDir, wCount); 
  518. } /* _SetEPDblBuffCount  */
  519. /*----------------------------------------------------------------*/
  520. /* GetEPDblBuf0Count / GetEPDblBuf1Count */
  521. /* gets buffer 0/1 rx/tx counter for double buffering */
  522. /* IN : bEpNum  = endpoint number */
  523. /* OUT: none */
  524. /*----------------------------------------------------------------*/
  525. WORD GetEPDblBuf0Count(BYTE /*bEpNum*/);
  526. WORD GetEPDblBuf1Count(BYTE /*bEpNum*/);
  527. #define _GetEPDblBuf0Count(bEpNum) (_GetEPTxCount(bEpNum)) /* rigth version  */
  528. /*#define _GetEPDblBuf0Count(bEpNum)  (_GetEPRxCount(bEpNum))*/
  529. #define _GetEPDblBuf1Count(bEpNum) (_GetEPRxCount(bEpNum)) /* rigth version  */
  530. /*#define _GetEPDblBuf1Count(bEpNum)  (_GetEPTxCount(bEpNum))*/
  531. /*----------------------------------------------------------------*/
  532. /* GetEPDblBufDir */
  533. /* gets direction of the double buffered endpoint */
  534. /* IN : bEpNum  = endpoint number */
  535. /* OUT: EP_DBUF_OUT, EP_DBUF_IN, */
  536. /*      EP_DBUF_ERR if the endpoint counter not yet programmed */
  537. /*----------------------------------------------------------------*/
  538. EP_DBUF_DIR GetEPDblBufDir(BYTE /*bEpNum*/);
  539. /*----------------------------------------------------------------*/
  540. /* FreeUserBuffer */
  541. /* free buffer used from the application realising it to the line */
  542. /* toggles bit SW_BUF in the double buffered endpoint register */
  543. /* IN : bEpNum = endpoint number */
  544. /* OUT: none */
  545. /*----------------------------------------------------------------*/
  546. void FreeUserBuffer(BYTE /*bEpNum*/);
  547. /*----------------------------------------------------------------*/
  548. WORD ToWord(BYTE,BYTE);
  549. /*----------------------------------------------------------------*/
  550. WORD ByteSwap(WORD);