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, ®_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, ®);
1253 data = reg;
1254 _I2C_READ_BYTE(0x0D66, ®);
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, ®);
1264 data = reg;
1265 _I2C_READ_BYTE(0x0D66, ®);
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, ®_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, ®);
1298 BitErrPeriod = reg;
1299 _I2C_READ_BYTE(0x0D46, ®);
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, ®);
1307 BitErr = reg;
1308 status &= _I2C_READ_BYTE(0x0D6c, ®);
1309 BitErr = (BitErr << 8)|reg;
1310 status &= _I2C_READ_BYTE(0x0D6b, ®);
1311 BitErr = (BitErr << 8)|reg;
1312 status &= _I2C_READ_BYTE(0x0D6a, ®);
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, ®_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, ®);
1339 BitErrPeriod = reg;
1340 _I2C_READ_BYTE(0x0D46, ®);
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, ®);
1348 BitErr = reg;
1349 status &= _I2C_READ_BYTE(0x0D6c, ®);
1350 BitErr = (BitErr << 8)|reg;
1351 status &= _I2C_READ_BYTE(0x0D6b, ®);
1352 BitErr = (BitErr << 8)|reg;
1353 status &= _I2C_READ_BYTE(0x0D6a, ®);
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