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

📄 saa7114.c

📁 vc ad
💻 C
📖 第 1 页 / 共 3 页
字号:

BOOLEAN ReInit7114(PDEVICE_EXTENSION pDE, int nChannel)
{
  int i;
  UCHAR VIPAddresses[2]={IIC_SUB_VIP,IIC_SUB_VIP2};
  for(i=0; i<(sizeof(Reg7114Back)/sizeof(struct IICReg)); i++){
    IICWrite(pDE,VIPAddresses[nChannel],Reg7114Back[i].bySub,Reg7114Back[i].byData);
    if(bIICError)
      return FALSE;
  }
  //SoftWare Reset, 88H,bit SWRST
  SoftwareReset(pDE,nChannel);
  return TRUE;
}

BOOLEAN Reset7114LLC(PDEVICE_EXTENSION pDE, int nChannel)
{
	UCHAR VIPAddresses[2]={IIC_SUB_VIP,IIC_SUB_VIP2};
    IICWrite(pDE,VIPAddresses[nChannel], 0x08, 0x00);
    IICWrite(pDE,VIPAddresses[nChannel], 0x08, Reg7114Default[7].byData);
    if(bIICError)
      return FALSE;
	
	//SoftWare Reset, 88H,bit SWRST
	SoftwareReset(pDE,nChannel);
	return TRUE;
}

void GetVideoParameter(PDEVICE_EXTENSION pDE,PAVE6K_VIDEO_PARAMETER pVideoParameter, ULONG nChannel)
{
	UCHAR VIPAddresses[2]={IIC_SUB_VIP,IIC_SUB_VIP2};
	UCHAR VIPAddress=VIPAddresses[nChannel];
	pVideoParameter->Brightness = (IICRead(pDE,VIPAddresses[nChannel],0xa)*100L+127)/255;
	pVideoParameter->Contrast = (IICRead(pDE,VIPAddresses[nChannel],0xb)*100L+63)/127;
	pVideoParameter->Saturation = (IICRead(pDE,VIPAddresses[nChannel],0xc)*100L+63)/127;
	pVideoParameter->Hue = ((((signed char)IICRead(pDE,VIPAddresses[nChannel],0xd))+128)*100L+127)/255;
}

void SetVideoParameter(PDEVICE_EXTENSION pDE,PAVE6K_VIDEO_PARAMETER pVideoParameter, ULONG nChannel)
{
	UCHAR VIPAddresses[2]={IIC_SUB_VIP,IIC_SUB_VIP2};
	UCHAR VIPAddress=VIPAddresses[nChannel];
	int i;
	if(pVideoParameter->Brightness>100)
		pVideoParameter->Brightness=100;
	if(pVideoParameter->Contrast>100)
		pVideoParameter->Contrast=100;
	if(pVideoParameter->Saturation>100)
		pVideoParameter->Saturation=100;
	if(pVideoParameter->Hue>100)
		pVideoParameter->Hue=100;
	IICWrite(pDE,VIPAddresses[nChannel],0xa,(UCHAR)((pVideoParameter->Brightness*255+50)/100));
	IICWrite(pDE,VIPAddresses[nChannel],0xb,(UCHAR)((pVideoParameter->Contrast*127+50)/100));
	IICWrite(pDE,VIPAddresses[nChannel],0xc,(UCHAR)((pVideoParameter->Saturation*127+50)/100));
	IICWrite(pDE,VIPAddresses[nChannel],0xd,(UCHAR)((pVideoParameter->Hue*255+50)/100-128));

    for(i=0; i<(sizeof(Reg7114Back)/sizeof(struct IICReg)); i++){
		if(Reg7114Back[i].bySub == 0xa) {
			Reg7114Back[i].byData=(UCHAR)((pVideoParameter->Brightness*255+50)/100);
		}
		if(Reg7114Back[i].bySub == 0xb) {
			Reg7114Back[i].byData=(UCHAR)((pVideoParameter->Contrast*127+50)/100);
		}
		if(Reg7114Back[i].bySub == 0xc) {
			Reg7114Back[i].byData=(UCHAR)((pVideoParameter->Saturation*127+50)/100);
		}
		if(Reg7114Back[i].bySub == 0xd) {
			Reg7114Back[i].byData=(UCHAR)((pVideoParameter->Hue*255+50)/100-128);
		}
	}
	//SoftWare Reset, 88H,bit SWRST
	SoftwareReset(pDE,nChannel);
}

int GetVideoType(PDEVICE_EXTENSION pDE, int nChannel)
{
  int nMode;
  int nRetry=0;
  UCHAR VIPAddresses[2]={IIC_SUB_VIP,IIC_SUB_VIP2};

  while(nRetry<3){
	  nMode=IICRead(pDE,VIPAddresses[nChannel], 0x1f);  //1f,read only, Status byte video decoder;
	  if(bIICError)
		  nRetry++;
	  else
		  break;
  }
  if(nMode&0x40) {
	Reset7114LLC(pDE, nChannel);
  }
  if(nMode&0x20)
    return VIDEOTYPE_NTSC;//ntsc
  else
    return VIDEOTYPE_PAL;//pal
}

void SetVideoSource(PDEVICE_EXTENSION pDE, ULONG VideoSource, ULONG nChannel)
{
	UCHAR SetSource;
    UCHAR VIPAddresses[2]={IIC_SUB_VIP,IIC_SUB_VIP2};
	int i;
	if(VideoSource==VIDEOSOURCE_CVBS)
		SetSource = 0xc4;  //硬件采用(0x02设置): CVBS MODE 4(AI23)和MODE 6(Y->AI11,C->AI21)
	else
		SetSource = 0xc6;
	IICWrite(pDE, VIPAddresses[nChannel], 2, SetSource);
    for(i=0; i<(sizeof(Reg7114Back)/sizeof(struct IICReg)); i++){
		if(Reg7114Back[i].bySub == 0x2) {
			Reg7114Back[i].byData=SetSource;
		}
	}
	//SoftWare Reset, 88H,bit SWRST
	SoftwareReset(pDE,nChannel);
}

void SetVideoGain(PDEVICE_EXTENSION pDE, ULONG nChannel, ULONG Gain)
{
	UCHAR nSA03;
	UCHAR nSA05;
	int i;
    UCHAR VIPAddresses[2]={IIC_SUB_VIP,IIC_SUB_VIP2};
	nSA05=(UCHAR)Gain&0xff;
	nSA03=(UCHAR)((Gain>>8)&0x01);
	nSA03|=0x24;
	IICWrite(pDE, VIPAddresses[nChannel], 3, nSA03);
	IICWrite(pDE, VIPAddresses[nChannel], 5, nSA05);
    for(i=0; i<(sizeof(Reg7114Back)/sizeof(struct IICReg)); i++){
		if(Reg7114Back[i].bySub == 0x3) {
			Reg7114Back[i].byData=nSA03;
		}
		if(Reg7114Back[i].bySub == 0x5) {
			Reg7114Back[i].byData=nSA05;
		}
	}
	//SoftWare Reset, 88H,bit SWRST
	SoftwareReset(pDE,nChannel);
}

void GetVideoScale(PDEVICE_EXTENSION pDE, ULONG nChannel, PAVE6K_VIDEO_SCALE pScale)
{
	USHORT XO,YO,XS,YS,XD,YD;  //X,Y的起始,输入图象的长宽,输出图象的长宽
	USHORT XPSC,XACL,DCGain,BRIG,CONT,SATN,XPHY,XPHC,XSCC;
	USHORT XSCY,YSCY;
	int nRetry=0;
	UCHAR VIPAddresses[2]={IIC_SUB_VIP,IIC_SUB_VIP2};

	while(nRetry<3){
		XO = (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0x95))<<8 | (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0x94));
		YO = (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0x99))<<8 | (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0x98));

		XS = (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0x97))<<8 | (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0x96));
		YS = (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0x9b))<<8 | (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0x9a));

		XD = (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0x9d))<<8 | (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0x9c));
		YD = (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0x9f))<<8 | (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0x9e));

		XPSC = (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0xa0)) & 0xff;
		XACL = (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0xa1)) & 0xff;
		DCGain = (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0xa2)) & 0xff;

		BRIG = (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0xa4)) & 0xff;
		CONT = (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0xa5)) & 0xff;
		SATN = (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0xa6)) & 0xff;

		XSCY = (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0xa9))<<8 | (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0xa8));
		XPHY = (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0xaa)) & 0xff;
		XSCC = (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0xad))<<8 | (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0xac));
		XPHC = (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0xae)) & 0xff;
		YSCY = (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0xb1))<<8 | (USHORT)(IICRead(pDE,VIPAddresses[nChannel],0xb0));

		if(bIICError)
		  nRetry++;
		else
		  break;
	} //end while

	pScale->Channel = nChannel;
	pScale->XS = XS;
	pScale->YS = YS;
	pScale->XD = XD;
	pScale->YD = YD;
	pScale->XPSC = XPSC;
	pScale->XSCY = XSCY;
	pScale->YSCY = YSCY;
}

