max4146x_comp

Dependencies:   MAX14690

Committer:
sdivarci
Date:
Sun Oct 25 20:10:02 2020 +0000
Revision:
0:0061165683ee
sdivarci

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sdivarci 0:0061165683ee 1 /**************************************************************************//**
sdivarci 0:0061165683ee 2 * @file em_usbdep.c
sdivarci 0:0061165683ee 3 * @brief USB protocol stack library, USB device endpoint handlers.
sdivarci 0:0061165683ee 4 * @version 3.20.14
sdivarci 0:0061165683ee 5 ******************************************************************************
sdivarci 0:0061165683ee 6 * @section License
sdivarci 0:0061165683ee 7 * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
sdivarci 0:0061165683ee 8 *******************************************************************************
sdivarci 0:0061165683ee 9 *
sdivarci 0:0061165683ee 10 * Licensed under the Apache License, Version 2.0 (the "License");
sdivarci 0:0061165683ee 11 * you may not use this file except in compliance with the License.
sdivarci 0:0061165683ee 12 * You may obtain a copy of the License at
sdivarci 0:0061165683ee 13 *
sdivarci 0:0061165683ee 14 * http://www.apache.org/licenses/LICENSE-2.0
sdivarci 0:0061165683ee 15 *
sdivarci 0:0061165683ee 16 * Unless required by applicable law or agreed to in writing, software
sdivarci 0:0061165683ee 17 * distributed under the License is distributed on an "AS IS" BASIS,
sdivarci 0:0061165683ee 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
sdivarci 0:0061165683ee 19 * See the License for the specific language governing permissions and
sdivarci 0:0061165683ee 20 * limitations under the License.
sdivarci 0:0061165683ee 21 *
sdivarci 0:0061165683ee 22 ******************************************************************************/
sdivarci 0:0061165683ee 23
sdivarci 0:0061165683ee 24 #include "em_device.h"
sdivarci 0:0061165683ee 25 #if defined( USB_PRESENT ) && ( USB_COUNT == 1 )
sdivarci 0:0061165683ee 26 #include "em_usb.h"
sdivarci 0:0061165683ee 27 #if defined( USB_DEVICE )
sdivarci 0:0061165683ee 28
sdivarci 0:0061165683ee 29 #include "em_usbtypes.h"
sdivarci 0:0061165683ee 30 #include "em_usbhal.h"
sdivarci 0:0061165683ee 31 #include "em_usbd.h"
sdivarci 0:0061165683ee 32
sdivarci 0:0061165683ee 33 #ifdef USB_USE_PRINTF
sdivarci 0:0061165683ee 34 static const char *epStatusStr[] = {
sdivarci 0:0061165683ee 35 "IDLE","TRANS","RECV","IN_S","OUT_S"
sdivarci 0:0061165683ee 36 };
sdivarci 0:0061165683ee 37 #endif
sdivarci 0:0061165683ee 38
sdivarci 0:0061165683ee 39 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
sdivarci 0:0061165683ee 40
sdivarci 0:0061165683ee 41 /*
sdivarci 0:0061165683ee 42 * USBDEP_Ep0Handler() is called each time a packet has been transmitted
sdivarci 0:0061165683ee 43 * or recieved on the default endpoint.
sdivarci 0:0061165683ee 44 * A state machine navigate us through the phases of a control transfer
sdivarci 0:0061165683ee 45 * according to "chapter 9" in the USB spec.
sdivarci 0:0061165683ee 46 */
sdivarci 0:0061165683ee 47 #if !defined( USB_DOEP0INT_STUPPKTRCVD )
sdivarci 0:0061165683ee 48 void USBDEP_Ep0Handler( USBD_Device_TypeDef *device )
sdivarci 0:0061165683ee 49 {
sdivarci 0:0061165683ee 50 int status;
sdivarci 0:0061165683ee 51 USBD_Ep_TypeDef *ep;
sdivarci 0:0061165683ee 52 static bool statusIn;
sdivarci 0:0061165683ee 53 static uint32_t xferred;
sdivarci 0:0061165683ee 54 static USB_XferCompleteCb_TypeDef callback;
sdivarci 0:0061165683ee 55
sdivarci 0:0061165683ee 56 ep = &device->ep[ 0 ];
sdivarci 0:0061165683ee 57
sdivarci 0:0061165683ee 58 #ifdef __MBED__
sdivarci 0:0061165683ee 59
sdivarci 0:0061165683ee 60 (void)xferred;
sdivarci 0:0061165683ee 61 (void)statusIn;
sdivarci 0:0061165683ee 62 (void)status;
sdivarci 0:0061165683ee 63
sdivarci 0:0061165683ee 64 USB_PRINTF("USBDEP: ep0 %s, rem %ld, z %d\n", epStatusStr[ep->state], ep->remaining, ep->zlp);
sdivarci 0:0061165683ee 65
sdivarci 0:0061165683ee 66 if ( ( ep->state == D_EP_TRANSMITTING ) || ( ep->state == D_EP_RECEIVING ) )
sdivarci 0:0061165683ee 67 {
sdivarci 0:0061165683ee 68 ep->state = D_EP_IDLE;
sdivarci 0:0061165683ee 69
sdivarci 0:0061165683ee 70 if ( ep->xferCompleteCb )
sdivarci 0:0061165683ee 71 {
sdivarci 0:0061165683ee 72 callback = ep->xferCompleteCb;
sdivarci 0:0061165683ee 73 ep->xferCompleteCb = NULL;
sdivarci 0:0061165683ee 74 callback( USB_STATUS_OK, ep->xferred, ep->remaining );
sdivarci 0:0061165683ee 75 }
sdivarci 0:0061165683ee 76
sdivarci 0:0061165683ee 77 USBDHAL_ReenableEp0Setup(device);
sdivarci 0:0061165683ee 78 }
sdivarci 0:0061165683ee 79 else
sdivarci 0:0061165683ee 80 {
sdivarci 0:0061165683ee 81 device->callbacks->setupCmd(device->setup);
sdivarci 0:0061165683ee 82 }
sdivarci 0:0061165683ee 83
sdivarci 0:0061165683ee 84 #else /* not __MBED__ */
sdivarci 0:0061165683ee 85
sdivarci 0:0061165683ee 86 switch ( ep->state )
sdivarci 0:0061165683ee 87 {
sdivarci 0:0061165683ee 88 case D_EP_IDLE:
sdivarci 0:0061165683ee 89 ep->remaining = 0;
sdivarci 0:0061165683ee 90 ep->zlp = 0;
sdivarci 0:0061165683ee 91 callback = NULL;
sdivarci 0:0061165683ee 92 statusIn = false;
sdivarci 0:0061165683ee 93
sdivarci 0:0061165683ee 94 status = USBDCH9_SetupCmd( device );
sdivarci 0:0061165683ee 95
sdivarci 0:0061165683ee 96 if ( status == USB_STATUS_REQ_ERR )
sdivarci 0:0061165683ee 97 {
sdivarci 0:0061165683ee 98 ep->in = true;
sdivarci 0:0061165683ee 99 USBDHAL_StallEp( ep ); /* Stall Ep0 IN */
sdivarci 0:0061165683ee 100 ep->in = false; /* OUT for next SETUP */
sdivarci 0:0061165683ee 101 USBDHAL_StallEp( ep ); /* Stall Ep0 OUT */
sdivarci 0:0061165683ee 102 USBDHAL_ReenableEp0Setup( device ); /* Prepare for next SETUP packet*/
sdivarci 0:0061165683ee 103 }
sdivarci 0:0061165683ee 104 else /* ( Status == USB_STATUS_OK ) */
sdivarci 0:0061165683ee 105 {
sdivarci 0:0061165683ee 106 if ( (ep->state == D_EP_RECEIVING) || (ep->state == D_EP_TRANSMITTING) )
sdivarci 0:0061165683ee 107 {
sdivarci 0:0061165683ee 108 callback = ep->xferCompleteCb;
sdivarci 0:0061165683ee 109 }
sdivarci 0:0061165683ee 110
sdivarci 0:0061165683ee 111 if ( ep->state != D_EP_RECEIVING )
sdivarci 0:0061165683ee 112 {
sdivarci 0:0061165683ee 113 if ( ep->remaining )
sdivarci 0:0061165683ee 114 {
sdivarci 0:0061165683ee 115 /* Data will be sent to host, check if a ZLP must be appended */
sdivarci 0:0061165683ee 116 if ( ( ep->remaining < device->setup->wLength ) &&
sdivarci 0:0061165683ee 117 ( ep->remaining % ep->packetSize == 0 ) )
sdivarci 0:0061165683ee 118 {
sdivarci 0:0061165683ee 119 ep->zlp = 1;
sdivarci 0:0061165683ee 120 }
sdivarci 0:0061165683ee 121 }
sdivarci 0:0061165683ee 122 else
sdivarci 0:0061165683ee 123 {
sdivarci 0:0061165683ee 124 /* Prepare for next SETUP packet*/
sdivarci 0:0061165683ee 125 USBDHAL_ReenableEp0Setup( device );
sdivarci 0:0061165683ee 126
sdivarci 0:0061165683ee 127 /* No data stage, a ZLP may have been sent. If not, send one */
sdivarci 0:0061165683ee 128
sdivarci 0:0061165683ee 129 xferred = 0;
sdivarci 0:0061165683ee 130 if ( ep->zlp == 0 )
sdivarci 0:0061165683ee 131 {
sdivarci 0:0061165683ee 132 USBD_Write( 0, NULL, 0, NULL ); /* ACK to host */
sdivarci 0:0061165683ee 133 ep->state = D_EP0_IN_STATUS;
sdivarci 0:0061165683ee 134 }
sdivarci 0:0061165683ee 135 else
sdivarci 0:0061165683ee 136 {
sdivarci 0:0061165683ee 137 ep->state = D_EP_IDLE;
sdivarci 0:0061165683ee 138 ep->in = false; /* OUT for next SETUP */
sdivarci 0:0061165683ee 139 }
sdivarci 0:0061165683ee 140 }
sdivarci 0:0061165683ee 141 }
sdivarci 0:0061165683ee 142 }
sdivarci 0:0061165683ee 143 break;
sdivarci 0:0061165683ee 144
sdivarci 0:0061165683ee 145 case D_EP_RECEIVING:
sdivarci 0:0061165683ee 146 if ( ep->remaining )
sdivarci 0:0061165683ee 147 {
sdivarci 0:0061165683ee 148 /* There is more data to receive */
sdivarci 0:0061165683ee 149 USBD_ReArmEp0( ep );
sdivarci 0:0061165683ee 150 }
sdivarci 0:0061165683ee 151 else
sdivarci 0:0061165683ee 152 {
sdivarci 0:0061165683ee 153 status = USB_STATUS_OK;
sdivarci 0:0061165683ee 154 if ( callback != NULL )
sdivarci 0:0061165683ee 155 {
sdivarci 0:0061165683ee 156 status = callback( USB_STATUS_OK, ep->xferred, 0 );
sdivarci 0:0061165683ee 157 callback = NULL;
sdivarci 0:0061165683ee 158 }
sdivarci 0:0061165683ee 159
sdivarci 0:0061165683ee 160 if ( status != USB_STATUS_OK )
sdivarci 0:0061165683ee 161 {
sdivarci 0:0061165683ee 162 ep->in = true;
sdivarci 0:0061165683ee 163 USBDHAL_StallEp( ep ); /* Stall Ep0 IN */
sdivarci 0:0061165683ee 164 ep->in = false; /* OUT for next SETUP */
sdivarci 0:0061165683ee 165 USBDHAL_StallEp( ep ); /* Stall Ep0 OUT */
sdivarci 0:0061165683ee 166 USBDHAL_ReenableEp0Setup( device ); /* Prepare for next SETUP pkt. */
sdivarci 0:0061165683ee 167 ep->state = D_EP_IDLE;
sdivarci 0:0061165683ee 168 }
sdivarci 0:0061165683ee 169 else /* Everything OK, send a ZLP (ACK) to host */
sdivarci 0:0061165683ee 170 {
sdivarci 0:0061165683ee 171 USBDHAL_ReenableEp0Setup( device );/* Prepare for next SETUP packet*/
sdivarci 0:0061165683ee 172
sdivarci 0:0061165683ee 173 ep->state = D_EP_IDLE; /* USBD_Write() sets state back*/
sdivarci 0:0061165683ee 174 /* to EP_TRANSMITTING */
sdivarci 0:0061165683ee 175 USBD_Write( 0, NULL, 0, NULL );
sdivarci 0:0061165683ee 176 ep->state = D_EP0_IN_STATUS;
sdivarci 0:0061165683ee 177 }
sdivarci 0:0061165683ee 178 }
sdivarci 0:0061165683ee 179 break;
sdivarci 0:0061165683ee 180
sdivarci 0:0061165683ee 181 case D_EP_TRANSMITTING:
sdivarci 0:0061165683ee 182 if ( ep->remaining )
sdivarci 0:0061165683ee 183 {
sdivarci 0:0061165683ee 184 /* There is more data to transmit */
sdivarci 0:0061165683ee 185 USBD_ReArmEp0( ep );
sdivarci 0:0061165683ee 186 }
sdivarci 0:0061165683ee 187 else
sdivarci 0:0061165683ee 188 {
sdivarci 0:0061165683ee 189 /* All data transferred, is a ZLP packet needed ? */
sdivarci 0:0061165683ee 190 if ( ep->zlp == 1 )
sdivarci 0:0061165683ee 191 {
sdivarci 0:0061165683ee 192 xferred = ep->xferred;
sdivarci 0:0061165683ee 193 ep->state = D_EP_IDLE; /* USBD_Write() sets state back */
sdivarci 0:0061165683ee 194 /* to EP_TRANSMITTING */
sdivarci 0:0061165683ee 195 USBD_Write( 0, NULL, 0, NULL ); /* Send ZLP */
sdivarci 0:0061165683ee 196 ep->zlp = 2;
sdivarci 0:0061165683ee 197 }
sdivarci 0:0061165683ee 198 else
sdivarci 0:0061165683ee 199 {
sdivarci 0:0061165683ee 200 if ( ep->zlp == 0 )
sdivarci 0:0061165683ee 201 {
sdivarci 0:0061165683ee 202 xferred = ep->xferred;
sdivarci 0:0061165683ee 203 }
sdivarci 0:0061165683ee 204
sdivarci 0:0061165683ee 205 ep->state = D_EP_IDLE;
sdivarci 0:0061165683ee 206 USBD_Read( 0, NULL, 0, NULL ); /* Get ZLP packet (ACK) from host */
sdivarci 0:0061165683ee 207 statusIn = true;
sdivarci 0:0061165683ee 208 ep->state = D_EP0_OUT_STATUS;
sdivarci 0:0061165683ee 209 }
sdivarci 0:0061165683ee 210 }
sdivarci 0:0061165683ee 211 break;
sdivarci 0:0061165683ee 212
sdivarci 0:0061165683ee 213 case D_EP0_IN_STATUS:
sdivarci 0:0061165683ee 214 case D_EP0_OUT_STATUS:
sdivarci 0:0061165683ee 215 if ( statusIn )
sdivarci 0:0061165683ee 216 {
sdivarci 0:0061165683ee 217 USBDHAL_ReenableEp0Setup( device );
sdivarci 0:0061165683ee 218 }
sdivarci 0:0061165683ee 219
sdivarci 0:0061165683ee 220 if ( callback != NULL )
sdivarci 0:0061165683ee 221 {
sdivarci 0:0061165683ee 222 callback( USB_STATUS_OK, xferred, 0 );
sdivarci 0:0061165683ee 223 }
sdivarci 0:0061165683ee 224
sdivarci 0:0061165683ee 225 ep->state = D_EP_IDLE;
sdivarci 0:0061165683ee 226 ep->in = false; /* OUT for next SETUP */
sdivarci 0:0061165683ee 227 break;
sdivarci 0:0061165683ee 228
sdivarci 0:0061165683ee 229 default:
sdivarci 0:0061165683ee 230 EFM_ASSERT( false );
sdivarci 0:0061165683ee 231 break;
sdivarci 0:0061165683ee 232 }
sdivarci 0:0061165683ee 233 #endif /* __MBED__ */
sdivarci 0:0061165683ee 234 }
sdivarci 0:0061165683ee 235 #endif
sdivarci 0:0061165683ee 236
sdivarci 0:0061165683ee 237 #if defined( USB_DOEP0INT_STUPPKTRCVD )
sdivarci 0:0061165683ee 238 void USBDEP_Ep0Handler( USBD_Device_TypeDef *device )
sdivarci 0:0061165683ee 239 {
sdivarci 0:0061165683ee 240 int status;
sdivarci 0:0061165683ee 241 USBD_Ep_TypeDef *ep;
sdivarci 0:0061165683ee 242 static uint32_t xferred;
sdivarci 0:0061165683ee 243 static USB_XferCompleteCb_TypeDef callback;
sdivarci 0:0061165683ee 244
sdivarci 0:0061165683ee 245 #ifdef __MBED__
sdivarci 0:0061165683ee 246
sdivarci 0:0061165683ee 247 (void)xferred;
sdivarci 0:0061165683ee 248 (void)status;
sdivarci 0:0061165683ee 249
sdivarci 0:0061165683ee 250 ep = &device->ep[ 0 ];
sdivarci 0:0061165683ee 251
sdivarci 0:0061165683ee 252 if ( ( ep->state == D_EP_TRANSMITTING ) || ( ep->state == D_EP_RECEIVING ) )
sdivarci 0:0061165683ee 253 {
sdivarci 0:0061165683ee 254 ep->state = D_EP_IDLE;
sdivarci 0:0061165683ee 255
sdivarci 0:0061165683ee 256 if ( ep->xferCompleteCb )
sdivarci 0:0061165683ee 257 {
sdivarci 0:0061165683ee 258 callback = ep->xferCompleteCb;
sdivarci 0:0061165683ee 259 ep->xferCompleteCb = NULL;
sdivarci 0:0061165683ee 260 callback( USB_STATUS_OK, ep->xferred, ep->remaining );
sdivarci 0:0061165683ee 261 }
sdivarci 0:0061165683ee 262
sdivarci 0:0061165683ee 263 USBDHAL_StartEp0Setup( dev );
sdivarci 0:0061165683ee 264 }
sdivarci 0:0061165683ee 265 else
sdivarci 0:0061165683ee 266 {
sdivarci 0:0061165683ee 267 device->callbacks->setupCmd(device->setup);
sdivarci 0:0061165683ee 268 }
sdivarci 0:0061165683ee 269
sdivarci 0:0061165683ee 270 #else
sdivarci 0:0061165683ee 271
sdivarci 0:0061165683ee 272 ep = &device->ep[ 0 ];
sdivarci 0:0061165683ee 273
sdivarci 0:0061165683ee 274 switch ( ep->state )
sdivarci 0:0061165683ee 275 {
sdivarci 0:0061165683ee 276 case D_EP_IDLE:
sdivarci 0:0061165683ee 277 ep->zlp = 0;
sdivarci 0:0061165683ee 278 ep->remaining = 0;
sdivarci 0:0061165683ee 279 callback = NULL;
sdivarci 0:0061165683ee 280
sdivarci 0:0061165683ee 281 status = USBDCH9_SetupCmd( device );
sdivarci 0:0061165683ee 282
sdivarci 0:0061165683ee 283 if ( status == USB_STATUS_REQ_ERR )
sdivarci 0:0061165683ee 284 {
sdivarci 0:0061165683ee 285 ep->in = true;
sdivarci 0:0061165683ee 286 USBDHAL_StallEp( ep ); /* Stall Ep0 IN */
sdivarci 0:0061165683ee 287 ep->in = false; /* OUT for next SETUP */
sdivarci 0:0061165683ee 288 USBDHAL_StallEp( ep ); /* Stall Ep0 OUT */
sdivarci 0:0061165683ee 289 USBDHAL_StartEp0Setup( dev ); /* Prepare for next SETUP packet*/
sdivarci 0:0061165683ee 290 }
sdivarci 0:0061165683ee 291 else /* ( Status == USB_STATUS_OK ) */
sdivarci 0:0061165683ee 292 {
sdivarci 0:0061165683ee 293 if ( (ep->state == D_EP_RECEIVING) || (ep->state == D_EP_TRANSMITTING) )
sdivarci 0:0061165683ee 294 {
sdivarci 0:0061165683ee 295 callback = ep->xferCompleteCb;
sdivarci 0:0061165683ee 296 }
sdivarci 0:0061165683ee 297
sdivarci 0:0061165683ee 298 if ( ep->state != D_EP_RECEIVING )
sdivarci 0:0061165683ee 299 {
sdivarci 0:0061165683ee 300 if ( ep->remaining )
sdivarci 0:0061165683ee 301 {
sdivarci 0:0061165683ee 302 /* Data will be sent to host, check if a ZLP must be appended */
sdivarci 0:0061165683ee 303 if ( ( ep->remaining < device->setup->wLength ) &&
sdivarci 0:0061165683ee 304 ( ep->remaining % ep->packetSize == 0 ) )
sdivarci 0:0061165683ee 305 {
sdivarci 0:0061165683ee 306 ep->zlp = 1;
sdivarci 0:0061165683ee 307 }
sdivarci 0:0061165683ee 308 }
sdivarci 0:0061165683ee 309 else
sdivarci 0:0061165683ee 310 {
sdivarci 0:0061165683ee 311 /* No data stage, a ZLP may have been sent. If not, send one */
sdivarci 0:0061165683ee 312 xferred = 0;
sdivarci 0:0061165683ee 313 if ( ep->zlp == 0 )
sdivarci 0:0061165683ee 314 {
sdivarci 0:0061165683ee 315 ep->state = D_EP_IDLE;
sdivarci 0:0061165683ee 316 USBD_Write( 0, NULL, 0, NULL ); /* ACK to host */
sdivarci 0:0061165683ee 317 ep->state = D_EP0_IN_STATUS;
sdivarci 0:0061165683ee 318 }
sdivarci 0:0061165683ee 319 }
sdivarci 0:0061165683ee 320 }
sdivarci 0:0061165683ee 321 }
sdivarci 0:0061165683ee 322 break;
sdivarci 0:0061165683ee 323
sdivarci 0:0061165683ee 324 case D_EP_RECEIVING:
sdivarci 0:0061165683ee 325 if ( ep->remaining )
sdivarci 0:0061165683ee 326 {
sdivarci 0:0061165683ee 327 ep->in = false;
sdivarci 0:0061165683ee 328 USBD_ReArmEp0( ep );
sdivarci 0:0061165683ee 329 }
sdivarci 0:0061165683ee 330 else
sdivarci 0:0061165683ee 331 {
sdivarci 0:0061165683ee 332 status = USB_STATUS_OK;
sdivarci 0:0061165683ee 333 if ( callback != NULL )
sdivarci 0:0061165683ee 334 {
sdivarci 0:0061165683ee 335 status = callback( USB_STATUS_OK, ep->xferred, 0 );
sdivarci 0:0061165683ee 336 callback = NULL;
sdivarci 0:0061165683ee 337 }
sdivarci 0:0061165683ee 338
sdivarci 0:0061165683ee 339 if ( status != USB_STATUS_OK )
sdivarci 0:0061165683ee 340 {
sdivarci 0:0061165683ee 341 ep->in = true;
sdivarci 0:0061165683ee 342 USBDHAL_StallEp( ep ); /* Stall Ep0 IN */
sdivarci 0:0061165683ee 343 ep->in = false; /* OUT for next SETUP */
sdivarci 0:0061165683ee 344 USBDHAL_StallEp( ep ); /* Stall Ep0 OUT */
sdivarci 0:0061165683ee 345 USBDHAL_StartEp0Setup( dev ); /* Prepare for next SETUP pkt. */
sdivarci 0:0061165683ee 346 ep->state = D_EP_IDLE;
sdivarci 0:0061165683ee 347 }
sdivarci 0:0061165683ee 348 else
sdivarci 0:0061165683ee 349 {
sdivarci 0:0061165683ee 350
sdivarci 0:0061165683ee 351 USBDHAL_StartEp0Setup( dev ); /* Prepare for next SETUP packet*/
sdivarci 0:0061165683ee 352 ep->state = D_EP_IDLE; /* USBD_Write() sets state back */
sdivarci 0:0061165683ee 353 /* to EP_TRANSMITTING */
sdivarci 0:0061165683ee 354 USBD_Write( 0, NULL, 0, NULL );
sdivarci 0:0061165683ee 355 ep->state = D_EP0_IN_STATUS;
sdivarci 0:0061165683ee 356 }
sdivarci 0:0061165683ee 357 }
sdivarci 0:0061165683ee 358 break;
sdivarci 0:0061165683ee 359
sdivarci 0:0061165683ee 360 case D_EP_TRANSMITTING:
sdivarci 0:0061165683ee 361 if ( ep->remaining )
sdivarci 0:0061165683ee 362 {
sdivarci 0:0061165683ee 363 ep->in = true;
sdivarci 0:0061165683ee 364 USBD_ReArmEp0( ep );
sdivarci 0:0061165683ee 365 }
sdivarci 0:0061165683ee 366 else
sdivarci 0:0061165683ee 367 {
sdivarci 0:0061165683ee 368 if ( ep->zlp == 1 )
sdivarci 0:0061165683ee 369 {
sdivarci 0:0061165683ee 370 xferred = ep->xferred;
sdivarci 0:0061165683ee 371 ep->state = D_EP_IDLE; /* USBD_Write() sets state back */
sdivarci 0:0061165683ee 372 /* to EP_TRANSMITTING */
sdivarci 0:0061165683ee 373 USBD_Write( 0, NULL, 0, NULL ); /* Send ZLP */
sdivarci 0:0061165683ee 374 ep->zlp = 2;
sdivarci 0:0061165683ee 375 }
sdivarci 0:0061165683ee 376 else
sdivarci 0:0061165683ee 377 {
sdivarci 0:0061165683ee 378 if ( ep->zlp == 0 )
sdivarci 0:0061165683ee 379 {
sdivarci 0:0061165683ee 380 xferred = ep->xferred;
sdivarci 0:0061165683ee 381 }
sdivarci 0:0061165683ee 382
sdivarci 0:0061165683ee 383 ep->state = D_EP_IDLE;
sdivarci 0:0061165683ee 384 USBD_Read( 0, NULL, 0, NULL ); /* Get ZLP packet (ACK) from host */
sdivarci 0:0061165683ee 385 ep->state = D_EP0_OUT_STATUS;
sdivarci 0:0061165683ee 386 }
sdivarci 0:0061165683ee 387 }
sdivarci 0:0061165683ee 388 break;
sdivarci 0:0061165683ee 389
sdivarci 0:0061165683ee 390 case D_EP0_IN_STATUS:
sdivarci 0:0061165683ee 391 if ( ( USB->DOEP0CTL & USB_DOEP0CTL_EPENA ) == 0 )
sdivarci 0:0061165683ee 392 {
sdivarci 0:0061165683ee 393 /* Prepare for more SETUP Packets */
sdivarci 0:0061165683ee 394 USBDHAL_StartEp0Setup( dev );
sdivarci 0:0061165683ee 395 }
sdivarci 0:0061165683ee 396 if ( callback != NULL )
sdivarci 0:0061165683ee 397 {
sdivarci 0:0061165683ee 398 callback( USB_STATUS_OK, xferred, 0 );
sdivarci 0:0061165683ee 399 }
sdivarci 0:0061165683ee 400 ep->state = D_EP_IDLE;
sdivarci 0:0061165683ee 401 ep->in = false; /* OUT for next SETUP */
sdivarci 0:0061165683ee 402 break;
sdivarci 0:0061165683ee 403
sdivarci 0:0061165683ee 404 case D_EP0_OUT_STATUS:
sdivarci 0:0061165683ee 405 USBDHAL_StartEp0Setup( dev ); /* Prepare for more SETUP Packets */
sdivarci 0:0061165683ee 406 if ( callback != NULL )
sdivarci 0:0061165683ee 407 {
sdivarci 0:0061165683ee 408 callback( USB_STATUS_OK, xferred, 0 );
sdivarci 0:0061165683ee 409 }
sdivarci 0:0061165683ee 410 ep->state = D_EP_IDLE;
sdivarci 0:0061165683ee 411 ep->in = false; /* OUT for next SETUP */
sdivarci 0:0061165683ee 412 break;
sdivarci 0:0061165683ee 413 }
sdivarci 0:0061165683ee 414 #endif /* __MBED__ */
sdivarci 0:0061165683ee 415 }
sdivarci 0:0061165683ee 416 #endif
sdivarci 0:0061165683ee 417
sdivarci 0:0061165683ee 418 /*
sdivarci 0:0061165683ee 419 * USBDEP_EpHandler() is called each time a packet has been transmitted
sdivarci 0:0061165683ee 420 * or recieved on an endpoint other than the default endpoint.
sdivarci 0:0061165683ee 421 */
sdivarci 0:0061165683ee 422 void USBDEP_EpHandler( uint8_t epAddr )
sdivarci 0:0061165683ee 423 {
sdivarci 0:0061165683ee 424 USB_XferCompleteCb_TypeDef callback;
sdivarci 0:0061165683ee 425 USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr );
sdivarci 0:0061165683ee 426
sdivarci 0:0061165683ee 427 if ( ( ep->state == D_EP_TRANSMITTING ) || ( ep->state == D_EP_RECEIVING ) )
sdivarci 0:0061165683ee 428 {
sdivarci 0:0061165683ee 429 ep->state = D_EP_IDLE;
sdivarci 0:0061165683ee 430 if ( ep->xferCompleteCb )
sdivarci 0:0061165683ee 431 {
sdivarci 0:0061165683ee 432 callback = ep->xferCompleteCb;
sdivarci 0:0061165683ee 433 ep->xferCompleteCb = NULL;
sdivarci 0:0061165683ee 434 callback( USB_STATUS_OK, ep->xferred, ep->remaining );
sdivarci 0:0061165683ee 435 }
sdivarci 0:0061165683ee 436 }
sdivarci 0:0061165683ee 437 else
sdivarci 0:0061165683ee 438 {
sdivarci 0:0061165683ee 439 EFM_ASSERT( false );
sdivarci 0:0061165683ee 440 }
sdivarci 0:0061165683ee 441 }
sdivarci 0:0061165683ee 442
sdivarci 0:0061165683ee 443 /** @endcond */
sdivarci 0:0061165683ee 444
sdivarci 0:0061165683ee 445 #endif /* defined( USB_DEVICE ) */
sdivarci 0:0061165683ee 446 #endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */