📄 aprv_htv.c
字号:
}
//读地址addr的PLM1000芯片当前的视频输入格式
static Byte Read_Ip_Format(Byte addr)
{
Byte XDATA format ;
Word XDATA PLM1000C_TotalLine=0;
Word XDATA ActiveLineLength=0 ,of8Total480_576I_MV_Sync;
Byte XDATA i,k ;
Byte RI2C_EXP_RAM PLM1000_Register[5] ;
for(k =0 ;k<4 ;k++)
{
for( i=230;i <235 ; i++)
{
ri2c_ReadSub(addr, 1, &PLM1000_Register[i-230], i);
// ri2c_ReadSub(addr, 5, PLM1000_Register,230);
}
ActiveLineLength +=((unsigned int)(PLM1000_Register[234-230] & 0x01)<<12) + ((unsigned int)PLM1000_Register[230-230]<<4) + ( (unsigned int)(PLM1000_Register[231-230]&0xf0) >> 4) ;
PLM1000C_TotalLine += ((unsigned int)(PLM1000_Register[233-230] & 0x7f)<<6) +((unsigned int)(PLM1000_Register[234-230] & 0xfc)>>2) ;
//jyj add start
//增加对带microvision信号的处理
ri2c_ReadSub(addr, 1, &PLM1000_Register[0], 225);
of8Total480_576I_MV_Sync += PLM1000_Register[0];
//jyj add end
}
ActiveLineLength = ActiveLineLength >> 2 ;
PLM1000C_TotalLine = PLM1000C_TotalLine >> 2 ;
//jyj add start
//增加对带microvision信号的处理
of8Total480_576I_MV_Sync = of8Total480_576I_MV_Sync >> 2;
//jyj add end
k = 0x0f;
format = 0x0f;//无效输入格式
if(VGA_Input == 0)
{
for(i = 0 ; i < 10 ; i++)
{
if( (ActiveLineLength <= cfg_Limit[i][1]) && (ActiveLineLength >= cfg_Limit[i][0]) && (PLM1000C_TotalLine <= cfg_Limit[i][3]) && (PLM1000C_TotalLine >= cfg_Limit[i][2]) )
{
k = i ;
}
}
}
else
{
for(i = 10 ; i < 13 ; i++)
{
if( (ActiveLineLength <= cfg_Limit[i][1]) && (ActiveLineLength >= cfg_Limit[i][0]) && (PLM1000C_TotalLine <= cfg_Limit[i][3]) && (PLM1000C_TotalLine >= cfg_Limit[i][2]) )
{
k = i ;
}
}
}
switch(k)
{
//jyj modify start
//modified for microvision input
case 0://480i
format = FORMAT_480I ;
#ifdef C4P43M
if(of8Total480_576I_MV_Sync > 40 )
#else
if(of8Total480_576I_MV_Sync > 19 )
#endif
format = format | 0x80 ;
break;
case 1://576i
format = FORMAT_576I ;
#ifdef C4P43M
if(of8Total480_576I_MV_Sync > 40 )
#else
if(of8Total480_576I_MV_Sync > 19 )
#endif
format = format | 0x80 ;
break;
case 2://480p
format = FORMAT_480P ;
#ifdef C4P43M
if(of8Total480_576I_MV_Sync > 80 )
#else
if(of8Total480_576I_MV_Sync > 40 )
#endif
format = format | 0x80 ;
break;
case 3://576p
format = FORMAT_576P ;
#ifdef C4P43M
if(of8Total480_576I_MV_Sync > 80 )
#else
if(of8Total480_576I_MV_Sync > 40 )
#endif
format = format | 0x80 ;
break;
//jyj modify start
case 4://720p50
format = FORMAT_720P50 ;
break;
case 5://720p60
format = FORMAT_720P60 ;
break;
case 6://1080i50
format = FORMAT_1080I50 ;
break;
case 7://1080i60
format = FORMAT_1080I60 ;
break;
case 8://1080p50
format = FORMAT_1080P50 ;
break;
case 9://1080p60
format = FORMAT_1080P60 ;
break;
case 10://VGA1024*768
format = FORMAT_XGA60 ;
if(PLM1000C_TotalLine == 804)
format |= 0x80;//非标
break;
case 11://VGA800*600
format = FORMAT_SVGA60 ;
if(PLM1000C_TotalLine == 629)
format |= 0x80;//非标
break;
case 12://VGA 640*480
format = FORMAT_VGA60 ;
break;
default:
break;
}
return format ;
}
//PLM1000 format override
static void format_override(Byte addr , Byte force_ip_format)
{
Byte RI2C_EXP_RAM temp ;
ri2c_ReadSub(addr, 1, &temp, 0x77);
if(force_ip_format>0x0f)
temp = (Byte)((temp & 0xc0) |(14 << 1) | 0x01 | (0x01 << 5));
else
temp = (Byte)((temp & 0xc0) |(force_ip_format << 1) | 0x01 | (0x01 << 5));
Write_HTV_Register(addr,1,&temp,0x77);
if(force_ip_format == 0x0f)
{
ri2c_ReadSub(addr,1, &temp,203);
temp = temp & 0xfd;
Write_HTV_Register(addr,1,&temp,203);
}
#if 0
/*dh modify 071010*/
else
{
if(VGA_Input==0)
{
jbl_bPreHD=1;
}
else
{
jbl_bPreVGA=1;
}
}
/*dh modify end*/
#endif
}
static void Load_Config_Register(Byte ip_format)
{
Byte i ,j;
Byte RI2C_EXP_RAM value = 175;
Byte *p ;
switch( ip_format & 0x1f )
{
case FORMAT_480I : //480i
p = (Byte*)register_480i ;
break ;
case FORMAT_576I : //576i
p = (Byte*)register_576i ;
break ;
case FORMAT_480P : //480p
p = (Byte*)register_480p ;
break ;
case FORMAT_576P : //576p
p = (Byte*)register_576p ;
break ;
case FORMAT_720P60 : //720p/60
p = (Byte*)register_720p_60 ;
break ;
case FORMAT_720P50 : //720p/50
p = (Byte*)register_720p_50 ;
break ;
case FORMAT_1080I60: //1080i/60
p = (Byte*)register_1080i_60 ;
break ;
case FORMAT_1080I50: //1080i/50
p = (Byte*)register_1080i_50 ;
break ;
case FORMAT_1080P60: //1080p/60
p = (Byte*)register_1080p_60 ;
break ;
case FORMAT_1080P50: //1080p/50
p = (Byte*)register_1080p_50 ;
break ;
case FORMAT_XGA60: //VGA1024
p = (Byte*)register_VGA1024 ;
break ;
case FORMAT_SVGA60: //VGA800
p = (Byte*)register_VGA800 ;
break ;
case FORMAT_VGA60: //VGA640
p = (Byte*)register_VGA640 ;
break ;
default:
return ;
}
// Write_HTV_Register(PLM1000_ADDR, 1, &value, 38); // force 38 to 175,for PLL issue [207-11-22]
for(i = 1 ; i <= sizeof(register_480i) ; i++)
{
// if(i > 27) // 25 - 47 not write the register
// j = i + 20;
// else
j = i;
value = p[i-1] ;
Write_HTV_Register(PLM1000_ADDR, 1, &value, j);
}
VGA_config(ip_format);
i2c_config();
}
static void Write_Enable(Bool Enable)
{
Enable =Enable;
#if 0
Byte RI2C_EXP_RAM value;
if(Enable)
value = 1;
else
value = 1;
Write_HTV_Register(PLM1000_ADDR,1,&value,196);
#endif
}
static void Phase_Adjustment(Byte cur_ip_format)
{
Byte RI2C_EXP_RAM temp[3],temp1;
Byte i;
Word Standard_Line_Length,MeasuredLineLength;
Byte clkphaseadj;
ri2c_ReadSub(PLM1000_ADDR,1,&temp1,4);
clkphaseadj = (temp1 & 0xf8)>>3;
ri2c_ReadSub(PLM1000_ADDR,3,temp,184);
Standard_Line_Length= ((Word)(temp[0] & 0x3) << 11) + ((Word)(temp[1] & 0xff) << 3) + ((Word)(temp[2] & 0xe0) >> 5);
for(i=0;i<5;i++)
{
Loop_Number++;
if(Loop_Number > 1000)
{
Loop_Number = 0 ;
phase_counter = 0 ;
}
ri2c_ReadSub(PLM1000_ADDR,1,&temp[0],235);
ri2c_ReadSub(PLM1000_ADDR,1,&temp[1],243);
ri2c_ReadSub(PLM1000_ADDR,1,&temp[2],244);
MeasuredLineLength = ((Word)(temp[0] & 0x01) << 12) + ((Word)(temp[1] & 0x0f) << 8) + (Word)temp[2] ;
if(cur_ip_format != 12)
MeasuredLineLength += 1;
if(Standard_Line_Length!=MeasuredLineLength)
{
phase_counter++;
}
if(phase_counter>30)
{
clkphaseadj=(clkphaseadj==31) ? 0 : (clkphaseadj+1);
temp1 = (temp1 & 0x07) | ((clkphaseadj & 0x1f)<<3);
Write_HTV_Register(PLM1000_ADDR,1,&temp1,4);
Loop_Number = 0 ;
phase_counter = 0 ;
}
}
}
#if 1
static void Phase_Manual_Adjustment(Byte value)
{
Byte RI2C_EXP_RAM temp1;
ri2c_ReadSub(PLM1000_ADDR,1,&temp1,4);
temp1 = (temp1 & 0x07) | ((value & 0x1f)<<3);
Write_HTV_Register(PLM1000_ADDR,1,&temp1,4);
}
#endif
static void Config_Register_CE(Word V_Location,Word H_Location,Byte Demo_Left,Byte Demo_Up)
{
Byte RI2C_EXP_RAM value[3];
ri2c_ReadSub(PLM1000_ADDR,1,&value[0],170);
value[0] = (value[0] & 0xfd) | (Demo_Left<<1) ;
Write_HTV_Register(PLM1000_ADDR,1,&value[0],170);
ri2c_ReadSub(PLM1000_ADDR,1,&value[0],189);
value[0] = (value[0] & 0xc7) | (Demo_Up<<5) | ((V_Location & 0x03) << 3) ;
Write_HTV_Register(PLM1000_ADDR,1,&value[0],189);
ri2c_ReadSub(PLM1000_ADDR,3,value,137);
value[0] = (value[0] & 0xe0) | ((H_Location & 0xf80) >> 7) ;
value[1] = ((H_Location & 0x7f) << 1) | ((V_Location & 0x400) >> 10);
value[2] = ((V_Location & 0x3fc) >> 2) ;
Write_HTV_Register(PLM1000_ADDR,3,value,137);
// ri2c_ReadSub(PLM1000_ADDR,1,&value,138);
// value = ((H_Location & 0x7f) << 1) | ((V_Location & 0x400) >> 10);
// Write_HTV_Register(PLM1000_ADDR,1,&value,138);
// ri2c_ReadSub(PLM1000_ADDR,1,&value,139);
// value = ((V_Location & 0x3fc) >> 2) ;
// Write_HTV_Register(PLM1000_ADDR,1,&value,139);
// ri2c_ReadSub(PLM1000_ADDR,1,&value,137);
// value = (value & 0xe0) | ((H_Location & 0xf80) >> 7) ;
// Write_HTV_Register(PLM1000_ADDR,1,&value,137);
}
static void DemoControl(Bool onoff)
{
Word XDATA i11Register_CE_Demo_V_Location =0,i12Register_CE_Demo_H_Location=0 ;
Byte XDATA iRegister_CE_Demo_left=0 ,iRegister_CE_Demo_up=0 ;
Word XDATA HMin,HMax,VMin,VMax;
Byte XDATA Demo_Switch;
if( (Power_State == 0) ||((work_ip_format & 0x1f)==0x0f))
return;
if(onoff)
Demo_Switch = (Byte)rsrv_GetServiceValue(APRV_ITEM_HTV_PLM_DEMO);
else
Demo_Switch = 0;
// if(Demo_Switch != 0)
// {
// Jbl_Demo_PreState = 0xff ;
DemoCounter++;
if(DemoCounter>1000)
DemoCounter = 0 ;
// }
// else
// {
// if(Demo_Switch != Jbl_Demo_PreState)
// Jbl_Demo_PreState = Demo_Switch;
// else
// return;
// }
Write_Enable(TRUE);
//jyj modify start
//modified for microvision input
switch((work_ip_format & 0x1f))
//jyj modify end
{
case 0x0a://1080i60
HMin = 295;
HMax = 2197;
VMin = 0;
VMax = 556;
break;
case 0x0b://1080i50
HMin = 722;
HMax = 2658;
VMin = 0;
VMax = 556;
break;
case 0x08://720p60
HMin = 343;
HMax = 1627;
VMin = 0;
VMax = 732;
break;
case 0x09://720p50
HMin = 329;
HMax = 1627;
VMin = 0;
VMax = 732;
break;
case 0x06://480p
HMin = 372;
HMax = 2386;
VMin = 0;
VMax = 515;
break;
case 0x07://576p
HMin = 380;
HMax = 2332;
VMin = 0;
VMax = 624;
break;
case 12 ://1080p60
HMin = 166;
HMax = 1112;
VMin = 0;
VMax = 1085;
break;
case 13 ://1080p50
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -