//------------------------------------------------------------------------------ // \brief Transfers a received SETUP packet from endpoint 0 FIFO to the // S_usb_request structure of an USB driver // \param pUsb Pointer to a S_usb instance // \see S_usb //------------------------------------------------------------------------------ static void UDP_GetSetup(S_usb const *pUsb) { char *pData = (char *) USB_GetSetup(pUsb); AT91PS_UDP pInterface = UDP_GetDriverInterface(pUsb); unsigned int dCtr; // Copy packet for (dCtr = 0; dCtr < 8; dCtr++) { *pData = (char) pInterface->UDP_FDR[0]; pData++; } }
//------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //! \ingroup usb_std_req_hlr //! \brief Handles standard SETUP requests //! \param pClass Pointer to a class driver instance //------------------------------------------------------------------------------ void STD_RequestHandler(S_std_class *pClass) { S_usb_request *pSetup = USB_GetSetup(pClass->pUsb); TRACE_DEBUG_M("Std "); // Handle incoming request switch (pSetup->bRequest) { //---------------------- case USB_GET_DESCRIPTOR: //---------------------- TRACE_DEBUG_M("gDesc "); // The HBYTE macro returns the upper byte of a word switch (HBYTE(pSetup->wValue)) { //------------------------- case USB_DEVICE_DESCRIPTOR: //------------------------- TRACE_DEBUG_M("Dev "); STD_GetDeviceDescriptor(pClass, pSetup->wLength); break; //-------------------------------- case USB_CONFIGURATION_DESCRIPTOR: //-------------------------------- TRACE_DEBUG_M("Cfg "); STD_GetConfigurationDescriptor(pClass, pSetup->wLength); break; #if defined(HIGHSPEED) //----------------------------------- case USB_DEVICE_QUALIFIER_DESCRIPTOR: //----------------------------------- TRACE_DEBUG_M("Qua "); STD_GetQualifierDescriptor(pClass, pSetup->wLength); break; //-------------------------------------------- case USB_OTHER_SPEED_CONFIGURATION_DESCRIPTOR: //-------------------------------------------- TRACE_DEBUG_M("OSC "); STD_GetOSCDescriptor(pClass, pSetup->wLength); break; #endif //------------------------- case USB_STRING_DESCRIPTOR: //------------------------- TRACE_DEBUG_M("Str%d ", LBYTE(pSetup->wValue)); STD_GetStringDescriptor(pClass, pSetup->wLength, LBYTE(pSetup->wValue)); break; //------ default: //------ TRACE_WARNING( "W: STD_RequestHandler: Unknown GetDescriptor = 0x%02X\n\r", pSetup->bRequest ); USB_Stall(pClass->pUsb, 0); } break; //------------------- case USB_SET_ADDRESS: //------------------- TRACE_DEBUG_M("sAddr "); USB_SendZLP0(pClass->pUsb, (Callback_f) USB_SetAddress, (void *) pClass->pUsb); break; //------------------------- case USB_SET_CONFIGURATION: //------------------------- TRACE_DEBUG_M("sCfg "); STD_SetConfiguration(pClass, (char) pSetup->wValue); break; //------------------------- case USB_GET_CONFIGURATION: //------------------------- TRACE_DEBUG_M("gCfg "); STD_GetConfiguration(pClass); break; //--------------------- case USB_CLEAR_FEATURE: //--------------------- TRACE_DEBUG_M("cFeat "); switch (pSetup->wValue) { //--------------------- case USB_ENDPOINT_HALT: //--------------------- TRACE_DEBUG_M("Hlt "); USB_Halt(pClass->pUsb, LBYTE(pSetup->wIndex), USB_CLEAR_FEATURE); USB_SendZLP0(pClass->pUsb, 0, 0); break; //---------------------------- case USB_DEVICE_REMOTE_WAKEUP: //---------------------------- TRACE_DEBUG_M("RmWak "); pClass->wDeviceStatus &= ~REMOTE_WAKEUP; // Remote wakeup disabled USB_SendZLP0(pClass->pUsb, 0, 0); break; //------ default: //------ TRACE_DEBUG_H("Sta "); USB_Stall(pClass->pUsb, 0); } break; //------------------ case USB_GET_STATUS: //------------------ TRACE_DEBUG_H("gSta "); switch (USB_REQUEST_RECIPIENT(pSetup)) { //------------------------- case USB_RECIPIENT_DEVICE: //------------------------- TRACE_DEBUG_M("Dev "); STD_GetDeviceStatus(pClass); break; //--------------------------- case USB_RECIPIENT_ENDPOINT: //--------------------------- TRACE_DEBUG_M("Ept "); STD_GetEndpointStatus(pClass, LBYTE(pSetup->wIndex)); break; //------ default: //------ TRACE_WARNING( "W: STD_RequestHandler: Unsupported GetStatus = 0x%02X\n\r", pSetup->bmRequestType ); USB_Stall(pClass->pUsb, 0); } break; //------------------- case USB_SET_FEATURE: //------------------- TRACE_DEBUG_H("sFeat "); switch (pSetup->wValue) { //--------------------- case USB_ENDPOINT_HALT: //--------------------- USB_Halt(pClass->pUsb, LBYTE(pSetup->wIndex), USB_SET_FEATURE); USB_SendZLP0(pClass->pUsb, 0, 0); break; //---------------------------- case USB_DEVICE_REMOTE_WAKEUP: //---------------------------- pClass->wDeviceStatus |= REMOTE_WAKEUP; // Remote wakeup enabled USB_SendZLP0(pClass->pUsb, 0, 0); break; //------ default: //------ TRACE_WARNING( "W: STD_RequestHandler: Unsupported SetFeature=0x%04X\n\r", pSetup->wValue ); USB_Stall(pClass->pUsb, 0); } break; //------ default: //------ TRACE_WARNING( "W: STD_RequestHandler: Unsupported request: 0x%02X\n\r", pSetup->bRequest ); USB_Stall(pClass->pUsb, 0); } }