INLINE uint32_t USB_ReqSetClrFeature (uint32_t sc) { uint32_t n, m; switch (SetupPacket.bmRequestType.BM.Recipient) { case REQUEST_TO_DEVICE: if (SetupPacket.wValue.W == USB_FEATURE_REMOTE_WAKEUP) { if (sc) { USB_WakeUpCfg(TRUE); USB_DeviceStatus |= USB_GETSTATUS_REMOTE_WAKEUP; } else { USB_WakeUpCfg(FALSE); USB_DeviceStatus &= ~USB_GETSTATUS_REMOTE_WAKEUP; } } else if (SetupPacket.wValue.W == USB_FEATURE_TEST_MODE) { return USB_SetTestMode(SetupPacket.wIndex.WB.H); } else { return (FALSE); } break; case REQUEST_TO_INTERFACE: return (FALSE); case REQUEST_TO_ENDPOINT: n = SetupPacket.wIndex.WB.L & 0x8F; m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n); if ((USB_Configuration != 0) && ((n & 0x0F) != 0) && (USB_EndPointMask & m)) { if (SetupPacket.wValue.W == USB_FEATURE_ENDPOINT_STALL) { if (sc) { USB_SetStallEP(n); USB_EndPointHalt |= m; } else { if ((USB_EndPointStall & m) != 0) { return (TRUE); } USB_ClrStallEP(n); #if (USB_MSC) if ((n == MSC_EP_IN) && ((USB_EndPointHalt & m) != 0)) { /* Compliance Test: rewrite CSW after unstall */ if (CSW.dSignature == MSC_CSW_Signature) { USB_WriteEP(MSC_EP_IN, (uint8_t *)&CSW, sizeof(CSW)); } } #endif USB_EndPointHalt &= ~m; } } else { return (FALSE); } } else { return (FALSE); } break; default: return (FALSE); } return (TRUE); }
__inline uint32_t USB_ReqSetClrFeature (uint32_t sc) { uint32_t n, m; switch (SetupPacket.bmRequestType.BM.Recipient) { case REQUEST_TO_DEVICE: if (SetupPacket.wValue.W == USB_FEATURE_REMOTE_WAKEUP) { if (sc) { USB_WakeUpCfg(TRUE); USB_DeviceStatus |= USB_GETSTATUS_REMOTE_WAKEUP; } else { USB_WakeUpCfg(FALSE); USB_DeviceStatus &= ~USB_GETSTATUS_REMOTE_WAKEUP; } } else { return (FALSE); } break; case REQUEST_TO_INTERFACE: return (FALSE); case REQUEST_TO_ENDPOINT: n = SetupPacket.wIndex.WB.L & 0x8F; m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n); if ((USB_Configuration != 0) && ((n & 0x0F) != 0) && (USB_EndPointMask & m)) { if (SetupPacket.wValue.W == USB_FEATURE_ENDPOINT_STALL) { if (sc) { USB_SetStallEP(n); USB_EndPointHalt |= m; } else { if ((USB_EndPointStall & m) != 0) { return (TRUE); } USB_ClrStallEP(n); USB_EndPointHalt &= ~m; } } else { return (FALSE); } } else { return (FALSE); } break; default: return (FALSE); } return (TRUE); }