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

📄 cdc.c

📁 编辑器是ST7 此为十蝶三阳CDCdriver! 本人调试多时使用情况良好,现在和大家分享!
💻 C
字号:
/***********************************************************************
*	PROJECT		:BAV201(Bosen)  
*	MCU			:ST72321(A)R9/HIWARE C complier (v5.0.4) 
*	DESCRIPTION	:CDC.c
*	DATE		:2005/11/29
*	AUTHOR		:
***********************************************************************/
#define CDC_C
#include "Global.h"

/***************************************************
* Start of Declaration
***************************************************/
	struct _CDC_Infor CDC_Infor;
	struct _CDC_Infor Pre_CDC_Infor;

	INT8U     CDC_PreErr;
	INT16U     CDC_CmdAvailableTimer;
	SFR   CDC_Flag;
	
	INT8U	CDC_WorkStatus;
	INT8U	CDC_WorkStep;
	INT8U	CDC_WorkTimeCnt;
	INT8U      CDC_MuteTimer;
	INT8U      CDC_ResendPlayKeyTimer;
	INT8U      CDC_PlayRotateTimer;
	INT16U      CDC_DetVideoStep;
	INT8U      CDC_ExtSignalCnt;
	INT8U DebugFlag;
	#define CDC_IN_IDLE		0
	#define CDC_IN_MODEOFF 	1
	#define CDC_IN_MODEON	2

	void (*Init_CDC_Driver)(void);
	void (*CDC_Driver)(void);

	void Init_CDC(void);
	void CDC_Proc(void);
	void CDC_Timer(void);
	void CDC_Display(void);
	void CDC_KeyProcess(void);
	void CDC_ErrProcess(void);
	void CDC_SetDispRefFlag(void);
	void CDC_DetExtSignal(void);

	

/***************************************************
* End of Declaration
***************************************************/


void Init_CDC(void)
{	
	EnterCritical();
	/*Driver Mapping*/
//	if(CDC_Infor.CDCType == CDC_TYP_SANYO)
//	{
		Init_CDC_Driver = InitSanyoCDC;
		CDC_Driver = SanyoCDCDriver;
//	}
//	else  if(CDC_Infor.CDCType == CDC_TYP_PANASONIC)
//	{
//		Init_CDC_Driver = InitPanaCDC;
//		CDC_Driver = PanaCDCDriver;
//	}
	/*Driver Initilisation*/
	(*Init_CDC_Driver)();
	
	CDC_WorkStatus = CDC_IN_IDLE ;
	CDC_WorkStep = 0;
	CDC_WorkTimeCnt = 0;
	CDC_Infor.CDCErrCode=CDC_ERR_CONNET;
	return;
}

