// monitor usb connector plug/unplugs uint32_t USB_handleState(void) { static uint32_t vbusPrev = 0; static uint32_t count = 5000; uint32_t vbus; volatile uint32_t d; int i; #if 1 if (USB_Configuration) { vbus = LPC_USB->OTGSC&(1<<11); if (vbus) count = 5000; else if (count) count--; if (count==0) { USB_ResetEP(USB_BULK_OUT_EP); USB_ResetEP(USB_BULK_IN_EP); USB_Configuration = 0; } } #else vbus = LPC_USB->OTGSC&(1<<11); // if we unplug, reset endpoints, reflect that we're no longer configured if (!vbus && vbusPrev) { // make sure we're actually unplugged (need to investigate why this sometimes craps out) // Why does this routine modify USB_Configuration? Is this necessary? // What about the other bits in LPC_USB->OTGSC? for (i=0, vbus=0; i<300; i++) { vbus |= LPC_USB->OTGSC&(1<<11); for (d=0; d<10000; d++); } if (!vbus) { USB_ResetEP(USB_BULK_OUT_EP); USB_ResetEP(USB_BULK_IN_EP); USB_Configuration = 0; } } vbusPrev = vbus; #endif return USB_Configuration; }
__inline uint32_t USB_ReqSetInterface (void) { USB_COMMON_DESCRIPTOR *pD; uint32_t ifn = 0, alt = 0, old = 0, msk = 0; uint32_t n, m; uint32_t set; switch (SetupPacket.bmRequestType.BM.Recipient) { case REQUEST_TO_INTERFACE: if (USB_Configuration == 0) return (FALSE); set = FALSE; pD = (USB_COMMON_DESCRIPTOR *)USB_ConfigDescriptor; while (pD->bLength) { switch (pD->bDescriptorType) { case USB_CONFIGURATION_DESCRIPTOR_TYPE: if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue != USB_Configuration) { (uint8_t *)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 == SetupPacket.wIndex.WB.L) && (alt == SetupPacket.wValue.WB.L)) { set = TRUE; old = USB_AltSetting[ifn]; USB_AltSetting[ifn] = (uint8_t)alt; } break; case USB_ENDPOINT_DESCRIPTOR_TYPE: if (ifn == SetupPacket.wIndex.WB.L) { n = ((USB_ENDPOINT_DESCRIPTOR *)pD)->bEndpointAddress & 0x8F; m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n); if (alt == SetupPacket.wValue.WB.L) { USB_EndPointMask |= m; USB_EndPointHalt &= ~m; USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD); USB_EnableEP(n); USB_ResetEP(n); msk |= m; } else if ((alt == old) && ((msk & m) == 0)) { USB_EndPointMask &= ~m; USB_EndPointHalt &= ~m; USB_DisableEP(n); } } break; } (uint8_t *)pD += pD->bLength; } break; default: return (FALSE); } return (set); }
__inline uint32_t USB_ReqSetConfiguration (void) { USB_COMMON_DESCRIPTOR *pD; uint32_t alt = 0; uint32_t n, m; switch (SetupPacket.bmRequestType.BM.Recipient) { case REQUEST_TO_DEVICE: if (SetupPacket.wValue.WB.L) { pD = (USB_COMMON_DESCRIPTOR *)USB_ConfigDescriptor; while (pD->bLength) { switch (pD->bDescriptorType) { case USB_CONFIGURATION_DESCRIPTOR_TYPE: if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue == SetupPacket.wValue.WB.L) { USB_Configuration = SetupPacket.wValue.WB.L; USB_NumInterfaces = ((USB_CONFIGURATION_DESCRIPTOR *)pD)->bNumInterfaces; for (n = 0; n < USB_IF_NUM; n++) { USB_AltSetting[n] = 0; } for (n = 1; n < USB_LOGIC_EP_NUM; n++) { if (USB_EndPointMask & (1 << n)) { USB_DisableEP(n); } if (USB_EndPointMask & ((1 << 16) << n)) { USB_DisableEP(n | 0x80); } } USB_EndPointMask = 0x00010001; USB_EndPointHalt = 0x00000000; USB_EndPointStall= 0x00000000; USB_Configure(TRUE); if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bmAttributes & USB_CONFIG_POWERED_MASK) { USB_DeviceStatus |= USB_GETSTATUS_SELF_POWERED; } else { USB_DeviceStatus &= ~USB_GETSTATUS_SELF_POWERED; } } else { (uint8_t *)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); USB_EndPointMask |= m; USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD); USB_EnableEP(n); USB_ResetEP(n); } break; } (uint8_t *)pD += pD->bLength; } } else { USB_Configuration = 0; for (n = 1; n < USB_LOGIC_EP_NUM; n++) { if (USB_EndPointMask & (1 << n)) { USB_DisableEP(n); } if (USB_EndPointMask & ((1 << 16) << n)) { USB_DisableEP(n | 0x80); } } USB_EndPointMask = 0x00010001; USB_EndPointHalt = 0x00000000; USB_EndPointStall = 0x00000000; USB_Configure(FALSE); } if (USB_Configuration != SetupPacket.wValue.WB.L) { return (FALSE); } break; default: return (FALSE); } return (TRUE); }
inline uint32_t USB_ReqGetInterface (void) { #else __inline uint32_t USB_ReqGetInterface (void) { #endif switch (SetupPacket.bmRequestType.BM.Recipient) { case REQUEST_TO_INTERFACE: if ((USB_Configuration != 0) && (SetupPacket.wIndex.WB.L < USB_NumInterfaces)) { EP0Data.pData = USB_AltSetting + SetupPacket.wIndex.WB.L; } else { return (FALSE); } break; default: return (FALSE); } return (TRUE); } /* * Set Interface USB Request * Parameters: None (global SetupPacket) * Return Value: TRUE - Success, FALSE - Error */ #ifdef __IAR_SYSTEMS_ICC__ inline uint32_t USB_ReqSetInterface (void) { #else __inline uint32_t USB_ReqSetInterface (void) { #endif USB_COMMON_DESCRIPTOR *pD; uint32_t ifn = 0, alt = 0, old = 0, msk = 0; uint32_t n, m; uint32_t set, tmp; switch (SetupPacket.bmRequestType.BM.Recipient) { case REQUEST_TO_INTERFACE: if (USB_Configuration == 0) return (FALSE); set = FALSE; pD = (USB_COMMON_DESCRIPTOR *)USB_ConfigDescriptor; while (pD->bLength) { switch (pD->bDescriptorType) { case USB_CONFIGURATION_DESCRIPTOR_TYPE: if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue != USB_Configuration) { //(uint8_t *)pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength; tmp = (uint32_t)pD; tmp += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength; pD = (USB_COMMON_DESCRIPTOR *)tmp; continue; } break; case USB_INTERFACE_DESCRIPTOR_TYPE: ifn = ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber; alt = ((USB_INTERFACE_DESCRIPTOR *)pD)->bAlternateSetting; msk = 0; if ((ifn == SetupPacket.wIndex.WB.L) && (alt == SetupPacket.wValue.WB.L)) { set = TRUE; old = USB_AltSetting[ifn]; USB_AltSetting[ifn] = (uint8_t)alt; } break; case USB_ENDPOINT_DESCRIPTOR_TYPE: if (ifn == SetupPacket.wIndex.WB.L) { n = ((USB_ENDPOINT_DESCRIPTOR *)pD)->bEndpointAddress & 0x8F; m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n); if (alt == SetupPacket.wValue.WB.L) { USB_EndPointMask |= m; USB_EndPointHalt &= ~m; USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD); USB_EnableEP(n); USB_ResetEP(n); msk |= m; } else if ((alt == old) && ((msk & m) == 0)) { USB_EndPointMask &= ~m; USB_EndPointHalt &= ~m; USB_DisableEP(n); } } break; } //(uint8_t *)pD += pD->bLength; tmp = (uint32_t)pD; tmp += pD->bLength; pD = (USB_COMMON_DESCRIPTOR *) tmp; } break; default: return (FALSE); } return (set); }
inline uint32_t USB_ReqGetConfiguration (void) { #else __inline uint32_t USB_ReqGetConfiguration (void) { #endif switch (SetupPacket.bmRequestType.BM.Recipient) { case REQUEST_TO_DEVICE: EP0Data.pData = &USB_Configuration; break; default: return (FALSE); } return (TRUE); } /* * Set Configuration USB Request * Parameters: None (global SetupPacket) * Return Value: TRUE - Success, FALSE - Error */ #ifdef __IAR_SYSTEMS_ICC__ inline uint32_t USB_ReqSetConfiguration (void) { #else __inline uint32_t USB_ReqSetConfiguration (void) { #endif USB_COMMON_DESCRIPTOR *pD; uint32_t alt = 0; uint32_t n, m; uint32_t tmp; switch (SetupPacket.bmRequestType.BM.Recipient) { case REQUEST_TO_DEVICE: if (SetupPacket.wValue.WB.L) { pD = (USB_COMMON_DESCRIPTOR *)USB_ConfigDescriptor; while (pD->bLength) { switch (pD->bDescriptorType) { case USB_CONFIGURATION_DESCRIPTOR_TYPE: if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue == SetupPacket.wValue.WB.L) { USB_Configuration = SetupPacket.wValue.WB.L; USB_NumInterfaces = ((USB_CONFIGURATION_DESCRIPTOR *)pD)->bNumInterfaces; for (n = 0; n < USB_IF_NUM; n++) { USB_AltSetting[n] = 0; } for (n = 1; n < 16; n++) { if (USB_EndPointMask & (1 << n)) { USB_DisableEP(n); } if (USB_EndPointMask & ((1 << 16) << n)) { USB_DisableEP(n | 0x80); } } USB_EndPointMask = 0x00010001; USB_EndPointHalt = 0x00000000; USB_EndPointStall= 0x00000000; USB_Configure(TRUE); if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bmAttributes & USB_CONFIG_POWERED_MASK) { USB_DeviceStatus |= USB_GETSTATUS_SELF_POWERED; } else { USB_DeviceStatus &= ~USB_GETSTATUS_SELF_POWERED; } } else { //(uint8_t *)pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength; tmp = (uint32_t) pD; tmp += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength; pD = (USB_COMMON_DESCRIPTOR *)tmp; 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); USB_EndPointMask |= m; USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD); USB_EnableEP(n); USB_ResetEP(n); } break; } //(uint8_t *)pD += pD->bLength; tmp = (uint32_t) pD; tmp += pD->bLength; pD = (USB_COMMON_DESCRIPTOR *)tmp; } } else { USB_Configuration = 0; for (n = 1; n < 16; n++) { if (USB_EndPointMask & (1 << n)) { USB_DisableEP(n); } if (USB_EndPointMask & ((1 << 16) << n)) { USB_DisableEP(n | 0x80); } } USB_EndPointMask = 0x00010001; USB_EndPointHalt = 0x00000000; USB_EndPointStall = 0x00000000; USB_Configure(FALSE); } if (USB_Configuration != SetupPacket.wValue.WB.L) { return (FALSE); } break; default: return (FALSE); } return (TRUE); }
inline uint32_t USB_SetConfiguration (void) { #else __inline uint32_t USB_SetConfiguration (void) { #endif USB_COMMON_DESCRIPTOR *pD; uint32_t alt, n; uint32_t tmp; if (SetupPacket.wValue.WB.L) { pD = (USB_COMMON_DESCRIPTOR *)USB_ConfigDescriptor; while (pD->bLength) { switch (pD->bDescriptorType) { case USB_CONFIGURATION_DESCRIPTOR_TYPE: if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue == SetupPacket.wValue.WB.L) { USB_Configuration = SetupPacket.wValue.WB.L; USB_Configure(TRUE); /* if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bmAttributes & USB_CONFIG_SELF_POWERED) { USB_DeviceStatus |= USB_GETSTATUS_SELF_POWERED; } else { USB_DeviceStatus &= ~USB_GETSTATUS_SELF_POWERED; } */ } else { // (uint8_t *)pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength; tmp = (uint32_t)pD; tmp += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength; pD = (USB_COMMON_DESCRIPTOR *)tmp; 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; USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD); USB_EnableEP(n); USB_ResetEP(n); } break; } // (uint8_t *)pD += pD->bLength; tmp = (uint32_t)pD; tmp += pD->bLength; pD = (USB_COMMON_DESCRIPTOR *)tmp; } } else { USB_Configuration = 0; USB_Configure(FALSE); } if (USB_Configuration == SetupPacket.wValue.WB.L) { return (TRUE); } else { return (FALSE); } }
void USB_SendReset(void) { USB_ResetEP(USB_BULK_IN_EP); }
void USB_RecvReset(void) { USB_ResetEP(USB_BULK_OUT_EP); }