📄 usbd_protenum.c
字号:
}
ModuleStatus.sAPIFlag.bit.wSendRemoteWakeupA = 0;
return STATUS_SUCCESS;
}
/*======================================================================
// Function_Name: USBD_ProtEnumResetEvent
//
// description : Callback function which is registered to lower module
//
// Be called when Reset has been done
//
// argument : lParam0 Not used
// lParam1 Not used
// *pParam Not used
//
// return : STATUS_SUCCESS Success
// STATUS_UNSUCCESSFUL Error
========================================================================*/
LONG USBD_ProtEnumResetEvent( ULONG lParam0, ULONG lParam1, void *pParam )
{
/******************************************/
/* Notify event to Module Manager */
/******************************************/
ModuleStatus.sAPIFlag.bit.wCBRResetEvent = 1;
return STATUS_SUCCESS;
}
/*======================================================================
// Function_Name: USBD_ProtEnumSuspendEvent
//
// description : Callback function which is registered to lower module
//
// Be called when Suspend has been done
//
// argument : lParam0 Not used
// lParam1 Not used
// *pParam Not used
//
// return : STATUS_SUCCESS Success
// STATUS_UNSUCCESSFUL Error
========================================================================*/
LONG USBD_ProtEnumSuspendEvent( ULONG lParam0, ULONG lParam1, void *pParam )
{
/******************************************/
/* Notify event to Module Manager */
/******************************************/
ModuleStatus.sAPIFlag.bit.wCBRSuspendEvent = 1;
return STATUS_SUCCESS;
}
/*======================================================================
// Function_Name: USBD_ProtEnumResumeEvent
//
// description : Callback function which is registered to lower module
//
// Be called when Resume has been done
//
// argument : lParam0 Not used
// lParam1 Not used
// *pParam Not used
//
// return : STATUS_SUCCESS Success
// STATUS_UNSUCCESSFUL Error
========================================================================*/
LONG USBD_ProtEnumResumeEvent( ULONG lParam0, ULONG lParam1, void *pParam )
{
/******************************************/
/* Notify event to Module Manager */
/******************************************/
ModuleStatus.sAPIFlag.bit.wCBRResumeEvent = 1;
return STATUS_SUCCESS;
}
/*======================================================================
// Function_Name: USBD_ProtEnumChangeUSBAddress
//
// description : Callback function which is registered to lower module
//
// Be called when change of USB Address has completed
//
// argument : lResult Result of process
// STATUS_SUCCESS Finished normally
// STATUS_UNSUCCESSFUL Error
// lParam1 Not used
// *pParam Not used
//
// return : STATUS_SUCCESS Success
// STATUS_UNSUCCESSFUL Error
========================================================================*/
LONG USBD_ProtEnumChangeUSBAddress( ULONG lResult, ULONG lParam1, void *pParam )
{
LONG dwAPIStatus;
/*****************************************************************************/
/* When change of USB Address has completed, process the change of USB State by value of USB Address */
/*****************************************************************************/
if( lResult == STATUS_SUCCESS ){
/* Change of USB Address has completed */
dwAPIStatus = USBD_FuncGetUSBAddress(&(ModuleStatus.sUSBStatus.bUSBAddress));
if( dwAPIStatus != STATUS_SUCCESS ){
/* Unable to get USB address */
return STATUS_UNSUCCESSFUL;
}
if( ModuleStatus.sUSBStatus.bUSBAddress == 0 ){
/* Transit to Default State */
ModuleStatus.sUSBStatus.bUSBState = DEFAULT_STATE;
} else {
/* Transit to Addressed State */
ModuleStatus.sUSBStatus.bUSBState = ADDRESSED_STATE;
}
}
return STATUS_SUCCESS;
}
/*======================================================================
// Function_Name: USBD_ProtEnumRcvRequest
//
// description : Callback function which is registered to lower module
//
// Be called when device request has been received
//
// argument : lReqData Request data
// bit7-0:bRequest
// bit15-8:bmRequestType
// bit31-16:Reserved
// lParam1 Not used
// *pParam Not used
//
// return : STATUS_SUCCESS Success
// STATUS_UNSUCCESSFUL Error
// STATUS_NOT_IMPLEMENTED Not implemented
========================================================================*/
LONG USBD_ProtEnumRcvRequest( ULONG lReqData, ULONG lParam1, void *pParam )
{
UCHAR bmRequest, bRequest;
/**************************************************/
/* Check if it is a request supported by the module */
/**************************************************/
bRequest = LOBYTE(LOWORD(lReqData));
bmRequest = HIBYTE(LOWORD(lReqData));
if( (bmRequest & BMREQ_TYPE_MASK) != TYPE_STANDARD ){
/* Besides standard request */
return STATUS_NOT_IMPLEMENTED;
}
switch( bRequest ){
case SREQ_GET_STATUS:
break;
case SREQ_CLEAR_FEATURE:
break;
case SREQ_SET_FEATURE:
break;
case SREQ_SET_ADDRESS:
break;
case SREQ_GET_DESCRIPTOR:
break;
case SREQ_GET_CONFIGURATION:
break;
case SREQ_SET_CONFIGURATION:
break;
case SREQ_GET_INTERFACE:
break;
case SREQ_SET_INTERFACE:
break;
default:
return STATUS_NOT_IMPLEMENTED;
}
/******************************************/
/* Notify event to Module Manager */
/******************************************/
ModuleStatus.sAPIFlag.bit.wCBRRcvRequest = 1;
return STATUS_SUCCESS;
}
/*======================================================================
// Function_Name: USBD_ProtEnumDataStageEnd
//
// description : Callback function which is registered to lower module
//
// Be called when data stage of Control transfer has completed
//
// argument : lEPNum Endpoint number
// lActualXferSize Number actually transferred
// *pParam Not used
//
// return : STATUS_SUCCESS Success
// STATUS_UNSUCCESSFUL Error
// STATUS_NOT_IMPLEMENTED Not implemented
========================================================================*/
LONG USBD_ProtEnumDataStageEnd( ULONG lEPNum, ULONG lActualXferSize, void *pParam )
{
/******************************************/
/* Notify event to Module Manager */
/******************************************/
ModuleStatus.sAPIFlag.bit.wCBRDataStageEnd = 1;
return STATUS_SUCCESS;
}
/*======================================================================
// Function_Name: USBD_ProtEnumStatusStageEnd
//
// description : Callback function which is registered to lower module
//
// Be called when status stage of Control transfer has completed
//
// argument : lResult Result of process
// STATUS_SUCCESS Finished normally
// STATUS_UNSUCCESSFUL Error
// lParam1 Not used
// *pParam Not used
//
// return : STATUS_SUCCESS Success
// STATUS_UNSUCCESSFUL Error
// STATUS_NOT_IMPLEMENTED Not implemented
========================================================================*/
LONG USBD_ProtEnumStatusStageEnd( ULONG lResult, ULONG lParam1, void *pParam )
{
/******************************************/
/* Notify event to Module Manager */
/******************************************/
if( lResult == STATUS_SUCCESS ){
if( ModuleStatus.sAPIFlag.bit.wSetInterface == 1 ){
ModuleStatus.sAPIFlag.bit.wAltenateSettingChanged = 1;
}
}
return STATUS_SUCCESS;
}
/*======================================================================
// Function_Name: ModuleManager
//
// description : Manage the module
//
// Check the notification of event from callback function registered in lower module and do appropriate process
//
// argument : None
//
// return : STATUS_SUCCESS Success
// STATUS_UNSUCCESSFUL Error
========================================================================*/
LONG ModuleManager( void )
{
// USBD_FUNC_SWFEATURE sSWFeature;
APIFLG sAPIFlag;
ULONG dwStatusData;
LONG dwAPIStatus;
DEVICE_REQUEST *psDeviceRequest;
sAPIFlag = ModuleStatus.sAPIFlag;
if( sAPIFlag.bit.wSetInterface == 1 ){
ModuleStatus.sAPIFlag.wData = 0;
ModuleStatus.sAPIFlag.bit.wSetInterface = 1;
} else {
ModuleStatus.sAPIFlag.wData = 0;
}
if( sAPIFlag.bit.wCBRResetEvent == 1 ){
/* Reset event occurred */
/**********************/
/* Return to state of Reset */
/**********************/
ModuleStatus.sUSBStatus.bEnableRemoteWakeup = 0;
ModuleStatus.sUSBStatus.bUSBAddress = 0;
ModuleStatus.sUSBStatus.bUSBState = DEFAULT_STATE;
memset(ModuleStatus.sUSBStatus.pbAlternateSetting,DEFAULT_ALTERNATE_SETTING,NUM_INTERFACE);
dwAPIStatus = USBD_FuncGetStatus(ModuleStatus.wAllocatedID, USBD_FUNC_BUS_STATUS, &dwStatusData);
if( (dwStatusData & USBD_FUNC_BS_HSMODE) != 0 ){
/* HS mode */
ModuleStatus.wOPStatus = USBD_PROT_ENUM_OP_HS_CONNECTED;
ModuleStatus.sUSBStatus.bHSMode = 1;
} else {
/* FS mode */
ModuleStatus.wOPStatus = USBD_PROT_ENUM_OP_FS_CONNECTED;
ModuleStatus.sUSBStatus.bHSMode = 0;
}
ModuleStatus.wEventStatus |= EVENT_STS_DETECT_RESET;
/**********************************************/
/* Call the callback function if it has been registered */
/**********************************************/
if( ModuleStatus.pfnCallbackTable[CBR_RESET_EVENT] != NULL ){
(ModuleStatus.pfnCallbackTable[CBR_RESET_EVENT])(0,0,NULL);
}
}
if( sAPIFlag.bit.wCBRSuspendEvent == 1 ){
/* Suspend event occurred */
if(ModuleStatus.sUSBStatus.bEnableRemoteWakeup == 1 && ModuleStatus.sControlFlag.bit.wEnableAutoWakeup == 1 ){
/*
* If Auto Remote Wakeup function is enabled,
* Send Remote Wakeup signal after 500ms from occurrence of USB Suspend
*/
OS_DlyTsk(TMOUT_AUTO_REMOTEWAKEUP);
dwAPIStatus = USBD_ProtEnumWakeupA();
}
ModuleStatus.wEventStatus |= EVENT_STS_DETECT_SUSPEND;
/**********************************************/
/* Call the callback function if it has been registered */
/**********************************************/
if( ModuleStatus.pfnCallbackTable[CBR_SUSPEND_EVENT] != NULL ){
(ModuleStatus.pfnCallbackTable[CBR_SUSPEND_EVENT])(0,0,NULL);
}
}
if( sAPIFlag.bit.wConfigured == 1 ){
/* Configured event occurred */
ModuleStatus.wEventStatus |= EVENT_STS_CONFIGURED;
/**********************************************/
/* Call the callback function if it has been registered */
/**********************************************/
if( ModuleStatus.pfnCallbackTable[CBR_CONFIGURED_EVENT] != NULL ){
(ModuleStatus.pfnCallbackTable[CBR_CONFIGURED_EVENT])(0,0,NULL);
}
}
if( sAPIFlag.bit.wDeconfigured == 1 ){
/* Deconfigured event occurred */
ModuleStatus.wEventStatus |= EVENT_STS_DECONFIGURED;
/**********************************************/
/* Call the callback function if it has been registered */
/**********************************************/
if( ModuleStatus.pfnCallbackTable[CBR_DECONFIGURED_EVENT] != NULL ){
(ModuleStatus.pfnCallbackTable[CBR_DECONFIGURED_EVENT])(0,0,NULL);
}
}
if( sAPIFlag.bit.wCBRResumeEvent == 1 ){
/* Resume event occurred */
ModuleStatus.wEventStatus |= EVENT_STS_DETECT_RESUME;
/**********************************************/
/* Call the callback function if it has been registered */
/**********************************************/
if( ModuleStatus.pfnCallbackTable[CBR_RESUME_EVENT] != NULL ){
(ModuleStatus.pfnCallbackTable[CBR_RESUME_EVENT])(0,0,NULL);
}
}
if( sAPIFlag.bit.wAltenateSettingChanged == 1 ){
/* AlternateSetting Changed event occurred */
ModuleStatus.wEventStatus |= EVENT_STS_ALTERNATE_CHANGED;
/**********************************************/
/* Call the callback function if it has been registered */
/**********************************************/
if( ModuleStatus.pfnCallbackTable[CBR_ALTERNATE_CHANGED_EVENT] != NULL ){
psDeviceRequest = &ModuleStatus.sUSBStatus.sDeviceRequest;
(ModuleStatus.pfnCallbackTable[CBR_ALTERNATE_CHANGED_EVENT])(psDeviceRequest->wIndexL,ModuleStatus.sUSBStatus.pbAlternateSetting[psDeviceRequest->wIndexL],NULL);
}
}
if( sAPIFlag.bit.wCBRRcvRequest == 1 ){
/* Receive request */
if( (dwAPIStatus = USBD_FuncReserveControlTransfer()) != STATUS_SUCCESS ){
/* Reserved for other module!! */
PANIC();
}
ModuleStatus.sAPIFlag.bit.wSetInterface = 0;
ModuleStatus.sAPIFlag.bit.wGoReplyDescriptorA = 0;
ModuleStatus.sAPIFlag.bit.wEPxPIOSimpleTransferA = 0;
dwAPIStatus = StandardRequest();
}
if( sAPIFlag.bit.wCBRDataStageEnd == 1 ){
/* Data stage of Control transfer has completed */
if( (dwAPIStatus = RequestSuccess()) != STATUS_SUCCESS ){
/* Error occurred in lower module */
return dwAPIStatus;
}
}
sAPIFlag.wData = 0;
return STATUS_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -