Esempio n. 1
0
/*******************************************************************************
* Function Name  : NoData_Setup0.
* Description    : Proceed the processing of setup request without data stage.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void NoData_Setup0(void) {
    RESULT Result = USB_UNSUPPORT;
    uint32_t RequestNo = pInformation->USBbRequest;
    uint32_t ControlState;

    if(Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) {
        /* Device Request*/
        /* SET_CONFIGURATION*/
        if(RequestNo == SET_CONFIGURATION) {
            Result = Standard_SetConfiguration();
        }

        /*SET ADDRESS*/
        else if(RequestNo == SET_ADDRESS) {
            if((pInformation->USBwValue0 > 127) || (pInformation->USBwValue1 != 0) || (pInformation->USBwIndex != 0) ||
               (pInformation->Current_Configuration != 0))
            /* Device Address should be 127 or less*/
            {
                ControlState = STALLED;
                goto exit_NoData_Setup0;
            } else {
                Result = USB_SUCCESS;

#ifdef STM32F10X_CL
                SetDeviceAddress(pInformation->USBwValue0);
#endif /* STM32F10X_CL */
            }
        }
        /*SET FEATURE for Device*/
        else if(RequestNo == SET_FEATURE) {
            if((pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP) && (pInformation->USBwIndex == 0)) {
                Result = Standard_SetDeviceFeature();
            } else {
                Result = USB_UNSUPPORT;
            }
        }
        /*Clear FEATURE for Device */
        else if(RequestNo == CLEAR_FEATURE) {
            if(pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP && pInformation->USBwIndex == 0 &&
               ValBit(pInformation->Current_Feature, 5)) {
                Result = Standard_ClearFeature();
            } else {
                Result = USB_UNSUPPORT;
            }
        }

    }

    /* Interface Request*/
    else if(Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) {
        /*SET INTERFACE*/
        if(RequestNo == SET_INTERFACE) {
            Result = Standard_SetInterface();
        }
    }

    /* EndPoint Request*/
    else if(Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) {
        /*CLEAR FEATURE for EndPoint*/
        if(RequestNo == CLEAR_FEATURE) {
            Result = Standard_ClearFeature();
        }
        /* SET FEATURE for EndPoint*/
        else if(RequestNo == SET_FEATURE) {
            Result = Standard_SetEndPointFeature();
        }
    } else {
        Result = USB_UNSUPPORT;
    }


    if(Result != USB_SUCCESS) {
        Result = (*pProperty->Class_NoData_Setup)(RequestNo);
        if(Result == USB_NOT_READY) {
            ControlState = PAUSE;
            goto exit_NoData_Setup0;
        }
    }

    if(Result != USB_SUCCESS) {
        ControlState = STALLED;
        goto exit_NoData_Setup0;
    }

    ControlState = WAIT_STATUS_IN; /* After no data stage SETUP */

    USB_StatusIn();

exit_NoData_Setup0:
    pInformation->ControlState = ControlState;
    return;
}
Esempio n. 2
0
/*******************************************************************************
* Function Name  : NoData_Setup0.
* Description    : Proceed the processing of setup request without data stage.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void NoData_Setup0(void) {
	RESULT Result = USB_UNSUPPORT;
	uint32_t RequestNo = pInformation->USBbRequest;
	uint32_t ControlState;

	if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) {
		// Device Request
		// SET_CONFIGURATION
		if (RequestNo == SET_CONFIGURATION) Result = Standard_SetConfiguration();
		// SET ADDRESS
		else if (RequestNo == SET_ADDRESS) {
			if ((pInformation->USBwValue0 > 127) || (pInformation->USBwValue1 != 0)
					|| (pInformation->USBwIndex != 0)
					|| (pInformation->Current_Configuration != 0)) {
				// Device Address should be 127 or less
				ControlState = STALLED;
				pInformation->ControlState = ControlState;

				return;
			} else Result = USB_SUCCESS;
		} else if (RequestNo == SET_FEATURE) {
			// SET FEATURE for Device
			if ((pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP)
					&& (pInformation->USBwIndex == 0)) {
				Result = Standard_SetDeviceFeature();
			} else {
				Result = USB_UNSUPPORT;
			}
		} else if (RequestNo == CLEAR_FEATURE) {
			// Clear FEATURE for Device
			if (pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP
					&& pInformation->USBwIndex == 0
					&& ValBit(pInformation->Current_Feature, 5)) {
				Result = Standard_ClearFeature();
			} else {
				Result = USB_UNSUPPORT;
			}
		}
	} else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) {
		// Interface Request
		// SET INTERFACE
		if (RequestNo == SET_INTERFACE) Result = Standard_SetInterface();
	} else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) {
		// EndPoint Request
		// CLEAR FEATURE for EndPoint
		if (RequestNo == CLEAR_FEATURE) {
			Result = Standard_ClearFeature();
		} else if (RequestNo == SET_FEATURE) {
		    // SET FEATURE for EndPoint
			Result = Standard_SetEndPointFeature();
		}
	} else Result = USB_UNSUPPORT;

	if (Result != USB_SUCCESS) {
		Result = (*pProperty->Class_NoData_Setup)(RequestNo);
		if (Result == USB_NOT_READY) {
			ControlState = PAUSE;
			pInformation->ControlState = ControlState;

			return;
		}
	}

	if (Result != USB_SUCCESS) {
		ControlState = STALLED;
		pInformation->ControlState = ControlState;

		return;
	}

	ControlState = WAIT_STATUS_IN; // After no data stage SETUP
	SetEPTxCount(ENDP0,0);
	SaveTState = EP_TX_VALID;
	pInformation->ControlState = ControlState;

	return;
}