void CDC_Proc(void)
{
	CDC_Timer();

	if((CDC_Infor.CDCErrCode != CDC_ERR_NONE)
		|| (CDC_Infor.CDCDiscExist == 0) ) 
	{
		CDC_ErrProcess();
	}
	else
	{
		switch(CDC_WorkStatus)
		{
			case CDC_IN_IDLE:
				if(Last_Work_Mode == CDC)
				{
					CDC_WorkStatus = CDC_IN_MODEOFF;
					CDC_WorkStep =0;
					F_CDC_Mute = 1;
					/*set PortA3 to floating input, prevent watch-dog from overflowing */
//					PAOR.DATA &= 0xf7;		/*MSB-****0***-LSB*/
				}

				if(Next_Work_Mode == CDC)
				{
					CDC_WorkStatus = CDC_IN_MODEON;
					CDC_WorkStep = 0;
					CDC_WorkTimeCnt = 6;
					F_CDC_Mute = 0;
//					F_TFTParamRq = 1; /*TFT request CVBS parameters*/
//					SendTFTParamStep=0;
					F_CdcDetVideoFin = 0;
					CDC_DetVideoStep=0;
//					OsdMode = EXTERNAL_SYN;
//					TimerOSDSyn = 0;
				}

				if(Curr_Work_Mode == CDC)
				{
					
//					if(!F_CdcDetVideoFin)
//					{
//						CDC_DetExtSignal();
//					}
					if(F_CDCSend == 0)
					{
						if((!F_CdcIsPaused) && (CDC_ResendPlayKeyTimer==0) &&
							((CDC_Infor.CDCStatus==CDC_Stoping)||(CDC_Infor.CDCStatus==CDC_Pausing)))
						{
							CDC_Infor.CDCOpCode = CDC_OP_PLAY;  /*avoid cdc stoping abnormally*/
							CDC_ResendPlayKeyTimer = 100;
							F_CDC_Mute = 0;
						}
						CDC_KeyProcess();
				   	}
					CDC_Display();
                 			

				}
				break;
				
			case CDC_IN_MODEOFF:
				switch(CDC_WorkStep)
				{
					case 0:
						if(F_CDCSend == 0)
						{
							CDC_Infor.CDCOpCode = CDC_OP_STOP;
							CDC_WorkStep ++;
						}
						break;
					case 1:
						if(F_CDCSend == 0)
						{
							CDC_WorkStep ++;
						}
						break;
					default:
						Last_Work_Mode = IDLE;
						CDC_WorkStatus = CDC_IN_IDLE;
						CDC_WorkStep = 0;
						break;
				}
				break;
				
			case CDC_IN_MODEON:
				switch(CDC_WorkStep)
				{
					case 0:
						break;
					case 1:
						CDC_Infor.CDCOpCode = CDC_OP_PLAY;
						CDC_WorkStep ++;
						CDC_WorkTimeCnt = 10;
						CDC_ResendPlayKeyTimer = 120;
						break;
					case 2:
						break;
					case 3:
						F_SanBackUpCmd = 1; /*request driver to send backup cmd, for sanyo cdc*/
						CDC_WorkTimeCnt = 6;
						CDC_WorkStep++;
						break;
					case 4:
						break;
					default:
						Next_Work_Mode = IDLE;
						Curr_Work_Mode = CDC;
						CDC_WorkStatus = CDC_IN_IDLE;
						MICSendCMD(Stereo);
						CDC_WorkStep = 0;
						CDC_WorkTimeCnt = 0;
						F_CdcIsPaused = 0;
						break;
				}
				break;
				
			default:
				break;
		}
	}

	if(CDC_PreErr != CDC_Infor.CDCErrCode)
	{
		if((CDC_PreErr==CDC_ERR_CONNET) || 
			(CDC_PreErr==CDC_ERR_NOMAGZINE))
		{
			if(CDC_Infor.CDCErrCode == CDC_ERR_NONE)
			{
				CDC_CmdAvailableTimer = 4300; 
				F_SanChkDiscRq = 1;  /*request sanyo cdc to check disc manually*/
			}
		}
		else if((CDC_PreErr == CDC_ERR_NONE) &&
			    ((CDC_Infor.CDCErrCode==CDC_ERR_CONNET)||
			      (CDC_Infor.CDCErrCode==CDC_ERR_NOMAGZINE)))
		{
			CDC_CmdAvailableTimer = 0;
			F_CdcChkFinish = 0;
		}
		CDC_PreErr = CDC_Infor.CDCErrCode;
	}
	
//	CDC_SetDispRefFlag();
	
	// Call CDC hardware layer driver process 
	(*CDC_Driver)();	
	
	return;
}
   





void CDC_Display(void)
{
	static UINT8 PlayingRotate=0x01;

	if(CurrDispMode == General)
	{
		ClearScreen();


		
		DispBuf6[11] = Code_C;
		DispBuf6[10] = Code_D;
		DispBuf6[9] = Code_C;
		DispBuf6[8] = Code_Blank;
		DispBuf6[7] = Code_Blank;
		DispBuf6[6] = Code_0 + (CDC_Infor.CurrDiscNo%10);
		DispBuf6[5] = Code_Blank;
		DispBuf6[4] = Code_Blank;
		DispBuf6[3] = Code_T;
		DispBuf6[2] = Code_0 + ((CDC_Infor.CurrTrkNo/10)%10);
		DispBuf6[1] = Code_0 + (CDC_Infor.CurrTrkNo%10);
		DispBuf6[0] = Code_Blank;

		if( CDC_Playing == CDC_Infor.CDCStatus ){
			if(CDC_PlayRotateTimer == 0){
				PlayingRotate = (PlayingRotate+1)%4;
				m_DispBuf3.DATA=(m_DispBuf3.DATA|0x0f) ^(0x01<<PlayingRotate);
				CDC_PlayRotateTimer=20;
			}
		}
		else{
			m_DispBuf3.DATA=m_DispBuf3.DATA&0xF0;
		}

		F_RDM=0;
		F_RPT=0;
		F_SCAN=0;
		switch(CDC_Infor.CurrTrkMode)
		{
			case CDC_MOD_DSKRDM:
			case CDC_MOD_TRKRDM:
			case CDC_MOD_DSKSHF:
			case CDC_MOD_TRKSHF:
				F_RDM=1;
				break;
			case CDC_MOD_DSKRPT:
			case CDC_MOD_TRKRPT:
				F_RPT=1;
				break;
			case CDC_MOD_DSKSCAN:
			case CDC_MOD_TRKSCAN:
				F_SCAN=1;
				break;
		}
//		F_DispReqNumber=1;
		F_DispReqMark =1;
		F_DispReqIcon=1;
		F_DispReqLeft=1;
		F_DispReqMid=1;
		F_DispReqRight=1;
		}
	
}


