www.pudn.com > H265+_C64X_2008.8.rar > saa7105.c
/* * Copyright 2003 by Texas Instruments Incorporated. * All rights reserved. Property of Texas Instruments Incorporated. * Restricted rights to use, duplicate or disclose this code are * granted through contract. * */ /* "@(#) DDK 1.10.00.23 07-02-03 (ddk-b12)" */ /********************************************************************************/ /* saa7105edc.c file */ /********************************************************************************/ #include#include #include #include #include #include "_iic.h" #include "_saa7105.h" /* local functions declaration */ static void clearHDSyncEngine(void); static void configSAA7105(SAA7105_Mode videoMode, Bool slaveModeEnable, SAA7105_AnalogFormat outMode, SAA7105_InputFormat inFormat, Bool enableBT656Sync); static void enableColorBars(Bool enable); static void enableSlaveMode(Bool enable); static void initSAA7105Def(void); static void loadCursor(SAA7105_Cursor* cursorTable); static void loadHDSyncEngine(Uns mode); static void powerdownSAA7105(Bool powerDownEnable); static void resetSAA7105(void); static void setOutputMode(SAA7105_AnalogFormat outMode); static void setSAA7105SyncMode(SAA7105_Mode displayType,Bool enableBT656Sync); static void setVideoDisplay(SAA7105_Mode displayType, SAA7105_AnalogFormat outMode, SAA7105_InputFormat inFormat, Bool enableBT656Sync); static void startHDSyncEngine(SAA7105_Mode displayType); static Int SAA7105_close(EDC_Handle handle); static Int SAA7105_ctrl(EDC_Handle handle, SAA7105_Cmd cmd, Arg param); static EDC_Handle SAA7105_open(String devName, Arg optArg); EDC_Fxns SAA7105_Fxns = { SAA7105_open, SAA7105_close, SAA7105_ctrl }; /* local variables and arrays */ static I2C_Handle hI2C = INV; static const Int outputModeTbl[3][5] = { {1, 1, 0, 0, 1}, {0, 0, 0, 0, 0}, {0, 1, 1, 1, 0} }; static const Int modeTbl[8][9] = { /* NTSC */{248, 14, 1715, 720, 242, SAA7105_IFMT_YCBCR422_INTERLACED, 0, 0, 0x20}, /* PAL */{232, 19, 1727, 720, 290, SAA7105_IFMT_YCBCR422_INTERLACED, 0, 0, 0x20}, /*VGA */{64, 33, 799, 640, 480, SAA7105_IFMT_RGB565, 0xc3, 0xd4, 0x1d}, /*SVGA */{64, 23, 1055, 800, 600, SAA7105_IFMT_RGB565, 0x4b, 0x68, 0x2f}, /* XGA */{64, 29, 1343, 1024, 768, SAA7105_IFMT_RGB565, 0x7b, 0x09, 0x4d}, /*HD480P */{64, 30, 857, 720, 480, SAA7105_IFMT_YCBCR422_NONEINTERLACED, 0, 0, 0x20}, /*HD720P */{64, 20, 1643, 1280, 720, SAA7105_IFMT_YCBCR422_NONEINTERLACED, 0, 0, 0x58}, /*HD1080I*/{64, 10, 2193, 1920, 540, SAA7105_IFMT_YCBCR422_NONEINTERLACED, 0, 0, 0x58} }; /* * ======== clearHDSyncEngine ======== */ static void clearHDSyncEngine(void) { Uint8 *charPtr; _SAA7105_hdSyncGen0.lcAddress = 0; charPtr = (Uint8 *)&_SAA7105_hdSyncGen0.lcAddress + 3; _IIC_write(hI2C, _SAA7105_IICADDR,0xD0,charPtr,31); _SAA7105_hdSyncGen0.ltAddress = 0; charPtr = (Uint8 *)&_SAA7105_hdSyncGen0.ltAddress + 3; _IIC_write(hI2C, _SAA7105_IICADDR,0xD1,charPtr,61); _SAA7105_hdSyncGen0.lpAddress = 0; charPtr = (Uint8 *)&_SAA7105_hdSyncGen0.lpAddress + 3; _IIC_write(hI2C, _SAA7105_IICADDR,0xD2,charPtr,57); _SAA7105_hdSyncGen0.svAddress = 0; charPtr = (Uint8 *)&_SAA7105_hdSyncGen0.svAddress + 3; _IIC_write(hI2C, _SAA7105_IICADDR,0xD3,charPtr,17); return; } /* * ======== configSAA7105 ======== */ static void configSAA7105(SAA7105_Mode videoMode, Bool slaveModeEnable, SAA7105_AnalogFormat outMode, SAA7105_InputFormat inFormat, Bool enableBT656Sync) { /***************************************************************/ /* Enable master/slave mode */ /***************************************************************/ enableSlaveMode(slaveModeEnable); initSAA7105Def(); loadCursor(NULL); enableColorBars(FALSE); setVideoDisplay(videoMode, outMode, inFormat, enableBT656Sync); } /* * ======== enableColorBars ======== */ static void enableColorBars(Bool enable) { _SAA7105_Regs *regPtr; Uint8 *charPtr; regPtr = &_SAA7105_settingsDef; regPtr->colorBarsEnable = enable; charPtr = (Uint8 *)&_SAA7105_settingsDef; _IIC_write(hI2C, _SAA7105_IICADDR,0x3A,&charPtr[0x3A],1); return; } /* * ======== enableSlaveMode ======== */ static void enableSlaveMode(Bool enable) { _SAA7105_Regs *regPtr; Uint8 *charPtr; regPtr = &_SAA7105_settingsDef; if(!enable){ regPtr->masterSlaveMode = FALSE; regPtr->vSyncOutput = TRUE; regPtr->hSyncOutput = TRUE; regPtr->fieldOutput = TRUE; regPtr->bypassInputFIFO = FALSE; }else{ regPtr->masterSlaveMode = TRUE; regPtr->vSyncOutput = FALSE; regPtr->hSyncOutput = FALSE; regPtr->fieldOutput = FALSE; regPtr->bypassInputFIFO = TRUE; } charPtr = (Uint8 *)&_SAA7105_settingsDef; _IIC_write(hI2C, _SAA7105_IICADDR,0x96,&charPtr[0x96],2); _IIC_write(hI2C, _SAA7105_IICADDR,0x84,&charPtr[0x84],1); return; } /* * ======== initSAA7105Def ======== * initialize the SAA7105 in default setup */ static void initSAA7105Def(void) { Uint8 *charPtr,subAddress; /***************************************************************/ /* Load registers from ROM to RAM */ /***************************************************************/ charPtr = (Uint8 *)&_SAA7105_settingsDef; subAddress = 0xD0; _IIC_write(hI2C, _SAA7105_IICADDR,subAddress,&charPtr[subAddress],13); subAddress = 0xF0; _IIC_write(hI2C, _SAA7105_IICADDR,subAddress,&charPtr[subAddress],14); return; } /* * ======== loadCursor ======== * load Hardware cursor */ static void loadCursor(SAA7105_Cursor* cursorTable) { Uns i; /***************************************************************/ /* Load Hardware Cursor Bit Map with transparency */ /***************************************************************/ if(cursorTable == NULL){ cursorTable = &_SAA7105_cursorData; cursorTable->address = 0; for(i = 0; i < 256; i ++){ cursorTable->cursorBlock[i] = 0xAA; } } _IIC_write(hI2C, _SAA7105_IICADDR,0xFE, (void *)cursorTable,256+1); return; } /* * ======== loadHDSyncEngine ======== */ static void loadHDSyncEngine(Uns mode) { _SAA7105_HDSyncGen *ptrHDSyncGen; Uint8 *charPtr; switch(mode) { case SAA7105_MODE_HD480P60F: ptrHDSyncGen = &_SAA7105_hdSyncGen480P; break; case SAA7105_MODE_HD720P60F: ptrHDSyncGen = &_SAA7105_hdSyncGen720P; break; case SAA7105_MODE_HD1080I30F: ptrHDSyncGen = &_SAA7105_hdSyncGen1080I; break; case SAA7105_MODE_VGA: ptrHDSyncGen = &_SAA7105_hdSyncGenVGA; break; case SAA7105_MODE_SVGA: ptrHDSyncGen = &_SAA7105_hdSyncGenSVGA; break; case SAA7105_MODE_XGA: ptrHDSyncGen = &_SAA7105_hdSyncGenXGA; break; default: break; } ptrHDSyncGen->lcAddress = 0; charPtr = (Uint8 *)&ptrHDSyncGen->lcAddress + 3; _IIC_write(hI2C, _SAA7105_IICADDR,0xD0,charPtr,31); ptrHDSyncGen->lpAddress = 0; charPtr = (Uint8 *)&ptrHDSyncGen->lpAddress + 3; _IIC_write(hI2C, _SAA7105_IICADDR,0xD2,charPtr,57); ptrHDSyncGen->ltAddress = 0; charPtr = (Uint8 *)&ptrHDSyncGen->ltAddress + 3; _IIC_write(hI2C, _SAA7105_IICADDR,0xD1,charPtr,61); ptrHDSyncGen->svAddress = 0; charPtr = (Uint8 *)&ptrHDSyncGen->svAddress + 3; _IIC_write(hI2C, _SAA7105_IICADDR,0xD3,charPtr,17); } /* * ======== powerdownSAA7105 ======== */ static void powerdownSAA7105(Bool powerDownEnable) { Uint8 *charPtr = (Uint8 *)&_SAA7105_settingsDef; /*Put _SAA7105 in power down mode */ _SAA7105_settingsDef.downA = powerDownEnable; _SAA7105_settingsDef.downD = powerDownEnable; _IIC_write(hI2C, _SAA7105_IICADDR,0x61,&charPtr[0x61],1); } /* * ======== resetSAA7105 ======== */ static void resetSAA7105(void) { /***************************************************************/ /* power-up SAA7105 */ /***************************************************************/ powerdownSAA7105(FALSE); return; } /* * ======== setOutputMode ======== */ static void setOutputMode(SAA7105_AnalogFormat outMode) { _SAA7105_Regs *regPtr; Uint8 *charPtr; regPtr = &_SAA7105_settingsDef; regPtr->vbsEn = outputModeTbl[outMode][0]; regPtr->cvbsEn0 = outputModeTbl[outMode][1]; regPtr->cvbsEn1 = outputModeTbl[outMode][2]; regPtr->cvbsEn2 = outputModeTbl[outMode][3]; regPtr->cEn = outputModeTbl[outMode][4]; charPtr = (Uint8 *)&_SAA7105_settingsDef; _IIC_write(hI2C, _SAA7105_IICADDR,0x2D,&charPtr[0x2D],1); return; } /* * ======== setSAA7105SyncMode ======== */ static void setSAA7105SyncMode(SAA7105_Mode displayType,Bool enableBT656Sync) { Uint8 *charPtr = (Uint8 *)&_SAA7105_settingsDef; if(enableBT656Sync) { _SAA7105_settingsDef.syncVia656 = 1; if(displayType == SAA7105_MODE_PAL720) { //_SAA7105_settingsDef.hTriggerMSBs = 0; //_SAA7105_settingsDef.hTrigger = 235; } else { // _SAA7105_settingsDef.hTriggerMSBs = 0; // _SAA7105_settingsDef.hTrigger = 235; } _SAA7105_settingsDef.xOfs = 0; _SAA7105_settingsDef.xOfsMsb = 0; }else { _SAA7105_settingsDef.syncVia656 = 0; } _IIC_write(hI2C, _SAA7105_IICADDR,0x3A,&charPtr[0x3A],1); _IIC_write(hI2C, _SAA7105_IICADDR,0x99,&charPtr[0x99],1); _IIC_write(hI2C, _SAA7105_IICADDR,0x90,&charPtr[0x90],1); _IIC_write(hI2C, _SAA7105_IICADDR,0x94,&charPtr[0x94],1); _IIC_write(hI2C, _SAA7105_IICADDR,0x6C,&charPtr[0x6C],1); _IIC_write(hI2C, _SAA7105_IICADDR,0x6D,&charPtr[0x6D],1); } /* * ======== setVideoDisplay ======== */ static void setVideoDisplay(SAA7105_Mode displayType, SAA7105_AnalogFormat outMode, SAA7105_InputFormat inFormat, Bool enableBT656Sync) { Uint8 *charPtr; Uns activePixels,activeLines; Uns hLen; Uns hStart,hEnd,fal, lal; volatile _SAA7105_Regs *regPtr = (_SAA7105_Regs *)&_SAA7105_settingsDef; Uns yOffset; Uns xOffset; Uns yInc = 0; Uns ySkip = 0; Uns yIWGTO = 100; Uns yIWGTE = 100; Uns xInc = 0; hStart = 272; xOffset = modeTbl[displayType][0]; yOffset = modeTbl[displayType][1]; hLen = modeTbl[displayType][2];; activePixels = modeTbl[displayType][3]; activeLines = modeTbl[displayType][4]; regPtr->inputFormat = modeTbl[displayType][5]; regPtr->pixClock0 = modeTbl[displayType][6]; regPtr->pixClock1 = modeTbl[displayType][7]; regPtr->pixClock2 = modeTbl[displayType][8]; regPtr->chromaBinary = 1; regPtr->compSyncEnable = 0; regPtr->encOff = 1; regPtr->idel = 1; fal = 18; if(regPtr->inputFormat == SAA7105_IFMT_YCBCR422_NONEINTERLACED) { /* 54MHz input clock (input mode 3) */ xInc = 0; regPtr->edge = 0; regPtr->slot = 1; } else if(regPtr->inputFormat == SAA7105_IFMT_YCBCR422_INTERLACED){ /* 27MHz input clock (input mode 4) */ xInc = 2048; regPtr->edge = 1; regPtr->slot = 0; regPtr->encOff = 0; regPtr->idel = 3; regPtr->compSyncEnable = 0; } else if(regPtr->inputFormat == SAA7105_IFMT_RGB565) { xInc = 0; regPtr->edge = 1; regPtr->slot = 1; regPtr->chromaBinary = 0; } if(displayType == SAA7105_MODE_PAL720) { regPtr->palEnable = 1; regPtr->fise = 0; regPtr->burstStart = 0x21; regPtr->burstEnd = 0x1d; regPtr->chromaPhase = 0x6b; regPtr->burstAmplitude = 0x2d; regPtr->subCarrier0 = 0xCB; regPtr->subCarrier1 = 0x8A; regPtr->subCarrier2 = 0x09; regPtr->subCarrier3 = 0x2A; regPtr->hTriggerMSBs = 0; regPtr->hTrigger = 2; if(enableBT656Sync) { hStart = 280; xOffset = 0; regPtr->syncVia656 = 1; fal = 21; regPtr->vTrigger = 0; } else { hStart = 284; regPtr->syncVia656 = 0; fal = 21; regPtr->vTrigger = 2; } regPtr->lumaDelay = 0; regPtr->cbGain = 0x7b; regPtr->crGain = 0xAe; } else if(displayType == SAA7105_MODE_NTSC720){ regPtr->hTriggerMSBs = 0; regPtr->hTrigger = 2; if(enableBT656Sync) { regPtr->vTrigNegative = 1; regPtr->vTrigger = 4; fal = 13; activeLines += 3; xOffset = 0; regPtr->syncVia656 = 1; } else { regPtr->vTrigNegative = 0; regPtr->vTrigger = 0; fal = 17; regPtr->syncVia656 = 0; } regPtr->lumaDelay = 0; regPtr->chromaPhase = 0x33; regPtr->burstAmplitude = 0x3F; regPtr->subCarrier0 = 0x1F; regPtr->subCarrier1 = 0x7C; regPtr->subCarrier2 = 0xF0; regPtr->subCarrier3 = 0x21; regPtr->cbGain = 0x7b; regPtr->crGain = 0xAe; } regPtr->hLen = hLen; regPtr->hLenMsb = hLen >> 8; regPtr->xInc = xInc; regPtr->xIncMsb = xInc >> 8; regPtr->yInc = yInc; regPtr->yIncMsb = yInc >> 8; regPtr->yIWGTO = yIWGTO; regPtr->yIWGTOMsb = yIWGTO >> 8; regPtr->yIWGTE = yIWGTE; regPtr->yIWGTEMsb = yIWGTE >> 8; regPtr->ySkip = ySkip; regPtr->ySkipMsb = ySkip >> 8; hEnd = hStart + (2 * activePixels); regPtr->hStart = hStart; regPtr->hEnd = hEnd; regPtr->hStartMSB = hStart >> 8; regPtr->hEndMSB = hEnd >> 8; if(regPtr->inputFormat != SAA7105_IFMT_YCBCR422_INTERLACED){ activePixels /= 2; } regPtr->xPix = activePixels; regPtr->xPixMsb = activePixels >> 8; regPtr->yPix = activeLines; regPtr->yPixMsb = activeLines >> 8; lal = fal + activeLines; regPtr->fal = fal; regPtr->falMsb = fal >> 8; regPtr->lal = lal; regPtr->lalMsb = lal >> 8; regPtr->xOfs = xOffset; regPtr->xOfsMsb = xOffset >> 8; regPtr->yOfsOdd = yOffset; regPtr->yOfsOddMsb = yOffset >> 8; regPtr->yOfsEven = yOffset; regPtr->yOfsEvenMsb = yOffset >> 8; charPtr = (Uint8 *)&_SAA7105_settingsDef; _IIC_write(hI2C, _SAA7105_IICADDR,1,&charPtr[1],0xA3); _IIC_write(hI2C, _SAA7105_IICADDR,0xfd,&charPtr[0xfd],1); if(displayType >= SAA7105_MODE_VGA){ clearHDSyncEngine(); loadHDSyncEngine(displayType); startHDSyncEngine(displayType); setOutputMode(SAA7105_AFMT_RGB); /* reset the OSD_FPGA and configure it in approciate mode */ *(volatile Uint8 *)(0x90080010) = 0x20; // 16-bit mode }else{ setOutputMode(outMode); /* reset the OSD_FPGA and configure it in approciate mode */ *(volatile Uint8 *)(0x90080010) = 0x28; // 8-bit mode } *(volatile Uint8 *)(0x90080010) &= ~0x20; // un-reset OSD FPGA */ while(!(*(volatile Uint8 *)(0x90080013) & 0x40)); } /* * ======== startHDSyncEngine ======== */ static void startHDSyncEngine(SAA7105_Mode displayType) { _SAA7105_Regs *regPtr; Uint8 *charPtr; regPtr = &_SAA7105_settingsDef; regPtr->hdRGB_YCbCr = 0; regPtr->hdFullGain = 1; regPtr->hdTriggerPhaseY = 0; switch(displayType) { case SAA7105_MODE_VGA: regPtr->hdLineCounter = 2; regPtr->hdTriggerPhaseX = 12; break; case SAA7105_MODE_SVGA: regPtr->hdLineCounter = 4; regPtr->hdTriggerPhaseX = 12; break; case SAA7105_MODE_XGA: regPtr->hdLineCounter = 6; regPtr->hdTriggerPhaseX = 12; break; case SAA7105_MODE_HD1080I30F: regPtr->hdLineCounter = 2; regPtr->hdTriggerPhaseX = 0; regPtr->hdRGB_YCbCr = 1; regPtr->hdFullGain = 0; regPtr->hdTriggerPhaseY = 95; break; case SAA7105_MODE_HD480P60F: regPtr->hdLineCounter = 2; regPtr->hdTriggerPhaseX = 5; regPtr->hdRGB_YCbCr = 1; regPtr->hdFullGain = 0; regPtr->hdTriggerPhaseY = 0; break; case SAA7105_MODE_HD720P60F: regPtr->hdLineCounter = 2; regPtr->hdTriggerPhaseX = 15; regPtr->hdRGB_YCbCr = 1; regPtr->hdFullGain = 0; regPtr->hdTriggerPhaseY = 0; break; default: regPtr->hdLineCounter = 2; regPtr->hdTriggerPhaseX = 5; regPtr->hdRGB_YCbCr = 1; regPtr->hdFullGain = 0; regPtr->hdTriggerPhaseY = 0; break; } regPtr->hdLineTypePtr = 0; regPtr->hdLinePatternPtr = 0; regPtr->hdDurationCtr = 0; regPtr->hdEventTypePtr = 0; regPtr->hdColorInterpolator = 1; regPtr->hdActive = 1; charPtr = (Uint8 *)&_SAA7105_settingsDef; _IIC_write(hI2C, _SAA7105_IICADDR,0xD4,&charPtr[0xD4],9); return; } /* * ======== SAA7105_close ======== */ static Int SAA7105_close(EDC_Handle handle) { Int devId = (Int)handle; /*First Check if the Handle is correct */ if(devId == _SAA7105_IICADDR) { /*Put _SAA7105 in power down mode */ powerdownSAA7105(TRUE); return EDC_SUCCESS; } else return EDC_FAILED; } /* * ======== SAA7105_ctrl ======== */ static Int SAA7105_ctrl(EDC_Handle handle, SAA7105_Cmd cmd, Arg param) { Int devId = (Int)handle; /*First Check if the Handle is correct */ if(devId != _SAA7105_IICADDR){ return EDC_FAILED; } switch(cmd) { case EDC_CONFIG: { SAA7105_ConfParams *saa7105Params = (SAA7105_ConfParams *)param; hI2C = saa7105Params->hI2C; configSAA7105(saa7105Params->mode, saa7105Params->enableSlaveMode, saa7105Params->aFmt, saa7105Params->iFmt, saa7105Params->enableBT656Sync); setSAA7105SyncMode(saa7105Params->mode, saa7105Params->enableBT656Sync); } break; case EDC_RESET: resetSAA7105(); break; case SAA7105_POWERDOWN: powerdownSAA7105(TRUE); break; case SAA7105_POWERUP: powerdownSAA7105(FALSE); break; case SAA7105_ENABLE_SLAVE_MODE: enableSlaveMode((Bool)param); break; case SAA7105_ENABLE_COLORBAR: enableColorBars((Bool)param); break; case SAA7105_LOAD_CURSOR:/* load hardware cursor */ break; case SAA7105_LOAD_LUT: /* load look-up table */ break; } return EDC_SUCCESS; } /* * ======== SAA7105_open ======== */ static EDC_Handle SAA7105_open(String devName, Arg optArg) { return (EDC_Handle)_SAA7105_IICADDR; } /**************************************************************************/ /* End of file */ /**************************************************************************/