ehci.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. /**************************************************************************//**
  2. * @file ehci.h
  3. * @version V1.00
  4. * @brief USB EHCI host controller driver header file.
  5. *
  6. * SPDX-License-Identifier: Apache-2.0
  7. *
  8. * @copyright (C) 2017 Nuvoton Technology Corp. All rights reserved.
  9. *****************************************************************************/
  10. #ifndef _USBH_EHCI_H_
  11. #define _USBH_EHCI_H_
  12. /// @cond HIDDEN_SYMBOLS
  13. struct utr_t;
  14. struct udev_t;
  15. struct qh_t;
  16. struct iso_ep_t;
  17. struct ep_info_t;
  18. /*----------------------------------------------------------------------------------------*/
  19. /* Periodic Frame List Size (256, 512, or 1024) */
  20. /*----------------------------------------------------------------------------------------*/
  21. #define FL_SIZE 1024 /* frame list size can be 256, 512, or 1024 */
  22. #define NUM_IQH 11 /* depends on FL_SIZE, 256:9, 512:10, 1024:11 */
  23. /*----------------------------------------------------------------------------------------*/
  24. /* Interrupt Threshold Control (1, 2, 4, 6, .. 64) */
  25. /*----------------------------------------------------------------------------------------*/
  26. #define UCMDR_INT_THR_CTRL (0x1<<HSUSBH_UCMDR_ITC_Pos) /* 1 micro-frames */
  27. /*----------------------------------------------------------------------------------------*/
  28. /* Queue Element Transfer Descriptor (qTD) */
  29. /*----------------------------------------------------------------------------------------*/
  30. typedef struct qTD_t
  31. {
  32. uint32_t Next_qTD; /* Next qTD Pointer */
  33. uint32_t Alt_Next_qTD; /* Alternate Next qTD Pointer */
  34. uint32_t Token; /* qTD Token */
  35. uint32_t Bptr[5]; /* qTD Buffer Page Pointer List */
  36. /*
  37. * The following members are used by USB Host libary.
  38. */
  39. struct utr_t *utr; /* associated UTR */
  40. uint32_t xfer_len; /* assigned transfer transfer length */
  41. struct qh_t *qh; /* The QH that this qTD belong to. */
  42. struct qTD_t *next; /* link for <qtd_list> of QH */
  43. } qTD_T;
  44. #define QTD_LIST_END 0x1 /* Indicate the terminate of qTD list. */
  45. #define QTD_PTR(x) ((qTD_T *)((uint32_t)(x) & ~0x1F))
  46. /*
  47. * Status: qTD Token[7:0]
  48. */
  49. #define QTD_STS_PS_OUT (0<<0) /* directs the HC to issue an OUT PID */
  50. #define QTD_STS_PS_PING (1<<0) /* directs the HC to issue an PING PID */
  51. #define QTD_STS_SPLIT_STRAT (0<<1) /* directs the HC to issue an Start split */
  52. #define QTD_STS_SPLIT_COMPLETE (1<<1) /* directs the HC to issue an Complete split */
  53. #define QTD_STS_MISS_MF (1<<2) /* miss a required complete-split transaction */
  54. #define QTD_STS_XactErr (1<<3) /* Transaction Error occurred */
  55. #define QTD_STS_BABBLE (1<<4) /* Babble Detected */
  56. #define QTD_STS_DATA_BUFF_ERR (1<<5) /* Data Buffer Error */
  57. #define QTD_STS_HALT (1<<6) /* Halted */
  58. #define QTD_STS_ACTIVE (1<<7) /* Active */
  59. /*
  60. * PID: qTD Token[9:8]
  61. */
  62. #define QTD_PID_Msk (0x3<<8)
  63. #define QTD_PID_OUT (0<<8) /* generates token (E1H) */
  64. #define QTD_PID_IN (1<<8) /* generates token (69H) */
  65. #define QTD_PID_SETUP (2<<8) /* generates token (2DH) */
  66. #define QTD_ERR_COUNTER (3<<10) /* Token[11:10] */
  67. #define QTD_IOC (1<<15) /* Token[15] - Interrupt On Complete */
  68. #define QTD_TODO_LEN_Pos 16 /* Token[31:16] - Total Bytes to Transfer */
  69. #define QTD_TODO_LEN(x) (((x)>>16) & 0x7FFF)
  70. #define QTD_DT (1UL<<31) /* Token[31] - Data Toggle */
  71. /*----------------------------------------------------------------------------------------*/
  72. /* Queue Head (QH) */
  73. /*----------------------------------------------------------------------------------------*/
  74. typedef struct qh_t
  75. {
  76. /* OHCI spec. Endpoint descriptor */
  77. uint32_t HLink; /* Queue Head Horizontal Link Pointer */
  78. uint32_t Chrst; /* Endpoint Characteristics: QH DWord 1 */
  79. uint32_t Cap; /* Endpoint Capabilities: QH DWord 2 */
  80. uint32_t Curr_qTD; /* Current qTD Pointer */
  81. /*
  82. * The followings are qTD Transfer Overlay
  83. */
  84. uint32_t OL_Next_qTD; /* Next qTD Pointer */
  85. uint32_t OL_Alt_Next_qTD; /* Alternate Next qTD Pointer */
  86. uint32_t OL_Token; /* qTD Token */
  87. uint32_t OL_Bptr[5]; /* qTD Buffer Page Pointer List */
  88. /*
  89. * The following members are used by USB Host libary.
  90. */
  91. qTD_T *dummy; /* point to the inactive dummy qTD */
  92. qTD_T *qtd_list; /* currently linked qTD transfers */
  93. qTD_T *done_list; /* currently linked qTD transfers */
  94. struct qh_t *next; /* point to the next QH in remove list */
  95. } QH_T;
  96. /* HLink[0] T field of "Queue Head Horizontal Link Pointer" */
  97. #define QH_HLNK_END 0x1
  98. /*
  99. * HLink[2:1] Typ field of "Queue Head Horizontal Link Pointer"
  100. */
  101. #define QH_HLNK_ITD(x) (((uint32_t)(x) & ~0x1F) | 0x0)
  102. #define QH_HLNK_QH(x) (((uint32_t)(x) & ~0x1F) | 0x2)
  103. #define QH_HLNK_SITD(x) (((uint32_t)(x) & ~0x1F) | 0x4)
  104. #define QH_HLNK_FSTN(x) (((uint32_t)(x) & ~0x1F) | 0x6)
  105. #define QH_PTR(x) ((QH_T *)((uint32_t)(x) & ~0x1F))
  106. /*
  107. * Bit fields of "Endpoint Characteristics"
  108. */
  109. #define QH_NAK_RL (4L<<28) /* Chrst[31:28] - NAK Count Reload */
  110. #define QH_CTRL_EP_FLAG (1<<27) /* Chrst[27] - Control Endpoint Flag */
  111. #define QH_RCLM_LIST_HEAD (1<<15) /* Chrst[15] - Head of Reclamation List Flag */
  112. #define QH_DTC (1<<14) /* Chrst[14] - Data Toggle Control */
  113. #define QH_EPS_FULL (0<<12) /* Chrst[13:12] - Endpoint Speed (Full) */
  114. #define QH_EPS_LOW (1<<12) /* Chrst[13:12] - Endpoint Speed (Low) */
  115. #define QH_EPS_HIGH (2<<12) /* Chrst[13:12] - Endpoint Speed (High) */
  116. #define QH_I_NEXT (1<<7) /* Chrst[7] - Inactivate on Next Transaction */
  117. /*
  118. * Bit fields of "Endpoint Capabilities"
  119. */
  120. #define QH_MULT_Pos 30 /* Cap[31:30] - High-Bandwidth Pipe Multiplier */
  121. #define QH_HUB_PORT_Pos 23 /* Cap[29:23] - Hub Port Number */
  122. #define QH_HUB_ADDR_Pos 16 /* Cap[22:16] - Hub Addr */
  123. #define QH_C_MASK_Msk 0xFF00 /* Cap[15:8] - uFrame C-mask */
  124. #define QH_S_MASK_Msk 0x00FF /* Cap[7:0] - uFrame S-mask */
  125. /*----------------------------------------------------------------------------------------*/
  126. /* Isochronous (High-Speed) Transfer Descriptor (iTD) */
  127. /*----------------------------------------------------------------------------------------*/
  128. typedef struct itd_t
  129. {
  130. uint32_t Next_Link; /* Next Link Pointer */
  131. uint32_t Transaction[8]; /* Transaction Status and Control */
  132. uint32_t Bptr[7]; /* Buffer Page Pointer List */
  133. /*
  134. * The following members are used by USB Host libary.
  135. */
  136. struct iso_ep_t *iso_ep; /* associated isochronous information block */
  137. struct utr_t *utr; /* associated UTR */
  138. uint32_t buff_base; /* buffer base address */
  139. uint8_t fidx; /* iTD's first index to UTR iso frames */
  140. uint8_t trans_mask; /* mask of activated transactions in iTD */
  141. uint32_t sched_frnidx; /* scheduled frame index */
  142. struct itd_t *next; /* used by software to maintain iTD list */
  143. } iTD_T;
  144. /*
  145. * Next_Link[2:1] Typ field of "Next Schedule Element Pointer" Typ field
  146. */
  147. #define ITD_HLNK_ITD(x) (((uint32_t)(x) & ~0x1F) | 0x0)
  148. #define ITD_HLNK_QH(x) (((uint32_t)(x) & ~0x1F) | 0x2)
  149. #define ITD_HLNK_SITD(x) (((uint32_t)(x) & ~0x1F) | 0x4)
  150. #define ITD_HLNK_FSTN(x) (((uint32_t)(x) & ~0x1F) | 0x6)
  151. #define ITD_PTR(x) ((iTD_T *)((uint32_t)(x) & ~0x1F))
  152. /*
  153. * Transaction[8]
  154. */
  155. #define ITD_STATUS(x) (((x)>>28)&0xF)
  156. #define ITD_STATUS_ACTIVE (0x80000000UL) /* Active */
  157. #define ITD_STATUS_BUFF_ERR (0x40000000UL) /* Data Buffer Error */
  158. #define ITD_STATUS_BABBLE (0x20000000UL) /* Babble Detected */
  159. #define ITD_STATUS_XACT_ERR (0x10000000UL) /* Transcation Error */
  160. #define ITD_XLEN_Pos 16
  161. #define ITD_XFER_LEN(x) (((x)>>16)&0xFFF)
  162. #define ITD_IOC (1<<15)
  163. #define ITD_PG_Pos 12
  164. #define ITD_XFER_OFF_Msk 0xFFF
  165. /*
  166. * Bptr[7]
  167. */
  168. #define ITD_BUFF_PAGE_Pos 12
  169. /* Bptr[0] */
  170. #define ITD_EP_NUM_Pos 8
  171. #define ITD_EP_NUM(itd) (((itd)->Bptr[0]>>8)&0xF)
  172. #define ITD_DEV_ADDR_Pos 0
  173. #define ITD_DEV_ADDR(itd) ((itd)->Bptr[0]&0x7F)
  174. /* Bptr[1] */
  175. #define ITD_DIR_IN (1<<11)
  176. #define ITD_DIR_OUT (0<<11)
  177. #define ITD_MAX_PKTSZ_Pos 0
  178. #define ITD_MAX_PKTSZ(itd) ((itd)->Bptr[1]&0x7FF)
  179. /*----------------------------------------------------------------------------------------*/
  180. /* Split Isochronous (Full-Speed) Transfer Descriptor (siTD) */
  181. /*----------------------------------------------------------------------------------------*/
  182. typedef struct sitd_t
  183. {
  184. uint32_t Next_Link; /* Next Link Pointer */
  185. uint32_t Chrst; /* Endpoint and Transaction Translator Characteristics */
  186. uint32_t Sched; /* Micro-frame Schedule Control */
  187. uint32_t StsCtrl; /* siTD Transfer Status and Control */
  188. uint32_t Bptr[2]; /* Buffer Page Pointer List */
  189. uint32_t BackLink; /* siTD Back Link Pointer */
  190. /*
  191. * The following members are used by USB Host libary.
  192. */
  193. struct iso_ep_t *iso_ep; /* associated isochronous information block */
  194. struct utr_t *utr; /* associated UTR */
  195. uint8_t fidx; /* iTD's first index to UTR iso frames */
  196. uint32_t sched_frnidx; /* scheduled frame index */
  197. struct sitd_t *next; /* used by software to maintain siTD list */
  198. } siTD_T;
  199. #define SITD_LIST_END 0x1 /* Indicate the terminate of siTD list. */
  200. #define SITD_XFER_IO_Msk (1UL<<31)
  201. #define SITD_XFER_IN (1UL<<31)
  202. #define SITD_XFER_OUT (0UL<<31)
  203. #define SITD_PORT_NUM_Pos 24
  204. #define SITD_HUB_ADDR_Pos 16
  205. #define SITD_EP_NUM_Pos 8
  206. #define SITD_DEV_ADDR_Pos 0
  207. #define SITD_IOC (1UL<<31)
  208. #define SITD_XFER_CNT_Pos 16
  209. #define SITD_XFER_CNT_Msk (0x3FF<<SITD_XFER_CNT_Pos)
  210. #define SITD_STATUS(x) ((x)&0xFC)
  211. #define SITD_STATUS_ACTIVE 0x80
  212. #define SITD_STATUS_ERR 0x40
  213. #define SITD_STATUS_BUFF_ERR 0x20
  214. #define SITD_BABBLE_DETECTED 0x10
  215. #define SITD_STATUS_XFER_ERR 0x08
  216. #define SITD_STATUS_MISSED_MF 0x04
  217. #define SITD_STATUS_ERROR_MASK 0x78
  218. /*
  219. * Next_Link[2:1] Typ field of "Next Schedule Element Pointer" Typ field
  220. */
  221. #define SITD_HLNK_ITD(x) (((uint32_t)(x) & ~0x1F) | 0x0)
  222. #define SITD_HLNK_QH(x) (((uint32_t)(x) & ~0x1F) | 0x2)
  223. #define SITD_HLNK_SITD(x) (((uint32_t)(x) & ~0x1F) | 0x4)
  224. #define SITD_HLNK_FSTN(x) (((uint32_t)(x) & ~0x1F) | 0x6)
  225. #define SITD_PTR(x) ((siTD_T *)((uint32_t)(x) & ~0x1F))
  226. #define HLINK_IS_TERMINATED(x) (((uint32_t)(x) & 0x1) ? 1 : 0)
  227. #define HLINK_IS_SITD(x) ((((uint32_t)(x) & 0x6) == 0x4) ? 1 : 0)
  228. /*----------------------------------------------------------------------------------------*/
  229. /* Isochronous endpoint transfer information block. (Software only) */
  230. /*----------------------------------------------------------------------------------------*/
  231. typedef struct iso_ep_t
  232. {
  233. struct ep_info_t *ep;
  234. uint32_t next_frame; /* frame number of next scheduling */
  235. iTD_T *itd_list; /* Reference to a list of installed iTDs */
  236. iTD_T *itd_done_list; /* Reference to a list of completed iTDs */
  237. siTD_T *sitd_list; /* Reference to a list of installed siTDs */
  238. siTD_T *sitd_done_list; /* Reference to a list of completed siTDs */
  239. struct iso_ep_t *next; /* used by software to maintain ISO EP list */
  240. } ISO_EP_T;
  241. extern void scan_isochronous_list(void);
  242. /// @endcond
  243. #endif /* _USBH_EHCI_H_ */