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

📄 ctlout.c

📁 凌阳MP3 spSPCA755yuanma
💻 C
字号:
/*++

Copyright (c) 2001 Sunplus Technology Co., Ltd.

Module Name:

        ctlout.c

Abstract:

        Module related to out packet of control pipe

Environment:

        Keil C51 Compiler

Revision History:

        08/28/2001      Chi-Yeh Tsai    created                 

--*/

//=============================================================================
//Header file
//=============================================================================
#include "general.h"
#include "ctlout.h"
#include "ctlsetup.h"
#include "ctlin.h"
//#include "usbaudc.h"
//#include "usbsidc.h"
#include "usbmsdc2.h"
#include "stdreq.h"
#include "vndreq.h"
#include "rsvreq.h"
#include "main.h"
//#include "uiflow.h"

//=============================================================================
//Symbol
//=============================================================================
//-----------------------------------------------------------------------------
//Constant
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//Variable
//-----------------------------------------------------------------------------
data BIT _GUSBInPVID=0;
//=============================================================================
//Program
//=============================================================================
//-----------------------------------------------------------------------------
//CTLOUT_Packet
//-----------------------------------------------------------------------------
void CTLOUT_Packet(void) USING_1
/*++

Routine Description:

        process out packet of control pipe

Arguments:

        none

Return Value:

        none

--*/
{
        UCHAR type;

        if (G_ucCtrlPhase == K_OutDataPhase)              //out data phase                
        {
                //check Type of bmRequestType
                type = G_pCtrlCommand->bmRequestType & 0x60;
                if (type == 0x00)
                {
                        CTLOUT_StandardRequest();       //Standard request
                }
                else if (type == 0x20)
                {
                        CTLOUT_ClassRequest();          //Class request
                }
                else if (type == 0x40)
                {
                        CTLOUT_VendorRequest();         //Vendor request
                }
                else //if (type == 0x60)
                {
                        CTLOUT_ReservedRequest();       //Reserved request
                }
        }
        else if (G_ucCtrlPhase == K_OutResponsePhase)     //out response phase
        {
                //just out zero packet - 0 byte in EP0 FIFO
		//patch4.3@richie@oh0530
		G_ucCtrlPhase = K_CommandPhase;
		
		//if (G_pCtrlCommand->bRequest == 0xfe) //Deferred Procedure Call in main lock loop
		//	_GUSBInPVID=1;

        }
        else                                            //phase transition error
        {
                //phase transition error - out packet should not appear
                //                         at current phase
                //just out zero packet - 0 byte in EP0 FIFO
        }
}

//-----------------------------------------------------------------------------
//CTLOUT_StandardRequest
//-----------------------------------------------------------------------------
void CTLOUT_StandardRequest(void) USING_1
/*++

Routine Description:

        process out packet of standard request

Arguments:

        none

Return Value:

        none

--*/
{
        CTLOUT_GetOutPacketData();

        //phase transition
        if ((G_ucCtrlPacketIndex == 8) &&   //bMaxPacketSize of Control pipe
            (G_usCtrlDataIndex < G_usCtrlDataLength))
        {
                G_ucCtrlPhase = K_OutDataPhase;
        }
        else
        {
                STDREQ_PostOutDataPhase();
                G_ucCtrlPhase = K_InResponsePhase;
                CTLIN_Packet();
        }
}

//-----------------------------------------------------------------------------
//CTLOUT_ClassRequest
//-----------------------------------------------------------------------------
void CTLOUT_ClassRequest(void) USING_1
/*++

Routine Description:

        process out packet of class request        

Arguments:

        none

Return Value:

        none

--*/
{


//richie@0204
//        if (((G_pCtrlCommand->wIndex == K_StorageInterface1) ||  //reserved:0 / bInterfaceNumber:K_StorageInterface1
//             (G_pCtrlCommand->wIndex == K_StorageInterface2)) && //reserved:0 / bInterfaceNumber:K_StorageInterface2
//             (G_pCtrlCommand->wValue == 0x0000))       //reserved:0
	   //if (G_ui_status == K_UI_mass_storage)
//        if ((G_UIStatus & 0xff00) == K_UISTATUS_USBMODE_MASS)  //yichang@replace
//        {
                CTLOUT_GetOutPacketData();

                if ((G_ucCtrlPacketIndex == 8) &&   //bMaxPacketSize of Control pipe
                    (G_usCtrlDataIndex < G_usCtrlDataLength))
                {
                        G_ucCtrlPhase = K_OutDataPhase;
                }
                else
                {
                        USBMSDC_BoPostOutDataPhase();
                        G_ucCtrlPhase = K_InResponsePhase;
                        CTLIN_Packet();
                }
//        }

}
//-----------------------------------------------------------------------------
// CTLOUT_VendorRequest
//-----------------------------------------------------------------------------
void CTLOUT_VendorRequest(void) USING_1
/*++

Routine Description:

        process out packet of vendor request

Arguments:

        none

Return Value:

        none

--*/
{
#if (USBVendor_OPTION==1)

        CTLOUT_GetOutPacketData();

        //phase transition
        if ((G_ucCtrlPacketIndex == 8) &&   //bMaxPacketSize of Control pipe
            (G_usCtrlDataIndex < G_usCtrlDataLength))
        {
                G_ucCtrlPhase = K_OutDataPhase;
        }
        else
        {
                VNDREQ_PostOutDataPhase();
                G_ucCtrlPhase = K_InResponsePhase;
                CTLIN_Packet();
        }
#endif
}

//-----------------------------------------------------------------------------
//CTLOUT_ReservedRequest
//-----------------------------------------------------------------------------
void CTLOUT_ReservedRequest(void) USING_1
/*++

Routine Description:

        process out packet of reserved request

Arguments:

        none

Return Value:

        none

--*/
{
}

//-----------------------------------------------------------------------------
//CTLOUT_GetOutPacketData
//-----------------------------------------------------------------------------
void CTLOUT_GetOutPacketData(void) USING_1
/*++

Routine Description:

        get data for current Out packet

Arguments:

        none

Return Value:

        none

--*/
{
        G_ucCtrlPacketIndex = 0;            //initialize packet index
        while ((G_ucCtrlPacketIndex < 8) && (G_usCtrlDataIndex < G_usCtrlDataLength))
        {
                G_ucCtrlData[G_usCtrlDataIndex] = XBYTE[0x2500];
                G_ucCtrlPacketIndex++;
                G_usCtrlDataIndex++;
        }
}

⌨️ 快捷键说明

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