📄 usbh_hcds_72v05.c
字号:
/*==============================================================/
Change to specified State, when PMStete is out of specified State /
/==============================================================*/
if( ((RegRead(REG08_PM_Control_1) & MASK_PM_State)>>SHIFT_PM_State) != state ){
HCStatus.pfnPMFinishedCallback = pfnCallback;
/*================================================/
Clear interrupt status of FinishedPM interrupt & Enable the interrupt/
/================================================*/
RegWrite( REG08_MainIntStat, BIT_FinishedPM );
RegSet( REG08_MainIntEnb, BIT_EnFinishedPM );
/*======================/
Changes to specified State/
/======================*/
switch( state ){
case USBH_HCDS_HC_PM_STATE_SLEEP:
RegSet( REG08_PM_Control_0, BIT_GoSLEEP );
break;
case USBH_HCDS_HC_PM_STATE_SNOOZE:
RegSet( REG08_PM_Control_0, BIT_GoSNOOZE );
break;
case USBH_HCDS_HC_PM_STATE_ACTIVE60:
RegSet( REG08_PM_Control_0, BIT_GoActive60 );
break;
case USBH_HCDS_HC_PM_STATE_ACTDEVICE:
RegSet( REG08_PM_Control_0, BIT_GoActDevice );
break;
case USBH_HCDS_HC_PM_STATE_ACTHOST:
// Can not do GoActHost when it is 1 port operation
if( (RegRead(REG08_ClkSelect) & 0x02) == 0x02 ) {
while(1);
}
RegSet( REG08_PM_Control_0, BIT_GoActHost );
break;
}
} else {
/* The callback function is called soon when it is already in the specified State */
USBH_HCDS_ExecCallback(pfnCallback, state, 0, NULL);
}
}
/*=============================================================================================
// Function_Name: USBH_HCDS_HCHostActive
//
// description : Host function active
//
// The host function is activated.
//
// argument : None
//
// return : None
===============================================================================================*/
void USBH_HCDS_HCHostActive( void )
{
volatile REG_rxH_CHxWindow *prxH_CHxWindow;
volatile unsigned short *prsH_CHxWindow;
volatile unsigned char *prcH_CHxIntEnb;
unsigned int i;
/*=====================================================/
Disable the interrupt used by host function and do status initialization /
/=====================================================*/
if( HCStatus.bmFlags.usedDMAforIDE == 1 ){
/* case of using DMA of CPU I/F IDE */
/*==================================================/
Disable CPU interrupt(only for DMA channel which is not used by IDE) /
/==================================================*/
if( HCStatus.usedDMAChforIDE == 0 ){
RegClear(REG08_CPU_IntEnb, ~MASK_CPU_DMACH_0);
} else {
RegClear(REG08_CPU_IntEnb, ~MASK_CPU_DMACH_1);
}
} else {
/* Not use DMA of CPU I/F with IDE */
/*================/
Disable CPU interrupt /
/================*/
RegClear( REG08_MainIntEnb, BIT_EnCPU_IntStat );
RegWrite( REG08_CPU_IntEnb, BIT_AllIntDisable );
}
RegWrite(REG08_H_SIE_IntEnb_0, BIT_AllIntDisable );
RegWrite(REG08_H_SIE_IntEnb_1, BIT_AllIntDisable );
RegWrite(REG08_H_FIFO_IntEnb, BIT_AllIntDisable );
RegWrite(REG08_H_FrameIntEnb, BIT_AllIntDisable );
RegWrite(REG08_H_CHrIntEnb, BIT_AllIntDisable );
RegWrite(REG08_H_CH0IntEnb, BIT_AllIntDisable );
for( i = 0; i < NUM_USB_CH; i++ ){
REG_H_CHX_INT_ENB_ADDR(prcH_CHxIntEnb, i);
*prcH_CHxIntEnb = 0x00;
}
/*=====================================/
Initialize register that relate to host function /
/=====================================*/
RegWrite(REG08_H_NegoControl_0, NEGO_AUTO_MODE_CANCEL);
while( RegRead(REG08_H_NegoControl_0) & MASK_AutoModeCancel );
RegModify(REG08_H_NegoControl_0, MASK_AutoMode, BIT_AutoMode_GoIDLE);
RegWrite( REG08_H_ClrAllCHnJoin, CLR_ALL_JOIN );
RegSet(REG08_H_CHnControl, BIT_AllFIFO_Clr );
USBH_HCDS_HCStopTestMode();
RegSet( REG08_MainIntEnb, BIT_EnHostIntStat ); /* Enable Host interrupt */
RegClear( REG08_H_CTL_SupportControl, BIT_CTL_SupportGo );
RegClear( REG08_H_BO_SupportControl, BIT_BO_SupportGo );
for( i = 0; i < NUM_USB_CH; i++ ){
REG_H_CHX_WINDOW_ADDR(prsH_CHxWindow, i);
prxH_CHxWindow = (volatile REG_rxH_CHxWindow *)prsH_CHxWindow;
RegClear( &prxH_CHxWindow->rcH_CHxConfig_0, BIT_TranGo );
}
}
/*=============================================================================================
// Function_Name: USBH_HCDS_HCHostInactive
//
// description : Inactive Host function
//
// The host function is inactive
//
// argument : None
//
// return : None
===============================================================================================*/
void USBH_HCDS_HCHostInactive( void )
{
volatile REG_rxH_CHxWindow *prxH_CHxWindow;
volatile unsigned short *prsH_CHxWindow;
volatile unsigned char *prcH_CHxIntEnb;
unsigned int i;
/*=============================================/
Stop the timer which used for recoverying from the VBUS overcurrent/
/=============================================*/
USBH_HCDS_CPUTimerStop();
/*=====================================================/
Disable the interrupt used by host function and do status initialization/
/=====================================================*/
if( HCStatus.bmFlags.usedDMAforIDE == 1 ){
/* Use DMA of CPU I/F with IDE*/
/*=============================================================/
Disable CPU interrupt and stop DMA(only for DMA channel which is not used by IDE) /
/=============================================================*/
if( HCStatus.usedDMAChforIDE == 0 ){
RegClear( REG08_CPU_IntEnb, ~MASK_CPU_DMACH_0 );
} else {
RegClear( REG08_CPU_IntEnb, ~MASK_CPU_DMACH_1 );
}
} else {
/* Not use DMA of CPU I/F with IDE */
/*================/
Disable CPU interrupt /
/================*/
RegClear( REG08_MainIntEnb, BIT_EnCPU_IntStat );
RegWrite( REG08_CPU_IntEnb, BIT_AllIntDisable );
}
RegWrite( REG08_HostIntEnb, BIT_AllIntDisable );
RegWrite( REG08_H_SIE_IntEnb_0, BIT_AllIntDisable );
RegWrite( REG08_H_SIE_IntEnb_1, BIT_AllIntDisable );
RegWrite( REG08_H_FIFO_IntEnb, BIT_AllIntDisable );
RegWrite( REG08_H_FrameIntEnb, BIT_AllIntDisable );
RegWrite( REG08_H_CHrIntEnb, BIT_AllIntDisable );
RegWrite( REG08_H_CH0IntEnb, BIT_AllIntDisable );
for( i = 0; i < NUM_USB_CH; i++ ){
REG_H_CHX_INT_ENB_ADDR(prcH_CHxIntEnb, i);
*prcH_CHxIntEnb = 0x00;
}
/*=====================================/
Initialization of register that related to Host function/
/=====================================*/
RegWrite( REG08_H_NegoControl_0, NEGO_AUTO_MODE_CANCEL );
while( RegRead(REG08_H_NegoControl_0) & MASK_AutoModeCancel );
RegModify( REG08_H_NegoControl_0, MASK_AutoMode, BIT_AutoMode_GoIDLE );
RegWrite( REG08_H_ClrAllCHnJoin, CLR_ALL_JOIN );
RegSet( REG08_H_CHnControl, BIT_AllFIFO_Clr );
USBH_HCDS_HCStopTestMode();
RegClear( REG08_H_CTL_SupportControl, BIT_CTL_SupportGo );
RegClear( REG08_H_BO_SupportControl, BIT_BO_SupportGo );
for( i = 0; i < NUM_USB_CH; i++ ){
REG_H_CHX_WINDOW_ADDR(prsH_CHxWindow, i);
prxH_CHxWindow = (volatile REG_rxH_CHxWindow *)prsH_CHxWindow;
RegClear( &prxH_CHxWindow->rcH_CHxConfig_0, BIT_TranGo );
}
}
/*=============================================================================================
// Function_Name: USBH_HCDS_HCPortGoIdle
//
// description : Host Contoller Idle
//
// The port of Host Contoller is changed to Idle
//
// argument : None
//
// return : None
===============================================================================================*/
void USBH_HCDS_HCPortGoIdle( void )
{
/*=======================/
Disable all interrupt related to Port/
/=======================*/
RegWrite( REG08_HostIntEnb, BIT_AllIntDisable );
RegWrite( REG08_H_SIE_IntEnb_0, BIT_AllIntDisable );
RegWrite( REG08_H_SIE_IntEnb_1, BIT_AllIntDisable );
RegWrite( REG08_H_FrameIntEnb, BIT_AllIntDisable );
/*=======================/
Port is changed to Idle /
/=======================*/
RegWrite( REG08_H_NegoControl_0, NEGO_AUTO_MODE_CANCEL );
while( RegRead(REG08_H_NegoControl_0) & MASK_AutoModeCancel );
RegModify( REG08_H_NegoControl_0, MASK_AutoMode, BIT_AutoMode_GoIDLE );
}
/*=============================================================================================
// Function_Name: USBH_HCDS_HCPortGoWaitConnect
//
// description : Set Host Contoller as Wait Connect
//
// The port of Host Contoller is changed to Wait Connect
//
// argument : None
//
// return : None
===============================================================================================*/
void USBH_HCDS_HCPortGoWaitConnect( void )
{
/*===========================/
Disable the unnecessary interrupt related to Port /
/===========================*/
RegClear( REG08_HostIntEnb, BIT_EnH_FrameIntStat );
RegWrite( REG08_H_FrameIntEnb, BIT_AllIntDisable );
/*===========================/
Enable the necessary interrupt related to Port /
/===========================*/
RegSet( REG08_HostIntEnb, BIT_EnVBUS_Err | BIT_EnH_SIE_IntStat_1 | BIT_EnH_SIE_IntStat_0 );
RegSet( REG08_H_SIE_IntEnb_0, BIT_EnDetectDiscon | BIT_EnDetectCon );
RegSet( REG08_H_SIE_IntEnb_1, BIT_EnDisabledCmp );
/*===========================/
Clear the counter for overcurrent confirmation /
/===========================*/
HCStatus.vbusErrCount = 0;
/* When it became SUSPEND by GoSUSPENDtoOP, AutoModeCancel is executed. */
if( (RegRead(REG08_H_NegoControl_0)&MASK_HostState) == BIT_HostState_USB_SUSPEND ){
/* AutoModeCancel is executed */
RegWrite(REG08_H_NegoControl_0, NEGO_AUTO_MODE_CANCEL);
/* Wait until AutoModeCancel is cleared */
while( RegRead( REG08_H_NegoControl_0) & MASK_AutoModeCancel );
}
/*==============================/
Port is changed to WaitConnect /
/==============================*/
RegModify( REG08_H_NegoControl_0, MASK_AutoMode, BIT_AutoMode_GoWAIT_CONNECTtoDIS );
}
/*=============================================================================================
// Function_Name: USBH_HCDS_HCPortGoDisabled
//
// description : Set Host Contoller Disabled
//
// The port of Host Contoller is changed to Disabled
//
// argument : None
//
// return : None
===============================================================================================*/
void USBH_HCDS_HCPortGoDisabled( void )
{
/*===========================/
Disable the unnecessary interrupt related to Port /
/===========================*/
RegClear( REG08_HostIntEnb, BIT_EnH_FrameIntStat );
RegWrite( REG08_H_FrameIntEnb, BIT_AllIntDisable );
/*===========================/
Port is changed to Disabled /
/===========================*/
RegModify( REG08_H_NegoControl_0, MASK_AutoMode, BIT_AutoMode_GoDISABLED );
/*==============/
Reset HTM /
/==============*/
RegSet( REG08_H_Reset, BIT_ResetHTM );
RegClear( REG08_H_Reset, BIT_ResetHTM );
}
/*=============================================================================================
// Function_Name: USBH_HCDS_HCPortGoResetToOP
//
// description : Set Host Contoller Reset
//
// The port of Host Contoller is changed to Reset
//
// argument : None
//
// return : None
===============================================================================================*/
void USBH_HCDS_HCPortGoResetToOP( void )
{
/*===========================/
Enable the necessary interrupt related to Port/
/===========================*/
RegSet( REG08_HostIntEnb,
BIT_EnH_FrameIntStat |
BIT_EnH_CH0IntStat |
BIT_EnH_CHrIntStat |
BIT_EnH_FIFO_IntStat );
RegSet( REG08_H_SIE_IntEnb_0, BIT_EnDetectDevChirpOK | BIT_EnDetectDevChirpNG );
RegSet( REG08_H_SIE_IntEnb_1, BIT_EnResetCmp );
RegWrite( REG08_H_CHrIntEnb, BIT_AllIntEnable );
/*===========================/
Port is changed to Disabled /
/===========================*/
if( HCStatus.bmFlags.disChirpOff == 1 ){
RegSet( REG08_H_NegoControl_1, BIT_DisChirpFinish );
} else {
RegClear( REG08_H_NegoControl_1, BIT_DisChirpFinish );
}
/* When it became SUSPEND by SUSPENDtoOP, AutoModeCancel is executed */
if( (RegRead(REG08_H_NegoControl_0)&MASK_HostState) == BIT_HostState_USB_SUSPEND ){
/* AutoModeCancel is executed*/
RegWrite(REG08_H_NegoControl_0, NEGO_AUTO_MODE_CANCEL);
/* Wait until AutoModeCancel is cleared */
while( RegRead( REG08_H_NegoControl_0) & MASK_AutoModeCancel );
}
RegModify( REG08_H_NegoControl_0, MASK_AutoMode, BIT_AutoMode_GoRESETtoOP );
}
/*=============================================================================================
// Function_Name: USBH_HCDS_HCPortGoSuspend
//
// description : Set Host Contoller Suspend
//
// The port of Host Contoller is changed to Suspend
//
// argument : control (in)Enable/Disable of RemoteWakeup detection
// USBH_HCDS_HC_REMOTE_WAKEUP_ENABLE
// USBH_HCDS_HC_REMOTE_WAKEUP_DISABLE
//
// return : None
===============================================================================================*/
void USBH_HCDS_HCPortGoSuspend( unsigned char remoteWakeupControl )
{
volatile REG_rxH_C
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -