📄 saa7111.c
字号:
#include "ntddk.h"
#include "stdio.h"
#include "ave2k.h"
#include "iic.h"
#include "SAA7111.H"
#include "version.h"
#if 0
unsigned char Reg7111[32]={
0,
0,
0xd8,//0xc0,
0x23,//0x33,
0x00,
0x00,
0xf0,//0xeb,
0x30,//0xe0,
0xa8,//0x88,
0x02,//0x01,
0x80,
0x47,
0x40,
0x00,
0x01,
0x00,
0xd0,//0xc0,
0x0c,//0x1c,
0x80,//0x00,
0x30,//0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00
};
void ReInit7111(PDEVICE_EXTENSION pDE)
{
unsigned char i;
for(i=0; i<sizeof(Reg7111)/sizeof(unsigned char); i++){
IICWrite(pDE,IIC_SUB_VIP, i, Reg7111[i]);
if(bIICError)
return ;
}
}
#else
struct IICReg {
unsigned char bySub;
unsigned char byData;
}Reg7113[]={
//{0, 0xff},
{1, 0x08},
{2, 0xc2},
{3, 0x20},//23
{4, 0},//0x00},
{5, 117},//0xff},
{6, 0xeb},
{7, 0xe0},
#if(TARGET_DEVICE==TD_AVEIII)
{8, 0xa8},//D7=auto detect, D6=N(1)/P(0), VTR mode
#else
{8, 0xb8},//D7=auto detect, D6=N(1)/P(0), fast lock
#endif
{9, 0x01},
{0x0a, 0x80},
{0x0b, 0x47},
{0x0c, 0x40},
{0x0d, 0x00},
{0x0e, 0x01},
{0x0f, 0x00},
{0x10, 0x40},
{0x11, 0x0c},
{0x12, 0xc7},//c7
{0x13 ,0x00},
{0x14 ,0x00},
{0x15 ,0x00},
{0x16 ,0x00},
{0x17 ,0x00},
{0x18 ,0x00},
{0x19 ,0x00},
{0x1a ,0x00},
{0x1b ,0x00},
{0x1c ,0x00},
{0x1d ,0x00},
{0x1e ,0x00},
{0x1f ,0xa1},
{0x40 ,0x02},
{0x41 ,0xff},
{0x42 ,0xff},
{0x44 ,0xff},
{0x45 ,0xff},
{0x46 ,0xff},
{0x47 ,0xff},
{0x48 ,0xff},
{0x49 ,0xff},
{0x4a ,0xff},
{0x4b ,0xff},
{0x4c ,0xff},
{0x4d ,0xff},
{0x4e ,0xff},
{0x4f ,0xff},
{0x50 ,0xff},
{0x51 ,0xff},
{0x52 ,0xff},
{0x53 ,0xff},
{0x54 ,0xff},
{0x55 ,0xff},
{0x56 ,0xff},
{0x57 ,0xff},
{0x58 ,0x00},
{0x59 ,0x00},
{0x5a ,0x07},
{0x5b ,0x00},
{0x5c ,0x00},
{0x5d ,0x00},
{0x5e ,0x00},
{0x5f ,0x00},
{0x60 ,0x04},
{0x61 ,0x0f},
{0x62 ,0x91}};
//void ReInit7113(PDEVICE_EXTENSION pDE)
BOOLEAN ReInit7111(PDEVICE_EXTENSION pDE, int nChannel)
{
int i;
UCHAR VIPAddresses[2]={IIC_SUB_VIP,IIC_SUB_VIP2};
IICWrite(pDE,VIPAddresses[nChannel], 0x08, 0x00);
for(i=0; i<(sizeof(Reg7113)/sizeof(struct IICReg)); i++){
IICWrite(pDE,VIPAddresses[nChannel], Reg7113[i].bySub, Reg7113[i].byData);
if(bIICError)
return FALSE;
}
return TRUE;
}
BOOLEAN Reset7113LLC(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, Reg7113[7].byData);
if(bIICError)
return FALSE;
return TRUE;
}
void GetVideoParameter(PDEVICE_EXTENSION pDE,PAVE2K_VIDEO_PARAMETER pVideoParameter, ULONG nChannel)
{
UCHAR VIPAddresses[2]={IIC_SUB_VIP,IIC_SUB_VIP2};
UCHAR VIPAddress=VIPAddresses[nChannel];
pVideoParameter->Brightness = (IICRead(pDE,VIPAddress,0xa)*100L+127)/255;
pVideoParameter->Contrast = (IICRead(pDE,VIPAddress,0xb)*100L+63)/127;
pVideoParameter->Saturation = (IICRead(pDE,VIPAddress,0xc)*100L+63)/127;
pVideoParameter->Hue = ((((signed char)IICRead(pDE,VIPAddress,0xd))+128)*100L+127)/255;
}
void SetVideoParameter(PDEVICE_EXTENSION pDE,PAVE2K_VIDEO_PARAMETER pVideoParameter, ULONG nChannel)
{
UCHAR VIPAddresses[2]={IIC_SUB_VIP,IIC_SUB_VIP2};
UCHAR VIPAddress=VIPAddresses[nChannel];
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,VIPAddress,0xa,(UCHAR)((pVideoParameter->Brightness*255+50)/100));
IICWrite(pDE,VIPAddress,0xb,(UCHAR)((pVideoParameter->Contrast*127+50)/100));
IICWrite(pDE,VIPAddress,0xc,(UCHAR)((pVideoParameter->Saturation*127+50)/100));
IICWrite(pDE,VIPAddress,0xd,(UCHAR)((pVideoParameter->Hue*255+50)/100-128));
}
int GetVideoType(PDEVICE_EXTENSION pDE, int nChannel)
{
int nMode;
int nRetry=0;
UCHAR VIPAddresses[2]={IIC_SUB_VIP,IIC_SUB_VIP2};
//return VIDEOTYPE_NTSC;//ntsc
//while(nRetry<3){
nMode=IICRead(pDE,VIPAddresses[nChannel], 0x1f);
// if(bIICError)
// nRetry++;
// else
// break;
//}
if(nMode&0x40){
Reset7113LLC(pDE, nChannel);
return VIDEOTYPE_NONE;//none
}
if(nMode&0x20)
{
pDE->nPreVideoType[nChannel]=VIDEOTYPE_NTSC;
return VIDEOTYPE_NTSC;//ntsc
}
else
{
pDE->nPreVideoType[nChannel]=VIDEOTYPE_PAL;
return VIDEOTYPE_PAL;//pal
}
}
void SetVideoSource(PDEVICE_EXTENSION pDE, ULONG VideoSource, ULONG nChannel)
{
UCHAR SetSource;
UCHAR VIPAddresses[2]={IIC_SUB_VIP,IIC_SUB_VIP2};
if(VideoSource==VIDEOSOURCE_CVBS)
SetSource = 0xc2;
else
SetSource = 0xc9;
IICWrite(pDE, VIPAddresses[nChannel], 2, SetSource);
}
void SetVideoGain(PDEVICE_EXTENSION pDE, ULONG nChannel, ULONG Gain)
{
UCHAR nSA03;
UCHAR nSA05;
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);
}
void SetOwnerChar(PDEVICE_EXTENSION pDE, ULONG nChineseChar, unsigned char *pHanLib, int nIndex);
void SetUserBitmap(PDEVICE_EXTENSION pDE, unsigned char *pBitmap);
void ExtendString(PDEVICE_EXTENSION pDE, char *pDest, const unsigned char *pSrc, int nMaxChar, unsigned char *pHanLib);
//bit 7-0 of nMode: 0 -- disable
// 1 -- YY/MM/DD
// 2 -- YY/DD/MM
// 3 -- DD/MM/YY
// 4 -- mmmDD/YY
// 5 -- YY/mmmDD
//bit 15-8 of nMode: 0 -- '-'
// 1 -- '.'
// 2 -- '/'
// 3 -- ' '
const char cSpaceChar[]={'-', '.', '/', ' '};
const char *sMon[12]={
"JAN", "FEB", "MAR", "APR", "MAY", "JUN",
"JUL", "AUG", "SEP", "OCT", "NOV", "DEC"
};
void Ave2k_GetTimeBias(PDEVICE_EXTENSION pDE);
#define BASE_OWNER_CHAR 248
#define UPDATE_DATE 0x01
#define UPDATE_NAME 0x02
#define UPDATE_BLANK 0x04
ULONG SetOSD(PDEVICE_EXTENSION pDE, int nMode, unsigned char *pName, unsigned char *pHanLib)
{
int i;
int nUser;
int nOSDMode=nMode&0xff;
unsigned char buf[40];
unsigned char *pOwnName;
unsigned int nOSDPosition=0;
pDE->nReplace=BASE_OWNER_CHAR;
pDE->nOSDCorner=nMode&(AVE2K_OSD_LEFT|AVE2K_OSD_TOP);
if(pDE->nOSDMode && nOSDMode==0){//trun OSD off
//close OSD:
//clear ram data but keep window
buf[0]=15|0x80;
buf[1]=17;
buf[2]=OSDEN|RAMCLR;
IICWriteBytes(pDE, IIC_SUB_OSD, 3, buf);
//buf[0]=15|0x80;
//buf[1]=17;
//buf[2]=0x00;//disable OSD
//IICWriteBytes(pDE, IIC_SUB_OSD, 3, buf);
KeCancelTimer(&pDE->OSDTimer);
pDE->nOSDMode = 0;
return 1;
}
if(nOSDMode==0)
return 1;
if(((nMode>>8)&0xff)>3)
return 0;
if(nMode&AVE2K_OSD_BORDER)
pDE->bOSDBorder=TRUE;
else
pDE->bOSDBorder=FALSE;
pDE->nSpaceChar=cSpaceChar[(nMode>>8)&0xff];
InitOSD(pDE, TRUE);
nOSDPosition=AdjustOSDOffset(pDE);
SetMaskWindow(pDE);
if(nMode&AVE2K_OSD_BMP){
for(i=0; i<6; i++)
*(pDE->pChannelName+i*2)=BASE_OWNER_CHAR+i;
SetUserBitmap(pDE, pHanLib);
}
else{
if(nMode&AVE2K_OSD_OWN){
pOwnName=*(unsigned char **)pName;
ExtendString(pDE, buf+2, pOwnName, 15, pHanLib);
buf[0]=(pDE->nOSDTextRow)|0x80;//row
buf[1]=0|0x40;//column
IICWriteBytes(pDE, IIC_SUB_OSD, 15*2+2, buf);
buf[0]=(pDE->nOSDTextRow)|0xa0;//row
buf[1]=0|0x40;//column
memset((char *)buf+2, 0x07, 15*2);
IICWriteBytes(pDE, IIC_SUB_OSD, 15*2+2, buf);
if(strlen(pOwnName)>15)
ExtendString(pDE, buf+2, pOwnName+15, 15, pHanLib);
else
memset(buf+2, 0, 15*2);
buf[0]=(pDE->nOSDTextRow+1)|0x80;//row
buf[1]=0|0x40;//column
IICWriteBytes(pDE, IIC_SUB_OSD, 15*2+2, buf);
buf[0]=(pDE->nOSDTextRow+1)|0xa0;//row
buf[1]=0|0x40;//column
memset((char *)buf+2, 0x07, 15*2);
IICWriteBytes(pDE, IIC_SUB_OSD, 15*2+2, buf);
}
else{
ExtendString(pDE, pDE->pChannelName, pName, 6, pHanLib);
}
}
pDE->nOSDUpdate=UPDATE_NAME|UPDATE_DATE;
if(pDE->nOSDMode==0 && nOSDMode && !(nMode&AVE2K_OSD_OWN)){//trun OSD on
LARGE_INTEGER llDelay;
llDelay.LowPart=-1000;
llDelay.HighPart=0;
pDE->nOSDMode=nOSDMode;
KeSetTimerEx(&pDE->OSDTimer, llDelay, 1000, &pDE->OSDDpc);
}
else{
pDE->nOSDMode=nOSDMode;
}
#if _WIN32_WINNT==0x0500 && TD_WIN98
//query system timezone setting
Ave2k_GetTimeBias(pDE);
#endif
return nOSDPosition;
}
#if _WIN32_WINNT==0x0500 && TD_WIN98
NTSTATUS GetTimeBiasCallback(
IN PWSTR ValueName,
IN ULONG ValueType,
IN PVOID ValueData,
IN ULONG ValueLength,
IN PVOID Context,
IN PVOID EntryContext)
{
PDEVICE_EXTENSION pDE=(PDEVICE_EXTENSION)Context;
pDE->nTimeBias=-*(PLONG)ValueData;
return STATUS_SUCCESS;
}
void Ave2k_GetTimeBias(PDEVICE_EXTENSION pDE)
{
RTL_QUERY_REGISTRY_TABLE QueryTable[2];
int DefaultBias=-8*60;//for China, +8:00
memset(QueryTable, 0, sizeof(RTL_QUERY_REGISTRY_TABLE)*2);
QueryTable[0].QueryRoutine=GetTimeBiasCallback;
QueryTable[0].Name=L"ActiveTimeBias";
QueryTable[0].DefaultType=REG_BINARY;
QueryTable[0].DefaultData=&DefaultBias;
QueryTable[0].DefaultLength=4;
QueryTable[1].QueryRoutine=NULL;
QueryTable[1].Name=NULL;
RtlQueryRegistryValues(
RTL_REGISTRY_CONTROL,
L"TimeZoneInformation",
QueryTable,
pDE,
NULL);
}
#endif
const char *sDateFormat[]={
"%02d%c%02d%c%02d ",
"%s%02d%c%02d ",
"%02d%c%s%02d "
};
void InitOSD(PDEVICE_EXTENSION pDE, int bClear)
{
unsigned char buf[40];
int i;
int nVideoFormat;
if(bClear){
//clear ram data
buf[0]=15|0x80;
buf[1]=17;
buf[2]=WENCLR|RAMCLR;
IICWriteBytes(pDE, IIC_SUB_OSD, 3, buf);
}
buf[0]=15|0x80;
buf[1]=17;
if(pDE->bOSDBorder)
buf[2]=OSDEN|BSEN;//bit 7 is enable OSD
else
buf[2]=OSDEN;
IICWriteBytes(pDE, IIC_SUB_OSD, 3, buf);
//line height
buf[0]=15|0x80;
buf[1]=14;
buf[2]=0;
IICWriteBytes(pDE, IIC_SUB_OSD, 3, buf);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -