/* LG3305.c LG Demod Driver Ver. 0.9.4 LG Demod Driver Ver. 0.9.5 LG ¿¡¼­ Á¦°øÇÏ´Â Demod Driver + API (User coding) */ #include "DHL_OSAL.h" #include "DHL_DEV_Priv.h" #include #include "LG3305.h" //#define DSI_printf(...) #if COMMENT ____Config____(){} #endif /* º¸µå¿¡¼­ »ç¿ëµÇ´Â LG3305 ÀÇ µð¹ÙÀ̽º ¼ö¸¦ ÁöĪÇÏ¸ç µ¿½Ã¿¡ FE ID °¹¼ö¿Í ÀÏÄ¡ ÇÊ¿ä!! ºñ·Ï LG3305¸¦ ÇѰ³ »ç¿ëÇÏ´õ¶óµµ FE ID°¡ 2·Î ÇÒ´ç ¹ÞÀ» °æ¿ì NUM_LG3305_MAX ´Â 3ÀÌ µÇ¾ßÇÔ!! */ #define NUM_LG3305_MAX 1 // Revision.. Start Ver 0.9.4 #define Ver_095 1 #if COMMENT ____Global____(){} #endif // Init ÇÔ¼ö¿¡¼­ °ªÀ» ³Ñ°Ü ¹Þ´Â´Ù. static unsigned char g_i2cId[NUM_LG3305_MAX]; static unsigned char g_i2cAddr[NUM_LG3305_MAX]; static unsigned char g_feId; #if COMMENT _____________LG_Code_____________(){} #endif #if COMMENT _____Defines_____(){} #endif #if Ver_095 #define LGDT_VERSION_MAJOR 0 #define LGDT_VERSION_MINOR 9 #define LGDT_VERSION_CUSTOM 5 #else #define LGDT_VERSION_MAJOR 0 #define LGDT_VERSION_MINOR 9 #define LGDT_VERSION_CUSTOM 4 #endif #if COMMENT _____Functions_____(){} #endif LgdtReturn_t LgdtInitFAT(LgdtOperMode_t modeOper, bool IsExtAGC) { LgdtReturn_t nRet = LGDT_ERR_NO; if (IsExtAGC) { switch(modeOper) /*---- When External AGC is used : Manaul AGC -----*/ { case LGDT_QAM64: case LGDT_QAM256: nRet = LgdtInitQAM_ExternAGC(modeOper); // Check AGC mode if (nRet != LGDT_ERR_NO) { nRet = (LgdtReturn_t)(nRet|LGDT_ERR_INIT); } break; case LGDT_VSB: nRet = LgdtInitVSB_ExternAGC(); if (nRet != LGDT_ERR_NO) { nRet = (LgdtReturn_t)(nRet|LGDT_ERR_INIT); } break; default: nRet = (LgdtReturn_t)(LGDT_ERR_INIT|LGDT_ERR_PARAM); break; } } else { switch(modeOper) /*---- When Internal AGC is used : Automatic AGC -----*/ { case LGDT_QAM64: case LGDT_QAM256: nRet = LgdtInitQAM(modeOper); if (nRet != LGDT_ERR_NO) { nRet = (LgdtReturn_t)(nRet|LGDT_ERR_INIT); } break; case LGDT_VSB: nRet = LgdtInitVSB(); if (nRet != LGDT_ERR_NO) { nRet = (LgdtReturn_t)(nRet|LGDT_ERR_INIT); } break; default: nRet = (LgdtReturn_t)(LGDT_ERR_INIT|LGDT_ERR_PARAM); break; } } /*----- nSFTRST -----*/ nRet = LgdtResetFAT(); if (nRet != LGDT_ERR_NO) return nRet; return nRet; } LgdtReturn_t LgdtInitQAM_ExternAGC(LgdtOperMode_t mode) { DATA08 pData; LgdtReturn_t nRet; /*----- 1) OPERMODE[1:0] -----*/ switch(mode) { case LGDT_QAM64: nRet = LgdtCheckRegi(0x0000, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData &= 0xFC; nRet = LgdtAlterRegi(0x0000, 0x00); if (nRet != LGDT_ERR_NO) return nRet; // 2) DAGCREF[15:0] <-- 0x2A00 (@0x0012,0x0013) nRet = LgdtAlterRegi(0x0012, 0x2A); if (nRet != LGDT_ERR_NO) return nRet; nRet = LgdtAlterRegi(0x0013, 0x00); if (nRet != LGDT_ERR_NO) return nRet; break; case LGDT_QAM256: nRet = LgdtCheckRegi(0x0000, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData &= 0xFC; pData |= 0x01; nRet = LgdtAlterRegi(0x0000, 0x01); if (nRet != LGDT_ERR_NO) return nRet; // 2) DAGCREF[15:0] <-- 0x2A80 (@0x0012,0x0013) nRet = LgdtAlterRegi(0x0012, 0x2A); if (nRet != LGDT_ERR_NO) return nRet; nRet = LgdtAlterRegi(0x0013, 0x80); if (nRet != LGDT_ERR_NO) return nRet; break; default: break; } // 3) LOCKDTEN <- '1' (@0x0314[1]) nRet = LgdtAlterRegi(0x0314, 0xE3); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); // 4) IFBW[15:0] <-- 0x8888 (@0x0308,0x0309) nRet = LgdtAlterRegi(0x0308, 0x88); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); nRet = LgdtAlterRegi(0x0309, 0x88); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); // 5) ACQEN <- '1'b (@0x030C[2]) nRet = LgdtAlterRegi(0x030C, 0x34); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); // 6) QAMFBEXT <- '1'b (@0x043F[2]) nRet = LgdtAlterRegi(0x043F, 0xAE); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); ///////////////////////////////////////// // for using RF AGC // 7) REFD[11:0] <- 0x046B (@0x0302, 0x0303) nRet = LgdtAlterRegi(0x0302, 0x04); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); nRet = LgdtAlterRegi(0x0303, 0x6B); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); // 8) RFBW[15:0] <-- 0x8889 (@0x0306,0x0307) nRet = LgdtAlterRegi(0x0306, 0x88); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); nRet = LgdtAlterRegi(0x0307, 0x89); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); #if Ver_095 // 9) RFFIX <- '0'b (@0x030D[2] nRet = LgdtCheckRegi(0x030D, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData &= 0xFB; nRet = LgdtAlterRegi(0x030D, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); #endif // 9) reset nRet = LgdtCheckRegi(0x0002, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData &= 0xFE; nRet = LgdtAlterRegi(0x0002, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); LgdtDelay((DATA16)20); // reset delay nRet = LgdtCheckRegi(0x0002, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData &= 0xFE; pData |= 0x01; nRet = LgdtAlterRegi(0x0002, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); return LGDT_ERR_NO; } LgdtReturn_t LgdtInitVSB_ExternAGC(void) { DATA08 pData; LgdtReturn_t nRet; // 1) OPERMODE[1:0] <-- '11'b nRet = LgdtCheckRegi(0x0000, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData &= 0xFC; pData |= 0x03; nRet = LgdtAlterRegi(0x0000, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); // 2) DAGCREF[15:0] <-- 0x32C4 (@0x0012,0x0013) nRet = LgdtAlterRegi(0x0012, 0x32); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); nRet = LgdtAlterRegi(0x0013, 0xC4); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); // 3) LOCKDTEN <- '0' (@0x0314[1]) nRet = LgdtAlterRegi(0x0314, 0xE1); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); // 4) IFBW[15:0] <-- 0x8000 (@0x0308,0x0309) nRet = LgdtAlterRegi(0x0308, 0x80); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); nRet = LgdtAlterRegi(0x0309, 0x00); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); // 5) ACQEN <- '0'b (@0x030C[2]) nRet = LgdtAlterRegi(0x030C, 0x30); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); // 6) QAMFBEXT <- '0'b (@0x043F[2]) nRet = LgdtAlterRegi(0x043F, 0xAA); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); ///////////////////////////////////////// // for using RF AGC // 7) REFD[11:0] <- 0x04C0 (@0x0302, 0x0303) nRet = LgdtAlterRegi(0x0302, 0x04); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); nRet = LgdtAlterRegi(0x0303, 0xC0); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); // 8) RFBW[15:0] <-- 0x8000 (@0x0306,0x0307) nRet = LgdtAlterRegi(0x0306, 0x80); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); nRet = LgdtAlterRegi(0x0307, 0x00); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); #ifdef VSB_PLL_SWEEP nRet = LgdtAlterRegi(0x012A, 0xC9); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); #endif // 9) GCONCIR <- '0'b (@0x0116[7] nRet = LgdtCheckRegi(0x0116, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData &= 0x7F; nRet = LgdtAlterRegi(0x0116, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); #if Ver_095 // 10) RFFIX <- '0'b (@0x030D[2] nRet = LgdtCheckRegi(0x030D, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData &= 0xFB; nRet = LgdtAlterRegi(0x030D, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); #endif // 10) Reset nRet = LgdtCheckRegi(0x0002, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData &= 0xFE; nRet = LgdtAlterRegi(0x0002, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); LgdtDelay((DATA16)20); // reset delay nRet = LgdtCheckRegi(0x0002, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData &= 0xFE; pData |= 0x01; nRet = LgdtAlterRegi(0x0002, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); return LGDT_ERR_NO; } LgdtReturn_t LgdtInitQAM(LgdtOperMode_t mode) { DATA08 pData; LgdtReturn_t nRet; /*----- 1) OPERMODE[1:0] -----*/ switch(mode) { case LGDT_QAM64: nRet = LgdtCheckRegi(0x0000, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData &= 0xFC; nRet = LgdtAlterRegi(0x0000, 0x00); if (nRet != LGDT_ERR_NO) return nRet; // 2) DAGCREF[15:0] <-- 0x2A00 (@0x0012,0x0013) nRet = LgdtAlterRegi(0x0012, 0x2A); if (nRet != LGDT_ERR_NO) return nRet; nRet = LgdtAlterRegi(0x0013, 0x00); if (nRet != LGDT_ERR_NO) return nRet; break; case LGDT_QAM256: nRet = LgdtCheckRegi(0x0000, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData &= 0xFC; pData |= 0x01; nRet = LgdtAlterRegi(0x0000, 0x01); if (nRet != LGDT_ERR_NO) return nRet; // 2) DAGCREF[15:0] <-- 0x2A80 (@0x0012,0x0013) nRet = LgdtAlterRegi(0x0012, 0x2A); if (nRet != LGDT_ERR_NO) return nRet; nRet = LgdtAlterRegi(0x0013, 0x80); if (nRet != LGDT_ERR_NO) return nRet; break; default: break; } // 3) LOCKDTEN <- '1' (@0x0314[1]) nRet = LgdtAlterRegi(0x0314, 0xE3); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); // 4) IFBW[15:0] <-- 0x8888 (@0x0308,0x0309) nRet = LgdtAlterRegi(0x0308, 0x88); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); nRet = LgdtAlterRegi(0x0309, 0x88); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); // 5) ACQEN <- '1'b (@0x030C[2]) nRet = LgdtAlterRegi(0x030C, 0x34); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); // 6) QAMFBEXT <- '1'b (@0x043F[2]) nRet = LgdtAlterRegi(0x043F, 0xAE); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); #if Ver_095 // 7) RFFIX <- '1'b (@0x030D[2] nRet = LgdtCheckRegi(0x030D, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData |= 0x04; nRet = LgdtAlterRegi(0x030D, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); #endif // 6) reset nRet = LgdtCheckRegi(0x0002, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData &= 0xFE; nRet = LgdtAlterRegi(0x0002, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); LgdtDelay((DATA16)20); // reset delay nRet = LgdtCheckRegi(0x0002, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData &= 0xFE; pData |= 0x01; nRet = LgdtAlterRegi(0x0002, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); return LGDT_ERR_NO; } LgdtReturn_t LgdtInitVSB(void) { DATA08 pData; LgdtReturn_t nRet; // 1) OPERMODE[1:0] <-- '11'b nRet = LgdtCheckRegi(0x0000, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData &= 0xFC; pData |= 0x03; nRet = LgdtAlterRegi(0x0000, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); // 2) DAGCREF[15:0] <-- 0x32C4 (@0x0012,0x0013) nRet = LgdtAlterRegi(0x0012, 0x32); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); nRet = LgdtAlterRegi(0x0013, 0xC4); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); // 3) LOCKDTEN <- '0' (@0x0314[1]) nRet = LgdtAlterRegi(0x0314, 0xE1); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); // 4) IFBW[15:0] <-- 0x8000 (@0x0308,0x0309) nRet = LgdtAlterRegi(0x0308, 0x80); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); nRet = LgdtAlterRegi(0x0309, 0x00); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); // 5) ACQEN <- '0'b (@0x030C[2]) nRet = LgdtAlterRegi(0x030C, 0x30); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); // 6) QAMFBEXT <- '0'b (@0x043F[2]) nRet = LgdtAlterRegi(0x043F, 0xAA); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); #ifdef VSB_PLL_SWEEP nRet = LgdtAlterRegi(0x012A, 0xC9); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); #endif // 7) GCONCIR <- '0'b (@0x0116[7] nRet = LgdtCheckRegi(0x0116, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData &= 0x7F; nRet = LgdtAlterRegi(0x0116, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); #if Ver_095 // 8) RFFIX <- '1'b (@0x030D[2] nRet = LgdtCheckRegi(0x030D, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData |= 0x04; nRet = LgdtAlterRegi(0x030D, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); #endif // 8) Reset nRet = LgdtCheckRegi(0x0002, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData &= 0xFE; nRet = LgdtAlterRegi(0x0002, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); LgdtDelay((DATA16)20); // reset delay nRet = LgdtCheckRegi(0x0002, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); pData &= 0xFE; pData |= 0x01; nRet = LgdtAlterRegi(0x0002, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); return LGDT_ERR_NO; } LgdtReturn_t LgdtResetFAT(void) { LgdtReturn_t nRet; DATA08 nData; nRet = LgdtCheckRegi(0x0002, &nData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); nData = nData & 0xFE; nRet = LgdtAlterRegi(0x0002, nData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); LgdtDelay((DATA16)20); // reset delay nData |= 0x01; nRet = LgdtAlterRegi(0x0002, nData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); return LGDT_ERR_NO; } LgdtReturn_t LgdtCheckRegi(DATA16 nAddr, DATA08* pData) { DATA08 nSize = 1; DATA08 nData; LgdtReturn_t nRet; nRet = (LgdtReturn_t)Lgdt_I2C_Read(g_i2cAddr[g_feId], nAddr, &nData, nSize); if (nRet != LGDT_ERR_NO) return LGDT_ERR_I2C; *pData = nData; return LGDT_ERR_NO; } LgdtReturn_t LgdtAlterRegi(DATA16 nAddr, DATA08 nData) { DATA08 nTemp; DATA08 nDataWrite[4]; LgdtReturn_t nRet = LGDT_ERR_NO; nDataWrite[0] = g_i2cAddr[g_feId]; nTemp = nAddr >> 8; nTemp &= 0xFF; nDataWrite[1] = nTemp; nTemp = nAddr & 0xFF; nDataWrite[2] = nTemp; nDataWrite[3] = nData; nRet = (LgdtReturn_t)Lgdt_I2C_Write(nDataWrite, 4); if (nRet != LGDT_ERR_NO) nRet = (LgdtReturn_t)(nRet|LGDT_ERR_I2C); return (LgdtReturn_t)nRet; } /* Delay time in milliseconds */ int LgdtDelay(DATA16 nDelayTime) { /* FOLLOWING ROUTINE IS AN EXAMPLE FOR CUSTOMER */ Lgdt_Delay(nDelayTime); return 0; } LgdtReturn_t LgdtRepeaterI2C(bool mode) { LgdtReturn_t nRet; DATA08 nData; // Add 1ms delay by j.y. won : 2007.08.21 (due to tuner) LgdtDelay(1); nRet = LgdtCheckRegi(0x0001, &nData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); nData &= 0xDF; if (mode == true) /*----- I2C Repeater Turn ON -----*/ { nRet = LgdtAlterRegi(0x0001, nData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); } else /*----- I2C Repeater Turn OFF -----*/ { nData |= 0x20; nRet = LgdtAlterRegi(0x0001, nData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_INIT); } // Add 1ms delay by j.y. won : 2007.08.21 (due to tuner) LgdtDelay(1); return LGDT_ERR_NO; } LgdtReturn_t LgdtCheckVersion(LgdtVersion_s *pVersion) { pVersion->Major = LGDT_VERSION_MAJOR; pVersion->Minor = LGDT_VERSION_MINOR; pVersion->Custom= LGDT_VERSION_CUSTOM; //pVersion->Tuner = cfgTuner.modelTuner; return LGDT_ERR_NO; } LgdtReturn_t LgdtCheckOperMode(LgdtOperMode_t* modeOper) { DATA08 pData; LgdtReturn_t nRet; nRet = LgdtCheckRegi(0x0000, &pData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); pData &= 0x03; switch(pData) { case LGDT_QAM64: *modeOper = LGDT_QAM64; break; case LGDT_QAM256: *modeOper = LGDT_QAM256; break; case LGDT_VSB: *modeOper = LGDT_VSB; break; default: return LGDT_ERR_CHECK_FUNC; } return LGDT_ERR_NO; } LgdtReturn_t LgdtAlterMpegMode(LgdtMpegMode_t isMPEG) { DATA08 pData; DATA08 nTemp; LgdtReturn_t nRet; if ( (isMPEG != LGDT_PARAL) && (isMPEG != LGDT_SERIAL) ) return (LgdtReturn_t)(LGDT_ERR_PARAM|LGDT_ERR_ALTER_FUNC); nTemp = isMPEG << 5; nRet = LgdtCheckRegi(0x050E, &pData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_ALTER_FUNC); pData &= 0xDF; pData |= nTemp; nRet = LgdtAlterRegi(0x050E, pData); if(nRet != LGDT_ERR_NO) { return (LgdtReturn_t)(nRet|LGDT_ERR_ALTER_FUNC); } nRet = LgdtResetFAT(); if (nRet != LGDT_ERR_NO) { return nRet; } return LGDT_ERR_NO; } LgdtReturn_t LgdtAlterMpegPolarity(LgdtClock_t isCLKEDG, LgdtClock_t isVALID) { DATA08 pData; DATA08 nTemp; LgdtReturn_t nRet; nTemp = 0x00; if (isCLKEDG == LGDT_CLOCK_HIGH) nTemp |= 0x08; if (isVALID == LGDT_CLOCK_HIGH) nTemp |= 0x01; nRet = LgdtCheckRegi(0x050E, &pData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_ALTER_FUNC); pData &= 0xF6; pData |= nTemp; nRet = LgdtAlterRegi(0x050E, pData); if(nRet != LGDT_ERR_NO) { return (LgdtReturn_t)(nRet|LGDT_ERR_ALTER_FUNC); } nRet = LgdtResetFAT(); if (nRet != LGDT_ERR_NO) { return (LgdtReturn_t)(nRet|LGDT_ERR_ALTER_FUNC); } return LGDT_ERR_NO; } LgdtReturn_t LgdtAlterSpectrumFAT(LgdtInvert_t isPol) { DATA08 pData; LgdtReturn_t nRet; nRet = LgdtCheckRegi(0x0504, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_ALTER_FUNC); pData &= 0xF5; /*----- 0xF5 : 1111 x1x1 -----*/ if (isPol == LGDT_INVERTED) pData |= 0x02; nRet = LgdtAlterRegi(0x0504, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_ALTER_FUNC); /*----- FEC Not-Reset -----*/ nRet = LgdtAlterRegi(0x0504, pData | 0x08); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_ALTER_FUNC); return LGDT_ERR_NO; } LgdtReturn_t LgdtIsLockSync(bool* isLock) { DATA08 pData; LgdtReturn_t nRet; *isLock = false; nRet = LgdtCheckRegi(0x0003, &pData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); pData &= 0x04; // ¼öÁ¤..±âÁ¸ Inlock ¿¡¼­ synclock À¸·Î.. if (pData == 0x04) *isLock = true; return LGDT_ERR_NO; } LgdtReturn_t LgdtIsLockCR(bool *isLock) { DATA08 pData; LgdtOperMode_t modeOper; LgdtReturn_t nRet; nRet = LgdtCheckRegi(0x011D, &pData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); nRet = LgdtCheckOperMode(&modeOper); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); *isLock = false; if (modeOper == LGDT_VSB) { pData &= 0x80; if (pData == 0x80) *isLock = true; } else { pData &= 0x02; if (pData == 0x02) *isLock = true; } return LGDT_ERR_NO; } LgdtReturn_t LgdtCheckSnrFAT(DATA_DOUBLE* nSNR) { DATA_DOUBLE nData = 0; LgdtOperMode_t modeOper; LgdtReturn_t nRet; nRet = LgdtCheckOperMode(&modeOper); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); switch(modeOper) { case LGDT_QAM64: case LGDT_QAM256: nRet = LgdtCheckSnrQAM(&nData, modeOper); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); *nSNR = nData; break; default: nRet = LgdtCheckSnrVSB(&nData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); *nSNR = nData; break; } return LGDT_ERR_NO; } LgdtReturn_t LgdtCheckSnrQAM(DATA_DOUBLE* nEQ, LgdtOperMode_t modeOper) { LgdtReturn_t nRet; DATA08 pData; DATA16 nData = 0; DATA32 nSignalPower = 0; /*----- Assgin Ps(Signal Power) based upon the mode -----*/ if (modeOper == LGDT_QAM64) nSignalPower = 688128; else if (modeOper == LGDT_QAM256) nSignalPower = 696320; else return (LgdtReturn_t)(LGDT_ERR_PARAM|LGDT_ERR_CHECK_FUNC); /*----- End of assigning Ps -----*/ nRet = LgdtCheckRegi(0x011B, &pData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); nData = pData << 8; nRet = LgdtCheckRegi(0x011C, &pData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); nData |= pData; //DSI_printf(DSI_PORT_0, "FE_ID : %d, SNR nData : %u \r\n", g_feId, nData); if ((nData != 0xFFFF) && (nData !=0)) { *nEQ = 10 * log10((DATA_DOUBLE)nSignalPower / nData); // Bug fixed by j.y. won : 2007.06.18 } else *nEQ = 0; if (*nEQ < 0) *nEQ = 0; return LGDT_ERR_NO; } LgdtReturn_t LgdtCheckSnrVSB(DATA_DOUBLE* nPT) { DATA08 pData; DATA32 nData = 0; LgdtReturn_t nRet; // PT SNR nRet = LgdtCheckRegi(0x0417, &pData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); nData = pData & 0x0F; nData <<= 16; nRet = LgdtCheckRegi(0x0418, &pData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); nData |= (pData << 8); // 2006-09-21, by sungwee nRet = LgdtCheckRegi(0x0419, &pData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); nData |= pData; //DSI_printf(DSI_PORT_0, "FE_ID : %d, SNR nData : %u \r\n", g_feId, nData); if ((nData < 0x0FFFFF) && (nData > 0)) { *nPT = 10 * log10((DATA_DOUBLE)(25 * 32 * 32) / nData); // Bug fixed by j.y. won : 2007.06.18 } else *nPT = 0; if (*nPT < 0) *nPT = 0; return LGDT_ERR_NO; } LgdtReturn_t LgdtCheckPacketErr(DATA16* nErr) { DATA08 pData; DATA16 nData; LgdtReturn_t nRet; nRet = LgdtCheckRegi(0x050C, &pData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); nData = pData << 8; nRet = LgdtCheckRegi(0x050D, &pData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); nData |= pData; *nErr = nData; return LGDT_ERR_NO; } LgdtReturn_t LgdtIsLockBER(bool *isLock) { DATA08 pData; LgdtReturn_t nRet; *isLock = false; // Added by j.y. won : 2007.06.18 nRet = LgdtCheckRegi(0x0800, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); if(pData&0x01) return LGDT_ERR_OTHER; nRet = LgdtCheckRegi(0x0809, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); pData &= 0x01; if(pData == 0x01) *isLock = true; return LGDT_ERR_NO; } LgdtReturn_t LgdtCheckBer(float* nBer) { DATA08 pData; DATA32 nPeriod; DATA32 nErr1, nErr2, nErr3, nErr4; LgdtReturn_t nRet; /*----- Checks BERTPERD -----*/ nRet = LgdtCheckRegi(0x0801, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); pData &= 0x1F; // added by j.y. won : 2007.10.24 if(pData < 4) pData = 4; /*----- Period = 2^BERTPERD -----*/ nPeriod = 1<> 16) & 0xFF); nRet = LgdtAlterRegi(0x0803, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_ALTER_FUNC); pData = (DATA08)((nData >> 8) & 0xFF); nRet = LgdtAlterRegi(0x0804, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_ALTER_FUNC); pData = (DATA08)(nData & 0xFF); nRet = LgdtAlterRegi(0x0805, pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_ALTER_FUNC); LgdtDelay((DATA16)DELAY); LgdtResetBER(); return LGDT_ERR_NO; } LgdtReturn_t LgdtAlterInvertPRBS(LgdtInvert_t isPol) { DATA08 pData; DATA08 nData; LgdtReturn_t nRet; nRet = LgdtCheckRegi(0x0800, &pData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_ALTER_FUNC); nData = pData & 0xFB; if (isPol == LGDT_INVERTED) nData |= 0x04; /*--- Bit #3 to HIGH ---*/ nRet = LgdtAlterRegi(0x0800, nData); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_ALTER_FUNC); nRet = LgdtResetFAT(); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)nRet; return LGDT_ERR_NO; } #if COMMENT __________User_Code__________(){} #endif #if COMMENT ______Global______(){} #endif // id : LG3305 ¿¡ ÇÒ´çµÈ FE ID #define CHECK_LG3305_id(id) { \ } #if COMMENT ______Low_Level______(){} #endif #if COMMENT ______Delay_____(){} #endif /* Delay ÇÔ¼ö Delay time in milliseconds */ LgdtReturn_t Lgdt_Delay(DATA16 nDelayTime) { LgdtReturn_t nRet = LGDT_ERR_NO; DHL_OS_Delay(nDelayTime); return nRet; } #if COMMENT ______I2C_____(){} #endif /* LG3305 I2C write format S - DeviceAddr(W) - SubAddr(2byte) - writeData0(1byte) - ..... - writeData(n-1) - P LG3305 ¿¡¼­ Á¤ÀÇÇÏ´Â Device Address ´Â 0xB2 Àϰæ¿ì ½ÇÁ¦ Bit ´Â 1011 0010 */ LgdtReturn_t Lgdt_I2C_Write(DATA08 *pData, DATA08 nSizeData) { DHL_RESULT dhr = DHL_OK; LgdtReturn_t nRet = LGDT_ERR_NO; UINT8 chip_addr; UINT16 sub_addr; chip_addr = pData[0]; sub_addr = ((UINT16)pData[1] << 8) | pData[2]; dhr = dhl_i2c_write3(g_i2cId[g_feId], chip_addr, sub_addr, &(pData[3]), nSizeData - 3); if (dhr != DHL_OK) { DHL_OS_Printf("|%s| fail to write demod(chip_addr:0x%x).\n", __FUNCTION__, chip_addr); } return nRet; } /* LG3305 I2C read format S - DeviceAddr(W) - SubAddr(2byte) - Rs - DeviceAddr(R) - readData0(1byte) - ..... - readData(n-1) - P LG3305 ¿¡¼­ Á¤ÀÇÇÏ´Â Device Address ´Â 0xB2 Àϰæ¿ì ½ÇÁ¦ Bit ´Â 1011 0011 */ LgdtReturn_t Lgdt_I2C_Read(DATA08 nAddrDev, DATA16 nAddrReg, DATA08 *pData, DATA08 nSizeData) { DHL_RESULT dhr = DHL_OK; LgdtReturn_t nRet = LGDT_ERR_NO; dhr = dhl_i2c_read3(g_i2cId[g_feId], nAddrDev, nAddrReg, pData, nSizeData); if (dhr != DHL_OK) { DHL_OS_Printf("|%s| fail to read demod(chip_addr:0x%x).\n", __FUNCTION__, nAddrDev); } return nRet; } #if COMMENT ______High_Level______(){} #endif #if COMMENT ___________(){} #endif LgdtReturn_t LgdtIsLockAgc(bool* isLock) { LgdtReturn_t nRet; DATA08 pData; *isLock = false; nRet = LgdtCheckRegi(0x031E, &pData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); pData &= 0x01; if (pData == 0x01) *isLock = true; return LGDT_ERR_NO; } LgdtReturn_t LgdtIsLockTR(bool* isLock) { LgdtReturn_t nRet; DATA08 pData; *isLock = false; nRet = LgdtCheckRegi(0x021B, &pData); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); pData &= 0x07; //DSI_printf(0, " TR Lock status : %d \r\n", pData); if (pData == 0x04) *isLock = true; return LGDT_ERR_NO; } /* AGCLOCK(1) : 0 (Unlock), 1 (lock) => ÀÏ´Ü Á¦¿Ü.. ÀÔ·Â ½ÅÈ£°¡ ³·À¸¸é 0 ÀÌ µÉ ¼ö µµ ÀÖ´Ù.. SYNCLOCK(1) : 0 (Unlock), 1 (Lock) CLOCKVSB(1) : 0 (Unlock), 1 (Lock) */ LgdtReturn_t Lgdt_get_VSBLock(DATA08 *lock) { LgdtReturn_t nRet = LGDT_ERR_NO; bool agclock, synclock, clockvsb; *lock = 0; // 0 : unlock, 1 : lock nRet = LgdtIsLockAgc(&agclock); if (nRet != LGDT_ERR_NO) goto err_exit; nRet = LgdtIsLockCR(&clockvsb); if(nRet != LGDT_ERR_NO) goto err_exit; nRet = LgdtIsLockSync(&synclock); if (nRet != LGDT_ERR_NO) goto err_exit; //DSI_printf(DSI_PORT_0, "FE_ID : %d, VSB : agclock = %d, synclock = %d, clockvsb = %d \r\n", g_feId, agclock, synclock, clockvsb); #if 0 if(agclock == true && synclock == true && clockvsb == true) #else if(synclock == true && clockvsb == true) #endif { *lock = 1; } err_exit: return nRet; } /* AGCLOCK(1) : 0 (Unlock), 1 (Lock) SYNCLOCK(1) : 0 (Unlock), 1 (Lock) TRLOCK(3) : 0x04 (Lock ??) */ LgdtReturn_t Lgdt_get_QAMLock(DATA08 *lock) { LgdtReturn_t nRet = LGDT_ERR_NO; bool agclock, synclock, trlock; *lock = 0; // 0 : unlock, 1 : lock nRet = LgdtIsLockAgc(&agclock); if (nRet != LGDT_ERR_NO) goto err_exit; nRet = LgdtIsLockTR(&trlock); if(nRet != LGDT_ERR_NO) goto err_exit; nRet = LgdtIsLockSync(&synclock); if (nRet != LGDT_ERR_NO) goto err_exit; //DSI_printf(DSI_PORT_0, "FE_ID : %d, QAM : agclock = %d, synclock = %d, trlock = %d \r\n", g_feId, agclock, synclock, trlock); #if 0 if(agclock == true && synclock == true && trlock == true) #else if(synclock == true && trlock == true) #endif { *lock = 1; } err_exit: return nRet; } /* MPEG TS parameter settings Data1st ¼³Á¤.. errins ¼³Á¤.. ±âŸ Polarity ¼³Á¤.. */ LgdtReturn_t LgdtAlterMpegSettings(LgdtData1st_t data1st, LgdtErrins_t errins, LgdtTpclkmod_t tpclkmod, LgdtClock_t tpsoppol, LgdtClock_t tperrpol) { LgdtReturn_t nRet; DATA08 pData[2]; DATA08 nTemp; nRet = LgdtCheckRegi(0x050E, &pData[0]); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); nRet = LgdtCheckRegi(0x050F, &pData[1]); if (nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_CHECK_FUNC); nTemp = pData[0] & 0xAD; pData[0] = nTemp | (data1st << 4) | (errins << 1) | (tpclkmod << 6); nTemp = pData[1] & 0xFC; pData[1] = nTemp | (tpsoppol << 1) | tperrpol; nRet = LgdtAlterRegi(0x050E, pData[0]); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_ALTER_FUNC); nRet = LgdtAlterRegi(0x050F, pData[1]); if(nRet != LGDT_ERR_NO) return (LgdtReturn_t)(nRet|LGDT_ERR_ALTER_FUNC); //DSI_printf(DSI_PORT_0, " FE_ID : %d, Reg = 0x050E val : 0x%x, 0x050F val : 0x%x \r\n", g_feId, pData[0], pData[1]); nRet = LgdtResetFAT(); if (nRet != LGDT_ERR_NO) { return nRet; } return LGDT_ERR_NO; } /* IF center Freq, spectrum inversion, complex ¼³Á¤. ±âÁ¸ LG API ¼Ò½º¿¡¼­ ¾à°£ ±¸Á¶ º¯°æ.. if_freq : MHz IF center freq ¼ÂÆÃ 1. VSB : complex_multiplier À϶§ fc : pilot freq inversion À̸é pilot freq = if freq + pilot offset inversion ÀÌ ¾Æ´Ï¸é pilot freq = if freq - pilot offset NCOCTF = (fc/fs)*2^26 real_multiplier À϶§ fc : center freq NCOCTF = (fc/fs)*2^26 fs : demod system clk 2. QAM : NCOCTF = (fc/fs)*2^30 fc : center freq fs : demod system clk */ LgdtReturn_t LgdtSetManualIfandSpectrum(double if_freq, LgdtOperMode_t demod, bool complex_multiplier, bool vsb_inversion) { int n_nco = 0; double nco_freq = 0.0; double pilot_offset = 2.690559; LgdtReturn_t nRet; DATA08 pData; DATA08 n_nco_b1, n_nco_b2, n_nco_b3, n_nco_b4; if(complex_multiplier) // complex multiplier { // Downmode set - complex multiplier nRet = LgdtCheckRegi(0x0007, &pData); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; pData |= 0x40; nRet = LgdtAlterRegi(0x0007, pData); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; if(demod == LGDT_QAM64 || demod == LGDT_QAM256) // QAM mode { nco_freq = if_freq/25.0*1073741824.0; // NCOCTF = (fc/fs)*2^30 n_nco = (int)nco_freq; n_nco_b4 = (n_nco>>24)&0x3f; n_nco_b4 |= 0x40; n_nco_b3 = (n_nco>>16)&0xff; n_nco_b2 = (n_nco>>8)&0xff; n_nco_b1 = n_nco&0xff; // set spectrum if(vsb_inversion) LgdtAlterSpectrumFAT(LGDT_NOT_INVERTED); else LgdtAlterSpectrumFAT(LGDT_INVERTED); } else // VSB mode { // for spectrum inversion nRet = LgdtCheckRegi(0x0126, &pData); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; if(vsb_inversion) //VSB spectrum inversion { pData |= 0x80; nco_freq = (if_freq+pilot_offset)/25.0*67108864.0; // NCOCTF = (fc/fs)*2^26 } else //VSB spectrum non-inversion { pData &= 0x7F; nco_freq = (if_freq-pilot_offset)/25.0*67108864.0; // NCOCTF = (fc/fs)*2^26 } nRet = LgdtAlterRegi(0x0126, pData); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; n_nco = (int)nco_freq; n_nco_b4 = (n_nco>>24)&0x3f; n_nco_b4 |= 0x40; n_nco_b3 = (n_nco>>16)&0xff; n_nco_b2 = (n_nco>>8)&0xff; n_nco_b1 = n_nco&0xff; } if( (if_freq >5.8 && if_freq <6.2) || (if_freq >43.8 && if_freq <44.2) ) { // DSAWBPY, DAGCBPY enable nRet = LgdtCheckRegi(0x000D, &pData); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; pData &= 0x3F; nRet = LgdtAlterRegi(0x000D, pData); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; } else { // DSAWBPY, DAGCBPY disable nRet = LgdtCheckRegi(0x000D, &pData); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; pData |= 0xC0; nRet = LgdtAlterRegi(0x000D, pData); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; } nRet = LgdtAlterRegi(0x0106, n_nco_b4); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; nRet = LgdtAlterRegi(0x0107, n_nco_b3); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; nRet = LgdtAlterRegi(0x0108, n_nco_b2); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; nRet = LgdtAlterRegi(0x0109, n_nco_b1); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; } else // real multiplier { // Downmode set - real multiplier nRet = LgdtCheckRegi(0x0007, &pData); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; pData &= 0xBF; nRet = LgdtAlterRegi(0x0007, pData); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; // DSAWBPY, DAGCBPY enable nRet = LgdtCheckRegi(0x000D, &pData); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; pData &= 0x3F; nRet = LgdtAlterRegi(0x000D, pData); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; if(demod == LGDT_QAM64 || demod == LGDT_QAM256) // QAM mode { nco_freq = if_freq/25.0*1073741824.0; // NCOCTF = (fc/fs)*2^30 n_nco = (int)nco_freq; n_nco_b4 = (n_nco>>24)&0x3f; n_nco_b4 |= 0x40; n_nco_b3 = (n_nco>>16)&0xff; n_nco_b2 = (n_nco>>8)&0xff; n_nco_b1 = n_nco&0xff; // set spectrum LgdtAlterSpectrumFAT(LGDT_NOT_INVERTED); } else // VSB mode { // for spectrum inversion nRet = LgdtCheckRegi(0x0126, &pData); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; if(vsb_inversion) // VSB spectrum inversion { pData |= 0x80; nco_freq = if_freq/25.0*67108864.0; // NCOCTF = (fc/fs)*2^26 } else // VSB spectrum non-inversion { pData &= 0x7F; nco_freq = if_freq/25.0*67108864.0; // NCOCTF = (fc/fs)*2^26 } nRet = LgdtAlterRegi(0x0126, pData); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; n_nco = (int)nco_freq; n_nco_b4 = (n_nco>>24)&0x3f; n_nco_b4 |= 0x40; n_nco_b3 = (n_nco>>16)&0xff; n_nco_b2 = (n_nco>>8)&0xff; n_nco_b1 = n_nco&0xff; } nRet = LgdtAlterRegi(0x0106, n_nco_b4); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; nRet = LgdtAlterRegi(0x0107, n_nco_b3); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; nRet = LgdtAlterRegi(0x0108, n_nco_b2); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; nRet = LgdtAlterRegi(0x0109, n_nco_b1); if(nRet != LGDT_ERR_NO) return LGDT_ERR_INIT; } return LGDT_ERR_NO; } #if COMMENT __________API__________(){} #endif #if COMMENT ______Tune______(){} #endif /* LG3305 ÃʱâÈ­ API -FE ä³Î ¹× I2C °ü·Ã ÃʱâÈ­ ¼öÇà.. -MPEG TS ¿¡ ´ëÇÑ ¼³Á¤ ¼öÇà..(Decoder ÀÇ ¼³Á¤°ª°ú ÀÏÄ¡ ½ÃÅ´..) -±âŸ ÇÊ¿äÇÑ ¼³Á¤ ?? ´Ù¸¥ API º¸´Ù ²À!! °¡Àå ¸ÕÀú ¼öÇàµÇ¾î¾ß Çϸç App·Î ºÎÅÍ FE_ID, I2C_ID, I2C_Addr À» ¹Þ¾Æ¾ß µÈ´Ù.!!! */ LgdtReturn_t LG3305_init(DATA08 id, DATA08 hI2c, DATA08 i2cAddr) { LgdtReturn_t nRet = LGDT_ERR_NO; LgdtVersion_s api_ver; CHECK_LG3305_id(id); g_feId = id; g_i2cId[g_feId] = hI2c; g_i2cAddr[g_feId] = i2cAddr; nRet = LgdtCheckVersion(&api_ver); //API ¹öÁ¯À» Àоî¿È..reg¿¡¼­ Àоî¿À´Â °ÍÀº ¾Æ´Ô!! DHL_OS_Printf(" LG3305 API Ver %d. %d. %d \r\n", api_ver.Major, api_ver.Minor, api_ver.Custom); #if 0 // Serial TS nRet = LgdtAlterMpegMode(LGDT_SERIAL); // MPEG TS Data mode ¼³Á¤.. #else // Parallel TS nRet = LgdtAlterMpegMode(LGDT_PARAL); // MPEG TS Data mode ¼³Á¤.. #endif if(nRet != LGDT_ERR_NO) goto err_exit; nRet = LgdtAlterMpegPolarity(LGDT_CLOCK_HIGH, LGDT_CLOCK_HIGH); // Clk, Valid ÀÇ polarity ¼³Á¤.. if(nRet != LGDT_ERR_NO) goto err_exit; nRet = LgdtAlterMpegSettings(LGDT_MSB1ST, LGDT_ERRINS_DISABLE, LGDT_FIXED_CLOCK, LGDT_CLOCK_HIGH, LGDT_CLOCK_LOW); // ±âŸ MPEG TS ¼³Á¤.. if(nRet != LGDT_ERR_NO) goto err_exit; err_exit: return nRet; } /* LG3305 tune API In-band tune ¸¸ Áö¿ø..(Air : VSB, Cable : 64QAM, 256QAM) */ LgdtReturn_t LG3305_tune(DATA08 id, LgdtOperMode_t demod, DATA_DOUBLE if_freq) { LgdtReturn_t nRet = LGDT_ERR_NO; CHECK_LG3305_id(id); g_feId = id; if(demod == LGDT_QAM64 || demod == LGDT_QAM256 || demod == LGDT_VSB) // Áö¿øÇÏ´Â in-band mod type { nRet = LgdtSetManualIfandSpectrum(if_freq, demod, false, true); // if_freq, multiplier, spectrum inversion ¼ÂÆÃ. if(nRet != LGDT_ERR_NO) goto err_exit; nRet = LgdtInitFAT(demod, false); // internal AGC use } else { nRet = LGDT_ERR_RUN; } err_exit: return nRet; } /* Tuner I2C Control À» À§ÇÑ Passport enable ÇÔ¼ö. Tuner Á¦¾î¸¦ À§ÇÑ I2C ¶óÀÎÀÌ Demod ¸¦ ÅëÇØ¼­ ¿¬°áµÊ.. Repeater ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© Pass ¸¦ On/Off ÇØÁÜ.. Demod ¼ÂÆÃÇÒ¶§´Â Off, Tuner ¼ÂÆÃÇÒ¶§´Â On On : true, Tuner ¼ÂÆÃ. Off : false, Demod ¼ÂÆÃ. */ LgdtReturn_t LG3305_RepeaterI2C(DATA08 id, bool mode) { LgdtReturn_t nRet = LGDT_ERR_NO; CHECK_LG3305_id(id); g_feId = id; nRet = LgdtRepeaterI2C(mode); if(nRet != LGDT_ERR_NO) { DHL_OS_Printf(" FE_ID : %d, mode : %d, LG3305 Repeat Error!!! \r\n", id, mode); } return nRet; } #if COMMENT ______Status______(){} #endif /* Demod ÀÇ Lock »óÅ üũ.. VSB, QAM ¸ðµåº° °¢ Lock üũ.. ¸ðµÎ Lock µÇ¸é ÃÖÁ¾ Lock À¸·Î ÆÇ´Ü.. Demod ÀÇ ¼³Á¤°ª°ú Reg ÀÇ ¼ÂÆÃµÈ °ªÀ» üũÇÑ ÈÄ Lock üũ ¼öÇà.. */ LgdtReturn_t LG3305_get_LockStatus(DATA08 id, LgdtOperMode_t demod, DATA08 *lock) { LgdtReturn_t nRet = LGDT_ERR_NO; LgdtOperMode_t demod_LGDT; CHECK_LG3305_id(id); g_feId = id; nRet = LgdtCheckOperMode(&demod_LGDT); // RegÀÇ Demod ¼ÂÆÃ°ªÀ» °¡Á®¿È.. if(nRet != LGDT_ERR_NO) goto err_exit; if(demod != demod_LGDT) // Demod ÀÇ ¼³Á¤°ª°ú ¼ÂÆÃ°ªÀ» ºñ±³ üũ.. { nRet = LGDT_ERR_PARAM; goto err_exit; } if(demod_LGDT == LGDT_VSB) // VSB Lock üũ.. { nRet = Lgdt_get_VSBLock(lock); } else if(demod_LGDT == LGDT_QAM64 || demod_LGDT == LGDT_QAM256) // QAM Lock üũ.. { nRet = Lgdt_get_QAMLock(lock); } else { nRet = LGDT_ERR_PARAM; } err_exit: return nRet; } /* SNR ÃøÁ¤ API Demod º° SNR °ª »êÃâÀÌ ´Ù¸§.. */ LgdtReturn_t LG3305_get_Snr(DATA08 id, LgdtOperMode_t demod, DATA_DOUBLE *nSNR) { LgdtReturn_t nRet = LGDT_ERR_NO; LgdtOperMode_t demod_LGDT; CHECK_LG3305_id(id); g_feId = id; nRet = LgdtCheckOperMode(&demod_LGDT); // RegÀÇ Demod ¼ÂÆÃ°ªÀ» °¡Á®¿È.. if(nRet != LGDT_ERR_NO) goto err_exit; if(demod != demod_LGDT) // Demod ÀÇ ¼³Á¤°ª°ú ¼ÂÆÃ°ªÀ» ºñ±³ üũ.. { nRet = LGDT_ERR_PARAM; goto err_exit; } nRet = LgdtCheckSnrFAT(nSNR); err_exit: return nRet; } /* FEC packet Err Count API ¿¡·¯ Ä«¿îÆ® °ªÀÌ °è¼Ó ´©ÀûµÇ´Â °ÍÀÌ ¾Æ´Ï¶ó ÀÏÁ¤ ½Ã°£ ¸¶´Ù °»½ÅµÇ´Â°Í °°À½ !! */ LgdtReturn_t LG3305_get_FECerr(DATA08 id, LgdtOperMode_t demod, DATA16 *nErr) { LgdtReturn_t nRet = LGDT_ERR_NO; LgdtOperMode_t demod_LGDT; CHECK_LG3305_id(id); g_feId = id; nRet = LgdtCheckOperMode(&demod_LGDT); // RegÀÇ Demod ¼ÂÆÃ°ªÀ» °¡Á®¿È.. if(nRet != LGDT_ERR_NO) goto err_exit; if(demod != demod_LGDT) // Demod ÀÇ ¼³Á¤°ª°ú ¼ÂÆÃ°ªÀ» ºñ±³ üũ.. { nRet = LGDT_ERR_PARAM; goto err_exit; } nRet = LgdtCheckPacketErr(nErr); err_exit: return nRet; } #if COMMENT ______TEST______(){} #endif /* BER(bit error rations) Check BER üũ¸¦ À§Çؼ­´Â modulator ¿¡¼­ PRBS mode ¸¦ Áö¿øÇØ¾ß Çϸç modulator ¿¡¼­ ÁöÁ¤ÇÑ PRBS ¿Í demod ÀÇ PRBS °¡ ÀÏÄ¡½Ã¿¡¸¸ BER üũ°¡ °¡´É.. PRBS ¼ÂÆÃ -> BER Lock È®ÀÎ -> Lock À̸é BER üũ. */ LgdtReturn_t LG3305_get_Ber(DATA08 id, int mode_PRBS, int invertion) { LgdtReturn_t nRet = LGDT_ERR_NO; bool lock; float ber; CHECK_LG3305_id(id); g_feId = id; DHL_OS_Printf("FE_ID : %d, Check BER !!!\r\n", g_feId); nRet = LgdtAlterPolyPRBS((LgdtPolyPRBS_t)mode_PRBS, 0); if(nRet != LGDT_ERR_NO) DHL_OS_Printf("FE_ID : %d, Error (%d)LgdtAlterPolyPRBS \r\n", g_feId, nRet); nRet = LgdtAlterInvertPRBS((LgdtInvert_t)invertion); if(nRet != LGDT_ERR_NO) DHL_OS_Printf("FE_ID : %d, Error (%d)LgdtAlterInvertPRBS \r\n", g_feId, nRet); nRet = LgdtIsLockBER(&lock); if(nRet != LGDT_ERR_NO) DHL_OS_Printf("FE_ID : %d, Error (%d)LgdtIsLockBER \r\n", g_feId, nRet); if(lock) { nRet = LgdtCheckBer(&ber); // bit error rations check if(nRet != LGDT_ERR_NO) DHL_OS_Printf("FE_ID : %d, Error (%d)LgdtCheckBer \r\n", g_feId, nRet); DHL_OS_Printf("FE_ID : %d, BER value : %f \r\n", g_feId, ber); } else { DHL_OS_Printf("FE_ID : %d, BER unlock!!! \r\n", g_feId); } return nRet; } /* Timing recovery ¸¦ À§ÇÑ ¼³Á¤. mode : 0 À̸é default mode, 1À̸é user defined mode trfcw 1. VSB Àϰæ¿ì : trfcw = (sampling rate / (symbol rate * 2)) * 2^24 2. QAM Àϰæ¿ì : trfcw = (sampling rate / (symbol rate * 4)) * 2^24 */ LgdtReturn_t LG3305_timing_recovery(DATA08 id, int mode, DATA32 trfcw) { LgdtReturn_t nRet = LGDT_ERR_NO; DATA08 pData; DATA32 nTemp; CHECK_LG3305_id(id); g_feId = id; DHL_OS_Printf("FE_ID : %d, Timing recovery !!!\r\n", g_feId); if(mode) mode = 0x40; // User defined else mode = 0x00; // Not user defined nRet = LgdtCheckRegi(0x0200, &pData); if (nRet != LGDT_ERR_NO) DHL_OS_Printf("FE_ID : %d, Error (%d)LgdtCheckRegi \r\n", g_feId, nRet); pData &= 0xBF; pData |= mode; nRet = LgdtAlterRegi(0x0200, pData); if(nRet != LGDT_ERR_NO) DHL_OS_Printf("FE_ID : %d, Error (%d)LgdtAlterRegi \r\n", g_feId, nRet); if(mode == 0x40) // User defined { nTemp = trfcw & 0xFFFFFFFF; DHL_OS_Printf("FE_ID : %d, trfcw value : 0x%08x \r\n", g_feId, nTemp); pData = (nTemp >> 24) & 0xFF; nRet = LgdtAlterRegi(0x0202, pData); if(nRet != LGDT_ERR_NO) DHL_OS_Printf("FE_ID : %d, Error (%d)LgdtAlterRegi \r\n", g_feId, nRet); pData = (nTemp >> 16) & 0xFF; nRet = LgdtAlterRegi(0x0203, pData); if(nRet != LGDT_ERR_NO) DHL_OS_Printf("FE_ID : %d, Error (%d)LgdtAlterRegi \r\n", g_feId, nRet); pData = (nTemp >> 8) & 0xFF; nRet = LgdtAlterRegi(0x0204, pData); if(nRet != LGDT_ERR_NO) DHL_OS_Printf("FE_ID : %d, Error (%d)LgdtAlterRegi \r\n", g_feId, nRet); pData = nTemp & 0xFF; nRet = LgdtAlterRegi(0x0205, pData); if(nRet != LGDT_ERR_NO) DHL_OS_Printf("FE_ID : %d, Error (%d)LgdtAlterRegi \r\n", g_feId, nRet); } return nRet; } void set_demod(DATA16 addr, DATA08 data) { LgdtAlterRegi(addr, data); DHL_OS_Printf("0x%x = 0x%x\n", addr, data); } void get_demod(DATA16 addr) { DATA08 data = 0xff; LgdtCheckRegi(addr, &data); DHL_OS_Printf("0x%x = 0x%x\n", addr, data); }