scaler.c

来自「RTD2662板卡源代码」· C语言 代码 · 共 552 行 · 第 1/2 页

C
552
字号
// Output Value : None
//--------------------------------------------------
void CScalerNonlinearScaleUp(BYTE Option)
{

	UINT8 FlatSuFac = 0;
	UINT8 InitSuFac = 0;
	UINT16 w1;	// segment1 pixel
	UINT16 w2;	// segment2 pixel
	UINT16 w3;	// segment3 pixel
	UINT8 SU_Waighting;//range from 35 ~ 45

   	if(GET_NONLINEAR_VALUE() == 0)
   	{
		CTimerDelayXms(120);
    	CScalerSetByte(_STATUS0_02, 0x00);
    	return;
   	}

   	SU_Waighting =  35 + GET_NONLINEAR_VALUE();

	if(Option & _BIT2)
	{
             	w1 = stDisplayInfo.DHWidth/5 + 71;
		w2 = w1 - 71; //w2
		w3 = stDisplayInfo.DHWidth - SHL(w1, 1) - SHL(w2, 1); //w3

#if(_NONLINEAR_SCALEUP_METHOD == _BOUL)
		((unsigned int *) pData)[2] = stDisplayInfo.DHWidth;

		FlatSuFac = (DWORD)512 * stModeInfo.IHWidth* 4 /((unsigned int *) pData)[2] / 5;
		FlatSuFac = FlatSuFac & 0x0001 ? SHR(FlatSuFac + 1, 1) : SHR(FlatSuFac, 1);//round

		//Csu > Fsu
		//Fsu - Csu < 0
		//Fsu(w1 + w2) - [Xm - Su(w1 + 1) - Fsu(1 + w2 + w3)] < 0
		//Fsu(1 + w1 + 2w2 + w3) - Xm + Su(w1 + 1) < 0
		//Su < [Xm - Fsu(1 + w1 + 2w2 + w3)]/(w1 + 1)

		((unsigned long *) pData)[3] = 512 * ((DWORD)(stModeInfo.IHWidth - 1) -
										(DWORD)FlatSuFac * (w1 + SHL(w2, 1) + w3) /	255)
										/(DWORD)(w1 + 1);
              ((unsigned long *) pData)[3] = ((unsigned long *) pData)[3] & 0x00000001 ?
		SHR(((unsigned long *) pData)[3] + 1, 1) : SHR(((unsigned long *) pData)[3], 1);//round

		//ucInit_SU_Fac = ((unsigned long*)Data)[3] > 254 ? 254 : (BYTE)((unsigned long*)Data)[3]; //scaling factor can't larger than 1
		if (((unsigned long *) pData)[3] > 254)
		{
			return;
		}
		else
			InitSuFac = ((unsigned long *) pData)[3];
#else
		//Set the initial scale up factor equal to average scale up factor * 0.2
		//Calculate the scaling factor normalize to 255
		((UINT32*)pData)[0] = (UINT32)255 * stModeInfo.IHWidth / stDisplayInfo.DHWidth;
		InitSuFac = SHR(((UINT32*)pData)[0]*3 , 2);


		//Fsu > Csu
		//Fsu - Csu > 0
		//Fsu - [Xm - Su(w1 + 1) - Fsu(1 + w2 + w3)]/(w1 + w2) > 0
		//Fsu(w1 + w2) - [Xm - Su(w1 + 1) - Fsu(1 + w2 + w3)] > 0
		//Fsu(1 + w1 + 2w2 + w3) - Xm + Su(w1 + 1) > 0
		//Fsu > [Xm - Su(w1 + 1)]/(1 + w1 + 2w2 + w3)
		((UINT32*)pData)[3] = 255 * ((UINT32)(stModeInfo.IHWidth - 1) -
							(UINT32)w1 * InitSuFac / 255) /(w1 + SHL(w2, 1) + w3 - 8);
		if (((UINT32*)pData)[3] > 254)
		{
			return;
		}
		else
		{
			//FlatSuFac = (SHR(((UINT32*)pData)[0] * 3, 1) > 255) ? 255 : SHR(((UINT32*)pData)[0] * 3, 1);
			FlatSuFac = (SHR(((UINT32*)pData)[0] * SU_Waighting, 5) > 255) ? 255 : SHR(((UINT32*)pData)[0] * SU_Waighting, 5);

		}

#endif
		//((UINT32 *) pData)[3] = 16777216 * (UINT32) InitSuFac / 255 + 0x00000008;
		((UINT32 *) pData)[3] = 1048576 * (UINT32) InitSuFac / 255;

		CTimerWaitForEvent(_EVENT_DEN_STOP);
              pData[0] = ((((DWORD *) pData)[3] >> 16) & 0x0f);
		pData[1] = ((((DWORD *) pData)[3] >> 8) & 0xff);
		pData[2] = ((((DWORD *) pData)[3]) & 0xff);


		CScalerSetByte(_SU_ACCESS_PORT_33, 0x80); //don't remove this code thus the value can be fill in register
		CScalerSetByte(_SU_ACCESS_PORT_33, 0x80);
	       CScalerWrite(_SU_DATA_PORT_34, 3, pData, _NON_AUTOINC);
	       CScalerSetByte(_SU_ACCESS_PORT_33, 0x00);


		//Calculate Csu = (Xm - Su(w1 + 1) - Fsu(1 + w2 + w3))/(w1 + w2)
		((UINT32*)pData)[2] = 1048576 * ((UINT32)stModeInfo.IHWidth -
							(UINT32)InitSuFac * w1 / 255 -
							(UINT32)FlatSuFac * (w2 + w3 - 1) / 255) /(w1 + w2 - 2);

		//Calculate SU
		((UINT32*)pData)[3] = SHR((2097152 * (UINT32)InitSuFac /255) + 1, 1);

		if (((unsigned long *)pData)[3] > ((unsigned long *) pData)[2]) {
			((unsigned long *) pData)[3] = 0 -(((unsigned long *) pData)[3] -
										           ((unsigned long *) pData)[2]) /(DWORD)w1; //The MSB is sign bit
		}
 else {
		       if (((unsigned long *)pData)[3] > ((unsigned long *) pData)[2]) {
				((unsigned long *) pData)[3] = 0 -(((unsigned long *) pData)[3] -
										           ((unsigned long *) pData)[2]) /(DWORD)w1; //The MSB is sign bit
			} else {
			//Calculate d1
			((UINT32*) pData)[3] = (((UINT32*)pData)[2] - ((UINT32*)pData)[3]) / (UINT32)w1;
			}

			pData[6] = ((((DWORD *) pData)[3] >> 8) & 0xff);
			pData[7] = (((DWORD *) pData)[3]  & 0xff);

			//Calculate Fsu
			((UINT32*)pData)[3] = SHR((2097152 * (UINT32)FlatSuFac / 255) + 1, 1);

              	if (((unsigned long *) pData)[3] > ((unsigned long *) pData)[2]) {
				((UINT32*)pData)[3] = (((UINT32*)pData)[3] - ((UINT32*)pData)[2]) / (UINT32)w2;
              	}else{
                           	((unsigned long *) pData)[3] = 0 -	(((unsigned long *) pData)[2] -	((unsigned long *) pData)[3]) /(DWORD)w2;
              	}

              }

		pData[8] = ((((DWORD *) pData)[3] >> 8) & 0xff);
		pData[9] = (((DWORD *) pData)[3] & 0xff);

#if(_NONLINEAR_SCALEUP_METHOD == _BOUL)
       	w2 += 1;
		w3 += 1;
#else
		w1 -= 1;
		w2 -= 1;
		w3 -= 1;
#endif

       	pData[0] = AND(HIBYTE(w1), 0x07);
		pData[1] = LOBYTE(w1);
		pData[2] = AND(HIBYTE(w2), 0x07);
		pData[3] = LOBYTE(w2);
		pData[4] = AND(HIBYTE(w3), 0x07);
		pData[5] = LOBYTE(w3);

		CScalerSetByte(_SU_ACCESS_PORT_33, 0x86);  //don't remove this code thus the value can be fill in register
		CScalerSetByte(_SU_ACCESS_PORT_33, 0x86);
       	CScalerWrite(_SU_DATA_PORT_34, 10, pData, _NON_AUTOINC);
       	CScalerSetByte(_SU_ACCESS_PORT_33, 0x00);
		CTimerDelayXms(120);
      	CScalerSetByte(_STATUS0_02, 0x00);
    }
}

