📄 cabledet_lbadc.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 + -