porting_usbip.rst 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. USB IP 勘误
  2. ==============================
  3. 本节主要对已经支持的 USB IP 在不同厂家上的一些差别说明并进行校对。欢迎补充。
  4. FSDEV
  5. --------------------------
  6. FSDEV 仅支持从机。这个 ip 不同厂家基本都是基于标准的 usb 寄存器,有些芯片可能还需要配置 `PMA_ACCESS` 的值,默认为2。下表为具体芯片相关宏的修改值:
  7. .. list-table::
  8. :widths: 30 20 30 30 30
  9. :header-rows: 1
  10. * - 芯片
  11. - 中断名
  12. - 寄存器地址
  13. - CONFIG_USBDEV_EP_NUM
  14. - PMA_ACCESS
  15. * - STM32F0
  16. - USB_IRQHandler
  17. - 0x40005C00
  18. - 8
  19. - 1
  20. * - STM32F1
  21. - USB_LP_CAN1_RX0_IRQHandler
  22. - 同上
  23. - 同上
  24. - 同上
  25. * - STM32F3
  26. - USB_LP_CAN_RX0_IRQHandler
  27. - 同上
  28. - 同上
  29. - 1 or 2
  30. * - STM32L0
  31. - USB_IRQHandler
  32. - 同上
  33. - 同上
  34. - 1
  35. * - STM32L1
  36. - USB_LP_IRQHandler
  37. - 同上
  38. - 同上
  39. - 2
  40. * - STM32L4
  41. - USB_IRQHandler
  42. - 同上
  43. - 同上
  44. - 1
  45. fsdev 需要外置 dp 上拉才能使用,有些芯片可能是接上拉电阻,有些芯片可能是设置寄存器,举例如下:
  46. .. code-block:: C
  47. USB->BCDR |= (uint16_t)USB_BCDR_DPPU;
  48. 如果不存在 BCDR 寄存器,则一般是配置如下,并且该设置需要配置到 `usb_dc_low_level_init` 中或者 `usb_dc_init` 最后都行:
  49. .. code-block:: C
  50. /* Pull up controller register */
  51. #define DP_CTRL ((__IO unsigned*)(0x40001820))
  52. #define _EnPortPullup() (*DP_CTRL = (*DP_CTRL) | 0x10000000);
  53. #define _DisPortPullup() (*DP_CTRL = (*DP_CTRL) & 0xEFFFFFFF);
  54. MUSB
  55. --------------------------
  56. MUSB IP 支持主从,并且由 **mentor** 定义了一套标准的寄存器偏移,如果非标准,则需要实现以下宏的偏移,以标准为例:
  57. .. code-block:: C
  58. #define MUSB_FADDR_OFFSET 0x00
  59. #define MUSB_POWER_OFFSET 0x01
  60. #define MUSB_TXIS_OFFSET 0x02
  61. #define MUSB_RXIS_OFFSET 0x04
  62. #define MUSB_TXIE_OFFSET 0x06
  63. #define MUSB_RXIE_OFFSET 0x08
  64. #define MUSB_IS_OFFSET 0x0A
  65. #define MUSB_IE_OFFSET 0x0B
  66. #define MUSB_EPIDX_OFFSET 0x0E
  67. #define MUSB_IND_TXMAP_OFFSET 0x10
  68. #define MUSB_IND_TXCSRL_OFFSET 0x12
  69. #define MUSB_IND_TXCSRH_OFFSET 0x13
  70. #define MUSB_IND_RXMAP_OFFSET 0x14
  71. #define MUSB_IND_RXCSRL_OFFSET 0x16
  72. #define MUSB_IND_RXCSRH_OFFSET 0x17
  73. #define MUSB_IND_RXCOUNT_OFFSET 0x18
  74. #define MUSB_IND_TXTYPE_OFFSET 0x1A
  75. #define MUSB_IND_TXINTERVAL_OFFSET 0x1B
  76. #define MUSB_IND_RXTYPE_OFFSET 0x1C
  77. #define MUSB_IND_RXINTERVAL_OFFSET 0x1D
  78. #define MUSB_FIFO_OFFSET 0x20
  79. #define MUSB_DEVCTL_OFFSET 0x60
  80. #define MUSB_TXFIFOSZ_OFFSET 0x62
  81. #define MUSB_RXFIFOSZ_OFFSET 0x63
  82. #define MUSB_TXFIFOADD_OFFSET 0x64
  83. #define MUSB_RXFIFOADD_OFFSET 0x66
  84. #define MUSB_TXFUNCADDR0_OFFSET 0x80
  85. #define MUSB_TXHUBADDR0_OFFSET 0x82
  86. #define MUSB_TXHUBPORT0_OFFSET 0x83
  87. #define MUSB_TXFUNCADDRx_OFFSET 0x88
  88. #define MUSB_TXHUBADDRx_OFFSET 0x8A
  89. #define MUSB_TXHUBPORTx_OFFSET 0x8B
  90. #define MUSB_RXFUNCADDRx_OFFSET 0x8C
  91. #define MUSB_RXHUBADDRx_OFFSET 0x8E
  92. #define MUSB_RXHUBPORTx_OFFSET 0x8F
  93. #define USB_TXADDR_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx)
  94. #define USB_TXHUBADDR_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 2)
  95. #define USB_TXHUBPORT_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 3)
  96. #define USB_RXADDR_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 4)
  97. #define USB_RXHUBADDR_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 6)
  98. #define USB_RXHUBPORT_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 7)
  99. 下表为具体芯片从机相关宏的修改值:
  100. .. list-table::
  101. :widths: 30 30 30 30
  102. :header-rows: 1
  103. * - 芯片
  104. - 中断名
  105. - 寄存器地址
  106. - CONFIG_USBDEV_EP_NUM
  107. * - ES32F3xx
  108. - USB_INT_Handler
  109. - 0x40086400
  110. - 5
  111. * - MSP432Ex
  112. - 同上
  113. - 0x40050000
  114. - 同上
  115. * - F1C100S
  116. - USB_INT_Handler
  117. - 0x01c13000
  118. - 4
  119. 下表为具体芯片主机相关宏的修改值:
  120. .. list-table::
  121. :widths: 30 30 30 30
  122. :header-rows: 1
  123. * - 芯片
  124. - 中断名
  125. - 寄存器地址
  126. - CONIFG_USB_MUSB_EP_NUM
  127. * - ES32F3xx
  128. - USB_INT_Handler
  129. - 0x40086400
  130. - 5
  131. * - MSP432Ex
  132. - 同上
  133. - 0x40050000
  134. - 同上
  135. * - F1C100S
  136. - USB_INT_Handler
  137. - 0x01c13000
  138. - 4
  139. DWC2
  140. --------------------------
  141. DWC2 IP 支持主从,并且由 **synopsys** 定义了一套标准的寄存器偏移。大部分厂家都使用标准的寄存器偏移(除了 GCCFG(GGPIO)寄存器),所以如果是从机仅需要修改 `中断名` 、 `USB_BASE` 、 `CONFIG_USBDEV_EP_NUM` ,主机仅需要修改 `中断名` 、 `USB_BASE` 即可。
  142. .. note:: GCCFG(GGPIO) 根据不同的厂家设置不同,会影响 usb 枚举,需要根据厂家提供的手册进行配置,并实现 usbd_get_dwc2_gccfg_conf 和 usbh_get_dwc2_gccfg_conf 函数,填充相应需要使能的bit
  143. .. caution:: 主机 port 仅支持有 dma 功能的 dwc2 ip(代码中会判断当前 ip 是否支持), 如果不支持 dma 模式,则无法使用。
  144. 下表为具体芯片从机相关宏的修改值:
  145. .. list-table::
  146. :widths: 30 30 30 30
  147. :header-rows: 1
  148. * - 芯片
  149. - 中断名
  150. - 寄存器地址
  151. - CONFIG_USBDEV_EP_NUM
  152. * - STM32 非 H7
  153. - OTG_FS_IRQHandler/OTG_HS_IRQHandler
  154. - 0x50000000UL/0x40040000UL
  155. - 5
  156. * - STM32 H7
  157. - 同上
  158. - 0x40080000UL/0x40040000UL
  159. - 9
  160. 下表为具体芯片主机相关宏的修改值:
  161. .. list-table::
  162. :widths: 30 30 30 30
  163. :header-rows: 1
  164. * - 芯片
  165. - 中断名
  166. - 寄存器地址
  167. - CONFIG_USBHOST_PIPE_NUM
  168. * - STM32 全系列
  169. - OTG_HS_IRQHandler
  170. - 0x40040000UL
  171. - 12
  172. EHCI
  173. --------------------------
  174. EHCI 是 intel 制定的标准主机控制器接口,任何厂家都必须实现 EHCI 中定义的寄存器以及寄存器的功能。EHCI 相关配置宏如下:
  175. .. code-block:: C
  176. #define CONFIG_USB_EHCI_HCCR_OFFSET (0x0)
  177. #define CONFIG_USB_EHCI_FRAME_LIST_SIZE 1024
  178. #define CONFIG_USB_EHCI_QH_NUM CONFIG_USBHOST_PIPE_NUM
  179. #define CONFIG_USB_EHCI_QTD_NUM 3
  180. #define CONFIG_USB_EHCI_ITD_NUM 20
  181. //是否关闭保留寄存器的占位,默认保留 9 个双字的占位
  182. #define CONFIG_USB_EHCI_HCOR_RESERVED_DISABLE
  183. //是否使能 configflag 寄存器中的 bit0
  184. #define CONFIG_USB_EHCI_CONFIGFLAG
  185. #define CONFIG_USB_EHCI_ISO
  186. // 不带 tt的 IP 一般使用OHCI
  187. #define CONFIG_USB_EHCI_WITH_OHCI
  188. 同时由于 EHCI 只是主机控制器并且只支持高速,一般配合一个 otg 控制器和一个低速全速兼容控制单元,而速度的获取一般是在 otg 寄存器中,所以需要用户实现 `usbh_get_port_speed` 函数。