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

📄 cabledet_lbadc.c

📁 GM5621原代码
💻 C
字号:
/*
	$Workfile:   cabledet_lbadc.c  $
	$Revision:   1.7  $
	$Date:   Jul 07 2006 03:45:50  $
*/

//******************************************************************
//
//          Copyright (C) 2002. GENESIS MICROCHIP INC.
//  All rights reserved.  No part of this program may be reproduced.
//
//	Genesis Microchip Corp., 2150 Gold Street
//			Alviso, CA 95002	USA
//  Genesis Microchip Inc., 165 Commerce Valley Dr. West
//          Thornhill, Ontario, Canada, L3T 7V8
//
//================================================================
//
//  MODULE: cabledet_lbadc.c
//
//******************************************************************
#include "inc\all.h"
#include "math.h"

#ifdef USE_LBADC_CABLE_DETECTION

#define	DEBUG_CD  0

#if DEBUG_CD && DEBUG_MSG
	#define	msg(a,b)	gm_Print((const char far *)a,b)
#else
	#define msg(a,b)
#endif

#if defined(PHOENIX_U) || defined(PHOENIX)
//#define CABLE_DETECT_RUNTIME	  	100 //sweng0703: move to 57xx_option.H
#else
#define CABLE_DETECT_RUNTIME	  	100 // run cable detect every 100ms.  
#endif

// Default values:
#ifndef LBADC_CABLE_DET_CHANNEL
	#define LBADC_CABLE_DET_CHANNEL	LBADC_IN2
#endif
#if (defined(RD3_57XX) && (BOARD==RD3_57XX)) || (defined(EV_BD_B_57XX) && (BOARD==EV_BD_B_57XX))
	// No Cable		3.3 V	255
	// DVI Only		2.06V	160
	// VGA Only	  	1.03V	80
	// VGA & DVI	   0V	0
	#ifndef NO_CABLE_THRESH
		#define NO_CABLE_THRESH 225 // greater than 225 is no cable
	#endif                   
	#ifndef DVI_THRESH
		#define DVI_THRESH		130 // greater than 130 is dvi cable only
	#endif
	#ifndef VGA_THRESH
		#define VGA_THRESH		50 // greater than 50 is VGA cable only
	#endif					      // less than 50 is VGA only.
#else  //!(BOARD==RD3_57XX)
	// default lbadc cable detect values:
	// LBADC values for EV1 board:
	//  State:    (V)  (ADC counts)
	// No Cable	 1.5V   	116
	// VGA only  1.1V    85
	// DVI only  3.3V    255
	// VGA + DVI 2.5V    193
	#ifndef DVI_THRESH
		#define DVI_THRESH		230 // greater than 230 is dvi cable only
	#endif
	#ifndef DVI_VGA_THRESH
		#define DVI_VGA_THRESH	150 // greater than 150 is dvi+vga
	#endif
	#ifndef NO_CABLE_THRESH
		#define NO_CABLE_THRESH 100 // greater than 100 is no cable
	#endif                         // less than 100 is VGA only.
#endif //(BOARD==RD3_57XX)

// bitfield to hold status of VGA and DVI cable detect.
static BYTE B_CableDetect = 0;
#define VGA_CABLE_DETECT_MASK 0x01
#define DVI_CABLE_DETECT_MASK	0x02
#if defined(RD3_57XX) && (BOARD==RD3_57XX)
	#define DVI_B_CABLE_DETECT_MASK 0x04
