当前位置: 首页>>代码示例>>C++>>正文


C++ Pipe_ConfigurePipe函数代码示例

本文整理汇总了C++中Pipe_ConfigurePipe函数的典型用法代码示例。如果您正苦于以下问题:C++ Pipe_ConfigurePipe函数的具体用法?C++ Pipe_ConfigurePipe怎么用?C++ Pipe_ConfigurePipe使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。


在下文中一共展示了Pipe_ConfigurePipe函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: ProcessConfigurationDescriptor

/** Reads and processes an attached device's descriptors, to determine compatibility and pipe configurations. This
 *  routine will read in the entire configuration descriptor, and configure the hosts pipes to correctly communicate
 *  with compatible devices.
 *
 *  This routine searches for the first interface containing bulk IN and OUT data endpoints.
 *
 *  \return An error code from the \ref AndroidHost_GetConfigDescriptorDataCodes_t enum.
 */
uint8_t ProcessConfigurationDescriptor(void)
{
    uint8_t  ConfigDescriptorData[512];
    void*    CurrConfigLocation = ConfigDescriptorData;
    uint16_t CurrConfigBytesRem;

    USB_Descriptor_Endpoint_t* DataINEndpoint  = NULL;
    USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;

    /* Retrieve the entire configuration descriptor into the allocated buffer */
    switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
    {
        case HOST_GETCONFIG_Successful:
            break;
        case HOST_GETCONFIG_InvalidData:
            return InvalidConfigDataReturned;
        case HOST_GETCONFIG_BuffOverflow:
            return DescriptorTooLarge;
        default:
            return DevControlError;
    }

    /* There should be only one compatible Android Accessory Mode interface in the device, attempt to find it */
    if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                  DCOMP_NextAndroidAccessoryInterface) != DESCRIPTOR_SEARCH_COMP_Found)
    {
        return NoCompatibleInterfaceFound;
    }

    while (!(DataINEndpoint) || !(DataOUTEndpoint))
    {
        /* Get the next Android Accessory Mode interface's data endpoint descriptor */
        if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                      DCOMP_NextInterfaceBulkEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
        {
            /* Data endpoints not found within the first Android Accessory device interface, error out */
            return NoCompatibleInterfaceFound;
        }

        /* Retrieve the endpoint address from the endpoint descriptor */
        USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t);

        /* If the endpoint is a IN type endpoint */
        if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN)
          DataINEndpoint  = EndpointData;
        else
          DataOUTEndpoint = EndpointData;
    }

    /* Configure the Android Accessory data IN pipe */
    Pipe_ConfigurePipe(ANDROID_DATA_IN_PIPE, EP_TYPE_BULK, DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, 1);

    /* Configure the Android Accessory data OUT pipe */
    Pipe_ConfigurePipe(ANDROID_DATA_OUT_PIPE, EP_TYPE_BULK, DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, 1);

    /* Valid data found, return success */
    return SuccessfulConfigRead;
}
开发者ID:Steffen-Engel,项目名称:lufa,代码行数:66,代码来源:ConfigDescriptor.c

示例2: PRNT_Host_ConfigurePipes

uint8_t PRNT_Host_ConfigurePipes(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo,
                                 uint16_t ConfigDescriptorSize,
                                 void* DeviceConfigDescriptor)
{
    uint8_t FoundEndpoints = 0;
    
    memset(&PRNTInterfaceInfo->State, 0x00, sizeof(PRNTInterfaceInfo->State));

    if (DESCRIPTOR_TYPE(DeviceConfigDescriptor) != DTYPE_Configuration)
      return PRNT_ENUMERROR_InvalidConfigDescriptor;
    
    if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &DeviceConfigDescriptor,
                                  DCOMP_PRNT_NextPRNTInterface) != DESCRIPTOR_SEARCH_COMP_Found)
    {
        return PRNT_ENUMERROR_NoPrinterInterfaceFound;
    }

    USB_Descriptor_Interface_t* PrinterInterface = DESCRIPTOR_PCAST(DeviceConfigDescriptor, USB_Descriptor_Interface_t);

    PRNTInterfaceInfo->State.InterfaceNumber  = PrinterInterface->InterfaceNumber;
    PRNTInterfaceInfo->State.AlternateSetting = PrinterInterface->AlternateSetting;
    
    while (FoundEndpoints != (PRNT_FOUND_DATAPIPE_IN | PRNT_FOUND_DATAPIPE_OUT))
    {
        if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &DeviceConfigDescriptor,
                                      DCOMP_PRNT_NextPRNTInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
        {
            return PRNT_ENUMERROR_EndpointsNotFound;
        }
        
        USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(DeviceConfigDescriptor, USB_Descriptor_Endpoint_t);

        if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
        {
            Pipe_ConfigurePipe(PRNTInterfaceInfo->Config.DataINPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_IN,
                               EndpointData->EndpointAddress, EndpointData->EndpointSize,
                               PRNTInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);
            PRNTInterfaceInfo->State.DataINPipeSize = EndpointData->EndpointSize;

            FoundEndpoints |= PRNT_FOUND_DATAPIPE_IN;
        }
        else
        {
            Pipe_ConfigurePipe(PRNTInterfaceInfo->Config.DataOUTPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_OUT,
                               EndpointData->EndpointAddress, EndpointData->EndpointSize,
                               PRNTInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);
            PRNTInterfaceInfo->State.DataOUTPipeSize = EndpointData->EndpointSize;

            FoundEndpoints |= PRNT_FOUND_DATAPIPE_OUT;
        }		
    }

    PRNTInterfaceInfo->State.IsActive = true;
    return PRNT_ENUMERROR_NoError;
}
开发者ID:AteamVentures,项目名称:Creatable_D2,代码行数:55,代码来源:Printer.c

