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

📄 tv_out.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	}
	UPDATE_TV_CON_REGISTER;
}	/* enable_tv_output() */

void enable_tv_vertical_interpolation(kal_uint8 on)
{
	if (on==KAL_TRUE)
	{
		ENABLE_TV_CON_VERTICAL_INTERPOLATION;
	}
	else if (on==KAL_FALSE)
	{
		DISABLE_TV_CON_VERTICAL_INTERPOLATION;
	}
	UPDATE_TV_CON_REGISTER;
}	/* enable_tv_vertical_interpolation() */

kal_uint32 temp_tv_dac_value,temp_tv_enc_mode_value;
void enable_tv_encoder(kal_uint8 tv_on)
{
	if (tv_on==KAL_TRUE)
	{	/* start TV output */
	
		temp_tv_enc_mode_value=REG_TV_ENC_MODE;
		REG_TV_ENC_MODE=0x100001;
		REG_TV_ENC_THRESHOLD=0xC0;
		REG_TV_ENC_DAC_CTRL_REG |= TV_ENC_DAC_TV_PLUG_IN_DETECT_BIT;
	
		temp_tv_dac_value = REG_TV_ENC_DAC_CTRL_REG;
//		REG_TV_ENC_DAC_CTRL_REG &= ~0x3F;
		REG_TV_ENC_DAC_CTRL_REG |= 0x3F;
	}
	else if (tv_on==KAL_FALSE)
	{	/* stop TV output */
		REG_TV_ENC_DAC_CTRL_REG &= ~TV_ENC_DAC_TV_PLUG_IN_DETECT_BIT;
		REG_TV_ENC_MODE=temp_tv_enc_mode_value;		
		REG_TV_ENC_THRESHOLD=0;
		REG_TV_ENC_DAC_CTRL_REG=temp_tv_dac_value;
	}
}	/* enable_tv_encoder() */

