📄 usbd_protenum.c
字号:
/*======================================================================
// Function_Name: GetPowerSaveMode
//
// description : Return the setting value of Power saving mode
//
// Inquire value of Power saving mode from lower module, return data to specified pointer
//
// argument : *pParamData Pointer of parameter data
//
// return : STATUS_SUCCESS Success
// STATUS_UNSUCCESSFUL Error
// STATUS_NOT_OPENED Not opened
// STATUS_NOT_IMPLEMENTED Not implemented
========================================================================*/
LONG GetPowerSaveMode( void *pParamData )
{
USBD_FUNC_POWER sPower;
UCHAR *pPowerSaveMode;
LONG dwAPIStatus;
/********************************/
/* Get parameter from lower module */
/********************************/
dwAPIStatus = USBD_FuncGetParameter(USBD_FUNC_POWER_PARAM, &sPower, sizeof(sPower));
if( dwAPIStatus != STATUS_SUCCESS){
/* Unable to get */
return dwAPIStatus;
}
pPowerSaveMode = (UCHAR *)pParamData;
*pPowerSaveMode = sPower.bDetach | sPower.bSuspend;
return STATUS_SUCCESS;
}
/*======================================================================
// Function_Name: GetHWFeatureMode
//
// description : Return the setting value of H/W function mode
//
// Inquire value of H/W function mode from lower module, return data to specified pointer
//
// argument : *pParamData Pointer of parameter data
//
// return : STATUS_SUCCESS Success
// STATUS_UNSUCCESSFUL Error
// STATUS_NOT_OPENED Not opened
// STATUS_NOT_IMPLEMENTED Not implemented
========================================================================*/
LONG GetHWFeatureMode( void *pParamData )
{
USBD_FUNC_HWFEATURE sHWFeature;
USHORT *pwHWFeatureMode;
LONG dwAPIStatus;
/********************************/
/* Get parameter from lower module */
/********************************/
dwAPIStatus = USBD_FuncGetParameter(USBD_FUNC_HWFEATURE_PARAM, &sHWFeature, sizeof(sHWFeature));
if( dwAPIStatus != STATUS_SUCCESS){
/* Unable to get */
return dwAPIStatus;
}
pwHWFeatureMode = (USHORT *)pParamData;
*pwHWFeatureMode = 0;
if( sHWFeature.bHwAutoNego == 1 ){
/* Enable Auto Negotiation */
*pwHWFeatureMode |= USBD_PROT_ENUM_AUTO_NEGOTIATION;
}
if( sHWFeature.bHwReplyDescriptor == 1 ){
/* Enable Auto Reply Descriptor */
*pwHWFeatureMode |= USBD_PROT_ENUM_AUTO_REPLY_DESCRIPTOR;
}
if( sHWFeature.bHwSetAddress == 1 ){
/* Enable Auto Set Address */
*pwHWFeatureMode |= USBD_PROT_ENUM_AUTO_SET_ADDRESS;
}
return STATUS_SUCCESS;
}
/*======================================================================
// Function_Name: SetHWFeatureMode
//
// description : Set H/W function mode
//
// Set H/W function mode to lower module
//
// argument : *pParamData Pointer of parameter data
//
// return : STATUS_SUCCESS Success
// STATUS_UNSUCCESSFUL Error
// STATUS_NOT_OPENED Not opened
// STATUS_NOT_IMPLEMENTED Not implemented
// STATUS_INVALID_PARAMETER Parameter error
========================================================================*/
LONG SetHWFeatureMode( const void *pParamData )
{
USBD_FUNC_HWFEATURE sHWFeature;
USHORT *pwHWFeatureMode;
LONG dwAPIStatus;
/**********************/
/* Process for individual Power saving mode */
/**********************/
memset( &sHWFeature, 0, sizeof(sHWFeature));
pwHWFeatureMode = (USHORT *)pParamData;
if( *pwHWFeatureMode & USBD_PROT_ENUM_AUTO_NEGOTIATION ){
/* Enable Auto Negotiation */
sHWFeature.bHwAutoNego = 1;
*pwHWFeatureMode &= ~USBD_PROT_ENUM_AUTO_NEGOTIATION;
}
if( *pwHWFeatureMode & USBD_PROT_ENUM_AUTO_REPLY_DESCRIPTOR ) {
/* Enable Auto Reply Descriptor */
sHWFeature.bHwReplyDescriptor = 1;
*pwHWFeatureMode &= ~USBD_PROT_ENUM_AUTO_REPLY_DESCRIPTOR;
}
if( *pwHWFeatureMode & USBD_PROT_ENUM_AUTO_SET_ADDRESS ) {
/* Enable Auto Set Address */
sHWFeature.bHwSetAddress = 1;
*pwHWFeatureMode &= ~USBD_PROT_ENUM_AUTO_SET_ADDRESS;
}
if( *pwHWFeatureMode != 0 ){
/* Mode not supported */
return STATUS_INVALID_PARAMETER;
}
/******************************/
/* Set parameter to lower module */
/******************************/
sHWFeature.bLength = 5;
sHWFeature.bType = USBD_FUNC_HWFEATURE_PARAM;
dwAPIStatus = USBD_FuncSetParameter(&sHWFeature);
if( dwAPIStatus != STATUS_SUCCESS){
/* Unable to get */
return dwAPIStatus;
}
if( sHWFeature.bHwAutoNego == 1 ){
ModuleStatus.sControlFlag.bit.wEnableAutoNegotiation = 1;
}
if( sHWFeature.bHwReplyDescriptor == 1 ){
ModuleStatus.sControlFlag.bit.wEnableReplyDescriptor = 1;
}
if( sHWFeature.bHwSetAddress == 1 ){
ModuleStatus.sControlFlag.bit.wEnableAutoSetAddress = 1;
}
return STATUS_SUCCESS;
}
/*======================================================================
// Function_Name: StandardRequest
//
// description : Process of standard device request
//
// Get SETUP packet from lower module, let it transit to process of each standard device request
//
// argument : None
//
// return : STATUS_SUCCESS Success
// STATUS_UNSUCCESSFUL Error
// STATUS_NOT_IMPLEMENTED Not implemented
// STATUS_INVALID_PARAMETER Parameter error
========================================================================*/
LONG StandardRequest( void )
{
DEVICE_REQUEST *psDeviceRequest;
LONG dwAPIStatus;
psDeviceRequest = &ModuleStatus.sUSBStatus.sDeviceRequest;
/***********************************/
/* Get SETUP packet from lower module */
/***********************************/
dwAPIStatus = USBD_FuncGetSETUPPacket((USBD_FUNC_REQUEST *)psDeviceRequest);
if( dwAPIStatus != STATUS_SUCCESS ){
/* Unable to get */
return STATUS_UNSUCCESSFUL;
}
/****************************/
/* Process for individual device request */
/****************************/
if( psDeviceRequest->bRequest > SREQ_SYNCH_FRAME ){
/* Request not supported */
dwAPIStatus = STATUS_UNSUCCESSFUL;
} else {
dwAPIStatus = StandardRequestTable[psDeviceRequest->bRequest](psDeviceRequest);
}
/***************************************/
/* If request error has occurred, return STALL */
/***************************************/
if( dwAPIStatus == STATUS_UNSUCCESSFUL ){
/* Request error */
USBD_FuncSetEPxControl(EP0_IN, USBD_FUNC_CE_STALLMODE, USBD_FUNC_FLAG_SET);
USBD_FuncSetEPxControl(EP0_OUT, USBD_FUNC_CE_STALLMODE, USBD_FUNC_FLAG_SET);
}
return STATUS_SUCCESS;
}
/*======================================================================
// Function_Name: GetStatus
//
// description : Request of Get Status
//
// Process for request of Get Status
//
// argument : *psDeviceRequest Pointer of device request
//
// return : STATUS_SUCCESS Success
// STATUS_UNSUCCESSFUL Error
// STATUS_NOT_IMPLEMENTED Not implemented
// STATUS_INVALID_PARAMETER Parameter error
========================================================================*/
LONG GetStatus( DEVICE_REQUEST *psDeviceRequest )
{
UCHAR *pbWorkData, bDescSpeed, bmAttributes, bEPxControl, bConfigurationIndex;
USHORT wDescType;
LONG dwAPIStatus;
UCHAR *pbDescAdr;
if( ModuleStatus.sUSBStatus.bUSBState == DEFAULT_STATE ){
return STATUS_UNSUCCESSFUL;
}
if( (psDeviceRequest->bmRequestType & BMREQ_DIR_MASK) != DIR_DEVICE_TO_HOST ){
/* Direction of transfer is different */
return STATUS_UNSUCCESSFUL;
}
switch( psDeviceRequest->bmRequestType & BMREQ_RECIPIENT_MASK ){
case RECIPIENT_DEVICE:
if( psDeviceRequest->wValueH || psDeviceRequest->wValueL ){
/* wValue != 0 */
return STATUS_UNSUCCESSFUL;
}
if( psDeviceRequest->wIndexH || psDeviceRequest->wIndexL ){
/* wIndex != 0*/
return STATUS_UNSUCCESSFUL;
}
if( psDeviceRequest->wLengthH || psDeviceRequest->wLengthL != GET_STATUS_DATA_LENGTH ){
/* wLength != GET_STATUS_DATA_LENGTH */
return STATUS_UNSUCCESSFUL;
}
/******************************/
/* Set data of reply */
/******************************/
pbWorkData = ModuleStatus.pDataBuf;
/* Bit of RemoteWakeup Enable/Disable + Bit of Self Powered */
if( ModuleStatus.sUSBStatus.bHSMode == 1 ){
/* HS mode */
bDescSpeed = USBD_FUNC_SPEEDHS;
} else {
/* FS mode */
bDescSpeed = USBD_FUNC_SPEEDFS;
}
if( ModuleStatus.sUSBStatus.bConfigurationValue == 0 ){
/* Before Configured State */
bConfigurationIndex = 0x00;
} else {
/* After Configured State */
bConfigurationIndex = ModuleStatus.sUSBStatus.bConfigurationValue - 1;
}
wDescType = MAKEWORD(bConfigurationIndex, USBD_FUNC_DT_CONFIG);
if( (dwAPIStatus = USBD_FuncGetDescriptorInfoAddress(bDescSpeed, wDescType,&pbDescAdr))
!= STATUS_SUCCESS ){
/* Error occurred in lower module */
return STATUS_UNSUCCESSFUL;
}
bmAttributes = pbDescAdr[OFFSET_BMATTRIBUTES];
pbWorkData[0] = (ModuleStatus.sUSBStatus.bEnableRemoteWakeup << 1)
+ ((bmAttributes & ATTRIB_SELF_POWERED) >> 6);
pbWorkData[1] = 0x00;
break;
case RECIPIENT_INTERFACE:
if( ModuleStatus.sUSBStatus.bUSBState == ADDRESSED_STATE ){
return STATUS_UNSUCCESSFUL;
}
if( psDeviceRequest->wValueH || psDeviceRequest->wValueL ){
/* wValue != 0 */
return STATUS_UNSUCCESSFUL;
}
if( psDeviceRequest->wIndexH ){
/* wIndex != 0*/
return STATUS_UNSUCCESSFUL;
}
if( psDeviceRequest->wLengthH || psDeviceRequest->wLengthL != GET_STATUS_DATA_LENGTH ){
/* wLength != GET_STATUS_DATA_LENGTH */
return STATUS_UNSUCCESSFUL;
}
/**********************************************/
/* Check if specified Interface Number is enabled */
/**********************************************/
if( (dwAPIStatus = CheckInterfaceNumber(psDeviceRequest->wIndexL)) != STATUS_SUCCESS ){
/* Invalid Interface Number, or error occurred in lower module */
return STATUS_UNSUCCESSFUL;
}
/******************************/
/* Set data of reply */
/******************************/
pbWorkData = ModuleStatus.pDataBuf;
pbWorkData[0] = pbWorkData[1] = 0x00;
break;
case RECIPIENT_ENDPOINT:
if( psDeviceRequest->wValueH || psDeviceRequest->wValueL ){
/* wValue != 0 */
return STATUS_UNSUCCESSFUL;
}
if( psDeviceRequest->wIndexH ){
/* wIndex.h != 0 */
return STATUS_UNSUCCESSFUL;
}
if(ModuleStatus.sUSBStatus.bUSBState == ADDRESSED_STATE && psDeviceRequest->wIndexL != 0x00){
return STATUS_UNSUCCESSFUL;
}
if( psDeviceRequest->wLengthH || psDeviceRequest->wLengthL != GET_STATUS_DATA_LENGTH ){
/* wLength != GET_STATUS_DATA_LENGTH */
return STATUS_UNSUCCESSFUL;
}
/******************************/
/* Set data of reply */
/******************************/
pbWorkData = ModuleStatus.pDataBuf;
if( (dwAPIStatus = USBD_FuncGetEPxControl(psDeviceRequest->wIndexL, &bEPxControl)) != STATUS_SUCCESS ){
/* Error occurred in lower module */
return STATUS_UNSUCCESSFUL;
}
if( (bEPxControl & USBD_FUNC_CE_STALLMODE) != 0 ){
/* Mode of STALL reply */
pbWorkData[0] = ENDPOINT_STALL;
} else {
pbWorkData[0] = ENDPOINT_NOT_STALL;
}
if( psDeviceRequest->wIndexL == 0 ){
/* Also check IN direction in EP0 */
if( (dwAPIStatus = USBD_FuncGetEPxControl(EP0_IN, &bEPxControl)) != STATUS_SUCCESS ){
/* Error occurred in lower module */
return STATUS_UNSUCCESSFUL;
}
if( (bEPxControl & USBD_FUNC_CE_STALLMODE) != 0 ){
/* Mode of STALL reply */
pbWorkData[0] = ENDPOINT_STALL;
}
}
pbWorkData[1] = 0x00;
break;
default:
return STATUS_UNSUCCESSFUL;
}
/******************/
/* Start data transfer */
/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -