api_port.rst 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  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** 返回 0 表示正确,其他表示错误
  11. usb_dc_deinit
  12. """"""""""""""""""""""""""""""""""""
  13. ``usb_dc_deinit`` 用于反初始化 usb device controller 寄存器。 **此函数不对用户开放**。
  14. .. code-block:: C
  15. int usb_dc_deinit(void);
  16. - **return** 返回 0 表示正确,其他表示错误
  17. usbd_set_address
  18. """"""""""""""""""""""""""""""""""""
  19. ``usbd_set_address`` 设置设备地址。 **此函数不对用户开放**。
  20. .. code-block:: C
  21. int usbd_set_address(const uint8_t addr);
  22. - **return** 返回 0 表示正确,其他表示错误
  23. usbd_ep_open
  24. """"""""""""""""""""""""""""""""""""
  25. ``usbd_ep_open`` 设置端点的属性,开启对应端点的中断。 **此函数不对用户开放**。
  26. .. code-block:: C
  27. int usbd_ep_open(const struct usbd_endpoint_cfg *ep_cfg);
  28. - **return** 返回 0 表示正确,其他表示错误
  29. usbd_ep_close
  30. """"""""""""""""""""""""""""""""""""
  31. ``usbd_ep_close`` 关闭端点。 **此函数不对用户开放**。
  32. .. code-block:: C
  33. int usbd_ep_close(const uint8_t ep);
  34. - **event**
  35. - **return** 返回 0 表示正确,其他表示错误
  36. usbd_ep_set_stall
  37. """"""""""""""""""""""""""""""""""""
  38. ``usbd_ep_set_stall`` 将端点设置成 stall 状态并发送 stall 握手包。 **此函数对用户开放**。
  39. .. code-block:: C
  40. int usbd_ep_set_stall(const uint8_t ep);
  41. - **ep** 端点地址
  42. - **return** 返回 0 表示正确,其他表示错误
  43. usbd_ep_clear_stall
  44. """"""""""""""""""""""""""""""""""""
  45. ``usbd_ep_clear_stall`` 清除端点的 stall 状态。 **此函数不对用户开放**。
  46. .. code-block:: C
  47. int usbd_ep_clear_stall(const uint8_t ep);
  48. - **ep** 端点地址
  49. - **return** 返回 0 表示正确,其他表示错误
  50. usbd_ep_is_stalled
  51. """"""""""""""""""""""""""""""""""""
  52. ``usbd_ep_is_stalled`` 读取当前端点的 stall 状态。 **此函数不对用户开放**。
  53. .. code-block:: C
  54. int usbd_ep_is_stalled(const uint8_t ep, uint8_t *stalled);
  55. - **ep** 端点地址
  56. - **return** 返回 1 表示 stalled,0 表示没有 stall
  57. usbd_ep_start_write
  58. """"""""""""""""""""""""""""""""""""
  59. ``usbd_ep_start_write`` 启动端点发送,发送完成以后,会调用注册的 in 端点传输完成中断回调函数。该函数为异步发送。 **此函数对用户开放**。
  60. .. code-block:: C
  61. int usbd_ep_start_write(const uint8_t ep, const uint8_t *data, uint32_t data_len);
  62. - **ep** in 端点地址
  63. - **data** 发送数据缓冲区
  64. - **data_len** 发送长度,原则上无限长,推荐 16K 字节以内
  65. - **return** 返回 0 表示正确,其他表示错误
  66. usbd_ep_start_read
  67. """"""""""""""""""""""""""""""""""""
  68. ``usbd_ep_start_read`` 启动端点接收,接收完成以后,会调用注册的 out 端点传输完成中断回调函数。该函数为异步接收。 **此函数对用户开放**。
  69. .. code-block:: C
  70. int usbd_ep_start_read(const uint8_t ep, uint8_t *data, uint32_t data_len);
  71. - **ep** out 端点地址
  72. - **data** 接收数据缓冲区
  73. - **data_len** 接收长度,原则上无限长,推荐 16K 字节以内,并且推荐是最大包长的整数倍
  74. - **return** 返回 0 表示正确,其他表示错误
  75. .. note:: 启动接收以后,以下两种情况,会进入传输完成中断:1、最后一包为短包;2、接收总长度等于 data_len
  76. host controller(hcd)
  77. ------------------------
  78. usb_hc_init
  79. """"""""""""""""""""""""""""""""""""
  80. ``usb_hc_init`` 用于初始化 usb host controller 寄存器,设置 usb 引脚、时钟、中断等等。 **此函数不对用户开放**。
  81. .. code-block:: C
  82. int usb_hc_init(void);
  83. - **return** 返回 0 表示正确,其他表示错误
  84. usbh_roothub_control
  85. """"""""""""""""""""""""""""""""""""
  86. ``usbh_roothub_control`` 用来对 roothub 发起请求, **此函数不对用户开放**。
  87. .. code-block:: C
  88. int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf);
  89. - **setup** 请求
  90. - **buf** 接收缓冲区
  91. - **return** 返回 0 表示正确,其他表示错误
  92. usbh_ep0_pipe_reconfigure
  93. """"""""""""""""""""""""""""""""""""
  94. ``usbh_ep0_pipe_reconfigure`` 重新设置端点 0 的 pipe 属性。 **此函数不对用户开放**。
  95. .. code-block:: C
  96. int usbh_ep0_pipe_reconfigure(usbh_pipe_t pipe, uint8_t dev_addr, uint8_t ep_mps, uint8_t speed);
  97. - **pipe** pipe 句柄
  98. - **dev_addr** 端点所在设备地址
  99. - **ep_mps** 端点最大包长
  100. - **speed** 端点所在设备的速度
  101. - **return** 返回 0 表示正确,其他表示错误
  102. usbh_pipe_alloc
  103. """"""""""""""""""""""""""""""""""""
  104. ``usbh_pipe_alloc`` 为端点分配 pipe。 **此函数不对用户开放**。
  105. .. code-block:: C
  106. int usbh_pipe_alloc(usbh_pipe_t *pipe, const struct usbh_endpoint_cfg *ep_cfg);
  107. - **pipe** pipe 句柄
  108. - **ep_cfg** 端点初始化需要的一些信息
  109. - **return** 返回 0 表示正确,其他表示错误
  110. usbh_pipe_free
  111. """"""""""""""""""""""""""""""""""""
  112. ``usbh_pipe_free`` 释放端点的一些属性。 **此函数不对用户开放**。
  113. .. code-block:: C
  114. int usbh_pipe_free(usbh_pipe_t pipe);
  115. - **pipe** 端点信息
  116. - **return** 返回 0 表示正确,其他表示错误
  117. usbh_submit_urb
  118. """"""""""""""""""""""""""""""""""""
  119. ``usbh_submit_urb`` 对某个地址上的端点进行数据请求。 **此函数对用户开放**。
  120. .. code-block:: C
  121. int usbh_submit_urb(struct usbh_urb *urb);
  122. - **urb** usb 请求块
  123. - **return** 返回 0 表示正确,其他表示错误
  124. 其中, `urb` 结构体信息如下:
  125. .. code-block:: C
  126. struct usbh_urb {
  127. usbh_pipe_t pipe;
  128. struct usb_setup_packet *setup;
  129. uint8_t *transfer_buffer;
  130. uint32_t transfer_buffer_length;
  131. int transfer_flags;
  132. uint32_t actual_length;
  133. uint32_t timeout;
  134. int errorcode;
  135. uint32_t num_of_iso_packets;
  136. usbh_complete_callback_t complete;
  137. void *arg;
  138. struct usbh_iso_frame_packet iso_packet[];
  139. };
  140. - **pipe** 端点对应的 pipe 句柄
  141. - **setup** setup 请求缓冲区,端点0使用
  142. - **transfer_buffer** 传输的数据缓冲区
  143. - **transfer_buffer_length** 传输长度
  144. - **transfer_flags** 传输时携带的 flag
  145. - **actual_length** 实际传输长度
  146. - **timeout** 传输超时时间,为 0 该函数则为非阻塞,可在中断中使用
  147. - **errorcode** 错误码
  148. - **num_of_iso_packets** iso 帧或者微帧个数
  149. - **complete** 传输完成回调函数
  150. - **arg** 传输完成时携带的参数
  151. - **iso_packet** iso 数据包
  152. `errorcode` 可以返回以下值:
  153. .. list-table::
  154. :widths: 30 30
  155. :header-rows: 1
  156. * - ERROR CODE
  157. - desc
  158. * - ENOMEM
  159. - 内存不足
  160. * - ENODEV
  161. - 设备未连接
  162. * - EBUSY
  163. - 当前数据发送或者接收还未完成
  164. * - ETIMEDOUT
  165. - 数据发送或者接收超时
  166. * - EPERM
  167. - 主机收到 STALL 包或者 BABBLE
  168. * - EIO
  169. - 数据传输错误
  170. * - EAGAIN
  171. - 主机一直收到 NAK 包
  172. * - EPIPE
  173. - 数据溢出
  174. * - ESHUTDOWN
  175. - 设备断开,传输中止
  176. 其中 `iso_packet` 结构体信息如下:
  177. .. code-block:: C
  178. struct usbh_iso_frame_packet {
  179. uint8_t *transfer_buffer;
  180. uint32_t transfer_buffer_length;
  181. uint32_t actual_length;
  182. int errorcode;
  183. };
  184. - **transfer_buffer** 传输的数据缓冲区
  185. - **transfer_buffer_length** 传输长度
  186. - **actual_length** 实际传输长度
  187. - **errorcode** 错误码