// --------------------------------------------------------------------------- BOOL CPU_USB_RxEnable(USB_CONTROLLER_STATE* State, int epNum) { // If this is not a legal Rx queue if (State == NULL || State->Queues[epNum] == NULL || State->IsTxQueue[epNum]) return FALSE; GLOBAL_LOCK(irq); // Enable endpoint USBD_EnableEP(USB_HANDLE(State->ControllerNum), USB_ENDPOINT_OUT(epNum)); return TRUE; }
static inline BOOL USBD_ReqSetInterface (void) { USB_COMMON_DESCRIPTOR *pD; U32 ifn = 0, alt = 0, old = 0, msk = 0; U32 n, m; BOOL set; switch (USBD_SetupPacket.bmRequestType.Recipient) { case REQUEST_TO_INTERFACE: if (USBD_Configuration == 0) return (__FALSE); set = __FALSE; if ((!usbd_hs_enable) && (USBD_HighSpeed == __TRUE)) { return (__FALSE); /* High speed request but high-speed not enabled */ } if (USBD_HighSpeed == __FALSE) { pD = (USB_COMMON_DESCRIPTOR *)USBD_ConfigDescriptor; } else { pD = (USB_COMMON_DESCRIPTOR *)USBD_ConfigDescriptor_HS; } while (pD->bLength) { switch (pD->bDescriptorType) { case USB_CONFIGURATION_DESCRIPTOR_TYPE: if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue != USBD_Configuration) { pD = (USB_COMMON_DESCRIPTOR *)((U8 *)pD+((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength); continue; } break; case USB_INTERFACE_DESCRIPTOR_TYPE: ifn = ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber; alt = ((USB_INTERFACE_DESCRIPTOR *)pD)->bAlternateSetting; msk = 0; if ((ifn == USBD_SetupPacket.wIndexL) && (alt == USBD_SetupPacket.wValueL)) { set = __TRUE; old = USBD_AltSetting[ifn]; USBD_AltSetting[ifn] = (U8)alt; } break; case USB_ENDPOINT_DESCRIPTOR_TYPE: if (ifn == USBD_SetupPacket.wIndexL) { n = ((USB_ENDPOINT_DESCRIPTOR *)pD)->bEndpointAddress & 0x8F; m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n); if (alt == USBD_SetupPacket.wValueL) { USBD_EndPointMask |= m; USBD_EndPointHalt &= ~m; USBD_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD); USBD_EnableEP(n); USBD_ResetEP(n); msk |= m; } else if ((alt == old) && ((msk & m) == 0)) { USBD_EndPointMask &= ~m; USBD_EndPointHalt &= ~m; USBD_DisableEP(n); } } break; } pD = (USB_COMMON_DESCRIPTOR *)((U8 *)pD + pD->bLength); } break; default: return (__FALSE); } return (set); }
static inline BOOL USBD_ReqSetConfiguration (void) { USB_CONFIGURATION_DESCRIPTOR *pD; U32 alt = 0; U32 n, m; switch (USBD_SetupPacket.bmRequestType.Recipient) { case REQUEST_TO_DEVICE: if (USBD_SetupPacket.wValueL) { if ((!usbd_hs_enable) && (USBD_HighSpeed == __TRUE)) { return (__FALSE); /* High speed request but high-speed not enabled */ } if (USBD_HighSpeed == __FALSE) { pD = (USB_CONFIGURATION_DESCRIPTOR *)USBD_ConfigDescriptor; } else { pD = (USB_CONFIGURATION_DESCRIPTOR *)USBD_ConfigDescriptor_HS; } while (pD->bLength) { switch (pD->bDescriptorType) { case USB_CONFIGURATION_DESCRIPTOR_TYPE: if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue == USBD_SetupPacket.wValueL) { USBD_Configuration = USBD_SetupPacket.wValueL; USBD_NumInterfaces = ((USB_CONFIGURATION_DESCRIPTOR *)pD)->bNumInterfaces; for (n = 0; n < usbd_if_num; n++) { USBD_AltSetting[n] = 0; } for (n = 1; n < 16; n++) { if (USBD_EndPointMask & (1 << n)) { USBD_DisableEP(n); } if (USBD_EndPointMask & ((1 << 16) << n)) { USBD_DisableEP(n | 0x80); } } USBD_EndPointMask = 0x00010001; USBD_EndPointHalt = 0x00000000; USBD_EndPointStall= 0x00000000; USBD_Configure(__TRUE); if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bmAttributes & USB_CONFIG_POWERED_MASK) { USBD_DeviceStatus |= USB_GETSTATUS_SELF_POWERED; } else { USBD_DeviceStatus &= ~USB_GETSTATUS_SELF_POWERED; } } else { pD = (USB_CONFIGURATION_DESCRIPTOR *)((U8 *)pD + ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength); continue; } break; case USB_INTERFACE_DESCRIPTOR_TYPE: alt = ((USB_INTERFACE_DESCRIPTOR *)pD)->bAlternateSetting; break; case USB_ENDPOINT_DESCRIPTOR_TYPE: if (alt == 0) { n = ((USB_ENDPOINT_DESCRIPTOR *)pD)->bEndpointAddress & 0x8F; m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n); USBD_EndPointMask |= m; USBD_ConfigEP((void *)pD); USBD_EnableEP(n); USBD_ResetEP(n); } break; } pD = (USB_CONFIGURATION_DESCRIPTOR *)((U8 *)pD + pD->bLength); } } else { USBD_Configuration = 0; for (n = 1; n < 16; n++) { if (USBD_EndPointMask & (1 << n)) { USBD_DisableEP(n); } if (USBD_EndPointMask & ((1 << 16) << n)) { USBD_DisableEP(n | 0x80); } } USBD_EndPointMask = 0x00010001; USBD_EndPointHalt = 0x00000000; USBD_EndPointStall = 0x00000000; USBD_Configure(__FALSE); } if (USBD_Configuration != USBD_SetupPacket.wValueL) { return (__FALSE); } break; default: return (__FALSE); } return (__TRUE); }