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

📄 saa7111.c

📁 driver wdk
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -