/**************************************************************************//**
\brief Mass storage device request handler.
\param[in]
  data - pointer to host's request.
******************************************************************************/
void msdRequestHandler(uint8_t *data)
{
  UsbMscRequest_t *pRequest = NULL;

  pRequest = (UsbMscRequest_t *)data;
  if (NULL == pRequest)
    return;

  // Check request code
  switch (pRequest->request.bRequest)
  {
    case BULK_ONLY_MASS_STORAGE_RESET:
      break;
    case GET_MAX_LUN:
      HAL_Stall(0);
      break;
    default:
      HAL_Stall(0);
      break;
  }
}
/******************************************************************************
runtime get descriptor command handler

Parameters:
  type   - type of the requested descriptor
  index  - index of the requested descriptor
  length - maximum number of bytes to return
******************************************************************************/
void runtimeGetDescriptorHandler(uint8_t type, uint8_t index, uint16_t length)
{
  (void)index;

  // Check the descriptor type
  switch (type)
  {
    case DESCRIPTOR_TYPE_DEVICE:
        // Adjust length and send descriptor
        if (length > deviceDescr.bLength)
          length = deviceDescr.bLength;
        HAL_UsbWrite(0, (void *)&deviceDescr, length, 0, 0);
      break;
    case DESCRIPTOR_TYPE_CONFIGURATION:
        // Adjust length and send descriptor
        if (length > usbConfigDescr.config.wTotalLength)
          length = usbConfigDescr.config.wTotalLength;
        HAL_UsbWrite(0, (void *)&usbConfigDescr, length, 0, 0);
      break;
    case DESCRIPTOR_TYPE_INTERFACE:
        HAL_Stall(0);
      break;
    case DESCRIPTOR_TYPE_DEVICE_QUALIFIER:
        HAL_Stall(0);
      break;
    case DESCRIPTOR_TYPE_OTHER_SPEED_CFG:
        HAL_Stall(0);
      break;
    case DESCRIPTOR_TYPE_ENDPOINT:
        HAL_Stall(0);
      break;
    case DESCRIPTOR_TYPE_STRING:
        if (SERIAL_NUMBER_STRING_INDEX == index)
        {
          if (length > serialNumberStringDescr.bLength)
            length = serialNumberStringDescr.bLength;
          HAL_UsbWrite(0, (void *)&serialNumberStringDescr, length, 0, 0);
        }
        //When string descriptor(s) presents, host also asks for string descriptor that describes used language.
        else if (LANG_ID_STRING_INDEX == index)
        {
          if (length > serialNumberStringDescr.bLength)
            length = langStringDescr.bLength;
          HAL_UsbWrite(0, (void *)&langStringDescr, length, 0, 0);
        }
        else
          HAL_Stall(0);
      break;
    default:
        HAL_Stall(0);
      break;
  }
}
Beispiel #3
0
/******************************************************************************
Usb setup process request handler

Parameters:
  data - pointer to host's request
******************************************************************************/
void setupProcessRequestHandler(uint8_t *data)
{
  UsbRequest_t *pRequest = NULL;

  pRequest = (UsbRequest_t *)data;
  if (NULL == pRequest)
    return;

  switch (pRequest->wIndex)
  {
  #if (APP_INTERFACE == APP_INTERFACE_VCP)
    case NUMBER_OF_FIRST_INTERFACE:
      vcpRequestHandler(data);
      break;
  #endif // (APP_INTERFACE == APP_INTERFACE_VCP)
    /* MSC commands */
  #if (MSD_SUPPORT == 1)
    #if (APP_INTERFACE == APP_INTERFACE_VCP)
      case NUMBER_OF_THIRD_INTERFACE:
    #else
      case NUMBER_OF_FIRST_INTERFACE:
    #endif
        msdRequestHandler(data);
        break;
  #endif // (MSD_SUPPORT == 1)
  #if (DFU_SUPPORT == 1)
    #if (APP_INTERFACE == APP_INTERFACE_VCP)
      #if (MSD_SUPPORT == 1)
        case NUMBER_OF_FOURTH_INTERFACE:
      #else
        case NUMBER_OF_THIRD_INTERFACE:
      #endif
    #else
      case NUMBER_OF_SECOND_INTERFACE:
    #endif // (APP_INTERFACE == APP_INTERFACE_VCP)
        dfuRequestHandler(data);
        break;
  #endif // (DFU_SUPPORT == 1)
    default:
      HAL_Stall(0);
      break;
  }
}