📄 f32x_usb_standard_requests.c
字号:
//-----------------------------------------------------------------------------
// F32x_USB_Standard_Requests.c
//-----------------------------------------------------------------------------
// Copyright 2005 Silicon Laboratories, Inc.
// http://www.silabs.com
//
// Program Description:
//
// Source file for USB firmware. Includes service routine
// for usb standard device requests.
//
//
// How To Test: See Readme.txt
//
//
// FID: 32X000018
// Target: C8051F32x
// Tool chain: Keil C51 7.50 / Keil EVAL C51
// Silicon Laboratories IDE version 2.6
// Command Line: See Readme.txt
// Project Name: F32x_USB_Bulk
//
//
// Release 1.3
// -All changes by GP
// -21 NOV 2005
// -Changed revision number to match project revision
// No content changes to this file
// -Modified file to fit new formatting guidelines
// -Changed file name from usb_stdreq.c
//
//
// Release 1.2
// -Initial Revision (JS)
// -XX AUG 2003
//
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include "c8051F320.h"
#include "F32x_USB_Registers.h"
#include "F32x_USB_Structs.h"
#include "F32x_USB_Main.h"
#include "F32x_USB_Descriptors.h"
#include "F32x_USB_Config.h"
#include "F32x_USB_Request.h"
//-----------------------------------------------------------------------------
// Extern Global Variables
//-----------------------------------------------------------------------------
extern code DESCRIPTORS gDescriptorMap;
extern DEVICE_STATUS gDeviceStatus;
extern EP_STATUS gEp0Status;
extern EP_STATUS gEp2OutStatus;
extern EP_STATUS gEp1InStatus;
extern EP0_COMMAND gEp0Command;
//-----------------------------------------------------------------------------
// Global Variables
//-----------------------------------------------------------------------------
BYTE bEpState;
UINT uNumBytes;
PIF_STATUS pIfStatus;
//------------------------------------------------------------------------
// Standard Request Routines
//------------------------------------------------------------------------
//
// These functions should be called when an endpoint0 command has
// been received with a corresponding "bRequest" field.
//
// - Each routine performs all command field checking, and
// modifies fields of the Ep0Status structure accordingly
//
// After a call to a standard request routine, the calling routine
// should check Ep0Status.bEpState to determine the required action
// (i.e., send a STALL for EP_ERROR, load the FIFO for EP_TX).
// For transmit status, the data pointer (Ep0Status.pData),
// and data length (Ep0Status.uNumBytes) are prepared before the
// standard request routine returns. The calling routine must write
// the data to the FIFO and handle all data transfer
//-----------------------------------------------------------------------------
// SetAddressRequest
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
//-----------------------------------------------------------------------------
void SetAddressRequest ()
{
// Index and Length fields must be zero
// Device state must be default or addressed
if ((gEp0Command.wIndex.i) || (gEp0Command.wLength.i) ||
(gDeviceStatus.bDevState == DEV_CONFIG))
{
bEpState = EP_ERROR;
}
else
{
// Assign new function address
UWRITE_BYTE(FADDR, gEp0Command.wValue.c[1]);
if (gDeviceStatus.bDevState == DEV_DEFAULT &&
gEp0Command.wValue.c[1] != 0)
{
gDeviceStatus.bDevState = DEV_ADDRESS;
}
if (gDeviceStatus.bDevState == DEV_ADDRESS &&
gEp0Command.wValue.c[1] == 0)
{
gDeviceStatus.bDevState = DEV_ADDRESS;
}
bEpState = EP_IDLE;
}
gEp0Status.bEpState = bEpState;
}
//-----------------------------------------------------------------------------
// SetFeatureRequest
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
//-----------------------------------------------------------------------------
void SetFeatureRequest ()
{
// Length field must be zero
// Device state must be configured, or addressed with Command Index
// field == 0
if ((gEp0Command.wLength.i != 0) ||
(gDeviceStatus.bDevState == DEV_DEFAULT) ||
(gDeviceStatus.bDevState == DEV_ADDRESS && gEp0Command.wIndex.i != 0))
{
bEpState = EP_ERROR;
}
// Handle based on recipient
switch(gEp0Command.bmRequestType & CMD_MASK_RECIP)
{
// Device Request - Return error as remote wakeup is not supported
case CMD_RECIP_DEV:
bEpState = EP_ERROR;
break;
// Endpoint Request
case CMD_RECIP_EP:
if (gEp0Command.wValue.i == ENDPOINT_HALT)
{
bEpState = HaltEndpoint(gEp0Command.wIndex.i);
break;
}
else
{
bEpState = EP_ERROR;
break;
}
default:
bEpState = EP_ERROR;
break;
}
gEp0Status.bEpState = bEpState;
}
//-----------------------------------------------------------------------------
// ClearFeatureRequest
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
//-----------------------------------------------------------------------------
void ClearFeatureRequest ()
{
// Length field must be zero
// Device state must be configured, or addressed with Command Index
// field == 0
if ((gEp0Command.wLength.i != 0) || (gDeviceStatus.bDevState == DEV_DEFAULT) ||
(gDeviceStatus.bDevState == DEV_ADDRESS && gEp0Command.wIndex.i != 0))
{
bEpState = EP_ERROR;
}
// Handle based on recipient
switch(gEp0Command.bmRequestType & CMD_MASK_RECIP)
{
// Device Request
case CMD_RECIP_DEV:
// Remote wakeup not supported
bEpState = EP_ERROR;
break;
// Endpoint Request
case CMD_RECIP_EP:
if (gEp0Command.wValue.i == ENDPOINT_HALT)
{
// Enable the selected endpoint.
bEpState = EnableEndpoint(gEp0Command.wIndex.i);
break;
}
else
{
bEpState = EP_ERROR;
break;
}
default:
bEpState = EP_ERROR;
break;
}
gEp0Status.bEpState = bEpState;
}
//-----------------------------------------------------------------------------
// SetConfigurationRequest
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
//-----------------------------------------------------------------------------
void SetConfigurationRequest ()
{
// Index and Length fields must be zero
// Device state must be addressed or configured
if ((gEp0Command.wIndex.i) || (gEp0Command.wLength.i) ||
(gDeviceStatus.bDevState == DEV_DEFAULT))
{
bEpState = EP_ERROR;
}
else
{
// Make sure assigned configuration exists
if (gEp0Command.wValue.c[1] >
gDescriptorMap.bStdDevDsc[std_bNumConfigurations])
{
bEpState = EP_ERROR;
}
// Handle zero configuration assignment
else if (gEp0Command.wValue.c[1] == 0)
gDeviceStatus.bDevState = DEV_ADDRESS;
// Select the assigned configuration
else
bEpState = SetConfiguration(gEp0Command.wValue.c[1]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -