xref: /utopia/UTPA2-700.0.x/modules/demodulator/hal/galileo/halDMD_EXTERN_ATSC.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 //    Software and any modification/derivatives thereof.
18 //    No right, ownership, or interest to MStar Software and any
19 //    modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 //    supplied together with third party`s software and the use of MStar
23 //    Software may require additional licenses from third parties.
24 //    Therefore, you hereby agree it is your sole responsibility to separately
25 //    obtain any and all third party right and license necessary for your use of
26 //    such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 //    MStar`s confidential information and you agree to keep MStar`s
30 //    confidential information in strictest confidence and not disclose to any
31 //    third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35 //    without limitation, any warranties of merchantability, non-infringement of
36 //    intellectual property rights, fitness for a particular purpose, error free
37 //    and in conformity with any international standard.  You agree to waive any
38 //    claim against MStar for any loss, damage, cost or expense that you may
39 //    incur related to your use of MStar Software.
40 //    In no event shall MStar be liable for any direct, indirect, incidental or
41 //    consequential damages, including without limitation, lost of profit or
42 //    revenues, lost or damage of data, and unauthorized system use.
43 //    You agree that this Section 4 shall still apply without being affected
44 //    even if MStar Software has been modified by MStar in accordance with your
45 //    request or instruction for your use, except otherwise agreed by both
46 //    parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 //    services in relation with MStar Software to you for your use of
50 //    MStar Software in conjunction with your or your customer`s product
51 //    ("Services").
52 //    You understand and agree that, except otherwise agreed by both parties in
53 //    writing, Services are provided on an "AS IS" basis and the warranty
54 //    disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 //    or otherwise:
58 //    (a) conferring any license or right to use MStar name, trademark, service
59 //        mark, symbol or any other identification;
60 //    (b) obligating MStar or any of its affiliates to furnish any person,
61 //        including without limitation, you and your customers, any assistance
62 //        of any kind whatsoever, or any information; or
63 //    (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 //    of Taiwan, R.O.C., excluding its conflict of law rules.
67 //    Any and all dispute arising out hereof or related hereto shall be finally
68 //    settled by arbitration referred to the Chinese Arbitration Association,
69 //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 //    Rules of the Association by three (3) arbitrators appointed in accordance
71 //    with the said Rules.
72 //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73 //    be English.
74 //    The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 ////////////////////////////////////////////////////////////////////////////////
79 //
80 // Copyright (c) 2006-2009 MStar Semiconductor, Inc.
81 // All rights reserved.
82 //
83 // Unless otherwise stipulated in writing, any and all information contained
84 // herein regardless in any format shall remain the sole proprietary of
85 // MStar Semiconductor Inc. and be kept in strict confidence
86 // (!��MStar Confidential Information!�L) by the recipient.
87 // Any unauthorized act including without limitation unauthorized disclosure,
88 // copying, use, reproduction, sale, distribution, modification, disassembling,
89 // reverse engineering and compiling of the contents of MStar Confidential
90 // Information is unlawful and strictly prohibited. MStar hereby reserves the
91 // rights to any and all damages, losses, costs and expenses resulting therefrom.
92 //
93 ////////////////////////////////////////////////////////////////////////////////
94 
95 
96 //-------------------------------------------------------------------------------------------------
97 //  Include Files
98 //-------------------------------------------------------------------------------------------------
99 
100 #include <stdio.h>
101 #include <math.h>
102 
103 #include "drvDMD_ATSC.h"
104 
105 #include "MsTypes.h"
106 #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
107 #include "drvDMD_common.h"
108 #endif
109 
110 //-------------------------------------------------------------------------------------------------
111 //  Driver Compiler Options
112 //-------------------------------------------------------------------------------------------------
113 
114 #define DMD_ATSC_CHIP_GALILEO       0x01
115 
116 #if defined(galileo)
117 #define DMD_ATSC_CHIP_VERSION       DMD_ATSC_CHIP_GALILEO
118 #endif
119 
120 //-------------------------------------------------------------------------------------------------
121 //  Local Defines
122 //-------------------------------------------------------------------------------------------------
123 
124 #define HAL_EXTERN_ATSC_DBINFO(y)   y
125 
126 #define REG_IIC_BYPASS       0x0910
127 #define SRAM_BASE            0x8000
128 #define REG_MCU_RST          0x0B32
129 #define ATSC_OUTER_REG_BASE  0x2600
130 
131 #define LOAD_CODE_I2C_BLOCK_NUM  0x80
132 
133 #define EXTERN_ATSC_OUTER_STATE           0x80
134 #define EXTERN_ATSC_VSB_TRAIN_SNR_LIMIT   0x05
135 #define EXTERN_ATSC_FEC_ENABLE            0x1F
136 
137 #define VSB_ATSC           0x04
138 #define QAM256_ATSC        0x02
139 
140 #define I2C_SLAVE_ID            ((pRes->sDMD_ATSC_InitData.u8I2CSlaveBus<<8) | pRes->sDMD_ATSC_InitData.u8I2CSlaveAddr)
141 
142 //-------------------------------------------------------------------------------------------------
143 //  Local Variables
144 //-------------------------------------------------------------------------------------------------
145 
146 const MS_U8 EXTERN_ATSC_table[] = {
147     #include "DMD_EXTERN_ATSC.dat"
148 };
149 
150 static MS_U16 u16Lib_size = sizeof(EXTERN_ATSC_table);
151 
152 //-------------------------------------------------------------------------------------------------
153 //  Global Variables
154 //-------------------------------------------------------------------------------------------------
155 
156 extern MS_U8 u8DMD_ATSC_DMD_ID;
157 
158 extern DMD_ATSC_ResData *psDMD_ATSC_ResData;
159 
160 //-------------------------------------------------------------------------------------------------
161 //  Local Functions
162 //-------------------------------------------------------------------------------------------------
_I2C_READ_BYTE(MS_U16 u16Addr,MS_U8 * pu8Data)163 static MS_BOOL _I2C_READ_BYTE(MS_U16 u16Addr, MS_U8 *pu8Data)
164 {
165     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + u8DMD_ATSC_DMD_ID;
166 
167     MS_BOOL bRet = TRUE;
168     MS_U8 u8MsbData[6] = {0};
169 
170     u8MsbData[0] = 0x10;
171     u8MsbData[1] = 0x00;
172     u8MsbData[2] = 0x00;
173     u8MsbData[3] = (u16Addr >> 8) &0xff;
174     u8MsbData[4] = u16Addr &0xff;
175 
176     u8MsbData[0] = 0x35;
177     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, 0, 1, u8MsbData);
178 
179     u8MsbData[0] = 0x10;
180     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, 0, 5, u8MsbData);
181     bRet &= pRes->sDMD_ATSC_InitData.I2C_ReadBytes(I2C_SLAVE_ID, 0, 0, 1, pu8Data);
182 
183     u8MsbData[0] = 0x34;
184     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, 0, 1, u8MsbData);
185 
186     return bRet;
187 }
188 
_I2C_WRITE_BYTE(MS_U16 u16Addr,MS_U8 u8Data)189 static MS_BOOL _I2C_WRITE_BYTE(MS_U16 u16Addr, MS_U8 u8Data)
190 {
191     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + u8DMD_ATSC_DMD_ID;
192 
193     MS_BOOL bRet = TRUE;
194     MS_U8 u8MsbData[6] = {0};
195 
196     u8MsbData[0] = 0x10;
197     u8MsbData[1] = 0x00;
198     u8MsbData[2] = 0x00;
199     u8MsbData[3] = (u16Addr >> 8) &0xff;
200     u8MsbData[4] = u16Addr &0xff;
201     u8MsbData[5] = u8Data;
202 
203     u8MsbData[0] = 0x35;
204     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, 0, 1, u8MsbData);
205     u8MsbData[0] = 0x10;
206     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, 0, 6, u8MsbData);
207     u8MsbData[0] = 0x34;
208     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, 0, 1, u8MsbData);
209 
210     return bRet;
211 }
212 
_I2C_WRITE_BYTES(MS_U16 u16Addr,MS_U8 * u8Data,MS_U8 u8Len)213 static MS_BOOL _I2C_WRITE_BYTES(MS_U16 u16Addr, MS_U8 *u8Data, MS_U8 u8Len)
214 {
215     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + u8DMD_ATSC_DMD_ID;
216 
217     MS_BOOL bRet = TRUE;
218     MS_U16 index;
219     MS_U8 Data[0x80+5];
220 
221     Data[0] = 0x10;
222     Data[1] = 0x00;
223     Data[2] = 0x00;
224     Data[3] = (u16Addr >> 8) &0xff;
225     Data[4] = u16Addr &0xff;
226 
227     for(index = 0; index < u8Len ; index++)
228     {
229          Data[5+index] = u8Data[index];
230     }
231 
232     Data[0] = 0x35;
233     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, 0, 1, Data);
234     Data[0] = 0x10;
235     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, 0, 1, Data);
236     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, 0, (5 + u8Len), Data);
237     Data[0] = 0x34;
238     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, 0, 1, Data);
239 
240     return bRet;
241 }
242 
_I2C_Channel_Set(MS_U8 ch_num)243 static MS_BOOL _I2C_Channel_Set(MS_U8 ch_num)
244 {
245     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + u8DMD_ATSC_DMD_ID;
246 
247     MS_BOOL bRet = TRUE;
248     MS_U8 Data[5] = {0x53, 0x45, 0x52, 0x44, 0x42};
249 
250     //Exit
251     Data[0] = 0x34;
252     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, NULL, 1, Data);
253     Data[0]=(ch_num & 0x01)? 0x36 : 0x45;
254     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, NULL, 1, Data);
255 
256     //Init
257     Data[0] = 0x53;
258     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, NULL, 5, Data);
259     Data[0]=(ch_num & 0x04)? 0x80 : 0x81;
260     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, NULL, 1, Data);
261 
262     if ((ch_num==4)||(ch_num==5)||(ch_num==1))
263         Data[0] = 0x82;
264     else
265         Data[0] = 0x83;
266 
267     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, NULL, 1, Data);
268 
269     if ((ch_num==4)||(ch_num==5))
270         Data[0]=0x85;
271     else
272         Data[0] = 0x84;
273 
274     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, NULL, 1, Data);
275     Data[0]=(ch_num & 0x01)? 0x51 : 0x53;
276     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, NULL, 1, Data);
277     Data[0]=(ch_num & 0x01)? 0x37 : 0x7F;
278     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, NULL, 1, Data);
279     Data[0] = 0x35;
280     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, NULL, 1, Data);
281     Data[0] = 0x71;
282     bRet &= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, NULL, 1, Data);
283 
284     return bRet;
285 }
286 
_I2C_Channel_Change(MS_U8 ch_num)287 static MS_BOOL _I2C_Channel_Change(MS_U8 ch_num)
288 {
289     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + u8DMD_ATSC_DMD_ID;
290 
291     MS_BOOL bRet = TRUE;
292     MS_U8 Data[5] = {0x53, 0x45, 0x52, 0x44, 0x42};
293 
294     Data[0] = (ch_num & 0x01)? 0x81 : 0x80;
295     bRet&= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, 0, 1, Data);
296     Data[0] = (ch_num & 0x02)? 0x83 : 0x82;
297     bRet&= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, 0, 1, Data);
298     Data[0] = (ch_num & 0x04)? 0x85 : 0x84;
299     bRet&= pRes->sDMD_ATSC_InitData.I2C_WriteBytes(I2C_SLAVE_ID, 0, 0, 1, Data);
300 
301     return bRet;
302 }
303 
_HAL_EXTERN_ATSC_InitClk(void)304 static void _HAL_EXTERN_ATSC_InitClk(void)
305 {
306     _I2C_Channel_Set(0);
307 
308     _I2C_Channel_Change(3);
309 }
310 
_HAL_EXTERN_ATSC_Download(void)311 static MS_BOOL _HAL_EXTERN_ATSC_Download(void)
312 {
313     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + u8DMD_ATSC_DMD_ID;
314 
315     MS_BOOL bRet = TRUE;
316     MS_U16 index;
317     MS_U16 SRAM_Address;
318     #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
319     MS_U32 SRAM_SSPI_Address;
320     #endif
321     MS_U8  u8TmpData;
322     MS_U16 u16AddressOffset = 0x6B80;
323     MS_U8  u8OrgSPISetting = 0x00;
324 
325     if (pRes->sDMD_ATSC_PriData.bDownloaded)
326     {
327         // Enable MCU Reset
328         bRet&=_I2C_WRITE_BYTE(REG_MCU_RST, 0x03);
329 
330         // Disable MCU Reset
331         bRet&=_I2C_WRITE_BYTE(REG_MCU_RST, 0x00);
332 
333         #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
334         MsOS_DelayTask(20);
335         #else
336         pRes->sDMD_ATSC_InitData.DelayMS(20);
337         #endif
338 
339         return bRet;
340     }
341 
342     // Enable MCU Reset
343     bRet&=_I2C_WRITE_BYTE(REG_MCU_RST, 0x03);
344 
345     bRet&=_I2C_Channel_Change(0);
346 
347     // Disable Watch-Dog
348     bRet&=_I2C_WRITE_BYTE(0x3008, 0x00);
349     bRet&=_I2C_WRITE_BYTE(0x3009, 0x00);
350     bRet&=_I2C_WRITE_BYTE(0x300A, 0x00);
351     bRet&=_I2C_WRITE_BYTE(0x300B, 0x00);
352 
353     bRet&=_I2C_Channel_Change(3);
354 
355     // Enable SRAM XDATA mapping
356     bRet&=_I2C_WRITE_BYTE(0x10E1, 0x20); // Start address
357     bRet&=_I2C_WRITE_BYTE(0x10E0, 0x3F); // End address
358     bRet&=_I2C_WRITE_BYTE(0x10E6, 0x08);
359 
360     if (pRes->sDMD_ATSC_InitData.bIsUseSspiLoadCode == TRUE)
361     {
362         #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
363         //turn on all pad in
364         bRet&=_I2C_WRITE_BYTE(0x0950, 0x00);
365         bRet&=_I2C_WRITE_BYTE(0x0951, 0x00);
366 
367         if (pRes->sDMD_ATSC_InitData.bIsSspiUseTsPin == TRUE)
368         {
369             printf("##### MSPI USE TS PIN : ENABLE #####\n");
370             bRet = _I2C_READ_BYTE(0x0976, &u8TmpData);
371             u8OrgSPISetting = u8TmpData;
372             u8TmpData &= ~0x03;
373             u8TmpData |= 0x02;
374             bRet = _I2C_WRITE_BYTE(0x0976, u8TmpData);
375         }
376         #endif
377     }
378 
379     bRet&=_I2C_Channel_Change(0);
380 
381     if (pRes->sDMD_ATSC_InitData.bIsUseSspiLoadCode == FALSE)
382     {
383         for (index = 0; index < u16Lib_size; )
384         {
385             SRAM_Address = SRAM_BASE + index;
386             if (index+LOAD_CODE_I2C_BLOCK_NUM-1<u16Lib_size)
387             {
388                 bRet&= _I2C_WRITE_BYTES(SRAM_Address, (MS_U8 *)(EXTERN_ATSC_table+index), LOAD_CODE_I2C_BLOCK_NUM);
389                 index=index+LOAD_CODE_I2C_BLOCK_NUM-1;
390             }
391             else
392             {
393                 bRet&=_I2C_WRITE_BYTES(SRAM_Address, (MS_U8 *)(EXTERN_ATSC_table+index), u16Lib_size-index);
394                 index=u16Lib_size;
395             }
396         }
397 
398         HAL_EXTERN_ATSC_DBINFO(printf("ATSC firmware code size = 0x[%x]\n", u16Lib_size));
399 
400         if(u16Lib_size >= 0x6b80)
401         {
402             HAL_EXTERN_ATSC_DBINFO(printf("Firmware code size over 0x6B80!!!\n"));
403             bRet = FALSE;
404         }
405     }
406     #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
407     else
408     {
409         printf("##### _HAL_EXTERN_ATSC_Download by MSPI #####\n");
410 
411         MDrv_DMD_SSPI_Init(0);
412 
413         SRAM_SSPI_Address = 0x80000000;
414 
415         MDrv_DMD_SSPI_RIU_Read8(0x0974, &u8TmpData);
416         u8TmpData |= 0x10;
417         MDrv_DMD_SSPI_RIU_Write8(0x0974, u8TmpData);
418 
419         MDrv_DMD_SSPI_MIU_Writes(SRAM_SSPI_Address, (MS_U8 *)EXTERN_ATSC_table, u16Lib_size);
420 
421         MDrv_DMD_SSPI_RIU_Read8(0x0974, &u8TmpData);
422         u8TmpData &= ~0x10;
423         MDrv_DMD_SSPI_RIU_Write8(0x0974, u8TmpData);
424     }
425     #endif
426 
427     //Set IF value
428     SRAM_Address = SRAM_BASE + u16AddressOffset + 0x0F;//BACKEND_IF_KHZ_0
429     u8TmpData = (pRes->sDMD_ATSC_InitData.u16IF_KHZ) & 0xFF;
430     bRet&=_I2C_WRITE_BYTE(SRAM_Address, u8TmpData);
431 
432     SRAM_Address = SRAM_BASE + u16AddressOffset + 0x10;//BACKEND_IF_KHZ_1
433     u8TmpData = (pRes->sDMD_ATSC_InitData.u16IF_KHZ) >> 8;
434     bRet&=_I2C_WRITE_BYTE(SRAM_Address, u8TmpData);
435 
436     //Set TS mode
437     SRAM_Address = SRAM_BASE + u16AddressOffset + 0x0C;//TS_SERIAL MODE
438     u8TmpData = (pRes->sDMD_ATSC_InitData.u5TsConfigByte_DivNum << 3) |
439                 (pRes->sDMD_ATSC_InitData.u1TsConfigByte_ClockInv << 2) |
440                 (pRes->sDMD_ATSC_InitData.u1TsConfigByte_DataSwap << 1) |
441                 (pRes->sDMD_ATSC_InitData.u1TsConfigByte_SerialMode);
442     bRet&=_I2C_WRITE_BYTE(SRAM_Address, u8TmpData);
443     //Set IQSwap mode
444     SRAM_Address = SRAM_BASE + u16AddressOffset + 0x0E;//BACKEND_DMD_IQ_SWAP
445     u8TmpData = pRes->sDMD_ATSC_InitData.bIQSwap;
446     bRet&=_I2C_WRITE_BYTE(SRAM_Address, u8TmpData);
447 
448     bRet&=_I2C_Channel_Change(3);
449 
450     //Set I&Q pad
451     if (pRes->sDMD_ATSC_InitData.bIsQPad)
452     {
453         _I2C_WRITE_BYTE(0x0A33, 0x2E);
454         _I2C_WRITE_BYTE(0x0A2E, 0x01);
455 
456         HAL_EXTERN_ATSC_DBINFO(printf("select Q pad source\n"));
457     }
458     else
459     {
460         _I2C_WRITE_BYTE(0x0A33, 0x1E);
461         _I2C_WRITE_BYTE(0x0A2E, 0x00);
462 
463         HAL_EXTERN_ATSC_DBINFO(printf("select I pad source\n"));
464     }
465 
466     if (pRes->sDMD_ATSC_InitData.bIsUseSspiLoadCode == TRUE)
467     {
468         #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
469         if (pRes->sDMD_ATSC_InitData.bIsSspiUseTsPin == TRUE)
470         {
471             printf("##### MSPI USE TS PIN : DISABLE #####\n");
472             bRet = _I2C_READ_BYTE(0x0976, &u8TmpData);
473             u8TmpData = u8OrgSPISetting;
474             bRet = _I2C_WRITE_BYTE(0x0976, u8TmpData);
475         }
476         #endif
477     }
478 
479     // Disable SRAM XDATA mapping
480     bRet&=_I2C_WRITE_BYTE(0x10E6, 0x00);
481 
482     // Set program SRAM start address
483     bRet&=_I2C_WRITE_BYTE(0x1004, 0x00);
484     bRet&=_I2C_WRITE_BYTE(0x1005, 0x00);
485     bRet&=_I2C_WRITE_BYTE(0x1000, 0x00);
486 
487     // Set program SRAM end address
488     bRet&=_I2C_WRITE_BYTE(0x1006, 0x7F);
489     bRet&=_I2C_WRITE_BYTE(0x1007, 0xFF);
490     bRet&=_I2C_WRITE_BYTE(0x1002, 0x00);
491 
492     // Boot from SRAM
493     bRet&=_I2C_WRITE_BYTE(0x1018, 0x01);
494 
495     // Disable MCU Reset
496     bRet&=_I2C_WRITE_BYTE(REG_MCU_RST, 0x00);
497 
498     pRes->sDMD_ATSC_PriData.bDownloaded = true;
499 
500     #if DMD_ATSC_UTOPIA_EN || DMD_ATSC_UTOPIA2_EN
501     MsOS_DelayTask(20);
502     #else
503     pRes->sDMD_ATSC_InitData.DelayMS(20);
504     #endif
505 
506     return TRUE;
507 }
508 
_HAL_EXTERN_ATSC_FWVERSION(void)509 static void _HAL_EXTERN_ATSC_FWVERSION(void)
510 {
511     MS_U8 data1,data2,data3;
512 
513     _I2C_READ_BYTE(0x0995, &data1);//REG_BASE[DMDTOP_WR_DBG_04]
514     _I2C_READ_BYTE(0x0B54, &data2);//REG_BASE[DMDTOP_WR_DBG_15]
515     _I2C_READ_BYTE(0x0B55, &data3);//REG_BASE[DMDTOP_WR_DBG_16]
516 
517     HAL_EXTERN_ATSC_DBINFO(printf("EXTERN_ATSC_FW_VERSION:%x.%x.%x\n", data1, data2, data3));
518 }
519 
_HAL_EXTERN_ATSC_Exit(void)520 static MS_BOOL _HAL_EXTERN_ATSC_Exit(void)
521 {
522     MS_BOOL bRet = TRUE;
523     MS_U8 u8Data = 0xFF;
524 
525     //Reset FSM
526     if (_I2C_WRITE_BYTE(0x0990, 0x00)==FALSE) return FALSE;
527 
528     while (!u8Data)
529     {
530         if (_I2C_READ_BYTE(0x0992, &u8Data)==FALSE) return FALSE;
531     }
532 
533     // Disable TS pad
534     bRet = _I2C_READ_BYTE(0x095A, &u8Data);
535     u8Data = 0x00;
536     bRet = _I2C_WRITE_BYTE(0x095A, u8Data);
537 
538     // [0][4] ifagc/rfagc disable
539     bRet = _I2C_READ_BYTE(0x0a30, &u8Data);
540     u8Data &= ~0x11;
541     bRet = _I2C_WRITE_BYTE(0x0a30, u8Data);
542 
543     return bRet;
544 }
545 
_HAL_EXTERN_ATSC_SoftReset(void)546 static MS_BOOL _HAL_EXTERN_ATSC_SoftReset(void)
547 {
548     MS_U8 u8Data = 0xFF;
549 
550     //Reset FSM
551     if (_I2C_WRITE_BYTE(0x0990, 0x00)==FALSE) return FALSE;
552 
553     while (u8Data != 0x0)
554     {
555         if (_I2C_READ_BYTE(0x0992, &u8Data)==FALSE) return FALSE;
556     }
557 
558     //Execute demod top reset
559     _I2C_READ_BYTE(0x0B20, &u8Data);
560     _I2C_WRITE_BYTE(0x0B20, (u8Data|0x01));
561     return _I2C_WRITE_BYTE(0x0B20, (u8Data&(~0x01)));
562 }
563 
_HAL_EXTERN_ATSC_SetVsbMode(void)564 static MS_BOOL _HAL_EXTERN_ATSC_SetVsbMode(void)
565 {
566     return _I2C_WRITE_BYTE(0x0990, 0x08);
567 }
568 
_HAL_EXTERN_ATSC_Set64QamMode(void)569 static MS_BOOL _HAL_EXTERN_ATSC_Set64QamMode(void)
570 {
571     _I2C_WRITE_BYTE(0x0C1B, 0x00); // Clear QAM&SR force mode
572 
573     if (_I2C_WRITE_BYTE(0x0994, 0x00)==FALSE) return FALSE;
574     return _I2C_WRITE_BYTE(0x0990, 0x04);
575 }
576 
_HAL_EXTERN_ATSC_Set256QamMode(void)577 static MS_BOOL _HAL_EXTERN_ATSC_Set256QamMode(void)
578 {
579     _I2C_WRITE_BYTE(0x0C1B, 0x00); // Clear QAM&SR force mode
580 
581     if (_I2C_WRITE_BYTE(0x0994, 0x01)==FALSE) return FALSE;
582     return _I2C_WRITE_BYTE(0x0990, 0x04);
583 }
584 
_HAL_EXTERN_ATSC_SetModeClean(void)585 static MS_BOOL _HAL_EXTERN_ATSC_SetModeClean(void)
586 {
587     _I2C_WRITE_BYTE(0x0C1B, 0x00); // Clear QAM&SR force mode
588 
589     return _I2C_WRITE_BYTE(0x0990, 0x00);
590 }
591 
_HAL_EXTERN_ATSC_Set_QAM_SR(void)592 static MS_BOOL _HAL_EXTERN_ATSC_Set_QAM_SR(void)
593 {
594     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + u8DMD_ATSC_DMD_ID;
595 
596     MS_U8 data1,data2,data3;
597 
598     data1 = (pRes->sDMD_ATSC_PriData.eLastType-1) | 0x80;
599     data2 = pRes->sDMD_ATSC_PriData.u16SymRate & 0xFF;
600     data3 = (pRes->sDMD_ATSC_PriData.u16SymRate>>8) & 0xFF;
601 
602     _I2C_WRITE_BYTE(0x0C1B, data1);
603     _I2C_WRITE_BYTE(0x0C1C, data2);
604     _I2C_WRITE_BYTE(0x0C1D, data3);
605 
606     printf("QAM type 0x%x SR %d\n",pRes->sDMD_ATSC_PriData.eLastType-1,pRes->sDMD_ATSC_PriData.u16SymRate);
607 
608     return _I2C_WRITE_BYTE(0x0990, 0x04);
609 }
610 
_HAL_EXTERN_ATSC_Check8VSB64_256QAM(void)611 static DMD_ATSC_DEMOD_TYPE _HAL_EXTERN_ATSC_Check8VSB64_256QAM(void)
612 {
613     MS_U8 mode=0;
614 
615     _I2C_READ_BYTE(0x2900, &mode); //mode check
616 
617     if ((mode&VSB_ATSC) == VSB_ATSC) return DMD_ATSC_DEMOD_ATSC_VSB;
618     else if ((mode & QAM256_ATSC) == QAM256_ATSC) return DMD_ATSC_DEMOD_ATSC_256QAM;
619     else return DMD_ATSC_DEMOD_ATSC_64QAM;
620 }
621 
_HAL_EXTERN_ATSC_Vsb_QAM_AGCLock(void)622 static MS_BOOL _HAL_EXTERN_ATSC_Vsb_QAM_AGCLock(void)
623 {
624     MS_U8 data1 = 0;
625 
626     _I2C_READ_BYTE(0x3E1D, &data1);//AGC_LOCK
627 
628     if (data1&0x01)
629     {
630         return TRUE;
631     }
632     else
633     {
634         return FALSE;
635     }
636 }
637 
_HAL_EXTERN_ATSC_Vsb_PreLock(void)638 static MS_BOOL _HAL_EXTERN_ATSC_Vsb_PreLock(void)
639 {
640     MS_U8 data1 = 0;
641 
642     _I2C_READ_BYTE(0x0993, &data1);
643 
644     if ((data1&0x02) == 0x02)
645     {
646         return TRUE;
647     }
648     else
649     {
650         return FALSE;
651     }
652 }
653 
_HAL_EXTERN_ATSC_Vsb_FSync_Lock(void)654 static MS_BOOL _HAL_EXTERN_ATSC_Vsb_FSync_Lock(void)
655 {
656     MS_U8 data1 = 0;
657 
658     _I2C_READ_BYTE(0x2824, &data1);
659 
660     if ((data1&0x10) == 0x10)
661     {
662         return TRUE;
663     }
664     else
665     {
666         return FALSE;
667     }
668 }
669 
_HAL_EXTERN_ATSC_Vsb_CE_Lock(void)670 static MS_BOOL _HAL_EXTERN_ATSC_Vsb_CE_Lock(void)
671 {
672     MS_U8 data1 = 0;
673 
674     if((data1&0x10) == 0)
675     {
676         return TRUE;
677     }
678     else
679     {
680         return FALSE;
681     }
682 }
683 
_HAL_EXTERN_ATSC_Vsb_FEC_Lock(void)684 static MS_BOOL _HAL_EXTERN_ATSC_Vsb_FEC_Lock(void)
685 {
686     MS_U8 data1 = 0, data2 = 0, data3 = 0, data4 = 0, data5 = 0;
687     MS_U8 data6 = 0, data7 = 0;
688 
689     _I2C_READ_BYTE(0x0992, &data1);
690     _I2C_READ_BYTE(0x1917, &data2);//AD_NOISE_PWR_TRAIN1
691     _I2C_READ_BYTE(0x0993, &data3);
692     _I2C_READ_BYTE(0x2601, &data4);//FEC_EN_CTL
693     _I2C_READ_BYTE(0x2767, &data5);//EQEXT_REG_BASE//addy
694     _I2C_READ_BYTE(0x0D01, &data6);
695     _I2C_READ_BYTE(0x0D40, &data7);
696 
697 	if (data1==EXTERN_ATSC_OUTER_STATE && (data2<=EXTERN_ATSC_VSB_TRAIN_SNR_LIMIT || data5 <= EXTERN_ATSC_VSB_TRAIN_SNR_LIMIT) &&
698 	    (data3&0x02)==0x02 && (data4&EXTERN_ATSC_FEC_ENABLE)==EXTERN_ATSC_FEC_ENABLE && ((data6&0x10) == 0x10) && ((data7&0x01) == 0x01))
699     {
700         return TRUE;
701     }
702     else
703     {
704         return FALSE;
705     }
706 }
707 
_HAL_EXTERN_ATSC_QAM_PreLock(void)708 static MS_BOOL _HAL_EXTERN_ATSC_QAM_PreLock(void)
709 {
710     MS_U8 data1=0;
711 
712     _I2C_READ_BYTE(0x1415, &data1);//TR_LOCK
713 
714     if((data1&0x10) == 0x10)
715     {
716         HAL_EXTERN_ATSC_DBINFO(printf("    QAM preLock OK  \n"));
717         return TRUE;
718     }
719     else
720     {
721         HAL_EXTERN_ATSC_DBINFO(printf("    QAM preLock NOT OK   \n"));
722         return FALSE;
723     }
724 }
725 
_HAL_EXTERN_ATSC_QAM_Main_Lock(void)726 static MS_BOOL _HAL_EXTERN_ATSC_QAM_Main_Lock(void)
727 {
728     MS_U8 data1 = 0, data4 = 0, data5 = 0, data6 = 0;
729     MS_U8 data2 = 0, data3 = 0;
730 
731     _I2C_READ_BYTE(0x0992, &data1);
732     _I2C_READ_BYTE(0x2601, &data4);//FEC_EN_CTL
733     _I2C_READ_BYTE(0x0D01, &data5);
734     _I2C_READ_BYTE(0x0D40, &data6);
735     _I2C_READ_BYTE(0x1415, &data3);//TR_LOCK
736     _I2C_READ_BYTE(0x2618, &data2);//boundary detected
737 
738     if (data1==EXTERN_ATSC_OUTER_STATE && (data2&0x01)==0x01 &&
739         data4==EXTERN_ATSC_FEC_ENABLE && (data3&0x10)==0x10 &&
740         ((data5&0x10) == 0x10) && ((data6&0x01) == 0x01))
741     {
742         return TRUE;
743     }
744     else
745     {
746         return FALSE;
747     }
748 }
749 
_HAL_EXTERN_ATSC_ReadIFAGC(void)750 static MS_U8 _HAL_EXTERN_ATSC_ReadIFAGC(void)
751 {
752     MS_U8 data = 0;
753 
754     _I2C_READ_BYTE(0x13FD, &data);
755 
756     return data;
757 }
758 
_HAL_EXTERN_ATSC_CheckSignalCondition(DMD_ATSC_SIGNAL_CONDITION * pstatus)759 static void _HAL_EXTERN_ATSC_CheckSignalCondition(DMD_ATSC_SIGNAL_CONDITION* pstatus)
760 {
761     DMD_ATSC_DEMOD_TYPE eMode;
762     MS_U8 u8NoisePowerH=0;
763     static MS_U8 u8NoisePowerH_Last = 0xff;
764 
765     eMode = _HAL_EXTERN_ATSC_Check8VSB64_256QAM();
766 
767     _I2C_READ_BYTE(0x1915, &u8NoisePowerH);
768 
769     if (eMode == DMD_ATSC_DEMOD_ATSC_VSB) //VSB mode//SNR=10*log10((1344<<10)/noisepower)
770     {
771         if (!_HAL_EXTERN_ATSC_Vsb_FEC_Lock()) u8NoisePowerH=0xFF;
772         else if (abs(u8NoisePowerH_Last-u8NoisePowerH) > 5)
773             u8NoisePowerH_Last = u8NoisePowerH;
774         else u8NoisePowerH = u8NoisePowerH_Last;
775 
776         if (u8NoisePowerH > 0xBE) //SNR<14.5
777             *pstatus=DMD_ATSC_SIGNAL_NO;
778         else if (u8NoisePowerH > 0x4D) //SNR<18.4
779             *pstatus=DMD_ATSC_SIGNAL_WEAK;
780         else if (u8NoisePowerH > 0x23) //SNR<21.8
781             *pstatus=DMD_ATSC_SIGNAL_MODERATE;
782         else if (u8NoisePowerH > 0x0A) //SNR<26.9
783             *pstatus=DMD_ATSC_SIGNAL_STRONG;
784         else
785             *pstatus=DMD_ATSC_SIGNAL_VERY_STRONG;
786     }
787     else //QAM MODE
788     {
789         if (!_HAL_EXTERN_ATSC_QAM_Main_Lock()) u8NoisePowerH=0xFF;
790         else if (abs(u8NoisePowerH_Last-u8NoisePowerH) > 5)
791             u8NoisePowerH_Last = u8NoisePowerH;
792         else u8NoisePowerH = u8NoisePowerH_Last;
793 
794         if (eMode == DMD_ATSC_DEMOD_ATSC_256QAM) //256QAM//SNR=10*log10((2720<<10)/noisepower)
795         {
796             if (u8NoisePowerH > 0x13) //SNR<27.5
797                 *pstatus=DMD_ATSC_SIGNAL_NO;
798             else if (u8NoisePowerH > 0x08) //SNR<31.2
799                 *pstatus=DMD_ATSC_SIGNAL_WEAK;
800             else if (u8NoisePowerH > 0x06) //SNR<32.4
801                 *pstatus=DMD_ATSC_SIGNAL_MODERATE;
802             else if (u8NoisePowerH > 0x04) //SNR<34.2
803                 *pstatus=DMD_ATSC_SIGNAL_STRONG;
804             else
805                 *pstatus=DMD_ATSC_SIGNAL_VERY_STRONG;
806         }
807         else //64QAM//SNR=10*log10((2688<<10)/noisepower)
808         {
809             if (u8NoisePowerH > 0x4C) //SNR<21.5
810                 *pstatus=DMD_ATSC_SIGNAL_NO;
811             else if (u8NoisePowerH > 0x1F) //SNR<25.4
812                 *pstatus=DMD_ATSC_SIGNAL_WEAK;
813             else if (u8NoisePowerH > 0x11) //SNR<27.8
814                 *pstatus=DMD_ATSC_SIGNAL_MODERATE;
815             else if (u8NoisePowerH > 0x07) //SNR<31.4
816                 *pstatus=DMD_ATSC_SIGNAL_STRONG;
817             else
818                 *pstatus=DMD_ATSC_SIGNAL_VERY_STRONG;
819         }
820     }
821 }
822 
_HAL_EXTERN_ATSC_ReadSNRPercentage(void)823 static MS_U8 _HAL_EXTERN_ATSC_ReadSNRPercentage(void)
824 {
825     DMD_ATSC_DEMOD_TYPE eMode;
826     MS_U8 u8NoisePowerH = 0, u8NoisePowerL = 0;
827     MS_U16 u16NoisePower;
828 
829     eMode = _HAL_EXTERN_ATSC_Check8VSB64_256QAM();
830 
831     _I2C_READ_BYTE(0x1914, &u8NoisePowerL);
832     _I2C_READ_BYTE(0x1915, &u8NoisePowerH);
833 
834     u16NoisePower = (u8NoisePowerH<<8) | u8NoisePowerL;
835 
836     if(eMode == DMD_ATSC_DEMOD_ATSC_VSB) //VSB mode//SNR=10*log10((1344<<10)/noisepower)
837     {
838         if (!_HAL_EXTERN_ATSC_Vsb_FEC_Lock())
839             return 0;//SNR=0;
840         else if (u16NoisePower<=0x008A)//SNR>=40dB
841             return 100;//SNR=MAX_SNR;
842         else if (u16NoisePower<=0x0097)//SNR>=39.6dB
843             return 99;//
844         else if (u16NoisePower<=0x00A5)//SNR>=39.2dB
845             return 98;//
846         else if (u16NoisePower<=0x00B5)//SNR>=38.8dB
847             return 97;//
848         else if (u16NoisePower<=0x00C7)//SNR>=38.4dB
849             return 96;//
850         else if (u16NoisePower<=0x00DA)//SNR>=38.0dB
851             return 95;//
852         else if (u16NoisePower<=0x00EF)//SNR>=37.6dB
853             return 94;//
854         else if (u16NoisePower<=0x0106)//SNR>=37.2dB
855             return 93;//
856         else if (u16NoisePower<=0x0120)//SNR>=36.8dB
857             return 92;//
858         else if (u16NoisePower<=0x013B)//SNR>=36.4dB
859             return 91;//
860         else if (u16NoisePower<=0x015A)//SNR>=36.0dB
861             return 90;//
862         else if (u16NoisePower<=0x017B)//SNR>=35.6dB
863             return 89;//
864         else if (u16NoisePower<=0x01A0)//SNR>=35.2dB
865             return 88;//
866         else if (u16NoisePower<=0x01C8)//SNR>=34.8dB
867             return 87;//
868         else if (u16NoisePower<=0x01F4)//SNR>=34.4dB
869             return 86;//
870         else if (u16NoisePower<=0x0224)//SNR>=34.0dB
871             return 85;//
872         else if (u16NoisePower<=0x0259)//SNR>=33.6dB
873             return 84;//
874         else if (u16NoisePower<=0x0293)//SNR>=33.2dB
875             return 83;//
876         else if (u16NoisePower<=0x02D2)//SNR>=32.8dB
877             return 82;//
878         else if (u16NoisePower<=0x0318)//SNR>=32.4dB
879             return 81;//
880         else if (u16NoisePower<=0x0364)//SNR>=32.0dB
881             return 80;//
882         else if (u16NoisePower<=0x03B8)//SNR>=31.6dB
883             return 79;//
884         else if (u16NoisePower<=0x0414)//SNR>=31.2dB
885             return 78;//
886         else if (u16NoisePower<=0x0479)//SNR>=30.8dB
887             return 77;//
888         else if (u16NoisePower<=0x04E7)//SNR>=30.4dB
889             return 76;//
890         else if (u16NoisePower<=0x0560)//SNR>=30.0dB
891             return 75;//
892         else if (u16NoisePower<=0x05E5)//SNR>=29.6dB
893             return 74;//
894         else if (u16NoisePower<=0x0677)//SNR>=29.2dB
895             return 73;//
896         else if (u16NoisePower<=0x0716)//SNR>=28.8dB
897             return 72;//
898         else if (u16NoisePower<=0x07C5)//SNR>=28.4dB
899             return 71;//
900         else if (u16NoisePower<=0x0885)//SNR>=28.0dB
901             return 70;//
902         else if (u16NoisePower<=0x0958)//SNR>=27.6dB
903             return 69;//
904         else if (u16NoisePower<=0x0A3E)//SNR>=27.2dB
905             return 68;//
906         else if (u16NoisePower<=0x0B3B)//SNR>=26.8dB
907             return 67;//
908         else if (u16NoisePower<=0x0C51)//SNR>=26.4dB
909             return 66;//
910         else if (u16NoisePower<=0x0D81)//SNR>=26.0dB
911             return 65;//
912         else if (u16NoisePower<=0x0ECF)//SNR>=25.6dB
913             return 64;//
914         else if (u16NoisePower<=0x103C)//SNR>=25.2dB
915             return 63;//
916         else if (u16NoisePower<=0x11CD)//SNR>=24.8dB
917             return 62;//
918         else if (u16NoisePower<=0x1385)//SNR>=24.4dB
919             return 61;//
920         else if (u16NoisePower<=0x1567)//SNR>=24.0dB
921             return 60;//
922         else if (u16NoisePower<=0x1778)//SNR>=23.6dB
923             return 59;//
924         else if (u16NoisePower<=0x19BB)//SNR>=23.2dB
925             return 58;//
926         else if (u16NoisePower<=0x1C37)//SNR>=22.8dB
927             return 57;//
928         else if (u16NoisePower<=0x1EF0)//SNR>=22.4dB
929             return 56;//
930         else if (u16NoisePower<=0x21EC)//SNR>=22.0dB
931             return 55;//
932         else if (u16NoisePower<=0x2531)//SNR>=21.6dB
933             return 54;//
934         else if (u16NoisePower<=0x28C8)//SNR>=21.2dB
935             return 53;//
936         else if (u16NoisePower<=0x2CB7)//SNR>=20.8dB
937             return 52;//
938         else if (u16NoisePower<=0x3108)//SNR>=20.4dB
939             return 51;//
940         else if (u16NoisePower<=0x35C3)//SNR>=20.0dB
941             return 50;//
942         else if (u16NoisePower<=0x3AF2)//SNR>=19.6dB
943             return 49;//
944         else if (u16NoisePower<=0x40A2)//SNR>=19.2dB
945             return 48;//
946         else if (u16NoisePower<=0x46DF)//SNR>=18.8dB
947             return 47;//
948         else if (u16NoisePower<=0x4DB5)//SNR>=18.4dB
949             return 46;//
950         else if (u16NoisePower<=0x5534)//SNR>=18.0dB
951             return 45;//
952         else if (u16NoisePower<=0x5D6D)//SNR>=17.6dB
953             return 44;//
954         else if (u16NoisePower<=0x6670)//SNR>=17.2dB
955             return 43;//
956         else if (u16NoisePower<=0x7052)//SNR>=16.8dB
957             return 42;//
958         else if (u16NoisePower<=0x7B28)//SNR>=16.4dB
959             return 41;//
960         else if (u16NoisePower<=0x870A)//SNR>=16.0dB
961             return 40;//
962         else if (u16NoisePower<=0x9411)//SNR>=15.6dB
963             return 39;//
964         else if (u16NoisePower<=0xA25A)//SNR>=15.2dB
965             return 38;//
966         else if (u16NoisePower<=0xB204)//SNR>=14.8dB
967             return 37;//
968         else if (u16NoisePower<=0xC331)//SNR>=14.4dB
969             return 36;//
970         else if (u16NoisePower<=0xD606)//SNR>=14.0dB
971             return 35;//
972         else if (u16NoisePower<=0xEAAC)//SNR>=13.6dB
973             return 34;//
974         else// if (u16NoisePower>=0xEAAC)//SNR<13.6dB
975             return 33;//
976     }
977     else //QAM MODE
978     {
979         if(eMode == DMD_ATSC_DEMOD_ATSC_256QAM) //256QAM//SNR=10*log10((2720<<10)/noisepower)
980         {
981             if (!_HAL_EXTERN_ATSC_QAM_Main_Lock())
982                 return 0;//SNR=0;
983             else if (u16NoisePower<=0x0117)//SNR>=40dB
984                 return 100;//
985             else if (u16NoisePower<=0x0131)//SNR>=39.6dB
986                 return 99;//
987             else if (u16NoisePower<=0x014F)//SNR>=39.2dB
988                 return 98;//
989             else if (u16NoisePower<=0x016F)//SNR>=38.8dB
990                 return 97;//
991             else if (u16NoisePower<=0x0193)//SNR>=38.4dB
992                 return 96;//
993             else if (u16NoisePower<=0x01B9)//SNR>=38.0dB
994                 return 95;//
995             else if (u16NoisePower<=0x01E4)//SNR>=37.6dB
996                 return 94;//
997             else if (u16NoisePower<=0x0213)//SNR>=37.2dB
998                 return 93;//
999             else if (u16NoisePower<=0x0246)//SNR>=36.8dB
1000                 return 92;//
1001             else if (u16NoisePower<=0x027E)//SNR>=36.4dB
1002                 return 91;//
1003             else if (u16NoisePower<=0x02BC)//SNR>=36.0dB
1004                 return 90;//
1005             else if (u16NoisePower<=0x02FF)//SNR>=35.6dB
1006                 return 89;//
1007             else if (u16NoisePower<=0x0349)//SNR>=35.2dB
1008                 return 88;//
1009             else if (u16NoisePower<=0x039A)//SNR>=34.8dB
1010                 return 87;//
1011             else if (u16NoisePower<=0x03F3)//SNR>=34.4dB
1012                 return 86;//
1013             else if (u16NoisePower<=0x0455)//SNR>=34.0dB
1014                 return 85;//
1015             else if (u16NoisePower<=0x04C0)//SNR>=33.6dB
1016                 return 84;//
1017             else if (u16NoisePower<=0x0535)//SNR>=33.2dB
1018                 return 83;//
1019             else if (u16NoisePower<=0x05B6)//SNR>=32.8dB
1020                 return 82;//
1021             else if (u16NoisePower<=0x0643)//SNR>=32.4dB
1022                 return 81;//
1023             else if (u16NoisePower<=0x06DD)//SNR>=32.0dB
1024                 return 80;//
1025             else if (u16NoisePower<=0x0787)//SNR>=31.6dB
1026                 return 79;//
1027             else if (u16NoisePower<=0x0841)//SNR>=31.2dB
1028                 return 78;//
1029             else if (u16NoisePower<=0x090D)//SNR>=30.8dB
1030                 return 77;//
1031             else if (u16NoisePower<=0x09EC)//SNR>=30.4dB
1032                 return 76;//
1033             else if (u16NoisePower<=0x0AE1)//SNR>=30.0dB
1034                 return 75;//
1035             else if (u16NoisePower<=0x0BEE)//SNR>=29.6dB
1036                 return 74;//
1037             else if (u16NoisePower<=0x0D15)//SNR>=29.2dB
1038                 return 73;//
1039             else if (u16NoisePower<=0x0E58)//SNR>=28.8dB
1040                 return 72;//
1041             else if (u16NoisePower<=0x0FBA)//SNR>=28.4dB
1042                 return 71;//
1043             else if (u16NoisePower<=0x113E)//SNR>=28.0dB
1044                 return 70;//
1045             else if (u16NoisePower<=0x12E8)//SNR>=27.6dB
1046                 return 69;//
1047             else if (u16NoisePower<=0x14BB)//SNR>=27.2dB
1048                 return 68;//
1049             else if (u16NoisePower<=0x16BB)//SNR>=26.8dB
1050                 return 67;//
1051             else if (u16NoisePower<=0x18ED)//SNR>=26.4dB
1052                 return 66;//
1053             else if (u16NoisePower<=0x1B54)//SNR>=26.0dB
1054                 return 65;//
1055             else if (u16NoisePower<=0x1DF7)//SNR>=25.6dB
1056                 return 64;//
1057             else if (u16NoisePower<=0x20DB)//SNR>=25.2dB
1058                 return 63;//
1059             else if (u16NoisePower<=0x2407)//SNR>=24.8dB
1060                 return 62;//
1061             else if (u16NoisePower<=0x2781)//SNR>=24.4dB
1062                 return 61;//
1063             else if (u16NoisePower<=0x2B50)//SNR>=24.0dB
1064                 return 60;//
1065             else if (u16NoisePower<=0x2F7E)//SNR>=23.6dB
1066                 return 59;//
1067             else if (u16NoisePower<=0x3413)//SNR>=23.2dB
1068                 return 58;//
1069             else if (u16NoisePower<=0x3919)//SNR>=22.8dB
1070                 return 57;//
1071             else if (u16NoisePower<=0x3E9C)//SNR>=22.4dB
1072                 return 56;//
1073             else if (u16NoisePower<=0x44A6)//SNR>=22.0dB
1074                 return 55;//
1075             else if (u16NoisePower<=0x4B45)//SNR>=21.6dB
1076                 return 54;//
1077             else if (u16NoisePower<=0x5289)//SNR>=21.2dB
1078                 return 53;//
1079             else if (u16NoisePower<=0x5A7F)//SNR>=20.8dB
1080                 return 52;//
1081             else if (u16NoisePower<=0x633A)//SNR>=20.4dB
1082                 return 51;//
1083             else if (u16NoisePower<=0x6CCD)//SNR>=20.0dB
1084                 return 50;//
1085             else if (u16NoisePower<=0x774C)//SNR>=19.6dB
1086                 return 49;//
1087             else if (u16NoisePower<=0x82CE)//SNR>=19.2dB
1088                 return 48;//
1089             else if (u16NoisePower<=0x8F6D)//SNR>=18.8dB
1090                 return 47;//
1091             else if (u16NoisePower<=0x9D44)//SNR>=18.4dB
1092                 return 46;//
1093             else if (u16NoisePower<=0xAC70)//SNR>=18.0dB
1094                 return 45;//
1095             else if (u16NoisePower<=0xBD13)//SNR>=17.6dB
1096                 return 44;//
1097             else if (u16NoisePower<=0xCF50)//SNR>=17.2dB
1098                 return 43;//
1099             else if (u16NoisePower<=0xE351)//SNR>=16.8dB
1100                 return 42;//
1101             else if (u16NoisePower<=0xF93F)//SNR>=16.4dB
1102                 return 41;//
1103             else// if (u16NoisePower>=0xF93F)//SNR<16.4dB
1104                 return 40;//
1105         }
1106         else //64QAM//SNR=10*log10((2688<<10)/noisepower)
1107         {
1108             if (!_HAL_EXTERN_ATSC_QAM_Main_Lock())
1109                 return 0;//SNR=0;
1110             else if (u16NoisePower<=0x0113)//SNR>=40dB
1111                 return 100;//
1112             else if (u16NoisePower<=0x012E)//SNR>=39.6dB
1113                 return 99;//
1114             else if (u16NoisePower<=0x014B)//SNR>=39.2dB
1115                 return 98;//
1116             else if (u16NoisePower<=0x016B)//SNR>=38.8dB
1117                 return 97;//
1118             else if (u16NoisePower<=0x018E)//SNR>=38.4dB
1119                 return 96;//
1120             else if (u16NoisePower<=0x01B4)//SNR>=38.0dB
1121                 return 95;//
1122             else if (u16NoisePower<=0x01DE)//SNR>=37.6dB
1123                 return 94;//
1124             else if (u16NoisePower<=0x020C)//SNR>=37.2dB
1125                 return 93;//
1126             else if (u16NoisePower<=0x023F)//SNR>=36.8dB
1127                 return 92;//
1128             else if (u16NoisePower<=0x0277)//SNR>=36.4dB
1129                 return 91;//
1130             else if (u16NoisePower<=0x02B3)//SNR>=36.0dB
1131                 return 90;//
1132             else if (u16NoisePower<=0x02F6)//SNR>=35.6dB
1133                 return 89;//
1134             else if (u16NoisePower<=0x033F)//SNR>=35.2dB
1135                 return 88;//
1136             else if (u16NoisePower<=0x038F)//SNR>=34.8dB
1137                 return 87;//
1138             else if (u16NoisePower<=0x03E7)//SNR>=34.4dB
1139                 return 86;//
1140             else if (u16NoisePower<=0x0448)//SNR>=34.0dB
1141                 return 85;//
1142             else if (u16NoisePower<=0x04B2)//SNR>=33.6dB
1143                 return 84;//
1144             else if (u16NoisePower<=0x0525)//SNR>=33.2dB
1145                 return 83;//
1146             else if (u16NoisePower<=0x05A5)//SNR>=32.8dB
1147                 return 82;//
1148             else if (u16NoisePower<=0x0630)//SNR>=32.4dB
1149                 return 81;//
1150             else if (u16NoisePower<=0x06C9)//SNR>=32.0dB
1151                 return 80;//
1152             else if (u16NoisePower<=0x0770)//SNR>=31.6dB
1153                 return 79;//
1154             else if (u16NoisePower<=0x0828)//SNR>=31.2dB
1155                 return 78;//
1156             else if (u16NoisePower<=0x08F1)//SNR>=30.8dB
1157                 return 77;//
1158             else if (u16NoisePower<=0x09CE)//SNR>=30.4dB
1159                 return 76;//
1160             else if (u16NoisePower<=0x0AC1)//SNR>=30.0dB
1161                 return 75;//
1162             else if (u16NoisePower<=0x0BCA)//SNR>=29.6dB
1163                 return 74;//
1164             else if (u16NoisePower<=0x0CED)//SNR>=29.2dB
1165                 return 73;//
1166             else if (u16NoisePower<=0x0E2D)//SNR>=28.8dB
1167                 return 72;//
1168             else if (u16NoisePower<=0x0F8B)//SNR>=28.4dB
1169                 return 71;//
1170             else if (u16NoisePower<=0x110A)//SNR>=28.0dB
1171                 return 70;//
1172             else if (u16NoisePower<=0x12AF)//SNR>=27.6dB
1173                 return 69;//
1174             else if (u16NoisePower<=0x147D)//SNR>=27.2dB
1175                 return 68;//
1176             else if (u16NoisePower<=0x1677)//SNR>=26.8dB
1177                 return 67;//
1178             else if (u16NoisePower<=0x18A2)//SNR>=26.4dB
1179                 return 66;//
1180             else if (u16NoisePower<=0x1B02)//SNR>=26.0dB
1181                 return 65;//
1182             else if (u16NoisePower<=0x1D9D)//SNR>=25.6dB
1183                 return 64;//
1184             else if (u16NoisePower<=0x2078)//SNR>=25.2dB
1185                 return 63;//
1186             else if (u16NoisePower<=0x239A)//SNR>=24.8dB
1187                 return 62;//
1188             else if (u16NoisePower<=0x270A)//SNR>=24.4dB
1189                 return 61;//
1190             else if (u16NoisePower<=0x2ACE)//SNR>=24.0dB
1191                 return 60;//
1192             else if (u16NoisePower<=0x2EEF)//SNR>=23.6dB
1193                 return 59;//
1194             else if (u16NoisePower<=0x3376)//SNR>=23.2dB
1195                 return 58;//
1196             else if (u16NoisePower<=0x386D)//SNR>=22.8dB
1197                 return 57;//
1198             else if (u16NoisePower<=0x3DDF)//SNR>=22.4dB
1199                 return 56;//
1200             else if (u16NoisePower<=0x43D7)//SNR>=22.0dB
1201                 return 55;//
1202             else if (u16NoisePower<=0x4A63)//SNR>=21.6dB
1203                 return 54;//
1204             else if (u16NoisePower<=0x5190)//SNR>=21.2dB
1205                 return 53;//
1206             else if (u16NoisePower<=0x596E)//SNR>=20.8dB
1207                 return 52;//
1208             else if (u16NoisePower<=0x620F)//SNR>=20.4dB
1209                 return 51;//
1210             else if (u16NoisePower<=0x6B85)//SNR>=20.0dB
1211                 return 50;//
1212             else if (u16NoisePower<=0x75E5)//SNR>=19.6dB
1213                 return 49;//
1214             else if (u16NoisePower<=0x8144)//SNR>=19.2dB
1215                 return 48;//
1216             else if (u16NoisePower<=0x8DBD)//SNR>=18.8dB
1217                 return 47;//
1218             else if (u16NoisePower<=0x9B6A)//SNR>=18.4dB
1219                 return 46;//
1220             else if (u16NoisePower<=0xAA68)//SNR>=18.0dB
1221                 return 45;//
1222             else if (u16NoisePower<=0xBAD9)//SNR>=17.6dB
1223                 return 44;//
1224             else if (u16NoisePower<=0xCCE0)//SNR>=17.2dB
1225                 return 43;//
1226             else if (u16NoisePower<=0xE0A4)//SNR>=16.8dB
1227                 return 42;//
1228             else if (u16NoisePower<=0xF650)//SNR>=16.4dB
1229                 return 41;//
1230             else// if (u16NoisePower>=0xF650)//SNR<16.4dB
1231                 return 40;//
1232         }
1233     }
1234 }
1235 
_HAL_EXTERN_ATSC_ReadPKTERR(void)1236 static MS_U16 _HAL_EXTERN_ATSC_ReadPKTERR(void)
1237 {
1238     MS_U16 data = 0;
1239     MS_U8 reg = 0, reg_frz = 0;
1240     DMD_ATSC_DEMOD_TYPE eMode;
1241 
1242     eMode = _HAL_EXTERN_ATSC_Check8VSB64_256QAM();
1243 
1244     _I2C_READ_BYTE(0x0D03, &reg_frz);
1245     _I2C_WRITE_BYTE(0x0D03, reg_frz|0x03);
1246 
1247     if (eMode == DMD_ATSC_DEMOD_ATSC_VSB)
1248     {
1249         if (!_HAL_EXTERN_ATSC_Vsb_FEC_Lock()) data = 0;
1250         else
1251         {
1252             _I2C_READ_BYTE(0x0D67, &reg);
1253             data = reg;
1254             _I2C_READ_BYTE(0x0D66, &reg);
1255             data = (data << 8) | reg;
1256         }
1257     }
1258     else
1259     {
1260         if (!_HAL_EXTERN_ATSC_QAM_Main_Lock()) data = 0;
1261         else
1262         {
1263             _I2C_READ_BYTE(0x0D67, &reg);
1264             data = reg;
1265             _I2C_READ_BYTE(0x0D66, &reg);
1266             data = (data << 8) | reg;
1267         }
1268     }
1269 
1270     reg_frz=reg_frz&(~0x03);
1271     _I2C_WRITE_BYTE(0x0D03, reg_frz);
1272 
1273     return data;
1274 }
1275 
_HAL_EXTERN_ATSC_ReadBER(float * pBer)1276 static MS_BOOL _HAL_EXTERN_ATSC_ReadBER(float *pBer)
1277 {
1278     MS_BOOL status = true;
1279     MS_U8 reg = 0, reg_frz = 0;
1280     MS_U16 BitErrPeriod;
1281     MS_U32 BitErr;
1282     DMD_ATSC_DEMOD_TYPE eMode;
1283 
1284     eMode = _HAL_EXTERN_ATSC_Check8VSB64_256QAM();
1285 
1286     if (eMode == DMD_ATSC_DEMOD_ATSC_VSB)
1287     {
1288         if (!_HAL_EXTERN_ATSC_Vsb_FEC_Lock()) *pBer = 0;
1289         else
1290         {
1291             // bank 0D 0x03 [1:0] reg_bit_err_num_freeze
1292             _I2C_READ_BYTE(0x0D03, &reg_frz);
1293             _I2C_WRITE_BYTE(0x0D03, reg_frz|0x03);
1294 
1295             // bank 0D 0x46 [7:0] reg_bit_err_sblprd_7_0
1296             //         0x47 [15:8] reg_bit_err_sblprd_15_8
1297             _I2C_READ_BYTE(0x0D47, &reg);
1298             BitErrPeriod = reg;
1299             _I2C_READ_BYTE(0x0D46, &reg);
1300             BitErrPeriod = (BitErrPeriod << 8)|reg;
1301 
1302             // bank 0D 0x6a [7:0] reg_bit_err_num_7_0
1303             //         0x6b [15:8] reg_bit_err_num_15_8
1304             // bank 0D 0x6c [7:0] reg_bit_err_num_23_16
1305             //         0x6d [15:8] reg_bit_err_num_31_24
1306             status &= _I2C_READ_BYTE(0x0D6d, &reg);
1307             BitErr = reg;
1308             status &= _I2C_READ_BYTE(0x0D6c, &reg);
1309             BitErr = (BitErr << 8)|reg;
1310             status &= _I2C_READ_BYTE(0x0D6b, &reg);
1311             BitErr = (BitErr << 8)|reg;
1312             status &= _I2C_READ_BYTE(0x0D6a, &reg);
1313             BitErr = (BitErr << 8)|reg;
1314 
1315             // bank 0D 0x03 [1:0] reg_bit_err_num_freeze
1316             reg_frz=reg_frz&(~0x03);
1317             _I2C_WRITE_BYTE(0x0D03, reg_frz);
1318 
1319             if (BitErrPeriod == 0 )    //protect 0
1320                 BitErrPeriod = 1;
1321             if (BitErr <=0 )
1322                 *pBer = 0.5f / ((float)BitErrPeriod*8*187*128);
1323             else
1324                 *pBer = (float)BitErr / ((float)BitErrPeriod*8*187*128);
1325         }
1326     }
1327     else
1328     {
1329         if (!_HAL_EXTERN_ATSC_QAM_Main_Lock()) *pBer = 0;
1330         else
1331         {
1332             // bank 0D 0x03 [1:0] reg_bit_err_num_freeze
1333             _I2C_READ_BYTE(0x0D03, &reg_frz);
1334             _I2C_WRITE_BYTE(0x0D03, reg_frz|0x03);
1335 
1336             // bank 0D 0x46 [7:0] reg_bit_err_sblprd_7_0
1337             //         0x47 [15:8] reg_bit_err_sblprd_15_8
1338             _I2C_READ_BYTE(0x0D47, &reg);
1339             BitErrPeriod = reg;
1340             _I2C_READ_BYTE(0x0D46, &reg);
1341             BitErrPeriod = (BitErrPeriod << 8)|reg;
1342 
1343             // bank 0D 0x6a [7:0] reg_bit_err_num_7_0
1344             //         0x6b [15:8] reg_bit_err_num_15_8
1345             // bank 0D 0x6c [7:0] reg_bit_err_num_23_16
1346             //         0x6d [15:8] reg_bit_err_num_31_24
1347             status &= _I2C_READ_BYTE(0x0D6d, &reg);
1348             BitErr = reg;
1349             status &= _I2C_READ_BYTE(0x0D6c, &reg);
1350             BitErr = (BitErr << 8)|reg;
1351             status &= _I2C_READ_BYTE(0x0D6b, &reg);
1352             BitErr = (BitErr << 8)|reg;
1353             status &= _I2C_READ_BYTE(0x0D6a, &reg);
1354             BitErr = (BitErr << 8)|reg;
1355 
1356             // bank 0D 0x03 [1:0] reg_bit_err_num_freeze
1357             reg_frz=reg_frz&(~0x03);
1358             _I2C_WRITE_BYTE(0x0D03, reg_frz);
1359 
1360             if (BitErrPeriod == 0 )    //protect 0
1361                 BitErrPeriod = 1;
1362             if (BitErr <=0 )
1363                 *pBer = 0.5f / ((float)BitErrPeriod*7*122*128);
1364             else
1365                 *pBer = (float)BitErr / ((float)BitErrPeriod*7*122*128);
1366         }
1367     }
1368 
1369     return status;
1370 }
1371 
_HAL_EXTERN_ATSC_ReadFrequencyOffset(void)1372 static MS_S16 _HAL_EXTERN_ATSC_ReadFrequencyOffset(void)
1373 {
1374     DMD_ATSC_DEMOD_TYPE eMode;
1375     MS_U8 u8PTK_LOOP_FF_R3=0, u8PTK_LOOP_FF_R2=0;
1376     MS_U8 u8PTK_RATE_2=0;
1377     MS_U8 u8AD_CRL_LOOP_VALUE0=0, u8AD_CRL_LOOP_VALUE1=0;
1378     MS_U8 u8MIX_RATE_0=0, u8MIX_RATE_1=0, u8MIX_RATE_2=0;
1379     MS_S16 PTK_LOOP_FF;
1380     MS_S16 AD_CRL_LOOP_VALUE;
1381     MS_S16 MIX_RATE;
1382     MS_S16 FreqOffset = 0; //kHz
1383 
1384     eMode = _HAL_EXTERN_ATSC_Check8VSB64_256QAM();
1385 
1386     if (eMode == DMD_ATSC_DEMOD_ATSC_VSB) //VSB mode//
1387     {
1388         _I2C_WRITE_BYTE(0x297E, 0x01);
1389         _I2C_WRITE_BYTE(0x29E6, 0xff);
1390         _I2C_READ_BYTE(0x297C, &u8PTK_LOOP_FF_R2);
1391         _I2C_READ_BYTE(0x297D, &u8PTK_LOOP_FF_R3);
1392         _I2C_WRITE_BYTE(0x297E, 0x00);
1393         _I2C_WRITE_BYTE(0x29E6, 0xff);
1394 
1395         PTK_LOOP_FF = (u8PTK_LOOP_FF_R3<<8) | u8PTK_LOOP_FF_R2;
1396         FreqOffset  = (float)(-PTK_LOOP_FF*0.04768);
1397 
1398         _I2C_READ_BYTE(0x2982, &u8PTK_RATE_2);
1399 
1400         if (u8PTK_RATE_2 == 0x07)
1401             FreqOffset = FreqOffset-100;
1402         else if (u8PTK_RATE_2 == 0x08)
1403             FreqOffset = FreqOffset-500;
1404     }
1405     else //QAM MODE
1406     {
1407         _I2C_READ_BYTE(0x2C04, &u8AD_CRL_LOOP_VALUE0);
1408         _I2C_READ_BYTE(0x2C05, &u8AD_CRL_LOOP_VALUE1);
1409 
1410         AD_CRL_LOOP_VALUE = (u8AD_CRL_LOOP_VALUE1<<8) | u8AD_CRL_LOOP_VALUE0;
1411 
1412         _I2C_READ_BYTE(0x2904, &u8MIX_RATE_0);
1413         _I2C_READ_BYTE(0x2905, &u8MIX_RATE_1);
1414         _I2C_READ_BYTE(0x2906, &u8MIX_RATE_2);
1415 
1416         MIX_RATE = (u8MIX_RATE_2<<12)|(u8MIX_RATE_1<<4)|(u8MIX_RATE_0>>4);
1417 
1418         if (eMode == DMD_ATSC_DEMOD_ATSC_256QAM) //256QAM//
1419         {
1420             FreqOffset = (float)(AD_CRL_LOOP_VALUE*0.0025561); //5.360537E6/2^21*1000
1421         }
1422         else if (eMode == DMD_ATSC_DEMOD_ATSC_64QAM)//64QAM//
1423         {
1424             FreqOffset = (float)(AD_CRL_LOOP_VALUE*0.00241134); //5.056941E6/2^21*1000
1425         }
1426 
1427         FreqOffset = FreqOffset+(float)(MIX_RATE-0x3D70)/2.62144; //(0.001/25*2^20/16)
1428     }
1429 
1430     return FreqOffset;
1431 }
1432 
_HAL_EXTERN_ATSC_SetSerialControl(MS_U8 u8TsConfigData)1433 static MS_BOOL _HAL_EXTERN_ATSC_SetSerialControl(MS_U8 u8TsConfigData)
1434 {
1435     return TRUE;
1436 }
1437 
_HAL_EXTERN_ATSC_IIC_Bypass_Mode(MS_BOOL bEnable)1438 static MS_BOOL _HAL_EXTERN_ATSC_IIC_Bypass_Mode(MS_BOOL bEnable)
1439 {
1440     MS_U8 u8Retry = 10;
1441     MS_BOOL bRet = FALSE;
1442 
1443     while ((u8Retry--) && (bRet == FALSE))
1444     {
1445         if (bEnable)
1446         {
1447             bRet = _I2C_WRITE_BYTE(REG_IIC_BYPASS, 0x10);// IIC by-pass mode on
1448         }
1449         else
1450         {
1451             bRet = _I2C_WRITE_BYTE(REG_IIC_BYPASS, 0x00);// IIC by-pass mode off
1452         }
1453 
1454     }
1455 
1456     return bRet;
1457 }
1458 
_HAL_EXTERN_ATSC_SW_SSPI_GPIO(MS_BOOL bEnable)1459 static MS_BOOL _HAL_EXTERN_ATSC_SW_SSPI_GPIO(MS_BOOL bEnable)
1460 {
1461     MS_BOOL bRet = TRUE;
1462     MS_U8 u8Data;
1463 
1464     if(bEnable == TRUE) //switch to GPIO
1465     {
1466         bRet = _I2C_READ_BYTE(0x0951, &u8Data);
1467         u8Data &= ~0x01;
1468         bRet = _I2C_WRITE_BYTE(0x0951, u8Data);   // [8] reg_turn_off_pad = 0
1469 
1470 
1471         bRet = _I2C_READ_BYTE(0x0976, &u8Data);
1472         u8Data &= ~0x01;
1473         bRet = _I2C_WRITE_BYTE(0x0976, u8Data);   // [0] reg_en_sspi_pad = 0
1474     }
1475     else
1476     {
1477         bRet = _I2C_READ_BYTE(0x0951, &u8Data);
1478         u8Data |= 0x01;
1479         bRet = _I2C_WRITE_BYTE(0x0951, u8Data);   // [8] reg_turn_off_pad = 1
1480 
1481 
1482         bRet = _I2C_READ_BYTE(0x0976, &u8Data);
1483         u8Data |= 0x01;
1484         bRet = _I2C_WRITE_BYTE(0x0976, u8Data);   // [0] reg_en_sspi_pad = 1
1485     }
1486 
1487     return bRet;
1488 }
1489 
_HAL_EXTERN_ATSC_GPIO_GET_LEVEL(MS_U8 u8Pin,MS_BOOL * bLevel)1490 static MS_BOOL _HAL_EXTERN_ATSC_GPIO_GET_LEVEL(MS_U8 u8Pin, MS_BOOL *bLevel)
1491 {
1492     MS_BOOL bRet = TRUE;
1493     MS_U8 u8Data;
1494 
1495     bRet = _I2C_READ_BYTE(0x09CA, &u8Data);
1496     if (u8Pin == 0)
1497     {
1498         if ((u8Data & 0x01) == 0x01)
1499             *bLevel = TRUE;
1500         else
1501             *bLevel = FALSE;
1502     }
1503     else if(u8Pin == 1)
1504     {
1505         if ((u8Data & 0x02) == 0x02)
1506             *bLevel = TRUE;
1507         else
1508             *bLevel = FALSE;
1509     }
1510     else if(u8Pin == 2)
1511     {
1512         if ((u8Data & 0x04) == 0x04)
1513             *bLevel = TRUE;
1514         else
1515             *bLevel = FALSE;
1516     }
1517     else if(u8Pin == 5)
1518     {
1519         if ((u8Data & 0x20) == 0x20)
1520             *bLevel = TRUE;
1521         else
1522             *bLevel = FALSE;
1523     }
1524     else
1525     {
1526         HAL_EXTERN_ATSC_DBINFO(printf("Can not use this pin as GPIO[%d]\n", u8Pin));
1527 
1528         bRet = FALSE;
1529 
1530         return bRet;
1531     }
1532 
1533     return bRet;
1534 }
1535 
_HAL_EXTERN_ATSC_GPIO_SET_LEVEL(MS_U8 u8Pin,MS_BOOL bLevel)1536 static MS_BOOL _HAL_EXTERN_ATSC_GPIO_SET_LEVEL(MS_U8 u8Pin, MS_BOOL bLevel)
1537 {
1538     MS_BOOL bRet = TRUE;
1539     MS_U8 u8Data;
1540 
1541     bRet = _I2C_READ_BYTE(0x09C6, &u8Data);
1542     if (u8Pin == 0)
1543     {
1544         if (bLevel == FALSE)
1545             u8Data &= ~0x01;
1546         else
1547             u8Data |= 0x01;
1548     }
1549     else if (u8Pin == 1)
1550     {
1551         if (bLevel == FALSE)
1552             u8Data &= ~0x02;
1553         else
1554             u8Data |= 0x02;
1555     }
1556     else if (u8Pin == 2)
1557     {
1558         if (bLevel == FALSE)
1559             u8Data &= ~0x04;
1560         else
1561             u8Data |= 0x04;
1562     }
1563     else if (u8Pin == 5)
1564     {
1565         if (bLevel == FALSE)
1566             u8Data &= ~0x20;
1567         else
1568             u8Data |= 0x20;
1569     }
1570     else
1571     {
1572         HAL_EXTERN_ATSC_DBINFO(printf("Can not use this pin as GPIO[%d]\n", u8Pin));
1573 
1574         bRet = FALSE;
1575 
1576         return bRet;
1577     }
1578 
1579     bRet = _I2C_WRITE_BYTE(0x09C6, u8Data);
1580 
1581     return bRet;
1582 }
1583 
_HAL_EXTERN_ATSC_GPIO_OUT_ENABLE(MS_U8 u8Pin,MS_BOOL bEnableOut)1584 static MS_BOOL _HAL_EXTERN_ATSC_GPIO_OUT_ENABLE(MS_U8 u8Pin, MS_BOOL bEnableOut)
1585 {
1586     MS_BOOL bRet = TRUE;
1587     MS_U8 u8Data;
1588 
1589     bRet = _I2C_READ_BYTE(0x09C8, &u8Data);
1590     if (u8Pin == 0)
1591     {
1592         if (bEnableOut == TRUE)
1593             u8Data &= ~0x01;
1594         else
1595             u8Data |= 0x01;
1596     }
1597     else if (u8Pin == 1)
1598     {
1599         if (bEnableOut == TRUE)
1600             u8Data &= ~0x02;
1601         else
1602             u8Data |= 0x02;
1603     }
1604     else if (u8Pin == 2)
1605     {
1606         if (bEnableOut == TRUE)
1607             u8Data &= ~0x04;
1608         else
1609             u8Data |= 0x04;
1610     }
1611     else if (u8Pin == 5)
1612     {
1613         if (bEnableOut == TRUE)
1614             u8Data &= ~0x20;
1615         else
1616             u8Data |= 0x20;
1617     }
1618     else
1619     {
1620         HAL_EXTERN_ATSC_DBINFO(printf("Can not use this pin as GPIO[%d]\n", u8Pin));
1621 
1622         bRet = FALSE;
1623 
1624         return bRet;
1625     }
1626 
1627     bRet = _I2C_WRITE_BYTE(0x09C8, u8Data);
1628 
1629     return bRet;
1630 }
1631 
_HAL_EXTERN_ATSC_GetReg(MS_U16 u16Addr,MS_U8 * pu8Data)1632 static MS_BOOL _HAL_EXTERN_ATSC_GetReg(MS_U16 u16Addr, MS_U8 *pu8Data)
1633 {
1634     return _I2C_READ_BYTE(u16Addr, pu8Data);
1635 }
1636 
_HAL_EXTERN_ATSC_SetReg(MS_U16 u16Addr,MS_U8 u8Data)1637 static MS_BOOL _HAL_EXTERN_ATSC_SetReg(MS_U16 u16Addr, MS_U8 u8Data)
1638 {
1639     return _I2C_WRITE_BYTE(u16Addr, u8Data);
1640 }
1641 
_HAL_EXTERN_ATSC_DoIQSwap(MS_BOOL bIsQPad)1642 static MS_BOOL _HAL_EXTERN_ATSC_DoIQSwap(MS_BOOL bIsQPad)
1643 {
1644     DMD_ATSC_ResData *pRes = psDMD_ATSC_ResData + u8DMD_ATSC_DMD_ID;
1645 
1646     pRes->sDMD_ATSC_InitData.bIsQPad = bIsQPad;
1647 
1648     //Set I&Q pad
1649     if (pRes->sDMD_ATSC_InitData.bIsQPad)
1650     {
1651         _I2C_WRITE_BYTE(0x0A33, 0x2E);
1652         _I2C_WRITE_BYTE(0x0A2E, 0x01);
1653 
1654         HAL_EXTERN_ATSC_DBINFO(printf("select Q pad source\n"));
1655     }
1656     else
1657     {
1658         _I2C_WRITE_BYTE(0x0A33, 0x1E);
1659         _I2C_WRITE_BYTE(0x0A2E, 0x00);
1660 
1661         HAL_EXTERN_ATSC_DBINFO(printf("select I pad source\n"));
1662     }
1663 
1664     return TRUE;
1665 }
1666 
1667 
1668 //-------------------------------------------------------------------------------------------------
1669 //  Global Functions
1670 //-------------------------------------------------------------------------------------------------
HAL_EXTERN_ATSC_IOCTL_CMD(DMD_ATSC_HAL_COMMAND eCmd,void * pArgs)1671 MS_BOOL HAL_EXTERN_ATSC_IOCTL_CMD(DMD_ATSC_HAL_COMMAND eCmd, void *pArgs)
1672 {
1673     MS_BOOL bResult = TRUE;
1674 
1675     switch(eCmd)
1676     {
1677     case DMD_ATSC_HAL_CMD_Exit:
1678         bResult = _HAL_EXTERN_ATSC_Exit();
1679         break;
1680     case DMD_ATSC_HAL_CMD_InitClk:
1681         _HAL_EXTERN_ATSC_InitClk();
1682         break;
1683     case DMD_ATSC_HAL_CMD_Download:
1684         bResult = _HAL_EXTERN_ATSC_Download();
1685         break;
1686     case DMD_ATSC_HAL_CMD_FWVERSION:
1687         _HAL_EXTERN_ATSC_FWVERSION();
1688         break;
1689     case DMD_ATSC_HAL_CMD_SoftReset:
1690         bResult = _HAL_EXTERN_ATSC_SoftReset();
1691         break;
1692     case DMD_ATSC_HAL_CMD_SetVsbMode:
1693         bResult = _HAL_EXTERN_ATSC_SetVsbMode();
1694         break;
1695     case DMD_ATSC_HAL_CMD_Set64QamMode:
1696         bResult = _HAL_EXTERN_ATSC_Set64QamMode();
1697         break;
1698     case DMD_ATSC_HAL_CMD_Set256QamMode:
1699         bResult = _HAL_EXTERN_ATSC_Set256QamMode();
1700         break;
1701     case DMD_ATSC_HAL_CMD_SetModeClean:
1702         bResult = _HAL_EXTERN_ATSC_SetModeClean();
1703         break;
1704     case DMD_ATSC_HAL_CMD_Set_QAM_SR:
1705         bResult = _HAL_EXTERN_ATSC_Set_QAM_SR();
1706         break;
1707     case DMD_ATSC_HAL_CMD_Active:
1708         break;
1709     case DMD_ATSC_HAL_CMD_Check8VSB64_256QAM:
1710         *((DMD_ATSC_DEMOD_TYPE *)pArgs) = _HAL_EXTERN_ATSC_Check8VSB64_256QAM();
1711         break;
1712     case DMD_ATSC_HAL_CMD_AGCLock:
1713         bResult = _HAL_EXTERN_ATSC_Vsb_QAM_AGCLock();
1714         break;
1715     case DMD_ATSC_HAL_CMD_Vsb_PreLock:
1716         bResult = _HAL_EXTERN_ATSC_Vsb_PreLock();
1717         break;
1718     case DMD_ATSC_HAL_CMD_Vsb_FSync_Lock:
1719         bResult = _HAL_EXTERN_ATSC_Vsb_FSync_Lock();
1720         break;
1721     case DMD_ATSC_HAL_CMD_Vsb_CE_Lock:
1722         bResult = _HAL_EXTERN_ATSC_Vsb_CE_Lock();
1723         break;
1724     case DMD_ATSC_HAL_CMD_Vsb_FEC_Lock:
1725         bResult = _HAL_EXTERN_ATSC_Vsb_FEC_Lock();
1726         break;
1727     case DMD_ATSC_HAL_CMD_QAM_PreLock:
1728         bResult = _HAL_EXTERN_ATSC_QAM_PreLock();
1729         break;
1730     case DMD_ATSC_HAL_CMD_QAM_Main_Lock:
1731         bResult = _HAL_EXTERN_ATSC_QAM_Main_Lock();
1732         break;
1733     case DMD_ATSC_HAL_CMD_ReadIFAGC:
1734         *((MS_U16 *)pArgs) = _HAL_EXTERN_ATSC_ReadIFAGC();
1735         break;
1736     case DMD_ATSC_HAL_CMD_CheckSignalCondition:
1737         _HAL_EXTERN_ATSC_CheckSignalCondition((DMD_ATSC_SIGNAL_CONDITION *)pArgs);
1738         break;
1739     case DMD_ATSC_HAL_CMD_ReadSNRPercentage:
1740         *((MS_U8 *)pArgs) = _HAL_EXTERN_ATSC_ReadSNRPercentage();
1741         break;
1742     case DMD_ATSC_HAL_CMD_ReadPKTERR:
1743         *((MS_U16 *)pArgs) = _HAL_EXTERN_ATSC_ReadPKTERR();
1744         break;
1745     case DMD_ATSC_HAL_CMD_GetPreViterbiBer:
1746         break;
1747     case DMD_ATSC_HAL_CMD_GetPostViterbiBer:
1748         bResult = _HAL_EXTERN_ATSC_ReadBER((float *)pArgs);
1749         break;
1750     case DMD_ATSC_HAL_CMD_ReadFrequencyOffset:
1751         *((MS_S16 *)pArgs) = _HAL_EXTERN_ATSC_ReadFrequencyOffset();
1752         break;
1753     case DMD_ATSC_HAL_CMD_TS_INTERFACE_CONFIG:
1754         bResult = _HAL_EXTERN_ATSC_SetSerialControl(*((MS_U8 *)pArgs));
1755         break;
1756     case DMD_ATSC_HAL_CMD_IIC_Bypass_Mode:
1757         bResult = _HAL_EXTERN_ATSC_IIC_Bypass_Mode(*((MS_BOOL *)pArgs));
1758         break;
1759     case DMD_ATSC_HAL_CMD_SSPI_TO_GPIO:
1760         bResult = _HAL_EXTERN_ATSC_SW_SSPI_GPIO(*((MS_BOOL *)pArgs));
1761         break;
1762     case DMD_ATSC_HAL_CMD_GPIO_GET_LEVEL:
1763         bResult = _HAL_EXTERN_ATSC_GPIO_GET_LEVEL((*((DMD_ATSC_GPIO_PIN_DATA *)pArgs)).u8Pin, &((*((DMD_ATSC_GPIO_PIN_DATA *)pArgs)).bLevel));
1764         break;
1765     case DMD_ATSC_HAL_CMD_GPIO_SET_LEVEL:
1766         bResult = _HAL_EXTERN_ATSC_GPIO_SET_LEVEL((*((DMD_ATSC_GPIO_PIN_DATA *)pArgs)).u8Pin, (*((DMD_ATSC_GPIO_PIN_DATA *)pArgs)).bLevel);
1767         break;
1768     case DMD_ATSC_HAL_CMD_GPIO_OUT_ENABLE:
1769         bResult = _HAL_EXTERN_ATSC_GPIO_OUT_ENABLE((*((DMD_ATSC_GPIO_PIN_DATA *)pArgs)).u8Pin, (*((DMD_ATSC_GPIO_PIN_DATA *)pArgs)).bIsOut);
1770         break;
1771     case DMD_ATSC_HAL_CMD_GET_REG:
1772         bResult = _HAL_EXTERN_ATSC_GetReg((*((DMD_ATSC_REG_DATA *)pArgs)).u16Addr, &((*((DMD_ATSC_REG_DATA *)pArgs)).u8Data));
1773         break;
1774     case DMD_ATSC_HAL_CMD_SET_REG:
1775         bResult = _HAL_EXTERN_ATSC_SetReg((*((DMD_ATSC_REG_DATA *)pArgs)).u16Addr, (*((DMD_ATSC_REG_DATA *)pArgs)).u8Data);
1776         break;
1777 	case DMD_ATSC_HAL_CMD_DoIQSwap:
1778         bResult = _HAL_EXTERN_ATSC_DoIQSwap(*((MS_BOOL *)pArgs));
1779         break;
1780     default:
1781         break;
1782     }
1783 
1784     return bResult;
1785 }
1786 
_DEFAULT_CMD(void)1787 static MS_U8 _DEFAULT_CMD(void)
1788 {
1789     return TRUE;
1790 }
1791 
1792 MS_BOOL MDrv_DMD_ATSC_Initial_Hal_Interface(void)  __attribute__((weak, alias ("_DEFAULT_CMD")));
1793