api_port.rst 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. Porting
  2. =========================
  3. device controller(dcd)
  4. -------------------------
  5. usb_dc_init
  6. """"""""""""""""""""""""""""""""""""
  7. ``usb_dc_init`` 用于初始化 usb device controller 寄存器,设置 usb 引脚、时钟、中断等等。 **此函数不对用户开放**。
  8. .. code-block:: C
  9. int usb_dc_init(void);
  10. - **return**
  11. usb_dc_deinit
  12. """"""""""""""""""""""""""""""""""""
  13. ``usb_dc_deinit`` 用于反初始化 usb device controller 寄存器。 **此函数不对用户开放**。
  14. .. code-block:: C
  15. int usb_dc_deinit(void);
  16. - **return**
  17. usb_dc_attach
  18. """"""""""""""""""""""""""""""""""""
  19. ``usb_dc_attach`` 使能上拉或者下拉电阻,从而能够让设备被主机枚举。 **此函数对用户开放**。
  20. .. code-block:: C
  21. int usb_dc_attach(void);
  22. - **return**
  23. usb_dc_detach
  24. """"""""""""""""""""""""""""""""""""
  25. ``usb_dc_detach``断开设备与主机的连接。 **此函数对用户开放**。
  26. .. code-block:: C
  27. int usb_dc_detach(void);
  28. - **return**
  29. usbd_set_address
  30. """"""""""""""""""""""""""""""""""""
  31. ``usbd_set_address`` 设置设备地址。 **此函数不对用户开放**。
  32. .. code-block:: C
  33. int usbd_set_address(const uint8_t addr);
  34. - **return**
  35. usbd_ep_open
  36. """"""""""""""""""""""""""""""""""""
  37. ``usbd_ep_open`` 设置端点的属性,开启对应端点的中断。 **此函数不对用户开放**。
  38. .. code-block:: C
  39. int usbd_ep_open(const struct usbd_endpoint_cfg *ep_cfg);
  40. - **return**
  41. usbd_ep_close
  42. """"""""""""""""""""""""""""""""""""
  43. ``usbd_ep_close`` 关闭端点。 **此函数不对用户开放**。
  44. .. code-block:: C
  45. int usbd_ep_close(const uint8_t ep);
  46. - **event**
  47. usbd_ep_set_stall
  48. """"""""""""""""""""""""""""""""""""
  49. ``usbd_ep_set_stall`` 将端点设置成 stall 状态并发送 stall 握手包。 **此函数对用户开放**。
  50. .. code-block:: C
  51. int usbd_ep_set_stall(const uint8_t ep);
  52. - **ep** 端点地址
  53. usbd_ep_clear_stall
  54. """"""""""""""""""""""""""""""""""""
  55. ``usbd_ep_clear_stall`` 清除端点的 stall 状态。 **此函数不对用户开放**。
  56. .. code-block:: C
  57. int usbd_ep_clear_stall(const uint8_t ep);
  58. - **ep** 端点地址
  59. usbd_ep_is_stalled
  60. """"""""""""""""""""""""""""""""""""
  61. ``usbd_ep_is_stalled`` 读取当前端点的 stall 状态。 **此函数不对用户开放**。
  62. .. code-block:: C
  63. int usbd_ep_is_stalled(const uint8_t ep, uint8_t *stalled);
  64. - **ep** 端点地址
  65. - **return** 返回 1 表示 stalled,0 表示没有 stall
  66. usbd_ep_write
  67. """"""""""""""""""""""""""""""""""""
  68. ``usbd_ep_write`` 向某个端点发送数据, **如果该函数在中断中使用则是异步传输,否则是阻塞传输**。 **此函数对用户开放**。
  69. .. code-block:: C
  70. int usbd_ep_write(const uint8_t ep, const uint8_t *data, uint32_t data_len, uint32_t *ret_bytes);
  71. - **ep** in 端点地址
  72. - **data** 要发送的数据缓冲区
  73. - **data_len** 发送长度,需要小于等于端点最大包长
  74. - **ret_bytes** 实际发送的长度,异步传输该参数无效。 **如果长度为 0,表示发送 0 长数据包(zero length packet)**
  75. - **return** 返回 0 表示正确,其他表示错误
  76. usbd_ep_read
  77. """"""""""""""""""""""""""""""""""""
  78. ``usbd_ep_read`` 从某个端点接收数据, **该函数仅能在 usb out 中断中使用**。 **此函数对用户开放**。
  79. .. code-block:: C
  80. int usbd_ep_read(const uint8_t ep, uint8_t *data, uint32_t max_data_len, uint32_t *read_bytes);
  81. - **ep** out 端点地址
  82. - **data** 要接收的数据缓冲区
  83. - **data_len** 接收长度,需要小于等于端点最大包长,推荐直接设置成最大包长。 **如果长度为 0 表示启动下次接收**
  84. - **ret_bytes** 实际接收的长度
  85. - **return** 返回 0 表示正确,其他表示错误
  86. usbd_ep_write_async
  87. """"""""""""""""""""""""""""""""""""
  88. ``usbd_ep_write_async`` 向某个端点发送数据, 该函数为异步传输。 **此函数对用户开放**。
  89. .. code-block:: C
  90. int usbd_ep_write_async(const uint8_t ep, const uint8_t *data, uint32_t data_len);
  91. - **ep** in 端点地址
  92. - **data** 要发送的数据缓冲区
  93. - **data_len** 发送长度,需要小于等于端点最大包长
  94. - **return** 返回 0 表示正确,其他表示错误
  95. usbd_ep_read_async
  96. """"""""""""""""""""""""""""""""""""
  97. ``usbd_ep_read_async`` 启动某个端点接收,该函数配合 dma 使用,当 dma 完成时,会进入注册的 out 中断。如果硬件没有该功能,则无法使用。 **此函数对用户开放**。
  98. .. code-block:: C
  99. int usbd_ep_read_async(const uint8_t ep, uint8_t *data, uint32_t max_data_len);
  100. - **ep** out 端点地址
  101. - **data** 要接收的数据缓冲区
  102. - **data_len** 接收长度,需要小于等于端点最大包长,推荐直接设置成最大包长。 **如果长度为 0 表示准备接收 0 包**
  103. - **return** 返回 0 表示正确,其他表示错误
  104. usbd_ep_get_read_len
  105. """"""""""""""""""""""""""""""""""""
  106. ``usbd_ep_get_read_len`` 获取实际接收长度,此函数搭配 ``usbd_ep_read_async`` 使用。 **此函数对用户开放**。
  107. .. code-block:: C
  108. uint32_t usbd_ep_get_read_len(const uint8_t ep);
  109. - **ep** out 端点地址
  110. - **return** 实际接收长度
  111. usbd_ep_is_complete
  112. """"""""""""""""""""""""""""""""""""
  113. ``usbd_ep_is_complete`` 查询端点发送是否完成,搭配 ``usbd_ep_write_async`` 使用。 **此函数对用户开放**。
  114. .. code-block:: C
  115. bool usbd_ep_is_complete(const uint8_t ep);
  116. - **ep** in 端点地址
  117. - **return** 返回 true 表示传输完成
  118. usbd_ep_get_mps
  119. """"""""""""""""""""""""""""""""""""
  120. ``usbd_ep_get_mps`` 查询端点最大数据包长。 **此函数对用户开放**。
  121. .. code-block:: C
  122. uint16_t usbd_ep_get_mps(const uint8_t ep);
  123. - **ep** 端点地址
  124. - **return** 返回端点最大数据包长
  125. host controller(hcd)
  126. ------------------------
  127. usb_hc_init
  128. """"""""""""""""""""""""""""""""""""
  129. ``usb_hc_init`` 用于初始化 usb host controller 寄存器,设置 usb 引脚、时钟、中断等等。 **此函数不对用户开放**。
  130. .. code-block:: C
  131. int usb_hc_init(void);
  132. - **return** 返回 0 表示正确,其他表示错误
  133. usbh_get_port_connect_status
  134. """"""""""""""""""""""""""""""""""""
  135. ``usbh_get_port_connect_status`` 获取当前 hubport 连接状态。 **此函数不对用户开放**。
  136. .. code-block:: C
  137. int usbh_get_port_connect_status(const uint8_t port);
  138. - **port** 端口号
  139. - **return** 返回 1 表示连接,0 表示未连接
  140. usbh_reset_port
  141. """"""""""""""""""""""""""""""""""""
  142. ``usbh_reset_port`` 复位指定的 hubport **此函数不对用户开放**。
  143. .. code-block:: C
  144. int usbh_reset_port(const uint8_t port);
  145. - **port** 端口号
  146. - **return** 返回 0 表示正确,其他表示错误
  147. usbh_get_port_speed
  148. """"""""""""""""""""""""""""""""""""
  149. ``usbh_get_port_speed`` 获取当前 hubport 上连接的设备速度。 **此函数不对用户开放**。
  150. .. code-block:: C
  151. int usbh_get_port_speed(const uint8_t port);
  152. - **port** 端口号
  153. - **return** 返回 1 表示低速,2 表示全速,3 表示高速
  154. usbh_ep0_reconfigure
  155. """"""""""""""""""""""""""""""""""""
  156. ``usbh_ep0_reconfigure`` 重新设置端点 0 的属性。 **此函数不对用户开放**。
  157. .. code-block:: C
  158. int usbh_ep0_reconfigure(usbh_epinfo_t ep, uint8_t dev_addr, uint8_t ep_mps, uint8_t speed);
  159. - **ep** 端点信息
  160. - **dev_addr** 端点所在设备地址
  161. - **ep_mps** 端点最大包长
  162. - **speed** 端点所在设备的速度
  163. - **return** 返回 0 表示正确,其他表示错误
  164. usbh_ep_alloc
  165. """"""""""""""""""""""""""""""""""""
  166. ``usbh_ep_alloc`` 为端点分配相关属性,初始化相关寄存器,并保存相关信息到 **ep** 句柄中。 **此函数不对用户开放**。
  167. .. code-block:: C
  168. int usbh_ep_alloc(usbh_epinfo_t *ep, const struct usbh_endpoint_cfg *ep_cfg);
  169. - **ep** 端点信息
  170. - **ep_cfg** 端点初始化需要的一些信息
  171. - **return** 返回 0 表示正确,其他表示错误
  172. usbh_ep_free
  173. """"""""""""""""""""""""""""""""""""
  174. ``usbh_ep_free`` 释放端点的一些属性。 **此函数不对用户开放**。
  175. .. code-block:: C
  176. int usbh_ep_free(usbh_epinfo_t ep);
  177. - **ep** 端点信息
  178. - **return** 返回 0 表示正确,其他表示错误
  179. usbh_control_transfer
  180. """"""""""""""""""""""""""""""""""""
  181. ``usbh_control_transfer`` 对端点 0 进行控制传输,并且 **此函数为阻塞式传输,默认超时时间 5s**。 **此函数对用户开放**。
  182. .. code-block:: C
  183. int usbh_control_transfer(usbh_epinfo_t ep, struct usb_setup_packet *setup, uint8_t *buffer);
  184. - **ep** 端点信息
  185. - **setup** setup 包
  186. - **buffer** 要发送或者读取的数据缓冲区,为 NULL 表示没有数据要发送或者接收
  187. - **return** 返回 0 表示正确,其他表示错误
  188. usbh_ep_bulk_transfer
  189. """"""""""""""""""""""""""""""""""""
  190. ``usbh_ep_bulk_transfer`` 对指定端点进行批量传输, **此函数为阻塞式传输**。 **此函数对用户开放**。
  191. .. code-block:: C
  192. int usbh_ep_bulk_transfer(usbh_epinfo_t ep, uint8_t *buffer, uint32_t buflen, uint32_t timeout);
  193. - **ep** 端点信息
  194. - **buffer** 要发送或者读取的数据缓冲区
  195. - **buflen** 要发送或者接收的长度,最大不得高于 16K
  196. - **timeout** 超时时间,单位 ms
  197. - **return** 大于等于0 表示实际发送或者接收的长度,小于 0 表示错误
  198. 其中小于 0 的错误码如下:
  199. .. list-table::
  200. :widths: 30 30
  201. :header-rows: 1
  202. * - ERROR CODE
  203. - desc
  204. * - ENODEV
  205. - 设备未连接
  206. * - EBUSY
  207. - 当前数据发送或者接收还未完成
  208. * - EAGAIN
  209. - 主机一直收到 NAK 包
  210. * - ETIMEDOUT
  211. - 数据发送或者接收超时
  212. * - EPERM
  213. - 主机收到 STALL 包
  214. * - EIO
  215. - 数据传输错误
  216. * - EPIPE
  217. - 数据溢出
  218. * - ENXIO
  219. - 设备断开,传输中止
  220. usbh_ep_intr_transfer
  221. """"""""""""""""""""""""""""""""""""
  222. ``usbh_ep_intr_transfer`` 同上。
  223. usbh_ep_bulk_async_transfer
  224. """"""""""""""""""""""""""""""""""""
  225. ``usbh_ep_bulk_async_transfer`` 对指定端点进行批量传输,传输完成将触发指定回调函数, **此函数为异步传输**。 **此函数对用户开放**。
  226. .. code-block:: C
  227. int usbh_ep_bulk_async_transfer(usbh_epinfo_t ep, uint8_t *buffer, uint32_t buflen, usbh_asynch_callback_t callback, void *arg);
  228. - **ep** 端点信息
  229. - **buffer** 要发送或者读取的数据缓冲区
  230. - **buflen** 要发送或者接收的长度,最大不得高于 16K
  231. - **callback** 传输完成回调函数, **该函数最终处于中断上下文**
  232. - **arg** 用户自定义参数
  233. - **return** 为 0 表示配置正常,小于0 表示错误
  234. usbh_ep_intr_async_transfer
  235. """"""""""""""""""""""""""""""""""""
  236. ``usbh_ep_intr_async_transfer`` 同上。
  237. usb_ep_cancel
  238. """"""""""""""""""""""""""""""""""""
  239. ``usb_ep_cancel`` 中止当前端点传输, **此函数不对用户开放**。
  240. .. code-block:: C
  241. int usb_ep_cancel(usbh_epinfo_t ep);
  242. - **ep** 端点信息
  243. - **return** 为 0 表示正确,小于0 表示错误