📄 tv_out.c
字号:
}
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 + -