api_port.rst 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. 主从驱动
  2. =========================
  3. .. note:: 请注意,v1.1 版本开始增加 busid 形参,其余保持不变,所以 API 说明不做更新
  4. device controller(dcd)
  5. -------------------------
  6. usb_dc_init
  7. """"""""""""""""""""""""""""""""""""
  8. ``usb_dc_init`` 用于初始化 usb device controller 寄存器,设置 usb 引脚、时钟、中断等等。 **此函数不对用户开放**。
  9. .. code-block:: C
  10. int usb_dc_init(void);
  11. - **return** 返回 0 表示正确,其他表示错误
  12. usb_dc_deinit
  13. """"""""""""""""""""""""""""""""""""
  14. ``usb_dc_deinit`` 用于反初始化 usb device controller 寄存器。 **此函数不对用户开放**。
  15. .. code-block:: C
  16. int usb_dc_deinit(void);
  17. - **return** 返回 0 表示正确,其他表示错误
  18. usbd_set_address
  19. """"""""""""""""""""""""""""""""""""
  20. ``usbd_set_address`` 设置设备地址。 **此函数不对用户开放**。
  21. .. code-block:: C
  22. int usbd_set_address(const uint8_t addr);
  23. - **addr** 设备地址
  24. - **return** 返回 0 表示正确,其他表示错误
  25. usbd_ep_open
  26. """"""""""""""""""""""""""""""""""""
  27. ``usbd_ep_open`` 设置端点的属性,开启对应端点的中断。 **此函数不对用户开放**。
  28. .. code-block:: C
  29. int usbd_ep_open(const struct usb_endpoint_descriptor *ep);
  30. - **ep** 端点描述符
  31. - **return** 返回 0 表示正确,其他表示错误
  32. usbd_ep_close
  33. """"""""""""""""""""""""""""""""""""
  34. ``usbd_ep_close`` 关闭端点。 **此函数不对用户开放**。
  35. .. code-block:: C
  36. int usbd_ep_close(const uint8_t ep);
  37. - **ep** 端点地址
  38. - **return** 返回 0 表示正确,其他表示错误
  39. usbd_ep_set_stall
  40. """"""""""""""""""""""""""""""""""""
  41. ``usbd_ep_set_stall`` 将端点设置成 stall 状态并发送 stall 握手包。 **此函数对用户开放**。
  42. .. code-block:: C
  43. int usbd_ep_set_stall(const uint8_t ep);
  44. - **ep** 端点地址
  45. - **return** 返回 0 表示正确,其他表示错误
  46. usbd_ep_clear_stall
  47. """"""""""""""""""""""""""""""""""""
  48. ``usbd_ep_clear_stall`` 清除端点的 stall 状态。 **此函数不对用户开放**。
  49. .. code-block:: C
  50. int usbd_ep_clear_stall(const uint8_t ep);
  51. - **ep** 端点地址
  52. - **return** 返回 0 表示正确,其他表示错误
  53. usbd_ep_is_stalled
  54. """"""""""""""""""""""""""""""""""""
  55. ``usbd_ep_is_stalled`` 读取当前端点的 stall 状态。 **此函数不对用户开放**。
  56. .. code-block:: C
  57. int usbd_ep_is_stalled(const uint8_t ep, uint8_t *stalled);
  58. - **ep** 端点地址
  59. - **return** 返回 1 表示 stalled,0 表示没有 stall
  60. usbd_ep_start_write
  61. """"""""""""""""""""""""""""""""""""
  62. ``usbd_ep_start_write`` 启动端点发送,发送完成以后,会调用注册的 in 端点传输完成中断回调函数。该函数为异步发送。 **此函数对用户开放**。
  63. .. code-block:: C
  64. int usbd_ep_start_write(const uint8_t ep, const uint8_t *data, uint32_t data_len);
  65. - **ep** in 端点地址
  66. - **data** 发送数据缓冲区
  67. - **data_len** 发送长度,原则上无限长,推荐 16K 字节以内
  68. - **return** 返回 0 表示正确,其他表示错误
  69. usbd_ep_start_read
  70. """"""""""""""""""""""""""""""""""""
  71. ``usbd_ep_start_read`` 启动端点接收,接收完成以后,会调用注册的 out 端点传输完成中断回调函数。该函数为异步接收。 **此函数对用户开放**。
  72. .. code-block:: C
  73. int usbd_ep_start_read(const uint8_t ep, uint8_t *data, uint32_t data_len);
  74. - **ep** out 端点地址
  75. - **data** 接收数据缓冲区
  76. - **data_len** 接收长度,原则上无限长,推荐 16K 字节以内,并且推荐是最大包长的整数倍
  77. - **return** 返回 0 表示正确,其他表示错误
  78. .. note:: 启动接收以后,以下两种情况,会进入传输完成中断:1、最后一包为短包(小于 EP MPS);2、接收总长度等于 data_len
  79. .. note:: 对于 bulk 传输,data_len 通常设计为 EP MPS,以下三种情况可以修改为多个 EP MPS: 固定长度;自定义协议并携带长度(MSC); 主机手动发送 ZLP 或者短包(RNDIS)
  80. host controller(hcd)
  81. ------------------------
  82. usb_hc_init
  83. """"""""""""""""""""""""""""""""""""
  84. ``usb_hc_init`` 用于初始化 usb host controller 寄存器,设置 usb 引脚、时钟、中断等等。 **此函数不对用户开放**。
  85. .. code-block:: C
  86. int usb_hc_init(void);
  87. - **return** 返回 0 表示正确,其他表示错误
  88. usb_hc_deinit
  89. """"""""""""""""""""""""""""""""""""
  90. ``usb_hc_deinit`` 用于反初始化 usb host controller 寄存器。 **此函数不对用户开放**。
  91. .. code-block:: C
  92. int usb_hc_deinit(void);
  93. - **return** 返回 0 表示正确,其他表示错误
  94. usbh_roothub_control
  95. """"""""""""""""""""""""""""""""""""
  96. ``usbh_roothub_control`` 用来对 roothub 发起请求, **此函数不对用户开放**。
  97. .. code-block:: C
  98. int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf);
  99. - **setup** 请求
  100. - **buf** 接收缓冲区
  101. - **return** 返回 0 表示正确,其他表示错误
  102. usbh_submit_urb
  103. """"""""""""""""""""""""""""""""""""
  104. ``usbh_submit_urb`` 对某个地址上的端点进行数据请求。 **此函数对用户开放**。
  105. .. code-block:: C
  106. int usbh_submit_urb(struct usbh_urb *urb);
  107. - **urb** usb 请求块
  108. - **return** 返回 0 表示正确,其他表示错误
  109. 其中, `urb` 结构体信息如下:
  110. .. code-block:: C
  111. struct usbh_urb {
  112. usb_slist_t list;
  113. void *hcpriv;
  114. struct usbh_hubport *hport;
  115. struct usb_endpoint_descriptor *ep;
  116. uint8_t data_toggle;
  117. uint8_t interval;
  118. struct usb_setup_packet *setup;
  119. uint8_t *transfer_buffer;
  120. uint32_t transfer_buffer_length;
  121. int transfer_flags;
  122. uint32_t actual_length;
  123. uint32_t timeout;
  124. int errorcode;
  125. uint32_t num_of_iso_packets;
  126. uint32_t start_frame;
  127. usbh_complete_callback_t complete;
  128. void *arg;
  129. #if defined(__ICCARM__) || defined(__ICCRISCV__) || defined(__ICCRX__)
  130. struct usbh_iso_frame_packet *iso_packet;
  131. #else
  132. struct usbh_iso_frame_packet iso_packet[0];
  133. #endif
  134. };
  135. - **hcpriv** 主机控制器驱动私有成员
  136. - **hport** 当前 urb 使用的 hport
  137. - **ep** 当前 urb 使用的 ep
  138. - **data_toggle** 当前 data toggle
  139. - **interval** urb 传输间隔,单位 us,如果 interval 大于 1000us,则需要使用软件定时器来维护
  140. - **setup** setup 请求缓冲区,端点0使用
  141. - **transfer_buffer** 传输的数据缓冲区
  142. - **transfer_buffer_length** 传输长度
  143. - **transfer_flags** 传输时携带的 flag
  144. - **actual_length** 实际传输长度
  145. - **timeout** 传输超时时间,为 0 该函数则为非阻塞,可在中断中使用
  146. - **errorcode** 错误码
  147. - **num_of_iso_packets** iso 帧或者微帧个数
  148. - **complete** 传输完成回调函数
  149. - **arg** 传输完成时携带的参数
  150. - **iso_packet** iso 数据包
  151. .. note:: timeout 如何没有特别对时间的要求,必须设置成 0xffffffff,原则上不允许超时,如果超时了,一般不能再继续工作
  152. `errorcode` 可以返回以下值:
  153. .. code-block:: C
  154. #define USB_ERR_NOMEM 1
  155. #define USB_ERR_INVAL 2
  156. #define USB_ERR_NODEV 3
  157. #define USB_ERR_NOTCONN 4
  158. #define USB_ERR_NOTSUPP 5
  159. #define USB_ERR_BUSY 6
  160. #define USB_ERR_RANGE 7
  161. #define USB_ERR_STALL 8
  162. #define USB_ERR_BABBLE 9
  163. #define USB_ERR_NAK 10
  164. #define USB_ERR_DT 11
  165. #define USB_ERR_IO 12
  166. #define USB_ERR_SHUTDOWN 13
  167. #define USB_ERR_TIMEOUT 14
  168. 其中 `iso_packet` 结构体信息如下:
  169. .. code-block:: C
  170. struct usbh_iso_frame_packet {
  171. uint8_t *transfer_buffer;
  172. uint32_t transfer_buffer_length;
  173. uint32_t actual_length;
  174. int errorcode;
  175. };
  176. - **transfer_buffer** 传输的数据缓冲区
  177. - **transfer_buffer_length** 传输长度
  178. - **actual_length** 实际传输长度
  179. - **errorcode** 错误码