示例3: MIDI_Host_ConfigurePipes

uint8_t MIDI_Host_ConfigurePipes(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo,
                                 uint16_t ConfigDescriptorSize,
                                 void* ConfigDescriptorData)
{
    uint8_t FoundEndpoints = 0;

    memset(&MIDIInterfaceInfo->State, 0x00, sizeof(MIDIInterfaceInfo->State));

    if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
      return MIDI_ENUMERROR_InvalidConfigDescriptor;
    
    if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
                                  DCOMP_MIDI_Host_NextMIDIStreamingInterface) != DESCRIPTOR_SEARCH_COMP_Found)
    {
        return MIDI_ENUMERROR_NoStreamingInterfaceFound;
    }
    
    while (FoundEndpoints != (MIDI_FOUND_DATAPIPE_IN | MIDI_FOUND_DATAPIPE_OUT))
    {
        if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
                                      DCOMP_MIDI_Host_NextMIDIStreamingDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
        {
            return MIDI_ENUMERROR_EndpointsNotFound;
        }
        
        USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);

        if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
        {
            Pipe_ConfigurePipe(MIDIInterfaceInfo->Config.DataINPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_IN,
                               EndpointData->EndpointAddress, EndpointData->EndpointSize,
                               MIDIInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);
            MIDIInterfaceInfo->State.DataINPipeSize = EndpointData->EndpointSize;
            
            FoundEndpoints |= MIDI_FOUND_DATAPIPE_IN;
        }
        else
        {
            Pipe_ConfigurePipe(MIDIInterfaceInfo->Config.DataOUTPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_OUT,
                               EndpointData->EndpointAddress, EndpointData->EndpointSize,
                               MIDIInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);
            MIDIInterfaceInfo->State.DataOUTPipeSize = EndpointData->EndpointSize;

            FoundEndpoints |= MIDI_FOUND_DATAPIPE_OUT;
        }
    }
    
    MIDIInterfaceInfo->State.IsActive = true;
    return MIDI_ENUMERROR_NoError;
}
开发者ID:AteamVentures,项目名称:Creatable_D2,代码行数:50,代码来源:MIDI.c

示例4: ProcessConfigurationDescriptor

/** Reads and processes an attached device's descriptors, to determine compatibility and pipe configurations. This
 *  routine will read in the entire configuration descriptor, and configure the hosts pipes to correctly communicate
 *  with compatible devices.
 *
 *  This routine searches for a HID interface descriptor containing at least one Interrupt type IN endpoint.
 *
 *  \return An error code from the \ref KeyboardHost_GetConfigDescriptorDataCodes_t enum.
 */
uint8_t ProcessConfigurationDescriptor(void)
{
    uint8_t  ConfigDescriptorData[512];
    void*    CurrConfigLocation = ConfigDescriptorData;
    uint16_t CurrConfigBytesRem;

    USB_Descriptor_Interface_t* HIDInterface   = NULL;
    USB_Descriptor_Endpoint_t*  DataINEndpoint = NULL;

    /* Retrieve the entire configuration descriptor into the allocated buffer */
    switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
    {
        case HOST_GETCONFIG_Successful:
            break;
        case HOST_GETCONFIG_InvalidData:
            return InvalidConfigDataReturned;
        case HOST_GETCONFIG_BuffOverflow:
            return DescriptorTooLarge;
        default:
            return ControlError;
    }

    while (!(DataINEndpoint))
    {
        /* See if we've found a likely compatible interface, and if there is an endpoint within that interface */
        if (!(HIDInterface) ||
            USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                      DComp_NextKeyboardInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
        {
            /* Get the next HID interface from the configuration descriptor */
            if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                          DComp_NextKeyboardInterface) != DESCRIPTOR_SEARCH_COMP_Found)
            {
                /* Descriptor not found, error out */
                return NoCompatibleInterfaceFound;
            }

            /* Save the interface in case we need to refer back to it later */
            HIDInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);

            /* Skip the remainder of the loop as we have not found an endpoint yet */
            continue;
        }

        /* Retrieve the endpoint address from the endpoint descriptor */
        USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t);

        /* If the endpoint is a IN type endpoint */
        if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
          DataINEndpoint = EndpointData;
    }

    /* Configure the HID data IN pipe */
    Pipe_ConfigurePipe(KEYBOARD_DATA_IN_PIPE, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN,
                       DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE);
    Pipe_SetInterruptPeriod(DataINEndpoint->PollingIntervalMS);

    /* Valid data found, return success */
    return SuccessfulConfigRead;
}
开发者ID:AdjacentReality,项目名称:lufa-lib,代码行数:68,代码来源:ConfigDescriptor.c

示例5: ProcessConfigurationDescriptor

