⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 papp_eve.c

📁 Usb Host/Periphel Control TD1120 codes
💻 C
📖 第 1 页 / 共 3 页
字号:
         {
         b |= 1;
         }
      }
   else if ((request->bmRequestType & USB_MASK_RECIPIENT) == USB_RECIPIENT_ENDPOINT)
      {
      if (0 == request->wIndex)
         {
         if (SCC_TRUE == pc->halted)
            {
            b = 1;
            }
         }
      else
         {
         TdiPeriphEp* ep;

         ep = PCDAPP_EVE_FindEp(pc, request->wIndex);
         if (SCC_TRUE == ep->halted)
            {
            b = 1;
            }
         }
      }

   request->buffer[0] = b;
   request->buffer[1] = 0;
   request->data = request->buffer;
   request->actualLength = 2;

   return SCS_SUCCESS;
   }

/*------------------------------------------------------------------------------
Name      : PCDAPP_EVE_ProcessFeature
Purpose   : Process Class Setup message
Arguments : pc - PCD handle
            request - SETUP packet
            set - Set or Clear feature
Returns   : SctStatus
Notes     : 
-----------------------------------------------------------------------------*/
SctStatus PCDAPP_EVE_ProcessFeature(TdiPeriphController* pc, 
                                PeriphSetupRequest* request, SctBool set)
   {
   if ((request->bmRequestType & USB_MASK_RECIPIENT) == USB_RECIPIENT_DEVICE)
      {
      if (request->wValue == USB_FEATURE_DEVICE_REMOTE_WAKEUP)
         {
         /* set or clear remote wakeup */
         pc->remoteWakeupEnable = set;
         }
      }
   else if ((request->bmRequestType & USB_MASK_RECIPIENT) == USB_RECIPIENT_ENDPOINT)
      {
      if (request->wValue == USB_FEATURE_ENDPOINT_HALT)
         {
         TdiPeriphEp *ep;

         ep = PCDAPP_EVE_FindEp(pc, request->wIndex);
         if (NULL != ep)
            {
            if (SCC_TRUE == set)
               {
               PCDAPP_EVE_SetEpStall(pc, request->wIndex);
               }
            else
               {
               PCDAPP_EVE_ClearEpStall(pc, request->wIndex);
               }
            }
         }
      }

   return SCS_SUCCESS;
   }

/*------------------------------------------------------------------------------
Name      : PCDAPP_EVE_ProcessSetAddress
Purpose   : Process Class Setup message
Arguments : pc - PCD handle
            request - SETUP packet
Returns   : SctStatus
Notes     : 
-----------------------------------------------------------------------------*/
SctStatus PCDAPP_EVE_ProcessSetAddress(TdiPeriphController* pc, 
                                   PeriphSetupRequest* request)
   {
   pc->state = USB_STATE_ADDRESS;
   usbAssignedAddress = request->wValue;
   
   /* Use any buffer 'cause this is zero length */
   request->data = pc->currentDeviceDescriptor;
   request->actualLength = 0;

   return SCS_SUCCESS;
   }

/*------------------------------------------------------------------------------
Name      : PCDAPP_EVE_ProcessGetDescriptor
Purpose   : Process get descriptor command
Arguments : pc - peripheral controller handle
            request - SETUP packet
Returns   : SctStatus
Notes     : 
-----------------------------------------------------------------------------*/
SctStatus PCDAPP_EVE_ProcessGetDescriptor(TdiPeriphController* pc, 
                                      PeriphSetupRequest* request)
   {
   U8 type;
   U8 index;

   type = (request->wValue >> 8) & 0xFF;
   index = request->wValue & 0xFF;
   
   if ((request->bmRequestType & USB_MASK_RECIPIENT) != USB_RECIPIENT_DEVICE)
      {
      return SCS_SUCCESS;/* subclass's GetDescriptor function will be called */
      }

   switch (type)
      {
      case USB_DEVICE_DESCRIPTOR:
         request->data = pc->currentDeviceDescriptor;
         if (request->wLength < pc->currentDeviceDescriptor[0])
            {
            request->actualLength = request->wLength;
            }
         else
            {
            request->actualLength = pc->currentDeviceDescriptor[0];
            }
      break;

      case USB_CONFIG_DESCRIPTOR:
         request->data = pc->currentConfigDescriptors[index];
         if (request->wLength < request->data[USBDESC_CONFIG_WTOTALLENGTH])
            {
            request->actualLength = request->wLength;
            }
         else
            {
            request->actualLength = request->data[USBDESC_CONFIG_WTOTALLENGTH];
            }
      break;

      case USB_STRING_DESCRIPTOR:
         request->data = pc->stringDescriptors[index];
         if (request->wLength < request->data[0])
            {
            request->actualLength = request->wLength;
            }
         else
            {
            request->actualLength = request->data[0];
            }
      break;
      
      case USB_DEVICE_QUALIFIER_DESCRIPTOR:
         request->data = pc->deviceQualifierDescriptor;
         if (request->wLength < pc->deviceQualifierDescriptor[0])
            {
            request->actualLength = request->wLength;
            }
         else
            {
            request->actualLength = pc->deviceQualifierDescriptor[0];
            }
      break;
      
      case USB_OTHER_SPEED_CONFIG_DESCRIPTOR:
         request->data = pc->currentOtherSpeedConfigDescriptors[index];
         if (request->wLength < request->data[USBDESC_CONFIG_WTOTALLENGTH])
            {
            request->actualLength = request->wLength;
            }
         else
            {
            request->actualLength = request->data[USBDESC_CONFIG_WTOTALLENGTH];
            }
      break;

      default:
         return SCS_ERROR;
      }

   return SCS_SUCCESS;
   }

