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

📄 ddc2bi.c

📁 完整的软件学习--显示器驱动视频软件
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "types.h"
#include "board.h"
#include "debug.h"
#include "global.h"
#include "ms_reg.h"
#include "adjust.h"
#include "Menudef.h"
#include "Misc.h"
#include "MsOsd.h"
#include "Nvram.h"
#include "Userpref.h"
#include "Menufunc.h"
#include "UserPrefDef.h"
#include "Ddc2bi.h"
#include "Ms_rwreg.h"

#if (MSTMCU|MTV512)//Albert

#define ASSETSTARTADDR		0x1A0
#define ASSETLENGTH			64
#define MaxBufLen			50//12
#define FW_Version			40
#define MaxClock	(StandardModeHTotal+60)
#define MinClock	(StandardModeHTotal-60)

BYTE xdata rxIndex;//=0;
BYTE xdata rxStatus;
BYTE xdata rxLength;//=0;
BYTE xdata rxChkSum;//=0;
BYTE xdata txStatus;//;
BYTE xdata txLength;
BYTE xdata sendData;
BYTE xdata CommandCode;
BYTE xdata CPCode;
BYTE xdata ValueH;
BYTE xdata ValueL;
BYTE xdata RetValueH;
BYTE xdata RetValueL;
BYTE xdata PageValue;
#if MSTMCU
BYTE xdata RxInputPort;
#endif
WORD xdata WordValue;

BYTE xdata CmIndex=0;  // Debug
BYTE xdata DDCBuffer[MaxBufLen];

BYTE *txBufferPtr;

BYTE code nullMsg1[3]={0x6e, 0x80, 0xbe};
BYTE code nullMsg[3]={0x6e, 0x80, 0xbe};

extern bit RewriteDDC_A1,RewriteDDC_A2;

//==============jeff ================
extern BYTE MenuPageIndex;
extern BYTE MenuItemIndex;
//==================================

void Draw_RootMenu(void);
void DrawOsdMenu(void);
//void SetColorTempDDCCI(BYTE Color_Temp);
void Power_TurnOffGreenLed(void);
void Power_TurnOnAmberLed(void);
BYTE AlignControl(void);
#if 0
WORD GetDDCCIRColor6500KValue(void);
WORD GetDDCCIGColor6500KValue(void);
WORD GetDDCCIBColor6500KValue(void);
WORD GetDDCCIRColor9300KValue(void);
WORD GetDDCCIGColor9300KValue(void);
WORD GetDDCCIBColor9300KValue(void);
WORD GetDDCCIRColorsRGBValue(void);
WORD GetDDCCIGColorsRGBValue(void);
WORD GetDDCCIBColorsRGBValue(void);
#endif
WORD GetRedColorValue(void);
WORD GetGreenColorValue(void);
WORD GetBlueColorValue(void);
Bool ResetAllSetting(void);
Bool AutoConfig(void);
Bool AutoColor(void);
Bool ExecuteKeyEvent(MenuItemActionType menuAction);

extern void Save6500KAutoColor(void);
extern void Save9300KAutoColor(void);
extern void NVRam_WriteTbl(WORD addr, BYTE *buffer, BYTE count);
extern void NVRam_ReadTbl(WORD addr, BYTE *buffer, BYTE count);
extern WORD GetScale100Value(WORD value, WORD minValue, WORD maxValue);
extern Bool SetColorTemperatureUser(void);
extern Bool SetColorTemperature6500K(void);
extern Bool SetColorTemperature9300K(void);
#if EnablesRGB
extern Bool SetColorTemperaturesRGB(void);
#endif

//==========================================================
// receive/transmit buffer syntax defines
#define	LENGTH							0 
#define	COMMAND							1 
//#define	PARAMETER					2
#define DATA1							2
#define DATA2							3
#define CHKSUM							4

// DDC2Bi receive/transmit status bytes definitions
#define	DDC2B_CLEAR						0
#define	DDC2B_SRCADDRESS				       1
#define	DDC2B_COMMAND					2
#define	DDC2B_RECBODY					       3
#define	DDC2B_WAITFORCK					4
#define	DDC2B_COMPLETED					5
#define	DDC2B_MSGON						6
#define	DDC2B_OVER						       7

// DDC2Bi standard definitions
#define	DDC2B_DEST_ADDRESS				0x6e
#define	DDC2B_SRC_ADDRESS				0x51
#define	DDC2Bi_CONTROL_STATUS_FLAG		0x80