/** Reads and processes an attached device's descriptors, to determine compatibility and pipe configurations. This
 *  routine will read in the entire configuration descriptor, and configure the hosts pipes to correctly communicate
 *  with compatible devices.
 *
 *  This routine searches for a HID interface descriptor containing at least one Interrupt type IN endpoint and HID descriptor.
 *
 *  \return An error code from the \ref MouseHostWithParser_GetConfigDescriptorDataCodes_t enum.
 */
uint8_t ProcessConfigurationDescriptor(void)
{
    uint8_t  ConfigDescriptorData[512];
    void*    CurrConfigLocation = ConfigDescriptorData;
    uint16_t CurrConfigBytesRem;

    /* Retrieve the entire configuration descriptor into the allocated buffer */
    switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
    {
        case HOST_GETCONFIG_Successful:
            break;
        case HOST_GETCONFIG_InvalidData:
            return InvalidConfigDataReturned;
        case HOST_GETCONFIG_BuffOverflow:
            return DescriptorTooLarge;
        default:
            return ControlError;
    }

    /* Get the mouse interface from the configuration descriptor */
    if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                  DComp_NextMouseInterface) != DESCRIPTOR_SEARCH_COMP_Found)
    {
        /* Descriptor not found, error out */
        return NoHIDInterfaceFound;
    }
    
    /* Get the mouse interface's HID descriptor */
    if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                  DComp_NextHID) != DESCRIPTOR_SEARCH_COMP_Found)
    {
        /* Descriptor not found, error out */
        return NoHIDDescriptorFound;
    }

    /* Save the HID report size for later use */
    HIDReportSize = DESCRIPTOR_CAST(CurrConfigLocation, USB_Descriptor_HID_t).HIDReportLength;
    
    /* Get the mouse interface's data endpoint descriptor */
    if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                  DComp_NextMouseInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
    {
        /* Descriptor not found, error out */
        return NoEndpointFound;
    }
    
    /* Retrieve the endpoint address from the endpoint descriptor */
    USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t);

    /* Configure the mouse data pipe */
    Pipe_ConfigurePipe(MOUSE_DATAPIPE, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN,
                       EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE);

    /* Valid data found, return success */
    return SuccessfulConfigRead;
}
开发者ID:davr,项目名称:lufa-lib,代码行数:64,代码来源:ConfigDescriptor.c

示例6: ProcessConfigurationDescriptor

/** Reads and processes an attached device's descriptors, to determine compatibility and pipe configurations. This
 *  routine will read in the entire configuration descriptor, and configure the hosts pipes to correctly communicate
 *  with compatible devices.
 *
 *  This routine searches for a HID interface descriptor containing at least one Interrupt type IN endpoint.
 *
 *  \return An error code from the MouseHostViaInt_GetConfigDescriptorDataCodes_t enum.
 */
uint8_t ProcessConfigurationDescriptor(void)
{
    uint8_t* ConfigDescriptorData;
    uint16_t ConfigDescriptorSize;
    
    /* Get Configuration Descriptor size from the device */
    if (USB_Host_GetDeviceConfigDescriptor(&ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)
      return ControlError;
    
    /* Ensure that the Configuration Descriptor isn't too large */
    if (ConfigDescriptorSize > MAX_CONFIG_DESCRIPTOR_SIZE)
      return DescriptorTooLarge;
      
    /* Allocate enough memory for the entire config descriptor */
    ConfigDescriptorData = alloca(ConfigDescriptorSize);

    /* Retrieve the entire configuration descriptor into the allocated buffer */
    USB_Host_GetDeviceConfigDescriptor(&ConfigDescriptorSize, ConfigDescriptorData);
    
    /* Validate returned data - ensure first entry is a configuration header descriptor */
    if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
      return InvalidConfigDataReturned;
    
    /* Get the mouse interface from the configuration descriptor */
    if (USB_Host_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, NextMouseInterface))
    {
        /* Descriptor not found, error out */
        return NoHIDInterfaceFound;
    }

    /* Get the mouse interface's data endpoint descriptor */
    if (USB_Host_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
                                                    NextInterfaceMouseDataEndpoint))
    {
        /* Descriptor not found, error out */
        return NoEndpointFound;
    }
    
    /* Retrieve the endpoint address from the endpoint descriptor */
    USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);

    /* Configure the mouse data pipe */
    Pipe_ConfigurePipe(MOUSE_DATAPIPE, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN,
                       EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE);

    Pipe_SetInfiniteINRequests();
    Pipe_SetInterruptPeriod(EndpointData->PollingIntervalMS);
    Pipe_Unfreeze();
            
    /* Enable the pipe IN interrupt for the data pipe */
    USB_INT_Enable(PIPE_INT_IN);
            
    /* Valid data found, return success */
    return SuccessfulConfigRead;
}
开发者ID:Limpinho0,项目名称:motmot-camtrig,代码行数:63,代码来源:ConfigDescriptor.c

示例7: Pipe_ConfigurePipeTable

bool Pipe_ConfigurePipeTable(const USB_Pipe_Table_t* const Table,
                             const uint8_t Entries)
{
    for (uint8_t i = 0; i < Entries; i++)
    {
        if (!(Table[i].Address))
          continue;

        if (!(Pipe_ConfigurePipe(Table[i].Address, Table[i].Type, Table[i].EndpointAddress, Table[i].Size, Table[i].Banks)))
        {
            return false;
        }
    }

    return true;
}
开发者ID:40000ft,项目名称:lufa,代码行数:16,代码来源:Pipe_AVR8.c

示例8: SI_Host_ConfigurePipes

uint8_t SI_Host_ConfigurePipes(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, uint16_t ConfigDescriptorSize,
                              uint8_t* DeviceConfigDescriptor)
{
    uint8_t  FoundEndpoints = 0;
    
    memset(&SIInterfaceInfo->State, 0x00, sizeof(SIInterfaceInfo->State));
    
    if (DESCRIPTOR_TYPE(DeviceConfigDescriptor) != DTYPE_Configuration)
      return SI_ENUMERROR_InvalidConfigDescriptor;
    
    if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &DeviceConfigDescriptor,
                                  DComp_SI_Host_NextSIInterface) != DESCRIPTOR_SEARCH_COMP_Found)
    {
        return SI_ENUMERROR_NoSIInterfaceFound;
    }

    while (FoundEndpoints != (SI_FOUND_EVENTS_IN | SI_FOUND_DATAPIPE_IN | SI_FOUND_DATAPIPE_OUT))
    {
        if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &DeviceConfigDescriptor,
                                      DComp_SI_Host_NextSIInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
        {
            return SI_ENUMERROR_EndpointsNotFound;
        }
        
        USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(DeviceConfigDescriptor, USB_Descriptor_Endpoint_t);

        if ((EndpointData->Attributes & EP_TYPE_MASK) == EP_TYPE_INTERRUPT)
        {
            if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
            {
                Pipe_ConfigurePipe(SIInterfaceInfo->Config.EventsPipeNumber, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN,
                                   EndpointData->EndpointAddress, EndpointData->EndpointSize,
                                   PIPE_BANK_DOUBLE);			
                SIInterfaceInfo->State.EventsPipeSize = EndpointData->EndpointSize;

                Pipe_SetInterruptPeriod(EndpointData->PollingIntervalMS);
                
                FoundEndpoints |= SI_FOUND_EVENTS_IN;
            }
        }
        else
        {
            if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
            {
                Pipe_ConfigurePipe(SIInterfaceInfo->Config.DataINPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_IN,
                                   EndpointData->EndpointAddress, EndpointData->EndpointSize,
                                   PIPE_BANK_DOUBLE);
                SIInterfaceInfo->State.DataINPipeSize = EndpointData->EndpointSize;

                FoundEndpoints |= SI_FOUND_DATAPIPE_IN;
            }
            else
            {
                Pipe_ConfigurePipe(SIInterfaceInfo->Config.DataOUTPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_OUT,
                                   EndpointData->EndpointAddress, EndpointData->EndpointSize,
                                   PIPE_BANK_DOUBLE);
                SIInterfaceInfo->State.DataOUTPipeSize = EndpointData->EndpointSize;

                FoundEndpoints |= SI_FOUND_DATAPIPE_OUT;
            }
        }
    }

    SIInterfaceInfo->State.IsActive = true;
    return SI_ENUMERROR_NoError;
}
开发者ID:andrew-taylor,项目名称:bowerbird-avr,代码行数:66,代码来源:StillImage.c

示例9: USB_Host_ProcessNextHostState

