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

📄 ctrlreq.c

📁 FS7805 使用APLIF的demoFS7805 使用APLIF的demo
💻 C
📖 第 1 页 / 共 2 页
字号:
        case GD_DEVICE_QUALIFIER:
            GD_DeviceQualDscr();
            break;
        case GD_OTHER_SPEED_CONFIGURATION:
            if (!HighSpeed)
            {
                GD_ConfigDscr();
            }
            else
            {
                GD_OtherConfigDscr();
            }
            break;
        default:
            USB_STALL_EP0();
    }
}
/*$PAGE*/

/*
*********************************************************************************************************
*                                             DR_GETCONFIGURATION
*
* Description: Get configuration
*
* Arguments  : none
*
* Returns    : none
*********************************************************************************************************
*/
void  DR_GetConfiguration (void)
{
    EP0TXDAT    = Configuration;
    EP0TXCNT    = 1;
    EP0TXCS     = EP0TXCS | bmTX0_EN;
    while (EP0TXCS & bmTX0_EN);
}
/*$PAGE*/

/*
*********************************************************************************************************
*                                             DR_SETCONFIGURATION
*
* Description: Set configuration
*
* Arguments  : none
*
* Returns    : none
*********************************************************************************************************
*/
void  DR_SetConfiguration (void)
{
    Configuration   = SetupData[2];
    EP0TXCNT        = 0;
    EP0TXCS         = EP0TXCS | bmTX0_EN;
    while (EP0TXCS & bmTX0_EN);
}
/*$PAGE*/

/*
*********************************************************************************************************
*                                             DR_GETINTERFACE
*
* Description: Get interface
*
* Arguments  : none
*
* Returns    : none
*********************************************************************************************************
*/
void  DR_GetInterface (void)
{
    EP0TXDAT    = AlternateSetting;                    // Write data
    EP0TXCNT    = 1;                                   // Write data length
    EP0TXCS     = EP0TXCS | bmTX0_EN;                  // Enable TX
    while (EP0TXCS & bmTX0_EN);
}
/*$PAGE*/

/*
*********************************************************************************************************
*                                             DR_SETINTERFACE
*
* Description: Set interface
*
* Arguments  : none
*
* Returns    : none
*********************************************************************************************************
*/
void  DR_SetInterface (void)
{
    AlternateSetting    = SetupData[2];
    EP0TXCNT            = 0;
    EP0TXCS             = EP0TXCS | bmTX0_EN;
    while (EP0TXCS & bmTX0_EN);
}
/*$PAGE*/

/*
*********************************************************************************************************
*                                             GD_DEVICEDSCR
*
* Description: Get device descriptor
*
* Arguments  : none
*
* Returns    : none
*********************************************************************************************************
*/
void  GD_DeviceDscr (void)
{
    BOOLEAN ShortPacket;
    INT8U   i = 0, j, count, SendSize;

    count               = SetupData[6];
    ShortPacket         = FALSE;
    if (count > DSCR_DEVICE_LEN)
    {
        count           = DSCR_DEVICE_LEN;
        ShortPacket     = TRUE;
    }

    while (count)
    {
        if (count < PacketSize)
        {
            SendSize    = count;
        }
        else
        {
            SendSize    = PacketSize;
        }
        count           = count - SendSize;
        for (j = 0; j < SendSize; j++)
        {
            EP0TXDAT    = DeviceDscr[i++];
        }
        EP0TXCNT        = SendSize;
        EP0TXCS         = EP0TXCS | bmTX0_EN;
        while (EP0TXCS & bmTX0_EN);
    }
    if (ShortPacket && (SendSize == PacketSize))
    {
        EP0TXCNT        = 0;
        EP0TXCS         = EP0TXCS | bmTX0_EN;
        while (EP0TXCS & bmTX0_EN);
    }
}
/*$PAGE*/

/*
*********************************************************************************************************
*                                             GD_DEVICEQUALDSCR
*
* Description: Get device qualifier descriptor
*
* Arguments  : none
*
* Returns    : none
*********************************************************************************************************
*/
void  GD_DeviceQualDscr (void)
{
    BOOLEAN ShortPacket;
    INT8U   i = 0, j, count, SendSize;

    count               = SetupData[6];
    ShortPacket         = FALSE;
    if (count > DSCR_DEVICE_QUALIFIER_LEN)
    {
        count           = DSCR_DEVICE_QUALIFIER_LEN;
        ShortPacket     = TRUE;
    }

    while (count)
    {
        if (count < PacketSize)
        {
            SendSize    = count;
        }
        else
        {
            SendSize    = PacketSize;
        }
        count           = count - SendSize;
        for (j = 0; j < SendSize; j++)
        {
            EP0TXDAT    = DeviceQualDscr[i++];
        }
        EP0TXCNT        = SendSize;
        EP0TXCS         = EP0TXCS | bmTX0_EN;
        while (EP0TXCS & bmTX0_EN);
    }
    if (ShortPacket && (SendSize == PacketSize))
    {
        EP0TXCNT        = 0;
        EP0TXCS         = EP0TXCS | bmTX0_EN;
        while (EP0TXCS & bmTX0_EN);
    }
}
/*$PAGE*/

