#include "via_driver.h"
#include "via_utility.h"
void VIAXVUtilityProc(ScrnInfoPtr pScrn, unsigned char *buf)
{
VIAPtr pVia = VIAPTR(pScrn);
VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
VIAUserSettingPtr pUserSetting = pBIOSInfo->UserSetting;
VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable;
CARD8 *TV = NULL;
int i, HPos, VPos, ADWHS, ADWHE;
unsigned int tvIndx = pBIOSInfo->resTVMode;
CARD32 dwFunc, dwAction = 0, dwInData = 0;
UTBIOSVERSION pUTBIOSVERSION;
UTBIOSDATE pUTBIOSDATE;
UTPANELINFO pUTPANELINFO;
UTXYVALUE MaxViewSizeValue, ViewSizeValue, MaxViewPosValue, ViewPosValue;
UTSETTVTUNINGINFO pUTSETTVTUNINGINFO;
UTSETTVITEMSTATE pUTSETTVITEMSTATE;
UTGAMMAINFO pUTGAMMAINFO;
CARD32 dwVideoRam, dwSupportState = 0, dwConnectState = 0, dwActiveState = 0;
CARD32 dwSAMMState, dwRotateState = 0, dwExpandState, dwStandard = 0;
CARD32 dwSignalType, dwMaxValue, dwItemID = 0, dwValue, dwState;
CARD32 value;
long dwUTRetOK = 1, dwUTRetFail = 0, dwUTRetNoFunc = -1;
unsigned char *InParam;
I2CDevPtr dev = NULL;
unsigned char W_Buffer[3];
unsigned char R_Buffer[3];
WaitIdle();
if ((pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) && (!pUserSetting->DefaultSetting)) {
VIAUTGetInfo(pBIOSInfo);
}
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
if (pBIOSInfo->TVType == TVTYPE_PAL) {
switch (pBIOSInfo->TVVScan) {
case VIA_TVNORMAL:
if (pBIOSInfo->TVOutput == TVOUTPUT_COMPOSITE)
TV = pViaModeTable->tv2Table[tvIndx].TVPALC;
else
TV = pViaModeTable->tv2Table[tvIndx].TVPALS;
break;
case VIA_TVOVER:
if (pBIOSInfo->TVOutput == TVOUTPUT_COMPOSITE)
TV = pViaModeTable->tv2OverTable[tvIndx].TVPALC;
else
TV = pViaModeTable->tv2OverTable[tvIndx].TVPALS;
break;
}
} else {
switch (pBIOSInfo->TVVScan) {
case VIA_TVNORMAL:
if (pBIOSInfo->TVOutput == TVOUTPUT_COMPOSITE)
TV = pViaModeTable->tv2Table[tvIndx].TVNTSCC;
else
TV = pViaModeTable->tv2Table[tvIndx].TVNTSCS;
break;
case VIA_TVOVER:
if (pBIOSInfo->TVOutput == TVOUTPUT_COMPOSITE)
TV = pViaModeTable->tv2OverTable[tvIndx].TVNTSCC;
else
TV = pViaModeTable->tv2OverTable[tvIndx].TVNTSCS;
break;
}
}
break;
case VIA_TV3:
if (pBIOSInfo->TVType == TVTYPE_PAL) {
switch (pBIOSInfo->TVVScan) {
case VIA_TVNORMAL:
TV = pViaModeTable->tv3Table[tvIndx].TVPAL;
break;
case VIA_TVOVER:
TV = pViaModeTable->tv3OverTable[tvIndx].TVPAL;
break;
}
} else {
switch (pBIOSInfo->TVVScan) {
case VIA_TVNORMAL:
TV = pViaModeTable->tv3Table[tvIndx].TVNTSC;
break;
case VIA_TVOVER:
TV = pViaModeTable->tv3OverTable[tvIndx].TVNTSC;
break;
}
}
break;
case VIA_VT1622A:
case VIA_VT1623:
if (pBIOSInfo->TVType == TVTYPE_PAL) {
switch (pBIOSInfo->TVVScan) {
case VIA_TVNORMAL:
TV = pViaModeTable->vt1622aTable[tvIndx].TVPAL;
break;
case VIA_TVOVER:
TV = pViaModeTable->vt1622aOverTable[tvIndx].TVPAL;
break;
}
} else {
switch (pBIOSInfo->TVVScan) {
case VIA_TVNORMAL:
TV = pViaModeTable->vt1622aTable[tvIndx].TVNTSC;
break;
case VIA_TVOVER:
TV = pViaModeTable->vt1622aOverTable[tvIndx].TVNTSC;
break;
}
}
break;
case VIA_CH7009:
case VIA_CH7019:
if (pBIOSInfo->TVType == TVTYPE_PAL) {
switch (pBIOSInfo->TVVScan) {
case VIA_TVNORMAL:
TV = pViaModeTable->ch7019Table[tvIndx].TVPAL;
break;
case VIA_TVOVER:
TV = pViaModeTable->ch7019OverTable[tvIndx].TVPAL;
break;
}
} else {
switch (pBIOSInfo->TVVScan) {
case VIA_TVNORMAL:
TV = pViaModeTable->ch7019Table[tvIndx].TVNTSC;
break;
case VIA_TVOVER:
TV = pViaModeTable->ch7019OverTable[tvIndx].TVNTSC;
break;
}
}
break;
case VIA_SAA7108:
if (pBIOSInfo->TVType == TVTYPE_PAL) {
switch (pBIOSInfo->TVVScan) {
case VIA_TVNORMAL:
TV = pViaModeTable->saa7108Table[tvIndx].TVPAL;
break;
case VIA_TVOVER:
TV = pViaModeTable->saa7108OverTable[tvIndx].TVPAL;
break;
}
} else {
switch (pBIOSInfo->TVVScan) {
case VIA_TVNORMAL:
TV = pViaModeTable->saa7108Table[tvIndx].TVNTSC;
break;
case VIA_TVOVER:
TV = pViaModeTable->saa7108OverTable[tvIndx].TVNTSC;
break;
}
}
break;
}
InParam = buf;
dwFunc = *((CARD32 *) InParam);
InParam += 4;
dwAction = *((CARD32 *) InParam);
InParam += 4;
switch (dwFunc) {
case UT_XV_FUNC_BIOS:
switch (dwAction) {
case UT_XV_FUNC_BIOS_GetChipID:
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, &pVia->ChipId, sizeof(CARD32));
InParam += 4;
break;
case UT_XV_FUNC_BIOS_GetVersion:
pUTBIOSVERSION.dwVersion = pBIOSInfo->BIOSMajorVersion;
pUTBIOSVERSION.dwRevision = pBIOSInfo->BIOSMinorVersion;
memcpy((void *) InParam, &dwUTRetOK, sizeof(long));
InParam += 4;
memcpy((void *) InParam, &pUTBIOSVERSION, sizeof(UTBIOSVERSION));
break;
case UT_XV_FUNC_BIOS_GetDate:
if (!pBIOSInfo->BIOSDateYear)
VIABIOS_GetBIOSDate(pScrn);
pUTBIOSDATE.dwYear = (CARD32) pBIOSInfo->BIOSDateYear + 2000;
pUTBIOSDATE.dwMonth = (CARD32) pBIOSInfo->BIOSDateMonth;
pUTBIOSDATE.dwDay = (CARD32) pBIOSInfo->BIOSDateDay;
memcpy((void *) InParam, &dwUTRetOK, sizeof(long));
InParam += 4;
memcpy((void *) InParam, &pUTBIOSDATE, sizeof(UTBIOSDATE));
break;
case UT_XV_FUNC_BIOS_GetVideoMemSizeMB:
dwVideoRam = pScrn->videoRam >> 10;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, &dwVideoRam, sizeof(CARD32));
break;
default:
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
InParam += 4;
ErrorF(" via_utility.c : dwAction not supported\n");
break;
}
break;
case UT_XV_FUNC_DEVICE:
switch (dwAction) {
case UT_XV_FUNC_DEVICE_GetSupportState:
dwSupportState = UT_DEVICE_CRT1;
if (pBIOSInfo->TVEncoder)
dwSupportState |= UT_DEVICE_TV;
if (pBIOSInfo->TMDS) {
dwSupportState |= UT_DEVICE_DFP;
}
if (pBIOSInfo->LVDS) {
dwSupportState |= UT_DEVICE_LCD;
}
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, &dwSupportState, sizeof(CARD32));
break;
case UT_XV_FUNC_DEVICE_GetConnectState:
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
dwConnectState = VIAGetDeviceDetect(pBIOSInfo);
memcpy((void *) InParam, &dwConnectState, sizeof(CARD32));
break;
case UT_XV_FUNC_DEVICE_GetActiveState:
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
if (pBIOSInfo->HasSecondary)
dwActiveState = pVia->ActiveDevice;
else
dwActiveState = pBIOSInfo->ActiveDevice;
memcpy((void *) InParam, &dwActiveState, sizeof(CARD32));
break;
case UT_XV_FUNC_DEVICE_SetActiveState:
InParam += 4;
dwInData = *((CARD32 *) InParam);
if ((dwInData == (VIA_DEVICE_TV | VIA_DEVICE_LCD)) || (dwInData == (VIA_DEVICE_TV | VIA_DEVICE_DFP))) {
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
break;
}
pBIOSInfo->ActiveDevice = (unsigned char) dwInData;
pBIOSInfo->scaleY = FALSE;
pScrn->frameX1 = pBIOSInfo->SaveframeX1;
pScrn->frameY1 = pBIOSInfo->SaveframeY1;
pScrn->currentMode->HDisplay = pBIOSInfo->SaveHDisplay;
pScrn->currentMode->VDisplay = pBIOSInfo->SaveVDisplay;
pScrn->currentMode->CrtcHDisplay = pBIOSInfo->SaveCrtcHDisplay;
pScrn->currentMode->CrtcVDisplay = pBIOSInfo->SaveCrtcVDisplay;
VIASwitchMode(0, pScrn->currentMode, 0);
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
break;
case UT_XV_FUNC_DEVICE_GetSAMMState:
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
if (!pBIOSInfo->HasSecondary)
dwSAMMState = UT_STATE_SAMM_OFF;
else
dwSAMMState = UT_STATE_SAMM_ON;
memcpy((void *) InParam, &dwSAMMState, sizeof(CARD32));
break;
case UT_XV_FUNC_DEVICE_GetRoateState:
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
dwRotateState = UT_ROTATE_NONE;
memcpy((void *) InParam, &dwRotateState, sizeof(CARD32));
break;
case UT_XV_FUNC_DEVICE_SetRoateState:
memcpy((void *) InParam, &dwUTRetNoFunc, sizeof(CARD32));
break;
default:
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
ErrorF(" via_utility.c : dwAction not supported\n");
break;
}
break;
case UT_XV_FUNC_PANEL:
switch (dwAction) {
case UT_XV_FUNC_DEVICE_SetTargetPanel:
memcpy((void *) InParam, &dwUTRetNoFunc, sizeof(CARD32));
break;
case UT_XV_FUNC_DEVICE_GetPanelInfo:
pUTPANELINFO.dwType = UT_PANEL_TYPE_TFT;
pUTPANELINFO.dwResX = pBIOSInfo->panelX;
pUTPANELINFO.dwResY = pBIOSInfo->panelY;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, &pUTPANELINFO, sizeof(UTPANELINFO));
break;
case UT_XV_FUNC_DEVICE_GetExpandState:
if (pBIOSInfo->Center)
dwExpandState = UT_STATE_EXPAND_OFF;
else
dwExpandState = UT_STATE_EXPAND_ON;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, &dwExpandState, sizeof(CARD32));
break;
case UT_XV_FUNC_DEVICE_SetExpandState:
InParam += 4;
dwInData = *((CARD32 *) InParam);
if (dwInData == UT_STATE_EXPAND_OFF) {
pBIOSInfo->Center = TRUE;
VIASwitchMode(0, pScrn->currentMode, 0);
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
} else if (dwInData == UT_STATE_EXPAND_ON) {
pBIOSInfo->Center = FALSE;
VIASwitchMode(0, pScrn->currentMode, 0);
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
} else {
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
}
break;
case UT_XV_FUNC_DEVICE_GetSupportExpand:
InParam += 4;
dwInData = *((CARD32 *) InParam);
if (pBIOSInfo->LVDS) {
switch (pBIOSInfo->PanelSize) {
case VIA_PANEL6X4:
if (pBIOSInfo->SaveHDisplay < 640 && pBIOSInfo->SaveVDisplay < 480) {
dwSupportState = UT_PANEL_SUPPORT_EXPAND_ON;
} else {
dwSupportState = UT_PANEL_SUPPORT_EXPAND_OFF;
}
break;
case VIA_PANEL8X6:
if (pBIOSInfo->SaveHDisplay < 800 && pBIOSInfo->SaveVDisplay < 600) {
dwSupportState = UT_PANEL_SUPPORT_EXPAND_ON;
} else {
dwSupportState = UT_PANEL_SUPPORT_EXPAND_OFF;
}
break;
case VIA_PANEL10X7:
if (pBIOSInfo->SaveHDisplay < 1024 && pBIOSInfo->SaveVDisplay < 768) {
dwSupportState = UT_PANEL_SUPPORT_EXPAND_ON;
} else {
dwSupportState = UT_PANEL_SUPPORT_EXPAND_OFF;
}
break;
case VIA_PANEL12X7:
if (pBIOSInfo->SaveHDisplay < 1280 && pBIOSInfo->SaveVDisplay < 768) {
dwSupportState = UT_PANEL_SUPPORT_EXPAND_ON;
} else {
dwSupportState = UT_PANEL_SUPPORT_EXPAND_OFF;
}
break;
case VIA_PANEL12X10:
if (pBIOSInfo->SaveHDisplay < 1280 && pBIOSInfo->SaveVDisplay < 1024) {
dwSupportState = UT_PANEL_SUPPORT_EXPAND_ON;
} else {
dwSupportState = UT_PANEL_SUPPORT_EXPAND_OFF;
}
break;
case VIA_PANEL14X10:
if (pBIOSInfo->SaveHDisplay < 1400 && pBIOSInfo->SaveVDisplay < 1050) {
dwSupportState = UT_PANEL_SUPPORT_EXPAND_ON;
} else {
dwSupportState = UT_PANEL_SUPPORT_EXPAND_OFF;
}
break;
case VIA_PANEL16X12:
if (pBIOSInfo->SaveHDisplay < 1600 && pBIOSInfo->SaveVDisplay < 1200) {
dwSupportState = UT_PANEL_SUPPORT_EXPAND_ON;
} else {
dwSupportState = UT_PANEL_SUPPORT_EXPAND_OFF;
}
break;
default:
dwSupportState = UT_PANEL_SUPPORT_EXPAND_OFF;
break;
}
} else {
dwSupportState = UT_PANEL_SUPPORT_EXPAND_OFF;
}
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, &dwSupportState, sizeof(CARD32));
break;
default:
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
InParam += 4;
ErrorF(" via_utility.c : dwAction not supported\n");
break;
}
break;
case UT_XV_FUNC_TV:
switch (dwAction) {
case UT_XV_FUNC_TV_GetSupportStandardState:
dwSupportState = UT_TV_STD_NTSC | UT_TV_STD_PAL;
if (pBIOSInfo->TVEncoder == VIA_FS454)
dwSupportState = UT_TV_STD_NTSC;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, &dwSupportState, sizeof(CARD32));
break;
case UT_XV_FUNC_TV_GetStandard:
dwStandard = pBIOSInfo->TVType;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, &dwStandard, sizeof(CARD32));
break;
case UT_XV_FUNC_TV_SetStandard:
InParam += 4;
dwInData = *((CARD32 *) InParam);
switch (dwInData) {
case UT_TV_STD_NTSC:
pBIOSInfo->TVType = TVTYPE_NTSC;
if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) {
VIASwitchMode(0, pScrn->currentMode, 0);
}
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
break;
case UT_TV_STD_PAL:
pBIOSInfo->TVType = TVTYPE_PAL;
if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) {
VIASwitchMode(0, pScrn->currentMode, 0);
}
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
break;
default:
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
break;
}
break;
case UT_XV_FUNC_TV_GetSupportSignalTypeState:
VIAGetActiveDisplay(pBIOSInfo);
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
dwSupportState = UT_TV_SGNL_COMPOSITE | UT_TV_SGNL_S_VIDEO;
break;
case VIA_TV3:
case VIA_VT1622A:
dwSupportState = UT_TV_SGNL_COMPOSITE | UT_TV_SGNL_S_VIDEO | UT_TV_SGNL_SCART | UT_TV_SGNL_COMP_OUTPUT;
break;
case VIA_SAA7108:
dwSupportState = UT_TV_SGNL_COMPOSITE | UT_TV_SGNL_S_VIDEO | UT_TV_SGNL_SCART | UT_TV_SGNL_COMP_OUTPUT;
break;
case VIA_FS454:
dwSupportState = UT_TV_SGNL_COMPOSITE | UT_TV_SGNL_S_VIDEO | UT_TV_SGNL_SCART;
break;
case VIA_CH7009:
case VIA_CH7019:
dwSupportState = UT_TV_SGNL_COMPOSITE | UT_TV_SGNL_S_VIDEO;
break;
default:
dwSupportState = 0;
break;
}
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, &dwSupportState, sizeof(CARD32));
break;
case UT_XV_FUNC_TV_GetSignalType:
dwSignalType = pBIOSInfo->TVOutput;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, &dwSignalType, sizeof(CARD32));
break;
case UT_XV_FUNC_TV_SetSignalType:
InParam += 4;
dwInData = *((CARD32 *) InParam);
switch (dwInData) {
case UT_TV_SGNL_COMPOSITE:
pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE;
if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) {
VIASwitchMode(0, pScrn->currentMode, 0);
}
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
break;
case UT_TV_SGNL_S_VIDEO:
pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO;
if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) {
VIASwitchMode(0, pScrn->currentMode, 0);
}
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
break;
case UT_TV_SGNL_SCART:
pBIOSInfo->TVOutput = TVOUTPUT_RGB;
if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) {
VIASwitchMode(0, pScrn->currentMode, 0);
}
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
break;
case UT_TV_SGNL_COMP_OUTPUT:
pBIOSInfo->TVOutput = TVOUTPUT_YCBCR;
if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) {
VIASwitchMode(0, pScrn->currentMode, 0);
}
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
break;
default:
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
break;
}
break;
case UT_XV_FUNC_TV_GetMaxViewSizeValue:
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
case VIA_SAA7108:
case VIA_FS454:
case VIA_CH7009:
case VIA_CH7019:
MaxViewSizeValue.dwX = 0;
MaxViewSizeValue.dwY = 2;
break;
default:
MaxViewSizeValue.dwX = 0;
MaxViewSizeValue.dwY = 0;
break;
}
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, &MaxViewSizeValue, sizeof(UTXYVALUE));
break;
case UT_XV_FUNC_TV_GetViewSizeValue:
ViewSizeValue.dwX = 0;
ViewSizeValue.dwY = pBIOSInfo->TVVScan + 1;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, &ViewSizeValue, sizeof(UTXYVALUE));
break;
case UT_XV_FUNC_TV_SetViewSizeValue:
InParam = buf + 12;
memcpy(&ViewSizeValue, (void *) InParam, sizeof(UTXYVALUE));
if (ViewSizeValue.dwY == 0xFFFF) {
pBIOSInfo->TVVScan = VIA_TVNORMAL;
} else {
pBIOSInfo->TVVScan = (int) ViewSizeValue.dwY - 1;
}
VIASwitchMode(0, pScrn->currentMode, 0);
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
break;
case UT_XV_FUNC_TV_GetMaxViewPositionValue:
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
MaxViewPosValue.dwX = 0;
MaxViewPosValue.dwY = 0;
break;
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
MaxViewPosValue.dwX = 11;
MaxViewPosValue.dwY = 11;
break;
case VIA_SAA7108:
MaxViewPosValue.dwX = 11;
MaxViewPosValue.dwY = 11;
break;
case VIA_FS454:
case VIA_CH7009:
case VIA_CH7019:
default:
MaxViewPosValue.dwX = 0;
MaxViewPosValue.dwY = 0;
break;
}
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, &MaxViewPosValue, sizeof(UTXYVALUE));
break;
case UT_XV_FUNC_TV_GetViewPositionValue:
InParam = buf + 12;
memcpy(&ViewPosValue, (void *) InParam, sizeof(UTXYVALUE));
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
ViewPosValue.dwX = 0;
ViewPosValue.dwY = 0;
break;
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
if (ViewPosValue.dwX == 0xFFFF && ViewPosValue.dwY == 0xFFFF) {
ViewPosValue.dwX = 6;
ViewPosValue.dwY = 6;
} else {
ViewPosValue.dwX = pUserSetting->tvHPosition;
ViewPosValue.dwY = pUserSetting->tvVPosition;
}
break;
case VIA_SAA7108:
if (ViewPosValue.dwX == 0xFFFF && ViewPosValue.dwY == 0xFFFF) {
ViewPosValue.dwX = 6;
ViewPosValue.dwY = 6;
} else {
ViewPosValue.dwX = pUserSetting->tvHPosition;
ViewPosValue.dwY = pUserSetting->tvVPosition;
}
break;
case VIA_FS454:
case VIA_CH7009:
case VIA_CH7019:
default:
ViewPosValue.dwX = 0;
ViewPosValue.dwY = 0;
break;
}
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, &ViewPosValue, sizeof(UTXYVALUE));
break;
case UT_XV_FUNC_TV_SetViewPositionValue:
InParam = buf + 12;
memcpy(&ViewPosValue, (void *) InParam, sizeof(UTXYVALUE));
if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) {
dev = xf86CreateI2CDevRec();
dev->DevName = "TV";
dev->SlaveAddr = pBIOSInfo->TVI2CAdd;
dev->pI2CBus = pBIOSInfo->I2C_Port2;
if (xf86I2CDevInit(dev)) {
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
pUserSetting->tvHPosition = 0;
pUserSetting->tvVPosition = 0;
break;
case VIA_TV3:
case VIA_VT1622A:
if (ViewPosValue.dwX == 0xFFFF && ViewPosValue.dwX == 0xFFFF) {
W_Buffer[0] = 0x1C;
W_Buffer[1] = TV[0x1C];
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
W_Buffer[0] = 0x08;
W_Buffer[1] = TV[0x08];
W_Buffer[2] = TV[0x09];
xf86I2CWriteRead(dev, W_Buffer, 3, NULL, 0);
pUserSetting->tvHPosition = 6;
pUserSetting->tvVPosition = 6;
} else {
W_Buffer[0] = 0x08;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 2);
HPos = R_Buffer[0];
VPos = R_Buffer[1];
W_Buffer[0] = 0x1C;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
HPos |= (R_Buffer[0] & 0x04) << 6;
VPos |= (R_Buffer[0] & 0x02) << 7;
HPos += ViewPosValue.dwX - pUserSetting->tvHPosition;
VPos += ViewPosValue.dwY - pUserSetting->tvVPosition;
W_Buffer[0] = 0x08;
W_Buffer[1] = HPos & 0xFF;
W_Buffer[2] = VPos & 0xFF;
xf86I2CWriteRead(dev, W_Buffer, 3, NULL, 0);
W_Buffer[0] = 0x1C;
W_Buffer[1] = R_Buffer[0] & ~0x06;
W_Buffer[1] |= (HPos >> 6) & 0x04;
W_Buffer[1] |= (VPos >> 7) & 0x02;
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
pUserSetting->tvHPosition = ViewPosValue.dwX;
pUserSetting->tvVPosition = ViewPosValue.dwY;
}
break;
case VIA_SAA7108:
if (ViewPosValue.dwX == 0xFFFF && ViewPosValue.dwX == 0xFFFF) {
for (i = 0; i < 3; i++) {
W_Buffer[0] = VIASAA7108PostionOffset[i];
if (pBIOSInfo->TVVScan == VIA_TVNORMAL)
W_Buffer[1] = VIASAA7108PostionNormalTabRec[pBIOSInfo->TVType - 1][tvIndx][5][i];
else
W_Buffer[1] = VIASAA7108PostionOverTabRec[pBIOSInfo->TVType - 1][tvIndx][5][i];
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
}
W_Buffer[0] = 0x72;
W_Buffer[1] = TV[0x72];
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
W_Buffer[0] = 0x70;
W_Buffer[1] = TV[0x70];
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
W_Buffer[0] = 0x72;
W_Buffer[1] = TV[0x72];
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
W_Buffer[0] = 0x71;
W_Buffer[1] = TV[0x71];
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
pUserSetting->tvHPosition = 6;
pUserSetting->tvVPosition = 6;
} else {
for (i = 0; i < 3; i++) {
W_Buffer[0] = VIASAA7108PostionOffset[i];
if (pBIOSInfo->TVVScan == VIA_TVNORMAL)
W_Buffer[1] = VIASAA7108PostionNormalTabRec[pBIOSInfo->TVType - 1][tvIndx][ViewPosValue.dwY][i];
else
W_Buffer[1] = VIASAA7108PostionOverTabRec[pBIOSInfo->TVType - 1][tvIndx][ViewPosValue.dwY][i];
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
}
W_Buffer[0] = 0x70;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 3);
ADWHS = R_Buffer[0] | ((R_Buffer[2] & 0x07) << 8);
ADWHE = R_Buffer[1] | ((R_Buffer[2] & 0x70) << 4);
switch (ViewPosValue.dwX - pUserSetting->tvHPosition) {
case 1:
ADWHS++;
ADWHE++;
W_Buffer[0] = 0x72;
W_Buffer[1] = (R_Buffer[2] & ~0x77) | ((ADWHS & 0x700) >> 8) | ((ADWHE & 0x700) >> 4);
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
W_Buffer[0] = 0x70;
W_Buffer[1] = ADWHS & 0xFF;
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
W_Buffer[0] = 0x72;
W_Buffer[1] = (R_Buffer[2] & ~0x77) | ((ADWHS & 0x700) >> 8) | ((ADWHE & 0x700) >> 4);
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
W_Buffer[0] = 0x71;
W_Buffer[1] = ADWHE & 0xFF;
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
break;
case -1:
ADWHS--;
ADWHE--;
W_Buffer[0] = 0x72;
W_Buffer[1] = (R_Buffer[2] & ~0x77) | ((ADWHS & 0x700) >> 8) | ((ADWHE & 0x700) >> 4);
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
W_Buffer[0] = 0x71;
W_Buffer[1] = ADWHE & 0xFF;
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
W_Buffer[0] = 0x72;
W_Buffer[1] = (R_Buffer[2] & ~0x77) | ((ADWHS & 0x700) >> 8) | ((ADWHE & 0x700) >> 4);
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
W_Buffer[0] = 0x70;
W_Buffer[1] = ADWHS & 0xFF;
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
break;
default:
break;
}
pUserSetting->tvHPosition = ViewPosValue.dwX;
pUserSetting->tvVPosition = ViewPosValue.dwY;
}
break;
case VIA_FS454:
case VIA_CH7009:
case VIA_CH7019:
default:
pUserSetting->tvHPosition = 0;
pUserSetting->tvVPosition = 0;
break;
}
xf86DestroyI2CDevRec(dev, TRUE);
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
} else {
xf86DestroyI2CDevRec(dev, TRUE);
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
}
}
break;
case UT_XV_FUNC_TV_GetSupportTuningState:
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
dwSupportState = UT_TV_TUNING_FFILTER | UT_TV_TUNING_BRIGHTNESS | UT_TV_TUNING_CONTRAST | UT_TV_TUNING_SATURATION | UT_TV_TUNING_TINT;
break;
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
dwSupportState = UT_TV_TUNING_FFILTER | UT_TV_TUNING_ADAPTIVE_FFILTER | UT_TV_TUNING_BRIGHTNESS | UT_TV_TUNING_CONTRAST | UT_TV_TUNING_SATURATION | UT_TV_TUNING_TINT;
break;
case VIA_SAA7108:
dwSupportState = UT_TV_TUNING_FFILTER;
break;
case VIA_CH7009:
case VIA_CH7019:
dwSupportState = UT_TV_TUNING_FFILTER | UT_TV_TUNING_ADAPTIVE_FFILTER | UT_TV_TUNING_BRIGHTNESS | UT_TV_TUNING_CONTRAST;
break;
case VIA_FS454:
default:
dwSupportState = 0;
break;
}
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, &dwSupportState, sizeof(UTXYVALUE));
break;
case UT_XV_FUNC_TV_GetTuningItemMaxValue:
InParam += 4;
dwInData = *((CARD32 *) InParam);
switch (dwInData) {
case UT_TV_TUNING_FFILTER:
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
dwMaxValue = 0;
break;
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
dwMaxValue = 3;
break;
case VIA_CH7009:
case VIA_CH7019:
case VIA_SAA7108:
dwMaxValue = 3;
break;
case VIA_FS454:
default:
dwMaxValue = 0;
break;
}
break;
case UT_TV_TUNING_ADAPTIVE_FFILTER:
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
dwMaxValue = 0;
break;
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
dwMaxValue = 255;
break;
case VIA_SAA7108:
case VIA_FS454:
case VIA_CH7009:
case VIA_CH7019:
default:
dwMaxValue = 0;
break;
}
break;
case UT_TV_TUNING_BRIGHTNESS:
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
dwMaxValue = 0;
break;
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
dwMaxValue = 255;
break;
case VIA_SAA7108:
case VIA_FS454:
case VIA_CH7009:
case VIA_CH7019:
default:
dwMaxValue = 0;
break;
}
break;
case UT_TV_TUNING_CONTRAST:
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
dwMaxValue = 0;
break;
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
dwMaxValue = 255;
break;
case VIA_SAA7108:
case VIA_FS454:
case VIA_CH7009:
case VIA_CH7019:
default:
dwMaxValue = 0;
break;
}
break;
case UT_TV_TUNING_SATURATION:
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
dwMaxValue = 0;
break;
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
dwMaxValue = 65535;
break;
case VIA_SAA7108:
case VIA_FS454:
case VIA_CH7009:
case VIA_CH7019:
default:
dwMaxValue = 0;
break;
}
break;
case UT_TV_TUNING_TINT:
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
dwMaxValue = 2047;
break;
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
dwMaxValue = 2047;
break;
case VIA_SAA7108:
case VIA_FS454:
case VIA_CH7009:
case VIA_CH7019:
default:
dwMaxValue = 0;
break;
}
break;
default:
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
dwMaxValue = 0;
break;
}
InParam += 4;
memcpy((void *) InParam, &dwMaxValue, sizeof(CARD32));
break;
case UT_XV_FUNC_TV_GetTuningItemValue:
InParam += 4;
dwInData = *((CARD32 *) InParam);
switch (dwInData) {
case UT_TV_TUNING_FFILTER:
dwValue = pUserSetting->tvFFilter;
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
break;
case UT_TV_TUNING_ADAPTIVE_FFILTER:
dwValue = pUserSetting->tvAdaptiveFFilter;
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
break;
case UT_TV_TUNING_BRIGHTNESS:
dwValue = pUserSetting->tvBrightness;
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
break;
case UT_TV_TUNING_CONTRAST:
dwValue = pUserSetting->tvContrast;
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
break;
case UT_TV_TUNING_SATURATION:
dwValue = pUserSetting->tvSaturation;
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
break;
case UT_TV_TUNING_TINT:
dwValue = pUserSetting->tvTint;
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
break;
default:
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
dwValue = 0;
break;
}
InParam += 4;
memcpy((void *) InParam, &dwValue, sizeof(CARD32));
break;
case UT_XV_FUNC_TV_SetTuningItemValue:
InParam = buf + 12;
memcpy(&pUTSETTVTUNINGINFO, (void *) InParam, sizeof(UTSETTVTUNINGINFO));
switch (pUTSETTVTUNINGINFO.dwItemID) {
case UT_TV_TUNING_FFILTER:
if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) {
dev = xf86CreateI2CDevRec();
dev->DevName = "TV";
dev->SlaveAddr = pBIOSInfo->TVI2CAdd;
dev->pI2CBus = pBIOSInfo->I2C_Port2;
if (xf86I2CDevInit(dev)) {
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
pUserSetting->tvFFilter = 0;
break;
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) {
W_Buffer[0] = 0x03;
W_Buffer[1] = TV[0x03];
pUserSetting->tvFFilter = TV[0x03] & 0x03;
if (pUserSetting->tvFFilter == 0)
pUserSetting->AdaptiveFilterOn = TRUE;
} else {
W_Buffer[0] = 0x03;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
W_Buffer[1] = R_Buffer[0] & ~0x03;
W_Buffer[1] |= pUTSETTVTUNINGINFO.dwValue;
pUserSetting->tvFFilter = pUTSETTVTUNINGINFO.dwValue;
}
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
break;
case VIA_SAA7108:
if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) {
W_Buffer[0] = 0x37;
W_Buffer[1] = TV[0x37];
pUserSetting->tvFFilter = (TV[0x37] & 0x30) + 1;
} else {
W_Buffer[0] = 0x37;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
W_Buffer[1] = R_Buffer[0] & ~0x30;
W_Buffer[1] |= (unsigned char) (pUTSETTVTUNINGINFO.dwValue - 1);
pUserSetting->tvFFilter = pUTSETTVTUNINGINFO.dwValue;
}
break;
case VIA_CH7009:
case VIA_CH7019:
case VIA_FS454:
default:
pUserSetting->tvFFilter = 0;
break;
}
xf86DestroyI2CDevRec(dev, TRUE);
} else {
xf86DestroyI2CDevRec(dev, TRUE);
}
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
} else {
xf86DestroyI2CDevRec(dev, TRUE);
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
}
break;
case UT_TV_TUNING_ADAPTIVE_FFILTER:
if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) {
dev = xf86CreateI2CDevRec();
dev->DevName = "TV";
dev->SlaveAddr = pBIOSInfo->TVI2CAdd;
dev->pI2CBus = pBIOSInfo->I2C_Port2;
if (xf86I2CDevInit(dev)) {
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
pUserSetting->tvAdaptiveFFilter = 0;
break;
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) {
W_Buffer[0] = 0x61;
W_Buffer[1] = TV[0x61];
pUserSetting->tvAdaptiveFFilter = TV[0x61] & 0xFF;
} else {
W_Buffer[0] = 0x61;
W_Buffer[1] = (unsigned char) pUTSETTVTUNINGINFO.dwValue;
pUserSetting->tvAdaptiveFFilter = pUTSETTVTUNINGINFO.dwValue;
}
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
break;
case VIA_SAA7108:
case VIA_FS454:
case VIA_CH7009:
case VIA_CH7019:
default:
pUserSetting->tvAdaptiveFFilter = 0;
break;
}
xf86DestroyI2CDevRec(dev, TRUE);
} else {
xf86DestroyI2CDevRec(dev, TRUE);
}
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
} else {
xf86DestroyI2CDevRec(dev, TRUE);
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
}
break;
case UT_TV_TUNING_BRIGHTNESS:
if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) {
dev = xf86CreateI2CDevRec();
dev->DevName = "TV";
dev->SlaveAddr = pBIOSInfo->TVI2CAdd;
dev->pI2CBus = pBIOSInfo->I2C_Port2;
if (xf86I2CDevInit(dev)) {
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
pUserSetting->tvBrightness = 0;
break;
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
W_Buffer[0] = 0x0B;
if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) {
W_Buffer[1] = TV[0x0B];
pUserSetting->tvBrightness = TV[0x0B] & 0xFF;
} else {
W_Buffer[1] = (unsigned char) pUTSETTVTUNINGINFO.dwValue;
pUserSetting->tvBrightness = pUTSETTVTUNINGINFO.dwValue;
}
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
break;
case VIA_SAA7108:
case VIA_FS454:
case VIA_CH7009:
case VIA_CH7019:
default:
pUserSetting->tvBrightness = 0;
break;
}
xf86DestroyI2CDevRec(dev, TRUE);
} else {
xf86DestroyI2CDevRec(dev, TRUE);
}
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
} else {
xf86DestroyI2CDevRec(dev, TRUE);
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
}
break;
case UT_TV_TUNING_CONTRAST:
if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) {
dev = xf86CreateI2CDevRec();
dev->DevName = "TV";
dev->SlaveAddr = pBIOSInfo->TVI2CAdd;
dev->pI2CBus = pBIOSInfo->I2C_Port2;
if (xf86I2CDevInit(dev)) {
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
pUserSetting->tvContrast = 0;
break;
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
W_Buffer[0] = 0x0C;
if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) {
W_Buffer[1] = TV[0x0C];
pUserSetting->tvContrast = TV[0x0C] & 0xFF;
} else {
W_Buffer[1] = (unsigned char) pUTSETTVTUNINGINFO.dwValue;
pUserSetting->tvContrast = pUTSETTVTUNINGINFO.dwValue;
}
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
break;
case VIA_SAA7108:
case VIA_FS454:
case VIA_CH7009:
case VIA_CH7019:
default:
pUserSetting->tvContrast = 0;
break;
}
xf86DestroyI2CDevRec(dev, TRUE);
} else {
xf86DestroyI2CDevRec(dev, TRUE);
}
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
} else {
xf86DestroyI2CDevRec(dev, TRUE);
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
}
break;
case UT_TV_TUNING_SATURATION:
if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) {
dev = xf86CreateI2CDevRec();
dev->DevName = "TV";
dev->SlaveAddr = pBIOSInfo->TVI2CAdd;
dev->pI2CBus = pBIOSInfo->I2C_Port2;
if (xf86I2CDevInit(dev)) {
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
pUserSetting->tvSaturation = 0;
break;
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) {
W_Buffer[0] = 0x0D;
W_Buffer[1] = TV[0x0D];
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
W_Buffer[0] = 0x0A;
W_Buffer[1] = TV[0x0A];
value = TV[0x0D];
pUserSetting->tvSaturation = TV[0x0A] & 0xFF;
pUserSetting->tvSaturation |= value << 8;
} else {
W_Buffer[0] = 0x0D;
W_Buffer[1] = (unsigned char) ((pUTSETTVTUNINGINFO.dwValue >> 8) & 0xFF);
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
W_Buffer[0] = 0x0A;
W_Buffer[1] = (unsigned char) (pUTSETTVTUNINGINFO.dwValue & 0xFF);
pUserSetting->tvSaturation = pUTSETTVTUNINGINFO.dwValue;
}
xf86I2CWriteRead(dev, W_Buffer, 3, NULL, 0);
break;
case VIA_SAA7108:
case VIA_FS454:
case VIA_CH7009:
case VIA_CH7019:
default:
pUserSetting->tvSaturation = 0;
break;
}
xf86DestroyI2CDevRec(dev, TRUE);
} else {
xf86DestroyI2CDevRec(dev, TRUE);
}
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
} else {
xf86DestroyI2CDevRec(dev, TRUE);
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
}
break;
case UT_TV_TUNING_TINT:
if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) {
dev = xf86CreateI2CDevRec();
dev->DevName = "TV";
dev->SlaveAddr = pBIOSInfo->TVI2CAdd;
dev->pI2CBus = pBIOSInfo->I2C_Port2;
if (xf86I2CDevInit(dev)) {
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) {
W_Buffer[0] = 0x10;
W_Buffer[1] = TV[0x10];
W_Buffer[2] = TV[0x11];
pUserSetting->tvTint = TV[0x10] & 0xFF;
pUserSetting->tvTint |= (TV[0x11] & 0xE0) << 3;
} else {
W_Buffer[0] = 0x11;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
W_Buffer[2] = R_Buffer[0] & ~0xE0;
W_Buffer[2] |= (unsigned char) ((pUTSETTVTUNINGINFO.dwValue >> 3) & 0xFF);
W_Buffer[0] = 0x10;
W_Buffer[1] = (unsigned char) (pUTSETTVTUNINGINFO.dwValue & 0xFF);
pUserSetting->tvTint = pUTSETTVTUNINGINFO.dwValue;
}
xf86I2CWriteRead(dev, W_Buffer, 3, NULL, 0);
break;
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) {
W_Buffer[0] = 0x10;
W_Buffer[1] = TV[0x10];
W_Buffer[2] = TV[0x11];
value = TV[0x11];
pUserSetting->tvTint = TV[0x10] & 0xFF;
pUserSetting->tvTint |= TV[0x11] << 8;
} else {
W_Buffer[0] = 0x11;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
W_Buffer[2] = R_Buffer[0] & ~0x07;
W_Buffer[2] |= (unsigned char) (pUTSETTVTUNINGINFO.dwValue >> 8) & 0xFF;
W_Buffer[0] = 0x10;
W_Buffer[1] = (unsigned char) (pUTSETTVTUNINGINFO.dwValue & 0xFF);
pUserSetting->tvTint = pUTSETTVTUNINGINFO.dwValue;
}
xf86I2CWriteRead(dev, W_Buffer, 3, NULL, 0);
break;
case VIA_SAA7108:
case VIA_FS454:
case VIA_CH7009:
case VIA_CH7019:
default:
pUserSetting->tvTint = 0;
break;
}
xf86DestroyI2CDevRec(dev, TRUE);
} else {
xf86DestroyI2CDevRec(dev, TRUE);
}
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
} else {
xf86DestroyI2CDevRec(dev, TRUE);
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
}
break;
default:
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
break;
}
break;
case UT_XV_FUNC_TV_GetSupportSettingState:
dwItemID |= UT_TV_SETTING_FFILTER;
switch (pBIOSInfo->TVEncoder) {
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
dwItemID |= UT_TV_SETTING_ADAPTIVE_FFILTER;
if (pBIOSInfo->TVType == TVTYPE_NTSC)
dwItemID |= UT_TV_SETTING_DOT_CRAWL;
break;
case VIA_FS454:
case VIA_CH7009:
case VIA_CH7019:
if (pBIOSInfo->TVType == TVTYPE_NTSC)
dwItemID |= UT_TV_SETTING_DOT_CRAWL;
break;
default:
break;
}
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, &dwItemID, sizeof(CARD32));
break;
case UT_XV_FUNC_TV_GetSettingItemState:
InParam += 4;
dwInData = *((CARD32 *) InParam);
switch (dwInData) {
case UT_TV_SETTING_FFILTER:
if (pUserSetting->tvFFilter)
dwState = UT_STATE_ON;
else
dwState = UT_STATE_OFF;
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
break;
case UT_TV_SETTING_ADAPTIVE_FFILTER:
if (pUserSetting->tvFFilter)
dwState = UT_STATE_OFF;
else
dwState = UT_STATE_ON;
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
break;
case UT_TV_SETTING_DOT_CRAWL:
if (pBIOSInfo->TVDotCrawl)
dwState = UT_STATE_ON;
else
dwState = UT_STATE_OFF;
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
break;
case UT_TV_SETTING_LOCK_ASPECT_RATIO:
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetNoFunc, sizeof(CARD32));
dwState = UT_STATE_OFF;
break;
default:
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
dwState = UT_STATE_OFF;
break;
}
InParam += 4;
memcpy((void *) InParam, &dwState, sizeof(CARD32));
break;
case UT_XV_FUNC_TV_SetSettingItemState:
InParam = buf + 12;
memcpy(&pUTSETTVITEMSTATE, (void *) InParam, sizeof(UTSETTVITEMSTATE));
switch (pUTSETTVITEMSTATE.dwItemID) {
case UT_TV_SETTING_FFILTER:
if (pUTSETTVITEMSTATE.dwState == UT_STATE_OFF) {
if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) {
dev = xf86CreateI2CDevRec();
dev->DevName = "TV";
dev->SlaveAddr = pBIOSInfo->TVI2CAdd;
dev->pI2CBus = pBIOSInfo->I2C_Port2;
if (xf86I2CDevInit(dev)) {
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
W_Buffer[0] = 0x03;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
W_Buffer[1] = R_Buffer[0] & ~0x03;
break;
case VIA_SAA7108:
W_Buffer[0] = 0x37;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
W_Buffer[1] = R_Buffer[0] & ~0x30;
break;
}
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
xf86DestroyI2CDevRec(dev, TRUE);
pUserSetting->AdaptiveFilterOn = TRUE;
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
} else {
xf86DestroyI2CDevRec(dev, TRUE);
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
}
}
} else if (pUTSETTVITEMSTATE.dwState == UT_STATE_ON) {
if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) {
dev = xf86CreateI2CDevRec();
dev->DevName = "TV";
dev->SlaveAddr = pBIOSInfo->TVI2CAdd;
dev->pI2CBus = pBIOSInfo->I2C_Port2;
if (xf86I2CDevInit(dev)) {
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
W_Buffer[0] = 0x03;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
W_Buffer[1] = R_Buffer[0] & ~0x03;
W_Buffer[1] |= (unsigned char) (pUserSetting->tvFFilter - 1);
break;
case VIA_SAA7108:
W_Buffer[0] = 0x37;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
W_Buffer[1] = R_Buffer[0] & ~0x30;
W_Buffer[1] |= (unsigned char) ((pUserSetting->tvFFilter - 1) << 4);
break;
}
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
xf86DestroyI2CDevRec(dev, TRUE);
pUserSetting->AdaptiveFilterOn = FALSE;
} else {
xf86DestroyI2CDevRec(dev, TRUE);
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
}
}
} else {
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
}
break;
case UT_TV_SETTING_ADAPTIVE_FFILTER:
if (pUTSETTVITEMSTATE.dwState == UT_STATE_OFF) {
if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) {
dev = xf86CreateI2CDevRec();
dev->DevName = "TV";
dev->SlaveAddr = pBIOSInfo->TVI2CAdd;
dev->pI2CBus = pBIOSInfo->I2C_Port2;
if (xf86I2CDevInit(dev)) {
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
pUserSetting->AdaptiveFilterOn = FALSE;
break;
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
W_Buffer[0] = 0x61;
W_Buffer[1] = 0x00;
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
xf86DestroyI2CDevRec(dev, TRUE);
pUserSetting->AdaptiveFilterOn = FALSE;
break;
case VIA_SAA7108:
case VIA_FS454:
case VIA_CH7009:
case VIA_CH7019:
default:
pUserSetting->AdaptiveFilterOn = FALSE;
break;
}
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
} else {
xf86DestroyI2CDevRec(dev, TRUE);
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
}
}
} else if (pUTSETTVITEMSTATE.dwState == UT_STATE_ON) {
if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) {
dev = xf86CreateI2CDevRec();
dev->DevName = "TV";
dev->SlaveAddr = pBIOSInfo->TVI2CAdd;
dev->pI2CBus = pBIOSInfo->I2C_Port2;
if (xf86I2CDevInit(dev)) {
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
pUserSetting->AdaptiveFilterOn = FALSE;
pUserSetting->tvAdaptiveFFilter = 0;
break;
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
W_Buffer[0] = 0x03;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
W_Buffer[1] = R_Buffer[0] & ~0x03;
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
W_Buffer[0] = 0x61;
W_Buffer[1] = (unsigned char) pUserSetting->tvAdaptiveFFilter;
xf86DestroyI2CDevRec(dev, TRUE);
pUserSetting->AdaptiveFilterOn = TRUE;
break;
case VIA_SAA7108:
case VIA_FS454:
case VIA_CH7009:
case VIA_CH7019:
default:
pUserSetting->AdaptiveFilterOn = FALSE;
pUserSetting->tvAdaptiveFFilter = 0;
break;
}
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
} else {
xf86DestroyI2CDevRec(dev, TRUE);
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
}
}
} else {
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
}
break;
case UT_TV_SETTING_DOT_CRAWL:
if (pUTSETTVITEMSTATE.dwState == UT_STATE_OFF || pUTSETTVITEMSTATE.dwState == UT_STATE_DEFAULT) {
pBIOSInfo->TVDotCrawl = FALSE;
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
VIAPreSetTV2Mode(pBIOSInfo);
VIAPostSetTV2Mode(pBIOSInfo);
break;
case VIA_TV3:
case VIA_VT1622A:
VIAPreSetTV3Mode(pBIOSInfo);
VIAPostSetTV3Mode(pBIOSInfo);
break;
case VIA_FS454:
VIAPreSetFS454Mode(pBIOSInfo);
VIAPostSetFS454Mode(pBIOSInfo);
break;
case VIA_CH7009:
case VIA_CH7019:
VIAPreSetCH7019Mode(pBIOSInfo);
VIAPostSetCH7019Mode(pBIOSInfo);
break;
}
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
} else if (pUTSETTVITEMSTATE.dwState == UT_STATE_ON) {
pBIOSInfo->TVDotCrawl = TRUE;
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
VIAPreSetTV2Mode(pBIOSInfo);
VIAPostSetTV2Mode(pBIOSInfo);
break;
case VIA_TV3:
case VIA_VT1622A:
case VIA_VT1623:
VIAPreSetTV3Mode(pBIOSInfo);
VIAPostSetTV3Mode(pBIOSInfo);
break;
case VIA_FS454:
VIAPreSetFS454Mode(pBIOSInfo);
VIAPostSetFS454Mode(pBIOSInfo);
break;
case VIA_CH7009:
case VIA_CH7019:
VIAPreSetCH7019Mode(pBIOSInfo);
VIAPostSetCH7019Mode(pBIOSInfo);
break;
}
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
} else {
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
}
break;
case UT_TV_SETTING_LOCK_ASPECT_RATIO:
if (pUTSETTVITEMSTATE.dwState == UT_STATE_OFF) {
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetNoFunc, sizeof(CARD32));
} else if (pUTSETTVITEMSTATE.dwState == UT_STATE_ON) {
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetNoFunc, sizeof(CARD32));
} else {
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
}
break;
default:
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
break;
}
break;
default:
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
InParam += 4;
ErrorF(" via_utility.c : dwAction not supported\n");
break;
}
break;
case UT_XV_FUNC_GAMMA:
switch (dwAction) {
case UT_ESC_FUNC_GAMMA_GetDeviceSupportState:
if (pScrn->bitsPerPixel == 8)
dwSupportState = UT_DEVICE_NONE;
else
dwSupportState = UT_DEVICE_CRT1 | UT_DEVICE_TV | UT_DEVICE_DFP | UT_DEVICE_LCD;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, &dwSupportState, sizeof(CARD32));
break;
case UT_ESC_FUNC_GAMMA_GetLookUpTable:
if (VIASavePalette(pScrn, pBIOSInfo->colors)) {
for (i = 0; i < 256; i++) {
pUTGAMMAINFO.LookUpTable[i] = ((CARD32) pBIOSInfo->colors[i].red) << 16;
pUTGAMMAINFO.LookUpTable[i] |= ((CARD32) pBIOSInfo->colors[i].green) << 8;
pUTGAMMAINFO.LookUpTable[i] |= (CARD32) pBIOSInfo->colors[i].blue;
}
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, pUTGAMMAINFO.LookUpTable, sizeof(pUTGAMMAINFO.LookUpTable));
} else {
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
}
break;
case UT_ESC_FUNC_GAMMA_SetLookUpTable:
InParam = buf + 12;
memcpy(&pUTGAMMAINFO, (void *) InParam, sizeof(UTGAMMAINFO));
if (pUTGAMMAINFO.LookUpTable[0] == 0xFFFFFFFF) {
for (i = 0; i < 256; i++) {
pBIOSInfo->colors[i].red = i;
pBIOSInfo->colors[i].green = i;
pBIOSInfo->colors[i].blue = i;
}
} else {
for (i = 0; i < 256; i++) {
pBIOSInfo->colors[i].red = (unsigned short) (pUTGAMMAINFO.LookUpTable[i] >> 16);
pBIOSInfo->colors[i].green = (unsigned short) (pUTGAMMAINFO.LookUpTable[i] >> 8) & 0x00FF;
pBIOSInfo->colors[i].blue = (unsigned short) (pUTGAMMAINFO.LookUpTable[i] & 0x000000FF);
}
}
if (VIARestorePalette(pScrn, pBIOSInfo->colors)) {
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
} else {
InParam = buf + 8;
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
}
break;
case UT_ESC_FUNC_GAMMA_GetDefaultLookUpTable:
for (i = 0; i < 256; i++) {
pUTGAMMAINFO.LookUpTable[i] = (CARD32) i << 16;
pUTGAMMAINFO.LookUpTable[i] |= (CARD32) i << 8;
pUTGAMMAINFO.LookUpTable[i] |= (CARD32) i;
}
memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
InParam += 4;
memcpy((void *) InParam, pUTGAMMAINFO.LookUpTable, sizeof(pUTGAMMAINFO.LookUpTable));
break;
default:
memcpy((void *) InParam, &dwUTRetNoFunc, sizeof(CARD32));
InParam += 4;
ErrorF(" via_utility.c : dwAction not supported\n");
break;
}
break;
default:
ErrorF(" via_utility.c : dwFunc not supported\n");
memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
InParam += 4;
break;
}
}
Bool VIAUTGetInfo(VIABIOSInfoPtr pBIOSInfo)
{
VIAUserSettingPtr pUserSetting = pBIOSInfo->UserSetting;
I2CDevPtr dev;
unsigned char W_Buffer[3];
unsigned char R_Buffer[2];
DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAUTGetInfo\n"));
if (pBIOSInfo->TVEncoder) {
dev = xf86CreateI2CDevRec();
dev->DevName = "TV";
dev->SlaveAddr = pBIOSInfo->TVI2CAdd;
dev->pI2CBus = pBIOSInfo->I2C_Port2;
if (xf86I2CDevInit(dev)) {
switch (pBIOSInfo->TVEncoder) {
case VIA_TV2PLUS:
case VIA_TV3:
case VIA_VT1622A:
pUserSetting->tvHPosition = 6;
pUserSetting->tvVPosition = 6;
W_Buffer[0] = 0x03;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
pUserSetting->tvFFilter = (R_Buffer[0] & 0x03) + 1;
W_Buffer[0] = 0x0B;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
pUserSetting->tvBrightness = R_Buffer[0];
W_Buffer[0] = 0x0C;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
pUserSetting->tvContrast = R_Buffer[0];
W_Buffer[0] = 0x0D;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
pUserSetting->tvSaturation = R_Buffer[0] << 8;
W_Buffer[0] = 0x0A;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
pUserSetting->tvSaturation += R_Buffer[0];
break;
case VIA_VT1623:
VIAGPIOI2C_Initial(pBIOSInfo, 0x40);
pUserSetting->tvHPosition = 6;
pUserSetting->tvVPosition = 6;
VIAGPIOI2C_Read(pBIOSInfo, 0x03, R_Buffer, 1);
pUserSetting->tvFFilter = (R_Buffer[0] & 0x03) + 1;
VIAGPIOI2C_Read(pBIOSInfo, 0x0B, R_Buffer, 1);
pUserSetting->tvBrightness = R_Buffer[0];
VIAGPIOI2C_Read(pBIOSInfo, 0x0C, R_Buffer, 1);
pUserSetting->tvContrast = R_Buffer[0];
VIAGPIOI2C_Read(pBIOSInfo, 0x0D, R_Buffer, 1);
pUserSetting->tvSaturation = R_Buffer[0] << 8;
VIAGPIOI2C_Read(pBIOSInfo, 0x0A, R_Buffer, 1);
pUserSetting->tvSaturation += R_Buffer[0];
break;
case VIA_SAA7108:
pUserSetting->tvHPosition = 6;
pUserSetting->tvVPosition = 6;
W_Buffer[0] = 0x37;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
pUserSetting->tvFFilter = ((R_Buffer[0] & 0x30) >> 4) + 1;
pUserSetting->tvBrightness = 0;
pUserSetting->tvContrast = 0;
pUserSetting->tvSaturation = 0;
pUserSetting->tvAdaptiveFFilter = 0;
pUserSetting->tvTint = 0;
pUserSetting->AdaptiveFilterOn = FALSE;
break;
case VIA_CH7009:
case VIA_CH7019:
case VIA_FS454:
default:
pUserSetting->tvHPosition = 0;
pUserSetting->tvVPosition = 0;
pUserSetting->tvFFilter = 0;
pUserSetting->tvBrightness = 0;
pUserSetting->tvContrast = 0;
pUserSetting->tvSaturation = 0;
pUserSetting->tvAdaptiveFFilter = 0;
pUserSetting->tvTint = 0;
pUserSetting->AdaptiveFilterOn = FALSE;
break;
}
if (pBIOSInfo->TVEncoder == VIA_TV2PLUS) {
pUserSetting->tvAdaptiveFFilter = 0;
W_Buffer[0] = 0x10;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
pUserSetting->tvTint = R_Buffer[0];
W_Buffer[0] = 0x11;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
pUserSetting->tvTint += (R_Buffer[0] & 0xE0) << 8;
} else if (pBIOSInfo->TVEncoder == VIA_TV3 || pBIOSInfo->TVEncoder == VIA_VT1622A) {
W_Buffer[0] = 0x61;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
pUserSetting->tvAdaptiveFFilter = R_Buffer[0];
W_Buffer[0] = 0x10;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
pUserSetting->tvTint = R_Buffer[0];
W_Buffer[0] = 0x11;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
pUserSetting->tvTint += (R_Buffer[0] & 0x07) << 8;
if (pUserSetting->tvAdaptiveFFilter && !pUserSetting->tvFFilter)
pUserSetting->AdaptiveFilterOn = TRUE;
else
pUserSetting->AdaptiveFilterOn = FALSE;
} else if (pBIOSInfo->TVEncoder == VIA_VT1623) {
VIAGPIOI2C_Read(pBIOSInfo, 0x61, R_Buffer, 1);
pUserSetting->tvAdaptiveFFilter = R_Buffer[0];
VIAGPIOI2C_Read(pBIOSInfo, 0x10, R_Buffer, 1);
pUserSetting->tvTint = R_Buffer[0];
VIAGPIOI2C_Read(pBIOSInfo, 0x11, R_Buffer, 1);
pUserSetting->tvTint += (R_Buffer[0] & 0x07) << 8;
if (pUserSetting->tvAdaptiveFFilter && !pUserSetting->tvFFilter)
pUserSetting->AdaptiveFilterOn = TRUE;
else
pUserSetting->AdaptiveFilterOn = FALSE;
}
xf86DestroyI2CDevRec(dev, TRUE);
pUserSetting->DefaultSetting = TRUE;
} else {
xf86DestroyI2CDevRec(dev, TRUE);
DEBUG(xf86Msg(X_DEFAULT, "DevInit fail!\n"));
}
} else
DEBUG(xf86Msg(X_DEFAULT, "No TVEncoder Exist!\n"));
return TRUE;
}
Bool VIARestoreUserSetting(VIABIOSInfoPtr pBIOSInfo)
{
VIAUserSettingPtr pUserSetting = pBIOSInfo->UserSetting;
I2CDevPtr dev;
int i, HPos, VPos, ADWHS, ADWHE;
unsigned char W_Buffer[4], R_Buffer[3];
dev = xf86CreateI2CDevRec();
dev->DevName = "TV";
dev->SlaveAddr = pBIOSInfo->TVI2CAdd;
dev->pI2CBus = pBIOSInfo->I2C_Port2;
if (xf86I2CDevInit(dev)) {
switch (pBIOSInfo->TVEncoder) {
case VIA_TV3:
case VIA_VT1622A:
if ((pUserSetting->tvHPosition != 6)
|| (pUserSetting->tvVPosition != 6)) {
W_Buffer[0] = 0x08;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 2);
HPos = R_Buffer[0];
VPos = R_Buffer[1];
W_Buffer[0] = 0x1C;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
HPos |= (R_Buffer[0] & 0x04) << 6;
VPos |= (R_Buffer[0] & 0x02) << 7;
HPos += pUserSetting->tvHPosition - 6;
VPos += pUserSetting->tvVPosition - 6;
W_Buffer[0] = 0x08;
W_Buffer[1] = (unsigned char) (HPos & 0xFF);
W_Buffer[2] = (unsigned char) (VPos & 0xFF);
xf86I2CWriteRead(dev, W_Buffer, 3, NULL, 0);
W_Buffer[1] = R_Buffer[0] & ~0x06;
W_Buffer[1] |= (unsigned char) ((HPos >> 6) & 0x04);
W_Buffer[1] |= (unsigned char) ((VPos >> 7) & 0x02);
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
}
W_Buffer[0] = 0x03;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
if (pUserSetting->AdaptiveFilterOn) {
W_Buffer[1] = R_Buffer[0] & ~0x03;
} else {
W_Buffer[1] = R_Buffer[0] & ~0x03;
W_Buffer[1] |= (unsigned char) (pUserSetting->tvFFilter - 1);
}
xf86I2CWriteRead(dev, W_Buffer, 2, R_Buffer, 0);
W_Buffer[0] = 0x61;
W_Buffer[1] = (unsigned char) pUserSetting->tvAdaptiveFFilter;
xf86I2CWriteRead(dev, W_Buffer, 2, R_Buffer, 0);
W_Buffer[0] = 0x0B;
W_Buffer[1] = (unsigned char) pUserSetting->tvBrightness;
xf86I2CWriteRead(dev, W_Buffer, 2, R_Buffer, 0);
W_Buffer[0] = 0x0C;
W_Buffer[1] = (unsigned char) pUserSetting->tvContrast;
xf86I2CWriteRead(dev, W_Buffer, 2, R_Buffer, 0);
W_Buffer[0] = 0x0D;
W_Buffer[1] = (unsigned char) (pUserSetting->tvSaturation >> 8);
xf86I2CWriteRead(dev, W_Buffer, 2, R_Buffer, 0);
W_Buffer[0] = 0x0A;
W_Buffer[1] = (unsigned char) pUserSetting->tvSaturation & 0xFF;
xf86I2CWriteRead(dev, W_Buffer, 2, R_Buffer, 0);
W_Buffer[0] = 0x11;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
W_Buffer[2] = R_Buffer[0] & ~0xE0;
W_Buffer[2] |= (unsigned char) (pUserSetting->tvTint >> 8);
W_Buffer[0] = 0x10;
W_Buffer[1] = (unsigned char) pUserSetting->tvTint & 0xFF;
xf86I2CWriteRead(dev, W_Buffer, 3, R_Buffer, 0);
break;
case VIA_SAA7108:
if ((pUserSetting->tvHPosition - 6) != 0) {
W_Buffer[0] = 0x70;
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 3);
ADWHS = (R_Buffer[0] | ((R_Buffer[2] & 0x07) << 8))
+ (pUserSetting->tvHPosition - 6);
ADWHE = (R_Buffer[1] | ((R_Buffer[2] & 0x70) << 4))
+ (pUserSetting->tvHPosition - 6);
W_Buffer[0] = 0x70;
W_Buffer[1] = ADWHS & 0xFF;
W_Buffer[2] = ADWHE & 0xFF;
W_Buffer[3] = (R_Buffer[2] & ~0x77) | ((ADWHS & 0x700) >> 8)
| ((ADWHE & 0x700) >> 4);
xf86I2CWriteRead(dev, W_Buffer, 4, NULL, 0);
}
for (i = 0; i < 3; i++) {
W_Buffer[0] = VIASAA7108PostionOffset[i];
if (pBIOSInfo->TVVScan == VIA_TVNORMAL)
W_Buffer[1] = VIASAA7108PostionNormalTabRec[pBIOSInfo->TVType - 1][pBIOSInfo->resTVMode][pUserSetting->tvVPosition][i];
else
W_Buffer[1] = VIASAA7108PostionOverTabRec[pBIOSInfo->TVType - 1][pBIOSInfo->resTVMode][pUserSetting->tvVPosition][i];
xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
}
W_Buffer[0] = 0x37;
W_Buffer[1] = R_Buffer[0] & ~0x30;
if (!pUserSetting->AdaptiveFilterOn) {
W_Buffer[1] |= (unsigned char) ((pUserSetting->tvFFilter - 1) << 4);
}
xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
break;
case VIA_VT1623:
case VIA_CH7009:
case VIA_CH7019:
case VIA_FS454:
default:
break;
}
xf86DestroyI2CDevRec(dev, TRUE);
return TRUE;
} else {
xf86DestroyI2CDevRec(dev, TRUE);
return FALSE;
}
}