void USB_Host_ProcessNextHostState(uint8_t corenum)
{
    uint8_t ErrorCode    = HOST_ENUMERROR_NoError;
    uint8_t SubErrorCode = HOST_ENUMERROR_NoError;

    static uint16_t WaitMSRemaining;
    static uint8_t  PostWaitState;

    switch (USB_HostState[corenum])
    {
        case HOST_STATE_WaitForDevice:
            if (WaitMSRemaining)
            {
                if ((SubErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
                {
                    USB_HostState[corenum] = PostWaitState;
                    ErrorCode     = HOST_ENUMERROR_WaitStage;
                    break;
                }

                if (!(--WaitMSRemaining))
                  USB_HostState[corenum] = PostWaitState;
            }
            break;

        case HOST_STATE_Powered:
            WaitMSRemaining = HOST_DEVICE_SETTLE_DELAY_MS;

            USB_HostState[corenum] = HOST_STATE_Powered_WaitForDeviceSettle;
            break;

        case HOST_STATE_Powered_WaitForDeviceSettle:
            if (WaitMSRemaining--)
            {
                Delay_MS(1);
                break;
            }
            else
            {
                USB_Host_VBUS_Manual_Off();

                USB_OTGPAD_On();
                USB_Host_VBUS_Auto_Enable();
                USB_Host_VBUS_Auto_On();

                USB_HostState[corenum] = HOST_STATE_Powered_WaitForConnect;
            }
            break;

        case HOST_STATE_Powered_WaitForConnect:
            HOST_TASK_NONBLOCK_WAIT(corenum, 100, HOST_STATE_Powered_DoReset);
            break;

        case HOST_STATE_Powered_DoReset:
        {
            HCD_USB_SPEED DeviceSpeed;
            HcdRhPortReset(corenum,1);
            HcdGetDeviceSpeed(corenum, 1, &DeviceSpeed); // skip checking status
            USB_Host_SetDeviceSpeed(corenum,DeviceSpeed);
            HOST_TASK_NONBLOCK_WAIT(corenum, 200, HOST_STATE_Powered_ConfigPipe);
        }
            break;

        case HOST_STATE_Powered_ConfigPipe:
            if (!Pipe_ConfigurePipe(corenum, PIPE_CONTROLPIPE, EP_TYPE_CONTROL,
                               PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP,
                               PIPE_CONTROLPIPE_DEFAULT_SIZE, PIPE_BANK_SINGLE) )
            {
                ErrorCode    = HOST_ENUMERROR_PipeConfigError;
                SubErrorCode = 0;
                break;
            }

            USB_HostState[corenum] = HOST_STATE_Default;
            break;

        case HOST_STATE_Default:
        {
            USB_Descriptor_Device_t DevDescriptor;
            USB_ControlRequest = (USB_Request_Header_t)
                {
                    .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
                    .bRequest      = REQ_GetDescriptor,
                    .wValue        = (DTYPE_Device << 8),
                    .wIndex        = 0,
                    .wLength       = 8,
                };

            if ((SubErrorCode = USB_Host_SendControlRequest(corenum, &DevDescriptor)) != HOST_SENDCONTROL_Successful)
            {
                ErrorCode = HOST_ENUMERROR_ControlError;
                break;
            }

            USB_Host_ControlPipeSize[corenum] = DevDescriptor.Endpoint0Size;

            Pipe_ClosePipe(corenum, PIPE_CONTROLPIPE);
            HcdRhPortReset(corenum,1);

            HOST_TASK_NONBLOCK_WAIT(corenum, 200, HOST_STATE_Default_PostReset);
//.........这里部分代码省略.........
开发者ID:Kazu-zamasu,项目名称:nxpUSBlib,代码行数:101,代码来源:Host_LPC.c

示例10: ProcessConfigurationDescriptor

/** Reads and processes an attached device's descriptors, to determine compatibility and pipe configurations. This
 *  routine will read in the entire configuration descriptor, and configure the hosts pipes to correctly communicate
 *  with compatible devices.
 *
 *  This routine searches for a BT interface descriptor containing bulk IN and OUT data endpoints.
 *
 *  \return An error code from the \ref BluetoothHost_GetConfigDescriptorDataCodes_t enum.
 */
uint8_t ProcessConfigurationDescriptor(void)
{
    uint8_t  ConfigDescriptorData[512];
    void*    CurrConfigLocation = ConfigDescriptorData;
    uint16_t CurrConfigBytesRem;

    USB_Descriptor_Endpoint_t* DataINEndpoint  = NULL;
    USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
    USB_Descriptor_Endpoint_t* EventsEndpoint  = NULL;

    /* Retrieve the entire configuration descriptor into the allocated buffer */
    switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
    {
        case HOST_GETCONFIG_Successful:
            break;
        case HOST_GETCONFIG_InvalidData:
            return InvalidConfigDataReturned;
        case HOST_GETCONFIG_BuffOverflow:
            return DescriptorTooLarge;
        default:
            return DevControlError;
    }

    /* The Bluetooth USB transport addendum mandates that the data (not streaming voice) endpoints
       be in the first interface descriptor (interface 0) */
    USB_GetNextDescriptorOfType(&CurrConfigBytesRem, &CurrConfigLocation, DTYPE_Interface);

    /* Ensure that an interface was found, and the end of the descriptor was not reached */
    if (!(CurrConfigBytesRem))
      return NoCompatibleInterfaceFound;

    while (!(DataINEndpoint) || !(DataOUTEndpoint))
    {
        /* Get the next Bluetooth interface's data endpoint descriptor */
        if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                      DComp_NextInterfaceBluetoothDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
        {
            /* Data endpoints not found within the first bluetooth device interface, error out */
            return NoCompatibleInterfaceFound;
        }

        /* Retrieve the endpoint address from the endpoint descriptor */
        USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t);

        /* If the endpoint is a IN type endpoint */
        if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN)
        {
            /* Check if the found endpoint is a interrupt or bulk type descriptor */
            if ((EndpointData->Attributes & EP_TYPE_MASK) == EP_TYPE_INTERRUPT)
              EventsEndpoint = EndpointData;
            else
              DataINEndpoint = EndpointData;
        }
        else
        {
            DataOUTEndpoint = EndpointData;
        }
    }

    /* Configure the Bluetooth data IN pipe */
    Pipe_ConfigurePipe(BLUETOOTH_DATA_IN_PIPE, EP_TYPE_BULK, PIPE_TOKEN_IN,
                       DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE);

    /* Configure the Bluetooth data OUT pipe */
    Pipe_ConfigurePipe(BLUETOOTH_DATA_OUT_PIPE, EP_TYPE_BULK, PIPE_TOKEN_OUT,
                       DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, PIPE_BANK_SINGLE);

    /* Configure the Bluetooth events pipe */
    Pipe_ConfigurePipe(BLUETOOTH_EVENTS_PIPE, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN,
                       EventsEndpoint->EndpointAddress, EventsEndpoint->EndpointSize, PIPE_BANK_SINGLE);
    Pipe_SetInterruptPeriod(EventsEndpoint->PollingIntervalMS);

    /* Valid data found, return success */
    return SuccessfulConfigRead;
}
开发者ID:Codingboy,项目名称:ucuni,代码行数:83,代码来源:ConfigDescriptor.c

示例11: BluetoothAdapter_ConfigurePipes

/** Attempts to configure the system pipes for the attached Bluetooth adapter.
 *
 *  \param[in] DeviceDescriptor      Pointer to the Device Descriptor read from the attached device
 *  \param[in] ConfigDescriptorSize  Size of the retrieved Configuration Descriptor from the device
 *  \param[in] ConfigDescriptorData  Pointer to the Configuration Descriptor read from the attached device
 *
 *  \return  Boolean true if a valid Bluetooth interface was found, false otherwise.
 */
bool BluetoothAdapter_ConfigurePipes(USB_Descriptor_Device_t* const DeviceDescriptor,
                                     uint16_t ConfigDescriptorSize,
                                     void* ConfigDescriptorData)
{
    USB_Descriptor_Endpoint_t* DataINEndpoint  = NULL;
    USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
    USB_Descriptor_Endpoint_t* EventsEndpoint  = NULL;
    
    BluetoothAdapter_IsActive = false;

    /* Validate returned device Class, SubClass and Protocol values against the Bluetooth spec values */
    if ((DeviceDescriptor->Class    != BLUETOOTH_DEVICE_CLASS)    ||
        (DeviceDescriptor->SubClass != BLUETOOTH_DEVICE_SUBCLASS) ||
        (DeviceDescriptor->Protocol != BLUETOOTH_DEVICE_PROTOCOL))
    {
        return false;
    }

    /* The Bluetooth USB transport addendum mandates that the data (not streaming voice) endpoints
       be in the first interface descriptor (interface 0) */
    USB_GetNextDescriptorOfType(&ConfigDescriptorSize, &ConfigDescriptorData, DTYPE_Interface);

    /* Ensure that an interface was found, and the end of the descriptor was not reached */
    if (!(ConfigDescriptorSize))
      return false;

    while (!(DataINEndpoint) || !(DataOUTEndpoint) || !(EventsEndpoint))
    {
        /* Get the next Bluetooth interface's data endpoint descriptor */
        if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
                                      DComp_NextInterfaceBluetoothDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
        {
            /* Data endpoints not found within the first bluetooth device interface, error out */
            return false;
        }

        /* Retrieve the endpoint address from the endpoint descriptor */
        USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);

        uint8_t EndpointType = (EndpointData->Attributes & EP_TYPE_MASK);

        /* If the endpoint is a IN type endpoint */
        if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN)
        {	
            /* Check if the found endpoint is a interrupt or bulk type descriptor */
            if (EndpointType == EP_TYPE_BULK)
              DataINEndpoint = EndpointData;
            else if (EndpointType == EP_TYPE_INTERRUPT)
              EventsEndpoint = EndpointData;
        }
        else
        {
            if (EndpointType == EP_TYPE_BULK)
              DataOUTEndpoint = EndpointData;
        }
    }

    /* Configure the Bluetooth data IN pipe */
    Pipe_ConfigurePipe(BLUETOOTH_DATA_IN_PIPE, EP_TYPE_BULK, PIPE_TOKEN_IN,
                       DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE);

    /* Configure the Bluetooth data OUT pipe */
    Pipe_ConfigurePipe(BLUETOOTH_DATA_OUT_PIPE, EP_TYPE_BULK, PIPE_TOKEN_OUT,
                       DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, PIPE_BANK_SINGLE);

    /* Configure the Bluetooth events pipe */
    Pipe_ConfigurePipe(BLUETOOTH_EVENTS_PIPE, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN,
                       EventsEndpoint->EndpointAddress, EventsEndpoint->EndpointSize, PIPE_BANK_SINGLE);
    Pipe_SetInterruptPeriod(EventsEndpoint->PollingIntervalMS);

    BluetoothAdapter_IsActive = true;
    return true;
}
开发者ID:Martin-P,项目名称:lpc1768-control-bluetooth-dongle,代码行数:81,代码来源:BluetoothAdapter.c

示例12: SI_Host_ConfigurePipes

uint8_t SI_Host_ConfigurePipes(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo,
                               uint16_t ConfigDescriptorSize,
                               void* ConfigDescriptorData)
{
    USB_Descriptor_Endpoint_t*  DataINEndpoint      = NULL;
    USB_Descriptor_Endpoint_t*  DataOUTEndpoint     = NULL;
    USB_Descriptor_Endpoint_t*  EventsEndpoint      = NULL;
    USB_Descriptor_Interface_t* StillImageInterface = NULL;

    memset(&SIInterfaceInfo->State, 0x00, sizeof(SIInterfaceInfo->State));

    if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
      return SI_ENUMERROR_InvalidConfigDescriptor;

    while (!(DataINEndpoint) || !(DataOUTEndpoint))
    {
        if (!(StillImageInterface) ||
            USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
                                      DCOMP_SI_Host_NextSIInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
        {
            if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
                                          DCOMP_SI_Host_NextSIInterface) != DESCRIPTOR_SEARCH_COMP_Found)
            {
                return SI_ENUMERROR_NoCompatibleInterfaceFound;
            }

            StillImageInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);

            DataINEndpoint  = NULL;
            DataOUTEndpoint = NULL;
            EventsEndpoint  = NULL;

            continue;
        }

        USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);

        if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
        {
            if ((EndpointData->Attributes & EP_TYPE_MASK) == EP_TYPE_INTERRUPT)
              EventsEndpoint = EndpointData;
            else
              DataINEndpoint = EndpointData;
        }
        else
        {
            DataOUTEndpoint = EndpointData;
        }
    }

    for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++)
    {
        if (PipeNum == SIInterfaceInfo->Config.DataINPipeNumber)
        {
            Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_IN,
                               DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize,
                               SIInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);

            SIInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize;
        }
        else if (PipeNum == SIInterfaceInfo->Config.DataOUTPipeNumber)
        {
            Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_OUT,
                               DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize,
                               SIInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);

            SIInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize;
        }
        else if (PipeNum == SIInterfaceInfo->Config.EventsPipeNumber)
        {
            Pipe_ConfigurePipe(PipeNum, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN,
                               EventsEndpoint->EndpointAddress, EventsEndpoint->EndpointSize,
                               SIInterfaceInfo->Config.EventsPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);
            Pipe_SetInterruptPeriod(EventsEndpoint->PollingIntervalMS);

            SIInterfaceInfo->State.EventsPipeSize = EventsEndpoint->EndpointSize;
        }
    }

    SIInterfaceInfo->State.InterfaceNumber = StillImageInterface->InterfaceNumber;
    SIInterfaceInfo->State.IsActive = true;

    return SI_ENUMERROR_NoError;
}
开发者ID:C3MA,项目名称:hexabus,代码行数:84,代码来源:StillImage.c

