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