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

📄 ddcci.c

📁 GM5621原代码
💻 C
📖 第 1 页 / 共 3 页
字号:
						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 + -