mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Thu Aug 31 17:27:04 2017 +0100
Revision:
172:7d866c31b3c5
Child:
173:e131a1973e81
This updates the lib to the mbed lib v 150

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 172:7d866c31b3c5 1 /**************************************************************************//**
AnnaBridge 172:7d866c31b3c5 2 * @file hsusbd.c
AnnaBridge 172:7d866c31b3c5 3 * @version V1.00
AnnaBridge 172:7d866c31b3c5 4 * @brief M480 HSUSBD driver source file
AnnaBridge 172:7d866c31b3c5 5 *
AnnaBridge 172:7d866c31b3c5 6 * @copyright (C) 2016 Nuvoton Technology Corp. All rights reserved.
AnnaBridge 172:7d866c31b3c5 7 *****************************************************************************/
AnnaBridge 172:7d866c31b3c5 8 #include <stdio.h>
AnnaBridge 172:7d866c31b3c5 9 #include "M480.h"
AnnaBridge 172:7d866c31b3c5 10
AnnaBridge 172:7d866c31b3c5 11 /** @addtogroup M480_Device_Driver M480 Device Driver
AnnaBridge 172:7d866c31b3c5 12 @{
AnnaBridge 172:7d866c31b3c5 13 */
AnnaBridge 172:7d866c31b3c5 14
AnnaBridge 172:7d866c31b3c5 15 /** @addtogroup M480_HSUSBD_Driver HSUSBD Driver
AnnaBridge 172:7d866c31b3c5 16 @{
AnnaBridge 172:7d866c31b3c5 17 */
AnnaBridge 172:7d866c31b3c5 18
AnnaBridge 172:7d866c31b3c5 19
AnnaBridge 172:7d866c31b3c5 20 /** @addtogroup M480_HSUSBD_EXPORTED_FUNCTIONS HSUSBD Exported Functions
AnnaBridge 172:7d866c31b3c5 21 @{
AnnaBridge 172:7d866c31b3c5 22 */
AnnaBridge 172:7d866c31b3c5 23 /*--------------------------------------------------------------------------*/
AnnaBridge 172:7d866c31b3c5 24 /** @cond HIDDEN_SYMBOLS */
AnnaBridge 172:7d866c31b3c5 25 /* Global variables for Control Pipe */
AnnaBridge 172:7d866c31b3c5 26 S_HSUSBD_CMD_T gUsbCmd;
AnnaBridge 172:7d866c31b3c5 27 S_HSUSBD_INFO_T *g_hsusbd_sInfo;
AnnaBridge 172:7d866c31b3c5 28
AnnaBridge 172:7d866c31b3c5 29 HSUSBD_VENDOR_REQ g_hsusbd_pfnVendorRequest = NULL;
AnnaBridge 172:7d866c31b3c5 30 HSUSBD_CLASS_REQ g_hsusbd_pfnClassRequest = NULL;
AnnaBridge 172:7d866c31b3c5 31 HSUSBD_SET_INTERFACE_REQ g_hsusbd_pfnSetInterface = NULL;
AnnaBridge 172:7d866c31b3c5 32 uint32_t g_u32HsEpStallLock = 0ul; /* Bit map flag to lock specified EP when SET_FEATURE */
AnnaBridge 172:7d866c31b3c5 33
AnnaBridge 172:7d866c31b3c5 34 static uint8_t *g_hsusbd_CtrlInPointer = 0;
AnnaBridge 172:7d866c31b3c5 35 static uint32_t g_hsusbd_CtrlMaxPktSize = 64ul;
AnnaBridge 172:7d866c31b3c5 36 static uint8_t g_hsusbd_UsbConfig = 0ul;
AnnaBridge 172:7d866c31b3c5 37 static uint8_t g_hsusbd_UsbAltInterface = 0ul;
AnnaBridge 172:7d866c31b3c5 38 static uint8_t g_hsusbd_EnableTestMode = 0ul;
AnnaBridge 172:7d866c31b3c5 39 static uint8_t g_hsusbd_TestSelector = 0ul;
AnnaBridge 172:7d866c31b3c5 40
AnnaBridge 172:7d866c31b3c5 41 #ifdef __ICCARM__
AnnaBridge 172:7d866c31b3c5 42 #pragma data_alignment=4
AnnaBridge 172:7d866c31b3c5 43 static uint8_t g_hsusbd_buf[12];
AnnaBridge 172:7d866c31b3c5 44 #elif defined (__CC_ARM)
AnnaBridge 172:7d866c31b3c5 45 __align(4) static uint8_t g_hsusbd_buf[12];
AnnaBridge 172:7d866c31b3c5 46 #elif defined ( __GNUC__ )
AnnaBridge 172:7d866c31b3c5 47 static uint8_t g_hsusbd_buf[12] __attribute__((aligned (4)));
AnnaBridge 172:7d866c31b3c5 48 #endif
AnnaBridge 172:7d866c31b3c5 49
AnnaBridge 172:7d866c31b3c5 50 uint8_t g_hsusbd_Configured = 0ul;
AnnaBridge 172:7d866c31b3c5 51 uint8_t g_hsusbd_CtrlZero = 0ul;
AnnaBridge 172:7d866c31b3c5 52 uint8_t g_hsusbd_UsbAddr = 0ul;
AnnaBridge 172:7d866c31b3c5 53 uint8_t g_hsusbd_ShortPacket = 0ul;
AnnaBridge 172:7d866c31b3c5 54 uint32_t volatile g_hsusbd_DmaDone = 0ul;
AnnaBridge 172:7d866c31b3c5 55 uint32_t g_hsusbd_CtrlInSize = 0ul;
AnnaBridge 172:7d866c31b3c5 56 /** @endcond HIDDEN_SYMBOLS */
AnnaBridge 172:7d866c31b3c5 57
AnnaBridge 172:7d866c31b3c5 58 /**
AnnaBridge 172:7d866c31b3c5 59 * @brief HSUSBD Initial
AnnaBridge 172:7d866c31b3c5 60 *
AnnaBridge 172:7d866c31b3c5 61 * @param[in] param Descriptor
AnnaBridge 172:7d866c31b3c5 62 * @param[in] pfnClassReq Class Request Callback Function
AnnaBridge 172:7d866c31b3c5 63 * @param[in] pfnSetInterface SetInterface Request Callback Function
AnnaBridge 172:7d866c31b3c5 64 *
AnnaBridge 172:7d866c31b3c5 65 * @return None
AnnaBridge 172:7d866c31b3c5 66 *
AnnaBridge 172:7d866c31b3c5 67 * @details This function is used to initial HSUSBD.
AnnaBridge 172:7d866c31b3c5 68 */
AnnaBridge 172:7d866c31b3c5 69 void HSUSBD_Open(S_HSUSBD_INFO_T *param, HSUSBD_CLASS_REQ pfnClassReq, HSUSBD_SET_INTERFACE_REQ pfnSetInterface)
AnnaBridge 172:7d866c31b3c5 70 {
AnnaBridge 172:7d866c31b3c5 71 g_hsusbd_sInfo = param;
AnnaBridge 172:7d866c31b3c5 72 g_hsusbd_pfnClassRequest = pfnClassReq;
AnnaBridge 172:7d866c31b3c5 73 g_hsusbd_pfnSetInterface = pfnSetInterface;
AnnaBridge 172:7d866c31b3c5 74
AnnaBridge 172:7d866c31b3c5 75 /* get EP0 maximum packet size */
AnnaBridge 172:7d866c31b3c5 76 g_hsusbd_CtrlMaxPktSize = g_hsusbd_sInfo->gu8DevDesc[7];
AnnaBridge 172:7d866c31b3c5 77
AnnaBridge 172:7d866c31b3c5 78 /* Initial USB engine */
AnnaBridge 172:7d866c31b3c5 79 /* Enable PHY */
AnnaBridge 172:7d866c31b3c5 80 HSUSBD_ENABLE_PHY();
AnnaBridge 172:7d866c31b3c5 81 /* wait PHY clock ready */
AnnaBridge 172:7d866c31b3c5 82 while (1) {
AnnaBridge 172:7d866c31b3c5 83 HSUSBD->EP[EPA].EPMPS = 0x20ul;
AnnaBridge 172:7d866c31b3c5 84 if (HSUSBD->EP[EPA].EPMPS == 0x20ul) {
AnnaBridge 172:7d866c31b3c5 85 break;
AnnaBridge 172:7d866c31b3c5 86 }
AnnaBridge 172:7d866c31b3c5 87 }
AnnaBridge 172:7d866c31b3c5 88 /* Force SE0, and then clear it to connect*/
AnnaBridge 172:7d866c31b3c5 89 HSUSBD_SET_SE0();
AnnaBridge 172:7d866c31b3c5 90 }
AnnaBridge 172:7d866c31b3c5 91
AnnaBridge 172:7d866c31b3c5 92 /**
AnnaBridge 172:7d866c31b3c5 93 * @brief HSUSBD Start
AnnaBridge 172:7d866c31b3c5 94 *
AnnaBridge 172:7d866c31b3c5 95 * @param[in] None
AnnaBridge 172:7d866c31b3c5 96 *
AnnaBridge 172:7d866c31b3c5 97 * @return None
AnnaBridge 172:7d866c31b3c5 98 *
AnnaBridge 172:7d866c31b3c5 99 * @details This function is used to start transfer
AnnaBridge 172:7d866c31b3c5 100 */
AnnaBridge 172:7d866c31b3c5 101 void HSUSBD_Start(void)
AnnaBridge 172:7d866c31b3c5 102 {
AnnaBridge 172:7d866c31b3c5 103 HSUSBD_CLR_SE0();
AnnaBridge 172:7d866c31b3c5 104 }
AnnaBridge 172:7d866c31b3c5 105
AnnaBridge 172:7d866c31b3c5 106 /**
AnnaBridge 172:7d866c31b3c5 107 * @brief Process Setup Packet
AnnaBridge 172:7d866c31b3c5 108 *
AnnaBridge 172:7d866c31b3c5 109 * @param[in] None
AnnaBridge 172:7d866c31b3c5 110 *
AnnaBridge 172:7d866c31b3c5 111 * @return None
AnnaBridge 172:7d866c31b3c5 112 *
AnnaBridge 172:7d866c31b3c5 113 * @details This function is used to process Setup packet.
AnnaBridge 172:7d866c31b3c5 114 */
AnnaBridge 172:7d866c31b3c5 115 void HSUSBD_ProcessSetupPacket(void)
AnnaBridge 172:7d866c31b3c5 116 {
AnnaBridge 172:7d866c31b3c5 117 /* Setup packet process */
AnnaBridge 172:7d866c31b3c5 118 gUsbCmd.bmRequestType = (uint8_t)(HSUSBD->SETUP1_0 & 0xfful);
AnnaBridge 172:7d866c31b3c5 119 gUsbCmd.bRequest = (uint8_t)((HSUSBD->SETUP1_0 >> 8) & 0xfful);
AnnaBridge 172:7d866c31b3c5 120 gUsbCmd.wValue = (uint16_t)HSUSBD->SETUP3_2;
AnnaBridge 172:7d866c31b3c5 121 gUsbCmd.wIndex = (uint16_t)HSUSBD->SETUP5_4;
AnnaBridge 172:7d866c31b3c5 122 gUsbCmd.wLength = (uint16_t)HSUSBD->SETUP7_6;
AnnaBridge 172:7d866c31b3c5 123
AnnaBridge 172:7d866c31b3c5 124 /* USB device request in setup packet: offset 0, D[6..5]: 0=Standard, 1=Class, 2=Vendor, 3=Reserved */
AnnaBridge 172:7d866c31b3c5 125 switch (gUsbCmd.bmRequestType & 0x60ul) {
AnnaBridge 172:7d866c31b3c5 126 case REQ_STANDARD: {
AnnaBridge 172:7d866c31b3c5 127 HSUSBD_StandardRequest();
AnnaBridge 172:7d866c31b3c5 128 break;
AnnaBridge 172:7d866c31b3c5 129 }
AnnaBridge 172:7d866c31b3c5 130 case REQ_CLASS: {
AnnaBridge 172:7d866c31b3c5 131 if (g_hsusbd_pfnClassRequest != NULL) {
AnnaBridge 172:7d866c31b3c5 132 g_hsusbd_pfnClassRequest();
AnnaBridge 172:7d866c31b3c5 133 }
AnnaBridge 172:7d866c31b3c5 134 break;
AnnaBridge 172:7d866c31b3c5 135 }
AnnaBridge 172:7d866c31b3c5 136 case REQ_VENDOR: {
AnnaBridge 172:7d866c31b3c5 137 if (g_hsusbd_pfnVendorRequest != NULL) {
AnnaBridge 172:7d866c31b3c5 138 g_hsusbd_pfnVendorRequest();
AnnaBridge 172:7d866c31b3c5 139 }
AnnaBridge 172:7d866c31b3c5 140 break;
AnnaBridge 172:7d866c31b3c5 141 }
AnnaBridge 172:7d866c31b3c5 142 default: {
AnnaBridge 172:7d866c31b3c5 143 /* Setup error, stall the device */
AnnaBridge 172:7d866c31b3c5 144 HSUSBD_SET_CEP_STATE(HSUSBD_CEPCTL_STALLEN_Msk);
AnnaBridge 172:7d866c31b3c5 145 break;
AnnaBridge 172:7d866c31b3c5 146 }
AnnaBridge 172:7d866c31b3c5 147 }
AnnaBridge 172:7d866c31b3c5 148 }
AnnaBridge 172:7d866c31b3c5 149
AnnaBridge 172:7d866c31b3c5 150 /**
AnnaBridge 172:7d866c31b3c5 151 * @brief Get Descriptor request
AnnaBridge 172:7d866c31b3c5 152 *
AnnaBridge 172:7d866c31b3c5 153 * @param[in] None
AnnaBridge 172:7d866c31b3c5 154 *
AnnaBridge 172:7d866c31b3c5 155 * @return None
AnnaBridge 172:7d866c31b3c5 156 *
AnnaBridge 172:7d866c31b3c5 157 * @details This function is used to process GetDescriptor request.
AnnaBridge 172:7d866c31b3c5 158 */
AnnaBridge 172:7d866c31b3c5 159 int HSUSBD_GetDescriptor(void)
AnnaBridge 172:7d866c31b3c5 160 {
AnnaBridge 172:7d866c31b3c5 161 uint32_t u32Len;
AnnaBridge 172:7d866c31b3c5 162 int val = 0;
AnnaBridge 172:7d866c31b3c5 163
AnnaBridge 172:7d866c31b3c5 164 u32Len = gUsbCmd.wLength;
AnnaBridge 172:7d866c31b3c5 165 g_hsusbd_CtrlZero = (uint8_t)0ul;
AnnaBridge 172:7d866c31b3c5 166
AnnaBridge 172:7d866c31b3c5 167 switch ((gUsbCmd.wValue & 0xff00ul) >> 8) {
AnnaBridge 172:7d866c31b3c5 168 /* Get Device Descriptor */
AnnaBridge 172:7d866c31b3c5 169 case DESC_DEVICE: {
AnnaBridge 172:7d866c31b3c5 170 u32Len = Minimum(u32Len, LEN_DEVICE);
AnnaBridge 172:7d866c31b3c5 171 HSUSBD_PrepareCtrlIn((uint8_t *)g_hsusbd_sInfo->gu8DevDesc, u32Len);
AnnaBridge 172:7d866c31b3c5 172 break;
AnnaBridge 172:7d866c31b3c5 173 }
AnnaBridge 172:7d866c31b3c5 174 /* Get Configuration Descriptor */
AnnaBridge 172:7d866c31b3c5 175 case DESC_CONFIG: {
AnnaBridge 172:7d866c31b3c5 176 uint32_t u32TotalLen;
AnnaBridge 172:7d866c31b3c5 177 if ((HSUSBD->OPER & 0x04ul) == 0x04ul) {
AnnaBridge 172:7d866c31b3c5 178 u32TotalLen = g_hsusbd_sInfo->gu8ConfigDesc[3];
AnnaBridge 172:7d866c31b3c5 179 u32TotalLen = g_hsusbd_sInfo->gu8ConfigDesc[2] + (u32TotalLen << 8);
AnnaBridge 172:7d866c31b3c5 180
AnnaBridge 172:7d866c31b3c5 181 u32Len = Minimum(u32Len, u32TotalLen);
AnnaBridge 172:7d866c31b3c5 182 if ((u32Len % g_hsusbd_CtrlMaxPktSize) == 0ul) {
AnnaBridge 172:7d866c31b3c5 183 g_hsusbd_CtrlZero = (uint8_t)1ul;
AnnaBridge 172:7d866c31b3c5 184 }
AnnaBridge 172:7d866c31b3c5 185 HSUSBD_PrepareCtrlIn((uint8_t *)g_hsusbd_sInfo->gu8ConfigDesc, u32Len);
AnnaBridge 172:7d866c31b3c5 186 } else {
AnnaBridge 172:7d866c31b3c5 187 u32TotalLen = g_hsusbd_sInfo->gu8FullConfigDesc[3];
AnnaBridge 172:7d866c31b3c5 188 u32TotalLen = g_hsusbd_sInfo->gu8FullConfigDesc[2] + (u32TotalLen << 8);
AnnaBridge 172:7d866c31b3c5 189
AnnaBridge 172:7d866c31b3c5 190 u32Len = Minimum(u32Len, u32TotalLen);
AnnaBridge 172:7d866c31b3c5 191 if ((u32Len % g_hsusbd_CtrlMaxPktSize) == 0ul) {
AnnaBridge 172:7d866c31b3c5 192 g_hsusbd_CtrlZero = (uint8_t)1ul;
AnnaBridge 172:7d866c31b3c5 193 }
AnnaBridge 172:7d866c31b3c5 194
AnnaBridge 172:7d866c31b3c5 195 HSUSBD_PrepareCtrlIn((uint8_t *)g_hsusbd_sInfo->gu8FullConfigDesc, u32Len);
AnnaBridge 172:7d866c31b3c5 196 }
AnnaBridge 172:7d866c31b3c5 197
AnnaBridge 172:7d866c31b3c5 198 break;
AnnaBridge 172:7d866c31b3c5 199 }
AnnaBridge 172:7d866c31b3c5 200 /* Get Qualifier Descriptor */
AnnaBridge 172:7d866c31b3c5 201 case DESC_QUALIFIER: {
AnnaBridge 172:7d866c31b3c5 202 u32Len = Minimum(u32Len, LEN_QUALIFIER);
AnnaBridge 172:7d866c31b3c5 203 HSUSBD_PrepareCtrlIn((uint8_t *)g_hsusbd_sInfo->gu8QualDesc, u32Len);
AnnaBridge 172:7d866c31b3c5 204 break;
AnnaBridge 172:7d866c31b3c5 205 }
AnnaBridge 172:7d866c31b3c5 206 /* Get Other Speed Descriptor - Full speed */
AnnaBridge 172:7d866c31b3c5 207 case DESC_OTHERSPEED: {
AnnaBridge 172:7d866c31b3c5 208 uint32_t u32TotalLen;
AnnaBridge 172:7d866c31b3c5 209 if ((HSUSBD->OPER & 0x04ul) == 0x04ul) {
AnnaBridge 172:7d866c31b3c5 210 u32TotalLen = g_hsusbd_sInfo->gu8HSOtherConfigDesc[3];
AnnaBridge 172:7d866c31b3c5 211 u32TotalLen = g_hsusbd_sInfo->gu8HSOtherConfigDesc[2] + (u32TotalLen << 8);
AnnaBridge 172:7d866c31b3c5 212
AnnaBridge 172:7d866c31b3c5 213 u32Len = Minimum(u32Len, u32TotalLen);
AnnaBridge 172:7d866c31b3c5 214 if ((u32Len % g_hsusbd_CtrlMaxPktSize) == 0ul) {
AnnaBridge 172:7d866c31b3c5 215 g_hsusbd_CtrlZero = (uint8_t)1ul;
AnnaBridge 172:7d866c31b3c5 216 }
AnnaBridge 172:7d866c31b3c5 217
AnnaBridge 172:7d866c31b3c5 218 HSUSBD_PrepareCtrlIn((uint8_t *)g_hsusbd_sInfo->gu8HSOtherConfigDesc, u32Len);
AnnaBridge 172:7d866c31b3c5 219 } else {
AnnaBridge 172:7d866c31b3c5 220 u32TotalLen = g_hsusbd_sInfo->gu8FSOtherConfigDesc[3];
AnnaBridge 172:7d866c31b3c5 221 u32TotalLen = g_hsusbd_sInfo->gu8FSOtherConfigDesc[2] + (u32TotalLen << 8);
AnnaBridge 172:7d866c31b3c5 222
AnnaBridge 172:7d866c31b3c5 223 u32Len = Minimum(u32Len, u32TotalLen);
AnnaBridge 172:7d866c31b3c5 224 if ((u32Len % g_hsusbd_CtrlMaxPktSize) == 0ul) {
AnnaBridge 172:7d866c31b3c5 225 g_hsusbd_CtrlZero = (uint8_t)1ul;
AnnaBridge 172:7d866c31b3c5 226 }
AnnaBridge 172:7d866c31b3c5 227
AnnaBridge 172:7d866c31b3c5 228 HSUSBD_PrepareCtrlIn((uint8_t *)g_hsusbd_sInfo->gu8FSOtherConfigDesc, u32Len);
AnnaBridge 172:7d866c31b3c5 229 }
AnnaBridge 172:7d866c31b3c5 230
AnnaBridge 172:7d866c31b3c5 231 break;
AnnaBridge 172:7d866c31b3c5 232 }
AnnaBridge 172:7d866c31b3c5 233 /* Get HID Descriptor */
AnnaBridge 172:7d866c31b3c5 234 case DESC_HID: {
AnnaBridge 172:7d866c31b3c5 235 u32Len = Minimum(u32Len, LEN_HID);
AnnaBridge 172:7d866c31b3c5 236 HSUSBD_MemCopy(g_hsusbd_buf, &g_hsusbd_sInfo->gu8ConfigDesc[LEN_CONFIG+LEN_INTERFACE], u32Len);
AnnaBridge 172:7d866c31b3c5 237 HSUSBD_PrepareCtrlIn(g_hsusbd_buf, u32Len);
AnnaBridge 172:7d866c31b3c5 238 break;
AnnaBridge 172:7d866c31b3c5 239 }
AnnaBridge 172:7d866c31b3c5 240 /* Get Report Descriptor */
AnnaBridge 172:7d866c31b3c5 241 case DESC_HID_RPT: {
AnnaBridge 172:7d866c31b3c5 242 if ((u32Len % g_hsusbd_CtrlMaxPktSize) == 0ul) {
AnnaBridge 172:7d866c31b3c5 243 g_hsusbd_CtrlZero = (uint8_t)1ul;
AnnaBridge 172:7d866c31b3c5 244 }
AnnaBridge 172:7d866c31b3c5 245
AnnaBridge 172:7d866c31b3c5 246 if ((HSUSBD->OPER & 0x04ul) == 0x04ul) {
AnnaBridge 172:7d866c31b3c5 247 u32Len = Minimum(u32Len, g_hsusbd_sInfo->gu32HidReportSize[gUsbCmd.wIndex & 0xfful]);
AnnaBridge 172:7d866c31b3c5 248 HSUSBD_PrepareCtrlIn((uint8_t *)g_hsusbd_sInfo->gu8HidReportDesc[gUsbCmd.wIndex & 0xfful], u32Len);
AnnaBridge 172:7d866c31b3c5 249 } else {
AnnaBridge 172:7d866c31b3c5 250 u32Len = Minimum(u32Len, g_hsusbd_sInfo->gu32FSHidReportSize[gUsbCmd.wIndex & 0xfful]);
AnnaBridge 172:7d866c31b3c5 251 HSUSBD_PrepareCtrlIn((uint8_t *)g_hsusbd_sInfo->gu8FSHidReportDesc[gUsbCmd.wIndex & 0xfful], u32Len);
AnnaBridge 172:7d866c31b3c5 252 }
AnnaBridge 172:7d866c31b3c5 253 break;
AnnaBridge 172:7d866c31b3c5 254 }
AnnaBridge 172:7d866c31b3c5 255 /* Get String Descriptor */
AnnaBridge 172:7d866c31b3c5 256 case DESC_STRING: {
AnnaBridge 172:7d866c31b3c5 257 if((gUsbCmd.wValue & 0xfful) < 8ul) {
AnnaBridge 172:7d866c31b3c5 258 u32Len = Minimum(u32Len, g_hsusbd_sInfo->gu8StringDesc[gUsbCmd.wValue & 0xfful][0]);
AnnaBridge 172:7d866c31b3c5 259 if ((u32Len % g_hsusbd_CtrlMaxPktSize) == 0ul) {
AnnaBridge 172:7d866c31b3c5 260 g_hsusbd_CtrlZero = (uint8_t)1ul;
AnnaBridge 172:7d866c31b3c5 261 }
AnnaBridge 172:7d866c31b3c5 262 HSUSBD_PrepareCtrlIn((uint8_t *)g_hsusbd_sInfo->gu8StringDesc[gUsbCmd.wValue & 0xfful], u32Len);
AnnaBridge 172:7d866c31b3c5 263 } else {
AnnaBridge 172:7d866c31b3c5 264 HSUSBD_SET_CEP_STATE(HSUSBD_CEPCTL_STALLEN_Msk);
AnnaBridge 172:7d866c31b3c5 265 val = 1;
AnnaBridge 172:7d866c31b3c5 266 }
AnnaBridge 172:7d866c31b3c5 267 break;
AnnaBridge 172:7d866c31b3c5 268 }
AnnaBridge 172:7d866c31b3c5 269 default:
AnnaBridge 172:7d866c31b3c5 270 /* Not support. Reply STALL. */
AnnaBridge 172:7d866c31b3c5 271 HSUSBD_SET_CEP_STATE(HSUSBD_CEPCTL_STALLEN_Msk);
AnnaBridge 172:7d866c31b3c5 272 val = 1;
AnnaBridge 172:7d866c31b3c5 273 break;
AnnaBridge 172:7d866c31b3c5 274 }
AnnaBridge 172:7d866c31b3c5 275 return val;
AnnaBridge 172:7d866c31b3c5 276 }
AnnaBridge 172:7d866c31b3c5 277
AnnaBridge 172:7d866c31b3c5 278
AnnaBridge 172:7d866c31b3c5 279 /**
AnnaBridge 172:7d866c31b3c5 280 * @brief Process USB standard request
AnnaBridge 172:7d866c31b3c5 281 *
AnnaBridge 172:7d866c31b3c5 282 * @param[in] None
AnnaBridge 172:7d866c31b3c5 283 *
AnnaBridge 172:7d866c31b3c5 284 * @return None
AnnaBridge 172:7d866c31b3c5 285 *
AnnaBridge 172:7d866c31b3c5 286 * @details This function is used to process USB Standard Request.
AnnaBridge 172:7d866c31b3c5 287 */
AnnaBridge 172:7d866c31b3c5 288 void HSUSBD_StandardRequest(void)
AnnaBridge 172:7d866c31b3c5 289 {
AnnaBridge 172:7d866c31b3c5 290 /* clear global variables for new request */
AnnaBridge 172:7d866c31b3c5 291 g_hsusbd_CtrlInPointer = 0;
AnnaBridge 172:7d866c31b3c5 292 g_hsusbd_CtrlInSize = 0ul;
AnnaBridge 172:7d866c31b3c5 293
AnnaBridge 172:7d866c31b3c5 294 if ((gUsbCmd.bmRequestType & 0x80ul) == 0x80ul) { /* request data transfer direction */
AnnaBridge 172:7d866c31b3c5 295 /* Device to host */
AnnaBridge 172:7d866c31b3c5 296 switch (gUsbCmd.bRequest) {
AnnaBridge 172:7d866c31b3c5 297 case GET_CONFIGURATION: {
AnnaBridge 172:7d866c31b3c5 298 /* Return current configuration setting */
AnnaBridge 172:7d866c31b3c5 299 HSUSBD_PrepareCtrlIn((uint8_t *)&g_hsusbd_UsbConfig, 1ul);
AnnaBridge 172:7d866c31b3c5 300
AnnaBridge 172:7d866c31b3c5 301 HSUSBD_CLR_CEP_INT_FLAG(HSUSBD_CEPINTSTS_INTKIF_Msk);
AnnaBridge 172:7d866c31b3c5 302 HSUSBD_ENABLE_CEP_INT(HSUSBD_CEPINTEN_INTKIEN_Msk);
AnnaBridge 172:7d866c31b3c5 303 break;
AnnaBridge 172:7d866c31b3c5 304 }
AnnaBridge 172:7d866c31b3c5 305 case GET_DESCRIPTOR: {
AnnaBridge 172:7d866c31b3c5 306 if (!HSUSBD_GetDescriptor()) {
AnnaBridge 172:7d866c31b3c5 307 HSUSBD_CLR_CEP_INT_FLAG(HSUSBD_CEPINTSTS_INTKIF_Msk);
AnnaBridge 172:7d866c31b3c5 308 HSUSBD_ENABLE_CEP_INT(HSUSBD_CEPINTEN_INTKIEN_Msk);
AnnaBridge 172:7d866c31b3c5 309 }
AnnaBridge 172:7d866c31b3c5 310 break;
AnnaBridge 172:7d866c31b3c5 311 }
AnnaBridge 172:7d866c31b3c5 312 case GET_INTERFACE: {
AnnaBridge 172:7d866c31b3c5 313 /* Return current interface setting */
AnnaBridge 172:7d866c31b3c5 314 HSUSBD_PrepareCtrlIn((uint8_t *)&g_hsusbd_UsbAltInterface, 1ul);
AnnaBridge 172:7d866c31b3c5 315
AnnaBridge 172:7d866c31b3c5 316 HSUSBD_CLR_CEP_INT_FLAG(HSUSBD_CEPINTSTS_INTKIF_Msk);
AnnaBridge 172:7d866c31b3c5 317 HSUSBD_ENABLE_CEP_INT(HSUSBD_CEPINTEN_INTKIEN_Msk);
AnnaBridge 172:7d866c31b3c5 318 break;
AnnaBridge 172:7d866c31b3c5 319 }
AnnaBridge 172:7d866c31b3c5 320 case GET_STATUS: {
AnnaBridge 172:7d866c31b3c5 321 /* Device */
AnnaBridge 172:7d866c31b3c5 322 if (gUsbCmd.bmRequestType == 0x80ul) {
AnnaBridge 172:7d866c31b3c5 323 if ((g_hsusbd_sInfo->gu8ConfigDesc[7] & 0x40ul) == 0x40ul) {
AnnaBridge 172:7d866c31b3c5 324 g_hsusbd_buf[0] = (uint8_t)1ul; /* Self-Powered */
AnnaBridge 172:7d866c31b3c5 325 } else {
AnnaBridge 172:7d866c31b3c5 326 g_hsusbd_buf[0] = (uint8_t)0ul; /* bus-Powered */
AnnaBridge 172:7d866c31b3c5 327 }
AnnaBridge 172:7d866c31b3c5 328 }
AnnaBridge 172:7d866c31b3c5 329 /* Interface */
AnnaBridge 172:7d866c31b3c5 330 else if (gUsbCmd.bmRequestType == 0x81ul) {
AnnaBridge 172:7d866c31b3c5 331 g_hsusbd_buf[0] = (uint8_t)0ul;
AnnaBridge 172:7d866c31b3c5 332 }
AnnaBridge 172:7d866c31b3c5 333 /* Endpoint */
AnnaBridge 172:7d866c31b3c5 334 else if (gUsbCmd.bmRequestType == 0x82ul) {
AnnaBridge 172:7d866c31b3c5 335 uint8_t ep = (uint8_t)(gUsbCmd.wIndex & 0xFul);
AnnaBridge 172:7d866c31b3c5 336 g_hsusbd_buf[0] = (uint8_t)HSUSBD_GetStall((uint32_t)ep)? (uint8_t)1 : (uint8_t)0;
AnnaBridge 172:7d866c31b3c5 337 }
AnnaBridge 172:7d866c31b3c5 338 g_hsusbd_buf[1] = (uint8_t)0ul;
AnnaBridge 172:7d866c31b3c5 339 HSUSBD_PrepareCtrlIn(g_hsusbd_buf, 2ul);
AnnaBridge 172:7d866c31b3c5 340 HSUSBD_CLR_CEP_INT_FLAG(HSUSBD_CEPINTSTS_INTKIF_Msk);
AnnaBridge 172:7d866c31b3c5 341 HSUSBD_ENABLE_CEP_INT(HSUSBD_CEPINTEN_INTKIEN_Msk);
AnnaBridge 172:7d866c31b3c5 342 break;
AnnaBridge 172:7d866c31b3c5 343 }
AnnaBridge 172:7d866c31b3c5 344 default: {
AnnaBridge 172:7d866c31b3c5 345 /* Setup error, stall the device */
AnnaBridge 172:7d866c31b3c5 346 HSUSBD_SET_CEP_STATE(HSUSBD_CEPCTL_STALLEN_Msk);
AnnaBridge 172:7d866c31b3c5 347 break;
AnnaBridge 172:7d866c31b3c5 348 }
AnnaBridge 172:7d866c31b3c5 349 }
AnnaBridge 172:7d866c31b3c5 350 } else {
AnnaBridge 172:7d866c31b3c5 351 /* Host to device */
AnnaBridge 172:7d866c31b3c5 352 switch (gUsbCmd.bRequest) {
AnnaBridge 172:7d866c31b3c5 353 case CLEAR_FEATURE: {
AnnaBridge 172:7d866c31b3c5 354 if((gUsbCmd.wValue & 0xfful) == FEATURE_ENDPOINT_HALT) {
AnnaBridge 172:7d866c31b3c5 355
AnnaBridge 172:7d866c31b3c5 356 uint32_t epNum, i;
AnnaBridge 172:7d866c31b3c5 357
AnnaBridge 172:7d866c31b3c5 358 /* EP number stall is not allow to be clear in MSC class "Error Recovery Test".
AnnaBridge 172:7d866c31b3c5 359 a flag: g_u32HsEpStallLock is added to support it */
AnnaBridge 172:7d866c31b3c5 360 epNum = (uint32_t)(gUsbCmd.wIndex & 0xFul);
AnnaBridge 172:7d866c31b3c5 361 for (i=0ul; i<HSUSBD_MAX_EP; i++) {
AnnaBridge 172:7d866c31b3c5 362 if ((((HSUSBD->EP[i].EPCFG & 0xf0ul) >> 4) == epNum) && ((g_u32HsEpStallLock & (1ul << i)) == 0ul)) {
AnnaBridge 172:7d866c31b3c5 363 HSUSBD->EP[i].EPRSPCTL = (HSUSBD->EP[i].EPRSPCTL & 0xeful) | HSUSBD_EP_RSPCTL_TOGGLE;
AnnaBridge 172:7d866c31b3c5 364 }
AnnaBridge 172:7d866c31b3c5 365 }
AnnaBridge 172:7d866c31b3c5 366 }
AnnaBridge 172:7d866c31b3c5 367 /* Status stage */
AnnaBridge 172:7d866c31b3c5 368 HSUSBD_CLR_CEP_INT_FLAG(HSUSBD_CEPINTSTS_STSDONEIF_Msk);
AnnaBridge 172:7d866c31b3c5 369 HSUSBD_SET_CEP_STATE(HSUSBD_CEPCTL_NAKCLR);
AnnaBridge 172:7d866c31b3c5 370 HSUSBD_ENABLE_CEP_INT(HSUSBD_CEPINTEN_STSDONEIEN_Msk);
AnnaBridge 172:7d866c31b3c5 371 break;
AnnaBridge 172:7d866c31b3c5 372 }
AnnaBridge 172:7d866c31b3c5 373 case SET_ADDRESS: {
AnnaBridge 172:7d866c31b3c5 374 g_hsusbd_UsbAddr = (uint8_t)gUsbCmd.wValue;
AnnaBridge 172:7d866c31b3c5 375 /* Status Stage */
AnnaBridge 172:7d866c31b3c5 376 HSUSBD_CLR_CEP_INT_FLAG(HSUSBD_CEPINTSTS_STSDONEIF_Msk);
AnnaBridge 172:7d866c31b3c5 377 HSUSBD_SET_CEP_STATE(HSUSBD_CEPCTL_NAKCLR);
AnnaBridge 172:7d866c31b3c5 378 HSUSBD_ENABLE_CEP_INT(HSUSBD_CEPINTEN_STSDONEIEN_Msk);
AnnaBridge 172:7d866c31b3c5 379 break;
AnnaBridge 172:7d866c31b3c5 380 }
AnnaBridge 172:7d866c31b3c5 381 case SET_CONFIGURATION: {
AnnaBridge 172:7d866c31b3c5 382 g_hsusbd_UsbConfig = (uint8_t)gUsbCmd.wValue;
AnnaBridge 172:7d866c31b3c5 383 g_hsusbd_Configured = (uint8_t)1ul;
AnnaBridge 172:7d866c31b3c5 384 /* Status stage */
AnnaBridge 172:7d866c31b3c5 385 HSUSBD_CLR_CEP_INT_FLAG(HSUSBD_CEPINTSTS_STSDONEIF_Msk);
AnnaBridge 172:7d866c31b3c5 386 HSUSBD_SET_CEP_STATE(HSUSBD_CEPCTL_NAKCLR);
AnnaBridge 172:7d866c31b3c5 387 HSUSBD_ENABLE_CEP_INT(HSUSBD_CEPINTEN_STSDONEIEN_Msk);
AnnaBridge 172:7d866c31b3c5 388 break;
AnnaBridge 172:7d866c31b3c5 389 }
AnnaBridge 172:7d866c31b3c5 390 case SET_FEATURE: {
AnnaBridge 172:7d866c31b3c5 391 if ((gUsbCmd.wValue & 0x3ul) == 2ul) { /* TEST_MODE */
AnnaBridge 172:7d866c31b3c5 392 g_hsusbd_EnableTestMode = (uint8_t)1ul;
AnnaBridge 172:7d866c31b3c5 393 g_hsusbd_TestSelector = (uint8_t)(gUsbCmd.wIndex >> 8);
AnnaBridge 172:7d866c31b3c5 394 }
AnnaBridge 172:7d866c31b3c5 395 if ((gUsbCmd.wValue & 0x3ul) == 3ul) { /* HNP ebable */
AnnaBridge 172:7d866c31b3c5 396 HSOTG->CTL |= (HSOTG_CTL_HNPREQEN_Msk | HSOTG_CTL_BUSREQ_Msk);
AnnaBridge 172:7d866c31b3c5 397 }
AnnaBridge 172:7d866c31b3c5 398
AnnaBridge 172:7d866c31b3c5 399 /* Status stage */
AnnaBridge 172:7d866c31b3c5 400 HSUSBD_CLR_CEP_INT_FLAG(HSUSBD_CEPINTSTS_STSDONEIF_Msk);
AnnaBridge 172:7d866c31b3c5 401 HSUSBD_SET_CEP_STATE(HSUSBD_CEPCTL_NAKCLR);
AnnaBridge 172:7d866c31b3c5 402 HSUSBD_ENABLE_CEP_INT(HSUSBD_CEPINTEN_STSDONEIEN_Msk);
AnnaBridge 172:7d866c31b3c5 403 break;
AnnaBridge 172:7d866c31b3c5 404 }
AnnaBridge 172:7d866c31b3c5 405 case SET_INTERFACE: {
AnnaBridge 172:7d866c31b3c5 406 g_hsusbd_UsbAltInterface = (uint8_t)gUsbCmd.wValue;
AnnaBridge 172:7d866c31b3c5 407 if (g_hsusbd_pfnSetInterface != NULL) {
AnnaBridge 172:7d866c31b3c5 408 g_hsusbd_pfnSetInterface((uint32_t)g_hsusbd_UsbAltInterface);
AnnaBridge 172:7d866c31b3c5 409 }
AnnaBridge 172:7d866c31b3c5 410 /* Status stage */
AnnaBridge 172:7d866c31b3c5 411 HSUSBD_CLR_CEP_INT_FLAG(HSUSBD_CEPINTSTS_STSDONEIF_Msk);
AnnaBridge 172:7d866c31b3c5 412 HSUSBD_SET_CEP_STATE(HSUSBD_CEPCTL_NAKCLR);
AnnaBridge 172:7d866c31b3c5 413 HSUSBD_ENABLE_CEP_INT(HSUSBD_CEPINTEN_STSDONEIEN_Msk);
AnnaBridge 172:7d866c31b3c5 414 break;
AnnaBridge 172:7d866c31b3c5 415 }
AnnaBridge 172:7d866c31b3c5 416 default: {
AnnaBridge 172:7d866c31b3c5 417 /* Setup error, stall the device */
AnnaBridge 172:7d866c31b3c5 418 HSUSBD_SET_CEP_STATE(HSUSBD_CEPCTL_STALLEN_Msk);
AnnaBridge 172:7d866c31b3c5 419 break;
AnnaBridge 172:7d866c31b3c5 420 }
AnnaBridge 172:7d866c31b3c5 421 }
AnnaBridge 172:7d866c31b3c5 422 }
AnnaBridge 172:7d866c31b3c5 423 }
AnnaBridge 172:7d866c31b3c5 424
AnnaBridge 172:7d866c31b3c5 425 /**
AnnaBridge 172:7d866c31b3c5 426 * @brief Update Device State
AnnaBridge 172:7d866c31b3c5 427 *
AnnaBridge 172:7d866c31b3c5 428 * @param[in] None
AnnaBridge 172:7d866c31b3c5 429 *
AnnaBridge 172:7d866c31b3c5 430 * @return None
AnnaBridge 172:7d866c31b3c5 431 *
AnnaBridge 172:7d866c31b3c5 432 * @details This function is used to update Device state when Setup packet complete
AnnaBridge 172:7d866c31b3c5 433 */
AnnaBridge 172:7d866c31b3c5 434 /** @cond HIDDEN_SYMBOLS */
AnnaBridge 172:7d866c31b3c5 435 #define TEST_J 0x01ul
AnnaBridge 172:7d866c31b3c5 436 #define TEST_K 0x02ul
AnnaBridge 172:7d866c31b3c5 437 #define TEST_SE0_NAK 0x03ul
AnnaBridge 172:7d866c31b3c5 438 #define TEST_PACKET 0x04ul
AnnaBridge 172:7d866c31b3c5 439 #define TEST_FORCE_ENABLE 0x05ul
AnnaBridge 172:7d866c31b3c5 440 /** @endcond HIDDEN_SYMBOLS */
AnnaBridge 172:7d866c31b3c5 441
AnnaBridge 172:7d866c31b3c5 442 void HSUSBD_UpdateDeviceState(void)
AnnaBridge 172:7d866c31b3c5 443 {
AnnaBridge 172:7d866c31b3c5 444 switch (gUsbCmd.bRequest) {
AnnaBridge 172:7d866c31b3c5 445 case SET_ADDRESS: {
AnnaBridge 172:7d866c31b3c5 446 HSUSBD_SET_ADDR(g_hsusbd_UsbAddr);
AnnaBridge 172:7d866c31b3c5 447 break;
AnnaBridge 172:7d866c31b3c5 448 }
AnnaBridge 172:7d866c31b3c5 449 case SET_CONFIGURATION: {
AnnaBridge 172:7d866c31b3c5 450 if (g_hsusbd_UsbConfig == 0ul) {
AnnaBridge 172:7d866c31b3c5 451 uint32_t volatile i;
AnnaBridge 172:7d866c31b3c5 452 /* Reset PID DATA0 */
AnnaBridge 172:7d866c31b3c5 453 for (i=0ul; i<HSUSBD_MAX_EP; i++) {
AnnaBridge 172:7d866c31b3c5 454 if ((HSUSBD->EP[i].EPCFG & 0x1ul) == 0x1ul) {
AnnaBridge 172:7d866c31b3c5 455 HSUSBD->EP[i].EPRSPCTL = HSUSBD_EP_RSPCTL_TOGGLE;
AnnaBridge 172:7d866c31b3c5 456 }
AnnaBridge 172:7d866c31b3c5 457 }
AnnaBridge 172:7d866c31b3c5 458 }
AnnaBridge 172:7d866c31b3c5 459 break;
AnnaBridge 172:7d866c31b3c5 460 }
AnnaBridge 172:7d866c31b3c5 461 case SET_FEATURE: {
AnnaBridge 172:7d866c31b3c5 462 if(gUsbCmd.wValue == FEATURE_ENDPOINT_HALT) {
AnnaBridge 172:7d866c31b3c5 463 uint32_t idx;
AnnaBridge 172:7d866c31b3c5 464 idx = (uint32_t)(gUsbCmd.wIndex & 0xFul);
AnnaBridge 172:7d866c31b3c5 465 HSUSBD_SetStall(idx);
AnnaBridge 172:7d866c31b3c5 466 } else if (g_hsusbd_EnableTestMode) {
AnnaBridge 172:7d866c31b3c5 467 g_hsusbd_EnableTestMode = (uint8_t)0ul;
AnnaBridge 172:7d866c31b3c5 468 if (g_hsusbd_TestSelector == TEST_J) {
AnnaBridge 172:7d866c31b3c5 469 HSUSBD->TEST = TEST_J;
AnnaBridge 172:7d866c31b3c5 470 } else if (g_hsusbd_TestSelector == TEST_K) {
AnnaBridge 172:7d866c31b3c5 471 HSUSBD->TEST = TEST_K;
AnnaBridge 172:7d866c31b3c5 472 } else if (g_hsusbd_TestSelector == TEST_SE0_NAK) {
AnnaBridge 172:7d866c31b3c5 473 HSUSBD->TEST = TEST_SE0_NAK;
AnnaBridge 172:7d866c31b3c5 474 } else if (g_hsusbd_TestSelector == TEST_PACKET) {
AnnaBridge 172:7d866c31b3c5 475 HSUSBD->TEST = TEST_PACKET;
AnnaBridge 172:7d866c31b3c5 476 } else if (g_hsusbd_TestSelector == TEST_FORCE_ENABLE) {
AnnaBridge 172:7d866c31b3c5 477 HSUSBD->TEST = TEST_FORCE_ENABLE;
AnnaBridge 172:7d866c31b3c5 478 }
AnnaBridge 172:7d866c31b3c5 479 }
AnnaBridge 172:7d866c31b3c5 480 break;
AnnaBridge 172:7d866c31b3c5 481 }
AnnaBridge 172:7d866c31b3c5 482 case CLEAR_FEATURE: {
AnnaBridge 172:7d866c31b3c5 483 if(gUsbCmd.wValue == FEATURE_ENDPOINT_HALT) {
AnnaBridge 172:7d866c31b3c5 484 uint32_t idx;
AnnaBridge 172:7d866c31b3c5 485 idx = (uint32_t)(gUsbCmd.wIndex & 0xFul);
AnnaBridge 172:7d866c31b3c5 486 HSUSBD_ClearStall(idx);
AnnaBridge 172:7d866c31b3c5 487 }
AnnaBridge 172:7d866c31b3c5 488 break;
AnnaBridge 172:7d866c31b3c5 489 }
AnnaBridge 172:7d866c31b3c5 490 default:
AnnaBridge 172:7d866c31b3c5 491 break;
AnnaBridge 172:7d866c31b3c5 492 }
AnnaBridge 172:7d866c31b3c5 493 }
AnnaBridge 172:7d866c31b3c5 494
AnnaBridge 172:7d866c31b3c5 495
AnnaBridge 172:7d866c31b3c5 496 /**
AnnaBridge 172:7d866c31b3c5 497 * @brief Prepare Control IN transaction
AnnaBridge 172:7d866c31b3c5 498 *
AnnaBridge 172:7d866c31b3c5 499 * @param[in] pu8Buf Control IN data pointer
AnnaBridge 172:7d866c31b3c5 500 * @param[in] u32Size IN transfer size
AnnaBridge 172:7d866c31b3c5 501 *
AnnaBridge 172:7d866c31b3c5 502 * @return None
AnnaBridge 172:7d866c31b3c5 503 *
AnnaBridge 172:7d866c31b3c5 504 * @details This function is used to prepare Control IN transfer
AnnaBridge 172:7d866c31b3c5 505 */
AnnaBridge 172:7d866c31b3c5 506 void HSUSBD_PrepareCtrlIn(uint8_t pu8Buf[], uint32_t u32Size)
AnnaBridge 172:7d866c31b3c5 507 {
AnnaBridge 172:7d866c31b3c5 508 g_hsusbd_CtrlInPointer = pu8Buf;
AnnaBridge 172:7d866c31b3c5 509 g_hsusbd_CtrlInSize = u32Size;
AnnaBridge 172:7d866c31b3c5 510 }
AnnaBridge 172:7d866c31b3c5 511
AnnaBridge 172:7d866c31b3c5 512
AnnaBridge 172:7d866c31b3c5 513
AnnaBridge 172:7d866c31b3c5 514 /**
AnnaBridge 172:7d866c31b3c5 515 * @brief Start Control IN transfer
AnnaBridge 172:7d866c31b3c5 516 *
AnnaBridge 172:7d866c31b3c5 517 * @param[in] None
AnnaBridge 172:7d866c31b3c5 518 *
AnnaBridge 172:7d866c31b3c5 519 * @return None
AnnaBridge 172:7d866c31b3c5 520 *
AnnaBridge 172:7d866c31b3c5 521 * @details This function is used to start Control IN
AnnaBridge 172:7d866c31b3c5 522 */
AnnaBridge 172:7d866c31b3c5 523 void HSUSBD_CtrlIn(void)
AnnaBridge 172:7d866c31b3c5 524 {
AnnaBridge 172:7d866c31b3c5 525 uint32_t volatile i, cnt;
AnnaBridge 172:7d866c31b3c5 526 uint8_t u8Value;
AnnaBridge 172:7d866c31b3c5 527 if(g_hsusbd_CtrlInSize >= g_hsusbd_CtrlMaxPktSize) {
AnnaBridge 172:7d866c31b3c5 528 /* Data size > MXPLD */
AnnaBridge 172:7d866c31b3c5 529 cnt = g_hsusbd_CtrlMaxPktSize >> 2;
AnnaBridge 172:7d866c31b3c5 530 for (i=0ul; i<cnt; i++) {
AnnaBridge 172:7d866c31b3c5 531 HSUSBD->CEPDAT = *(uint32_t *)g_hsusbd_CtrlInPointer;
AnnaBridge 172:7d866c31b3c5 532 g_hsusbd_CtrlInPointer = (uint8_t *)(g_hsusbd_CtrlInPointer + 4ul);
AnnaBridge 172:7d866c31b3c5 533 }
AnnaBridge 172:7d866c31b3c5 534 HSUSBD_START_CEP_IN(g_hsusbd_CtrlMaxPktSize);
AnnaBridge 172:7d866c31b3c5 535 g_hsusbd_CtrlInSize -= g_hsusbd_CtrlMaxPktSize;
AnnaBridge 172:7d866c31b3c5 536 } else {
AnnaBridge 172:7d866c31b3c5 537 /* Data size <= MXPLD */
AnnaBridge 172:7d866c31b3c5 538 cnt = g_hsusbd_CtrlInSize >> 2;
AnnaBridge 172:7d866c31b3c5 539 for (i=0ul; i<cnt; i++) {
AnnaBridge 172:7d866c31b3c5 540 HSUSBD->CEPDAT = *(uint32_t *)g_hsusbd_CtrlInPointer;
AnnaBridge 172:7d866c31b3c5 541 g_hsusbd_CtrlInPointer += 4ul;
AnnaBridge 172:7d866c31b3c5 542 }
AnnaBridge 172:7d866c31b3c5 543
AnnaBridge 172:7d866c31b3c5 544 for (i=0ul; i<(g_hsusbd_CtrlInSize % 4ul); i++) {
AnnaBridge 172:7d866c31b3c5 545 u8Value = *(uint8_t *)(g_hsusbd_CtrlInPointer+i);
AnnaBridge 172:7d866c31b3c5 546 outpb(&HSUSBD->CEPDAT, u8Value);
AnnaBridge 172:7d866c31b3c5 547 }
AnnaBridge 172:7d866c31b3c5 548
AnnaBridge 172:7d866c31b3c5 549 HSUSBD_START_CEP_IN(g_hsusbd_CtrlInSize);
AnnaBridge 172:7d866c31b3c5 550 g_hsusbd_CtrlInPointer = 0;
AnnaBridge 172:7d866c31b3c5 551 g_hsusbd_CtrlInSize = 0ul;
AnnaBridge 172:7d866c31b3c5 552 }
AnnaBridge 172:7d866c31b3c5 553 }
AnnaBridge 172:7d866c31b3c5 554
AnnaBridge 172:7d866c31b3c5 555 /**
AnnaBridge 172:7d866c31b3c5 556 * @brief Start Control OUT transaction
AnnaBridge 172:7d866c31b3c5 557 *
AnnaBridge 172:7d866c31b3c5 558 * @param[in] pu8Buf Control OUT data pointer
AnnaBridge 172:7d866c31b3c5 559 * @param[in] u32Size OUT transfer size
AnnaBridge 172:7d866c31b3c5 560 *
AnnaBridge 172:7d866c31b3c5 561 * @return None
AnnaBridge 172:7d866c31b3c5 562 *
AnnaBridge 172:7d866c31b3c5 563 * @details This function is used to start Control OUT transfer
AnnaBridge 172:7d866c31b3c5 564 */
AnnaBridge 172:7d866c31b3c5 565 void HSUSBD_CtrlOut(uint8_t pu8Buf[], uint32_t u32Size)
AnnaBridge 172:7d866c31b3c5 566 {
AnnaBridge 172:7d866c31b3c5 567 uint32_t volatile i;
AnnaBridge 172:7d866c31b3c5 568 while(1) {
AnnaBridge 172:7d866c31b3c5 569 if ((HSUSBD->CEPINTSTS & HSUSBD_CEPINTSTS_RXPKIF_Msk) == HSUSBD_CEPINTSTS_RXPKIF_Msk) {
AnnaBridge 172:7d866c31b3c5 570 for (i=0ul; i<u32Size; i++) {
AnnaBridge 172:7d866c31b3c5 571 pu8Buf[i] = inpb(&HSUSBD->CEPDAT);
AnnaBridge 172:7d866c31b3c5 572 }
AnnaBridge 172:7d866c31b3c5 573 HSUSBD->CEPINTSTS = HSUSBD_CEPINTSTS_RXPKIF_Msk;
AnnaBridge 172:7d866c31b3c5 574 break;
AnnaBridge 172:7d866c31b3c5 575 }
AnnaBridge 172:7d866c31b3c5 576 }
AnnaBridge 172:7d866c31b3c5 577 }
AnnaBridge 172:7d866c31b3c5 578
AnnaBridge 172:7d866c31b3c5 579 /**
AnnaBridge 172:7d866c31b3c5 580 * @brief Clear all software flags
AnnaBridge 172:7d866c31b3c5 581 *
AnnaBridge 172:7d866c31b3c5 582 * @param[in] None
AnnaBridge 172:7d866c31b3c5 583 *
AnnaBridge 172:7d866c31b3c5 584 * @return None
AnnaBridge 172:7d866c31b3c5 585 *
AnnaBridge 172:7d866c31b3c5 586 * @details This function is used to clear all software control flag
AnnaBridge 172:7d866c31b3c5 587 */
AnnaBridge 172:7d866c31b3c5 588 void HSUSBD_SwReset(void)
AnnaBridge 172:7d866c31b3c5 589 {
AnnaBridge 172:7d866c31b3c5 590 /* Reset all variables for protocol */
AnnaBridge 172:7d866c31b3c5 591 g_hsusbd_UsbAddr = (uint8_t)0ul;
AnnaBridge 172:7d866c31b3c5 592 g_hsusbd_DmaDone = 0ul;
AnnaBridge 172:7d866c31b3c5 593 g_hsusbd_ShortPacket = (uint8_t)0ul;
AnnaBridge 172:7d866c31b3c5 594 g_hsusbd_Configured = (uint8_t)0ul;
AnnaBridge 172:7d866c31b3c5 595
AnnaBridge 172:7d866c31b3c5 596 /* Reset USB device address */
AnnaBridge 172:7d866c31b3c5 597 HSUSBD_SET_ADDR(0ul);
AnnaBridge 172:7d866c31b3c5 598 }
AnnaBridge 172:7d866c31b3c5 599
AnnaBridge 172:7d866c31b3c5 600 /**
AnnaBridge 172:7d866c31b3c5 601 * @brief HSUSBD Set Vendor Request
AnnaBridge 172:7d866c31b3c5 602 *
AnnaBridge 172:7d866c31b3c5 603 * @param[in] pfnVendorReq Vendor Request Callback Function
AnnaBridge 172:7d866c31b3c5 604 *
AnnaBridge 172:7d866c31b3c5 605 * @return None
AnnaBridge 172:7d866c31b3c5 606 *
AnnaBridge 172:7d866c31b3c5 607 * @details This function is used to set HSUSBD vendor request callback function
AnnaBridge 172:7d866c31b3c5 608 */
AnnaBridge 172:7d866c31b3c5 609 void HSUSBD_SetVendorRequest(HSUSBD_VENDOR_REQ pfnVendorReq)
AnnaBridge 172:7d866c31b3c5 610 {
AnnaBridge 172:7d866c31b3c5 611 g_hsusbd_pfnVendorRequest = pfnVendorReq;
AnnaBridge 172:7d866c31b3c5 612 }
AnnaBridge 172:7d866c31b3c5 613
AnnaBridge 172:7d866c31b3c5 614
AnnaBridge 172:7d866c31b3c5 615 /*@}*/ /* end of group M480_HSUSBD_EXPORTED_FUNCTIONS */
AnnaBridge 172:7d866c31b3c5 616
AnnaBridge 172:7d866c31b3c5 617 /*@}*/ /* end of group M480_HSUSBD_Driver */
AnnaBridge 172:7d866c31b3c5 618
AnnaBridge 172:7d866c31b3c5 619 /*@}*/ /* end of group M480_Device_Driver */
AnnaBridge 172:7d866c31b3c5 620
AnnaBridge 172:7d866c31b3c5 621 /*** (C) COPYRIGHT 2016 Nuvoton Technology Corp. ***/