📄 ctlout.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 + -