// checksum start values
#define	INITRxCK	DDC2B_SRC_ADDRESS ^ DDC2B_DEST_ADDRESS
#define	INITTxCK	0x50 ^ DDC2B_DEST_ADDRESS

//interrupt flag
#if MSTMCU
#define TXBI	BIT4//BIT7
#define RCBI	BIT3//BIT6
#else
#define TXBI	BIT7
#define RCBI	BIT6
#endif

#define SlvBMI	BIT5
#define WslvA1	BIT2
#define WslvA2	BIT1

// maximum wait time (msec) for getting the transmit buffer
#define	MAX_TXWAIT_DELAY		20

//==========================================================
BYTE code VGA_CAP_VCP[]=
{	 
	 'v','c','p','(','0','2',' ','0','4',' ','0','5',' ','0','E',' ','1',
	 '0',' ','1','2',' ','1','4','(','0','1',' ','0','5',' ','0','8',
	 ' ','0','B',')',' ','1','6',' ','1','8',' ','1','A',' ','1','E',
	 ' ','2','0',' ','3','0',' ','3','E',' ','5','2',' ','A','C',' ',
	 'A','E',' ','B','2',' ','B','6',' ','C','0',' ','C','6',' ','C',
	 '8',' ','C','9',' ','C','A',' ','D','6',' ','D','F',')',' ','v',
	 'c','p','_','p','2','(','3','7',' ','3','8',' ','3','9',' ','3',
	 'B',')',' ','t','y','p','e','(','L','C','D',')',' ','m','c','c',
	 's','_','v','e','r','(','1','.','1',')',' ','a','s','s','e','t',
	 '_','e','e','p','(','6','4',')',' ','m','p','u','(','0','.','0',
	 '4',')',
};

BYTE code DVI_CAP_VCP[]=
{	 
	 'v','c','p','(','0','4',' ','0','8',' ','1','0',' ','1','2',' ',
	 '1','4','(','0','2',' ','0','5',' ','0','6',' ','0','8',')',' ',
	 '1','6',' ','1','8',' ','1','A',' ','6','8',' ','A','8',' ','B',
	 '4',' ','B','6',' ','D','6',' ','E','3',' ','F','A',' ','F','F',
	 ')',' ','v','c','p','_','p','2','(','3','8',' ','3','9',' ','3',
	 'B',')',' ','t','y','p','e','(','L','C','D',')',' ','m','c','c',
	 's','_','v','e','r','(','1','.','1',')',' ','a','s','s','e','t',
	 '_','e','e','p','(','6','4',')',' ','m','p','u','(','0','.','0',
	 '4',')',
};

#if (DoDDC2BI)  // MSTMCU fendy mask DDC2BI!!!!
void	DDC2Bi_InitRx (void)
{
	// clear the rxState
	rxStatus = DDC2B_CLEAR;
	// the current buffer for a new message
	rxIndex = 0;
}

void	DDC2Bi_Init (void)
{
	// initialize various flags and data items
	
	DDC2Bi_InitRx ();
	txStatus   = DDC2B_CLEAR;		// initialize transmit status

	// enable the DDC2Bi(SlaveB) port
	ADC_DDCCI_ID = 0xB7;
	INTMASK_EN_ADC = 0x18;
	ADC_INT_FLAG = 0x00;

	if (0)//(DualInputIconEnableFlag) fendy
	{
	DVI_DDCCI_ID = 0xB7;
	INTMASK_EN_DVI = 0x18;
	DVI_INT_FLAG = 0x00;
	}
	
	MCU_P2_OUT_EN=MCU_P2_OUT_EN|(BIT2|BIT3);
	MCU_P2_FMD=MCU_P2_FMD|(BIT2|BIT3);
	DDC2BI_CTRL = 0x13;;
	
}


void	DDC2Bi_GetTxBuffer (void)
{ BYTE	i;								// loop variable
  for ( i=MAX_TXWAIT_DELAY; i>0; i--)
    if (txStatus == DDC2B_MSGON)
    	{ 
	      Delay1ms(1);
    	}
  txStatus = DDC2B_CLEAR;
}

BYTE DDC2Bi_ComputeChecksum(BYTE count)
{
	BYTE	checksum = INITTxCK;
	BYTE	i = 0;
	for ( ; count>0; count--)
		checksum ^= DDCBuffer[i++];
	return checksum;
}

void DDC2Bi_MessageReady (void)
{ 
  DDCBuffer[0] |= DDC2Bi_CONTROL_STATUS_FLAG; // 2004/11.23YYYY
  // compute the check sum and assign to tx buffer
  DDCBuffer[(DDCBuffer[0] & ~DDC2Bi_CONTROL_STATUS_FLAG) + 1] = 
  DDC2Bi_ComputeChecksum ((DDCBuffer[0] & ~DDC2Bi_CONTROL_STATUS_FLAG) + 1);
  //DDCBuffer[9] = DDC2Bi_ComputeChecksum(9);
  // wait until old packet sent out
  //DDCBuffer[10] = 0x6e;
  DDC2Bi_GetTxBuffer ();
  
  //DDCBuffer[9] = 0x50;
  // 
  //EA = 0;
  txBufferPtr = &DDCBuffer[0];
  txLength = (DDCBuffer[0] & (~DDC2Bi_CONTROL_STATUS_FLAG)) + 2;
  // re enable interrupts
  //EA = 1;
}


void	DDC2Bi_ParseCommand (void)
{
	BYTE length, command;// 2004/11.23YYYY
	
	length = DDCBuffer[LENGTH] & 0x7F;
	command = DDCBuffer[COMMAND];// 2004/11.23YYYY
	if(rxIndex <= 0) return;

	if(length <= 0) 
	{
		//hw_ClrGreenLed();
			#if 0// 2004/11.23YYYY
		  EA = 0;
  		txBufferPtr = &nullMsg1[1];
  		txLength = sizeof (nullMsg1);
  		// re enable interrupts
  		EA = 1;
  		RCBTXBBUF = DDC2B_DEST_ADDRESS;
			#endif
  		return;
	}
	
#if 1
    if(mStar_ReadOSDByte(IOSDC1)&0x01)
    {
       //Draw_RootMenu(); // 2004/11.24YYYY
       MenuPageIndex = RootMenu;
	   ExecuteKeyEvent(MIA_RedrawMenu);
    }

   Osd_Hide();  // 2004/11.24YYYY
#endif

   //----------------------
//Debug
	 #if 1
	length = AlignControl();
   #endif
	if(length <= 0) 
	{
		DDCBuffer[0] = 0x80;
		return;
	}
	else if(length == 0xFE || length == 0xFD)
	{
		DDCBuffer[0] = 0x80;	
		//return;
	}
	
	DDC2Bi_MessageReady();
	if(RxInputPort==0)
		ADC_RBUF_WDP = DDC2B_DEST_ADDRESS;
	else
		DVI_RBUF_WDP = DDC2B_DEST_ADDRESS;
	
}

void DDC2Bi_CommandHandler (void)
{
	BYTE index;
	if (rxStatus == DDC2B_COMPLETED)
	{
		index=0;
		DDC2Bi_ParseCommand ();
		Clr_RxBusyFlag();
		DDC2Bi_InitRx ();
		
	}
}

void DoDDCCI(BYTE intype)
{
	BYTE intFlag, rxByte;

	if(intype==0)
    	intFlag=ADC_INT_FLAG;//INTFLG;
    else
		intFlag=DVI_INT_FLAG;
    
   if ( intFlag)
    {
    	switch (intFlag & (TXBI | RCBI ))
    	{

    	case TXBI:
				// 
		txStatus = DDC2B_MSGON;
				// no characters left
		if (!(txLength))
		{
					// clear the transmit status
			txStatus = DDC2B_CLEAR;
			if(intype==0)		
				ADC_RBUF_WDP = 0;
			else
				DVI_RBUF_WDP = 0;
			//EX1=1;
			return ;		
		}
				// send out the current byte
		if(intype==0)		
			ADC_RBUF_WDP = *txBufferPtr++;
		else
			DVI_RBUF_WDP =  *txBufferPtr++;
		txLength--;
		intFlag &= (~TXBI); //clear interrupt flag
		break;

	case RCBI:
				// read the received byte
		if(intype==0)		
			rxByte = ADC_WBUF_RDP;//RCBTXBBUF;
		else	
			rxByte = DVI_WBUF_RDP;//RCBTXBBUF;
				// depending of the message status
		switch (rxStatus)
		{
					// in case there is nothing received yet
		case DDC2B_CLEAR:
			if (rxByte == DDC2B_SRC_ADDRESS)
			{
				rxStatus++;// = DDC2B_SRCADDRESS;
				rxChkSum = INITRxCK;

⌨️ 快捷键说明

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