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

📄 aprv_htv.c

📁 PLM1000C芯片驱动程序
💻 C
📖 第 1 页 / 共 4 页
字号:
}

//读地址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 + -