示例13: ProcessConfigurationDescriptor

/** Reads and processes an attached device's descriptors, to determine compatibility and pipe configurations. This
 *  routine will read in the entire configuration descriptor, and configure the hosts pipes to correctly communicate
 *  with compatible devices.
 *
 *  This routine searches for a Streaming Audio interface descriptor containing a valid Isochronous audio endpoint.
 *
 *  \return An error code from the \ref AudioHost_GetConfigDescriptorDataCodes_t enum.
 */
uint8_t ProcessConfigurationDescriptor(void)
{
    uint8_t  ConfigDescriptorData[512];
    void*    CurrConfigLocation = ConfigDescriptorData;
    uint16_t CurrConfigBytesRem;

    USB_Descriptor_Interface_t* AudioControlInterface   = NULL;
    USB_Descriptor_Interface_t* AudioStreamingInterface = NULL;
    USB_Descriptor_Endpoint_t*  DataOUTEndpoint         = NULL;

    /* Retrieve the entire configuration descriptor into the allocated buffer */
    switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
    {
        case HOST_GETCONFIG_Successful:
            break;
        case HOST_GETCONFIG_InvalidData:
            return InvalidConfigDataReturned;
        case HOST_GETCONFIG_BuffOverflow:
            return DescriptorTooLarge;
        default:
            return ControlError;
    }

    while (!(DataOUTEndpoint))
    {
        /* See if we've found a likely compatible interface, and if there is an endpoint within that interface */
        if (!(AudioControlInterface) ||
            USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                      DComp_NextAudioInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
        {
            /* Check if we haven't found an Audio Control interface yet, or if we have run out of related Audio Streaming interfaces */
            if (!(AudioControlInterface) ||
                USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                          DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found)
            {
                /* Find a new Audio Control interface if the current one doesn't contain a compatible streaming interface */
                if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                              DComp_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)
                {
                    /* Descriptor not found, error out */
                    return NoCompatibleInterfaceFound;
                }

                /* Save the interface in case we need to refer back to it later */
                AudioControlInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);

                /* Find the next Audio Streaming interface within that Audio Control interface */
                if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                              DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found)
                {
                    /* Descriptor not found, error out */
                    return NoCompatibleInterfaceFound;
                }
            }

            /* Save the interface in case we need to refer back to it later */
            AudioStreamingInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);

            /* Skip the remainder of the loop as we have not found an endpoint yet */
            continue;
        }

        /* Retrieve the endpoint address from the endpoint descriptor */
        USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t);

        /* Save the endpoint if it is an OUT type endpoint */
        if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_OUT)
          DataOUTEndpoint = EndpointData;
    }

    StreamingInterfaceIndex      = AudioStreamingInterface->InterfaceNumber;
    StreamingInterfaceAltSetting = AudioStreamingInterface->AlternateSetting;
    StreamingEndpointAddress     = DataOUTEndpoint->EndpointAddress;

    /* Configure the Audio data OUT pipe */
    Pipe_ConfigurePipe(AUDIO_DATA_OUT_PIPE, EP_TYPE_ISOCHRONOUS, DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, 2);

    /* Valid data found, return success */
    return SuccessfulConfigRead;
}
开发者ID:DuinoPilot,项目名称:lufa,代码行数:88,代码来源:ConfigDescriptor.c

示例14: ProcessConfigurationDescriptor

/** Reads and processes an attached device's descriptors, to determine compatibility and pipe configurations. This
 *  routine will read in the entire configuration descriptor, and configure the hosts pipes to correctly communicate
 *  with compatible devices.
 *
 *  This routine searches for a HID interface descriptor containing at least one Interrupt type IN endpoint and HID descriptor.
 *
 *  \return An error code from the KeyboardHostWithParser_GetConfigDescriptorDataCodes_t enum.
 */
uint8_t ProcessConfigurationDescriptor(void)
{
    uint8_t* ConfigDescriptorData;
    uint16_t ConfigDescriptorSize;
    
    /* Get Configuration Descriptor size from the device */
    if (USB_GetDeviceConfigDescriptor(&ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)
      return ControlError;
    
    /* Ensure that the Configuration Descriptor isn't too large */
    if (ConfigDescriptorSize > MAX_CONFIG_DESCRIPTOR_SIZE)
      return DescriptorTooLarge;
      
    /* Allocate enough memory for the entire config descriptor */
    ConfigDescriptorData = alloca(ConfigDescriptorSize);

    /* Retrieve the entire configuration descriptor into the allocated buffer */
    USB_GetDeviceConfigDescriptor(&ConfigDescriptorSize, ConfigDescriptorData);
    
    /* Validate returned data - ensure first entry is a configuration header descriptor */
    if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
      return InvalidConfigDataReturned;
    
    /* Get the keyboard interface from the configuration descriptor */
    if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
                                  DComp_NextKeyboardInterface) != DESCRIPTOR_SEARCH_COMP_Found)
    {
        /* Descriptor not found, error out */
        return NoHIDInterfaceFound;
    }
    
    /* Get the keyboard interface's HID descriptor */
    if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
                                  DComp_NextHID) != DESCRIPTOR_SEARCH_COMP_Found)
    {
        /* Descriptor not found, error out */
        return NoHIDDescriptorFound;
    }

    /* Save the HID report size for later use */
    HIDReportSize = DESCRIPTOR_CAST(ConfigDescriptorData, USB_Descriptor_HID_t).HIDReportLength;

    /* Get the keyboard interface's data endpoint descriptor */
    if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
                                  DComp_NextInterfaceKeyboardDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
    {
        /* Descriptor not found, error out */
        return NoEndpointFound;
    }
    
    /* Retrieve the endpoint address from the endpoint descriptor */
    USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);

    /* Configure the keyboard data pipe */
    Pipe_ConfigurePipe(KEYBOARD_DATAPIPE, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN,
                       EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE);

    Pipe_SetInfiniteINRequests();
            
    /* Valid data found, return success */
    return SuccessfulConfigRead;
}
开发者ID:unnamet,项目名称:estick-jtag,代码行数:70,代码来源:ConfigDescriptor.c