/*
*********************************************************************************************************
*                                             GD_CONFIGDSCR
*
* Description: Get config descriptor
*
* Arguments  : none
*
* Returns    : none
*********************************************************************************************************
*/
void  GD_ConfigDscr (void)
{
    BOOLEAN ShortPacket;
    INT8U   i = 0, j, count, SendSize;

    count               = SetupData[6];
    ShortPacket         = FALSE;
    if (count > DSCR_CONFIGURATION_TOTALLEN)
    {
        count           = DSCR_CONFIGURATION_TOTALLEN;
        ShortPacket     = TRUE;
    }

    while (count)
    {
        if (count < PacketSize)
        {
            SendSize    = count;
        }
        else
        {
            SendSize    = PacketSize;
        }
        count           = count - SendSize;
        for (j = 0; j < SendSize; j++)
        {
            EP0TXDAT    = HighSpeedConfigDscr[i++];
        }
        EP0TXCNT        = SendSize;
        EP0TXCS         = EP0TXCS | bmTX0_EN;
        while (EP0TXCS & bmTX0_EN);
    }
    if (ShortPacket && (SendSize == PacketSize))
    {
        EP0TXCNT        = 0;
        EP0TXCS         = EP0TXCS | bmTX0_EN;
        while (EP0TXCS & bmTX0_EN);
    }
}
/*$PAGE*/

/*
*********************************************************************************************************
*                                             GD_OTHERCONFIGDSCR
*
* Description: Get other configuration descriptor
*
* Arguments  : none
*
* Returns    : none
*********************************************************************************************************
*/
void  GD_OtherConfigDscr (void)
{
    BOOLEAN ShortPacket;
    INT8U   i = 0, j, count, SendSize;

    count               = SetupData[6];
    ShortPacket         = FALSE;
    if (count > DSCR_CONFIGURATION_TOTALLEN)
    {
        count           = DSCR_CONFIGURATION_TOTALLEN;
        ShortPacket     = TRUE;
    }

    while (count)
    {
        if (count < PacketSize)
        {
            SendSize    = count;
        }
        else
        {
            SendSize    = PacketSize;
        }
        count           = count - SendSize;
        for (j = 0; j < SendSize; j++)
        {
            EP0TXDAT    = FullSpeedConfigDscr[i++];
        }
        EP0TXCNT        = SendSize;
        EP0TXCS         = EP0TXCS | bmTX0_EN;
        while (EP0TXCS & bmTX0_EN);
    }
    if (ShortPacket && (SendSize == PacketSize))
    {
        EP0TXCNT        = 0;
        EP0TXCS         = EP0TXCS | bmTX0_EN;
        while (EP0TXCS & bmTX0_EN);
    }
}
/*$PAGE*/

/*
*********************************************************************************************************
*                                             GD_STRING
*
* Description: Get string
*
* Arguments  : none
*
* Returns    : none
*********************************************************************************************************
*/
void  GD_String (void)
{
    BOOLEAN ShortPacket;
    INT8U   i = 0, j, count, SendSize;

    count               = SetupData[6];
    ShortPacket         = FALSE;
    switch (SetupData[2])
    {
        case 0:
            if (count > DSCR_STRING0_LEN)
            {
                count           = DSCR_STRING0_LEN;
                ShortPacket     = TRUE;
            }

            while (count)
            {
                if (count < PacketSize)
                {
                    SendSize    = count;
                }
                else
                {
                    SendSize    = PacketSize;
                }
                count           = count - SendSize;
                for (j = 0; j < SendSize; j++)
                {
                    EP0TXDAT    = StringDscr0[i++];
                }
                EP0TXCNT        = SendSize;
                EP0TXCS         = EP0TXCS | bmTX0_EN;
                while (EP0TXCS & bmTX0_EN);
            }
            break;
        case 1:
            if (count > DSCR_STRING1_LEN)
            {
                count           = DSCR_STRING1_LEN;
                ShortPacket     = TRUE;
            }

            while (count)
            {
                if (count < PacketSize)
                {
                    SendSize    = count;
                }
                else
                {
                    SendSize    = PacketSize;
                }
                count           = count - SendSize;
                for (j = 0; j < SendSize; j++)
                {
                    EP0TXDAT    = StringDscr1[i++];
                }
                EP0TXCNT        = SendSize;
                EP0TXCS         = EP0TXCS | bmTX0_EN;
                while (EP0TXCS & bmTX0_EN);
            }
            break;
        case 2:
            if (count > DSCR_STRING2_LEN)
            {
                count           = DSCR_STRING2_LEN;
                ShortPacket     = TRUE;
            }

            while (count)
            {
                if (count < PacketSize)
                {
                    SendSize    = count;
                }
                else
                {
                    SendSize    = PacketSize;
                }
                count           = count - SendSize;
                for (j = 0; j < SendSize; j++)
                {
                    EP0TXDAT    = StringDscr2[i++];
                }
                EP0TXCNT        = SendSize;
                EP0TXCS         = EP0TXCS | bmTX0_EN;
                while (EP0TXCS & bmTX0_EN);
            }
            break;
        default:
            USB_STALL_EP0();
            return;
    }
    if (ShortPacket && (SendSize == PacketSize))
    {
        EP0TXCNT        = 0;
        EP0TXCS         = EP0TXCS | bmTX0_EN;
        while (EP0TXCS & bmTX0_EN);
    }
}
/*$PAGE*/

⌨️ 快捷键说明

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