Пример #1
0
__weak BOOL USBD_EndPoint0_Setup_CDC_ReqToIF (void) {
  if ((USBD_SetupPacket.wIndexL == usbd_cdc_acm_cif_num)  || /* IF number correct? */
      (USBD_SetupPacket.wIndexL == usbd_cdc_acm_dif_num)) {
    switch (USBD_SetupPacket.bRequest) {
      case CDC_SEND_ENCAPSULATED_COMMAND:
        USBD_EP0Data.pData = USBD_EP0Buf;                    /* data to be received, see USBD_EVT_OUT */
        return (__TRUE);
      case CDC_GET_ENCAPSULATED_RESPONSE:
        if (USBD_CDC_ACM_GetEncapsulatedResponse()) {
          USBD_EP0Data.pData = USBD_EP0Buf;                  /* point to data to be sent */
          USBD_DataInStage();                                /* send requested data */
          return (__TRUE);
        }
        break;
      case CDC_SET_COMM_FEATURE:
        USBD_EP0Data.pData = USBD_EP0Buf;                    /* data to be received, see USBD_EVT_OUT */
        return (__TRUE);
      case CDC_GET_COMM_FEATURE:
        if (USBD_CDC_ACM_GetCommFeature(USBD_SetupPacket.wValue)) {
          USBD_EP0Data.pData = USBD_EP0Buf;                  /* point to data to be sent */
          USBD_DataInStage();                                /* send requested data */
          return (__TRUE);
        }
        break;
      case CDC_CLEAR_COMM_FEATURE:
        if (USBD_CDC_ACM_ClearCommFeature(USBD_SetupPacket.wValue)) {
          USBD_StatusInStage();                              /* send Acknowledge */
          return (__TRUE);
        }
        break;
      case CDC_SET_LINE_CODING:
        USBD_EP0Data.pData = USBD_EP0Buf;                    /* data to be received, see USBD_EVT_OUT */
        return (__TRUE);
      case CDC_GET_LINE_CODING:
        if (USBD_CDC_ACM_GetLineCoding()) {
          USBD_EP0Data.pData = USBD_EP0Buf;                  /* point to data to be sent */
          USBD_DataInStage();                                /* send requested data */
          return (__TRUE);
        }
        break;
      case CDC_SET_CONTROL_LINE_STATE:
        if (USBD_CDC_ACM_SetControlLineState(USBD_SetupPacket.wValue)) {
          USBD_StatusInStage();                              /* send Acknowledge */
          return (__TRUE);
        }
        break;
      case CDC_SEND_BREAK:
        if (USBD_CDC_ACM_SendBreak(USBD_SetupPacket.wValue)) {
          USBD_StatusInStage();                              /* send Acknowledge */
          return (__TRUE);
        }
        break;
    }
  }
  return (__FALSE);
}
Пример #2
0
__weak BOOL USBD_EndPoint0_Setup_HID_ReqToIF (void) {
  if (USBD_SetupPacket.wIndexL == usbd_hid_if_num) {         /* IF number correct? */
    switch (USBD_SetupPacket.bRequest) {
      case HID_REQUEST_GET_REPORT:
        if (USBD_HID_GetReport()) {
          if (USBD_SetupPacket.wValueH == HID_REPORT_INPUT) {
            USBD_EP0Data.pData = &USBD_HID_InReport[1];      /* point to data to be sent (skip ReportID) */
          }
          else if (USBD_SetupPacket.wValueH == HID_REPORT_FEATURE) {
            USBD_EP0Data.pData = &USBD_HID_FeatReport[1];    /* point to data to be sent (skip ReportID) */
          }
          USBD_DataInStage();                                /* send requested data */
          return (__TRUE);
        }
        break;
      case HID_REQUEST_SET_REPORT:
        if (USBD_SetupPacket.wValueH == HID_REPORT_OUTPUT) {
          USBD_EP0Data.pData = &USBD_HID_OutReport[1];       /* out data to be received (skip ReportID) */
        }
        else if (USBD_SetupPacket.wValueH == HID_REPORT_FEATURE) {
          USBD_EP0Data.pData = &USBD_HID_FeatReport[1];      /* out data to be received (skip ReportID) */
        }
        return (__TRUE);
      case HID_REQUEST_GET_IDLE:
        if (USBD_HID_GetIdle()) {
          USBD_EP0Data.pData = USBD_EP0Buf;                  /* point to data to be sent */
          USBD_DataInStage();                                /* send requested data */
          return (__TRUE);
        }
        break;
      case HID_REQUEST_SET_IDLE:
        if (USBD_HID_SetIdle()) {
          USBD_StatusInStage();                              /* send Acknowledge */
          return (__TRUE);
        }
        break;
      case HID_REQUEST_GET_PROTOCOL:
        if (USBD_HID_GetProtocol()) {
          USBD_EP0Data.pData = USBD_EP0Buf;                  /* point to data to be sent */
          USBD_DataInStage();                                /* send requested data */
          return (__TRUE);
        }
        break;
      case HID_REQUEST_SET_PROTOCOL:
        if (USBD_HID_SetProtocol()) {
          USBD_StatusInStage();                              /* send Acknowledge */
          return (__TRUE);
        }
        break;
    }
  }
  return (__FALSE);
}
Пример #3
0
void USBD_EndPoint0 (U32 event) {

  if (event & USBD_EVT_SETUP) {
    USBD_SetupStage();
    USBD_DirCtrlEP(USBD_SetupPacket.bmRequestType.Dir);
    USBD_EP0Data.Count = USBD_SetupPacket.wLength;       /* Number of bytes to transfer */

    switch (USBD_SetupPacket.bmRequestType.Type) {

      case REQUEST_STANDARD:
        switch (USBD_SetupPacket.bRequest) {

          case USB_REQUEST_GET_STATUS:
            if (!USBD_ReqGetStatus()) {
              goto stall;
            }
            USBD_DataInStage();
            break;

          case USB_REQUEST_CLEAR_FEATURE:
            if (!USBD_ReqSetClrFeature(0)) {
              goto stall;
            }
            USBD_StatusInStage();
#ifdef __RTX
            if (__rtx) {
              if (USBD_RTX_CoreTask) {
                usbd_os_evt_set(USBD_EVT_CLR_FEATURE, USBD_RTX_CoreTask);
              }
            } else {
#endif
              if (USBD_P_Feature_Event) {
                USBD_P_Feature_Event();
              }
#ifdef __RTX
            }
#endif
            break;

          case USB_REQUEST_SET_FEATURE:
            if (!USBD_ReqSetClrFeature(1)) {
              goto stall;
            }
            USBD_StatusInStage();
#ifdef __RTX
            if (__rtx) {
              if (USBD_RTX_CoreTask) {
                usbd_os_evt_set(USBD_EVT_SET_FEATURE, USBD_RTX_CoreTask);
              }
            } else {
#endif
              if (USBD_P_Feature_Event) {
                USBD_P_Feature_Event();
              }
#ifdef __RTX
            }
#endif
            break;

          case USB_REQUEST_SET_ADDRESS:
            if (!USBD_ReqSetAddress()) {
              goto stall;
            }
            USBD_SetAddress(USBD_DeviceAddress & 0x7F, 1);
            USBD_StatusInStage();
            break;

          case USB_REQUEST_GET_DESCRIPTOR:
            if (!USBD_ReqGetDescriptor()) {
              goto stall;
            }
            USBD_DataInStage();
            break;

          case USB_REQUEST_SET_DESCRIPTOR:
            goto stall;

          case USB_REQUEST_GET_CONFIGURATION:
            if (!USBD_ReqGetConfiguration()) {
              goto stall;
            }
            USBD_DataInStage();
            break;

          case USB_REQUEST_SET_CONFIGURATION:
            if (!USBD_ReqSetConfiguration()) {
              goto stall;
            }
            USBD_StatusInStage();
#ifdef __RTX
            if (__rtx) {
              if (USBD_RTX_CoreTask) {
                usbd_os_evt_set(USBD_EVT_SET_CFG, USBD_RTX_CoreTask);
              }
            } else {
#endif
              if (USBD_P_Configure_Event) {
                USBD_P_Configure_Event();
              }
#ifdef __RTX
            }
#endif
            break;

          case USB_REQUEST_GET_INTERFACE:
            if (!USBD_ReqGetInterface()) {
              goto stall;
            }
            USBD_DataInStage();
            break;

          case USB_REQUEST_SET_INTERFACE:
            if (!USBD_ReqSetInterface()) {
              goto stall;
            }
            USBD_StatusInStage();
#ifdef __RTX
            if (__rtx) {
              if (USBD_RTX_CoreTask) {
                usbd_os_evt_set(USBD_EVT_SET_IF, USBD_RTX_CoreTask);
              }
            } else {
#endif
              if (USBD_P_Interface_Event) {
                USBD_P_Interface_Event();
              }
#ifdef __RTX
            }
#endif
            break;

          default:
            goto stall;
        }
        break;  /* end case REQUEST_STANDARD */

      case REQUEST_CLASS:
        switch (USBD_SetupPacket.bmRequestType.Recipient) {

          case REQUEST_TO_DEVICE:
            goto stall;                                                  /* not supported */

          case REQUEST_TO_INTERFACE:
            if (USBD_EndPoint0_Setup_HID_ReqToIF())
              goto setup_class_ok;
            if (USBD_EndPoint0_Setup_MSC_ReqToIF())
              goto setup_class_ok;
            if (USBD_EndPoint0_Setup_CDC_ReqToIF())
              goto setup_class_ok;
            goto stall;                                                  /* not supported */
            /* end case REQUEST_TO_INTERFACE */

          case REQUEST_TO_ENDPOINT:
            goto stall;
            /* end case REQUEST_TO_ENDPOINT */

          default:
            goto stall;
        }
setup_class_ok:                                                          /* request finished successfully */
        break;  /* end case REQUEST_CLASS */

      default:
stall:  if ((USBD_SetupPacket.bmRequestType.Dir == REQUEST_HOST_TO_DEVICE) &&
            (USBD_SetupPacket.wLength != 0)) {
          USBD_SetStallEP(0x00);
        } else {
          USBD_SetStallEP(0x80);
        }
        USBD_EP0Data.Count = 0;
        break;
    }
  }

  if (event & USBD_EVT_OUT) {
    if (USBD_SetupPacket.bmRequestType.Dir == REQUEST_HOST_TO_DEVICE) {
      if (USBD_EP0Data.Count) {                                          /* still data to receive ? */
        USBD_DataOutStage();                                             /* receive data */
        if (USBD_EP0Data.Count == 0) {                                   /* data complete ? */
          switch (USBD_SetupPacket.bmRequestType.Type) {

            case REQUEST_STANDARD:
              goto stall_i;                                              /* not supported */

            case REQUEST_CLASS:
              switch (USBD_SetupPacket.bmRequestType.Recipient) {
                case REQUEST_TO_DEVICE:
                  goto stall_i;                                          /* not supported */

                case REQUEST_TO_INTERFACE:
                  if (USBD_EndPoint0_Out_HID_ReqToIF())
                    goto out_class_ok;
                  if (USBD_EndPoint0_Out_CDC_ReqToIF())
                    goto out_class_ok;
                  goto stall_i;
                  /* end case REQUEST_TO_INTERFACE */

                case REQUEST_TO_ENDPOINT:
                  goto stall_i;
                  /* end case REQUEST_TO_ENDPOINT */

                default:
                  goto stall_i;
              }
out_class_ok:                                                            /* request finished successfully */
              break; /* end case REQUEST_CLASS */

            default:
stall_i:      USBD_SetStallEP(0x80);
              USBD_EP0Data.Count = 0;
              break;
          }
        }
      }
    } else {
      USBD_StatusOutStage();                                             /* receive Acknowledge */
    }
  }  /* end USBD_EVT_OUT */

  if (event & USBD_EVT_IN) {
    if (USBD_SetupPacket.bmRequestType.Dir == REQUEST_DEVICE_TO_HOST) {
      if (USBD_EP0Data.Count || USBD_ZLP) USBD_DataInStage();            /* send data */
    } else {
      if (USBD_DeviceAddress & 0x80) {
        USBD_DeviceAddress &= 0x7F;
        USBD_SetAddress(USBD_DeviceAddress, 0);
      }
    }
  }  /* end USBD_EVT_IN */

  if (event & USBD_EVT_OUT_STALL) {
    USBD_ClrStallEP(0x00);
  }

  if (event & USBD_EVT_IN_STALL) {
    USBD_ClrStallEP(0x80);
  }
}