⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbh_hcds_72v05.c

📁 epson usb2.0 控制芯片 S1R72V05 固件程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
	/*==============================================================/
	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 + -