#endif	
//****************************************************************
//	DESCRIPTION	:	To detect whether cable is connected or not
//					for VGA and DVI inputs using the LBADC input.  This
//             handler runs in the background monitoring the cable
//             and updating the status of B_CableDetect.
//
//***************************************************************
void CableDetect_Handler(void)
{
#if !USE_CABLE_DETECT_TIMER
	static DWORD lastTime = 0;
#endif
	BYTE   lbadcVal;
#if DEBUG_CD
	#if (defined(RD3_57XX) && (BOARD==RD3_57XX)) || (defined(EV_BD_B_57XX) && (BOARD==EV_BD_B_57XX))
		static BYTE lastCBDetect=0;
	#else
		static lastVal = 0;
	#endif		
#endif

#if USE_CABLE_DETECT_TIMER
	if(gm_TimerCheck(CableDetect_10MS_TMR)==gmd_TMR_ACTIVE)
		return;
	gm_TimerStart(CableDetect_10MS_TMR, CABLE_DETECT_RUNTIME/10);
#else
	// only run handler every CABLE_DETECT_RUNTIME (ms.)
	if(labs(gm_ReadSystemTime() - lastTime) < CABLE_DETECT_RUNTIME)
		return;
	lastTime = gm_ReadSystemTime();
#endif	
#if USE_GETKEY_TIMER_ISR
	// ScanAdcKey() can be called from an ISR (see keypad.c) if this
	// function is called from an interrupt, we should disable the interrups
	// around this function to avoid simultanious access to the LBADC registers.
	gm_DisableInterrupts();
#endif
	lbadcVal = ScanAdcKey(LBADC_CABLE_DET_CHANNEL);
#if USE_GETKEY_TIMER_ISR
	// re-enable interrupts.
	asm{ STI };
#endif

#if defined(RD3_57XX) && (BOARD==RD3_57XX)
	#if (MUX_ON_PCD_DVI_CTRL==26) && (MUX_ON_PCD_RGB_CTRL==26)

		if (!(gm_ReadRegByte(GPOUTPUT3)& GPIO26_OUT))
		{   //Mux swith is on DVI_A
			B_CableDetect &= ~(DVI_CABLE_DETECT_MASK | VGA_CABLE_DETECT_MASK);
			if(lbadcVal > NO_CABLE_THRESH);
			
			else if(lbadcVal > DVI_THRESH)
				B_CableDetect |= DVI_CABLE_DETECT_MASK;
			else if(lbadcVal > VGA_THRESH)
				B_CableDetect |= VGA_CABLE_DETECT_MASK;
			else // Both VGA & DVI
				B_CableDetect |= (DVI_CABLE_DETECT_MASK | VGA_CABLE_DETECT_MASK);

		}
		else  //MUX_ON_DVI_B
		{
			B_CableDetect &= ~(DVI_B_CABLE_DETECT_MASK | VGA_CABLE_DETECT_MASK);
			if(lbadcVal > NO_CABLE_THRESH);
				
			else if(lbadcVal > DVI_THRESH)
				B_CableDetect |= DVI_B_CABLE_DETECT_MASK;
			else if(lbadcVal > VGA_THRESH)
				B_CableDetect |= VGA_CABLE_DETECT_MASK;
			else // Both VGA & DVI
				B_CableDetect |= (DVI_B_CABLE_DETECT_MASK | VGA_CABLE_DETECT_MASK);

		}		

	#else // !(MUX_ON_PCD_DVI_CTRL==26) && (MUX_ON_PCD_RGB_CTRL==26)
		gm_Print("Cable Detection failed in RD3_57XX Board!!!",0);
	#endif //(MUX_ON_PCD_DVI_CTRL==26) && (MUX_ON_PCD_RGB_CTRL==26)

#elif defined(EV_BD_B_57XX) && (BOARD==EV_BD_B_57XX)

	if(lbadcVal > NO_CABLE_THRESH)
		B_CableDetect = 0x00;
	else if(lbadcVal > DVI_THRESH)
		B_CableDetect = DVI_CABLE_DETECT_MASK;
	else if(lbadcVal > VGA_THRESH)
		B_CableDetect = VGA_CABLE_DETECT_MASK;
	else // Both VGA & DVI
		B_CableDetect = (DVI_CABLE_DETECT_MASK | VGA_CABLE_DETECT_MASK);

#else  //!(BOARD==RD3_57XX)
	if(lbadcVal > DVI_THRESH)
		B_CableDetect = DVI_CABLE_DETECT_MASK;
	else if(lbadcVal > DVI_VGA_THRESH)
		B_CableDetect = (DVI_CABLE_DETECT_MASK | VGA_CABLE_DETECT_MASK);
	else if(lbadcVal > NO_CABLE_THRESH)
		B_CableDetect = 0x00;
	else // VGA only
		B_CableDetect = VGA_CABLE_DETECT_MASK;
#endif	//(BOARD==RD3_57XX)

#if DEBUG_CD
	#if (defined(RD3_57XX) && (BOARD==RD3_57XX)) || (defined(EV_BD_B_57XX) && (BOARD==EV_BD_B_57XX))
	if(lastCBDetect!=B_CableDetect)
		{
			if(B_CableDetect==0)
				msg("No Cable Detect",0);
			else
			{
				if(B_CableDetect&VGA_CABLE_DETECT_MASK)
					msg("VGA cable detect",0);
				if(B_CableDetect&DVI_CABLE_DETECT_MASK)
					msg("DVI cable detect",0);
				#if (defined(RD3_57XX) && (BOARD==RD3_57XX))				
				if(B_CableDetect&DVI_B_CABLE_DETECT_MASK)
					msg("DVI_B cable detect",0);
				#endif
				
			}
		lastCBDetect=B_CableDetect;
		}
	#else  //!(defined(RD3_57XX) && (BOARD==RD3_57XX)) || (defined(EV_BD_B_57XX) && (BOARD==EV_BD_B_57XX))
	if(abs(lastVal - lbadcVal) > 4)
	{
		msg("lbadcVal %d",(WORD)lbadcVal);
		if(B_CableDetect & VGA_CABLE_DETECT_MASK)
			msg("vga cable detect",0);
		if(B_CableDetect & DVI_CABLE_DETECT_MASK)
			msg("dvi cable detect",0);
		if(!B_CableDetect)
			msg("no cable",0);
		lastVal=lbadcVal;
	}
	#endif	//(BOARD==RD3_57XX)
#endif // DEBUG_CD	
}


//****************************************************************
//	DESCRIPTION	:	Function used by InputCableDetect() to determine
//                if the cable is connected.  When using the
//                CableDetect_Handler, this function returns the
//                B_CableDetect & VGA_CABLE_DETECT_MASK result, or
//						B_CableDetect & DVI_CABLE_DETECT_MASK result..
//	SYNTAX     	:	gmt_RET_STAT IsVgaCableConnected(void)
//	SYNTAX     	:	gmt_RET_STAT IsDviCableConnected(void)
//	PARAMETERS	:	none
//  RETURN		:	gmd_FALSE, gmd_TRUE
//
//***************************************************************
gmt_RET_STAT IsVgaCableConnected(void)
{
	if(B_CableDetect & VGA_CABLE_DETECT_MASK)
		return gmd_TRUE;
	return gmd_FALSE;
}
gmt_RET_STAT IsDviCableConnected(void)
{
	if(B_CableDetect & DVI_CABLE_DETECT_MASK)
		return gmd_TRUE;
	return gmd_FALSE;
}

#if defined(RD3_57XX) && (BOARD==RD3_57XX)
gmt_RET_STAT IsDvi_B_CableConnected(void)
{
	if(B_CableDetect & DVI_B_CABLE_DETECT_MASK)
		return gmd_TRUE;
	return gmd_FALSE;
}
#endif


#endif// USE_LBADC_CABLE_DETECTION

⌨️ 快捷键说明

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