void set_tv_src_size(kal_uint8 tv_update_id,kal_uint16 src_width,kal_uint16 src_height)
{
	volatile kal_uint32 i;
   kal_uint16 hcoefx,hcoefy,vcoefx,vcoefy;
   kal_uint16 target_width,target_height;
   kal_uint16 offset_x,offset_y;

	if (tv_output_owner!=tv_update_id)
		ASSERT(0);

	tv_output_config_data.tv_output_src_width=src_width;
	tv_output_config_data.tv_output_src_height=src_height;

   if (tv_output_config_data.tv_output_format==TV_FORMAT_NTSC)
   {
   	target_width=TV_OUTPUT_NTSC_WIDTH;
   	target_height=TV_OUTPUT_NTSC_HEIGHT;
		offset_x=TV_OUTPUT_NTSC_OFFSET_X;
		offset_y=TV_OUTPUT_NTSC_OFFSET_Y;
   }
   else
	{
		target_width=TV_OUTPUT_PAL_WIDTH;
		target_height=TV_OUTPUT_PAL_HEIGHT;
		offset_x=TV_OUTPUT_PAL_OFFSET_X;
		offset_y=TV_OUTPUT_PAL_OFFSET_Y;
	}

	if ((target_width>(src_width<<1))&&(target_height>(src_height<<1)))
	{
		target_width=src_width<<1;
		target_height=src_height<<1;
	}

	if ((src_width>target_width)||(src_height>target_height))
		ASSERT(0);

	if ((src_width*target_height)> (src_height*target_width))
	{	/* X dominate */
		target_height=src_height*target_width/src_width;
		if (tv_output_config_data.tv_output_format==TV_FORMAT_NTSC)
		{
			if ((target_height * 105/100)>=TV_OUTPUT_NTSC_HEIGHT)
				target_height = TV_OUTPUT_NTSC_HEIGHT;
		}
		else if (tv_output_config_data.tv_output_format==TV_FORMAT_PAL)
		{
			if ((target_height * 105/100)>=TV_OUTPUT_PAL_HEIGHT)
				target_height = TV_OUTPUT_PAL_HEIGHT;
		}
	}
	else
	{	/* Y dominate */
		target_width=src_width*target_height/src_height;
	   if (tv_output_config_data.tv_output_format==TV_FORMAT_NTSC)
	   {
	   	if ((target_width*12/10)> TV_OUTPUT_NTSC_WIDTH)
	   		target_width=TV_OUTPUT_NTSC_WIDTH;
	   	else
	   		target_width=target_width*12/10;
	   }
	}

	/* centerize TV output */
   if (tv_output_config_data.tv_output_format==TV_FORMAT_NTSC)
   {
   	offset_x += ((TV_OUTPUT_NTSC_WIDTH-target_width)>>1);	
   	offset_y += ((TV_OUTPUT_NTSC_HEIGHT-target_height)>>2); /* interlace and centerlize */
   }
   else
	{
   	offset_x += ((TV_OUTPUT_PAL_WIDTH-target_width)>>1);
   	offset_y += ((TV_OUTPUT_PAL_HEIGHT-target_height)>>2);
	}

	offset_x &= 0xFFFE;

	hcoefx = 256*(src_width-1)/(target_width-1);
	hcoefy = 256*(src_width-1)%(target_width-1);;
	vcoefx = 256*(src_height-1)/(target_height-1);
	vcoefy = 256*(src_height-1)%(target_height-1);
	if ((tv_src_width!=src_width)||(tv_src_height!=src_height)||(tv_out_format_change_flag==KAL_TRUE))
	{
//		if ((src_height>=320) || (src_width>=240))
//		{
//			DISABLE_TV_CON_VERTICAL_INTERPOLATION;
//		}
		tv_out_format_change_flag=KAL_FALSE;

	tv_src_width=src_width;
	tv_src_height=src_height;
	tv_target_width=target_width;
	tv_target_height=target_height;

	tv_src_size_set_flag=KAL_TRUE;
	DISABLE_TV_CONTROLLER;
		DRV_WriteReg32(TV_CON_START_POINT_REG,((offset_x<<16)|offset_y));
		DRV_WriteReg(TV_CON_H_SCALE_COEFF_X_REG,hcoefx);
		DRV_WriteReg(TV_CON_H_SCALE_COEFF_Y_REG,hcoefy);
		DRV_WriteReg(TV_CON_V_SCALE_COEFF_X_REG,vcoefx);
		DRV_WriteReg(TV_CON_V_SCALE_COEFF_Y_REG,vcoefy);

	DRV_WriteReg(TV_CON_SRC_WIDTH_REG,tv_src_width);
	DRV_WriteReg(TV_CON_SRC_HEIGHT_REG,tv_src_height);
	DRV_WriteReg(TV_CON_TARGET_WIDTH_REG,tv_target_width);
	DRV_WriteReg(TV_CON_TARGET_HEIGHT_REG,tv_target_height);
	UPDATE_TV_CON_REGISTER;
	for (i=0;i<0x30000;i++);
	}

}	/* set_tv_src_size() */

void tv_fb_update(kal_uint8 tv_update_id, kal_uint32 tv_output_buffer_address)
{
	if (tv_output_owner!=tv_update_id)
		ASSERT(0);

	if (tv_src_size_set_flag==KAL_TRUE)
	{
		ENABLE_TV_CONTROLLER;
		tv_src_size_set_flag = KAL_FALSE;
	}

	if (tv_output_config_data.tv_output_data_format==TV_DATA_YUV420)
	{
		DRV_WriteReg32(TV_CON_Y_DATA_ADDR_REG,tv_output_buffer_address);
		DRV_WriteReg32(TV_CON_U_DATA_ADDR_REG,tv_output_buffer_address+
							tv_output_config_data.tv_output_src_width*tv_output_config_data.tv_output_src_height);
		DRV_WriteReg32(TV_CON_V_DATA_ADDR_REG,tv_output_buffer_address+((tv_output_config_data.tv_output_src_width*
							tv_output_config_data.tv_output_src_height*5)>>2));
	}
	else if (tv_output_config_data.tv_output_data_format==TV_DATA_RGB565)
	{
		DRV_WriteReg32(TV_CON_Y_DATA_ADDR_REG,tv_output_buffer_address);
	}

	UPDATE_TV_CON_REGISTER;
}	/* tv_fb_update() */