void SetVideoScale(PDEVICE_EXTENSION pDE, ULONG nChannel, PAVE6K_VIDEO_SCALE pScale)
{
	USHORT XO,YO,XS,YS,XD,YD,XPSC,XACL,DCGain;
	USHORT BRIG,CONT,SATN,XPHY,XPHC,XSCY,YSCY;
	int nRetry = 0;
	int i;
	UCHAR VIPAddresses[2]={IIC_SUB_VIP,IIC_SUB_VIP2};

	while(nRetry<3) {
		XO = 0x000a;
		IICWrite(pDE,VIPAddresses[nChannel],0x94,(UCHAR)(XO&0xff));
		IICWrite(pDE,VIPAddresses[nChannel],0x95,(UCHAR)((XO>>8)&0xff));
		XS = pScale->XS;
		IICWrite(pDE,VIPAddresses[nChannel],0x96,(UCHAR)(XS&0xff));
		IICWrite(pDE,VIPAddresses[nChannel],0x97,(UCHAR)((XS>>8)&0xff));
		YO = 0x0014;
		IICWrite(pDE,VIPAddresses[nChannel],0x98,(UCHAR)(YO&0xff));
		IICWrite(pDE,VIPAddresses[nChannel],0x99,(UCHAR)((YO>>8)&0xff));
		YS = pScale->YS;
		IICWrite(pDE,VIPAddresses[nChannel],0x9a,(UCHAR)((YS+2)&0xff));
		IICWrite(pDE,VIPAddresses[nChannel],0x9b,(UCHAR)(((YS+2)>>8)&0xff));
		XD = pScale->XD;
		IICWrite(pDE,VIPAddresses[nChannel],0x9c,(UCHAR)(XD&0xff));
		IICWrite(pDE,VIPAddresses[nChannel],0x9d,(UCHAR)((XD>>8)&0xff));
		YD = pScale->YD;
		IICWrite(pDE,VIPAddresses[nChannel],0x9e,(UCHAR)(YD&0xff));
		IICWrite(pDE,VIPAddresses[nChannel],0x9f,(UCHAR)((YD>>8)&0xff));

		XPSC = pScale->XPSC;
		IICWrite(pDE,VIPAddresses[nChannel],0xa0,(UCHAR)(XPSC));  //A0

		switch(XPSC)
		{
			case 0x01:
				{
					XACL =0x00;
					DCGain =0x00;
				}
			case 0x02:
				{
					XACL =0x02;
					DCGain =0xaa;
				}
			case 0x03:
				{
					XACL =0x04;
					DCGain =0xab;
				}
			case 0x04:
				{
					XACL =0x08;
					DCGain =0xac;
				}
			case 0x05:
				{
					XACL =0x08;
					DCGain =0xac;
				}
			case 0x06:
				{
					XACL =0x08;
					DCGain =0xfc;
				}
			case 0x07:
				{
					XACL =0x08;
					DCGain =0xfc;
				}
			case 0x08:
				{
					XACL =0xff;
					DCGain =0xf4;
				}
			default:
				{
					XACL =0x00;
					DCGain =0x00;
				}
		} //end switch, referrence 7114 datasheet p46 recommend table 11

		IICWrite(pDE,VIPAddresses[nChannel],0xa1,(UCHAR)(XACL));  //A1
		IICWrite(pDE,VIPAddresses[nChannel],0xa2,(UCHAR)(DCGain));  //A2

		BRIG =0x80;
		IICWrite(pDE,VIPAddresses[nChannel],0xa4,(UCHAR)(BRIG));  //A4
		CONT =0x40;
		IICWrite(pDE,VIPAddresses[nChannel],0xa5,(UCHAR)(CONT));  //A5
		SATN =CONT;
		IICWrite(pDE,VIPAddresses[nChannel],0xa6,(UCHAR)(SATN));  //A6

		XSCY = pScale->XSCY;
		IICWrite(pDE,VIPAddresses[nChannel],0xa8,(UCHAR)(XSCY&0xff));  //A8
		IICWrite(pDE,VIPAddresses[nChannel],0xa9,(UCHAR)((XSCY>>8)&0xff));  //A9

		XPHY = 0;
		IICWrite(pDE,VIPAddresses[nChannel],0xaa,(UCHAR)(XPHY));  //AA

		IICWrite(pDE,VIPAddresses[nChannel],0xac,(UCHAR)((XSCY/2)&0xff));  //AC
		IICWrite(pDE,VIPAddresses[nChannel],0xad,(UCHAR)(((XSCY/2)>>8)&0xff));  //AD

		XPHC = XPHY/2;
		IICWrite(pDE,VIPAddresses[nChannel],0xae,(UCHAR)(XPHC));  //AE

		YSCY = pScale->YSCY;
		IICWrite(pDE,VIPAddresses[nChannel],0xb0,(UCHAR)(YSCY&0xff));  //B0
		IICWrite(pDE,VIPAddresses[nChannel],0xb1,(UCHAR)((YSCY>>8)&0xff));  //B1

		if(bIICError)
		  nRetry++;
		else
		  break;
	} //end while

    for(i=0; i<(sizeof(Reg7114Back)/sizeof(struct IICReg)); i++){
		if(Reg7114Back[i].bySub == 0x94) {
			Reg7114Back[i].byData=(UCHAR)(XO&0xff);
		}
		if(Reg7114Back[i].bySub == 0x95) {
			Reg7114Back[i].byData=(UCHAR)((XO>>8)&0xff);
		}
		if(Reg7114Back[i].bySub == 0x96) {
			Reg7114Back[i].byData=(UCHAR)(XS&0xff);
		}
		if(Reg7114Back[i].bySub == 0x97) {
			Reg7114Back[i].byData=(UCHAR)((XS>>8)&0xff);
		}
		if(Reg7114Back[i].bySub == 0x98) {
			Reg7114Back[i].byData=(UCHAR)(YO&0xff);
		}
		if(Reg7114Back[i].bySub == 0x99) {
			Reg7114Back[i].byData=(UCHAR)((YO>>8)&0xff);
		}
		if(Reg7114Back[i].bySub == 0x9a) {
			Reg7114Back[i].byData=(UCHAR)((YS+2)&0xff);
		}
		if(Reg7114Back[i].bySub == 0x9b) {
			Reg7114Back[i].byData=(UCHAR)(((YS+2)>>8)&0xff);
		}
		if(Reg7114Back[i].bySub == 0x9c) {
			Reg7114Back[i].byData=(UCHAR)(XD&0xff);
		}
		if(Reg7114Back[i].bySub == 0x9d) {
			Reg7114Back[i].byData=(UCHAR)((XD>>8)&0xff);
		}
		if(Reg7114Back[i].bySub == 0x9e) {
			Reg7114Back[i].byData=(UCHAR)(YD&0xff);
		}
		if(Reg7114Back[i].bySub == 0x9f) {
			Reg7114Back[i].byData=(UCHAR)((YD>>8)&0xff);
		}
		if(Reg7114Back[i].bySub == 0xa0) {
			Reg7114Back[i].byData=(UCHAR)(XPSC);
		}
		if(Reg7114Back[i].bySub == 0xa1) {
			Reg7114Back[i].byData=(UCHAR)(XACL);
		}
		if(Reg7114Back[i].bySub == 0xa2) {
			Reg7114Back[i].byData=(UCHAR)(DCGain);
		}
		if(Reg7114Back[i].bySub == 0xa4) {
			Reg7114Back[i].byData=(UCHAR)(BRIG);
		}
		if(Reg7114Back[i].bySub == 0xa5) {
			Reg7114Back[i].byData=(UCHAR)(CONT);
		}
		if(Reg7114Back[i].bySub == 0xa6) {
			Reg7114Back[i].byData=(UCHAR)(SATN);
		}
		if(Reg7114Back[i].bySub == 0xa8) {
			Reg7114Back[i].byData=(UCHAR)(XSCY&0xff);
		}
		if(Reg7114Back[i].bySub == 0xa9) {
			Reg7114Back[i].byData=(UCHAR)((XSCY>>8)&0xff);
		}
		if(Reg7114Back[i].bySub == 0xaa) {
			Reg7114Back[i].byData=(UCHAR)(XPHY);
		}
		if(Reg7114Back[i].bySub == 0xac) {
			Reg7114Back[i].byData=(UCHAR)((XSCY/2)&0xff);
		}
		if(Reg7114Back[i].bySub == 0xad) {
			Reg7114Back[i].byData=(UCHAR)(((XSCY/2)>>8)&0xff);
		}
		if(Reg7114Back[i].bySub == 0xae) {
			Reg7114Back[i].byData=(UCHAR)(XPHC);
		}
		if(Reg7114Back[i].bySub == 0xb0) {
			Reg7114Back[i].byData=(UCHAR)(YSCY&0xff);
		}
		if(Reg7114Back[i].bySub == 0xb1) {
			Reg7114Back[i].byData=(UCHAR)((YSCY>>8)&0xff);
		}
	}
	//SoftWare Reset, 88H,bit SWRST

⌨️ 快捷键说明

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