//--------------------------------------------------
// Description  : Progress the Nonlinear scale up
// Input Value  :
//                Option : Indicate whether scale up be acyivate now
// Output Value : None
//--------------------------------------------------
void CScalerNonlinearScaleDown(BYTE Option)
{
	UINT8 FlatSdFac;//This value must large than 64, scale down factor can't exceed 4 times
	UINT16 w1;
	UINT16 w2;

	//if(FlatSdFac < 68)
	//   return;
    	if(GET_NONLINEAR_VALUE() == 0)
	{
	   //CScalerSetBit(_SCALE_DOWN_CTRL_23, 0xf7, 0x00);//disable non-linear scale down
       	return;
	}
	
    FlatSdFac =  68 + (10 - GET_NONLINEAR_VALUE());	//range from 68 ~ 78

	if (Option & _BIT3 ) // non-linear scaling down
	{
		w1 = SHR(stDisplayInfo.DHWidth, 2);
        	w2 = (stDisplayInfo.DHWidth - SHL(w1, 1)) - 1;


		//Calculate the Initial Scale down factor
		((UINT32*)pData)[3] = 1048576 * ((UINT32)((UINT32)stModeInfo.IHWidth - 1) -
			(w1 + w2) * (UINT32)FlatSdFac / 64) / w1;

		//Data[0] = 5;
		//Data[1] = info->channel ? _P1_47_H_SCALE : _P1_27_H_SCALE_DH;
		pData[0] = pData[13];
		pData[1] = pData[14];
		pData[2] = pData[15];

		((UINT32*)pData)[3] = (((UINT32*)pData)[3] - (UINT32) 1048576 * FlatSdFac / 64) / (w1 - 1);

		if (((UINT32*)pData)[3] > 0x3fff) //Accumulated factor too large
			return;
		
		pData[3] = pData[14] & 0x3f;
		pData[4] = pData[15];


		CTimerWaitForEvent(_EVENT_IEN_STOP);

		CScalerSetByte(_SD_ACCESS_PORT_24, 0x85);
		CScalerSetByte(_SD_ACCESS_PORT_24, 0x85);
	   	CScalerWrite(_SD_DATA_PORT_25, 5, pData, _NON_AUTOINC);	//hill modified for scale down error
	   	CScalerSetByte(_SD_ACCESS_PORT_24, 0x00);

		//Data[0] = 4;
		//Data[1] = info->channel ? _P1_4C_SD_ACC_WIDTHH : _P1_2C_SD_ACC_WIDTHH;
		pData[0] = HIBYTE(w1);
		pData[1] = LOBYTE(w1);
		pData[2] = HIBYTE(w2);
		pData[3] = LOBYTE(w2);
		//Data[6] = 0;
		//CRtdWrite();
		CScalerSetByte(_SD_ACCESS_PORT_24, 0x8a);
		CScalerSetByte(_SD_ACCESS_PORT_24, 0x8a);
	   	CScalerWrite(_SD_DATA_PORT_25, 4, pData, _NON_AUTOINC);	//hill modified for scale down error
	   	CScalerSetByte(_SD_ACCESS_PORT_24, 0x00);

		CScalerSetBit(_SCALE_DOWN_CTRL_23, 0xff, 0x08);
		CTimerDelayXms(120);
		CScalerSetByte(_STATUS0_02, 0x00);
		//CRtdClearBits((info->channel ? _P1_41_SD_CTRL2 : _P1_21_SD_CTRL2), _BIT2); // enable non-linear scaling down
	} // end of (GET_NONLINEAR_ON() && GET_HSCALE_UP()) // non-linear scaling

}
#endif
//731301***
#if((_TMDS_SUPPORT == _ON) || (_HDMI_SUPPORT == _ON))//V402 modify
//--------------------------------------------------
// Description  : Switch the Digital Input Port
// Input Value  : usSwitch  --> Parameter for Digital Input Port
// Output Value : None
//--------------------------------------------------
#if 0
void CScalerDigitalPortSwitch(void)
{
	CScalerPageSelect(_PAGE2);

	if(!CHdmiFormatDetect())
	{
            CScalerSetBit(_P2_POWER_ON_OFF_CTRL_A7, ~(_BIT6 | _BIT5), 0x00);
	}
	else
	{
            CScalerSetBit(_P2_POWER_ON_OFF_CTRL_A7, ~(_BIT6 | _BIT5), (_BIT6 | _BIT5));
	}

   /* switch(usSwitch)
    {
        case _DVI_D0_PORT:
        case _HDMI_H0_PORT:
            CScalerSetBit(_P2_TMDS_MEAS_RESULT0_A2, ~_BIT1, 0x00);
            CScalerSetBit(_P2_ANALOG_COMMON_CTRL2_AB, ~(_BIT1 | _BIT0), _BIT1 | _BIT0);
            CScalerSetBit(_P2_HDCP_PORT_CTRL_C2, ~_BIT1, 0x00);
            break;

        case _DVI_D1_PORT:
        case _HDMI_H1_PORT:
            CScalerSetBit(_P2_TMDS_MEAS_RESULT0_A2, ~_BIT1, _BIT1);
            CScalerSetBit(_P2_ANALOG_COMMON_CTRL2_AB, ~(_BIT1 | _BIT0), _BIT1 | _BIT0);
            CScalerSetBit(_P2_HDCP_PORT_CTRL_C2, ~_BIT1, _BIT1);
            break;
    }*/
    CTimerDelayXms(200);
    CScalerSetBit(_P2_HDCP_CTRL_C0, ~_BIT0, _BIT0);
}
#endif
#endif
//731301###

⌨️ 快捷键说明

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