usb_host_framework.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. /*
  2. * Copyright (c) 2015 - 2016, Freescale Semiconductor, Inc.
  3. * Copyright 2016 NXP
  4. * All rights reserved.
  5. *
  6. * SPDX-License-Identifier: BSD-3-Clause
  7. */
  8. #include <usb/include/usb_host_config.h>
  9. #include "usb_host.h"
  10. #include "usb_host_hci.h"
  11. #include "usb_host_devices.h"
  12. #include "usb_host_framework.h"
  13. /*******************************************************************************
  14. * Definitions
  15. ******************************************************************************/
  16. /* Component ID definition, used by tools. */
  17. #ifndef FSL_COMPONENT_ID
  18. #define FSL_COMPONENT_ID "middleware.usb.host.fatfs_usb_stack"
  19. #endif
  20. /*******************************************************************************
  21. * Prototypes
  22. ******************************************************************************/
  23. /*******************************************************************************
  24. * Variables
  25. ******************************************************************************/
  26. /*******************************************************************************
  27. * Code
  28. ******************************************************************************/
  29. usb_status_t USB_HostCh9RequestCommon(usb_host_device_instance_t *deviceInstance,
  30. usb_host_transfer_t *transfer,
  31. uint8_t *buffer,
  32. uint32_t bufferLen)
  33. {
  34. /* initialize transfer */
  35. transfer->setupPacket->wLength = USB_SHORT_TO_LITTLE_ENDIAN((uint16_t)bufferLen);
  36. transfer->transferBuffer = buffer;
  37. transfer->transferLength = bufferLen;
  38. if (USB_HostSendSetup(deviceInstance->hostHandle, deviceInstance->controlPipe, transfer) !=
  39. kStatus_USB_Success) /* send setup transfer */
  40. {
  41. #ifdef HOST_ECHO
  42. usb_echo("failed for USB_HostSendSetup\r\n");
  43. #endif
  44. (void)USB_HostFreeTransfer(deviceInstance->hostHandle, transfer);
  45. return kStatus_USB_Error;
  46. }
  47. return kStatus_USB_Success;
  48. }
  49. usb_status_t USB_HostStandardGetStatus(usb_host_device_instance_t *deviceInstance,
  50. usb_host_transfer_t *transfer,
  51. void *param)
  52. {
  53. usb_host_get_status_param_t *statusParam;
  54. uint8_t length;
  55. /* initialize transfer */
  56. statusParam = (usb_host_get_status_param_t *)param;
  57. transfer->setupPacket->bmRequestType = USB_REQUEST_TYPE_DIR_IN | USB_REQUEST_TYPE_TYPE_STANDARD;
  58. if (statusParam->requestType == (uint8_t)kRequestDevice)
  59. {
  60. transfer->setupPacket->bmRequestType |= USB_REQUEST_TYPE_RECIPIENT_DEVICE;
  61. }
  62. else if (statusParam->requestType == (uint8_t)kRequestInterface)
  63. {
  64. transfer->setupPacket->bmRequestType |= USB_REQUEST_TYPE_RECIPIENT_INTERFACE;
  65. }
  66. else
  67. {
  68. transfer->setupPacket->bmRequestType |= USB_REQUEST_TYPE_RECIPIENT_ENDPOINT;
  69. }
  70. transfer->setupPacket->wIndex = USB_SHORT_TO_LITTLE_ENDIAN(statusParam->statusSelector);
  71. length = 2;
  72. if (statusParam->statusSelector == USB_REQUEST_STANDARD_GET_STATUS_OTG_STATUS_SELECTOR)
  73. {
  74. length = 1;
  75. }
  76. return USB_HostCh9RequestCommon(deviceInstance, transfer, statusParam->statusBuffer, length);
  77. }
  78. usb_status_t USB_HostStandardSetClearFeature(usb_host_device_instance_t *deviceInstance,
  79. usb_host_transfer_t *transfer,
  80. void *param)
  81. {
  82. usb_host_process_feature_param_t *featureParam;
  83. /* initialize transfer */
  84. featureParam = (usb_host_process_feature_param_t *)param;
  85. if (featureParam->requestType == (uint8_t)kRequestDevice)
  86. {
  87. transfer->setupPacket->bmRequestType |= USB_REQUEST_TYPE_RECIPIENT_DEVICE;
  88. }
  89. else if (featureParam->requestType == (uint8_t)kRequestInterface)
  90. {
  91. transfer->setupPacket->bmRequestType |= USB_REQUEST_TYPE_RECIPIENT_INTERFACE;
  92. }
  93. else
  94. {
  95. transfer->setupPacket->bmRequestType |= USB_REQUEST_TYPE_RECIPIENT_ENDPOINT;
  96. }
  97. transfer->setupPacket->wValue = USB_SHORT_TO_LITTLE_ENDIAN(featureParam->featureSelector);
  98. transfer->setupPacket->wIndex = USB_SHORT_TO_LITTLE_ENDIAN(featureParam->interfaceOrEndpoint);
  99. return USB_HostCh9RequestCommon(deviceInstance, transfer, NULL, 0);
  100. }
  101. usb_status_t USB_HostStandardSetAddress(usb_host_device_instance_t *deviceInstance,
  102. usb_host_transfer_t *transfer,
  103. void *param)
  104. {
  105. uint8_t address;
  106. /* initialize transfer */
  107. address = *(uint8_t *)param;
  108. transfer->setupPacket->wValue = USB_SHORT_TO_LITTLE_ENDIAN(address);
  109. return USB_HostCh9RequestCommon(deviceInstance, transfer, NULL, 0);
  110. }
  111. usb_status_t USB_HostStandardSetGetDescriptor(usb_host_device_instance_t *deviceInstance,
  112. usb_host_transfer_t *transfer,
  113. void *param)
  114. {
  115. usb_host_process_descriptor_param_t *descriptorParam;
  116. /* initialize transfer */
  117. descriptorParam = (usb_host_process_descriptor_param_t *)param;
  118. transfer->setupPacket->wValue = USB_SHORT_TO_LITTLE_ENDIAN(
  119. (uint16_t)((uint16_t)descriptorParam->descriptorType << 8) | descriptorParam->descriptorIndex);
  120. transfer->setupPacket->wIndex = USB_SHORT_TO_LITTLE_ENDIAN(descriptorParam->languageId);
  121. return USB_HostCh9RequestCommon(deviceInstance, transfer, descriptorParam->descriptorBuffer,
  122. descriptorParam->descriptorLength);
  123. }
  124. usb_status_t USB_HostStandardGetInterface(usb_host_device_instance_t *deviceInstance,
  125. usb_host_transfer_t *transfer,
  126. void *param)
  127. {
  128. usb_host_get_interface_param_t *interfaceParam;
  129. /* initialize transfer */
  130. interfaceParam = (usb_host_get_interface_param_t *)param;
  131. transfer->setupPacket->bmRequestType |= USB_REQUEST_TYPE_DIR_IN;
  132. transfer->setupPacket->bmRequestType |= USB_REQUEST_TYPE_RECIPIENT_INTERFACE;
  133. transfer->setupPacket->wIndex = USB_SHORT_TO_LITTLE_ENDIAN(interfaceParam->interface);
  134. return USB_HostCh9RequestCommon(deviceInstance, transfer, interfaceParam->alternateInterfaceBuffer, 1);
  135. }
  136. usb_status_t USB_HostStandardSetInterface(usb_host_device_instance_t *deviceInstance,
  137. usb_host_transfer_t *transfer,
  138. void *param)
  139. {
  140. usb_host_set_interface_param_t *setParam;
  141. /* initialize transfer */
  142. setParam = (usb_host_set_interface_param_t *)param;
  143. transfer->setupPacket->bmRequestType |= USB_REQUEST_TYPE_RECIPIENT_INTERFACE;
  144. transfer->setupPacket->wIndex = USB_SHORT_TO_LITTLE_ENDIAN(setParam->interface);
  145. transfer->setupPacket->wValue = USB_SHORT_TO_LITTLE_ENDIAN(setParam->alternateSetting);
  146. return USB_HostCh9RequestCommon(deviceInstance, transfer, NULL, 0);
  147. }
  148. usb_status_t USB_HostStandardSyncFrame(usb_host_device_instance_t *deviceInstance,
  149. usb_host_transfer_t *transfer,
  150. void *param)
  151. {
  152. usb_host_synch_frame_param_t *frameParam;
  153. /* initialize transfer */
  154. frameParam = (usb_host_synch_frame_param_t *)param;
  155. transfer->setupPacket->bmRequestType |= USB_REQUEST_TYPE_DIR_IN;
  156. transfer->setupPacket->bmRequestType |= USB_REQUEST_TYPE_RECIPIENT_ENDPOINT;
  157. transfer->setupPacket->wIndex = USB_SHORT_TO_LITTLE_ENDIAN(frameParam->endpoint);
  158. return USB_HostCh9RequestCommon(deviceInstance, transfer, frameParam->frameNumberBuffer, 2);
  159. }
  160. usb_status_t USB_HostRequestControl(usb_device_handle deviceHandle,
  161. uint8_t usbRequest,
  162. usb_host_transfer_t *transfer,
  163. void *param)
  164. {
  165. usb_host_device_instance_t *deviceInstance = (usb_host_device_instance_t *)deviceHandle;
  166. usb_status_t status = kStatus_USB_Error;
  167. if (deviceHandle == NULL)
  168. {
  169. return kStatus_USB_InvalidHandle;
  170. }
  171. /* reset transfer fields */
  172. transfer->setupPacket->bmRequestType = 0x00;
  173. transfer->setupPacket->bRequest = usbRequest;
  174. transfer->setupPacket->wIndex = 0;
  175. transfer->setupPacket->wLength = 0;
  176. transfer->setupPacket->wValue = 0;
  177. switch (usbRequest)
  178. {
  179. case USB_REQUEST_STANDARD_GET_STATUS: /* standard get status request */
  180. status = USB_HostStandardGetStatus(deviceInstance, transfer, param);
  181. break;
  182. case USB_REQUEST_STANDARD_CLEAR_FEATURE: /* standard clear status request */
  183. case USB_REQUEST_STANDARD_SET_FEATURE: /* standard set feature request */
  184. status = USB_HostStandardSetClearFeature(deviceInstance, transfer, param);
  185. break;
  186. case USB_REQUEST_STANDARD_SET_ADDRESS: /* standard set address request */
  187. status = USB_HostStandardSetAddress(deviceInstance, transfer, param);
  188. break;
  189. case USB_REQUEST_STANDARD_GET_DESCRIPTOR: /* standard get descriptor request */
  190. case USB_REQUEST_STANDARD_SET_DESCRIPTOR: /* standard set descriptor request */
  191. if (usbRequest == USB_REQUEST_STANDARD_GET_DESCRIPTOR)
  192. {
  193. transfer->setupPacket->bmRequestType |= USB_REQUEST_TYPE_DIR_IN;
  194. }
  195. status = USB_HostStandardSetGetDescriptor(deviceInstance, transfer, param);
  196. break;
  197. case USB_REQUEST_STANDARD_GET_CONFIGURATION: /* standard get configuration descriptor request */
  198. transfer->setupPacket->bmRequestType |= USB_REQUEST_TYPE_DIR_IN;
  199. status =
  200. USB_HostCh9RequestCommon((usb_host_device_instance_t *)deviceHandle, transfer, (uint8_t *)param, 1);
  201. break;
  202. case USB_REQUEST_STANDARD_SET_CONFIGURATION: /* standard set configuration request */
  203. transfer->setupPacket->wValue = USB_SHORT_TO_LITTLE_ENDIAN(*((uint8_t *)param));
  204. status = USB_HostCh9RequestCommon((usb_host_device_instance_t *)deviceHandle, transfer, NULL, 0);
  205. break;
  206. case USB_REQUEST_STANDARD_GET_INTERFACE: /* standard get interface request */
  207. status = USB_HostStandardGetInterface(deviceInstance, transfer, param);
  208. break;
  209. case USB_REQUEST_STANDARD_SET_INTERFACE: /* standard set interface request */
  210. status = USB_HostStandardSetInterface(deviceInstance, transfer, param);
  211. break;
  212. case USB_REQUEST_STANDARD_SYNCH_FRAME: /* standard synch frame request */
  213. status = USB_HostStandardSyncFrame(deviceInstance, transfer, param);
  214. break;
  215. default:
  216. /*no action*/
  217. break;
  218. }
  219. return status;
  220. }