//----------------------------------------------------------------------------- /// Invoked when the configuration of the device changes. Resets the mass /// storage driver. /// \param cfgnum New configuration number. //----------------------------------------------------------------------------- void USBDDriverCallbacks_ConfigurationChanged(unsigned char cfgnum) { if (cfgnum > 0) { MSDDriver_Reset(); } }
//----------------------------------------------------------------------------- /// Initializes the MSD driver and the associated USB driver. /// \param luns Pointer to a list of LUNs /// \param numLuns Number of LUN in list /// \see MSDLun //----------------------------------------------------------------------------- void MSDDriver_Initialize(MSDLun *luns, unsigned char numLuns) { TRACE_INFO("MSD init\n\r"); // Command state initialization msdDriver.commandState.state = 0; msdDriver.commandState.postprocess = 0; msdDriver.commandState.length = 0; msdDriver.commandState.transfer.semaphore = 0; // LUNs msdDriver.luns = luns; msdDriver.maxLun = (unsigned char) (numLuns - 1); // Reset BOT driver MSDDriver_Reset(); // Init the USB driver USBDDriver_Initialize(&usbdDriver, &msdDriverDescriptors, 0); USBD_Init(); }
//----------------------------------------------------------------------------- /// Handler for incoming SETUP requests on default Control endpoint 0. /// /// Standard requests are forwarded to the USBDDriver_RequestHandler /// method. /// \param request Pointer to a USBGenericRequest instance //----------------------------------------------------------------------------- void MSDDriver_RequestHandler(const USBGenericRequest *request) { TRACE_INFO_WP("NewReq "); // Handle requests switch (USBGenericRequest_GetRequest(request)) { //--------------------- case USBGenericRequest_CLEARFEATURE: //--------------------- TRACE_INFO_WP("ClrFeat "); switch (USBFeatureRequest_GetFeatureSelector(request)) { //--------------------- case USBFeatureRequest_ENDPOINTHALT: //--------------------- TRACE_INFO_WP("Hlt "); // Do not clear the endpoint halt status if the device is waiting // for a reset recovery sequence if (!msdDriver.waitResetRecovery) { // Forward the request to the standard handler USBDDriver_RequestHandler(&usbdDriver, request); } else { TRACE_INFO_WP("No "); } USBD_Write(0, 0, 0, 0, 0); break; //------ default: //------ // Forward the request to the standard handler USBDDriver_RequestHandler(&usbdDriver, request); } break; //------------------- case MSD_GET_MAX_LUN: //------------------- TRACE_INFO_WP("gMaxLun "); // Check request parameters if ((request->wValue == 0) && (request->wIndex == 0) && (request->wLength == 1)) { USBD_Write(0, &(msdDriver.maxLun), 1, 0, 0); } else { TRACE_WARNING( "MSDDriver_RequestHandler: GetMaxLUN(%d,%d,%d)\n\r", request->wValue, request->wIndex, request->wLength); USBD_Stall(0); } break; //----------------------- case MSD_BULK_ONLY_RESET: //----------------------- TRACE_INFO_WP("Rst "); // Check parameters if ((request->wValue == 0) && (request->wIndex == 0) && (request->wLength == 0)) { // Reset the MSD driver MSDDriver_Reset(); USBD_Write(0, 0, 0, 0, 0); } else { TRACE_WARNING( "MSDDriver_RequestHandler: Reset(%d,%d,%d)\n\r", request->wValue, request->wIndex, request->wLength); USBD_Stall(0); } break; //------ default: //------ // Forward request to standard handler USBDDriver_RequestHandler(&usbdDriver, request); break; } }