void tv_fb_update_yuv420(kal_uint8 tv_update_id, kal_uint32 tv_y_buffer,kal_uint32 tv_u_buffer,kal_uint32 tv_v_buffer)
{
	if (tv_output_owner!=tv_update_id)
		ASSERT(0);
	if (tv_output_config_data.tv_output_data_format!=TV_DATA_YUV420)
		ASSERT(0);

	if (tv_src_size_set_flag==KAL_TRUE)
	{
		ENABLE_TV_CONTROLLER;
                tv_src_size_set_flag = KAL_FALSE;
	}

	DRV_WriteReg32(TV_CON_Y_DATA_ADDR_REG,tv_y_buffer);
	DRV_WriteReg32(TV_CON_U_DATA_ADDR_REG,tv_u_buffer);
	DRV_WriteReg32(TV_CON_V_DATA_ADDR_REG,tv_v_buffer);

	UPDATE_TV_CON_REGISTER;
}	/* tv_fb_update_yuv420() */

void set_tv_parameter(kal_uint8 type,kal_uint8 para)
{
	switch (type)
	{
		case TV_OUT_Y_COMP:
			if ((para>=TV_OUT_GAMMA1) && (para<=TV_OUT_GAMMA5))
			{
				SET_TV_ENC_GAMMA0_COEFF(tv_gamma_table[para][0]);
				SET_TV_ENC_GAMMA1_COEFF(tv_gamma_table[para][1]);
				SET_TV_ENC_GAMMA2_COEFF(tv_gamma_table[para][2]);
				SET_TV_ENC_GAMMA3_COEFF(tv_gamma_table[para][3]);
				SET_TV_ENC_GAMMA4_COEFF(tv_gamma_table[para][4]);
				SET_TV_ENC_GAMMA5_COEFF(tv_gamma_table[para][5]);
				SET_TV_ENC_GAMMA6_COEFF(tv_gamma_table[para][6]);
				SET_TV_ENC_GAMMA7_COEFF(tv_gamma_table[para][7]);
				SET_TV_ENC_GAMMA8_COEFF(tv_gamma_table[para][8]);
				tv_gamma_table_sel=para;
			}
			else
				ASSERT(0);
		break;
		case TV_OUT_U_COMP:
			if (tv_eng_mode==KAL_FALSE)
			{
				SET_TV_ENC_U_SCALE(para);
				tv_u_scale_ntsc=para;
				tv_u_scale_pal=para;
			}
		break;
		case TV_OUT_V_COMP:
			if (tv_eng_mode==KAL_FALSE)
			{
				SET_TV_ENC_V_SCALE(para);
				tv_v_scale_ntsc=para;
				tv_v_scale_pal=para;
			}
		break;
	}
}	/* set_tv_parameter() */

void enter_tv_engmode(kal_uint32 tv_buffer)
{
	kal_uint16 i,j;
	kal_uint16 *dest_ptr;

	tv_eng_mode=KAL_TRUE;
	tv_frame_buffer=tv_buffer;
	dest_ptr=(kal_uint16 *) tv_frame_buffer;

	init_tv();
	tv_engmode_data.tv_output_mode = TV_OUTPUT_MODE2;
	tv_engmode_data.tv_output_format=tv_engmode_tv_type;
	tv_engmode_data.tv_output_offset_x = 21;
	tv_engmode_data.tv_output_offset_y = 0;
	tv_engmode_data.tv_output_src_width = 720;
	*((volatile unsigned int *) 0x806C0034) = 0x180D0000;
	DRV_WriteReg(TV_CON_H_SCALE_COEFF_X_REG,0x100);
	DRV_WriteReg(TV_CON_H_SCALE_COEFF_Y_REG,0);
	DRV_WriteReg(TV_CON_V_SCALE_COEFF_X_REG,0x100);
	DRV_WriteReg(TV_CON_V_SCALE_COEFF_Y_REG,0);
	DRV_WriteReg(TV_CON_SRC_WIDTH_REG,720);
	DRV_WriteReg(TV_CON_TARGET_WIDTH_REG,720);
	if (tv_engmode_tv_type==TV_FORMAT_NTSC)
	{
		tv_engmode_data.tv_output_src_height = 480;
		DRV_WriteReg(TV_CON_SRC_HEIGHT_REG,480);
		DRV_WriteReg(TV_CON_TARGET_HEIGHT_REG,480);
	}
	else
	{
		tv_engmode_data.tv_output_src_height = 576;
		DRV_WriteReg(TV_CON_SRC_HEIGHT_REG,576);
		DRV_WriteReg(TV_CON_TARGET_HEIGHT_

⌨️ 快捷键说明

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