/*------------------------------------------------------------------------------
Name      : PCDAPP_EVE_ProcessGetConfiguration
Purpose   : Process get configuration command
Arguments : pc - peripheral controller handle
            request - SETUP packet
Returns   : SctStatus
Notes     : 
-----------------------------------------------------------------------------*/
SctStatus PCDAPP_EVE_ProcessGetConfiguration(TdiPeriphController* pc, 
                                         PeriphSetupRequest* request)
   {
   U8 b = 0;
   
   b = CurrentConfigNum;
   
   request->buffer[0] = b;
   request->data = request->buffer;
   request->actualLength = 1;
   
   return SCS_SUCCESS;
   }

/*------------------------------------------------------------------------------
Name      : PCDAPP_EVE_ProcessSetConfiguration
Purpose   : Process set configuration command
Arguments : pc - peripheral controller handle
            request - SETUP packet
Returns   : SctStatus
Notes     : 
-----------------------------------------------------------------------------*/
SctStatus PCDAPP_EVE_ProcessSetConfiguration(TdiPeriphController* pc, 
                                         PeriphSetupRequest* request)
   {
   U8 b;
   U8* config;
   SctStatus result;
   
   b = request->wValue & 0xFF;
   CurrentConfigNum = b;
   config = pc->currentConfigDescriptors[0];
   
   result = PCDAPP_EVE_SetConfiguration(pc, config, CurrentConfigNum);
   if (SCS_ERROR == result)
      {
      return SCS_ERROR;
      }
               
   return SCS_SUCCESS;
   }
   
/*------------------------------------------------------------------------------
Name      : PCDAPP_EVE_ControlTransferDone
Purpose   : Process Control transfer status done event
Arguments : urb - pointer to urb structure
Returns   : SctStatus
Notes     : 
-----------------------------------------------------------------------------*/
void PCDAPP_EVE_ControlTransferDone(TdiPurb* urb)
   {
   if (vendorCmdStatClear)
      {
      vendorCommandStatus = 0;
      vendorCmdStatClear = SCC_FALSE;
      }
      
   if (addressPending)
      {
      /* safe to set address now since ths status phase is done */
      addressPending = SCC_FALSE;
      PCD_SetAddress(urb->pc, usbAssignedAddress);
      enumerationDone = SCC_TRUE;
      }
   }
   
/*------------------------------------------------------------------------------
Name      : PCDAPP_EVE_ControlInDataPhaseDone
Purpose   : Process Control IN data phase done event
Arguments : urb - pointer to urb structure
Returns   : SctStatus
Notes     : 
-----------------------------------------------------------------------------*/
void PCDAPP_EVE_ControlInDataPhaseDone(TdiPurb* urb)
   {
   SctStatus result;
   
   /* Enqueue the Status Phase */
   ep0->urb = &controlOutUrb;
   controlOutUrb.data = urb->data;
   controlOutUrb.length = 0;
   controlOutUrb.lengthSoFar = 0;
   controlOutUrb.dataPosition = 0;
   controlOutUrb.status = 0;
   controlOutUrb.callBackFunction = PCDAPP_EVE_ControlTransferDone;
   controlOutUrb.pc = urb->pc;
   controlOutUrb.ep = ep0;
   controlOutUrb.direction = 0;
   controlOutUrb.oneShot = 0;
   result = PCD_Transfer(urb->pc, &controlOutUrb);
   if (result != SCS_SUCCESS)
      {
      PRINT1("(PCDAPP_EVE_ControlInDataPhaseDone) : Status phase error.\n");
      }
   }
   
/*------------------------------------------------------------------------------
Name      : PCDAPP_EVE_ControlOutDataPhaseDone
Purpose   : Process Control OUT data phase done event
Arguments : urb - pointer to urb structure
Returns   : SctStatus
Notes     : 
-----------------------------------------------------------------------------*/
void PCDAPP_EVE_ControlOutDataPhaseDone(TdiPurb* urb)
   {
   SctStatus result;
   
   /* Enqueue the Status Phase */
   ep0->urb = &controlInUrb;
   controlInUrb.data = urb->data;
   controlInUrb.length = 0;
   controlInUrb.lengthSoFar = 0;
   controlInUrb.dataPosition = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -