void process_GET_STATUS(){ uint16_t myStatus = 0; Endpoint_ClearSETUP(); Endpoint_Write_16_LE(myStatus); /* send packet */ Endpoint_ClearIN(); /* and mark the whole request as successful: */ Endpoint_ClearStatusStage(); }
/** Handler for the XPROG CRC command to read a specific memory space's CRC value for comparison between the * attached device's memory and a data set on the host. */ static void XPROGProtocol_ReadCRC(void) { uint8_t ReturnStatus = XPROG_ERR_OK; struct { uint8_t CRCType; } ReadCRC_XPROG_Params; Endpoint_Read_Stream_LE(&ReadCRC_XPROG_Params, sizeof(ReadCRC_XPROG_Params), NULL); Endpoint_ClearOUT(); Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPADDR); Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); uint32_t MemoryCRC; if (XPROG_SelectedProtocol == XPROG_PROTOCOL_PDI) { uint8_t CRCCommand; /* Determine which NVM command to send to the device depending on the memory to CRC */ switch (ReadCRC_XPROG_Params.CRCType) { case XPROG_CRC_APP: CRCCommand = XMEGA_NVM_CMD_APPCRC; break; case XPROG_CRC_BOOT: CRCCommand = XMEGA_NVM_CMD_BOOTCRC; break; default: CRCCommand = XMEGA_NVM_CMD_FLASHCRC; break; } /* Perform and retrieve the memory CRC, indicate timeout if occurred */ if (!(XMEGANVM_GetMemoryCRC(CRCCommand, &MemoryCRC))) ReturnStatus = XPROG_ERR_TIMEOUT; } else { /* TPI does not support memory CRC */ ReturnStatus = XPROG_ERR_FAILED; } Endpoint_Write_8(CMD_XPROG); Endpoint_Write_8(XPROG_CMD_CRC); Endpoint_Write_8(ReturnStatus); if (ReturnStatus == XPROG_ERR_OK) { Endpoint_Write_8(MemoryCRC >> 16); Endpoint_Write_16_LE(MemoryCRC & 0xFFFF); }
static void USB_Device_GetStatus(void) { uint8_t CurrentStatus = 0; switch (USB_ControlRequest.bmRequestType) { #if !defined(NO_DEVICE_SELF_POWER) || !defined(NO_DEVICE_REMOTE_WAKEUP) case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE): #if !defined(NO_DEVICE_SELF_POWER) if (USB_Device_CurrentlySelfPowered) CurrentStatus |= FEATURE_SELFPOWERED_ENABLED; #endif #if !defined(NO_DEVICE_REMOTE_WAKEUP) if (USB_Device_RemoteWakeupEnabled) CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED; #endif break; #endif #if !defined(CONTROL_ONLY_DEVICE) case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT): Endpoint_SelectEndpoint((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); CurrentStatus = Endpoint_IsStalled(); Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); break; #endif default: return; } Endpoint_ClearSETUP(); Endpoint_Write_16_LE(CurrentStatus); Endpoint_ClearIN(); Endpoint_ClearStatusStage(); }
/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to * the device from the USB host before passing along unhandled control requests to the library for processing * internally. */ void EVENT_USB_Device_ControlRequest(void) { uint8_t TMCRequestStatus = TMC_STATUS_SUCCESS; /* Process TMC specific control requests */ switch (USB_ControlRequest.bRequest) { case Req_InitiateAbortBulkOut: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT)) { /* Check that no split transaction is already in progress and the data transfer tag is valid */ if (RequestInProgress != 0) { TMCRequestStatus = TMC_STATUS_SPLIT_IN_PROGRESS; } else if (USB_ControlRequest.wValue != CurrentTransferTag) { TMCRequestStatus = TMC_STATUS_TRANSFER_NOT_IN_PROGRESS; } else { /* Indicate that all in-progress/pending data OUT requests should be aborted */ IsTMCBulkOUTReset = true; /* Save the split request for later checking when a new request is received */ RequestInProgress = Req_InitiateAbortBulkOut; } Endpoint_ClearSETUP(); /* Write the request response byte */ Endpoint_Write_8(TMCRequestStatus); Endpoint_ClearIN(); Endpoint_ClearStatusStage(); } break; case Req_CheckAbortBulkOutStatus: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT)) { /* Check that an ABORT BULK OUT transaction has been requested and that the request has completed */ if (RequestInProgress != Req_InitiateAbortBulkOut) TMCRequestStatus = TMC_STATUS_SPLIT_NOT_IN_PROGRESS; else if (IsTMCBulkOUTReset) TMCRequestStatus = TMC_STATUS_PENDING; else RequestInProgress = 0; Endpoint_ClearSETUP(); /* Write the request response bytes */ Endpoint_Write_8(TMCRequestStatus); Endpoint_Write_16_LE(0); Endpoint_Write_32_LE(LastTransferLength); Endpoint_ClearIN(); Endpoint_ClearStatusStage(); } break; case Req_InitiateAbortBulkIn: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT)) { /* Check that no split transaction is already in progress and the data transfer tag is valid */ if (RequestInProgress != 0) { TMCRequestStatus = TMC_STATUS_SPLIT_IN_PROGRESS; } else if (USB_ControlRequest.wValue != CurrentTransferTag) { TMCRequestStatus = TMC_STATUS_TRANSFER_NOT_IN_PROGRESS; } else { /* Indicate that all in-progress/pending data IN requests should be aborted */ IsTMCBulkINReset = true; /* Save the split request for later checking when a new request is received */ RequestInProgress = Req_InitiateAbortBulkIn; } Endpoint_ClearSETUP(); /* Write the request response bytes */ Endpoint_Write_8(TMCRequestStatus); Endpoint_Write_8(CurrentTransferTag); Endpoint_ClearIN(); Endpoint_ClearStatusStage(); } break; case Req_CheckAbortBulkInStatus: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT)) { /* Check that an ABORT BULK IN transaction has been requested and that the request has completed */ if (RequestInProgress != Req_InitiateAbortBulkIn) TMCRequestStatus = TMC_STATUS_SPLIT_NOT_IN_PROGRESS; else if (IsTMCBulkINReset) TMCRequestStatus = TMC_STATUS_PENDING; else RequestInProgress = 0; Endpoint_ClearSETUP(); /* Write the request response bytes */ Endpoint_Write_8(TMCRequestStatus); Endpoint_Write_16_LE(0); Endpoint_Write_32_LE(LastTransferLength); Endpoint_ClearIN(); Endpoint_ClearStatusStage(); } break; case Req_InitiateClear: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { /* Check that no split transaction is already in progress */ if (RequestInProgress != 0) { Endpoint_Write_8(TMC_STATUS_SPLIT_IN_PROGRESS); } else { /* Indicate that all in-progress/pending data IN and OUT requests should be aborted */ IsTMCBulkINReset = true; IsTMCBulkOUTReset = true; /* Save the split request for later checking when a new request is received */ RequestInProgress = Req_InitiateClear; } Endpoint_ClearSETUP(); /* Write the request response byte */ Endpoint_Write_8(TMCRequestStatus); Endpoint_ClearIN(); Endpoint_ClearStatusStage(); } break; case Req_CheckClearStatus: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { /* Check that a CLEAR transaction has been requested and that the request has completed */ if (RequestInProgress != Req_InitiateClear) TMCRequestStatus = TMC_STATUS_SPLIT_NOT_IN_PROGRESS; else if (IsTMCBulkINReset || IsTMCBulkOUTReset) TMCRequestStatus = TMC_STATUS_PENDING; else RequestInProgress = 0; Endpoint_ClearSETUP(); /* Write the request response bytes */ Endpoint_Write_8(TMCRequestStatus); Endpoint_Write_8(0); Endpoint_ClearIN(); Endpoint_ClearStatusStage(); } break; case Req_GetCapabilities: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { Endpoint_ClearSETUP(); /* Write the device capabilities to the control endpoint */ Endpoint_Write_Control_Stream_LE(&Capabilities, sizeof(TMC_Capabilities_t)); Endpoint_ClearOUT(); } break; } }