Beispiel #1
0
// ---------------------------------------------------------------------------
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;
}
Beispiel #2
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);
}
Beispiel #3
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);
}