📄 ddc2bi.c
字号:
#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 + -