📄 ddcci.c
字号:
msg("Set AC PINLOw %d",AC_VCPCommnd.ACPINLow);
gm_WriteNVRAMBlock(TheftDeterrence_ID, 0x00, (BYTE *)&AC_VCPCommnd, 0, sizeof(AC_VCPCommnd));
}
else
{
ACPinLowByte = VCPFeature.value;
}
}
break;
}
case DDC2B_CMD_VCP_ACPINHigh:
{
if (cmd == SET_VCP)
{
retVal = gm_ReadNVRAMBlock(TheftDeterrence_ID, 0x00, (BYTE *)&AC_VCPCommnd, 0, sizeof(AC_VCPCommnd));
if(AC_VCPCommnd.ACMode == 0)
{
AC_VCPCommnd.ACPINHigh = VCPFeature.value;
msg("Set AC PINHigh %d",AC_VCPCommnd.ACPINHigh);
gm_WriteNVRAMBlock(TheftDeterrence_ID, 0x00, (BYTE *)&AC_VCPCommnd, 0, sizeof(AC_VCPCommnd));
}
else
{
ACPinHighByte = VCPFeature.value;
}
}
break;
}
case DDC2B_CMD_VCP_TDState:
{
VCPFeature.value = TD_State;
}
break;
#endif
default:
{
//error condition - unsupported vcp opcode
return 1;
}
}
}
else if(VCPPage == 2)
{
switch(VCPFeature.vcp_opcode)
{
case DDC2B_CMD_VCP_ContrastAuto:
{
/* if (cmd == SET_VCP && VCPFeature.value)
AutoColor();
*/ break;
}
case DDC2B_CMD_VCP_OSDHPosition:
{
ProcessSetGetVCPAdjuster(cmd, ADJV_HPosOSD);
break;
}
case DDC2B_CMD_VCP_OSDVPosition:
{
ProcessSetGetVCPAdjuster(cmd, ADJV_VPosOSD);
break;
}
default:
{
//error condition - unsupported vcp opcode
ret = 1;
}
}
}
else
{ //error condition - unsupported page
//set current page to 0
VCPPage = 0;
// readExpected = 0; //no message back if page is not supported
ret = 1;
}
return ret;
}
//Note. Next code and data block is a template for Capabilities stings support.
//Define additional capability string and update CpReqStr array following example
//below. Each CpReqStr entry must not exceed MAX_CAP_SIZE bytes
BYTE ROM typestr[] = "type(LCD)";
//BYTE ROM vcpstr[] = "vcp(page0(02 04 05 06 08 0E 10 12 14(01 03 04 05 06 08) 16 18 1A 1E 20 30 3E 60 62 68(1) 8A 8C 9B 9C 9D 9E 9F A0 AC AE B6 C0 C6 C8 C9 CA D6(01 02 03 04) DF) page2(37 38 39))"; //To make MCCS 2.0 Compliant - 14June04
//BYTE ROM vcpstr[] = "vcp(page0(02 04 05 06 08 0E 10 12 14(01 03 04 05 06 08) 16 18 1A 1E 20 30 3E 60 62 68(1) 8A 8C 9B 9C 9D 9E 9F A0 AC AE B6 C0 C6 C8 C9 CA D6(01 02 03 04) DF FA FB FC FD) page2(37 38 39))"; //To make MCCS 2.0 Compliant - 14June04, added theft VCP cmd support -12Nov04 // Louis 0411, replaced for black level
BYTE ROM vcpstr[] = "vcp(page0(02 04 05 06 08 0E 10 12 14(01 03 04 05 06 08) 16 18 1A 1E 20 30 3E 60 62 68(1) 6C 6E 70 8A 8C 9B 9C 9D 9E 9F A0 AC AE B6 C0 C6 C8 C9 CA D6(01 02 03 04) DF FA FB FC FD) page2(37 38 39))"; // for black level
BYTE ROM assetstr[] = "asset_eep(40)"; //data length must be the same as SizeOfAssetManagementData define
BYTE ROM mccsstr[] = "mccs_ver(2.0)"; //To make MCCS 2.0 Compliant - 14June04
// Number of capabylity strings defined above
//#define NUM_OF_CAP_STR 4
#define NUM_OF_CAP_STR 7 //6 //To make MCCS 2.0 Compliant - 14June04 //to add theft support 12Nov04
#define MAX_CAP_SIZE 30
#define LAST_CAP_SIZE ((sizeof(vcpstr) - 1)%MAX_CAP_SIZE)
//To make MCCS 2.0 Compliant - 14June04
CapabilitiesRequestType ROM CpReqStr[] =
{
{ sizeof(typestr) - 1 , typestr },
{ MAX_CAP_SIZE , vcpstr },
{ MAX_CAP_SIZE , vcpstr + 1*MAX_CAP_SIZE },
{ MAX_CAP_SIZE , vcpstr + 2*MAX_CAP_SIZE },
{ MAX_CAP_SIZE , vcpstr + 3*MAX_CAP_SIZE },
{ MAX_CAP_SIZE , vcpstr + 4*MAX_CAP_SIZE },
{ MAX_CAP_SIZE , vcpstr + 5*MAX_CAP_SIZE }, //to add theft support - 12Nov04
{ LAST_CAP_SIZE , vcpstr + 6*MAX_CAP_SIZE },
{ sizeof(assetstr) - 1 , assetstr },
{ sizeof(mccsstr) - 1 , mccsstr },
{ 0 , 0 } //last entry
};
/*****************************************************************************\
FUNCTION: DDC2Bi_GetCapabilitiesRequest
USAGE: Process GetCapabilitiesRequest ddc2bi command
DESCRIPTION: Process GetCapabilitiesRequest ddc2bi command.
INPUT:
OUTPUT:
\*****************************************************************************/
static void _near DDC2Bi_GetCapabilitiesRequest(void)
{
WORD B_Offset = SWAP_BYTES(gDDCCI.DDC2Bi_GetCpRequestCmd.offset);
if(B_Offset == CpStrOffset + CpReqStr[CpStrID].size)
{ //next fragment
CpStrOffset = B_Offset;
CpStrID++;
}
else if(B_Offset == CpStrOffset)
{ //re-send current fragment
//do nothing
}
else
{ //otherwice send first fragment
CpStrID = 0;
CpStrOffset = 0;
}
//set command and length
txBuffer[COMMAND] = DDC2B_CMD_CapabilitiesRequest_Reply;
txBuffer[LENGTH] = 0x03;
if(CpReqStr[CpStrID].size != 0)
{
//update length
txBuffer[LENGTH] += CpReqStr[CpStrID].size;
//copy frament data
_fmemcpy(&txBuffer[4], CpReqStr[CpStrID].str, CpReqStr[CpStrID].size);
}
else
{
//if reached end of "capabilities string" send the packet
//with the next offset but zero data bytes
CpStrID--;
CpStrOffset -= CpReqStr[CpStrID].size;
}
txBuffer[LENGTH] |= BIT7;
}
#if USE_ACC_ACM
DDCCIToRegType ROM DDCCIToReg[] =
{
{ DDC2B_CMD_VCP_WindowPosTL_X, DH_WIN_START },
{ DDC2B_CMD_VCP_WindowPosTL_Y, DV_WIN_START },
{ DDC2B_CMD_VCP_WindowPosBR_X, DH_WIN_WIDTH },
{ DDC2B_CMD_VCP_WindowPosBR_Y, DV_WIN_LENGTH}
};
#define DDCCI_REG_NUM (sizeof(DDCCIToReg)/sizeof(DDCCIToRegType))
static void _near windowControl(BYTE cmd, BYTE opcode)
{
BYTE i;
WORD maxval = 0x07FF; // max size of window registers.
// find register.
for( i = 0; i < DDCCI_REG_NUM; i++ )
if (DDCCIToReg[i].opcode == opcode)
break;
if(i >= DDCCI_REG_NUM)
return;
if (cmd == SET_VCP)
{
gm_WriteRegWord(DDCCIToReg[i].reg, VCPFeature.value);
}
VCPFeature.value = gm_ReadRegWord(DDCCIToReg[i].reg);
VCPFeature.value = SWAP_BYTES(VCPFeature.value);
VCPFeature.max = SWAP_BYTES(maxval);
}
#endif
/*****************************************************************************\
FUNCTION: DDC2B_GetTimingReport
USAGE: Process GetTimingReport ddc2bi command
DESCRIPTION: Process GetTimingReport ddc2bi command.
INPUT:
OUTPUT:
\*****************************************************************************/
//extern InputFormatType GlobalMem InputFormat;
static void _near DDC2Bi_GetTimingReport(void)
{
/* #ifdef DEBUG_DDC2BI_VCP
print("GetTimingReport",0);
#endif //#ifdef DEBUG_DDC2BI_VCP
CommBuf.DDC2Bi_GetTiming_ReplyCmd.status = 0x00;
if (InputFormat.Flags & UnsupportedMode) //Out of range
SetBit(CommBuf.DDC2Bi_GetTiming_ReplyCmd.status, OutOfRangeBit);
if (InputFormat.Flags & UnknownMode)
SetBit(CommBuf.DDC2Bi_GetTiming_ReplyCmd.status, UnstblCountBit);
if (!(InputFormat.Flags & HSyncNegative))
SetBit(CommBuf.DDC2Bi_GetTiming_ReplyCmd.status, HSyncPolarityBit);
if (!(InputFormat.Flags & VSyncNegative))
SetBit(CommBuf.DDC2Bi_GetTiming_ReplyCmd.status, VSyncPolarityBit);
CommBuf.DDC2Bi_GetTiming_ReplyCmd.h_freq = InputFormat.Tags.HFreq*10; //10hz increment
CommBuf.DDC2Bi_GetTiming_ReplyCmd.v_freq = InputFormat.Tags.VFreq*10; //0.01hz increment
//set command and length
txBuffer[LENGTH] = 0x06;
txBuffer[COMMAND] = DDC2B_CMD_GetTimingReport_Reply;
*/}
/*****************************************************************************\
FUNCTION: DDC2Bi_EEPROMCmdHandler
USAGE: Process EEPROMRead, AssetRead and AssetWrite CUSTM Custom commands
DESCRIPTION: Process EEPROMRead, AssetRead and AssetWrite CUSTM Custom commands
INPUT:
OUTPUT:
\*****************************************************************************/
#define MAX_RW_LENGTH_AT_ONCE 0x20
static void _near DDC2Bi_EEPROMCmdHandler(void)
{
/* switch(CommBuf.DDC2Bi_EEPROMCmd.eeprom_cmd)
{
case DDC2B_CMD_CUSTM_EEPROMRead:
{
//set command and length
txBuffer[COMMAND] = DDC2B_CMD_CUSTM_EEPROM_Reply;
txBuffer[LENGTH] = 0x02 + CommBuf.DDC2Bi_EEPROMReadCmd.leng;
//read nvram data and clear readExpected flag if fail
readExpected = NVRam_ReadStructure( CommBuf.DDC2Bi_EEPROMReadCmd.addr, &(txBuffer[3]),
CommBuf.DDC2Bi_EEPROMReadCmd.leng);
break;
}
case DDC2B_CMD_CUSTM_AssetRead:
//set command and length
txBuffer[COMMAND] = DDC2B_CMD_CUSTM_EEPROM_Reply;
txBuffer[LENGTH] = 0x02 + CommBuf.DDC2Bi_AssetReadCmd.leng;
if (CommBuf.DDC2Bi_AssetReadCmd.offset +
CommBuf.DDC2Bi_AssetReadCmd.leng > SizeOfAssetManagementData)
{
//exceeding
DDC2B_j = MAX_RW_LENGTH_AT_ONCE -
CommBuf.DDC2Bi_AssetReadCmd.offset -
CommBuf.DDC2Bi_AssetReadCmd.leng +
SizeOfAssetManagementData;
for (DDC2B_i = 0; DDC2B_i < DDC2B_j; DDC2B_i++)
txBuffer[DDC2B_i + DDC2B_j + 3] = 0;
}
else
{
DDC2B_j = CommBuf.DDC2Bi_AssetReadCmd.leng;
}
//read nvram data and clear readExpected flag if fail
readExpected = NVRam_ReadStructure(AssetManagementDataStart + CommBuf.DDC2Bi_AssetReadCmd.offset,
&(txBuffer[3]),
DDC2B_j);
break;
case DDC2B_CMD_CUSTM_AssetWrite:
if (CommBuf.DDC2Bi_AssetWriteCmd.offset +
(CommBuf.DDC2Bi_AssetWriteCmd.length&0x7f) - 3 > SizeOfAssetManagementData)
{
DDC2B_j = MAX_RW_LENGTH_AT_ONCE -
CommBuf.DDC2Bi_AssetWriteCmd.offset -
(CommBuf.DDC2Bi_AssetWriteCmd.length&0x7f) + 3 +
SizeOfAssetManagementData;
}
else
{
DDC2B_j = CommBuf.DDC2Bi_AssetWriteCmd.length&0x7f - 3;
}
//write nvram data
NVRam_WriteStructure(AssetManagementDataStart + CommBuf.DDC2Bi_AssetWriteCmd.offset,
&(txBuffer[4]),
DDC2B_j);
readExpected = 0;
break;
default :
{
readExpected = 0; //not supported
}
}
*/}
#if THEFT_DETERRENCE_SUPPORT
void DDC2Bi_IsTheftDeterrenceEnable(void)
{
BYTE ret;
ret = gm_ReadNVRAMBlock(TheftDeterrence_ID, 0x00, (BYTE *)&AC_VCPCommnd, 0, sizeof(AC_VCPCommnd));
if (ret == gmd_OK)
{
if(AC_VCPCommnd.ACMode) //Theft enabled
{
//start the timer
gm_TimerStart(TD_100ms_TMR, (AC_VCPCommnd.ACTimeout*600));
TD_TimerStart = 1;
TD_State = DDCCI_TDSTATE_POSSIBLETHEFT; //0x01 - possible theft state
//display an OSD, "Theft mode activated"
msg("Theft mode activated..Enter PIN:",0);
}
else
{
TD_State = DDCCI_TDSTATE_NORMAL; //0x0 - normal operation state
msg("Theft Deterrence disabled",0); //normal operation
}
}
else
{
msg("Theft Deterrence block not found in nvram",0); //Theft deterrence not supported - normal operation
}
}
void DDC2Bi_TheftDeterrenceHandler(void)
{
BYTE ret;
ret = gm_ReadNVRAMBlock(TheftDeterrence_ID, 0x00, (BYTE *)&AC_VCPCommnd, 0, sizeof(AC_VCPCommnd));
if (ret == gmd_OK) {
if((AC_VCPCommnd.ACMode) && TD_State) //Theft enabled
{
//compare the ACPIN
if((ACPinLowByte == AC_VCPCommnd.ACPINLow) && (ACPinHighByte == AC_VCPCommnd.ACPINHigh))
{
//clear/stop the timer -???
gm_TimerStop(TD_100ms_TMR);
TD_TimerStart = 0;
TD_State = DDCCI_TDSTATE_NORMAL; //0x0 - normal operation state
//remove theft mode & normal operation
gm_WriteRegByte(INST_AUTO_CTRL, 0x00);
//Remove the "Theft mode activated" osd
SendMsg(&OsdQ,MTO_MODE_CHANGE);
msg("ACPIN matched..",0);
msg("ACPinLowByte: %d",ACPinLowByte);
msg("ACPinHighByte: %d",ACPinHighByte);
}
else
{
//if timeout
if((TD_TimerStart && (gm_TimerCheck(TD_100ms_TMR) == gmd_TMR_TIMED_OUT)) ||
((TD_State == DDCCI_TDSTATE_THEFT) && (B_SyncState == gmd_HONVON)))
{
//set the monitor to unfavorable view
// gm_WriteRegByte(RED_BRIGHTNESS, 0x40);
// gm_WriteRegByte(GREEN_BRIGHTNESS, 0x40);
// gm_WriteRegByte(BLUE_BRIGHTNESS, 0x40);
gm_WriteRegByte(INST_AUTO_CTRL, 0xA0); //0x20
//Disable the main OSD and
//display "Theft Deterrence Mode" OSD
SendMsg(&OsdQ,MTO_THEFT_DETERRENCE);
msg("Timed out! Theft Deterrence mode!!",0);
//clear/stop the timer -???
gm_TimerStop(TD_100ms_TMR);
TD_TimerStart = 0;
TD_State = DDCCI_TDSTATE_THEFT; //0x02 - Theft state
}
else
{
msg("ACPIN doesn't match..",0);
}
}
}
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -