ehci.h 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929
  1. /********************************************************************************************
  2. * include/nuttx/usb/ehci.h
  3. *
  4. * Copyright (C) 2013 Gregory Nutt. All rights reserved.
  5. * Author: Gregory Nutt <gnutt@nuttx.org>
  6. *
  7. * References:
  8. * "Enhanced Host Controller Interface Specification for Universal Serial
  9. * Bus" Rev 1.0, March 12, 2002, Intel Corporation.
  10. *
  11. * Redistribution and use in source and binary forms, with or without
  12. * modification, are permitted provided that the following conditions
  13. * are met:
  14. *
  15. * 1. Redistributions of source code must retain the above copyright
  16. * notice, this list of conditions and the following disclaimer.
  17. * 2. Redistributions in binary form must reproduce the above copyright
  18. * notice, this list of conditions and the following disclaimer in
  19. * the documentation and/or other materials provided with the
  20. * distribution.
  21. * 3. Neither the name NuttX nor the names of its contributors may be
  22. * used to endorse or promote products derived from this software
  23. * without specific prior written permission.
  24. *
  25. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  26. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  27. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  28. * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  29. * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  30. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  31. * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
  32. * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
  33. * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  34. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  35. * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  36. * POSSIBILITY OF SUCH DAMAGE.
  37. *
  38. ********************************************************************************************/
  39. #ifndef __INCLUDE_NUTTX_USB_EHCI_H
  40. #define __INCLUDE_NUTTX_USB_EHCI_H
  41. /********************************************************************************************
  42. * Included Files
  43. ********************************************************************************************/
  44. #include <stdint.h>
  45. /********************************************************************************************
  46. * Pre-processor Definitions
  47. ********************************************************************************************/
  48. /* General definitions **********************************************************************/
  49. /* Endpoint speed values as used in endpoint characteristics field. NOTE: These values
  50. * are *NOT* the same as the SPEED definitions in usb.h.
  51. */
  52. #define EHCI_FULL_SPEED (0) /* Full-Speed (12Mbs) */
  53. #define EHCI_LOW_SPEED (1) /* Low-Speed (1.5Mbs) */
  54. #define EHCI_HIGH_SPEED (2) /* High-Speed (480 Mb/s) */
  55. #define EHCI_DIR_IN (1) /* Direction IN: Peripheral to host */
  56. #define EHCI_DIR_OUT (0) /* Direction OUT: Host to peripheral */
  57. /* PCI Configuration Space Register Offsets *************************************************/
  58. /* Paragraph 2.1 */
  59. /* 0x0009-0x000b: Class Code */
  60. #define EHCI_PCI_CLASSC_OFFSET 0x0009
  61. /* 0x0010-0x0013: Base Address to Memory-mapped Host Controller Register
  62. * Space
  63. */
  64. #define EHCI_PCIUSBBASE_OFFSET 0x0010
  65. /* 0x0060: Serial Bus Release Number */
  66. #define EHCI_PCI_SBRN_OFFSET 0x0060
  67. /* 0x0061: Frame Length Adjustment Register */
  68. #define EHCI_PCI_FLADJ_OFFSET 0x0061
  69. /* 0x0062-0x0063: Port wake capabilities register (OPTIONAL) */
  70. #define EHCI_PCI_PORTWAKECAP_OFFSET 0x0062
  71. /* EECP+0x0000: USB Legacy Support EHCI Extended Capability Register */
  72. #define EHCI_PCI_USBLEGSUP_OFFSET 0x0000
  73. /* EECP+0x0000: USB Legacy Support Control and Status Register */
  74. #define EHCI_PCI_USBLEGCTLSTS_OFFSET 0x0004
  75. /* Host Controller Capability Register Offsets **********************************************/
  76. /* Paragraph 2.2 */
  77. #define EHCI_CAPLENGTH_OFFSET 0x0000 /* Core Capability Register Length */
  78. /* 0x0001 Reserved */
  79. #define EHCI_HCIVERSION_OFFSET 0x0002 /* Core Interface Version Number */
  80. #define EHCI_HCSPARAMS_OFFSET 0x0004 /* Core Structural Parameters */
  81. #define EHCI_HCCPARAMS_OFFSET 0x0008 /* Core Capability Parameters */
  82. #define EHCI_HCSP_PORTROUTE_OFFSET 0x000c /* Core Companion Port Route Description */
  83. /* Host Controller Operational Register Offsets *********************************************/
  84. /* Paragraph 2.3 */
  85. #define EHCI_USBCMD_OFFSET 0x0000 /* USB Command */
  86. #define EHCI_USBSTS_OFFSET 0x0004 /* USB Status */
  87. #define EHCI_USBINTR_OFFSET 0x0008 /* USB Interrupt Enable */
  88. #define EHCI_FRINDEX_OFFSET 0x000c /* USB Frame Index */
  89. #define EHCI_CTRLDSSEGMENT_OFFSET 0x0010 /* 4G Segment Selector */
  90. #define EHCI_PERIODICLISTBASE_OFFSET 0x0014 /* Frame List Base Address */
  91. #define EHCI_ASYNCLISTADDR_OFFSET 0x0018 /* Next Asynchronous List Address */
  92. /* 0x001c-0x003f: Reserved */
  93. #define EHCI_CONFIGFLAG_OFFSET 0x0040 /* Configured Flag Register */
  94. /* Port Status/Control, Port 1-n */
  95. #define EHCI_PORTSC_OFFSET(n) (0x0044 + ((n-1) << 2))
  96. #define EHCI_PORTSC1_OFFSET 0x0044 /* Port Status/Control, Port 1 */
  97. #define EHCI_PORTSC2_OFFSET 0x0048 /* Port Status/Control, Port 2 */
  98. #define EHCI_PORTSC3_OFFSET 0x004c /* Port Status/Control, Port 3 */
  99. #define EHCI_PORTSC4_OFFSET 0x0050 /* Port Status/Control, Port 4 */
  100. #define EHCI_PORTSC5_OFFSET 0x0054 /* Port Status/Control, Port 5 */
  101. #define EHCI_PORTSC6_OFFSET 0x0058 /* Port Status/Control, Port 6 */
  102. #define EHCI_PORTSC7_OFFSET 0x005c /* Port Status/Control, Port 7 */
  103. #define EHCI_PORTSC8_OFFSET 0x0060 /* Port Status/Control, Port 8 */
  104. #define EHCI_PORTSC9_OFFSET 0x0064 /* Port Status/Control, Port 9 */
  105. #define EHCI_PORTSC10_OFFSET 0x0068 /* Port Status/Control, Port 10 */
  106. #define EHCI_PORTSC11_OFFSET 0x006c /* Port Status/Control, Port 11 */
  107. #define EHCI_PORTSC12_OFFSET 0x0070 /* Port Status/Control, Port 12 */
  108. #define EHCI_PORTSC13_OFFSET 0x0074 /* Port Status/Control, Port 13 */
  109. #define EHCI_PORTSC14_OFFSET 0x0078 /* Port Status/Control, Port 14 */
  110. #define EHCI_PORTSC15_OFFSET 0x007c /* Port Status/Control, Port 15 */
  111. /* Debug Register Offsets *******************************************************************/
  112. /* Paragraph C.3 */
  113. #define EHCI_DEBUG_PCS_OFFSET 0x0000 /* Debug Port Control/Status Register */
  114. #define EHCI_DEBUG_USBPIDS_OFFSET 0x0004 /* Debug USB PIDs Register */
  115. #define EHCI_DEBUG_DATA0_OFFSET 0x0008 /* Debug Data Buffer 0 Register [31:0] */
  116. #define EHCI_DEBUG_DATA1_OFFSET 0x000c /* Debug Data Buffer 1 Register [63:32] */
  117. #define EHCI_DEBUG_DEVADDR_OFFSET 0x0010 /* Debug Device Address Register */
  118. /* PCI Configuration Space Register Bit Definitions *****************************************/
  119. /* 0x0009-0x000b: Class Code. Paragraph 2.1.2 */
  120. #define EHCI_PCI_PI_SHIFT (0) /* Bits 0-7: Programming Interface */
  121. #define EHCI_PCI_PI_MASK (0xff << EHCI_PCI_PI_SHIFT)
  122. # define EHCI_PCI_PI (0x20 << EHCI_PCI_PI_SHIFT)
  123. #define EHCI_PCI_SCC_SHIFT (8) /* Bits 8-15: Sub-Class Code */
  124. #define EHCI_PCI_SCC_MASK (0xff << EHCI_PCI_SCC_SHIFT)
  125. # define EHCI_PCI_SCC (0x03 << EHCI_PCI_SCC_SHIFT)
  126. #define EHCI_PCI_BASEC_SHIFT (16) /* Base Class Code */
  127. #define EHCI_PCI_BASEC_MASK (0xff << EHCI_PCI_BASEC_SHIFT)
  128. # define EHCI_PCI_BASEC (0x0c << EHCI_PCI_BASEC_SHIFT)
  129. #define EHCI_PCI_CLASSC 0x000c0320 /* Default value (little endian) */
  130. /* 0x0010-0x0013: Base Address to Memory-mapped Host Controller Register
  131. * Space. Paragraph 2.1.3
  132. */
  133. /* Bit 0: Reserved */
  134. #define EHCI_PCIUSBBASE_TYPE_SHIFT (0) /* Bits 1-2: Type */
  135. #define EHCI_PCIUSBBASE_TYPE_MASK (3 << EHCI_PCIUSBBASE_TYPE_SHIFT)
  136. # define EHCI_PCIUSBBASE_TYPE_32BIT (3 << EHCI_PCIUSBBASE_TYPE_SHIFT) /* 32-bit addressing */
  137. # define EHCI_PCIUSBBASE_TYPE_64BIT (3 << EHCI_PCIUSBBASE_TYPE_SHIFT) /* 64-bit addressing */
  138. /* Bits 3-7: Reserved */
  139. #define EHCI_PCIUSBBASE_BASE_SHIFT (8) /* Bits 8-31: Base address */
  140. #define EHCI_PCIUSBBASE_BASE_MASK (0xffffff00)
  141. /* 0x0060: Serial Bus Release Number. Paragraph 2.1.4 */
  142. #define EHCI_PCI_SBRN_MASK 0xff /* Bits 0-7: Serial Bus Release Number */
  143. /* 0x0061: Frame Length Adjustment Register. Paragraph 2.1.5 */
  144. #define EHCI_PCI_FLADJ_SHIFT (0) /* Bit 0-5: Frame Length Timing Value */
  145. #define EHCI_PCI_FLADJ_MASK (0x3f >> EHCI_PCI_FLADJ_SHIFT)
  146. /* Bits 6-7: Reserved */
  147. /* 0x0062-0x0063: Port wake capabilities register (OPTIONAL). Paragraph 2.1.6 */
  148. #define EHCI_PCI_PORTWAKECAP_MASK (0xffff)
  149. /* EECP+0x0000: USB Legacy Support EHCI Extended Capability Register. Paragraph 2.1.7 */
  150. #define EHCI_PCI_USBLEGSUP_CAPID_SHIFT (0) /* Bits 0-7 Capability ID */
  151. #define EHCI_PCI_USBLEGSUP_CAPID_MASK (0xff << EHCI_PCI_USBLEGSUP_CAPID_SHIFT)
  152. #define EHCI_PCI_USBLEGSUP_NEECP_SHIFT (8) /* Bits 8-15: Next EHCI Extended Capability Pointer */
  153. #define EHCI_PCI_USBLEGSUP_NEECP_MASK (0xff << EHCI_PCI_USBLEGSUP_NEECP_SHIFT)
  154. #define EHCI_PCI_USBLEGSUP_BOWN (1 << 16) /* Bit 16: HC BIOS Owned Semaphore */
  155. /* Bits 17-23: Reserved */
  156. #define EHCI_PCI_USBLEGSUP_OSOWN (1 << 24) /* Bit 24: HC OS Owned Semaphore */
  157. /* Bits 25-31: Reserved */
  158. /* EECP+0x0000: USB Legacy Support Control and Status Register. Paragraph 2.1.8 */
  159. #define EHCI_PCI_USBLEGCTLSTS_USBCMPEN (1 << 0) /* Bit 0: USB SMI Enable */
  160. #define EHCI_PCI_USBLEGCTLSTS_USBERREN (1 << 1) /* Bit 1: SMI on USB Error Enable */
  161. #define EHCI_PCI_USBLEGCTLSTS_PCHEN (1 << 2) /* Bit 2: SMI on Port Change Enable */
  162. #define EHCI_PCI_USBLEGCTLSTS_FLREN (1 << 3) /* Bit 3: SMI on Frame List Rollover Enable */
  163. #define EHCI_PCI_USBLEGCTLSTS_HSEEN (1 << 4) /* Bit 4: SMI on Host System Error Enable */
  164. #define EHCI_PCI_USBLEGCTLSTS_AAEN (1 << 5) /* Bit 5: SMI on Async Advance Enable */
  165. /* Bits 6-12: Reserved */
  166. #define EHCI_PCI_USBLEGCTLSTS_OOEN (1 << 13) /* Bit 13: SMI on OS Ownership Enable */
  167. #define EHCI_PCI_USBLEGCTLSTS_PCEN (1 << 14) /* Bit 14: SMI on PCI Command Enable */
  168. #define EHCI_PCI_USBLEGCTLSTS_BAREN (1 << 15) /* Bit 15: SMI on BAR Enable */
  169. #define EHCI_PCI_USBLEGCTLSTS_USBCMP (1 << 16) /* Bit 16: SMI on USB Complete */
  170. #define EHCI_PCI_USBLEGCTLSTS_USBERR (1 << 17) /* Bit 17: SMI on USB Error */
  171. #define EHCI_PCI_USBLEGCTLSTS_PCH (1 << 18) /* Bit 18: SMI on Port Change Detect */
  172. #define EHCI_PCI_USBLEGCTLSTS_FLR (1 << 19) /* Bit 19: SMI on Frame List Rollover */
  173. #define EHCI_PCI_USBLEGCTLSTS_HSE (1 << 20) /* Bit 20: SMI on Host System Error */
  174. #define EHCI_PCI_USBLEGCTLSTS_AA (1 << 21) /* Bit 21: SMI on Async Advance */
  175. /* Bits 22-28: Reserved */
  176. #define EHCI_PCI_USBLEGCTLSTS_OO (1 << 29) /* Bit 29: SMI on OS Ownership Change */
  177. #define EHCI_PCI_USBLEGCTLSTS_PC (1 << 30) /* Bit 30: SMI on PCI Command */
  178. #define EHCI_PCI_USBLEGCTLSTS_BAR (1 << 31) /* Bit 31: SMI on BAR */
  179. /* Host Controller Capability Register Bit Definitions ***************************************/
  180. /* Paragraph 2.2 */
  181. /* Core Capability Register Length. Paragraph 2.2.1. 8-bit length. */
  182. /* Core Interface Version Number. Paragraph 2.2.2. Two byte BCD encoding */
  183. /* Core Structural Parameters. Paragraph 2.2.3 */
  184. #define EHCI_HCSPARAMS_NPORTS_SHIFT (0) /* Bit 0-3: Number of physical downstream ports */
  185. #define EHCI_HCSPARAMS_NPORTS_MASK (15 << EHCI_HCSPARAMS_NPORTS_SHIFT)
  186. #define EHCI_HCSPARAMS_PPC (1 << 4) /* Bit 4: Port Power Control */
  187. /* Bits 5-6: Reserved */
  188. #define EHCI_HCSPARAMS_PRR (1 << 7) /* Bit 7: Port Routing Rules */
  189. #define EHCI_HCSPARAMS_NPCC_SHIFT (8) /* Bit 8-11: Number of Ports per Companion Controller */
  190. #define EHCI_HCSPARAMS_NPCC_MASK (15 << EHCI_HCSPARAMS_NPCC_SHIFT)
  191. #define EHCI_HCSPARAMS_NCC_SHIFT (12) /* Bit 12-15: Number of Companion Controllers */
  192. #define EHCI_HCSPARAMS_NCC_MASK (15 << EHCI_HCSPARAMS_NCC_SHIFT)
  193. #define EHCI_HCSPARAMS_PIND (1 << 16) /* Bit 16: Port Indicators */
  194. /* Bits 17-19: Reserved */
  195. #define EHCI_HCSPARAMS_DBGPORT_SHIFT (20) /* Bit 20-23: Debug Port Number */
  196. #define EHCI_HCSPARAMS_DBGPORT_MASK (15 << EHCI_HCSPARAMS_DBGPORT_SHIFT)
  197. /* Bits 24-31: Reserved */
  198. /* Core Capability Parameters. Paragraph 2.2.4 */
  199. #define EHCI_HCCPARAMS_64BIT (1 << 0) /* Bit 0: 64-bit Addressing Capability */
  200. #define EHCI_HCCPARAMS_PFLF (1 << 1) /* Bit 1: Programmable Frame List Flag */
  201. #define EHCI_HCCPARAMS_ASPC (1 << 2) /* Bit 2: Asynchronous Schedule Park Capability */
  202. /* Bit 3: Reserved */
  203. #define EHCI_HCCPARAMS_IST_SHIFT (4) /* Bits 4-7: Isochronous Scheduling Threshold */
  204. #define EHCI_HCCPARAMS_IST_MASK (15 << EHCI_HCCPARAMS_IST_SHIFT)
  205. #define EHCI_HCCPARAMS_EECP_SHIFT (8) /* Bits 8-15: EHCI Extended Capabilities Pointer */
  206. #define EHCI_HCCPARAMS_EECP_MASK (0xff << EHCI_HCCPARAMS_EECP_SHIFT)
  207. /* Bits 16-31: Reserved */
  208. /* Core Companion Port Route Description. Paragraph 2.2.5. 15 x 4-bit array (60 bits) */
  209. /* Host Controller Operational Register Bit Definitions *************************************/
  210. /* Paragraph 2.3 */
  211. /* USB Command. Paragraph 2.3.1 */
  212. #define EHCI_USBCMD_RUN (1 << 0) /* Bit 0: Run/Stop */
  213. #define EHCI_USBCMD_HCRESET (1 << 1) /* Bit 1: Host Controller Reset */
  214. #define EHCI_USBCMD_FLSIZE_SHIFT (2) /* Bits 2-3: Frame List Size */
  215. #define EHCI_USBCMD_FLSIZE_MASK (3 << EHCI_USBCMD_FLSIZE_SHIFT)
  216. # define EHCI_USBCMD_FLSIZE_1024 (0 << EHCI_USBCMD_FLSIZE_SHIFT) /* 1024 elements (4096 bytes) */
  217. # define EHCI_USBCMD_FLSIZE_512 (1 << EHCI_USBCMD_FLSIZE_SHIFT) /* 512 elements (2048 bytes) */
  218. # define EHCI_USBCMD_FLSIZE_256 (2 << EHCI_USBCMD_FLSIZE_SHIFT) /* 256 elements (1024 bytes) */
  219. #define EHCI_USBCMD_PSEN (1 << 4) /* Bit 4: Periodic Schedule Enable */
  220. #define EHCI_USBCMD_ASEN (1 << 5) /* Bit 5: Asynchronous Schedule Enable */
  221. #define EHCI_USBCMD_IAADB (1 << 6) /* Bit 6: Interrupt on Async Advance Doorbell */
  222. #define EHCI_USBCMD_LRESET (1 << 7) /* Bit 7: Light Host Controller Reset */
  223. #define EHCI_USBCMD_PARKCNT_SHIFT (8) /* Bits 8-9: Asynchronous Schedule Park Mode Count */
  224. #define EHCI_USBCMD_PARKCNT_MASK (3 << EHCI_USBCMD_PARKCNT_SHIFT)
  225. /* Bit 10: Reserved */
  226. #define EHCI_USBCMD_PARK (1 << 11) /* Bit 11: Asynchronous Schedule Park Mode Enable */
  227. /* Bits 12-15: Reserved */
  228. #define EHCI_USBCMD_ITHRE_SHIFT (16) /* Bits 16-23: Interrupt Threshold Control */
  229. #define EHCI_USBCMD_ITHRE_MASK (0xff << EHCI_USBCMD_ITHRE_SHIFT)
  230. # define EHCI_USBCMD_ITHRE_1MF (0x01 << EHCI_USBCMD_ITHRE_SHIFT) /* 1 micro-frame */
  231. # define EHCI_USBCMD_ITHRE_2MF (0x02 << EHCI_USBCMD_ITHRE_SHIFT) /* 2 micro-frames */
  232. # define EHCI_USBCMD_ITHRE_4MF (0x04 << EHCI_USBCMD_ITHRE_SHIFT) /* 4 micro-frames */
  233. # define EHCI_USBCMD_ITHRE_8MF (0x08 << EHCI_USBCMD_ITHRE_SHIFT) /* 8 micro-frames (default, 1 ms) */
  234. # define EHCI_USBCMD_ITHRE_16MF (0x10 << EHCI_USBCMD_ITHRE_SHIFT) /* 16 micro-frames (2 ms) */
  235. # define EHCI_USBCMD_ITHRE_32MF (0x20 << EHCI_USBCMD_ITHRE_SHIFT) /* 32 micro-frames (4 ms) */
  236. # define EHCI_USBCMD_ITHRE_64MF (0x40 << EHCI_USBCMD_ITHRE_SHIFT) /* 64 micro-frames (8 ms) */
  237. /* Bits 24-31: Reserved */
  238. /* USB Status. Paragraph 2.3.2 */
  239. /* USB Interrupt Enable. Paragraph 2.3.3 */
  240. #define EHCI_INT_USBINT (1 << 0) /* Bit 0: USB Interrupt */
  241. #define EHCI_INT_USBERRINT (1 << 1) /* Bit 1: USB Error Interrupt */
  242. #define EHCI_INT_PORTSC (1 << 2) /* Bit 2: Port Change Detect */
  243. #define EHCI_INT_FLROLL (1 << 3) /* Bit 3: Frame List Rollover */
  244. #define EHCI_INT_SYSERROR (1 << 4) /* Bit 4: Host System Error */
  245. #define EHCI_INT_AAINT (1 << 5) /* Bit 5: Interrupt on Async Advance */
  246. #define EHCI_INT_ALLINTS (0x3f) /* Bits 0-5: All interrupts */
  247. /* Bits 6-11: Reserved */
  248. #define EHCI_USBSTS_HALTED (1 << 12) /* Bit 12: HC Halted */
  249. #define EHCI_USBSTS_RECLAM (1 << 13) /* Bit 13: Reclamation */
  250. #define EHCI_USBSTS_PSS (1 << 14) /* Bit 14: Periodic Schedule Status */
  251. #define EHCI_USBSTS_ASS (1 << 15) /* Bit 15: Asynchronous Schedule Status */
  252. /* Bits 16-31: Reserved */
  253. /* USB Frame Index. Paragraph 2.3.4 */
  254. #define EHCI_FRINDEX_MASK (0x1fff) /* Bits 0-13: Frame index */
  255. /* Bits 14-31: Reserved */
  256. /* 4G Segment Selector. Paragraph 2.3.5, Bits[64:32] of data structure addresses */
  257. /* Frame List Base Address. Paragraph 2.3.6 */
  258. /* Bits 0-11: Reserved */
  259. #define EHCI_PERIODICLISTBASE_MASK (0xfffff000) /* Bits 12-31: Base Address (Low) */
  260. /* Next Asynchronous List Address. Paragraph 2.3.7 */
  261. /* Bits 0-4: Reserved */
  262. #define EHCI_ASYNCLISTADDR_MASK (0xffffffe0) /* Bits 5-31: Link Pointer Low (LPL) */
  263. /* Configured Flag Register. Paragraph 2.3.8 */
  264. #define EHCI_CONFIGFLAG (1 << 0) /* Bit 0: Configure Flag */
  265. /* Bits 1-31: Reserved */
  266. /* Port Status/Control, Port 1-n. Paragraph 2.3.9 */
  267. #define EHCI_PORTSC_CCS (1 << 0) /* Bit 0: Current Connect Status */
  268. #define EHCI_PORTSC_CSC (1 << 1) /* Bit 1: Connect Status Change */
  269. #define EHCI_PORTSC_PE (1 << 2) /* Bit 2: Port Enable */
  270. #define EHCI_PORTSC_PEC (1 << 3) /* Bit 3: Port Enable/Disable Change */
  271. #define EHCI_PORTSC_OCA (1 << 4) /* Bit 4: Over-current Active */
  272. #define EHCI_PORTSC_OCC (1 << 5) /* Bit 5: Over-current Change */
  273. #define EHCI_PORTSC_RESUME (1 << 6) /* Bit 6: Force Port Resume */
  274. #define EHCI_PORTSC_SUSPEND (1 << 7) /* Bit 7: Suspend */
  275. #define EHCI_PORTSC_RESET (1 << 8) /* Bit 8: Port Reset */
  276. /* Bit 9: Reserved */
  277. #define EHCI_PORTSC_LSTATUS_SHIFT (10) /* Bits 10-11: Line Status */
  278. #define EHCI_PORTSC_LSTATUS_MASK (3 << EHCI_PORTSC_LSTATUS_SHIFT)
  279. # define EHCI_PORTSC_LSTATUS_SE0 (0 << EHCI_PORTSC_LSTATUS_SHIFT) /* SE0 Not Low-speed device, perform EHCI reset */
  280. # define EHCI_PORTSC_LSTATUS_KSTATE (1 << EHCI_PORTSC_LSTATUS_SHIFT) /* K-state Low-speed device, release ownership of port */
  281. # define EHCI_PORTSC_LSTATUS_JSTATE (2 << EHCI_PORTSC_LSTATUS_SHIFT) /* J-state Not Low-speed device, perform EHCI reset */
  282. #define EHCI_PORTSC_PP (1 << 12) /* Bit 12: Port Power */
  283. #define EHCI_PORTSC_OWNER (1 << 13) /* Bit 13: Port Owner */
  284. #define EHCI_PORTSC_PIC_SHIFT (14) /* Bits 14-15: Port Indicator Control */
  285. #define EHCI_PORTSC_PIC_MASK (3 << EHCI_PORTSC_PIC_SHIFT)
  286. # define EHCI_PORTSC_PIC_OFF (0 << EHCI_PORTSC_PIC_SHIFT) /* Port indicators are off */
  287. # define EHCI_PORTSC_PIC_AMBER (1 << EHCI_PORTSC_PIC_SHIFT) /* Amber */
  288. # define EHCI_PORTSC_PIC_GREEN (2 << EHCI_PORTSC_PIC_SHIFT) /* Green */
  289. #define EHCI_PORTSC_PTC_SHIFT (16) /* Bits 16-19: Port Test Control */
  290. #define EHCI_PORTSC_PTC_MASK (15 << EHCI_PORTSC_PTC_SHIFT)
  291. # define EHCI_PORTSC_PTC_DISABLED (0 << EHCI_PORTSC_PTC_SHIFT) /* Test mode not enabled */
  292. # define EHCI_PORTSC_PTC_JSTATE (1 << EHCI_PORTSC_PTC_SHIFT) /* Test J_STATE */
  293. # define EHCI_PORTSC_PTC_KSTATE (2 << EHCI_PORTSC_PTC_SHIFT) /* Test K_STATE */
  294. # define EHCI_PORTSC_PTC_SE0NAK (3 << EHCI_PORTSC_PTC_SHIFT) /* Test SE0_NAK */
  295. # define EHCI_PORTSC_PTC_PACKET (4 << EHCI_PORTSC_PTC_SHIFT) /* Test Packet */
  296. # define EHCI_PORTSC_PTC_ENABLE (5 << EHCI_PORTSC_PTC_SHIFT) /* Test FORCE_ENABLE */
  297. #define EHCI_PORTSC_WKCCNTE (1 << 20) /* Bit 20: Wake on Connect Enable */
  298. #define EHCI_PORTSC_WKDSCNNTE (1 << 21) /* Bit 21: Wake on Disconnect Enable */
  299. #define EHCI_PORTSC_WKOCE (1 << 22) /* Bit 22: Wake on Over-current Enable */
  300. /* Bits 23-31: Reserved */
  301. #define EHCI_PORTSC_ALLINTS (EHCI_PORTSC_CSC | EHCI_PORTSC_PEC | \
  302. EHCI_PORTSC_OCC | EHCI_PORTSC_RESUME)
  303. /* Debug Register Bit Definitions ***********************************************************/
  304. /* Debug Port Control/Status Register. Paragraph C.3.1 */
  305. #define EHCI_DEBUG_PCS_LENGTH_SHIFT (0) /* Bits 0-3: Data Length */
  306. #define EHCI_DEBUG_PCS_LENGTH_MASK (15 << EHCI_DEBUG_PCS_LENGTH_SHIFT)
  307. #define EHCI_DEBUG_PCS_WRITE (1 << 4) /* Bit 6: Write/Read# */
  308. #define EHCI_DEBUG_PCS_GO (1 << 5) /* Bit 5: Go */
  309. #define EHCI_DEBUG_PCS_ERROR (1 << 6) /* Bit 6: Error/Good# */
  310. #define EHCI_DEBUG_PCS_EXCEPTION_SHIFT (17) /* Bits 7-9: Exception */
  311. #define EHCI_DEBUG_PCS_EXCEPTION_MASK (7 << EHCI_DEBUG_PCS_EXCEPTION_SHIFT)
  312. #define EHCI_DEBUG_PCS_INUSE (1 << 10) /* Bit 10: In Use */
  313. /* Bits 11-15: Reserved */
  314. #define EHCI_DEBUG_PCS_DONE (1 << 16) /* Bit 16: Done */
  315. /* Bits 17-27: Reserved */
  316. #define EHCI_DEBUG_PCS_ENABLED (1 << 28) /* Bit 28: Enabled */
  317. /* Bit 29: Reserved */
  318. #define EHCI_DEBUG_PCS_OWNER (1 << 30) /* Bit 30: Owner */
  319. /* Bit 31: Reserved */
  320. /* Debug USB PIDs Register. Paragraph C.3.2 */
  321. #define EHCI_DEBUG_USBPIDS_TKPID_SHIFT (0) /* Bits 0-7: Token PID */
  322. #define EHCI_DEBUG_USBPIDS_TKPID_MASK (0xff << EHCI_DEBUG_USBPIDS_TKPID_SHIFT)
  323. #define EHCI_DEBUG_USBPIDS_SPID_SHIFT (8) /* Bits 8-15: Sent PID */
  324. #define EHCI_DEBUG_USBPIDS_SPID_MASK (0xff << EHCI_DEBUG_USBPIDS_SPID_SHIFT)
  325. #define EHCI_DEBUG_USBPIDS_RPID_SHIFT (16) /* Bits 16-23: Received PID */
  326. #define EHCI_DEBUG_USBPIDS_RPID_MASK (0xff << EHCI_DEBUG_USBPIDS_RPID_SHIFT)
  327. /* Bits 24-31: Reserved */
  328. /* Debug Data Buffer 0/1 Register [64:0]. Paragreph C.3.3. 64 bits of data. */
  329. /* Debug Device Address Register. Paragraph C.3.4 */
  330. #define EHCI_DEBUG_DEVADDR_ENDPT_SHIFT (0) /* Bit 0-3: USB Endpoint */
  331. #define EHCI_DEBUG_DEVADDR_ENDPT_MASK (15 << EHCI_DEBUG_DEVADDR_ENDPT_SHIFT)
  332. /* Bits 4-7: Reserved */
  333. #define EHCI_DEBUG_DEVADDR_ADDR_SHIFT (8) /* Bits 8-14: USB Address */
  334. #define EHCI_DEBUG_DEVADDR_ADDR_MASK (0x7f << EHCI_DEBUG_DEVADDR_ADDR_SHIFT)
  335. /* Bits 15-31: Reserved */
  336. /* Data Structures **************************************************************************/
  337. /* Paragraph 3 */
  338. /* Periodic Frame List. Paragraph 3.1 */
  339. #define PFL_T (1 << 0) /* Bit 0: Terminate, Link pointer invalid */
  340. #define PFL_TYP_SHIFT (1) /* Bits 1-2: Type */
  341. #define PFL_TYP_MASK (3 << PFL_TYP_SHIFT)
  342. # define PFL_TYP_ITD (0 << PFL_TYP_SHIFT) /* Isochronous Transfer Descriptor */
  343. # define PFL_TYP_QH (1 << PFL_TYP_SHIFT) /* Queue Head */
  344. # define PFL_TYP_SITD (2 << PFL_TYP_SHIFT) /* Split Transaction Isochronous Transfer Descriptor */
  345. # define PFL_TYP_FSTN (3 << PFL_TYP_SHIFT) /* Frame Span Traversal Node */
  346. /* Bits 3-4: zero */
  347. #define PFL_MASK (0xffffffe0) /* Bits 5-31: Frame List Link Pointer */
  348. /* Aysnchronous List Queue Head Pointer. Paragraph 3.2. Circular list of queue heads */
  349. /* Isochronous (High-Speed) Transfer Descriptor (iTD). Paragraph 3.3 */
  350. /* iTD Next Link Pointer. Paragraph 3.3.1 */
  351. #define ITD_NLP_T (1 << 0) /* Bit 0: Terminate, Link pointer invalid */
  352. #define ITD_NLP_TYP_SHIFT (1) /* Bits 1-2: Type */
  353. #define ITD_NLP_TYP_MASK (3 << ITD_NLP_TYP_SHIFT)
  354. # define ITD_NLP_TYP_ITD (0 << ITD_NLP_TYP_SHIFT) /* Isochronous Transfer Descriptor */
  355. # define ITD_NLP_TYP_QH (1 << ITD_NLP_TYP_SHIFT) /* Queue Head */
  356. # define ITD_NLP_TYP_SITD (2 << ITD_NLP_TYP_SHIFT) /* Split Transaction Isochronous Transfer Descriptor */
  357. # define ITD_NLP_TYP_FSTN (3 << ITD_NLP_TYP_SHIFT) /* Frame Span Traversal Node */
  358. /* Bits 3-4: zero */
  359. #define ITD_NLP_MASK (0xffffffe0) /* Bits 5-31: Frame List Link Pointer */
  360. /* iTD Transaction Status and Control List. Paragraph 3.3.2 */
  361. #define ITD_TRAN_XOFFS_SHIFT (0) /* Bits 0-11: Transaction X offset */
  362. #define ITD_TRAN_XOFFS_MASK (0xfff << ITD_TRAN_XOFFS_SHIFT)
  363. #define ITD_TRAN_PG_SHIFT (12) /* Bits 12-14: Page select */
  364. #define ITD_TRAN_PG_MASK (7 << ITD_TRAN_PG_SHIFT)
  365. #define ITD_TRAN_IOC (1 << 15) /* Bit 15: Interrupt On Comp */
  366. #define ITD_TRAN_LENGTH_SHIFT (16) /* Bits 16-27: Transaction length */
  367. #define ITD_TRAN_LENGTH_MASK (0xfff << ITD_TRAN_LENGTH_SHIFT)
  368. #define ITD_TRAN_STATUS_SHIFT (28) /* Bits 28-31: Transaction status */
  369. #define ITD_TRAN_STATUS_MASK (15 << ITD_TRAN_STATUS_SHIFT)
  370. # define ITD_TRAN_STATUS_XACTERR (1 << 28) /* Bit 28: Transaction error */
  371. # define ITD_TRAN_STATUS_BABBLE (1 << 29) /* Bit 29: Babble Detected */
  372. # define ITD_TRAN_STATUS_DBERROR (1 << 30) /* Bit 30: Data Buffer Error */
  373. # define ITD_TRAN_STATUS_ACTIVE (1 << 31) /* Bit 28: Transaction error */
  374. /* iTD Buffer Page Pointer List. Paragraph 3.3.4 */
  375. /* iTD Buffer Pointer Page 0. Table 3-4 */
  376. #define ITD_BUFPTR0_DEVADDR_SHIFT (0) /* Bits 0-6: Device Address */
  377. #define ITD_BUFPTR0_DEVADDR_MASK (0x7f << ITD_BUFPTR0_DEVADDR_SHIFT)
  378. /* Bit 7: Reserved */
  379. #define ITD_BUFPTR0_ENDPT_SHIFT (8) /* Bits 8-11: Endpoint Number */
  380. #define ITD_BUFPTR0_ENDPT_MASK (15 << ITD_BUFPTR0_ENDPT_SHIFT)
  381. /* iTD Buffer Pointer Page 1. Table 3-5 */
  382. #define ITD_BUFPTR1_MAXPKT_SHIFT (0) /* Bits 0-10: Maximum Packet Size */
  383. #define ITD_BUFPTR1_MAXPKT_MASK (0x7ff << ITD_BUFPTR1_MAXPKT_SHIFT)
  384. #define ITD_BUFPTR1_DIRIN (1 << 11) /* Bit 11: Direction 1=IN */
  385. #define ITD_BUFPTR1_DIROUT (0) /* Bit 11: Direction 0=OUT */
  386. /* iTD Buffer Pointer Page 2. Table 3-6 */
  387. #define ITD_BUFPTR2_MULTI_SHIFT (0) /* Bits 0-1: Multi */
  388. #define ITD_BUFPTR2_MULTI_MASK (3 << ITD_BUFPTR2_MULTI_SHIFT)
  389. # define ITD_BUFPTR2_MULTI_1 (1 << ITD_BUFPTR2_MULTI_SHIFT) /* One transaction per micro-frame */
  390. # define ITD_BUFPTR2_MULTI_2 (2 << ITD_BUFPTR2_MULTI_SHIFT) /* Two transactions per micro-frame */
  391. # define ITD_BUFPTR2_MULTI_3 (3 << ITD_BUFPTR2_MULTI_SHIFT) /* Three transactions per micro-frame */
  392. /* Bits 2-11: Reserved */
  393. /* iTD Buffer Pointer Page 3-6. Table 3-7 */
  394. /* Bits 0-11: Reserved */
  395. /* iTD Buffer Pointer All Pages */
  396. #define ITD_BUFPTR_MASK (0xfffff000) /* Bits 12-31: Buffer Pointer */
  397. /* Split Transaction Isochronous Transfer Descriptor (siTD). Paragraph 3.4 */
  398. /* siTD Next Link Pointer. Paragraph 3.4.1 */
  399. #define SITD_NLP_T (1 << 0) /* Bit 0: Terminate, Link pointer invalid */
  400. #define SITD_NLP_TYP_SHIFT (1) /* Bits 1-2: Type */
  401. #define SITD_NLP_TYP_MASK (3 << SITD_NLP_TYP_SHIFT)
  402. # define SITD_NLP_TYP_ITD (0 << SITD_NLP_TYP_SHIFT) /* Isochronous Transfer Descriptor */
  403. # define SITD_NLP_TYP_QH (1 << SITD_NLP_TYP_SHIFT) /* Queue Head */
  404. # define SITD_NLP_TYP_SITD (2 << SITD_NLP_TYP_SHIFT) /* Split Transaction Isochronous Transfer Descriptor */
  405. # define SITD_NLP_TYP_FSTN (3 << SITD_NLP_TYP_SHIFT) /* Frame Span Traversal Node */
  406. /* Bits 3-4: zero */
  407. #define SITD_NLP_MASK (0xffffffe0) /* Bits 5-31: Frame List Link Pointer */
  408. /* siTD Endpoint Capabilities/Characteristics. Paragraph 3.4.2 */
  409. /* Endpoint and Transaction Translator Characteristics. Table 3-9 */
  410. #define SITD_EPCHAR_DEVADDR_SHIFT (0) /* Bitx 0-6: Device Address */
  411. #define SITD_EPCHAR_DEVADDR_MASK (0x7f << SITD_EPCHAR_DEVADDR_SHIFT)
  412. /* Bits 7: Reserved */
  413. #define SITD_EPCHAR_ENDPT_SHIFT (8) /* Bitx 8-11: Endpoint Number */
  414. #define SITD_EPCHAR_ENDPT_MASK (15 << SITD_EPCHAR_ENDPT_SHIFT)
  415. /* Bits 12-15: Reserved */
  416. #define SITD_EPCHAR_HUBADDR_SHIFT (16) /* Bitx 16-22: Hub Address */
  417. #define SITD_EPCHAR_HUBADDR_MASK (0x7f << SITD_EPCHAR_HUBADDR_SHIFT)
  418. /* Bit 23: Reserved */
  419. #define SITD_EPCHAR_DIRIN (1 << 31) /* Bit 31: Direction 1=IN */
  420. #define SITD_EPCHAR_DIROUT (0) /* Bit 31: Direction 0=OUT */
  421. /* Micro-frame Schedule Control. Table 3-10 */
  422. #define SITD_FMSCHED_SSMASK_SHIFT (0) /* Bitx 0-7: Split Start Mask (µFrame S-mask) */
  423. #define SITD_FMSCHED_SSMASK_MASK (0xff << SITD_FMSCHED_SSMASK_SHIFT)
  424. # define SITD_FMSCHED_SSMASK(n) ((n) << SITD_FMSCHED_SSMASK_SHIFT)
  425. #define SITD_FMSCHED_SCMASK_SHIFT (8) /* Bitx 8-15: Split Completion Mask (µFrame C-Mask) */
  426. #define SITD_FMSCHED_SCMASK_MASK (0xff << SITD_FMSCHED_SCMASK_SHIFT)
  427. # define SITD_FMSCHED_SCMASK(n) ((n) << SITD_FMSCHED_SCMASK_SHIFT)
  428. /* Bits 16-31: Reserved */
  429. /* siTD Transfer State. Paragraph 3.4.3 */
  430. #define SITD_XFRSTATE_STATUS_SHIFT (0) /* Bits 0-7: Status */
  431. #define SITD_XFRSTATE_STATUS_MASK (0xff << SITD_XFRSTATE_STATUS_SHIFT)
  432. #define SITD_XFRSTATE_CPROGMASK_SHIFT (8) /* Bits 8-15: µFrame Complete-split Progress Mask */
  433. #define SITD_XFRSTATE_CPROGMASK_MASK (0xff << SITD_XFRSTATE_CPROGMASK_SHIFT)
  434. #define SITD_XFRSTATE_NBYTES_SHIFT (16) /* Bits 16-25: Total Bytes To Transfer */
  435. #define SITD_XFRSTATE_NBYTES_MASK (0x3ff << SITD_XFRSTATE_NBYTES_SHIFT)
  436. /* Bits 26-29: Reserved */
  437. #define SITD_XFRSTATE_P (1 << 30) /* Bit 30: Page Select */
  438. #define SITD_XFRSTATE_IOC (1 << 31) /* Bit 31: Interrupt On Complete */
  439. /* siTD Buffer Pointer List. Paragraph 3.4.4 */
  440. /* Page 0 */
  441. #define SITD_BUFPTR0_OFFSET_SHIFT (0) /* Bits 0-11: Current Offset */
  442. #define SITD_BUFPTR0_OFFSET_MASK (0xff << SITD_BUFPTR0_OFFSET_SHIFT)
  443. /* Page 1 */
  444. #define SITD_BUFPTR1_TCOUNT_SHIFT (0) /* Bits 0-2: Transaction count */
  445. #define SITD_BUFPTR1_TCOUNT_MASK (7 << SITD_BUFPTR1_TCOUNT_SHIFT)
  446. #define SITD_BUFPTR1_TP_SHIFT (33) /* Bits 3-4: Transaction position */
  447. #define SITD_BUFPTR1_TP_MASK (3 << SITD_BUFPTR1_TP_SHIFT)
  448. # define SITD_BUFPTR1_TP_ENTIRE (0 << SITD_BUFPTR1_TP_SHIFT) /* Entire full-speed transaction data payload. */
  449. # define SITD_BUFPTR1_TP_BEGIN (1 << SITD_BUFPTR1_TP_SHIFT) /* This is the first data payload */
  450. # define SITD_BUFPTR1_TP_MID (2 << SITD_BUFPTR1_TP_SHIFT) /* This the middle payload */
  451. # define SITD_BUFPTR1_TP_END (3 << SITD_BUFPTR1_TP_SHIFT) /* This is the last payload */
  452. /* Bits 5-11: Reserved */
  453. /* All pages */
  454. #define SITD_BUFPTR_MASK (0xfffff000) /* Bits 12-31: Buffer Pointer List */
  455. /* Queue Element Transfer Descriptor (qTD). Paragraph 3.5 */
  456. /* Next qTD Pointer. Paragraph 3.5.1 */
  457. #define QTD_NQP_T (1 << 0) /* Bit 0: Terminate */
  458. /* Bits 1-4: Reserved */
  459. #define QTD_NQP_NTEP_SHIFT (5) /* Bits 5-31: Next Transfer Element Pointer */
  460. #define QTD_NQP_NTEP_MASK (0xffffffe0)
  461. /* Alternate Next qTD Pointer. Paragraph 3.5.2 */
  462. #define QTD_AQP_T (1 << 0) /* Bit 0: Terminate */
  463. /* Bits 1-4: Reserved */
  464. #define QTD_AQP_NTEP_SHIFT (5) /* Bits 5-31: Next Transfer Element Pointer */
  465. #define QTD_AQP_NTEP_MASK (0xffffffe0)
  466. /* qTD Token. Paragraph 3.5.3 */
  467. #define QTD_TOKEN_STATUS_SHIFT (0) /* Bits 0-7: Status */
  468. #define QTD_TOKEN_STATUS_MASK (0xff << QTD_TOKEN_STATUS_SHIFT)
  469. # define QTD_TOKEN_P (1 << 0) /* Bit 0 Ping State */
  470. # define QTD_TOKEN_ERR (1 << 0) /* Bit 0 Error */
  471. # define QTD_TOKEN_SPLITXSTATE (1 << 1) /* Bit 1 Split Transaction State */
  472. # define QTD_TOKEN_MMF (1 << 2) /* Bit 2 Missed Micro-Frame */
  473. # define QTD_TOKEN_XACTERR (1 << 3) /* Bit 3 Transaction Error */
  474. # define QTD_TOKEN_BABBLE (1 << 4) /* Bit 4 Babble Detected */
  475. # define QTD_TOKEN_DBERR (1 << 5) /* Bit 5 Data Buffer Error */
  476. # define QTD_TOKEN_HALTED (1 << 6) /* Bit 6 Halted */
  477. # define QTD_TOKEN_ACTIVE (1 << 7) /* Bit 7 Active */
  478. # define QTD_TOKEN_ERRORS (0x78 << QTD_TOKEN_STATUS_SHIFT)
  479. #define QTD_TOKEN_PID_SHIFT (8) /* Bits 8-9: PID Code */
  480. #define QTD_TOKEN_PID_MASK (3 << QTD_TOKEN_PID_SHIFT)
  481. # define QTD_TOKEN_PID_OUT (0 << QTD_TOKEN_PID_SHIFT) /* OUT Token generates token (E1H) */
  482. # define QTD_TOKEN_PID_IN (1 << QTD_TOKEN_PID_SHIFT) /* IN Token generates token (69H) */
  483. # define QTD_TOKEN_PID_SETUP (2 << QTD_TOKEN_PID_SHIFT) /* SETUP Token generates token (2DH) */
  484. #define QTD_TOKEN_CERR_SHIFT (10) /* Bits 10-11: Error Counter */
  485. #define QTD_TOKEN_CERR_MASK (3 << QTD_TOKEN_CERR_SHIFT)
  486. #define QTD_TOKEN_CPAGE_SHIFT (12) /* Bits 12-14: Current Page */
  487. #define QTD_TOKEN_CPAGE_MASK (7 << QTD_TOKEN_CPAGE_SHIFT)
  488. #define QTD_TOKEN_IOC (1 << 15) /* Bit 15: Interrupt On Complete */
  489. #define QTD_TOKEN_NBYTES_SHIFT (16) /* Bits 16-30: Total Bytes to Transfer */
  490. #define QTD_TOKEN_NBYTES_MASK (0x7fff << QTD_TOKEN_NBYTES_SHIFT)
  491. #define QTD_TOKEN_TOGGLE_SHIFT (31) /* Bit 31: Data Toggle */
  492. #define QTD_TOKEN_TOGGLE (1 << 31) /* Bit 31: Data Toggle */
  493. /* qTD Buffer Page Pointer List. Paragraph 3.5.4 */
  494. /* Page 0 */
  495. #define QTD_BUFPTR0_OFFFSET_SHIFT (0) /* Bits 0-11: Current Offset */
  496. #define QTD_BUFPTR0_OFFFSET_MASK (0xfff << QTD_BUFPTR0_OFFFSET_SHIFT)
  497. /* Other pages */
  498. /* Bits 0-11: Reserved */
  499. /* All pages */
  500. #define QTD_BUFPTR_SHIFT (12) /* Bits 12-31: Buffer Pointer List */
  501. #define QTD_BUFPTR_MASK (0xfffff000)
  502. /* Queue Head. Paragraph 3.6 */
  503. /* Queue Head Horizontal Link Pointer. Paragraph 3.6.1 */
  504. #define QH_HLP_T (1 << 0) /* Bit 0: Terminate, QH HL pointer invalid */
  505. #define QH_HLP_TYP_SHIFT (1) /* Bits 1-2: Type */
  506. #define QH_HLP_TYP_MASK (3 << QH_HLP_TYP_SHIFT)
  507. # define QH_HLP_TYP_ITD (0 << QH_HLP_TYP_SHIFT) /* Isochronous Transfer Descriptor */
  508. # define QH_HLP_TYP_QH (1 << QH_HLP_TYP_SHIFT) /* Queue Head */
  509. # define QH_HLP_TYP_SITD (2 << QH_HLP_TYP_SHIFT) /* Split Transaction Isochronous Transfer Descriptor */
  510. # define QH_HLP_TYP_FSTN (3 << QH_HLP_TYP_SHIFT) /* Frame Span Traversal Node */
  511. /* Bits 3-4: Reserved */
  512. #define QH_HLP_MASK (0xffffffe0) /* Bits 5-31: Queue Head Horizontal Link Pointer */
  513. /* Endpoint Capabilities/Characteristics. Paragraph 3.6.2 */
  514. /* Endpoint Characteristics: Queue Head DWord. Table 3-19 */
  515. #define QH_EPCHAR_DEVADDR_SHIFT (0) /* Bitx 0-6: Device Address */
  516. #define QH_EPCHAR_DEVADDR_MASK (0x7f << QH_EPCHAR_DEVADDR_SHIFT)
  517. #define QH_EPCHAR_I (1 << 7) /* Bit 7: Inactivate on Next Transaction */
  518. #define QH_EPCHAR_ENDPT_SHIFT (8) /* Bitx 8-11: Endpoint Number */
  519. #define QH_EPCHAR_ENDPT_MASK (15 << QH_EPCHAR_ENDPT_SHIFT)
  520. #define QH_EPCHAR_EPS_SHIFT (12) /* Bitx 12-13: Endpoint Speed */
  521. #define QH_EPCHAR_EPS_MASK (3 << QH_EPCHAR_EPS_SHIFT)
  522. # define QH_EPCHAR_EPS_FULL (0 << QH_EPCHAR_EPS_SHIFT) /* Full-Speed (12Mbs) */
  523. # define QH_EPCHAR_EPS_LOW (1 << QH_EPCHAR_EPS_SHIFT) /* Low-Speed (1.5Mbs) */
  524. # define QH_EPCHAR_EPS_HIGH (2 << QH_EPCHAR_EPS_SHIFT) /* High-Speed (480 Mb/s) */
  525. #define QH_EPCHAR_DTC (1 << 14) /* Bit 14: Data Toggle Control */
  526. #define QH_EPCHAR_H (1 << 15) /* Bit 15: Head of Reclamation List Flag */
  527. #define QH_EPCHAR_MAXPKT_SHIFT (16) /* Bitx 16-26: Maximum Packet Length */
  528. #define QH_EPCHAR_MAXPKT_MASK (0x7ff << QH_EPCHAR_MAXPKT_SHIFT)
  529. #define QH_EPCHAR_C (1 << 27) /* Bit 27: Control Endpoint Flag */
  530. #define QH_EPCHAR_RL_SHIFT (28) /* Bitx 28-31: Nak Count Reload */
  531. #define QH_EPCHAR_RL_MASK (15 << QH_EPCHAR_RL_SHIFT)
  532. /* Endpoint Capabilities: Queue Head DWord 2. Table 3-20 */
  533. #define QH_EPCAPS_SSMASK_SHIFT (0) /* Bitx 0-7: Interrupt Schedule Mask (µFrame S-mask) */
  534. #define QH_EPCAPS_SSMASK_MASK (0xff << QH_EPCAPS_SSMASK_SHIFT)
  535. # define QH_EPCAPS_SSMASK(n) ((n) << QH_EPCAPS_SSMASK_SHIFT)
  536. #define QH_EPCAPS_SCMASK_SHIFT (8) /* Bitx 8-15: Split Completion Mask (µFrame C-Mask) */
  537. #define QH_EPCAPS_SCMASK_MASK (0xff << QH_EPCAPS_SCMASK_SHIFT)
  538. # define QH_EPCAPS_SCMASK(n) ((n) << QH_EPCAPS_SCMASK_SHIFT)
  539. #define QH_EPCAPS_HUBADDR_SHIFT (16) /* Bitx 16-22: Hub Address */
  540. #define QH_EPCAPS_HUBADDR_MASK (0x7f << QH_EPCAPS_HUBADDR_SHIFT)
  541. # define QH_EPCAPS_HUBADDR(n) ((n) << QH_EPCAPS_HUBADDR_SHIFT)
  542. #define QH_EPCAPS_PORT_SHIFT (23) /* Bit 23-29: Port Number */
  543. #define QH_EPCAPS_PORT_MASK (0x7f << QH_EPCAPS_PORT_SHIFT)
  544. # define QH_EPCAPS_PORT(n) ((n) << QH_EPCAPS_PORT_SHIFT)
  545. #define QH_EPCAPS_MULT_SHIFT (30) /* Bit 30-31: High-Bandwidth Pipe Multiplier */
  546. #define QH_EPCAPS_MULT_MASK (3 << QH_EPCAPS_MULT_SHIFT)
  547. # define QH_EPCAPS_MULT(n) ((n) << QH_EPCAPS_MULT_SHIFT)
  548. /* Current qTD Link Pointer. Table 3-21 */
  549. #define QH_CQP_NTEP_SHIFT (5) /* Bits 5-31: Next Transfer Element Pointer */
  550. #define QH_CQP_NTEP_MASK (0xffffffe0)
  551. /* Transfer Overlay. Paragraph 3.6.3
  552. *
  553. * NOTES:
  554. * 1. Same as the field of the same name in struct ehci_qtd_s
  555. * 2. Similar to the field of the same name in struct ehci_qtd_s, but with some
  556. * additional bitfields.
  557. */
  558. /* Next qTD Pointer (NOTE 1) */
  559. #define QH_NQP_T (1 << 0) /* Bit 0: Terminate */
  560. /* Bits 1-4: Reserved */
  561. #define QH_NQP_NTEP_SHIFT (5) /* Bits 5-31: Next Transfer Element Pointer */
  562. #define QH_NQP_NTEP_MASK (0xffffffe0)
  563. /* Alternate Next qTD Pointer. Table 3.7 (NOTE 2) */
  564. #define QH_AQP_T (1 << 0) /* Bit 0: Terminate */
  565. #define QH_AQP_NAKCNT (1) /* Bits 1-4: Nak Counter */
  566. #define QH_AQP_NTEP_SHIFT (5) /* Bits 5-31: Next Transfer Element Pointer */
  567. #define QH_AQP_NTEP_MASK (0xffffffe0)
  568. /* qTD Token (NOTE 1) */
  569. #define QH_TOKEN_STATUS_SHIFT (0) /* Bits 0-7: Status */
  570. #define QH_TOKEN_STATUS_MASK (0xff << QH_TOKEN_STATUS_SHIFT)
  571. # define QH_TOKEN_P (1 << 0) /* Bit 0 Ping State */
  572. # define QH_TOKEN_ERR (1 << 0) /* Bit 0 Error */
  573. # define QH_TOKEN_SPLITXSTATE (1 << 1) /* Bit 1 Split Transaction State */
  574. # define QH_TOKEN_MMF (1 << 2) /* Bit 2 Missed Micro-Frame */
  575. # define QH_TOKEN_XACTERR (1 << 3) /* Bit 3 Transaction Error */
  576. # define QH_TOKEN_BABBLE (1 << 4) /* Bit 4 Babble Detected */
  577. # define QH_TOKEN_DBERR (1 << 5) /* Bit 5 Data Buffer Error */
  578. # define QH_TOKEN_HALTED (1 << 6) /* Bit 6 Halted */
  579. # define QH_TOKEN_ACTIVE (1 << 7) /* Bit 7 Active */
  580. # define QH_TOKEN_ERRORS (0x78 << QH_TOKEN_STATUS_SHIFT)
  581. #define QH_TOKEN_PID_SHIFT (8) /* Bits 8-9: PID Code */
  582. #define QH_TOKEN_PID_MASK (3 << QH_TOKEN_PID_SHIFT)
  583. # define QH_TOKEN_PID_OUT (0 << QH_TOKEN_PID_SHIFT) /* OUT Token generates token (E1H) */
  584. # define QH_TOKEN_PID_IN (1 << QH_TOKEN_PID_SHIFT) /* IN Token generates token (69H) */
  585. # define QH_TOKEN_PID_SETUP (2 << QH_TOKEN_PID_SHIFT) /* SETUP Token generates token (2DH) */
  586. #define QH_TOKEN_CERR_SHIFT (10) /* Bits 10-11: Error Counter */
  587. #define QH_TOKEN_CERR_MASK (3 << QH_TOKEN_CERR_SHIFT)
  588. #define QH_TOKEN_CPAGE_SHIFT (12) /* Bits 12-14: Current Page */
  589. #define QH_TOKEN_CPAGE_MASK (7 << QH_TOKEN_CPAGE_SHIFT)
  590. #define QH_TOKEN_IOC (1 << 15) /* Bit 15: Interrupt On Complete */
  591. #define QH_TOKEN_NBYTES_SHIFT (16) /* Bits 16-30: Total Bytes to Transfer */
  592. #define QH_TOKEN_NBYTES_MASK (0x7fff << QH_TOKEN_NBYTES_SHIFT)
  593. #define QH_TOKEN_TOGGLE_SHIFT (31) /* Bit 31: Data Toggle */
  594. #define QH_TOKEN_TOGGLE (1 << 31) /* Bit 31: Data Toggle */
  595. /* Buffer Page Pointer List (NOTE 2)
  596. /* Page 0 */
  597. #define QH_BUFPTR0_OFFFSET_SHIFT (0) /* Bits 0-11: Current Offset */
  598. #define QH_BUFPTR0_OFFFSET_MASK (0xfff << QH_BUFPTR0_OFFFSET_SHIFT)
  599. /* Page 1. Table 3.22 */
  600. #define QH_BUFPTR1_CPROGMASK_SHIFT (0) /* Bits 0-7: Split-transaction Complete-split Progress */
  601. #define QH_BUFPTR1_CPROGMASK_MASK (0xff << QH_BUFPTR1_CPROGMASK_SHIFT)
  602. /* Bits 8-11: Reserved */
  603. /* Page 2. Table 3.22 */
  604. #define QH_BUFPTR2_FRAMETAG_SHIFT (0) /* Bits 0-4: Split-transaction Frame Tag */
  605. #define QH_BUFPTR2_FRAMETAG_MASK (31 << QH_BUFPTR2_FRAMETAG_SHIFT)
  606. #define QH_BUFPTR2_SBYTES_SHIFT (5) /* Bits 5-11: S-bytes */
  607. #define QH_BUFPTR2_SBYTES_MASK (0x7f << QH_BUFPTR2_SBYTES_SHIFT)
  608. /* Other pages */
  609. /* Bits 0-11: Reserved */
  610. /* All pages */
  611. #define QH_BUFPTR_SHIFT (12) /* Bits 12-31: Buffer Pointer List */
  612. #define QH_BUFPTR_MASK (0xfffff000)
  613. /* Periodic Frame Span Traversal Node (STN). Paragrap 3.7 */
  614. /* FSTN Normal Path Pointer. Paragraph 3.7.1 */
  615. #define FSTN_NPP_T (1 << 0) /* Bit 0: Terminate. 1=Link Pointer not valid */
  616. #define FSTN_NPP_TYP_SHIFT (1) /* Bits 1-2: Type */
  617. #define FSTN_NPP_TYP_MASK (3 << FSTN_NPP_TYP_SHIFT)
  618. # define FSTN_NPP_TYP_ITD (0 << FSTN_NPP_TYP_SHIFT) /* Isochronous Transfer Descriptor */
  619. # define FSTN_NPP_TYP_QH (1 << FSTN_NPP_TYP_SHIFT) /* Queue Head */
  620. # define FSTN_NPP_TYP_SITD (2 << FSTN_NPP_TYP_SHIFT) /* Split Transaction Isochronous Transfer Descriptor */
  621. # define FSTN_NPP_TYP_FSTN (3 << FSTN_NPP_TYP_SHIFT) /* Frame Span Traversal Node */
  622. /* Bits 3-4: Reserved */
  623. #define FSTN_NPP_NPLP_SHIFT (5) /* Bits 5-31: Normal Path Link Pointer */
  624. #define FSTN_NPP_NPLP_MASK (0xffffffe0)
  625. /* FSTN Back Path Link Pointer. Paragraph 3.7.2 */
  626. #define FSTN_BPP_T (1 << 0) /* Bit 0: Terminate. 1=Link Pointer not valid */
  627. #define FSTN_BPP_TYP_SHIFT (1) /* Bits 1-2: Type */
  628. #define FSTN_BPP_TYP_MASK (3 << FSTN_BPP_TYP_SHIFT)
  629. # define FSTN_BPP_TYP_QH (1 << FSTN_BPP_TYP_SHIFT) /* Queue Head */
  630. /* Bits 3-4: Reserved */
  631. #define FSTN_BPP_BPLP_SHIFT (5) /* Bits 5-31: Back Path Link Pointer */
  632. #define FSTN_BPP_BPLP_MASK (0xffffffe0)
  633. /********************************************************************************************
  634. * Public Types
  635. ********************************************************************************************/
  636. /* Registers ********************************************************************************/
  637. /* Since the operational registers are not known a compile time, representing register blocks
  638. * with structures is more convenient than using individual register offsets.
  639. */
  640. /* Host Controller Capability Registers. This register block must be positioned at a well
  641. * known address.
  642. */
  643. struct ehci_hccr_s
  644. {
  645. uint8_t caplength; /* 0x00: Capability Register Length */
  646. uint8_t reserved;
  647. uint16_t hciversion; /* 0x02: Interface Version Number */
  648. uint32_t hcsparams; /* 0x04: Structural Parameters */
  649. uint32_t hccparams; /* 0x08: Capability Parameters */
  650. uint8_t hcspportrt[8]; /* 0x0c: Companion Port Route Description */
  651. };
  652. /* Host Controller Operational Registers. This register block is positioned at an offset
  653. * of 'caplength' from the beginning of the Host Controller Capability Registers.
  654. */
  655. struct ehci_hcor_s
  656. {
  657. uint32_t usbcmd; /* 0x00: USB Command */
  658. uint32_t usbsts; /* 0x04: USB Status */
  659. uint32_t usbintr; /* 0x08: USB Interrupt Enable */
  660. uint32_t frindex; /* 0x0c: USB Frame Index */
  661. uint32_t ctrldssegment; /* 0x10: 4G Segment Selector */
  662. uint32_t periodiclistbase; /* 0x14: Frame List Base Address */
  663. uint32_t asynclistaddr; /* 0x18: Next Asynchronous List Address */
  664. uint32_t reserved[9];
  665. uint32_t configflag; /* 0x40: Configured Flag Register */
  666. uint32_t portsc[15]; /* 0x44: Port Status/Control */
  667. };
  668. /* USB2 Debug Port Register Interface. This register block is normally found via the PCI
  669. * capabalities. In non-PCI implementions, you need apriori information about the location
  670. * of these registers.
  671. */
  672. struct ehci_debug_s
  673. {
  674. uint32_t psc; /* 0x00: Debug Port Control/Status Register */
  675. uint32_t pids; /* 0x04: Debug USB PIDs Register */
  676. uint32_t data[2]; /* 0x08: Debug Data buffer Registers */
  677. uint32_t addr; /* 0x10: Device Address Register */
  678. };
  679. /* Data Structures **************************************************************************/
  680. /* Paragraph 3 */
  681. /* Periodic Frame List. Paragraph 3.1. An array of pointers. */
  682. /* Aysnchronous List Queue Head Pointer. Paragraph 3.2. Circular list of queue heads */
  683. /* Isochronous (High-Speed) Transfer Descriptor (iTD). Paragraph 3.3. Must be aligned to
  684. * 32-byte boundaries.
  685. */
  686. struct ehci_itd_s
  687. {
  688. uint32_t nlp; /* 0x00-0x03: Next link pointer */
  689. uint32_t trans[8]; /* 0x04-0x23: Transaction Status and Control List */
  690. uint32_t bpl[7]; /* 0x24-0x3c: Buffer Page Pointer List */
  691. };
  692. #define SIZEOF_EHCI_ITD_S (64) /* 16*sizeof(uint32_t) */
  693. /* Split Transaction Isochronous Transfer Descriptor (siTD). Paragraph 3.4 */
  694. struct ehci_sitd_s
  695. {
  696. uint32_t nlp; /* 0x00-0x03: Next link pointer */
  697. uint32_t epchar; /* 0x04-0x07: Endpoint and Transaction Translator Characteristics */
  698. uint32_t fmsched; /* 0x08-0x0b: Micro-frame Schedule Control */
  699. uint32_t xfrstate; /* 0x0c-0x0f: Transfer Status and Control */
  700. uint32_t bpl[2]; /* 0x10-0x17: Buffer Pointer List */
  701. uint32_t blp; /* 0x18-0x1b: Back link pointer */
  702. };
  703. #define SIZEOF_EHCI_SITD_S (28) /* 7*sizeof(uint32_t) */
  704. /* Queue Element Transfer Descriptor (qTD). Paragraph 3.5 */
  705. /* 32-bit version. See EHCI Appendix B for the 64-bit version. */
  706. struct ehci_qtd_s
  707. {
  708. uint32_t nqp; /* 0x00-0x03: Next qTD Pointer */
  709. uint32_t alt; /* 0x04-0x07: Alternate Next qTD Pointer */
  710. uint32_t token; /* 0x08-0x0b: qTD Token */
  711. uint32_t bpl[5]; /* 0x0c-0x1c: Buffer Page Pointer List */
  712. };
  713. #define SIZEOF_EHCI_QTD_S (32) /* 8*sizeof(uint32_t) */
  714. /* Queue Head. Paragraph 3.6
  715. *
  716. * NOTE:
  717. * 1. Same as the field of the same name in struct ehci_qtd_s
  718. * 2. Similar to the field of the same name in struct ehci_qtd_s, but with some
  719. * additional bitfields.
  720. */
  721. struct ehci_overlay_s
  722. {
  723. uint32_t nqp; /* 0x00-0x03: Next qTD Pointer (NOTE 1) */
  724. uint32_t alt; /* 0x04-0x07: Alternate Next qTD Pointer (NOTE 2) */
  725. uint32_t token; /* 0x08-0x0b: qTD Token (NOTE 1) */
  726. uint32_t bpl[5]; /* 0x0c-0x1c: Buffer Page Pointer List (NOTE 2)*/
  727. };
  728. #define SIZEOF_EHCI_OVERLAY (32) /* 8*sizeof(uint32_t) */
  729. struct ehci_qh_s
  730. {
  731. uint32_t hlp; /* 0x00-0x03: Queue Head Horizontal Link Pointer */
  732. uint32_t epchar; /* 0x04-0x07: Endpoint Characteristics */
  733. uint32_t epcaps; /* 0x08-0x0b: Endpoint Capabilities */
  734. uint32_t cqp; /* 0x0c-0x0f: Current qTD Pointer */
  735. struct ehci_overlay_s overlay; /* 0x10-0x2c: Transfer overlay */
  736. };
  737. #define SIZEOF_EHCI_OVERLAY (48) /* 4*sizeof(uint32_t) + SIZEOF_EHCI_OVERLAY */
  738. /* Periodic Frame Span Traversal Node (STN). Paragrap 3.7 */
  739. struct ehci_fstn_s
  740. {
  741. uint32_t npp; /* 0x00-0x03: Normal Path Pointer */
  742. uint32_t bpp; /* 0x04-0x07: Back Path Link Pointer */
  743. };
  744. #define SIZEOF_EHCI_FSTN_S (8) /* 2*sizeof(uint32_t) */
  745. /********************************************************************************************
  746. * Public Data
  747. ********************************************************************************************/
  748. #ifdef __cplusplus
  749. #define EXTERN extern "C"
  750. extern "C"
  751. {
  752. #else
  753. #define EXTERN extern
  754. #endif
  755. /********************************************************************************************
  756. * Public Function Prototypes
  757. ********************************************************************************************/
  758. #undef EXTERN
  759. #ifdef __cplusplus
  760. }
  761. #endif
  762. #endif /* __INCLUDE_NUTTX_USB_EHCI_H */