📄 saa7113.c
字号:
case 3: /* NTSC N */ *std = vasNTSC; break; case 4: /* PAL 4.43 */ *std = vasPAL; break; default: *std = vasNone; /* should not come here */ break; } /* end of switch */ } else { /* 50Hz */ switch (i) { case 0: /* PAL BGHI */ *std = vasPAL; break; case 1: /* NTSC 4.43 */ *std = vasNTSC; break; case 2: /* PAL N */ *std = vasPAL; break; case 3: /* PAL M */ *std = vasPAL; break; case 4: /* SECAM */ *std = vasSECAM; break; default: *std = vasNone; /* should not come here */ break; } /* end of switch */ } notDetected = False; } } /* end of i for loop */ } /* end of j for loop */ if (stat & A_HLCK) { /* not in sync err, message may be obscure */ return BOARD_ERR_VAL_OUT_OF_RANGE; } if (notDetected) { return BOARD_ERR_COLOR_STANDARD_NOT_DETECTED; } /* Store detected standard in internal variable */ pVD->curVideoStandard = *std; return TMLIBDEV_OK;}tmLibdevErr_tsaa7113GetStandard(tmVideoAnalogStandard_t * std){ return saa7113GetStandardM (&defaultVD[0], std);}tmLibdevErr_t saa7113GetAdapterVideoStandard(pboardVIDec_t pVD, tmVideoAnalogAdapter_t adapter, UInt adapterNum, tmVideoAnalogStandard_t *std){ UInt inputMode; /* Build up fake param structure to use available map function */ boardVIParam_t param; param.adapterInstance = adapterNum; param.adapterType = adapter; /* Map the adapter's instance to a valid mode */ if (mapAdapterInput (pVD, ¶m, &inputMode) != TMLIBDEV_OK) return BOARD_ERR_INVALID_ADAPTER_INSTANCE; /* Set input of video accordingly */ saa7113SetAnalogInput (pVD, inputMode); return saa7113GetStandardM (pVD, std);}/******************************************************************************/tmLibdevErr_t saa7113ConfigureM(pboardVIDec_t pVD, UInt32 subaddr, UInt32 value){ tmLibdevErr_t rval = TMLIBDEV_OK; rval |= iicWriteReg(pVD->slaveAddr, subaddr, value); return (tmLibdevErr_t) rval;}tmLibdevErr_t saa7113Configure(UInt32 subaddr, UInt32 value){ return saa7113ConfigureM(&defaultVD[0], subaddr, value);}/******************************************************************************/extern tmLibdevErr_tsaa7113GetBrightnessM(pboardVIDec_t pVD, UInt * val){ return iicReadReg(pVD->slaveAddr, LuminanceBrightness, val);}extern tmLibdevErr_tsaa7113GetBrightness(UInt * val){ return saa7113GetBrightnessM(&defaultVD[0], val);}/******************************************************************************/extern tmLibdevErr_tsaa7113SetBrightnessM(pboardVIDec_t pVD, UInt val){ if (val > 255) return BOARD_ERR_VAL_OUT_OF_RANGE; return iicWriteReg(pVD->slaveAddr, LuminanceBrightness, val);}extern tmLibdevErr_tsaa7113SetBrightness(UInt val){ return saa7113SetBrightnessM(&defaultVD[0], val);}/******************************************************************************/extern tmLibdevErr_tsaa7113GetContrastM(pboardVIDec_t pVD, UInt * val){ return iicReadReg(pVD->slaveAddr, LuminanceContrast, val);}extern tmLibdevErr_tsaa7113GetContrast(UInt * val){ return saa7113GetContrastM(&defaultVD[0], val);}/******************************************************************************/extern tmLibdevErr_tsaa7113SetContrastM(pboardVIDec_t pVD, UInt val){ if (val > 127) return BOARD_ERR_VAL_OUT_OF_RANGE; return iicWriteReg(pVD->slaveAddr, LuminanceContrast, val);}extern tmLibdevErr_tsaa7113SetContrast(UInt val){ return saa7113SetContrastM(&defaultVD[0], val);}/******************************************************************************/extern tmLibdevErr_tsaa7113GetSaturationM(pboardVIDec_t pVD, UInt * val){ return iicReadReg(pVD->slaveAddr, ChromaSaturation, val);}extern tmLibdevErr_tsaa7113GetSaturation(UInt * val){ return saa7113GetSaturationM(&defaultVD[0], val);}/******************************************************************************/extern tmLibdevErr_tsaa7113SetSaturationM(pboardVIDec_t pVD, UInt val){ if (val > 127) return BOARD_ERR_VAL_OUT_OF_RANGE; return iicWriteReg(pVD->slaveAddr, ChromaSaturation, val);}extern tmLibdevErr_tsaa7113SetSaturation(UInt val){ return saa7113SetSaturationM(&defaultVD[0], val);}/******************************************************************************/extern tmLibdevErr_tsaa7113GetHueM(pboardVIDec_t pVD, UInt * val){ return iicReadReg(pVD->slaveAddr, ChromaHueControl, val);}extern tmLibdevErr_tsaa7113GetHue(UInt * val){ return saa7113GetHueM(&defaultVD[0], val);}/******************************************************************************/extern tmLibdevErr_tsaa7113SetHueM(pboardVIDec_t pVD, UInt val){ if (val > 255) return BOARD_ERR_VAL_OUT_OF_RANGE; return iicWriteReg(pVD->slaveAddr, ChromaHueControl, val);}extern tmLibdevErr_tsaa7113SetHue(UInt val){ return saa7113SetHueM(&defaultVD[0], val);}/******************************************************************************//* Helper functions for video decoder HAL functionality */static Bool /* Successful or not */SetReg( /* Set a register value */ pboardVIDec_t pVD, /* Pointer to I2C access structure */ UInt8 bReg, /* Subaddress of the register */ UInt8 bData) /* Value to be written */{ lastI2cError = 0; return ((lastI2cError = iicWriteReg(pVD->slaveAddr, bReg, bData)) == TMLIBDEV_OK);}static Bool /* Successful or not */GetReg( /* Get a register value */ pboardVIDec_t pVD, /* Pointer to I2C access structure */ UInt8 bReg, /* Subaddress of the register */ UInt8 * pbData) /* Pointer to variable to recieve value */{ UInt data; Bool retVal; lastI2cError = 0; if (retVal = ((lastI2cError = iicReadReg (pVD->slaveAddr, bReg, &data)) == TMLIBDEV_OK)) *pbData = data; else *pbData = 0; return retVal;}/********************************************************************************************/extern tmLibdevErr_tsaa7113GetVSyncFallingEdge(pboardVIDec_t pVD, UInt *lineNumber){ tmVideoAnalogStandard_t std; tmLibdevErr_t rval; /* Equivalent to Video DecHAL VideoDecGetDefaultAcquisitionWnd */ switch (pVD->curVideoStandard) { case vasNTSC: /* First line seen by TM */ *lineNumber = 20; break; case vasPAL: *lineNumber = 23; break; default: return BOARD_ERR_COLOR_STANDARD_NOT_DETECTED; } return TMLIBDEV_OK;}/* Get a byte number index from planar buffer */static UInt8 GetDataByte(UInt8 *Y, UInt8 *U, UInt8 *V, UInt8 index){ if (index & 0x1) return Y [index >> 1]; else if (index & 0x2) return V [index >> 2]; else return U [index >> 2];} extern tmLibdevErr_tsaa7113GetSlicedData(pboardVIDec_t pVD, UInt8 *Y, UInt8 *U, UInt8 *V, tmVideoDataService_t service, UInt size, UInt8 *data, UInt8 *dataSize){ UInt index = 0; UInt bytesToFind; UInt byteNr; /* - Search video buffer for sliced data */ /* - Extract and copy sliced data from planar buffers into output buffer */ /* - Code not optimized for performance */ /* Assume no data will be found */ *dataSize = 0; /* First implementation does support Closed Caption, only */ switch (service) { case vdsUSClosedCaption: case vdsEuroClosedCaption: bytesToFind = 2; break; case vdsVPS: case vdsJapFormatSwitch: bytesToFind = 26; break; case vdsWSS: bytesToFind = 14; break; case vdsTeleText: case vdsEuroTeleText: bytesToFind = 42; break; case vdsUSNABTS: bytesToFind = 33; break; case vdsUSTeleText: bytesToFind = 34; break; case vdsVITC_EBU: case vdsVITC_SMPTE: bytesToFind = 11; break; case vdsMoji: bytesToFind = 35; break; default: // Not supported, yet return BOARD_ERR_VAL_OUT_OF_RANGE; } /* Search for data header 0x53 */ while (GetDataByte(Y, U, V, index++) != 0x53) if (index > size) return TMLIBDEV_OK; /* Skip next three bytes */ index += 3; /* Find up to maximum number of data bytes */ for (byteNr = 0; byteNr < bytesToFind; byteNr++) { UInt8 nibble1; UInt8 nibble2; /* Skip zeroes in data stream */ while ((nibble1 = GetDataByte(Y, U, V, index++)) == 0) if (index > size) return TMLIBDEV_OK; while ((nibble2 = GetDataByte(Y, U, V, index++)) == 0) if (index > size) return TMLIBDEV_OK; data [byteNr] = (nibble1 >> 2) & 0xF; data [byteNr] |= ((nibble2 << 2) & 0xF0); *dataSize = byteNr + 1; } return TMLIBDEV_OK;}extern tmLibdevErr_tsaa7113GetStatus(pboardVIDec_t pVD, tmVideoStatusType_t type, UInt *pState){ /* Equivalent to Video DecHAL VideoDecGetStatus */ UInt8 ucStatus; UInt8 ucValue; switch (type) { case vstLocked: /* HIGH unlocked, LOW locked */ if(!GetReg(pVD, OutputControl3, &ucValue)) /* Set OLDSB=1 */ return IIC_ERR_TIMEOUT; SetReg(pVD, OutputControl3, ucValue & ~0x10 | 0x10); GetReg(pVD, StatusByte, &ucStatus); *pState = (ucStatus & 0x40) ? False : True; break; case vstReady: /* HIGH locked, LOW unlocked */ if(!GetReg(pVD, OutputControl3, &ucValue)) /* Set OLDSB=0 */ return IIC_ERR_TIMEOUT; SetReg(pVD, OutputControl3, ucValue & ~0x10 | 0x00); GetReg(pVD, StatusByte, &ucStatus); *pState = (ucStatus & 0x01) ? True : False; break; case vstSyncLock: /* HIGH unlocked, LOW locked */ if(!GetReg(pVD, OutputControl3, &ucValue)) /* Set OLDSB=0 */ return IIC_ERR_TIMEOUT; SetReg(pVD, OutputControl3, ucValue & ~0x10 | 0x00); GetReg(pVD, StatusByte, &ucStatus); *pState = (ucStatus & 0x40) ? False : True; break; case vstCopy: /* HIGH copy protected, */ /* LOW not copy protected */ if(!GetReg(pVD, OutputControl3, &ucValue)) /* Set OLDSB=0 */ return IIC_ERR_TIMEOUT; SetReg(pVD, OutputControl3, ucValue & ~0x10 | 0x00);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -