SWM341_usbh.c 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. /******************************************************************************************************************************************
  2. * 文件名称: SWM341_usbh.c
  3. * 功能说明: SWM341单片机的USB主机功能驱动库
  4. * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
  5. * 注意事项:
  6. * 版本日期: V1.1.0 2020年11月3日
  7. * 升级记录:
  8. *
  9. *
  10. *******************************************************************************************************************************************
  11. * @attention
  12. *
  13. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
  14. * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
  15. * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
  16. * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
  17. * -ECTION WITH THEIR PRODUCTS.
  18. *
  19. * COPYRIGHT 2012 Synwit Technology
  20. *******************************************************************************************************************************************/
  21. #include <string.h>
  22. #include "SWM341.h"
  23. #include "SWM341_usbh.h"
  24. static uint32_t Speed;
  25. /******************************************************************************************************************************************
  26. * 函数名称: USBH_HW_Init()
  27. * 功能说明: USB Host Hardware 初始化
  28. * 输 入: 无
  29. * 输 出: 无
  30. * 注意事项: 无
  31. ******************************************************************************************************************************************/
  32. void USBH_HW_Init(void)
  33. {
  34. SYS->USBCR = 0;
  35. for(int i = 0; i < CyclesPerUs; i++) __NOP();
  36. SYS->USBCR |= (1 << SYS_USBCR_RST48M_Pos); __DSB();
  37. SYS->USBCR |= (1 << SYS_USBCR_RST12M_Pos); __DSB();
  38. SYS->USBCR |= (1 << SYS_USBCR_RSTPLL_Pos); __DSB();
  39. for(int i = 0; i < CyclesPerUs; i++) __NOP();
  40. SYS->USBCR &= ~SYS_USBCR_ROLE_Msk;
  41. SYS->USBCR |= (2 << SYS_USBCR_ROLE_Pos);
  42. SYS->USBCR |= (1 << SYS_USBCR_VBUS_Pos);
  43. SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_USB_Pos);
  44. USBH->CR = USBH_CR_FLUSHFF_Msk;
  45. USBD->DEVCR = (0 << USBD_DEVCR_DEVICE_Pos) | // 主机模式
  46. (3 << USBD_DEVCR_SPEED_Pos) |
  47. (1 << USBD_DEVCR_CSRDONE_Pos);
  48. USBH->PORTSR = USBH_PORTSR_POWER_Msk;
  49. }
  50. /******************************************************************************************************************************************
  51. * 函数名称: USBH_ResetPort()
  52. * 功能说明: 复位端口
  53. * 输 入: 无
  54. * 输 出: 无
  55. * 注意事项: 无
  56. ******************************************************************************************************************************************/
  57. void USBH_ResetPort(void)
  58. {
  59. USBH->PORTSR = USBH_PORTSR_RESET_Msk;
  60. }
  61. /******************************************************************************************************************************************
  62. * 函数名称: USBH_IsDeviceConnected()
  63. * 功能说明: 是否有设备连接到端口
  64. * 输 入: 无
  65. * 输 出: 无
  66. * 注意事项: 无
  67. ******************************************************************************************************************************************/
  68. uint32_t USBH_IsDeviceConnected(void)
  69. {
  70. return (USBH->PORTSR & USBH_PORTSR_CONN_Msk) ? 1 : 0;
  71. }
  72. /******************************************************************************************************************************************
  73. * 函数名称: USBH_IsPortEnabled()
  74. * 功能说明: 端口是否使能
  75. * 输 入: 无
  76. * 输 出: 无
  77. * 注意事项: 无
  78. ******************************************************************************************************************************************/
  79. uint32_t USBH_IsPortEnabled(void)
  80. {
  81. return (USBH->PORTSR & USBH_PORTSR_ENA_Msk) ? 1 : 0;
  82. }
  83. /******************************************************************************************************************************************
  84. * 函数名称: USBH_GetDeviceSpeed()
  85. * 功能说明: 设备速度
  86. * 输 入: 无
  87. * 输 出: uint32_t 2 低速 3 全速
  88. * 注意事项: 无
  89. ******************************************************************************************************************************************/
  90. uint32_t USBH_GetDeviceSpeed(void)
  91. {
  92. Speed = (USBH->PORTSR & USBH_PORTSR_SPEED_Msk) ? 2 : 3;
  93. return Speed;
  94. }
  95. /******************************************************************************************************************************************
  96. * 函数名称: USBH_State()
  97. * 功能说明:
  98. * 输 入: 无
  99. * 输 出: 无
  100. * 注意事项: 无
  101. ******************************************************************************************************************************************/
  102. USBH_Resp USBH_State(void)
  103. {
  104. if(USBH->IF & USBH_IF_RXSTAT_Msk)
  105. {
  106. USBH->IF = USBH_IF_RXSTAT_Msk;
  107. switch(USBH->SR & USBH_SR_RESP_Msk)
  108. {
  109. case USBR_ACK:
  110. case USBR_NAK:
  111. case USBR_STALL:
  112. return (USBH->SR & USBH_SR_RESP_Msk);
  113. case USBR_ERR_PID:
  114. case USBR_ERR_CRC:
  115. case USBR_ERR_STUFF:
  116. case USBR_ERR_TOGGLE:
  117. case USBR_TIMEOUT:
  118. case USBR_UNEXPECTED_PID:
  119. return USBR_ERROR;
  120. }
  121. }
  122. return USBR_NO;
  123. }
  124. /******************************************************************************************************************************************
  125. * 函数名称: USBH_SendSetupPacket()
  126. * 功能说明: 发送 Setup 包
  127. * 输 入: 无
  128. * 输 出: 无
  129. * 注意事项: 无
  130. ******************************************************************************************************************************************/
  131. uint32_t USBH_SendSetupPacket(uint8_t addr, uint8_t *data, uint16_t size)
  132. {
  133. uint32_t res;
  134. __disable_irq();
  135. if((USBH->FRAMERM < 10000) && (USBH->FRAMERM > 2000))
  136. {
  137. USBH->TXTRSZ = size;
  138. for(uint32_t i = 0; i < size; i++)
  139. {
  140. ((uint8_t *)USBH->TXBUF)[i] = data[i];
  141. }
  142. USBH->TOKEN = (addr << USBH_TOKEN_ADDR_Pos) |
  143. (0 << USBH_TOKEN_EPNR_Pos) |
  144. (13 << USBH_TOKEN_TYPE_Pos) |
  145. (0 << USBH_TOKEN_DATAX_Pos) |
  146. (Speed << USBH_TOKEN_SPEED_Pos) |
  147. (size << USBH_TOKEN_TRSZ_Pos);
  148. res = 1;
  149. }
  150. else
  151. {
  152. res = 0;
  153. }
  154. __enable_irq();
  155. return res;
  156. }
  157. /******************************************************************************************************************************************
  158. * 函数名称: USBH_SendOutPacket()
  159. * 功能说明: 发送 Out 包
  160. * 输 入: 无
  161. * 输 出: 无
  162. * 注意事项: 无
  163. ******************************************************************************************************************************************/
  164. uint32_t USBH_SendOutPacket(uint8_t addr, uint8_t endp, uint8_t DATAx, uint8_t *data, uint16_t size)
  165. {
  166. uint32_t res;
  167. __disable_irq();
  168. if((USBH->FRAMERM < 10000) && (USBH->FRAMERM > 2000))
  169. {
  170. USBH->TXTRSZ = size;
  171. for(uint32_t i = 0; i < size; i++)
  172. {
  173. ((uint8_t *)USBH->TXBUF)[i] = data[i];
  174. }
  175. USBH->TOKEN = (addr << USBH_TOKEN_ADDR_Pos) |
  176. (endp << USBH_TOKEN_EPNR_Pos) |
  177. (1 << USBH_TOKEN_TYPE_Pos) |
  178. (DATAx << USBH_TOKEN_DATAX_Pos) |
  179. (Speed << USBH_TOKEN_SPEED_Pos) |
  180. (size << USBH_TOKEN_TRSZ_Pos);
  181. res = 1;
  182. }
  183. else
  184. {
  185. res = 0;
  186. }
  187. __enable_irq();
  188. return res;
  189. }
  190. /******************************************************************************************************************************************
  191. * 函数名称: USBH_SendInPacket()
  192. * 功能说明: 发送 In 包
  193. * 输 入: 无
  194. * 输 出: 无
  195. * 注意事项: 无
  196. ******************************************************************************************************************************************/
  197. uint32_t USBH_SendInPacket(uint8_t addr, uint8_t endp, uint8_t DATAx, uint16_t size)
  198. {
  199. uint32_t res;
  200. __disable_irq();
  201. if((USBH->FRAMERM < 10000) && (USBH->FRAMERM > 2000))
  202. {
  203. endp &= 0x0F;
  204. USBH->TOKEN = (addr << USBH_TOKEN_ADDR_Pos) |
  205. (endp << USBH_TOKEN_EPNR_Pos) |
  206. (9 << USBH_TOKEN_TYPE_Pos) |
  207. (DATAx << USBH_TOKEN_DATAX_Pos) |
  208. (Speed << USBH_TOKEN_SPEED_Pos) |
  209. (size << USBH_TOKEN_TRSZ_Pos);
  210. res = 1;
  211. }
  212. else
  213. {
  214. res = 0;
  215. }
  216. __enable_irq();
  217. return res;
  218. }
  219. /******************************************************************************************************************************************
  220. * 函数名称: USBH_ReadRxBuffer()
  221. * 功能说明: 读取接收到的数据
  222. * 输 入: 无
  223. * 输 出: 无
  224. * 注意事项: 无
  225. ******************************************************************************************************************************************/
  226. uint32_t USBH_ReadRxBuffer(uint8_t *buff, uint32_t size)
  227. {
  228. uint32_t real_size = (USBH->SR & USBH_SR_TRSZ_Msk) >> USBH_SR_TRSZ_Pos;
  229. if(size > real_size)
  230. size = real_size;
  231. USBD_memcpy(buff, (uint8_t *)USBH->RXBUF, size);
  232. return size;
  233. }