示例15: USB_Host_ProcessNextHostState

void USB_Host_ProcessNextHostState(void)
{
    uint8_t ErrorCode    = HOST_ENUMERROR_NoError;
    uint8_t SubErrorCode = HOST_ENUMERROR_NoError;

    static uint16_t WaitMSRemaining;
    static uint8_t  PostWaitState;

    switch (USB_HostState)
    {
        case HOST_STATE_WaitForDevice:
            if (WaitMSRemaining)
            {
                if ((SubErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
                {
                    USB_HostState = PostWaitState;
                    ErrorCode     = HOST_ENUMERROR_WaitStage;
                    break;
                }
                
                if (!(--WaitMSRemaining))
                  USB_HostState = PostWaitState;
            }
        
            break;
        case HOST_STATE_Powered:
            WaitMSRemaining = HOST_DEVICE_SETTLE_DELAY_MS;
        
            USB_HostState = HOST_STATE_Powered_WaitForDeviceSettle;
            break;
        case HOST_STATE_Powered_WaitForDeviceSettle:
            if (WaitMSRemaining--)
            {
                _delay_ms(1);
                break;
            }
            else
            {
                USB_Host_VBUS_Manual_Off();

                USB_OTGPAD_On();
                USB_Host_VBUS_Auto_Enable();
                USB_Host_VBUS_Auto_On();
                
                USB_HostState = HOST_STATE_Powered_WaitForConnect;
            }
            
            break;
        case HOST_STATE_Powered_WaitForConnect:		
            if (USB_INT_HasOccurred(USB_INT_DCONNI))
            {	
                USB_INT_Clear(USB_INT_DCONNI);
                USB_INT_Clear(USB_INT_DDISCI);

                USB_INT_Clear(USB_INT_VBERRI);
                USB_INT_Enable(USB_INT_VBERRI);
                    
                USB_Host_ResumeBus();
                Pipe_ClearPipes();
                
                HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Powered_DoReset);
            }

            break;
        case HOST_STATE_Powered_DoReset:
            USB_Host_ResetDevice();

            HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Powered_ConfigPipe);
            break;
        case HOST_STATE_Powered_ConfigPipe:
            Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL,
                               PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP,
                               PIPE_CONTROLPIPE_DEFAULT_SIZE, PIPE_BANK_SINGLE);		
        
            if (!(Pipe_IsConfigured()))
            {
                ErrorCode    = HOST_ENUMERROR_PipeConfigError;
                SubErrorCode = 0;
                break;
            }

            USB_HostState = HOST_STATE_Default;
            break;
        case HOST_STATE_Default:
            USB_ControlRequest = (USB_Request_Header_t)
                {
                    .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
                    .bRequest      = REQ_GetDescriptor,
                    .wValue        = (DTYPE_Device << 8),
                    .wIndex        = 0,
                    .wLength       = 8,
                };

            uint8_t DataBuffer[8];

            if ((SubErrorCode = USB_Host_SendControlRequest(DataBuffer)) != HOST_SENDCONTROL_Successful)
            {
                ErrorCode = HOST_ENUMERROR_ControlError;
                break;
            }
//.........这里部分代码省略.........
开发者ID:123jefferson,项目名称:MiniBloq-Sparki,代码行数:101,代码来源:Host.c


注:本文中的Pipe_ConfigurePipe函数示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。