void USBD_ClrStallEP (uint32_t EPNum) {
  if (EPNum & 0x80) {
    EPNum &= 0x7F;
    ENDPTCTRL(EPNum) &= ~(1UL << 16);   /* clear stall                        */
    ENDPTCTRL(EPNum) |=  (1UL << 22);   /* data toggle reset                  */
    while (ENDPTCTRL(EPNum) & (1UL << 16));
    USBD_ResetEP(EPNum | 0x80);
  }
  else {
    ENDPTCTRL(EPNum) &= ~(1UL << 0 );   /* clear stall                        */
    ENDPTCTRL(EPNum) |=  (1UL << 6 );   /* data toggle reset                  */
  }
}
예제 #2
0
// ---------------------------------------------------------------------------
static ErrorCode_t USB_Reset_Event_Handler(USBD_HANDLE_T hUsb)
{
    int core = USB_CORE(hUsb);
    USB_CONTROLLER_STATE *State = USB_STATE(core);

    // Clear all flags
    USB_ClearEvent(0, USB_EVENT_ALL);

    State->FirstGetDescriptor = TRUE;
    //State->Address = 0;
    //State->DeviceState = USB_DEVICE_STATE_DEFAULT;
    //USB_StateCallback(State);
    USB_FLAGS(core) = 0;

    // Reset endpoints
    USBD_ResetEP(hUsb, USB_ENDPOINT_IN(INT_IN_EP));
    USBD_ResetEP(hUsb, USB_ENDPOINT_IN(BULK_IN_EP));
    USBD_ResetEP(hUsb, USB_ENDPOINT_OUT(BULK_OUT_EP));
    ep_out_count[core] = 0;
    ep_in_count[core] = 0;

    return RET_OK;
}
예제 #3
0
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);
}
예제 #4
0
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);
}
예제 #5
0
/*
 *  Clear Stall for USB Device Endpoint
 *    Parameters:      EPNum: Device Endpoint Number
 *                       EPNum.0..3: Address
 *                       EPNum.7:    Dir
 *    Return Value:    None
 */
void USBD_ClrStallEP (U32 EPNum)
{
    USBD_ResetEP(EPNum);
    MXC_USB->ep[EPNum & EPNUM_MASK] &= ~MXC_F_USB_EP_STALL;
}