void CDC_Timer(void)
{
	if(CDC_WorkTimeCnt)
	{
		if(--CDC_WorkTimeCnt == 0)
		{
			CDC_WorkStep++;
		}
	}
	if(CDC_CmdAvailableTimer != 0)
	{
		if(--CDC_CmdAvailableTimer == 0)
		{
			F_CdcChkFinish = 1;
		}
	}
	if(CDC_MuteTimer != 0)
	{
		CDC_MuteTimer--;
		if(CDC_MuteTimer == 0)
		{
			F_CDC_Mute = 0;
		}
	}
	if(CDC_ResendPlayKeyTimer != 0)
	{
		CDC_ResendPlayKeyTimer--;
	}
	return;
}


void CDC_KeyProcess(void)
{
	switch( PadKeyCode )
	{     		
		case KEY_SRIGHT:
		case KEY_RIGHT:
//		case KEY_SNEXT:
			CDC_Infor.CDCOpCode = CDC_OP_TRKUP;
			F_CDC_Mute = 1;
			CDC_MuteTimer = 100;
			break;   
		
		case KEY_SLEFT:
		case KEY_LEFT:
//		case KEY_SPREV:
			CDC_Infor.CDCOpCode = CDC_OP_TRKDN;
			F_CDC_Mute = 1;
			CDC_MuteTimer = 100;
			break;
			
		case KEY_LRIGHT:
//		case KEY_SFF:
			if(CDC_Infor.CDCStatus == CDC_Fasting)
			{
				CDC_Infor.CDCOpCode = CDC_OP_PLAY;  
				F_CDC_Mute = 0;
			}
			else
			{
				CDC_Infor.CDCOpCode = CDC_OP_FFW;
				F_CDC_Mute = 1;
			}
			break;
			
		case KEY_LLEFT:
//		case KEY_SREW:
			if(CDC_Infor.CDCStatus == CDC_Fasting)
			{
				CDC_Infor.CDCOpCode = CDC_OP_PLAY;  
				F_CDC_Mute = 0;
			}
			else
			{
				CDC_Infor.CDCOpCode = CDC_OP_FRW;  
				F_CDC_Mute = 1;	
			}
			break;
			
		case KEY_LRRIGHT:
		case KEY_LRLEFT:
			CDC_Infor.CDCOpCode = CDC_OP_PLAY;  
			F_CDC_Mute = 0;			
			break;

		
		case KEY_LUP:
			CDC_Infor.CDCOpCode = CDC_OP_DSKUP;
			F_CDC_Mute = 1;
			CDC_MuteTimer = 200;
			break;

		
		case KEY_LDN:
			CDC_Infor.CDCOpCode = CDC_OP_DSKDN;
			F_CDC_Mute = 1;
			CDC_MuteTimer = 200;
			break;
			
		case KEY_MUTE:
		case KEY_SMUTE:
		case KEY_LMUTE:
			if(CDC_Infor.CDCStatus ==  CDC_Pausing)
			{
	                	F_CDC_Mute = 0;
				CDC_Infor.CDCOpCode = CDC_OP_PAUSEOFF;
			}
			else
			{
                		F_CDC_Mute = 1;
				CDC_Infor.CDCOpCode = CDC_OP_PAUSE;
			}      			
			F_CdcIsPaused = ~F_CdcIsPaused;
			break;
			
		case KEY_SM1:
		case KEY_M1:
		case KEY_LM1:		
			if(CDC_Infor.CurrTrkMode == CDC_MOD_TRKRPT)
			{
				CDC_Infor.CDCOpCode =  CDC_OP_RPTOFF;
			}
			else
			{
				CDC_Infor.CDCOpCode = CDC_OP_TRKRPT;
			}
			break;

		case KEY_SM2:
		case KEY_M2:
		case KEY_LM2:
			if(CDC_Infor.CurrTrkMode == CDC_MOD_TRKSHF)
			{
				CDC_Infor.CDCOpCode =  CDC_OP_SHFOFF;
			}
			else
			{
				CDC_Infor.CDCOpCode = CDC_OP_TRKSHF;
			}
			break;
			
		case KEY_SM3:
		case KEY_M3:
		case KEY_LM3:		
			if(CDC_Infor.CurrTrkMode == CDC_MOD_TRKSCAN)
			{
				CDC_Infor.CDCOpCode = CDC_OP_SCANOFF;
			}
			else
			{
				CDC_Infor.CDCOpCode = CDC_OP_TRKSCAN;
			}
			break;
			
//		case KEY_SENT:
		case KEY_SOK:		
			CDC_Infor.CDCOpCode = CDC_OP_PLAY;  
			F_CDC_Mute = 0;	
			break;

		default:

			break;
	}
	return;
}

void CDC_ErrProcess(void)
{
	if((Curr_Work_Mode == CDC) || (Next_Work_Mode == CDC))
	{
		SetWorkMode(Tuner);
	}

	if(Last_Work_Mode == CDC)
	{
		Last_Work_Mode = IDLE;
	}
	return;
}

#if 0
/*Current CDC status info is different from previous, set OSD refresh flags*/
void CDC_SetDispRefFlag(void)
{
	if(CDC_Infor.CurrDiscNo != Pre_CDC_Infor.CurrDiscNo)
	{
		F_CDCDiskInfoRefresh = 1;
	}
	if(CDC_Infor.CDCDiscExist != Pre_CDC_Infor.CDCDiscExist)
	{
		F_CDCDiskInfoRefresh = 1;
	}
	if(CDC_Infor.CurrTrkNo != Pre_CDC_Infor.CurrTrkNo)
	{
		F_CDCTrackInfoRefresh = 1;
	}
	if((CDC_Infor.CurrTrkMins != Pre_CDC_Infor.CurrTrkMins) ||
	    (CDC_Infor.CurrTrkSecs != Pre_CDC_Infor.CurrTrkSecs))
	{
		F_CDCPlayTimeRefresh = 1;
	}
	if(CDC_Infor.CurrTrkMode != Pre_CDC_Infor.CurrTrkMode)
	{
		F_CDCTrackInfoRefresh = 1;
	}
	
	Pre_CDC_Infor = CDC_Infor;
	
	return;
}

void CDC_DetExtSignal(void)
{
	switch(++CDC_DetVideoStep)
	{
		case 1:
			/*set PortA3 to floating interrupt */
			PAOR.DATA |= 0x08;		/*MSB-****1***-LSB*/
			AuxSignalDetCnt = 0;
			CDC_ExtSignalCnt = 0;
			break;
		case 230: /*delay 300ms, then check video signal*/
			AuxSignalDetCnt = 0;
			break;
		case 250:
			if((AuxSignalDetCnt > 6) && (AuxSignalDetCnt < 80))/* video signal exist*/
			{
				CDC_ExtSignalCnt++;
			}
			AuxSignalDetCnt = 0;
			break;
		case 270: /*check video signal for a second time*/
			if((AuxSignalDetCnt > 6) && (AuxSignalDetCnt < 80))/* video signal exist*/
			{
				CDC_ExtSignalCnt++;
			}
			AuxSignalDetCnt = 0;
			break;
		case 290: /*check video signal for a third time*/
			if((AuxSignalDetCnt > 6) && (AuxSignalDetCnt < 80))/* video signal exist*/
			{
				CDC_ExtSignalCnt++;
			}
			TimerOSDSyn = 2;
			/*set PortA3 to floating input, prevent watch-dog from overflowing */
			PAOR.DATA &= 0xf7;		/*MSB-****0***-LSB*/
			F_CdcDetVideoFin = 1;
			if(CDC_ExtSignalCnt<2)
			{
				OsdMode = INTERNAL_SYN;
			}
			break;
		default:
			break;
	}
	return;
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -