xref: /utopia/UTPA2-700.0.x/modules/demodulator/drv/dvb_extdemod/drvDMD_EXTERN_MSB201X.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi //    Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi //    No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi //    modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi //    supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi //    Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi //    Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi //    obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi //    such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi //    MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi //    confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi //    third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi //    without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi //    intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi //    and in conformity with any international standard.  You agree to waive any
38*53ee8cc1Swenshuai.xi //    claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi //    incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi //    In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi //    consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi //    revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi //    You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi //    even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi //    request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi //    parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi //    services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi //    MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi //    ("Services").
52*53ee8cc1Swenshuai.xi //    You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi //    writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi //    disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi //    or otherwise:
58*53ee8cc1Swenshuai.xi //    (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi //        mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi //    (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi //        including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi //        of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi //    (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi //    of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi //    Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi //    settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi //    Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi //    with the said Rules.
72*53ee8cc1Swenshuai.xi //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi //    be English.
74*53ee8cc1Swenshuai.xi //    The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // ("MStar Confidential Information") by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi 
95*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
96*53ee8cc1Swenshuai.xi ///
97*53ee8cc1Swenshuai.xi /// file    drvAVD.c
98*53ee8cc1Swenshuai.xi /// @brief  AVD Driver Interface
99*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
100*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
101*53ee8cc1Swenshuai.xi 
102*53ee8cc1Swenshuai.xi 
103*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
104*53ee8cc1Swenshuai.xi //  Include Files
105*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
106*53ee8cc1Swenshuai.xi // Common Definition
107*53ee8cc1Swenshuai.xi #include <string.h>
108*53ee8cc1Swenshuai.xi #include <math.h>
109*53ee8cc1Swenshuai.xi #include "MsCommon.h"
110*53ee8cc1Swenshuai.xi #include "MsVersion.h"
111*53ee8cc1Swenshuai.xi #include "MsOS.h"
112*53ee8cc1Swenshuai.xi 
113*53ee8cc1Swenshuai.xi // Internal Definition
114*53ee8cc1Swenshuai.xi //#include "regCHIP.h"
115*53ee8cc1Swenshuai.xi //#include "regAVD.h"
116*53ee8cc1Swenshuai.xi //#include "mapi_tuner.h"
117*53ee8cc1Swenshuai.xi #include "drvSYS.h"
118*53ee8cc1Swenshuai.xi //#include "drvDMD_VD_MBX.h"
119*53ee8cc1Swenshuai.xi #include "drvDMD_EXTERN_MSB201X.h"
120*53ee8cc1Swenshuai.xi #include "include/drvDMD_common.h"
121*53ee8cc1Swenshuai.xi #include "include/drvSAR.h"
122*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
123*53ee8cc1Swenshuai.xi #include "drvMSPI.h"
124*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
125*53ee8cc1Swenshuai.xi //  Driver Compiler Options
126*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
127*53ee8cc1Swenshuai.xi #define ERR_DEMOD_MSB(x)     x
128*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
129*53ee8cc1Swenshuai.xi #define DBG_DEMOD_MSB(x)      x
130*53ee8cc1Swenshuai.xi #define DBG_DEMOD_FLOW(x)     x
131*53ee8cc1Swenshuai.xi #define DBG_GET_SIGNAL(x)      // x
132*53ee8cc1Swenshuai.xi #define DBG_DEMOD_LOAD_I2C(x)       x
133*53ee8cc1Swenshuai.xi #define DBG_DEMOD_CHECKSUM(x)        // x
134*53ee8cc1Swenshuai.xi #define DBG_FLASH_WP(x)        // x
135*53ee8cc1Swenshuai.xi #endif
136*53ee8cc1Swenshuai.xi #define DBG_KIRIN_BOND(x)  //x
137*53ee8cc1Swenshuai.xi 
138*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
139*53ee8cc1Swenshuai.xi //  Local Defines
140*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
141*53ee8cc1Swenshuai.xi #define PRINTE(p) printf p
142*53ee8cc1Swenshuai.xi 
143*53ee8cc1Swenshuai.xi // BIT mask
144*53ee8cc1Swenshuai.xi #define _BIT0 0x01
145*53ee8cc1Swenshuai.xi #define _BIT1 0x02
146*53ee8cc1Swenshuai.xi #define _BIT2 0x04
147*53ee8cc1Swenshuai.xi #define _BIT3 0x08
148*53ee8cc1Swenshuai.xi #define _BIT4 0x10
149*53ee8cc1Swenshuai.xi #define _BIT5 0x20
150*53ee8cc1Swenshuai.xi #define _BIT6 0x40
151*53ee8cc1Swenshuai.xi #define _BIT7 0x80
152*53ee8cc1Swenshuai.xi 
153*53ee8cc1Swenshuai.xi // Demod bank number
154*53ee8cc1Swenshuai.xi #define TOP_REG_BASE  0x2000
155*53ee8cc1Swenshuai.xi #define TDP_REG_BASE  0x2100
156*53ee8cc1Swenshuai.xi #define FDP_REG_BASE  0x2200
157*53ee8cc1Swenshuai.xi #define FEC_REG_BASE  0x2300
158*53ee8cc1Swenshuai.xi #define TDF_REG_BASE  0x2700
159*53ee8cc1Swenshuai.xi #define TDFE_REG_BASE  0x2800
160*53ee8cc1Swenshuai.xi #define BACKEND_REG_BASE  0x2100
161*53ee8cc1Swenshuai.xi #define TDE_REG_BASE  0x2700
162*53ee8cc1Swenshuai.xi #define INNC_REG_BASE  0x2900
163*53ee8cc1Swenshuai.xi #define EQE_REG_BASE  0x2A00
164*53ee8cc1Swenshuai.xi 
165*53ee8cc1Swenshuai.xi 
166*53ee8cc1Swenshuai.xi MS_U8 MSB201X_DVBC_table[] = {
167*53ee8cc1Swenshuai.xi #include "MSB201X_DVBC.dat"
168*53ee8cc1Swenshuai.xi };
169*53ee8cc1Swenshuai.xi 
170*53ee8cc1Swenshuai.xi float MSB201X_Spur_freq_table[255] = {
171*53ee8cc1Swenshuai.xi 	48, 54, 56.5, 62, 64, 69, 72, 80.5, 81.5, 90,
172*53ee8cc1Swenshuai.xi 	92, 96, 98, 103.5, 108, 115, 118, 124, 126.5, 136,
173*53ee8cc1Swenshuai.xi 	138, 144, 152, 154, 161, 164, 170, 172.8, 180, 184,
174*53ee8cc1Swenshuai.xi 	190, 192, 193, 198, 204, 207, 208, 216, 218, 226,
175*53ee8cc1Swenshuai.xi 	230, 234, 236, 239, 240, 252, 253, 256, 262, 264,
176*53ee8cc1Swenshuai.xi 	268, 276, 288, 299, 300, 308, 311, 312, 322, 324,
177*53ee8cc1Swenshuai.xi 	330, 337, 340, 345, 345.6, 357, 360, 368, 380, 383,
178*53ee8cc1Swenshuai.xi 	386, 391, 396, 409, 412, 429, 432, 437, 452, 458,
179*53ee8cc1Swenshuai.xi 	460, 464, 468, 481, 484, 503, 506, 521.14, 524, 527,
180*53ee8cc1Swenshuai.xi 	552, 556, 573, 575, 576, 596, 599, 602, 608, 612,
181*53ee8cc1Swenshuai.xi 	625, 628, 644, 645, 648, 651, 668, 674, 680, 684,
182*53ee8cc1Swenshuai.xi 	697, 703, 713, 714, 720, 723, 736, 740, 746, 749,
183*53ee8cc1Swenshuai.xi 	752, 756, 759, 769, 772, 786, 789, 792, 795, 802,
184*53ee8cc1Swenshuai.xi 	812, 818, 828, 841, 844, 846.85, 0
185*53ee8cc1Swenshuai.xi 	};
186*53ee8cc1Swenshuai.xi #define MAX_SPUR_NUM	2
187*53ee8cc1Swenshuai.xi #define SRAM_Write_Buffer 128 // must < 255
188*53ee8cc1Swenshuai.xi #define SRAM_BASE          0x8000
189*53ee8cc1Swenshuai.xi 
190*53ee8cc1Swenshuai.xi #define LOAD_CODE_I2C_BLOCK_NUM          0x400//0x80
191*53ee8cc1Swenshuai.xi 
192*53ee8cc1Swenshuai.xi #define REG_MCU51_INTR		0x103400UL   //need to be check
193*53ee8cc1Swenshuai.xi #define REG_DMD0_MB_CNTL     0x103500UL
194*53ee8cc1Swenshuai.xi #define REG_DMD0_MB_ADDR_L   0x103501UL
195*53ee8cc1Swenshuai.xi #define REG_DMD0_MB_ADDR_H   0x103502UL
196*53ee8cc1Swenshuai.xi #define REG_DMD0_MB_DATA     0x103503UL
197*53ee8cc1Swenshuai.xi #define REG_DMD0_FSM_EN       0x103528UL
198*53ee8cc1Swenshuai.xi #define REG_DMD1_MB_CNTL     0x103600UL
199*53ee8cc1Swenshuai.xi #define REG_DMD1_MB_ADDR_L   0x103601UL
200*53ee8cc1Swenshuai.xi #define REG_DMD1_MB_ADDR_H   0x103602UL
201*53ee8cc1Swenshuai.xi #define REG_DMD1_MB_DATA     0x103603UL
202*53ee8cc1Swenshuai.xi #define REG_DMD1_FSM_EN       0x103628UL
203*53ee8cc1Swenshuai.xi /*  koln have only 2 demod
204*53ee8cc1Swenshuai.xi #define REG_DMD2_MB_CNTL     0x3300
205*53ee8cc1Swenshuai.xi #define REG_DMD2_MB_ADDR_L   0x3301
206*53ee8cc1Swenshuai.xi #define REG_DMD2_MB_ADDR_H   0x3302
207*53ee8cc1Swenshuai.xi #define REG_DMD2_MB_DATA     0x3303
208*53ee8cc1Swenshuai.xi #define REG_DMD2_FSM_EN       0x3328
209*53ee8cc1Swenshuai.xi #define REG_DMD3_MB_CNTL     0x3700
210*53ee8cc1Swenshuai.xi #define REG_DMD3_MB_ADDR_L   0x3701
211*53ee8cc1Swenshuai.xi #define REG_DMD3_MB_ADDR_H   0x3702
212*53ee8cc1Swenshuai.xi #define REG_DMD3_MB_DATA     0x3703
213*53ee8cc1Swenshuai.xi #define REG_DMD3_FSM_EN       0x3728
214*53ee8cc1Swenshuai.xi */
215*53ee8cc1Swenshuai.xi #define resetDemodTime  50
216*53ee8cc1Swenshuai.xi #define waitFlashTime   50
217*53ee8cc1Swenshuai.xi 
218*53ee8cc1Swenshuai.xi #define SRAM_DATA_CHECK                0
219*53ee8cc1Swenshuai.xi #define SRAM_BASE                        0x8000
220*53ee8cc1Swenshuai.xi #define SPI_DEVICE_BUFFER_SIZE           256
221*53ee8cc1Swenshuai.xi #define MAX_MSB201X_LIB_LEN              131072
222*53ee8cc1Swenshuai.xi 
223*53ee8cc1Swenshuai.xi #define MSB201X_BOOT  0x01
224*53ee8cc1Swenshuai.xi #define MSB201X_DVBC  0x08
225*53ee8cc1Swenshuai.xi #define MSB201X_ALL   0x0F
226*53ee8cc1Swenshuai.xi 
227*53ee8cc1Swenshuai.xi #define MSB201X_BOOT_START_ADDR     0x00000
228*53ee8cc1Swenshuai.xi #define MSB201X_BOOT_END_ADDR       0x00FFF
229*53ee8cc1Swenshuai.xi #define MSB201X_DVBC_START_ADDR     0x18000
230*53ee8cc1Swenshuai.xi #define MSB201X_DVBC_END_ADDR       0x1FFFF
231*53ee8cc1Swenshuai.xi 
232*53ee8cc1Swenshuai.xi #define MSB201X_WINDOWS_BASE                0x100
233*53ee8cc1Swenshuai.xi #define MSB201X_BOOT_WINDOWS_OFFSET         MSB201X_WINDOWS_BASE
234*53ee8cc1Swenshuai.xi #define MSB201X_DVBC_WINDOWS_OFFSET        (MSB201X_WINDOWS_BASE + 0x18 + 0x08)
235*53ee8cc1Swenshuai.xi 
236*53ee8cc1Swenshuai.xi #define MSB201X_MAX_FLASH_ON_RETRY_NUM 3
237*53ee8cc1Swenshuai.xi 
238*53ee8cc1Swenshuai.xi #define UNUSED(x)       (x=x)
239*53ee8cc1Swenshuai.xi 
240*53ee8cc1Swenshuai.xi /////////////// CONSTANT /////////////////
241*53ee8cc1Swenshuai.xi #define PAGE_WRITE_SIZE         256
242*53ee8cc1Swenshuai.xi #define VERSION_CODE_ADDR       0xFC0
243*53ee8cc1Swenshuai.xi #define VERSION_CODE_SIZE       32
244*53ee8cc1Swenshuai.xi 
245*53ee8cc1Swenshuai.xi //static eDMD_MSB201X_DbgLv eDMD_MSB201X_DbgLevel=E_DMD_MSB201X_DBGLV_NONE;
246*53ee8cc1Swenshuai.xi 
247*53ee8cc1Swenshuai.xi //kirin bonding option
248*53ee8cc1Swenshuai.xi #define DRV_RIU_ReadByte(_u32addr)	(*(volatile MS_U32*)(_u32addr) )
249*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
250*53ee8cc1Swenshuai.xi //  Local Structurs
251*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
252*53ee8cc1Swenshuai.xi 
253*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
254*53ee8cc1Swenshuai.xi //  Global Variables
255*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
256*53ee8cc1Swenshuai.xi static MS_U8 g_dvbc_lock[DEMOD_MAX_INSTANCE][DEMOD_MAX_CHANNEL] = {{0,0}};
257*53ee8cc1Swenshuai.xi 
258*53ee8cc1Swenshuai.xi #if 0
259*53ee8cc1Swenshuai.xi 
260*53ee8cc1Swenshuai.xi #define DMD_LOCK() _Lock()
261*53ee8cc1Swenshuai.xi #define DMD_UNLOCK()  _UnLock()
262*53ee8cc1Swenshuai.xi 
263*53ee8cc1Swenshuai.xi #else
264*53ee8cc1Swenshuai.xi #define DMD_LOCK()      \
265*53ee8cc1Swenshuai.xi     do{                         \
266*53ee8cc1Swenshuai.xi         MS_ASSERT(MsOS_In_Interrupt() == FALSE); \
267*53ee8cc1Swenshuai.xi         MsOS_ObtainMutex(pDemod->s32_MSB201X_Mutex, MSOS_WAIT_FOREVER);\
268*53ee8cc1Swenshuai.xi         }while(0)
269*53ee8cc1Swenshuai.xi 
270*53ee8cc1Swenshuai.xi #define DMD_UNLOCK()      \
271*53ee8cc1Swenshuai.xi     do{                         \
272*53ee8cc1Swenshuai.xi         MsOS_ReleaseMutex(pDemod->s32_MSB201X_Mutex);\
273*53ee8cc1Swenshuai.xi         }while(0)
274*53ee8cc1Swenshuai.xi 
275*53ee8cc1Swenshuai.xi #endif
276*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
277*53ee8cc1Swenshuai.xi //  Local Variables
278*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
279*53ee8cc1Swenshuai.xi #if 1
280*53ee8cc1Swenshuai.xi /*
281*53ee8cc1Swenshuai.xi static MSIF_Version _drv_dmd_MSB201X_extern_version = {
282*53ee8cc1Swenshuai.xi     .MW = { DMD_MSB201X_EXTERN_VER, },
283*53ee8cc1Swenshuai.xi };
284*53ee8cc1Swenshuai.xi */
285*53ee8cc1Swenshuai.xi #else
286*53ee8cc1Swenshuai.xi static MSIF_Version _drv_dmd_msb123x_extern_version;
287*53ee8cc1Swenshuai.xi #endif
288*53ee8cc1Swenshuai.xi 
289*53ee8cc1Swenshuai.xi #define DEMOD_GET_ACTIVE_NODE(x) (pstDemod+x) //&_gDemodNode[x]
290*53ee8cc1Swenshuai.xi 
291*53ee8cc1Swenshuai.xi 
292*53ee8cc1Swenshuai.xi //configure
293*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------- for DVB-C
294*53ee8cc1Swenshuai.xi #define TUNER_IF 		5000
295*53ee8cc1Swenshuai.xi 
296*53ee8cc1Swenshuai.xi #define TS_SER_C        0x00    //0: parallel 1:serial
297*53ee8cc1Swenshuai.xi 
298*53ee8cc1Swenshuai.xi #if 1//test (INTERN_DVBC_TS_SERIAL_INVERSION)
299*53ee8cc1Swenshuai.xi #define TS_INV_C        0x01
300*53ee8cc1Swenshuai.xi #else
301*53ee8cc1Swenshuai.xi #define TS_INV_C        0x00
302*53ee8cc1Swenshuai.xi #endif
303*53ee8cc1Swenshuai.xi 
304*53ee8cc1Swenshuai.xi #define DVBC_FS         48000
305*53ee8cc1Swenshuai.xi #define CFG_ZIF         0x00    //For ZIF ,FC=0
306*53ee8cc1Swenshuai.xi #define FC_H_C          ( (DVBC_FS-TUNER_IF)>0 ? (((DVBC_FS-TUNER_IF)>>8)&0xFF) : (((TUNER_IF-DVBC_FS)>>8)&0xFF) )
307*53ee8cc1Swenshuai.xi #define FC_L_C          ( (DVBC_FS-TUNER_IF)>0 ? (((DVBC_FS-TUNER_IF))&0xFF) : (((TUNER_IF-DVBC_FS))&0xFF) )
308*53ee8cc1Swenshuai.xi #define FS_H_C          ((DVBC_FS>>8)&0xFF)         // FS
309*53ee8cc1Swenshuai.xi #define FS_L_C          (DVBC_FS&0xFF)
310*53ee8cc1Swenshuai.xi #define AUTO_SCAN_C     0x00    // Auto Scan - 0:channel change, 1:auto-scan
311*53ee8cc1Swenshuai.xi #define IQ_SWAP_C       0x01
312*53ee8cc1Swenshuai.xi #define PAL_I_C         0x00    // PAL_I: 0: Non-Pal-I CCI, 1: Pal-I CCI (for UK)
313*53ee8cc1Swenshuai.xi // Bxko 6875, 6900, 7000, 6125, 4000, 6950
314*53ee8cc1Swenshuai.xi // Symbol Rate: 6875 = 0x1ADB
315*53ee8cc1Swenshuai.xi // Symbol Rate: 6900 = 0x1AF4
316*53ee8cc1Swenshuai.xi // Symbol Rate: 7000 = 0x1B58
317*53ee8cc1Swenshuai.xi // Symbol Rate: 4000 = 0x0FA0
318*53ee8cc1Swenshuai.xi // Symbol Rate: 6125 = 0x17ED
319*53ee8cc1Swenshuai.xi #define SR0_H           0x1A
320*53ee8cc1Swenshuai.xi #define SR0_L           0xF4	//6900
321*53ee8cc1Swenshuai.xi #define SR1_H           0x1B
322*53ee8cc1Swenshuai.xi #define SR1_L           0x58	//7000
323*53ee8cc1Swenshuai.xi #define SR2_H           0x17
324*53ee8cc1Swenshuai.xi #define SR2_L           0xED	//6125
325*53ee8cc1Swenshuai.xi #define SR3_H           0x0F
326*53ee8cc1Swenshuai.xi #define SR3_L           0xA0	//4000
327*53ee8cc1Swenshuai.xi #define SR4_H           0x1B
328*53ee8cc1Swenshuai.xi #define SR4_L           0x26	//6950
329*53ee8cc1Swenshuai.xi #define SR5_H           0x1A
330*53ee8cc1Swenshuai.xi #define SR5_L           0xDB	//6875
331*53ee8cc1Swenshuai.xi #define SR6_H           0x1C
332*53ee8cc1Swenshuai.xi #define SR6_L           0x20	//7200
333*53ee8cc1Swenshuai.xi #define SR7_H           0x1C
334*53ee8cc1Swenshuai.xi #define SR7_L           0x52	//7250
335*53ee8cc1Swenshuai.xi #define SR8_H           0x0B
336*53ee8cc1Swenshuai.xi #define SR8_L           0xB8	//3000
337*53ee8cc1Swenshuai.xi #define SR9_H           0x03
338*53ee8cc1Swenshuai.xi #define SR9_L           0xE8	//1000
339*53ee8cc1Swenshuai.xi #define SR10_H          0x07
340*53ee8cc1Swenshuai.xi #define SR10_L          0xD0	//2000
341*53ee8cc1Swenshuai.xi #define SR11_H          0x00
342*53ee8cc1Swenshuai.xi #define SR11_L          0x00	//0000
343*53ee8cc1Swenshuai.xi 
344*53ee8cc1Swenshuai.xi 
345*53ee8cc1Swenshuai.xi #define QAM             0x04 // QAM: 0:16, 1:32, 2:64, 3:128, 4:256
346*53ee8cc1Swenshuai.xi 
347*53ee8cc1Swenshuai.xi // SAR dependent
348*53ee8cc1Swenshuai.xi #define NO_SIGNAL_TH_A  0xA3
349*53ee8cc1Swenshuai.xi // Tuner dependent
350*53ee8cc1Swenshuai.xi #define NO_SIGNAL_TH_B_L  0xFF //0x00 , Gain
351*53ee8cc1Swenshuai.xi #define NO_SIGNAL_TH_B_H  0xFF //0xDD
352*53ee8cc1Swenshuai.xi #define NO_SIGNAL_TH_C_L  0xff //0x64 , Err
353*53ee8cc1Swenshuai.xi #define NO_SIGNAL_TH_C_H  0xff //0x00
354*53ee8cc1Swenshuai.xi #define DAGC1_REF               0x70
355*53ee8cc1Swenshuai.xi #define DAGC2_REF               0x30
356*53ee8cc1Swenshuai.xi #define AGC_REF_L               0xFF
357*53ee8cc1Swenshuai.xi #define AGC_REF_H         0x05
358*53ee8cc1Swenshuai.xi 
359*53ee8cc1Swenshuai.xi #define INTERN_AUTO_SR_C  1
360*53ee8cc1Swenshuai.xi #define INTERN_AUTO_QAM_C 1
361*53ee8cc1Swenshuai.xi 
362*53ee8cc1Swenshuai.xi #define ATV_DET_EN        1
363*53ee8cc1Swenshuai.xi 
364*53ee8cc1Swenshuai.xi MS_U8 MSB201X_DVBC_DSPREG_TABLE[] =
365*53ee8cc1Swenshuai.xi {
366*53ee8cc1Swenshuai.xi 	0x00, 0x01, INTERN_AUTO_SR_C, INTERN_AUTO_QAM_C, 0x00, 0x01, 0x00, 0x88, 0x13, SR0_L, SR0_H,
367*53ee8cc1Swenshuai.xi 	QAM, IQ_SWAP_C, PAL_I_C, AGC_REF_L, AGC_REF_H, 0x00, NO_SIGNAL_TH_B_L, NO_SIGNAL_TH_B_H, NO_SIGNAL_TH_C_L, NO_SIGNAL_TH_C_H,
368*53ee8cc1Swenshuai.xi 	0x00,
369*53ee8cc1Swenshuai.xi };
370*53ee8cc1Swenshuai.xi 
371*53ee8cc1Swenshuai.xi typedef struct xMSB201X_Demod_Data
372*53ee8cc1Swenshuai.xi {
373*53ee8cc1Swenshuai.xi     MS_BOOL Active;
374*53ee8cc1Swenshuai.xi     MS_S32 s32_MSB201X_Mutex;
375*53ee8cc1Swenshuai.xi     MS_BOOL bDMD_MSB201X_Power_init_en;
376*53ee8cc1Swenshuai.xi     MS_U8 u8DMD_MSB201X_PowerOnInitialization_Flow;
377*53ee8cc1Swenshuai.xi     MS_U8 u8DMD_MSB201X_Sram_Code;
378*53ee8cc1Swenshuai.xi     sDMD_MSB201X_InitData _sDMD_MSB201X_InitData;
379*53ee8cc1Swenshuai.xi     eDMD_MSB201X_DemodulatorType eDMD_MSB201X_CurrentDemodulatorType;
380*53ee8cc1Swenshuai.xi     MS_BOOL bDemodRest;
381*53ee8cc1Swenshuai.xi     MS_U8 DVBC_DSP_REG[DEMOD_MAX_CHANNEL][sizeof(MSB201X_DVBC_DSPREG_TABLE)];
382*53ee8cc1Swenshuai.xi     sDMD_MSB201X_Info sDMD_MSB201X_Info[DEMOD_MAX_CHANNEL];
383*53ee8cc1Swenshuai.xi     MS_U32 u32DMD_DVBC_PrevScanTime[DEMOD_MAX_CHANNEL];
384*53ee8cc1Swenshuai.xi     MS_U32 u32DMD_DVBC_ScanCount[DEMOD_MAX_CHANNEL];
385*53ee8cc1Swenshuai.xi     MS_BOOL DMD_Lock_Status[DEMOD_MAX_CHANNEL];
386*53ee8cc1Swenshuai.xi     sDMD_MSB201X_IFAGC IFAGC_Data[DEMOD_MAX_CHANNEL];
387*53ee8cc1Swenshuai.xi     e_MSB201X_DSP_ReadWrite DSP_ReadWrite_Mode;
388*53ee8cc1Swenshuai.xi     sDMD_MSB201X_TS_Param sDMD_MSB201X_TS_Param;
389*53ee8cc1Swenshuai.xi     MS_BOOL bDMD_MSB201X_TS_Param_Init_Done;
390*53ee8cc1Swenshuai.xi     sDMD_MSB201X_extHeader sDMD_MSB201X_extHeader_Param;
391*53ee8cc1Swenshuai.xi     sDMD_MSB201X_CIHeader sDMD_MSB201X_CIHeader_Param;
392*53ee8cc1Swenshuai.xi }tMSB201X_Demod_Data;
393*53ee8cc1Swenshuai.xi 
394*53ee8cc1Swenshuai.xi //static MS_S32 _gActiveInstanceIndex = 0;
395*53ee8cc1Swenshuai.xi //static eDMD_MSB201X_DbgLv eDMD_MSB201X_DbgLevel=E_DMD_MSB201X_DBGLV_NONE;
396*53ee8cc1Swenshuai.xi static tMSB201X_Demod_Data* pstDemod = NULL;
397*53ee8cc1Swenshuai.xi static MS_BOOL* pDemodRest = NULL;
398*53ee8cc1Swenshuai.xi 
399*53ee8cc1Swenshuai.xi 
400*53ee8cc1Swenshuai.xi 
401*53ee8cc1Swenshuai.xi static tMSB201X_Demod_Data MSB201X_Demod_Init=
402*53ee8cc1Swenshuai.xi {
403*53ee8cc1Swenshuai.xi 	FALSE,
404*53ee8cc1Swenshuai.xi 	-1,
405*53ee8cc1Swenshuai.xi   	FALSE,
406*53ee8cc1Swenshuai.xi   	0,
407*53ee8cc1Swenshuai.xi   	0,
408*53ee8cc1Swenshuai.xi   	{0},
409*53ee8cc1Swenshuai.xi   	E_DMD_MSB201X_DEMOD_DVBC,
410*53ee8cc1Swenshuai.xi   	TRUE,
411*53ee8cc1Swenshuai.xi   	{{0,0}},
412*53ee8cc1Swenshuai.xi 	{{0,0}},
413*53ee8cc1Swenshuai.xi 	{0},
414*53ee8cc1Swenshuai.xi 	{0},
415*53ee8cc1Swenshuai.xi 	{0}
416*53ee8cc1Swenshuai.xi };
417*53ee8cc1Swenshuai.xi 
418*53ee8cc1Swenshuai.xi // Timeout setting
419*53ee8cc1Swenshuai.xi static MS_U16 u16DMD_DVBC_AutoSymbol_Timeout = 10000, u16DMD_DVBC_FixSymbol_AutoQam_Timeout=2000, u16DMD_DVBC_FixSymbol_FixQam_Timeout=1000;
420*53ee8cc1Swenshuai.xi 
421*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
422*53ee8cc1Swenshuai.xi //  Debug Functions
423*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
424*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
425*53ee8cc1Swenshuai.xi #define DMD_DBG(x)          (x)
426*53ee8cc1Swenshuai.xi #else
427*53ee8cc1Swenshuai.xi #define DMD_DBG(x)          //(x)
428*53ee8cc1Swenshuai.xi #endif
429*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
430*53ee8cc1Swenshuai.xi //  Local Functions
431*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
432*53ee8cc1Swenshuai.xi 
433*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
434*53ee8cc1Swenshuai.xi //  Global Functions
435*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
436*53ee8cc1Swenshuai.xi #define INDEX_TO_HANDLE(x) ((x)+1)
437*53ee8cc1Swenshuai.xi #define HANDLE_TO_INDEX(x) ((x)-1)
438*53ee8cc1Swenshuai.xi #define CFG_W_CMD 0x05
_MDrv_DMD_MSB201X_SSPI_CFG_W(MS_U8 u8_addr,MS_U8 data)439*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_SSPI_CFG_W(MS_U8 u8_addr,MS_U8 data)
440*53ee8cc1Swenshuai.xi {
441*53ee8cc1Swenshuai.xi 		MS_BOOL bRet = TRUE;
442*53ee8cc1Swenshuai.xi     MS_U8 Wdata[3];
443*53ee8cc1Swenshuai.xi 
444*53ee8cc1Swenshuai.xi     Wdata[0] = CFG_W_CMD;
445*53ee8cc1Swenshuai.xi     Wdata[1] = u8_addr;
446*53ee8cc1Swenshuai.xi     Wdata[2] = data;
447*53ee8cc1Swenshuai.xi 
448*53ee8cc1Swenshuai.xi     // Write operation
449*53ee8cc1Swenshuai.xi     MDrv_MSPI_SlaveEnable(TRUE);
450*53ee8cc1Swenshuai.xi     // send write address
451*53ee8cc1Swenshuai.xi     MDrv_MSPI_Write(Wdata,sizeof(Wdata));
452*53ee8cc1Swenshuai.xi     MDrv_MSPI_SlaveEnable(FALSE);
453*53ee8cc1Swenshuai.xi 
454*53ee8cc1Swenshuai.xi     return bRet;
455*53ee8cc1Swenshuai.xi }
456*53ee8cc1Swenshuai.xi 
_MSB201X_I2C_CH_Reset(MS_U8 devID,MS_U8 ch_num)457*53ee8cc1Swenshuai.xi static MS_BOOL _MSB201X_I2C_CH_Reset(MS_U8 devID, MS_U8 ch_num)
458*53ee8cc1Swenshuai.xi {
459*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
460*53ee8cc1Swenshuai.xi     //MAPI_U8         addr[4] = {0x00, 0x00, 0x00, 0x00};
461*53ee8cc1Swenshuai.xi     MS_U8         u8data[5] = {0x53, 0x45, 0x52, 0x44, 0x42};
462*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
463*53ee8cc1Swenshuai.xi 
464*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
465*53ee8cc1Swenshuai.xi     printf("[MSB201X][beg]I2C_CH_Reset, CH=0x%x\n",ch_num);
466*53ee8cc1Swenshuai.xi     #endif
467*53ee8cc1Swenshuai.xi 
468*53ee8cc1Swenshuai.xi     if(E_MSB201X_SPI_READ_WRITE == pDemod->DSP_ReadWrite_Mode)
469*53ee8cc1Swenshuai.xi     {
470*53ee8cc1Swenshuai.xi     	return TRUE;
471*53ee8cc1Swenshuai.xi     }
472*53ee8cc1Swenshuai.xi 
473*53ee8cc1Swenshuai.xi     //DMD_LOCK_REG_RW();
474*53ee8cc1Swenshuai.xi 
475*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h53(PWD1)->8,h45(PWD2)->8,h52(PWD3)->8,h44(PWD4)->8,h42(PWD5)
476*53ee8cc1Swenshuai.xi     //u8data[0] = 0x53;
477*53ee8cc1Swenshuai.xi     //bRet &= (*_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access)(E_DMD_MSB201X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB201X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8data);
478*53ee8cc1Swenshuai.xi     if (pDemod->bDemodRest)
479*53ee8cc1Swenshuai.xi     {
480*53ee8cc1Swenshuai.xi         pDemod->bDemodRest = FALSE;
481*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h53(PWD1)->8,h45(PWD2)->8,h52(PWD3)->8,h44(PWD4)->8,h42(PWD5)
482*53ee8cc1Swenshuai.xi         u8data[0] = 0x53;
483*53ee8cc1Swenshuai.xi         // Don't check Ack because this passward only ack one time for the first time.
484*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access)(devID, E_DMD_MSB201X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8data);
485*53ee8cc1Swenshuai.xi     }
486*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h71(CMD)  //TV.n_iic_
487*53ee8cc1Swenshuai.xi     u8data[0] = 0x71;
488*53ee8cc1Swenshuai.xi     bRet &= (pDemod->_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access)(devID, E_DMD_MSB201X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8data);
489*53ee8cc1Swenshuai.xi 
490*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h81(CMD)  //TV.n_iic_sel_b0
491*53ee8cc1Swenshuai.xi     u8data[0] = ((ch_num & 0x01) != 0)? 0x81 : 0x80;
492*53ee8cc1Swenshuai.xi     bRet &= (pDemod->_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access)(devID, E_DMD_MSB201X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8data);
493*53ee8cc1Swenshuai.xi 
494*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h83(CMD)  //TV.n_iic_sel_b1
495*53ee8cc1Swenshuai.xi     u8data[0] = ((ch_num & 0x02) != 0)? 0x83 : 0x82;
496*53ee8cc1Swenshuai.xi     bRet &= (pDemod->_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access)(devID, E_DMD_MSB201X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8data);
497*53ee8cc1Swenshuai.xi 
498*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h84(CMD)  //TV.n_iic_sel_b2
499*53ee8cc1Swenshuai.xi     u8data[0] = ((ch_num & 0x04) != 0)? 0x85 : 0x84;
500*53ee8cc1Swenshuai.xi     bRet &= (pDemod->_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access)(devID, E_DMD_MSB201X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8data);
501*53ee8cc1Swenshuai.xi 
502*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h53(CMD)  //TV.n_iic_ad_byte_en2, 32bit read/write
503*53ee8cc1Swenshuai.xi     u8data[0] = 0x53;
504*53ee8cc1Swenshuai.xi     bRet &= (pDemod->_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access)(devID, E_DMD_MSB201X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8data);
505*53ee8cc1Swenshuai.xi 
506*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h7f(CMD)  //TV.n_iic_sel_use_cfg
507*53ee8cc1Swenshuai.xi     u8data[0] = 0x7f;
508*53ee8cc1Swenshuai.xi     bRet &= (pDemod->_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access)(devID, E_DMD_MSB201X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8data);
509*53ee8cc1Swenshuai.xi 
510*53ee8cc1Swenshuai.xi /*
511*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h35(CMD)  //TV.n_iic_use
512*53ee8cc1Swenshuai.xi     data[0] = 0x35;
513*53ee8cc1Swenshuai.xi     iptr->WriteBytes(0, NULL, 1, data);
514*53ee8cc1Swenshuai.xi 
515*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h71(CMD)  //TV.n_iic_Re-shape
516*53ee8cc1Swenshuai.xi     data[0] = 0x71;
517*53ee8cc1Swenshuai.xi     iptr->WriteBytes(0, NULL, 1, data);
518*53ee8cc1Swenshuai.xi */
519*53ee8cc1Swenshuai.xi     //DMD_UNLOCK_REG_RW();
520*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
521*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[MSB201X][end]I2C_CH_Reset, CH=0x%x\n",ch_num));
522*53ee8cc1Swenshuai.xi     #endif
523*53ee8cc1Swenshuai.xi     return bRet;
524*53ee8cc1Swenshuai.xi }
525*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_GetReg(MS_U8 devID,MS_U32 u32Addr,MS_U8 * pu8Data)526*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMD_MSB201X_GetReg(MS_U8 devID, MS_U32 u32Addr, MS_U8 *pu8Data)  //koln
527*53ee8cc1Swenshuai.xi {
528*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
529*53ee8cc1Swenshuai.xi     MS_U8 u8MsbData[6];
530*53ee8cc1Swenshuai.xi     MS_U16 u16Addr=0;
531*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
532*53ee8cc1Swenshuai.xi 
533*53ee8cc1Swenshuai.xi     if(E_MSB201X_SPI_READ_WRITE == pDemod->DSP_ReadWrite_Mode)
534*53ee8cc1Swenshuai.xi     {
535*53ee8cc1Swenshuai.xi     	if((u32Addr&0x100000)==0x100000)
536*53ee8cc1Swenshuai.xi 	{
537*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SSPI_CFG_W(0x02,0x10);
538*53ee8cc1Swenshuai.xi 	}
539*53ee8cc1Swenshuai.xi 	else
540*53ee8cc1Swenshuai.xi 	{
541*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SSPI_CFG_W(0x02,0x00);
542*53ee8cc1Swenshuai.xi 	}
543*53ee8cc1Swenshuai.xi 	u16Addr=(MS_U16)u32Addr;
544*53ee8cc1Swenshuai.xi     	return MDrv_DMD_SSPI_RIU_Read8(u16Addr, pu8Data);
545*53ee8cc1Swenshuai.xi     }
546*53ee8cc1Swenshuai.xi 
547*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
548*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
549*53ee8cc1Swenshuai.xi     u8MsbData[2] = (u32Addr>>16)&0xff;
550*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u32Addr >> 8) &0xff;
551*53ee8cc1Swenshuai.xi     u8MsbData[4] = u32Addr & 0xff;
552*53ee8cc1Swenshuai.xi 
553*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x35;
554*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access)(devID, E_DMD_MSB201X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
555*53ee8cc1Swenshuai.xi 
556*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
557*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access)(devID, E_DMD_MSB201X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8MsbData);
558*53ee8cc1Swenshuai.xi     bRet=(pDemod->_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access)(devID, E_DMD_MSB201X_DEMOD_I2C_READ_BYTES, 0, NULL, 1, pu8Data);
559*53ee8cc1Swenshuai.xi 
560*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x34;
561*53ee8cc1Swenshuai.xi 
562*53ee8cc1Swenshuai.xi 		(pDemod->_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access)(devID, E_DMD_MSB201X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
563*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
564*53ee8cc1Swenshuai.xi     if (eDMD_MSB201X_DbgLevel >= E_DMD_MSB201X_DBGLV_DEBUG)
565*53ee8cc1Swenshuai.xi     {
566*53ee8cc1Swenshuai.xi         printf("_MDrv_DMD_MSB201X_GetReg %x %x\n", u16Addr, *pu8Data);
567*53ee8cc1Swenshuai.xi     }
568*53ee8cc1Swenshuai.xi     #endif
569*53ee8cc1Swenshuai.xi 
570*53ee8cc1Swenshuai.xi     return bRet;
571*53ee8cc1Swenshuai.xi }
572*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_GetReg(MS_U8 devID,MS_U32 u32Addr,MS_U8 * pu8Data)573*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_GetReg(MS_U8 devID, MS_U32 u32Addr, MS_U8 *pu8Data)  //koln
574*53ee8cc1Swenshuai.xi {
575*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
576*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
577*53ee8cc1Swenshuai.xi 
578*53ee8cc1Swenshuai.xi     DMD_LOCK();
579*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB201X_GetReg(devID, u32Addr, pu8Data);
580*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
581*53ee8cc1Swenshuai.xi 
582*53ee8cc1Swenshuai.xi     return bRet;
583*53ee8cc1Swenshuai.xi }
584*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_SetReg(MS_U8 devID,MS_U32 u32Addr,MS_U8 u8Data)585*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMD_MSB201X_SetReg(MS_U8 devID, MS_U32 u32Addr, MS_U8 u8Data)  //koln
586*53ee8cc1Swenshuai.xi {
587*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
588*53ee8cc1Swenshuai.xi     MS_U8 u8MsbData[6];
589*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
590*53ee8cc1Swenshuai.xi     MS_U16 u16Addr;
591*53ee8cc1Swenshuai.xi 
592*53ee8cc1Swenshuai.xi     if(E_MSB201X_SPI_READ_WRITE == pDemod->DSP_ReadWrite_Mode)
593*53ee8cc1Swenshuai.xi     {
594*53ee8cc1Swenshuai.xi 	if((u32Addr&0x100000)==0x100000)
595*53ee8cc1Swenshuai.xi 	{
596*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SSPI_CFG_W(0x02,0x10);
597*53ee8cc1Swenshuai.xi 	}
598*53ee8cc1Swenshuai.xi 	else
599*53ee8cc1Swenshuai.xi 	{
600*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SSPI_CFG_W(0x02,0x00);
601*53ee8cc1Swenshuai.xi 	}
602*53ee8cc1Swenshuai.xi 
603*53ee8cc1Swenshuai.xi     	u16Addr=(MS_U16)u32Addr;
604*53ee8cc1Swenshuai.xi     	return MDrv_DMD_SSPI_RIU_Write8(u16Addr, u8Data);
605*53ee8cc1Swenshuai.xi     }
606*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
607*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
608*53ee8cc1Swenshuai.xi     u8MsbData[2] = (u32Addr>>16)&0xff;
609*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u32Addr >> 8) &0xff;
610*53ee8cc1Swenshuai.xi     u8MsbData[4] = u32Addr &0xff;
611*53ee8cc1Swenshuai.xi     u8MsbData[5] = u8Data;
612*53ee8cc1Swenshuai.xi 
613*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x35;
614*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access)(devID, E_DMD_MSB201X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
615*53ee8cc1Swenshuai.xi 
616*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
617*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access)(devID, E_DMD_MSB201X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 6, u8MsbData);
618*53ee8cc1Swenshuai.xi 
619*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x34;
620*53ee8cc1Swenshuai.xi     bRet=(pDemod->_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access)(devID, E_DMD_MSB201X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
621*53ee8cc1Swenshuai.xi     return bRet;
622*53ee8cc1Swenshuai.xi }
623*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_SetReg(MS_U8 devID,MS_U32 u32Addr,MS_U8 u8Data)624*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_SetReg(MS_U8 devID, MS_U32 u32Addr, MS_U8 u8Data)  //koln
625*53ee8cc1Swenshuai.xi {
626*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
627*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
628*53ee8cc1Swenshuai.xi 
629*53ee8cc1Swenshuai.xi     DMD_LOCK();
630*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB201X_SetReg(devID, u32Addr, u8Data);
631*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
632*53ee8cc1Swenshuai.xi 
633*53ee8cc1Swenshuai.xi     return bRet;
634*53ee8cc1Swenshuai.xi }
635*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_SetRegs(MS_U8 devID,MS_U32 u32Addr,MS_U8 * u8pData,MS_U16 data_size)636*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMD_MSB201X_SetRegs(MS_U8 devID, MS_U32 u32Addr, MS_U8* u8pData, MS_U16 data_size)  //koln
637*53ee8cc1Swenshuai.xi {
638*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
639*53ee8cc1Swenshuai.xi     MS_U8   u8MsbDataValue[LOAD_CODE_I2C_BLOCK_NUM + 5];
640*53ee8cc1Swenshuai.xi     MS_U16   idx = 0;
641*53ee8cc1Swenshuai.xi     MS_U16   u16Addr=0;
642*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
643*53ee8cc1Swenshuai.xi 
644*53ee8cc1Swenshuai.xi     if(E_MSB201X_SPI_READ_WRITE == pDemod->DSP_ReadWrite_Mode)
645*53ee8cc1Swenshuai.xi     {
646*53ee8cc1Swenshuai.xi 	if((u32Addr&0x100000)==0x100000)
647*53ee8cc1Swenshuai.xi 	{
648*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SSPI_CFG_W(0x02,0x10);
649*53ee8cc1Swenshuai.xi 	}
650*53ee8cc1Swenshuai.xi 	else
651*53ee8cc1Swenshuai.xi 	{
652*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SSPI_CFG_W(0x02,0x00);
653*53ee8cc1Swenshuai.xi 	}
654*53ee8cc1Swenshuai.xi     	u16Addr=(MS_U16)u32Addr;
655*53ee8cc1Swenshuai.xi        for(idx = 0; idx < data_size; idx++)
656*53ee8cc1Swenshuai.xi        {
657*53ee8cc1Swenshuai.xi            MDrv_DMD_SSPI_RIU_Write8(u16Addr + idx, *(u8pData + idx));
658*53ee8cc1Swenshuai.xi        }
659*53ee8cc1Swenshuai.xi        return TRUE;
660*53ee8cc1Swenshuai.xi     }
661*53ee8cc1Swenshuai.xi 
662*53ee8cc1Swenshuai.xi     u8MsbDataValue[0] = 0x10;
663*53ee8cc1Swenshuai.xi     u8MsbDataValue[1] = 0x00;
664*53ee8cc1Swenshuai.xi     u8MsbDataValue[2] = (u32Addr>>16)& 0xff;
665*53ee8cc1Swenshuai.xi     u8MsbDataValue[3] = (u32Addr >> 8) &0xff;
666*53ee8cc1Swenshuai.xi     u8MsbDataValue[4] = u32Addr & 0xff;
667*53ee8cc1Swenshuai.xi     // u8MsbDataValue[5] = 0x00;
668*53ee8cc1Swenshuai.xi 
669*53ee8cc1Swenshuai.xi     for(idx = 0; idx < data_size ; idx++)
670*53ee8cc1Swenshuai.xi     {
671*53ee8cc1Swenshuai.xi         u8MsbDataValue[5+idx] = u8pData[idx];
672*53ee8cc1Swenshuai.xi     }
673*53ee8cc1Swenshuai.xi 
674*53ee8cc1Swenshuai.xi     u8MsbDataValue[0] = 0x35;
675*53ee8cc1Swenshuai.xi     bRet &= (pDemod->_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access)(devID, E_DMD_MSB201X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbDataValue);
676*53ee8cc1Swenshuai.xi 
677*53ee8cc1Swenshuai.xi     u8MsbDataValue[0] = 0x10;
678*53ee8cc1Swenshuai.xi     bRet &= (pDemod->_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access)(devID, E_DMD_MSB201X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5 + data_size, u8MsbDataValue);
679*53ee8cc1Swenshuai.xi 
680*53ee8cc1Swenshuai.xi     u8MsbDataValue[0] = 0x34;
681*53ee8cc1Swenshuai.xi     bRet &= (pDemod->_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access)(devID, E_DMD_MSB201X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbDataValue);
682*53ee8cc1Swenshuai.xi 
683*53ee8cc1Swenshuai.xi     return bRet;
684*53ee8cc1Swenshuai.xi }
685*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_SetRegs(MS_U8 devID,MS_U32 u32Addr,MS_U8 * u8pData,MS_U16 data_size)686*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_SetRegs(MS_U8 devID, MS_U32 u32Addr, MS_U8* u8pData, MS_U16 data_size)  //Koln
687*53ee8cc1Swenshuai.xi {
688*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
689*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
690*53ee8cc1Swenshuai.xi 
691*53ee8cc1Swenshuai.xi     DMD_LOCK();
692*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB201X_SetRegs(devID, u32Addr, u8pData, data_size);
693*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
694*53ee8cc1Swenshuai.xi 
695*53ee8cc1Swenshuai.xi     return bRet;
696*53ee8cc1Swenshuai.xi }
697*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_SetReg2Bytes(MS_U8 devID,MS_U32 u32Addr,MS_U16 u16Data)698*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMD_MSB201X_SetReg2Bytes(MS_U8 devID, MS_U32 u32Addr, MS_U16 u16Data)  //koln
699*53ee8cc1Swenshuai.xi {
700*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
701*53ee8cc1Swenshuai.xi     MS_U16 u16Addr=0;
702*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
703*53ee8cc1Swenshuai.xi 
704*53ee8cc1Swenshuai.xi     if(E_MSB201X_SPI_READ_WRITE == pDemod->DSP_ReadWrite_Mode)
705*53ee8cc1Swenshuai.xi     {
706*53ee8cc1Swenshuai.xi 
707*53ee8cc1Swenshuai.xi 	if((u32Addr&0x100000)==0x100000)
708*53ee8cc1Swenshuai.xi 	{
709*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SSPI_CFG_W(0x02,0x10);
710*53ee8cc1Swenshuai.xi 	}
711*53ee8cc1Swenshuai.xi 	else
712*53ee8cc1Swenshuai.xi 	{
713*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SSPI_CFG_W(0x02,0x00);
714*53ee8cc1Swenshuai.xi 	}
715*53ee8cc1Swenshuai.xi 
716*53ee8cc1Swenshuai.xi 	u16Addr=(MS_U16)u32Addr;
717*53ee8cc1Swenshuai.xi 
718*53ee8cc1Swenshuai.xi 	MDrv_DMD_SSPI_RIU_Write8(u16Addr, u16Data);
719*53ee8cc1Swenshuai.xi 	return MDrv_DMD_SSPI_RIU_Write8(u16Addr+1, (u16Data>>8));
720*53ee8cc1Swenshuai.xi     }
721*53ee8cc1Swenshuai.xi 
722*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB201X_SetReg(devID, u32Addr, (MS_U8)u16Data&0x00ff);
723*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB201X_SetReg(devID, u32Addr + 0x0001, (MS_U8)(u16Data>>8)&0x00ff);
724*53ee8cc1Swenshuai.xi 
725*53ee8cc1Swenshuai.xi     return bRet;
726*53ee8cc1Swenshuai.xi }
727*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_SetReg2Bytes(MS_U8 devID,MS_U32 u32Addr,MS_U16 u16Data)728*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_SetReg2Bytes(MS_U8 devID, MS_U32 u32Addr, MS_U16 u16Data)   //koln
729*53ee8cc1Swenshuai.xi {
730*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
731*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
732*53ee8cc1Swenshuai.xi     DMD_LOCK();
733*53ee8cc1Swenshuai.xi 
734*53ee8cc1Swenshuai.xi 
735*53ee8cc1Swenshuai.xi 
736*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB201X_SetReg2Bytes(devID, u32Addr, u16Data);
737*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
738*53ee8cc1Swenshuai.xi 
739*53ee8cc1Swenshuai.xi     return bRet;
740*53ee8cc1Swenshuai.xi }
741*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_GetDSPReg(MS_U8 devID,MS_U8 u8DemodIndex,MS_U16 u16Addr,MS_U8 * pu8Data)742*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_GetDSPReg(MS_U8 devID, MS_U8 u8DemodIndex, MS_U16 u16Addr, MS_U8 *pu8Data)
743*53ee8cc1Swenshuai.xi {
744*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
745*53ee8cc1Swenshuai.xi     MS_U8     u8Cntl = 0x00;
746*53ee8cc1Swenshuai.xi     MS_U16    u16Cntr = 0x00;
747*53ee8cc1Swenshuai.xi     MS_U32    u32REG_MB_CNTL, u32REG_MB_ADDR_L, u32REG_MB_ADDR_H, u32REG_MB_DATA, u32REG_EXT_INTR;
748*53ee8cc1Swenshuai.xi 
749*53ee8cc1Swenshuai.xi     switch(u8DemodIndex)
750*53ee8cc1Swenshuai.xi     {
751*53ee8cc1Swenshuai.xi     	case 0:
752*53ee8cc1Swenshuai.xi 			u32REG_MB_CNTL = REG_DMD0_MB_CNTL;
753*53ee8cc1Swenshuai.xi 			u32REG_MB_ADDR_L = REG_DMD0_MB_ADDR_L;
754*53ee8cc1Swenshuai.xi 			u32REG_MB_ADDR_H = REG_DMD0_MB_ADDR_H;
755*53ee8cc1Swenshuai.xi 			u32REG_MB_DATA = REG_DMD0_MB_DATA;
756*53ee8cc1Swenshuai.xi 			u32REG_EXT_INTR = (REG_MCU51_INTR + (0x41)*2+1);
757*53ee8cc1Swenshuai.xi 			break;
758*53ee8cc1Swenshuai.xi 	case 1:
759*53ee8cc1Swenshuai.xi 			u32REG_MB_CNTL = REG_DMD1_MB_CNTL;
760*53ee8cc1Swenshuai.xi 			u32REG_MB_ADDR_L = REG_DMD1_MB_ADDR_L;
761*53ee8cc1Swenshuai.xi 			u32REG_MB_ADDR_H = REG_DMD1_MB_ADDR_H;
762*53ee8cc1Swenshuai.xi 			u32REG_MB_DATA = REG_DMD1_MB_DATA;
763*53ee8cc1Swenshuai.xi 			u32REG_EXT_INTR = (REG_MCU51_INTR + (0x51)*2+1);
764*53ee8cc1Swenshuai.xi 			break;
765*53ee8cc1Swenshuai.xi /*
766*53ee8cc1Swenshuai.xi 	case 2:
767*53ee8cc1Swenshuai.xi 			u16REG_MB_CNTL = REG_DMD2_MB_CNTL;
768*53ee8cc1Swenshuai.xi 			u16REG_MB_ADDR_L = REG_DMD2_MB_ADDR_L;
769*53ee8cc1Swenshuai.xi 			u16REG_MB_ADDR_H = REG_DMD2_MB_ADDR_H;
770*53ee8cc1Swenshuai.xi 			u16REG_MB_DATA = REG_DMD2_MB_DATA;
771*53ee8cc1Swenshuai.xi 			u16REG_EXT_INTR = (REG_MCU51_INTR + (0x60)*2);
772*53ee8cc1Swenshuai.xi 			break;
773*53ee8cc1Swenshuai.xi 	case 3:
774*53ee8cc1Swenshuai.xi 			u16REG_MB_CNTL = REG_DMD3_MB_CNTL;
775*53ee8cc1Swenshuai.xi 			u16REG_MB_ADDR_L = REG_DMD3_MB_ADDR_L;
776*53ee8cc1Swenshuai.xi 			u16REG_MB_ADDR_H = REG_DMD3_MB_ADDR_H;
777*53ee8cc1Swenshuai.xi 			u16REG_MB_DATA = REG_DMD3_MB_DATA;
778*53ee8cc1Swenshuai.xi 			u16REG_EXT_INTR = (REG_MCU51_INTR + (0x70)*2);
779*53ee8cc1Swenshuai.xi 			break;
780*53ee8cc1Swenshuai.xi */
781*53ee8cc1Swenshuai.xi 	default:
782*53ee8cc1Swenshuai.xi 			u32REG_MB_CNTL = REG_DMD0_MB_CNTL;
783*53ee8cc1Swenshuai.xi 			u32REG_MB_ADDR_L = REG_DMD0_MB_ADDR_L;
784*53ee8cc1Swenshuai.xi 			u32REG_MB_ADDR_H = REG_DMD0_MB_ADDR_H;
785*53ee8cc1Swenshuai.xi 			u32REG_MB_DATA = REG_DMD0_MB_DATA;
786*53ee8cc1Swenshuai.xi 			u32REG_EXT_INTR = (REG_MCU51_INTR + (0x40)*2+1);
787*53ee8cc1Swenshuai.xi 			break;
788*53ee8cc1Swenshuai.xi     }
789*53ee8cc1Swenshuai.xi 
790*53ee8cc1Swenshuai.xi     // Write into MB
791*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB201X_SetReg(devID, u32REG_MB_ADDR_H, (MS_U8)(u16Addr >> 8));
792*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB201X_SetReg(devID, u32REG_MB_ADDR_L, (MS_U8)(u16Addr));
793*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB201X_SetReg(devID, u32REG_MB_CNTL, 0x03);
794*53ee8cc1Swenshuai.xi     // assert interrupt to DMD MCU51
795*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB201X_GetReg(devID, u32REG_EXT_INTR , &u8Cntl);
796*53ee8cc1Swenshuai.xi     u8Cntl |= 0x02; //assert interrupt bit
797*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB201X_SetReg(devID, u32REG_EXT_INTR , u8Cntl);
798*53ee8cc1Swenshuai.xi 
799*53ee8cc1Swenshuai.xi     do
800*53ee8cc1Swenshuai.xi     {
801*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB201X_GetReg(devID, u32REG_MB_CNTL, &u8Cntl);
802*53ee8cc1Swenshuai.xi         if (u16Cntr++ > 0x7ff)
803*53ee8cc1Swenshuai.xi         {
804*53ee8cc1Swenshuai.xi             //#ifdef MS_DEBUG
805*53ee8cc1Swenshuai.xi             //if (eDMD_MSB201X_DbgLevel >= E_DMD_MSB201X_DBGLV_DEBUG)
806*53ee8cc1Swenshuai.xi             {
807*53ee8cc1Swenshuai.xi                 printf("MSB201X_MB_READ_FAILURE\n");
808*53ee8cc1Swenshuai.xi             }
809*53ee8cc1Swenshuai.xi             //#endif
810*53ee8cc1Swenshuai.xi             return FALSE;
811*53ee8cc1Swenshuai.xi         }
812*53ee8cc1Swenshuai.xi     }
813*53ee8cc1Swenshuai.xi     while(u8Cntl != 0xff);
814*53ee8cc1Swenshuai.xi 
815*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB201X_GetReg(devID, u32REG_MB_DATA, pu8Data);
816*53ee8cc1Swenshuai.xi 
817*53ee8cc1Swenshuai.xi 
818*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB201X_GetReg(devID, u32REG_EXT_INTR , &u8Cntl);
819*53ee8cc1Swenshuai.xi     u8Cntl &= (~0x02); //deassert interrupt bit
820*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB201X_SetReg(devID, u32REG_EXT_INTR , u8Cntl);
821*53ee8cc1Swenshuai.xi 
822*53ee8cc1Swenshuai.xi     return bRet;
823*53ee8cc1Swenshuai.xi }
824*53ee8cc1Swenshuai.xi 
825*53ee8cc1Swenshuai.xi //1 means bypass en, 0 means bypass disable
MDrv_DMD_MSB201X_I2C_BYPASS(MS_U8 devID,MS_U8 bypass_en)826*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_I2C_BYPASS(MS_U8 devID,MS_U8 bypass_en)
827*53ee8cc1Swenshuai.xi {
828*53ee8cc1Swenshuai.xi 		MS_BOOL bRet=TRUE;
829*53ee8cc1Swenshuai.xi 		MS_U8 u8Data=0;
830*53ee8cc1Swenshuai.xi 		tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
831*53ee8cc1Swenshuai.xi 		_MSB201X_I2C_CH_Reset(devID, 3);
832*53ee8cc1Swenshuai.xi 
833*53ee8cc1Swenshuai.xi 		DMD_LOCK();
834*53ee8cc1Swenshuai.xi 		bRet &= _MDrv_DMD_MSB201X_GetReg(devID, 0x100910, &u8Data);
835*53ee8cc1Swenshuai.xi 
836*53ee8cc1Swenshuai.xi 		if(bypass_en==1)
837*53ee8cc1Swenshuai.xi 		{
838*53ee8cc1Swenshuai.xi 				u8Data|=0x10;
839*53ee8cc1Swenshuai.xi 				bRet &= _MDrv_DMD_MSB201X_SetReg(devID, 0x100910, u8Data);
840*53ee8cc1Swenshuai.xi 		}
841*53ee8cc1Swenshuai.xi 		else
842*53ee8cc1Swenshuai.xi 		{
843*53ee8cc1Swenshuai.xi 				u8Data&=(~0x10);
844*53ee8cc1Swenshuai.xi 			  bRet &= _MDrv_DMD_MSB201X_SetReg(devID, 0x100910, u8Data);
845*53ee8cc1Swenshuai.xi 		}
846*53ee8cc1Swenshuai.xi 		DMD_UNLOCK();
847*53ee8cc1Swenshuai.xi 
848*53ee8cc1Swenshuai.xi 		return bRet;
849*53ee8cc1Swenshuai.xi }
850*53ee8cc1Swenshuai.xi 
851*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_GetDSPReg(MS_U8 devID,MS_U8 u8DemodIndex,MS_U16 u16Addr,MS_U8 * pu8Data)852*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_GetDSPReg(MS_U8 devID, MS_U8 u8DemodIndex, MS_U16 u16Addr, MS_U8 *pu8Data)
853*53ee8cc1Swenshuai.xi {
854*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
855*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
856*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 3);
857*53ee8cc1Swenshuai.xi 
858*53ee8cc1Swenshuai.xi 
859*53ee8cc1Swenshuai.xi 
860*53ee8cc1Swenshuai.xi     DMD_LOCK();
861*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB201X_GetDSPReg(devID, u8DemodIndex, u16Addr, pu8Data);
862*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
863*53ee8cc1Swenshuai.xi 
864*53ee8cc1Swenshuai.xi     return bRet;
865*53ee8cc1Swenshuai.xi }
866*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_SetDSPReg(MS_U8 devID,MS_U8 u8DemodIndex,MS_U16 u16Addr,MS_U8 u8Data)867*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_SetDSPReg(MS_U8 devID, MS_U8 u8DemodIndex, MS_U16 u16Addr, MS_U8 u8Data)
868*53ee8cc1Swenshuai.xi {
869*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
870*53ee8cc1Swenshuai.xi     MS_U8     u8Cntl = 0x00;
871*53ee8cc1Swenshuai.xi     MS_U16    u16Cntr = 0x00;
872*53ee8cc1Swenshuai.xi 
873*53ee8cc1Swenshuai.xi     MS_U32    u32REG_MB_CNTL, u32REG_MB_ADDR_L, u32REG_MB_ADDR_H, u32REG_MB_DATA, u32REG_EXT_INTR;
874*53ee8cc1Swenshuai.xi 
875*53ee8cc1Swenshuai.xi     switch(u8DemodIndex)
876*53ee8cc1Swenshuai.xi     {
877*53ee8cc1Swenshuai.xi     	case 0:
878*53ee8cc1Swenshuai.xi 			u32REG_MB_CNTL = REG_DMD0_MB_CNTL;
879*53ee8cc1Swenshuai.xi 			u32REG_MB_ADDR_L = REG_DMD0_MB_ADDR_L;
880*53ee8cc1Swenshuai.xi 			u32REG_MB_ADDR_H = REG_DMD0_MB_ADDR_H;
881*53ee8cc1Swenshuai.xi 			u32REG_MB_DATA = REG_DMD0_MB_DATA;
882*53ee8cc1Swenshuai.xi 			u32REG_EXT_INTR = (REG_MCU51_INTR + (0x41)*2+1);
883*53ee8cc1Swenshuai.xi 			break;
884*53ee8cc1Swenshuai.xi 	case 1:
885*53ee8cc1Swenshuai.xi 			u32REG_MB_CNTL = REG_DMD1_MB_CNTL;
886*53ee8cc1Swenshuai.xi 			u32REG_MB_ADDR_L = REG_DMD1_MB_ADDR_L;
887*53ee8cc1Swenshuai.xi 			u32REG_MB_ADDR_H = REG_DMD1_MB_ADDR_H;
888*53ee8cc1Swenshuai.xi 			u32REG_MB_DATA = REG_DMD1_MB_DATA;
889*53ee8cc1Swenshuai.xi 			u32REG_EXT_INTR = (REG_MCU51_INTR + (0x51)*2+1);
890*53ee8cc1Swenshuai.xi 			break;
891*53ee8cc1Swenshuai.xi 	/*
892*53ee8cc1Swenshuai.xi 	case 2:
893*53ee8cc1Swenshuai.xi 			u16REG_MB_CNTL = REG_DMD2_MB_CNTL;
894*53ee8cc1Swenshuai.xi 			u16REG_MB_ADDR_L = REG_DMD2_MB_ADDR_L;
895*53ee8cc1Swenshuai.xi 			u16REG_MB_ADDR_H = REG_DMD2_MB_ADDR_H;
896*53ee8cc1Swenshuai.xi 			u16REG_MB_DATA = REG_DMD2_MB_DATA;
897*53ee8cc1Swenshuai.xi 			u16REG_EXT_INTR = (REG_MCU51_INTR + (0x60)*2);
898*53ee8cc1Swenshuai.xi 			break;
899*53ee8cc1Swenshuai.xi 	case 3:
900*53ee8cc1Swenshuai.xi 			u16REG_MB_CNTL = REG_DMD3_MB_CNTL;
901*53ee8cc1Swenshuai.xi 			u16REG_MB_ADDR_L = REG_DMD3_MB_ADDR_L;
902*53ee8cc1Swenshuai.xi 			u16REG_MB_ADDR_H = REG_DMD3_MB_ADDR_H;
903*53ee8cc1Swenshuai.xi 			u16REG_MB_DATA = REG_DMD3_MB_DATA;
904*53ee8cc1Swenshuai.xi 			u16REG_EXT_INTR = (REG_MCU51_INTR + (0x70)*2);
905*53ee8cc1Swenshuai.xi 			break;
906*53ee8cc1Swenshuai.xi 	*/
907*53ee8cc1Swenshuai.xi 	default:
908*53ee8cc1Swenshuai.xi 			u32REG_MB_CNTL = REG_DMD0_MB_CNTL;
909*53ee8cc1Swenshuai.xi 			u32REG_MB_ADDR_L = REG_DMD0_MB_ADDR_L;
910*53ee8cc1Swenshuai.xi 			u32REG_MB_ADDR_H = REG_DMD0_MB_ADDR_H;
911*53ee8cc1Swenshuai.xi 			u32REG_MB_DATA = REG_DMD0_MB_DATA;
912*53ee8cc1Swenshuai.xi 			u32REG_EXT_INTR = (REG_MCU51_INTR + (0x41)*2+1);
913*53ee8cc1Swenshuai.xi 			break;
914*53ee8cc1Swenshuai.xi     }
915*53ee8cc1Swenshuai.xi 
916*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 3);
917*53ee8cc1Swenshuai.xi     // Write into MB
918*53ee8cc1Swenshuai.xi  //   pDemod->DSP_ReadWrite_Mode = E_MSB201X_SPI_READ_WRITE;
919*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB201X_SetReg(devID, u32REG_MB_DATA, u8Data);
920*53ee8cc1Swenshuai.xi 
921*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB201X_SetReg(devID, u32REG_MB_ADDR_H, (MS_U8)(u16Addr >> 8));
922*53ee8cc1Swenshuai.xi 
923*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB201X_SetReg(devID, u32REG_MB_ADDR_L, (MS_U8)(u16Addr));
924*53ee8cc1Swenshuai.xi 
925*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB201X_SetReg(devID, u32REG_MB_CNTL, 0x04);
926*53ee8cc1Swenshuai.xi     // assert interrupt to DMD MCU51
927*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB201X_GetReg(devID, u32REG_EXT_INTR , &u8Cntl);
928*53ee8cc1Swenshuai.xi     u8Cntl |= 0x02; //assert interrupt bit
929*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB201X_SetReg(devID, u32REG_EXT_INTR , u8Cntl);
930*53ee8cc1Swenshuai.xi 
931*53ee8cc1Swenshuai.xi     u8Cntl &= (~0x02); //deassert interrupt bit
932*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB201X_SetReg(devID, u32REG_EXT_INTR , u8Cntl);
933*53ee8cc1Swenshuai.xi 
934*53ee8cc1Swenshuai.xi     do
935*53ee8cc1Swenshuai.xi     {
936*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB201X_GetReg(devID, u32REG_MB_CNTL, &u8Cntl);
937*53ee8cc1Swenshuai.xi         if (u16Cntr++ > 0x7ff)
938*53ee8cc1Swenshuai.xi         {
939*53ee8cc1Swenshuai.xi             //#ifdef MS_DEBUG
940*53ee8cc1Swenshuai.xi             //if (eDMD_MSB201X_DbgLevel >= E_DMD_MSB201X_DBGLV_DEBUG)
941*53ee8cc1Swenshuai.xi             {
942*53ee8cc1Swenshuai.xi                 printf("MSB201X_MB_WRITE_FAILURE\n");
943*53ee8cc1Swenshuai.xi             }
944*53ee8cc1Swenshuai.xi             //#endif
945*53ee8cc1Swenshuai.xi             return false;
946*53ee8cc1Swenshuai.xi         }
947*53ee8cc1Swenshuai.xi     }
948*53ee8cc1Swenshuai.xi     while(u8Cntl != 0xff);
949*53ee8cc1Swenshuai.xi 
950*53ee8cc1Swenshuai.xi 
951*53ee8cc1Swenshuai.xi 
952*53ee8cc1Swenshuai.xi 
953*53ee8cc1Swenshuai.xi     return bRet;
954*53ee8cc1Swenshuai.xi }
955*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_SetDSPReg(MS_U8 devID,MS_U8 u8DemodIndex,MS_U16 u16Addr,MS_U8 u8Data)956*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_SetDSPReg(MS_U8 devID, MS_U8 u8DemodIndex, MS_U16 u16Addr, MS_U8 u8Data)
957*53ee8cc1Swenshuai.xi {
958*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
959*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
960*53ee8cc1Swenshuai.xi 
961*53ee8cc1Swenshuai.xi     DMD_LOCK();
962*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB201X_SetDSPReg(devID, u8DemodIndex, u16Addr, u8Data);
963*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
964*53ee8cc1Swenshuai.xi 
965*53ee8cc1Swenshuai.xi     return bRet;
966*53ee8cc1Swenshuai.xi }
967*53ee8cc1Swenshuai.xi 
_MSB201X_Delay_Task(MS_U32 task_num)968*53ee8cc1Swenshuai.xi static MS_BOOL _MSB201X_Delay_Task(MS_U32 task_num)
969*53ee8cc1Swenshuai.xi {
970*53ee8cc1Swenshuai.xi 	unsigned int n = 0;
971*53ee8cc1Swenshuai.xi 
972*53ee8cc1Swenshuai.xi 	while(n < task_num)
973*53ee8cc1Swenshuai.xi 	{
974*53ee8cc1Swenshuai.xi 		n++;
975*53ee8cc1Swenshuai.xi 	}
976*53ee8cc1Swenshuai.xi 	return TRUE;
977*53ee8cc1Swenshuai.xi }
978*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_Version(MS_U8 devID,MS_U8 u8DemodIndex,MS_U16 * ver)979*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_Version(MS_U8 devID, MS_U8 u8DemodIndex, MS_U16 *ver)
980*53ee8cc1Swenshuai.xi {
981*53ee8cc1Swenshuai.xi 
982*53ee8cc1Swenshuai.xi     MS_U8 status = true;
983*53ee8cc1Swenshuai.xi     MS_U8 tmp = 0;
984*53ee8cc1Swenshuai.xi     MS_U16 u16_Demod_Version;
985*53ee8cc1Swenshuai.xi 
986*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 5);
987*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_GetReg(devID, TOP_REG_BASE + 0xC1, &tmp);
988*53ee8cc1Swenshuai.xi     u16_Demod_Version = tmp;
989*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_GetReg(devID, TOP_REG_BASE + 0xC2, &tmp);
990*53ee8cc1Swenshuai.xi     u16_Demod_Version = u16_Demod_Version<<8|tmp;
991*53ee8cc1Swenshuai.xi     *ver = u16_Demod_Version;
992*53ee8cc1Swenshuai.xi 
993*53ee8cc1Swenshuai.xi     return status;
994*53ee8cc1Swenshuai.xi }
995*53ee8cc1Swenshuai.xi 
996*53ee8cc1Swenshuai.xi //new TS pad switching adding
_MDrv_DMD_MSB201X_Set_TSOut(MS_U8 devID,sDMD_MSB201X_TS_Param * pDMD_MSB201X_TS_Param)997*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_Set_TSOut(MS_U8 devID, sDMD_MSB201X_TS_Param *pDMD_MSB201X_TS_Param)
998*53ee8cc1Swenshuai.xi {
999*53ee8cc1Swenshuai.xi 	MS_U8 u8Data = 0, u8Data_tmp = 0, idx = 0;
1000*53ee8cc1Swenshuai.xi 
1001*53ee8cc1Swenshuai.xi 	tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
1002*53ee8cc1Swenshuai.xi 
1003*53ee8cc1Swenshuai.xi 	if(TRUE == pDemod->bDMD_MSB201X_TS_Param_Init_Done)
1004*53ee8cc1Swenshuai.xi 	{
1005*53ee8cc1Swenshuai.xi 		if(pDMD_MSB201X_TS_Param->eTSMode != pDemod->sDMD_MSB201X_TS_Param.eTSMode)
1006*53ee8cc1Swenshuai.xi 			pDemod->bDMD_MSB201X_TS_Param_Init_Done = FALSE;
1007*53ee8cc1Swenshuai.xi 	}
1008*53ee8cc1Swenshuai.xi 
1009*53ee8cc1Swenshuai.xi 	_MSB201X_I2C_CH_Reset(devID, 3);
1010*53ee8cc1Swenshuai.xi 
1011*53ee8cc1Swenshuai.xi 	// reg_swrst_ts_mux
1012*53ee8cc1Swenshuai.xi 	_MDrv_DMD_MSB201X_SetReg(devID, 0x100B00 + (0x70)*2, 0x00);
1013*53ee8cc1Swenshuai.xi 
1014*53ee8cc1Swenshuai.xi 
1015*53ee8cc1Swenshuai.xi 				// Set clock
1016*53ee8cc1Swenshuai.xi 				if(E_DMD_MSB201X_TS_CLK_MAX == pDMD_MSB201X_TS_Param->eTSClk)
1017*53ee8cc1Swenshuai.xi 			  {
1018*53ee8cc1Swenshuai.xi                     _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x06);
1019*53ee8cc1Swenshuai.xi         }
1020*53ee8cc1Swenshuai.xi 				else   //TS clock setting using AP parameter //later
1021*53ee8cc1Swenshuai.xi 			  {
1022*53ee8cc1Swenshuai.xi 			  			switch(pDMD_MSB201X_TS_Param->eTSClk)
1023*53ee8cc1Swenshuai.xi 			  			{
1024*53ee8cc1Swenshuai.xi                 case  E_DMD_MSB201X_TS_CLK_216MHz :
1025*53ee8cc1Swenshuai.xi                 	_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x00);
1026*53ee8cc1Swenshuai.xi                 break;
1027*53ee8cc1Swenshuai.xi                 case  E_DMD_MSB201X_TS_CLK_108MHz  :
1028*53ee8cc1Swenshuai.xi                 	_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x01);
1029*53ee8cc1Swenshuai.xi                 break;
1030*53ee8cc1Swenshuai.xi                 case  E_DMD_MSB201X_TS_CLK_72MHz  :
1031*53ee8cc1Swenshuai.xi                 	_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x02);
1032*53ee8cc1Swenshuai.xi                 break;
1033*53ee8cc1Swenshuai.xi                 case  E_DMD_MSB201X_TS_CLK_54MHz  :
1034*53ee8cc1Swenshuai.xi                 	_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x03);
1035*53ee8cc1Swenshuai.xi                 break;
1036*53ee8cc1Swenshuai.xi                 case  E_DMD_MSB201X_TS_CLK_43p2MHz:
1037*53ee8cc1Swenshuai.xi                 	_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x04);
1038*53ee8cc1Swenshuai.xi                 break;
1039*53ee8cc1Swenshuai.xi                 case  E_DMD_MSB201X_TS_CLK_36MHz  :
1040*53ee8cc1Swenshuai.xi                 	_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x05);
1041*53ee8cc1Swenshuai.xi                 break;
1042*53ee8cc1Swenshuai.xi                 case  E_DMD_MSB201X_TS_CLK_30p8MHz:
1043*53ee8cc1Swenshuai.xi                 	_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x06);
1044*53ee8cc1Swenshuai.xi                 break;
1045*53ee8cc1Swenshuai.xi                 case  E_DMD_MSB201X_TS_CLK_27MHz:
1046*53ee8cc1Swenshuai.xi                 	_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x07);
1047*53ee8cc1Swenshuai.xi                 break;
1048*53ee8cc1Swenshuai.xi                 case  E_DMD_MSB201X_TS_CLK_24MHz  :
1049*53ee8cc1Swenshuai.xi                 	_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x08);
1050*53ee8cc1Swenshuai.xi                 break;
1051*53ee8cc1Swenshuai.xi                 case  E_DMD_MSB201X_TS_CLK_21p6MHz:
1052*53ee8cc1Swenshuai.xi                 	_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x09);
1053*53ee8cc1Swenshuai.xi                 break;
1054*53ee8cc1Swenshuai.xi                 case  E_DMD_MSB201X_TS_CLK_19p6MHz :
1055*53ee8cc1Swenshuai.xi                 	_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x0a);
1056*53ee8cc1Swenshuai.xi                 break;
1057*53ee8cc1Swenshuai.xi                 case  E_DMD_MSB201X_TS_CLK_18MHz   :
1058*53ee8cc1Swenshuai.xi                 	_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x0b);
1059*53ee8cc1Swenshuai.xi                 break;
1060*53ee8cc1Swenshuai.xi                 case  E_DMD_MSB201X_TS_CLK_16p6MHz :
1061*53ee8cc1Swenshuai.xi                 	_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x0c);
1062*53ee8cc1Swenshuai.xi                 break;
1063*53ee8cc1Swenshuai.xi                 case  E_DMD_MSB201X_TS_CLK_15p4MHz :
1064*53ee8cc1Swenshuai.xi                 	_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x0d);
1065*53ee8cc1Swenshuai.xi                 break;
1066*53ee8cc1Swenshuai.xi                 case  E_DMD_MSB201X_TS_CLK_14p4MHz :
1067*53ee8cc1Swenshuai.xi                 	_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x0e);
1068*53ee8cc1Swenshuai.xi                 break;
1069*53ee8cc1Swenshuai.xi                 case  E_DMD_MSB201X_TS_CLK_13p5MHz :
1070*53ee8cc1Swenshuai.xi                 	_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x0f);
1071*53ee8cc1Swenshuai.xi                 break;
1072*53ee8cc1Swenshuai.xi 								default:
1073*53ee8cc1Swenshuai.xi 								_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x06);
1074*53ee8cc1Swenshuai.xi 								break;
1075*53ee8cc1Swenshuai.xi 			  			}
1076*53ee8cc1Swenshuai.xi 
1077*53ee8cc1Swenshuai.xi                     //_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2 + 1, 0x06);
1078*53ee8cc1Swenshuai.xi         }
1079*53ee8cc1Swenshuai.xi 
1080*53ee8cc1Swenshuai.xi 
1081*53ee8cc1Swenshuai.xi   //need to clear this to output TS normally
1082*53ee8cc1Swenshuai.xi   _MDrv_DMD_MSB201X_SetReg(devID,0x103100+(0x02)*2+1,0x00);
1083*53ee8cc1Swenshuai.xi 
1084*53ee8cc1Swenshuai.xi 	if(FALSE == pDemod->bDMD_MSB201X_TS_Param_Init_Done)
1085*53ee8cc1Swenshuai.xi 	{
1086*53ee8cc1Swenshuai.xi 		memcpy(&pDemod->sDMD_MSB201X_TS_Param, pDMD_MSB201X_TS_Param, sizeof(sDMD_MSB201X_TS_Param));
1087*53ee8cc1Swenshuai.xi 
1088*53ee8cc1Swenshuai.xi 		switch(pDMD_MSB201X_TS_Param->eTSMode)
1089*53ee8cc1Swenshuai.xi 		{
1090*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_PARALLEL:
1091*53ee8cc1Swenshuai.xi 
1092*53ee8cc1Swenshuai.xi 
1093*53ee8cc1Swenshuai.xi 				// Out mode : 1 => Normal mode, 0 => Gating mode.
1094*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2, 0x10);
1095*53ee8cc1Swenshuai.xi 				//_MDrv_DMD_MSR1742_GetReg(devID, 0x0900 + (0x12)*2, &u8Data);
1096*53ee8cc1Swenshuai.xi 	 			//u8Data |= _BIT4;
1097*53ee8cc1Swenshuai.xi         			//_MDrv_DMD_MSR1742_SetReg(devID, 0x0900 + (0x12)*2, u8Data);
1098*53ee8cc1Swenshuai.xi 
1099*53ee8cc1Swenshuai.xi 				// Clock inverse
1100*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_GetReg(devID, 0x100900 + (0x12)*2, &u8Data);
1101*53ee8cc1Swenshuai.xi 				if(TRUE == pDMD_MSB201X_TS_Param->bCLKInverse)
1102*53ee8cc1Swenshuai.xi 				{
1103*53ee8cc1Swenshuai.xi 					u8Data |= _BIT5;
1104*53ee8cc1Swenshuai.xi 				}
1105*53ee8cc1Swenshuai.xi 				else
1106*53ee8cc1Swenshuai.xi 				{
1107*53ee8cc1Swenshuai.xi 					u8Data &= (~_BIT5);
1108*53ee8cc1Swenshuai.xi 				}
1109*53ee8cc1Swenshuai.xi         			_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2, u8Data);
1110*53ee8cc1Swenshuai.xi 
1111*53ee8cc1Swenshuai.xi 				// reg_ckg_ts_mux
1112*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x1e) * 2, 0x4444);
1113*53ee8cc1Swenshuai.xi 
1114*53ee8cc1Swenshuai.xi 				// reg_ckg_ts_*
1115*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x23) * 2, 0x0000);
1116*53ee8cc1Swenshuai.xi 
1117*53ee8cc1Swenshuai.xi 				// all pad in
1118*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x28) * 2, 0x0000);
1119*53ee8cc1Swenshuai.xi 
1120*53ee8cc1Swenshuai.xi 				// Enable TS
1121*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x2e) * 2, 0x0103);
1122*53ee8cc1Swenshuai.xi 
1123*53ee8cc1Swenshuai.xi 				// Disable SSPI
1124*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x3b) * 2, 0x0000);
1125*53ee8cc1Swenshuai.xi 
1126*53ee8cc1Swenshuai.xi 
1127*53ee8cc1Swenshuai.xi 
1128*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg(devID, 0x103100 + (0x00)*2 + 1, 0x00);
1129*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg(devID, 0x103100 + (0x00)*2, 0xff);
1130*53ee8cc1Swenshuai.xi 
1131*53ee8cc1Swenshuai.xi 				// reg_client_mask
1132*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x103100 + (0x06) * 2, 0x0020);
1133*53ee8cc1Swenshuai.xi 
1134*53ee8cc1Swenshuai.xi 				// reg_ts_mux_swrst
1135*53ee8cc1Swenshuai.xi 				u8Data = 0xf0;
1136*53ee8cc1Swenshuai.xi 				for(idx = 0; idx<DEMOD_MAX_CHANNEL; idx++)
1137*53ee8cc1Swenshuai.xi 				{
1138*53ee8cc1Swenshuai.xi 					if(FALSE == pDMD_MSB201X_TS_Param->bEnable[idx])
1139*53ee8cc1Swenshuai.xi 					{
1140*53ee8cc1Swenshuai.xi 						u8Data_tmp = 0x01;
1141*53ee8cc1Swenshuai.xi 						u8Data |= (u8Data_tmp << idx);
1142*53ee8cc1Swenshuai.xi 					}
1143*53ee8cc1Swenshuai.xi 					else
1144*53ee8cc1Swenshuai.xi 					{
1145*53ee8cc1Swenshuai.xi 						u8Data_tmp = 0x01;
1146*53ee8cc1Swenshuai.xi 						u8Data &= (~(u8Data_tmp << idx));
1147*53ee8cc1Swenshuai.xi 					}
1148*53ee8cc1Swenshuai.xi 				}
1149*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg(devID, 0x103100 + (0x00)*2, u8Data);
1150*53ee8cc1Swenshuai.xi 
1151*53ee8cc1Swenshuai.xi 				break;
1152*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_3_WIRE_REMUX2TS0:
1153*53ee8cc1Swenshuai.xi 
1154*53ee8cc1Swenshuai.xi 				break;
1155*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_3_WIRE_REMUX2TS1:
1156*53ee8cc1Swenshuai.xi 
1157*53ee8cc1Swenshuai.xi 				break;
1158*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_3_WIRE_REMUX2TS2:
1159*53ee8cc1Swenshuai.xi 
1160*53ee8cc1Swenshuai.xi 				break;
1161*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_3_WIRE_REMUX2TS3:
1162*53ee8cc1Swenshuai.xi 
1163*53ee8cc1Swenshuai.xi 				break;
1164*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_3_WIRE_REMUX2TS4:
1165*53ee8cc1Swenshuai.xi 
1166*53ee8cc1Swenshuai.xi 				break;
1167*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_3_WIRE_REMUX2TS5:
1168*53ee8cc1Swenshuai.xi 
1169*53ee8cc1Swenshuai.xi 				break;
1170*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_3_WIRE_REMUX2TS6:
1171*53ee8cc1Swenshuai.xi 
1172*53ee8cc1Swenshuai.xi 				break;
1173*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_3_WIRE_REMUX2TS7:
1174*53ee8cc1Swenshuai.xi 
1175*53ee8cc1Swenshuai.xi 				break;
1176*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_3_WIRE_DMD0_TS0_DMD1_TS1:
1177*53ee8cc1Swenshuai.xi 				// Set clock
1178*53ee8cc1Swenshuai.xi 				//_MDrv_DMD_MSB201X_SetReg(devID, 0x103100 + (0x12)*2 + 1, 0x02);
1179*53ee8cc1Swenshuai.xi 
1180*53ee8cc1Swenshuai.xi 				// Out mode : 1 => Normal mode, 0 => Gating mode.
1181*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg(devID, 0x103100 + (0x12)*2, 0x00);
1182*53ee8cc1Swenshuai.xi 				//_MDrv_DMD_MSR1742_GetReg(devID, 0x0900 + (0x12)*2, &u8Data);
1183*53ee8cc1Swenshuai.xi 	 			//u8Data &= (~_BIT4);
1184*53ee8cc1Swenshuai.xi         			//_MDrv_DMD_MSR1742_SetReg(devID, 0x0900 + (0x12)*2, u8Data);
1185*53ee8cc1Swenshuai.xi 
1186*53ee8cc1Swenshuai.xi 				// Clock inverse
1187*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_GetReg(devID, 0x100900 + (0x12)*2, &u8Data);
1188*53ee8cc1Swenshuai.xi 				if(TRUE == pDMD_MSB201X_TS_Param->bCLKInverse)
1189*53ee8cc1Swenshuai.xi 				{
1190*53ee8cc1Swenshuai.xi 					u8Data |= _BIT5;
1191*53ee8cc1Swenshuai.xi 				}
1192*53ee8cc1Swenshuai.xi 				else
1193*53ee8cc1Swenshuai.xi 				{
1194*53ee8cc1Swenshuai.xi 					u8Data &= (~_BIT5);
1195*53ee8cc1Swenshuai.xi 				}
1196*53ee8cc1Swenshuai.xi         			_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2, u8Data);
1197*53ee8cc1Swenshuai.xi 
1198*53ee8cc1Swenshuai.xi 				// reg_ckg_ts_mux
1199*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x1e) * 2, 0x4444);
1200*53ee8cc1Swenshuai.xi 
1201*53ee8cc1Swenshuai.xi 				// reg_ckg_ts_*
1202*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x23) * 2, 0x0000);
1203*53ee8cc1Swenshuai.xi 
1204*53ee8cc1Swenshuai.xi 				// all pad in
1205*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x28) * 2, 0x0000);
1206*53ee8cc1Swenshuai.xi 
1207*53ee8cc1Swenshuai.xi 				// Enable TS
1208*53ee8cc1Swenshuai.xi 				//wait for modified(to achieve pad compatible)
1209*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x29) * 2, 0x0000);
1210*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x2a) * 2, 0x0000);
1211*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x2d) * 2, 0x0003);
1212*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x2e) * 2, 0x0000);
1213*53ee8cc1Swenshuai.xi 
1214*53ee8cc1Swenshuai.xi 				// Disable SSPI
1215*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x3b) * 2, 0x0000);
1216*53ee8cc1Swenshuai.xi 
1217*53ee8cc1Swenshuai.xi 				// reg_ckg_ts_*
1218*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x23) * 2, 0x8888);
1219*53ee8cc1Swenshuai.xi 
1220*53ee8cc1Swenshuai.xi 				// reg_swrst_ts_mux
1221*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg(devID, 0x100B00 + (0x70)*2, 0x00);
1222*53ee8cc1Swenshuai.xi 
1223*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg(devID, 0x103100 + (0x00)*2 + 1, 0x00);
1224*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg(devID, 0x103100 + (0x00)*2, 0xff);
1225*53ee8cc1Swenshuai.xi 
1226*53ee8cc1Swenshuai.xi 				// reg_serial_order
1227*53ee8cc1Swenshuai.xi 				u8Data = 0x00;
1228*53ee8cc1Swenshuai.xi 				for(idx = 0; idx<DEMOD_MAX_CHANNEL; idx++)
1229*53ee8cc1Swenshuai.xi 				{
1230*53ee8cc1Swenshuai.xi 					if(TRUE == pDMD_MSB201X_TS_Param->bEnable[idx])
1231*53ee8cc1Swenshuai.xi 					{
1232*53ee8cc1Swenshuai.xi 						u8Data_tmp = 0x01;
1233*53ee8cc1Swenshuai.xi 						u8Data |= (u8Data_tmp << (idx+1));
1234*53ee8cc1Swenshuai.xi 					}
1235*53ee8cc1Swenshuai.xi 					else
1236*53ee8cc1Swenshuai.xi 					{
1237*53ee8cc1Swenshuai.xi 						u8Data_tmp = 0x01;
1238*53ee8cc1Swenshuai.xi 						u8Data &= (~(u8Data_tmp << (idx+1)));
1239*53ee8cc1Swenshuai.xi 					}
1240*53ee8cc1Swenshuai.xi 				}
1241*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg(devID, 0x103100 + (0x01)*2, u8Data);
1242*53ee8cc1Swenshuai.xi 
1243*53ee8cc1Swenshuai.xi 				// reg_ts_mux_swrst
1244*53ee8cc1Swenshuai.xi 				u8Data = 0x0f;
1245*53ee8cc1Swenshuai.xi 				for(idx = 0; idx<DEMOD_MAX_CHANNEL; idx++)
1246*53ee8cc1Swenshuai.xi 				{
1247*53ee8cc1Swenshuai.xi 					if(FALSE == pDMD_MSB201X_TS_Param->bEnable[idx])
1248*53ee8cc1Swenshuai.xi 					{
1249*53ee8cc1Swenshuai.xi 						u8Data_tmp = 0x01;
1250*53ee8cc1Swenshuai.xi 						u8Data |= (u8Data_tmp << (idx+4));
1251*53ee8cc1Swenshuai.xi 					}
1252*53ee8cc1Swenshuai.xi 					else
1253*53ee8cc1Swenshuai.xi 					{
1254*53ee8cc1Swenshuai.xi 						u8Data_tmp = 0x01;
1255*53ee8cc1Swenshuai.xi 						u8Data &= (~(u8Data_tmp << (idx+4)));
1256*53ee8cc1Swenshuai.xi 					}
1257*53ee8cc1Swenshuai.xi 				}
1258*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg(devID, 0x103100 + (0x00)*2, u8Data);
1259*53ee8cc1Swenshuai.xi 
1260*53ee8cc1Swenshuai.xi 				break;
1261*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_3_WIRE_DMD0_TS1_DMD1_TS0:
1262*53ee8cc1Swenshuai.xi 
1263*53ee8cc1Swenshuai.xi 				break;
1264*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_4_WIRE_REMUX2TS0:
1265*53ee8cc1Swenshuai.xi 
1266*53ee8cc1Swenshuai.xi 				break;
1267*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_4_WIRE_REMUX2TS1:
1268*53ee8cc1Swenshuai.xi 
1269*53ee8cc1Swenshuai.xi 				break;
1270*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_4_WIRE_REMUX2TS2:
1271*53ee8cc1Swenshuai.xi 
1272*53ee8cc1Swenshuai.xi 				break;
1273*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_4_WIRE_REMUX2TS3:
1274*53ee8cc1Swenshuai.xi 
1275*53ee8cc1Swenshuai.xi 				break;
1276*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_4_WIRE_REMUX2TS4:
1277*53ee8cc1Swenshuai.xi 
1278*53ee8cc1Swenshuai.xi 				break;
1279*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_4_WIRE_REMUX2TS5:
1280*53ee8cc1Swenshuai.xi 
1281*53ee8cc1Swenshuai.xi 				break;
1282*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_4_WIRE_DMD0_TS0_DMD1_TS1:
1283*53ee8cc1Swenshuai.xi 
1284*53ee8cc1Swenshuai.xi 				break;
1285*53ee8cc1Swenshuai.xi 			case E_DMD_MSB201X_4_WIRE_DMD0_TS1_DMD1_TS0:
1286*53ee8cc1Swenshuai.xi 
1287*53ee8cc1Swenshuai.xi 				break;
1288*53ee8cc1Swenshuai.xi 			default :
1289*53ee8cc1Swenshuai.xi 
1290*53ee8cc1Swenshuai.xi 				break;
1291*53ee8cc1Swenshuai.xi 		}
1292*53ee8cc1Swenshuai.xi 
1293*53ee8cc1Swenshuai.xi 		pDemod->bDMD_MSB201X_TS_Param_Init_Done = TRUE;
1294*53ee8cc1Swenshuai.xi 
1295*53ee8cc1Swenshuai.xi 	}
1296*53ee8cc1Swenshuai.xi 
1297*53ee8cc1Swenshuai.xi 	// Check reg_ts_mux_swrst
1298*53ee8cc1Swenshuai.xi 	_MDrv_DMD_MSB201X_GetReg(devID, 0x100B00 + (0x70)*2, &u8Data);
1299*53ee8cc1Swenshuai.xi 	if((u8Data & 0x01) == 0x01)
1300*53ee8cc1Swenshuai.xi 	{
1301*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SetReg(devID, 0x100B00 + (0x70)*2, 0x00);
1302*53ee8cc1Swenshuai.xi 	}
1303*53ee8cc1Swenshuai.xi 
1304*53ee8cc1Swenshuai.xi 
1305*53ee8cc1Swenshuai.xi 	switch(pDemod->sDMD_MSB201X_TS_Param.eTSDrv)
1306*53ee8cc1Swenshuai.xi 	{
1307*53ee8cc1Swenshuai.xi 		case E_DMD_MSB201X_TS_DRVING_LO:
1308*53ee8cc1Swenshuai.xi 				//set to high driving
1309*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x2C)*2, 0x00);
1310*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x2C)*2+1, 0x00);
1311*53ee8cc1Swenshuai.xi 			break;
1312*53ee8cc1Swenshuai.xi 		case E_DMD_MSB201X_TS_DRVING_HI:
1313*53ee8cc1Swenshuai.xi 				//set to high driving
1314*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x2C)*2, 0xff);
1315*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x2C)*2+1, 0xff);
1316*53ee8cc1Swenshuai.xi 			break;
1317*53ee8cc1Swenshuai.xi 		case E_DMD_MSB201X_TS_DRVING_MAX:
1318*53ee8cc1Swenshuai.xi 				//set to high driving
1319*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x2C)*2, 0xff);
1320*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x2C)*2+1, 0xff);
1321*53ee8cc1Swenshuai.xi 			break;
1322*53ee8cc1Swenshuai.xi 	}
1323*53ee8cc1Swenshuai.xi 
1324*53ee8cc1Swenshuai.xi 
1325*53ee8cc1Swenshuai.xi 
1326*53ee8cc1Swenshuai.xi 	if(TRUE == pDemod->bDMD_MSB201X_TS_Param_Init_Done)
1327*53ee8cc1Swenshuai.xi 	{
1328*53ee8cc1Swenshuai.xi 		//if(pDMD_MSR1742_InitData->bCLKInverse != pDemod->sDMD_MSR1742_TS_Param.bCLKInverse)
1329*53ee8cc1Swenshuai.xi 
1330*53ee8cc1Swenshuai.xi 	}
1331*53ee8cc1Swenshuai.xi 
1332*53ee8cc1Swenshuai.xi 	return TRUE;
1333*53ee8cc1Swenshuai.xi }
1334*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_CfgExtHeader(MS_U8 devID,MS_U8 u8DemodIndex,sDMD_MSB201X_extHeader * pDMD_MSB201X_extHeader_Param)1335*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_CfgExtHeader(MS_U8 devID, MS_U8 u8DemodIndex,  sDMD_MSB201X_extHeader *pDMD_MSB201X_extHeader_Param)
1336*53ee8cc1Swenshuai.xi {
1337*53ee8cc1Swenshuai.xi 	MS_U8 u8Data_h = 0, u8Data_l = 0, u8Data = 0, idx = 0;
1338*53ee8cc1Swenshuai.xi 	MS_U16 u16Data = 0;
1339*53ee8cc1Swenshuai.xi 	MS_U32 u32HeaderReg = 0;
1340*53ee8cc1Swenshuai.xi 	tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
1341*53ee8cc1Swenshuai.xi 
1342*53ee8cc1Swenshuai.xi 	_MSB201X_I2C_CH_Reset(devID, 3);
1343*53ee8cc1Swenshuai.xi 
1344*53ee8cc1Swenshuai.xi 	// Check reg_ts_mux_swrst
1345*53ee8cc1Swenshuai.xi 	_MDrv_DMD_MSB201X_GetReg(devID, 0x100B00 + (0x70)*2, &u8Data);
1346*53ee8cc1Swenshuai.xi 	if((u8Data & 0x01) == 0x01)
1347*53ee8cc1Swenshuai.xi 	{
1348*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SetReg(devID, 0x100B00 + (0x70)*2, 0x00);
1349*53ee8cc1Swenshuai.xi 	}
1350*53ee8cc1Swenshuai.xi 
1351*53ee8cc1Swenshuai.xi 	// Keep original swrst settings
1352*53ee8cc1Swenshuai.xi 	_MDrv_DMD_MSB201X_GetReg(devID, 0x103100 + (0x00)*2 + 1, &u8Data_h);
1353*53ee8cc1Swenshuai.xi 	u16Data = (u8Data_h & 0x0f);
1354*53ee8cc1Swenshuai.xi 	_MDrv_DMD_MSB201X_GetReg(devID, 0x103100 + (0x00)*2, &u8Data_l);
1355*53ee8cc1Swenshuai.xi 	u16Data = (u16Data << 8) | u8Data_l;
1356*53ee8cc1Swenshuai.xi 
1357*53ee8cc1Swenshuai.xi 
1358*53ee8cc1Swenshuai.xi 
1359*53ee8cc1Swenshuai.xi 
1360*53ee8cc1Swenshuai.xi 	#ifdef MS_DEBUG
1361*53ee8cc1Swenshuai.xi 		printf("===_MDrv_DMD_MSR1742_CfgExtHeader=== Original swrst = 0x%x\n", u16Data);
1362*53ee8cc1Swenshuai.xi 	#endif
1363*53ee8cc1Swenshuai.xi 
1364*53ee8cc1Swenshuai.xi 	if(FALSE == pDMD_MSB201X_extHeader_Param->bEnable)
1365*53ee8cc1Swenshuai.xi 	{
1366*53ee8cc1Swenshuai.xi 		// Disable ExtHeader
1367*53ee8cc1Swenshuai.xi 		// Clear bit 10 and 11
1368*53ee8cc1Swenshuai.xi 		u16Data &= 0x03ff;
1369*53ee8cc1Swenshuai.xi 
1370*53ee8cc1Swenshuai.xi 		// Restart TS
1371*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x103100 + (0x00) * 2, 0x0fff);
1372*53ee8cc1Swenshuai.xi 		MsOS_DelayTask(1);
1373*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SetReg(devID, 0x103100 + (0x00)*2 + 1, ((u16Data & 0x0f00)>>8));
1374*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SetReg(devID, 0x103100 + (0x00)*2, (u16Data & 0x00ff));
1375*53ee8cc1Swenshuai.xi 
1376*53ee8cc1Swenshuai.xi 		#ifdef MS_DEBUG
1377*53ee8cc1Swenshuai.xi 			printf("===Enable FALSE===\n");
1378*53ee8cc1Swenshuai.xi 			printf("===_MDrv_DMD_MSB201X_CfgExtHeader=== swrst = 0x%x\n", u16Data);
1379*53ee8cc1Swenshuai.xi 		#endif
1380*53ee8cc1Swenshuai.xi 
1381*53ee8cc1Swenshuai.xi 		return TRUE;
1382*53ee8cc1Swenshuai.xi 	}
1383*53ee8cc1Swenshuai.xi 	else
1384*53ee8cc1Swenshuai.xi 	{
1385*53ee8cc1Swenshuai.xi 		// Set extend header length
1386*53ee8cc1Swenshuai.xi 		//if(pDemod->sDMD_MSR1742_extHeader_Param.u8HeaderSize != pDMD_MSR1742_extHeader_Param->u8HeaderSize)
1387*53ee8cc1Swenshuai.xi 		{
1388*53ee8cc1Swenshuai.xi 			u8Data = pDMD_MSB201X_extHeader_Param->u8HeaderSize;
1389*53ee8cc1Swenshuai.xi 			_MDrv_DMD_MSB201X_SetReg(devID, 0x103100 + (0x07)*2 + 1, ((u8Data - 1) & 0x0f));
1390*53ee8cc1Swenshuai.xi 
1391*53ee8cc1Swenshuai.xi 			#ifdef MS_DEBUG
1392*53ee8cc1Swenshuai.xi 				printf("===_MDrv_DMD_MSB201X_CfgExtHeader=== header size = %d\n", (int)u8Data);
1393*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_GetReg(devID, 0x103100 + (0x07)*2 + 1, &u8Data);
1394*53ee8cc1Swenshuai.xi 				printf("===Enable TRUE===\n");
1395*53ee8cc1Swenshuai.xi 				printf("===_MDrv_DMD_MSB201X_CfgExtHeader=== read header size = %d\n", (int)u8Data);
1396*53ee8cc1Swenshuai.xi 			#endif
1397*53ee8cc1Swenshuai.xi 		}
1398*53ee8cc1Swenshuai.xi 		/* Remove header size checking
1399*53ee8cc1Swenshuai.xi 		else
1400*53ee8cc1Swenshuai.xi 		{
1401*53ee8cc1Swenshuai.xi 			#if(HEADER_DBG)
1402*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSR1742_GetReg(devID, 0x2A00 + (0x07)*2 + 1, &u8Data);
1403*53ee8cc1Swenshuai.xi 				printf("===_MDrv_DMD_MSR1742_CfgExtHeader=== read header size = %d\n", (int)u8Data);
1404*53ee8cc1Swenshuai.xi 				printf("===Enable TRUE===\n");
1405*53ee8cc1Swenshuai.xi 				printf("===_MDrv_DMD_MSR1742_CfgExtHeader=== header size doesn't change! \n");
1406*53ee8cc1Swenshuai.xi 			#endif
1407*53ee8cc1Swenshuai.xi 		}
1408*53ee8cc1Swenshuai.xi 		*/
1409*53ee8cc1Swenshuai.xi 
1410*53ee8cc1Swenshuai.xi 		// Set extend header list
1411*53ee8cc1Swenshuai.xi 		switch(u8DemodIndex)
1412*53ee8cc1Swenshuai.xi 		{
1413*53ee8cc1Swenshuai.xi 			case DEMOD0:
1414*53ee8cc1Swenshuai.xi 				u32HeaderReg = 0x103100 + (0x08)*2;
1415*53ee8cc1Swenshuai.xi 				break;
1416*53ee8cc1Swenshuai.xi 			case DEMOD1:
1417*53ee8cc1Swenshuai.xi 				u32HeaderReg = 0x103100 + (0x10)*2;
1418*53ee8cc1Swenshuai.xi 				break;
1419*53ee8cc1Swenshuai.xi 				/*
1420*53ee8cc1Swenshuai.xi 			case DEMOD2:
1421*53ee8cc1Swenshuai.xi 				u32HeaderReg = 0x2A00 + (0x18)*2;
1422*53ee8cc1Swenshuai.xi 				break;
1423*53ee8cc1Swenshuai.xi 			case DEMOD3:
1424*53ee8cc1Swenshuai.xi 				u32HeaderReg = 0x2A00 + (0x20)*2;
1425*53ee8cc1Swenshuai.xi 				break;
1426*53ee8cc1Swenshuai.xi 				*/
1427*53ee8cc1Swenshuai.xi 			default :
1428*53ee8cc1Swenshuai.xi 				u32HeaderReg = 0x103100 + (0x08)*2;
1429*53ee8cc1Swenshuai.xi 				break;
1430*53ee8cc1Swenshuai.xi 		}
1431*53ee8cc1Swenshuai.xi 		for(idx = 0; idx < pDMD_MSB201X_extHeader_Param->u8HeaderSize; idx++)
1432*53ee8cc1Swenshuai.xi 		{
1433*53ee8cc1Swenshuai.xi 			_MDrv_DMD_MSB201X_SetReg(devID, u32HeaderReg + idx, *(pDMD_MSB201X_extHeader_Param->pHeaderPtr + idx));
1434*53ee8cc1Swenshuai.xi 
1435*53ee8cc1Swenshuai.xi 
1436*53ee8cc1Swenshuai.xi 		}
1437*53ee8cc1Swenshuai.xi 
1438*53ee8cc1Swenshuai.xi 		// Enable ExtHeader
1439*53ee8cc1Swenshuai.xi 		// Clear bit 10 and 11, then set bit 10 to add extend header
1440*53ee8cc1Swenshuai.xi 		u16Data &= 0x03ff;
1441*53ee8cc1Swenshuai.xi 		u16Data |= 0x0400;
1442*53ee8cc1Swenshuai.xi 
1443*53ee8cc1Swenshuai.xi 		// Restart TS
1444*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x103100 + (0x00) * 2, 0x0fff);
1445*53ee8cc1Swenshuai.xi 		MsOS_DelayTask(1);
1446*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SetReg(devID, 0x103100 + (0x00)*2 + 1, ((u16Data & 0x0f00)>>8));
1447*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SetReg(devID, 0x103100 + (0x00)*2, (u16Data & 0x00ff));
1448*53ee8cc1Swenshuai.xi 
1449*53ee8cc1Swenshuai.xi 		#ifdef MS_DEBUG
1450*53ee8cc1Swenshuai.xi 			printf("===_MDrv_DMD_MSR1742_CfgExtHeader=== swrst = 0x%x \n", u16Data);
1451*53ee8cc1Swenshuai.xi 			printf("===Done===\n");
1452*53ee8cc1Swenshuai.xi 		#endif
1453*53ee8cc1Swenshuai.xi 
1454*53ee8cc1Swenshuai.xi 		// Save setting parameters for next time comparison
1455*53ee8cc1Swenshuai.xi 		memcpy(&pDemod->sDMD_MSB201X_extHeader_Param, pDMD_MSB201X_extHeader_Param, sizeof(sDMD_MSB201X_extHeader));
1456*53ee8cc1Swenshuai.xi 	}
1457*53ee8cc1Swenshuai.xi 
1458*53ee8cc1Swenshuai.xi 	return TRUE;
1459*53ee8cc1Swenshuai.xi }
1460*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_CfgCIHeader(MS_U8 devID,MS_U8 u8DemodIndex,sDMD_MSB201X_CIHeader * pDMD_MSB201X_CIHeader_Param)1461*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_CfgCIHeader(MS_U8 devID, MS_U8 u8DemodIndex,  sDMD_MSB201X_CIHeader *pDMD_MSB201X_CIHeader_Param)
1462*53ee8cc1Swenshuai.xi {
1463*53ee8cc1Swenshuai.xi 	MS_U8 u8Data_h = 0, u8Data_l = 0, u8Data = 0;
1464*53ee8cc1Swenshuai.xi 	MS_U16 u16Data = 0;
1465*53ee8cc1Swenshuai.xi 	MS_U32 u32HeaderReg = 0;
1466*53ee8cc1Swenshuai.xi 	tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
1467*53ee8cc1Swenshuai.xi 
1468*53ee8cc1Swenshuai.xi 	_MSB201X_I2C_CH_Reset(devID, 3);
1469*53ee8cc1Swenshuai.xi 
1470*53ee8cc1Swenshuai.xi 	// Check reg_ts_mux_swrst
1471*53ee8cc1Swenshuai.xi 	_MDrv_DMD_MSB201X_GetReg(devID, 0x100B00 + (0x70)*2, &u8Data);
1472*53ee8cc1Swenshuai.xi 	if((u8Data & 0x01) == 0x01)
1473*53ee8cc1Swenshuai.xi 	{
1474*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SetReg(devID, 0x100B00 + (0x70)*2, 0x00);
1475*53ee8cc1Swenshuai.xi 	}
1476*53ee8cc1Swenshuai.xi 
1477*53ee8cc1Swenshuai.xi 	// Keep original swrst settings
1478*53ee8cc1Swenshuai.xi 	_MDrv_DMD_MSB201X_GetReg(devID, 0x103100 + (0x00)*2 + 1, &u8Data_h);
1479*53ee8cc1Swenshuai.xi 	u16Data = (u8Data_h & 0x0f);
1480*53ee8cc1Swenshuai.xi 	_MDrv_DMD_MSB201X_GetReg(devID, 0x103100 + (0x00)*2, &u8Data_l);
1481*53ee8cc1Swenshuai.xi 	u16Data = (u16Data << 8) | u8Data_l;
1482*53ee8cc1Swenshuai.xi 
1483*53ee8cc1Swenshuai.xi 	if(FALSE == pDMD_MSB201X_CIHeader_Param->bEnable)
1484*53ee8cc1Swenshuai.xi 	{
1485*53ee8cc1Swenshuai.xi 		// Disable ExtHeader
1486*53ee8cc1Swenshuai.xi 		// Clear bit 10 and 11
1487*53ee8cc1Swenshuai.xi 		u16Data &= 0x03ff;
1488*53ee8cc1Swenshuai.xi 
1489*53ee8cc1Swenshuai.xi 		// Restart TS
1490*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x103100 + (0x00) * 2, 0x0fff);
1491*53ee8cc1Swenshuai.xi 		MsOS_DelayTask(1);
1492*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SetReg(devID, 0x103100 + (0x00)*2 + 1, ((u16Data & 0x0f00)>>8));
1493*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SetReg(devID, 0x103100 + (0x00)*2, (u16Data & 0x00ff));
1494*53ee8cc1Swenshuai.xi 
1495*53ee8cc1Swenshuai.xi 		return TRUE;
1496*53ee8cc1Swenshuai.xi 	}
1497*53ee8cc1Swenshuai.xi 	else
1498*53ee8cc1Swenshuai.xi 	{
1499*53ee8cc1Swenshuai.xi 		// Set extend header list
1500*53ee8cc1Swenshuai.xi 		switch(u8DemodIndex)
1501*53ee8cc1Swenshuai.xi 		{
1502*53ee8cc1Swenshuai.xi 			case DEMOD0:
1503*53ee8cc1Swenshuai.xi 				u32HeaderReg = 0x103100 + (0x28)*2;
1504*53ee8cc1Swenshuai.xi 				break;
1505*53ee8cc1Swenshuai.xi 			case DEMOD1:
1506*53ee8cc1Swenshuai.xi 				u32HeaderReg = 0x103100 + (0x28)*2 + 1;
1507*53ee8cc1Swenshuai.xi 				break;
1508*53ee8cc1Swenshuai.xi 			/*
1509*53ee8cc1Swenshuai.xi 			case DEMOD2:
1510*53ee8cc1Swenshuai.xi 				u32HeaderReg = 0x2A00 + (0x29)*2;
1511*53ee8cc1Swenshuai.xi 				break;
1512*53ee8cc1Swenshuai.xi 			case DEMOD3:
1513*53ee8cc1Swenshuai.xi 				u32HeaderReg = 0x2A00 + (0x29)*2 + 1;
1514*53ee8cc1Swenshuai.xi 				break;
1515*53ee8cc1Swenshuai.xi 		  */
1516*53ee8cc1Swenshuai.xi 			default :
1517*53ee8cc1Swenshuai.xi 				u32HeaderReg = 0x103100 + (0x28)*2;
1518*53ee8cc1Swenshuai.xi 				break;
1519*53ee8cc1Swenshuai.xi 		}
1520*53ee8cc1Swenshuai.xi 		if((*pDemod->sDMD_MSB201X_CIHeader_Param.pHeaderPtr) != *(pDMD_MSB201X_CIHeader_Param->pHeaderPtr))
1521*53ee8cc1Swenshuai.xi 		{
1522*53ee8cc1Swenshuai.xi 			_MDrv_DMD_MSB201X_SetReg(devID, u32HeaderReg, *(pDMD_MSB201X_CIHeader_Param->pHeaderPtr));
1523*53ee8cc1Swenshuai.xi 		}
1524*53ee8cc1Swenshuai.xi 
1525*53ee8cc1Swenshuai.xi 		// Enable ExtHeader
1526*53ee8cc1Swenshuai.xi 		// Clear bit 10 and 11, then set bit 11 to enable CI header
1527*53ee8cc1Swenshuai.xi 		u16Data &= 0x03ff;
1528*53ee8cc1Swenshuai.xi 		u16Data |= 0x0800;
1529*53ee8cc1Swenshuai.xi 
1530*53ee8cc1Swenshuai.xi 		// Restart TS
1531*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x103100 + (0x00) * 2, 0x0fff);
1532*53ee8cc1Swenshuai.xi 		MsOS_DelayTask(1);
1533*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SetReg(devID, 0x103100 + (0x00)*2 + 1, ((u16Data & 0x0f00)>>8));
1534*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SetReg(devID, 0x103100 + (0x00)*2, (u16Data & 0x00ff));
1535*53ee8cc1Swenshuai.xi 
1536*53ee8cc1Swenshuai.xi 		// Save setting parameters for next time comparison
1537*53ee8cc1Swenshuai.xi 		memcpy(&pDemod->sDMD_MSB201X_CIHeader_Param, pDMD_MSB201X_CIHeader_Param, sizeof(sDMD_MSB201X_CIHeader));
1538*53ee8cc1Swenshuai.xi 	}
1539*53ee8cc1Swenshuai.xi 
1540*53ee8cc1Swenshuai.xi 	return TRUE;
1541*53ee8cc1Swenshuai.xi }
1542*53ee8cc1Swenshuai.xi 
1543*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_Active(MS_U8 devID,MS_U8 u8DemodIndex,MS_BOOL bEnable)1544*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_Active(MS_U8 devID, MS_U8 u8DemodIndex, MS_BOOL bEnable)
1545*53ee8cc1Swenshuai.xi {
1546*53ee8cc1Swenshuai.xi     MS_U8   status = true;
1547*53ee8cc1Swenshuai.xi     MS_U32 banknum = 0;
1548*53ee8cc1Swenshuai.xi 
1549*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 3);
1550*53ee8cc1Swenshuai.xi 
1551*53ee8cc1Swenshuai.xi     switch(u8DemodIndex)
1552*53ee8cc1Swenshuai.xi     {
1553*53ee8cc1Swenshuai.xi     	case 0:
1554*53ee8cc1Swenshuai.xi 			banknum = REG_DMD0_MB_CNTL;
1555*53ee8cc1Swenshuai.xi 			break;
1556*53ee8cc1Swenshuai.xi 	case 1:
1557*53ee8cc1Swenshuai.xi 			banknum = REG_DMD1_MB_CNTL;
1558*53ee8cc1Swenshuai.xi 			break;
1559*53ee8cc1Swenshuai.xi 	/*
1560*53ee8cc1Swenshuai.xi 	case 2:
1561*53ee8cc1Swenshuai.xi 			banknum = REG_DMD2_MB_CNTL;
1562*53ee8cc1Swenshuai.xi 			break;
1563*53ee8cc1Swenshuai.xi 	case 3:
1564*53ee8cc1Swenshuai.xi 			banknum = REG_DMD3_MB_CNTL;
1565*53ee8cc1Swenshuai.xi 			break;
1566*53ee8cc1Swenshuai.xi 	*/
1567*53ee8cc1Swenshuai.xi 	default:
1568*53ee8cc1Swenshuai.xi 			banknum = REG_DMD0_MB_CNTL;
1569*53ee8cc1Swenshuai.xi 			break;
1570*53ee8cc1Swenshuai.xi     }
1571*53ee8cc1Swenshuai.xi 
1572*53ee8cc1Swenshuai.xi     if(bEnable == TRUE)
1573*53ee8cc1Swenshuai.xi     	_MDrv_DMD_MSB201X_SetReg(devID, banknum + (0x0e)*2, 0x01);
1574*53ee8cc1Swenshuai.xi     //HAL_DMD_RIU_WriteByte(0x112600 + (0x0e)*2, 0x01);   // FSM_EN
1575*53ee8cc1Swenshuai.xi 
1576*53ee8cc1Swenshuai.xi     return status;
1577*53ee8cc1Swenshuai.xi }
1578*53ee8cc1Swenshuai.xi 
1579*53ee8cc1Swenshuai.xi 
_MSB201X_Demod_LoadAll(MS_U8 devID,eDMD_MSB201X_Demod_Index eDemod_Index)1580*53ee8cc1Swenshuai.xi static MS_BOOL _MSB201X_Demod_LoadAll(MS_U8 devID, eDMD_MSB201X_Demod_Index eDemod_Index)
1581*53ee8cc1Swenshuai.xi {
1582*53ee8cc1Swenshuai.xi     MS_U16 i;
1583*53ee8cc1Swenshuai.xi     unsigned short tmp;
1584*53ee8cc1Swenshuai.xi 
1585*53ee8cc1Swenshuai.xi     if(eDemod_Index != ALL_DEMOD)
1586*53ee8cc1Swenshuai.xi     {
1587*53ee8cc1Swenshuai.xi 		return FALSE;
1588*53ee8cc1Swenshuai.xi     }
1589*53ee8cc1Swenshuai.xi 
1590*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 3);
1591*53ee8cc1Swenshuai.xi     //MCU 0
1592*53ee8cc1Swenshuai.xi     //Release dmd_mcu rst to wake up dmd51
1593*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0x80,  0x01);
1594*53ee8cc1Swenshuai.xi     //Load code finish, eable i-side to sram
1595*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0x81,  0x00);
1596*53ee8cc1Swenshuai.xi     //mux select for xdata setting from top riu to dmd riu
1597*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103700 + 0x1C,  0x01);
1598*53ee8cc1Swenshuai.xi     //Release dmd_mcu rst to wake up dmd51
1599*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0x86,  0x01);
1600*53ee8cc1Swenshuai.xi     //MCU 1
1601*53ee8cc1Swenshuai.xi     //Release dmd_mcu rst to wake up dmd51
1602*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0xa6,  0x01);
1603*53ee8cc1Swenshuai.xi     //Release dmd_mcu rst to wake up dmd51
1604*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0xa0,  0x01);
1605*53ee8cc1Swenshuai.xi     //mux select for xdata setting from top riu to dmd riu
1606*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103800 + 0x1C,  0x01);
1607*53ee8cc1Swenshuai.xi     //Load code finish, eable i-side to sram
1608*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0xa1,  0x00);
1609*53ee8cc1Swenshuai.xi 
1610*53ee8cc1Swenshuai.xi     //disable all pad in
1611*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + 0x51,  0x00);
1612*53ee8cc1Swenshuai.xi     //DMD 51 interrupt by PM51 DMD0
1613*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0x83,  0x02);
1614*53ee8cc1Swenshuai.xi     //DMD 51 interrupt by PM51 DMD1
1615*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0xa2,  0x02);
1616*53ee8cc1Swenshuai.xi     //Enable program sram clock clk sram mcu
1617*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + 0x17,  0x02);
1618*53ee8cc1Swenshuai.xi     //default
1619*53ee8cc1Swenshuai.xi     //_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + 0x16,  0x30);  //24Mhz
1620*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + 0x16,  0x00);  //108Mhz
1621*53ee8cc1Swenshuai.xi 
1622*53ee8cc1Swenshuai.xi     //MCU0
1623*53ee8cc1Swenshuai.xi     //release dmd mcu periphal rst
1624*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0x86,  0x00);
1625*53ee8cc1Swenshuai.xi     //set upper bound
1626*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103700 + 0xe0,  0x3f);
1627*53ee8cc1Swenshuai.xi     //set lower bound
1628*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103700 + 0xe1,  0x20);
1629*53ee8cc1Swenshuai.xi     //enable
1630*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103700 + 0xe6,  0x11);
1631*53ee8cc1Swenshuai.xi 
1632*53ee8cc1Swenshuai.xi     //MCU1
1633*53ee8cc1Swenshuai.xi     //release dmd mcu periphal rst
1634*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0xa6,  0x00);
1635*53ee8cc1Swenshuai.xi     //set upper bound
1636*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103800 + 0xe0,  0x3f);
1637*53ee8cc1Swenshuai.xi     //set lower bound
1638*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103800 + 0xe1,  0x20);
1639*53ee8cc1Swenshuai.xi     //enable
1640*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103800 + 0xe6,  0x11);
1641*53ee8cc1Swenshuai.xi 
1642*53ee8cc1Swenshuai.xi 
1643*53ee8cc1Swenshuai.xi     //select all demod
1644*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103C00 + 0x28,  0x01);
1645*53ee8cc1Swenshuai.xi 
1646*53ee8cc1Swenshuai.xi      _MSB201X_I2C_CH_Reset(devID, 1);
1647*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x000000 + 0x00,  0x00);
1648*53ee8cc1Swenshuai.xi 
1649*53ee8cc1Swenshuai.xi 
1650*53ee8cc1Swenshuai.xi     ////  Load code thru VDMCU_IF ////
1651*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
1652*53ee8cc1Swenshuai.xi     	printf(">Load Demod Code.....\n");
1653*53ee8cc1Swenshuai.xi     #endif
1654*53ee8cc1Swenshuai.xi 
1655*53ee8cc1Swenshuai.xi     for ( i = 0; i < sizeof(MSB201X_DVBC_table);)
1656*53ee8cc1Swenshuai.xi     {
1657*53ee8cc1Swenshuai.xi             tmp = SRAM_BASE + i;
1658*53ee8cc1Swenshuai.xi 
1659*53ee8cc1Swenshuai.xi             if (i+SRAM_Write_Buffer-1<sizeof(MSB201X_DVBC_table))
1660*53ee8cc1Swenshuai.xi             {
1661*53ee8cc1Swenshuai.xi                 MDrv_DMD_MSB201X_SetRegs(devID, tmp,MSB201X_DVBC_table+i,SRAM_Write_Buffer);
1662*53ee8cc1Swenshuai.xi 
1663*53ee8cc1Swenshuai.xi                 i=i+SRAM_Write_Buffer-1;
1664*53ee8cc1Swenshuai.xi             }
1665*53ee8cc1Swenshuai.xi             else
1666*53ee8cc1Swenshuai.xi             {
1667*53ee8cc1Swenshuai.xi                 MDrv_DMD_MSB201X_SetRegs(devID, tmp,MSB201X_DVBC_table+i,sizeof(MSB201X_DVBC_table)-i);
1668*53ee8cc1Swenshuai.xi 
1669*53ee8cc1Swenshuai.xi                 i=sizeof(MSB201X_DVBC_table);
1670*53ee8cc1Swenshuai.xi             }
1671*53ee8cc1Swenshuai.xi     }
1672*53ee8cc1Swenshuai.xi 
1673*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 3);
1674*53ee8cc1Swenshuai.xi 
1675*53ee8cc1Swenshuai.xi  		//mcu0
1676*53ee8cc1Swenshuai.xi     //mux select for xdata setting from top riu to dmd riu
1677*53ee8cc1Swenshuai.xi  		_MDrv_DMD_MSB201X_SetReg(devID, 0x103700 + 0x1C,  0x00);
1678*53ee8cc1Swenshuai.xi  		//Load code finish, eable i-side to sram
1679*53ee8cc1Swenshuai.xi  		_MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0x81,  0x01);
1680*53ee8cc1Swenshuai.xi  		//Release dmd_mcu rst to wake up dmd51
1681*53ee8cc1Swenshuai.xi  		_MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0x80,  0x00);
1682*53ee8cc1Swenshuai.xi 
1683*53ee8cc1Swenshuai.xi  		//mcu1
1684*53ee8cc1Swenshuai.xi  		//mux select for xdata setting from top riu to dmd riu
1685*53ee8cc1Swenshuai.xi  		_MDrv_DMD_MSB201X_SetReg(devID, 0x103800 + 0x1C,  0x00);
1686*53ee8cc1Swenshuai.xi  		//Load code finish, eable i-side to sram
1687*53ee8cc1Swenshuai.xi  		_MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0xa1,  0x01);
1688*53ee8cc1Swenshuai.xi  		//Release dmd_mcu rst to wake up dmd51
1689*53ee8cc1Swenshuai.xi  		_MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0xa0,  0x00);
1690*53ee8cc1Swenshuai.xi 
1691*53ee8cc1Swenshuai.xi 
1692*53ee8cc1Swenshuai.xi  		_MSB201X_I2C_CH_Reset(devID, 5);
1693*53ee8cc1Swenshuai.xi 
1694*53ee8cc1Swenshuai.xi 
1695*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
1696*53ee8cc1Swenshuai.xi     	printf(">Demod Loadcode done.");
1697*53ee8cc1Swenshuai.xi     #endif
1698*53ee8cc1Swenshuai.xi 
1699*53ee8cc1Swenshuai.xi     return TRUE;
1700*53ee8cc1Swenshuai.xi }
1701*53ee8cc1Swenshuai.xi 
_MSB201X_Demod_LoadSingle(MS_U8 devID,MS_U8 u8DemodIndex)1702*53ee8cc1Swenshuai.xi static MS_BOOL _MSB201X_Demod_LoadSingle(MS_U8 devID, MS_U8 u8DemodIndex)
1703*53ee8cc1Swenshuai.xi {
1704*53ee8cc1Swenshuai.xi     MS_U16 i;
1705*53ee8cc1Swenshuai.xi     unsigned short tmp;
1706*53ee8cc1Swenshuai.xi 
1707*53ee8cc1Swenshuai.xi     if(u8DemodIndex >= ALL_DEMOD)
1708*53ee8cc1Swenshuai.xi     {
1709*53ee8cc1Swenshuai.xi 			return FALSE;
1710*53ee8cc1Swenshuai.xi     }
1711*53ee8cc1Swenshuai.xi 
1712*53ee8cc1Swenshuai.xi 
1713*53ee8cc1Swenshuai.xi 		if(u8DemodIndex==DEMOD0)
1714*53ee8cc1Swenshuai.xi 		{
1715*53ee8cc1Swenshuai.xi 			//MCU 0
1716*53ee8cc1Swenshuai.xi 	    //Release dmd_mcu rst to wake up dmd51
1717*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0x80,  0x01);
1718*53ee8cc1Swenshuai.xi 	    //Load code finish, eable i-side to sram
1719*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0x81,  0x00);
1720*53ee8cc1Swenshuai.xi 	    //mux select for xdata setting from top riu to dmd riu
1721*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103700 + 0x1C,  0x01);
1722*53ee8cc1Swenshuai.xi 	    //Release dmd_mcu rst to wake up dmd51
1723*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0x86,  0x01);
1724*53ee8cc1Swenshuai.xi 		}
1725*53ee8cc1Swenshuai.xi 
1726*53ee8cc1Swenshuai.xi 		if(u8DemodIndex==DEMOD1)
1727*53ee8cc1Swenshuai.xi 		{
1728*53ee8cc1Swenshuai.xi 	    //MCU 1
1729*53ee8cc1Swenshuai.xi 	    //Release dmd_mcu rst to wake up dmd51
1730*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0xa6,  0x01);
1731*53ee8cc1Swenshuai.xi 	    //Release dmd_mcu rst to wake up dmd51
1732*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0xa0,  0x01);
1733*53ee8cc1Swenshuai.xi 	    //mux select for xdata setting from top riu to dmd riu
1734*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103800 + 0x1C,  0x01);
1735*53ee8cc1Swenshuai.xi 	    //Load code finish, eable i-side to sram
1736*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0xa1,  0x00);
1737*53ee8cc1Swenshuai.xi 		}
1738*53ee8cc1Swenshuai.xi 
1739*53ee8cc1Swenshuai.xi     //disable all pad in
1740*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + 0x51,  0x00);
1741*53ee8cc1Swenshuai.xi     //DMD 51 interrupt by PM51 DMD0
1742*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0x83,  0x02);
1743*53ee8cc1Swenshuai.xi     //DMD 51 interrupt by PM51 DMD1
1744*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0xa2,  0x02);
1745*53ee8cc1Swenshuai.xi     //Enable program sram clock clk sram mcu
1746*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + 0x17,  0x02);
1747*53ee8cc1Swenshuai.xi     //default
1748*53ee8cc1Swenshuai.xi     //_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + 0x16,  0x30);		  //24MHz
1749*53ee8cc1Swenshuai.xi 
1750*53ee8cc1Swenshuai.xi 		_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + 0x16,  0x00);		  //108MHz
1751*53ee8cc1Swenshuai.xi 
1752*53ee8cc1Swenshuai.xi 		if(u8DemodIndex==DEMOD0)
1753*53ee8cc1Swenshuai.xi 		{
1754*53ee8cc1Swenshuai.xi 	    //MCU0
1755*53ee8cc1Swenshuai.xi 	    //release dmd mcu periphal rst
1756*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0x86,  0x00);
1757*53ee8cc1Swenshuai.xi 	    //set upper bound
1758*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103700 + 0xe0,  0x3f);
1759*53ee8cc1Swenshuai.xi 	    //set lower bound
1760*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103700 + 0xe1,  0x20);
1761*53ee8cc1Swenshuai.xi 	    //enable
1762*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103700 + 0xe6,  0x11);
1763*53ee8cc1Swenshuai.xi 	    //DMD SINGLE DEMOD0
1764*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103C00 + 0x28,  0x00);
1765*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103C00 + 0x24,  0x00);
1766*53ee8cc1Swenshuai.xi 		}
1767*53ee8cc1Swenshuai.xi 
1768*53ee8cc1Swenshuai.xi 		if(u8DemodIndex==DEMOD1)
1769*53ee8cc1Swenshuai.xi 		{
1770*53ee8cc1Swenshuai.xi 	    //MCU1
1771*53ee8cc1Swenshuai.xi 	    //release dmd mcu periphal rst
1772*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0xa6,  0x00);
1773*53ee8cc1Swenshuai.xi 	    //set upper bound
1774*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103800 + 0xe0,  0x3f);
1775*53ee8cc1Swenshuai.xi 	    //set lower bound
1776*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103800 + 0xe1,  0x20);
1777*53ee8cc1Swenshuai.xi 	    //enable
1778*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103800 + 0xe6,  0x11);
1779*53ee8cc1Swenshuai.xi 	    //DMD SINGLE DEMOD1
1780*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103C00 + 0x28,  0x00);
1781*53ee8cc1Swenshuai.xi 	    _MDrv_DMD_MSB201X_SetReg(devID, 0x103C00 + 0x24,  0x01);
1782*53ee8cc1Swenshuai.xi 		}
1783*53ee8cc1Swenshuai.xi 
1784*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 1);
1785*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x0000 + 0x00,  0x00);        // reset VD_MCU
1786*53ee8cc1Swenshuai.xi 
1787*53ee8cc1Swenshuai.xi     ////  Load code thru VDMCU_IF ////
1788*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
1789*53ee8cc1Swenshuai.xi     	printf(">Load Demod Code.....\n");
1790*53ee8cc1Swenshuai.xi     #endif
1791*53ee8cc1Swenshuai.xi 
1792*53ee8cc1Swenshuai.xi     for ( i = 0; i < sizeof(MSB201X_DVBC_table);)
1793*53ee8cc1Swenshuai.xi     {
1794*53ee8cc1Swenshuai.xi             tmp = SRAM_BASE + i;
1795*53ee8cc1Swenshuai.xi 
1796*53ee8cc1Swenshuai.xi             if (i+SRAM_Write_Buffer-1<sizeof(MSB201X_DVBC_table))
1797*53ee8cc1Swenshuai.xi             {
1798*53ee8cc1Swenshuai.xi                 MDrv_DMD_MSB201X_SetRegs(devID, tmp,MSB201X_DVBC_table+i,SRAM_Write_Buffer);
1799*53ee8cc1Swenshuai.xi 
1800*53ee8cc1Swenshuai.xi                 i=i+SRAM_Write_Buffer-1;
1801*53ee8cc1Swenshuai.xi             }
1802*53ee8cc1Swenshuai.xi             else
1803*53ee8cc1Swenshuai.xi             {
1804*53ee8cc1Swenshuai.xi                 MDrv_DMD_MSB201X_SetRegs(devID, tmp,MSB201X_DVBC_table+i,sizeof(MSB201X_DVBC_table)-i);
1805*53ee8cc1Swenshuai.xi 
1806*53ee8cc1Swenshuai.xi                 i=sizeof(MSB201X_DVBC_table);
1807*53ee8cc1Swenshuai.xi             }
1808*53ee8cc1Swenshuai.xi     }
1809*53ee8cc1Swenshuai.xi 
1810*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 3);
1811*53ee8cc1Swenshuai.xi 
1812*53ee8cc1Swenshuai.xi  		if(u8DemodIndex==DEMOD0)
1813*53ee8cc1Swenshuai.xi  		{
1814*53ee8cc1Swenshuai.xi  			//mux select for xdata setting from top riu to dmd riu
1815*53ee8cc1Swenshuai.xi  			_MDrv_DMD_MSB201X_SetReg(devID, 0x103700 + 0x1C,  0x00);
1816*53ee8cc1Swenshuai.xi  			//Load code finish, eable i-side to sram
1817*53ee8cc1Swenshuai.xi  			_MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0x81,  0x01);
1818*53ee8cc1Swenshuai.xi  			//Release dmd_mcu rst to wake up dmd51
1819*53ee8cc1Swenshuai.xi  			_MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0x80,  0x00);
1820*53ee8cc1Swenshuai.xi 
1821*53ee8cc1Swenshuai.xi  		}
1822*53ee8cc1Swenshuai.xi 
1823*53ee8cc1Swenshuai.xi  		if(u8DemodIndex==DEMOD1)
1824*53ee8cc1Swenshuai.xi  		{
1825*53ee8cc1Swenshuai.xi  			//mux select for xdata setting from top riu to dmd riu
1826*53ee8cc1Swenshuai.xi  			_MDrv_DMD_MSB201X_SetReg(devID, 0x103800 + 0x1C,  0x00);
1827*53ee8cc1Swenshuai.xi  			//Load code finish, eable i-side to sram
1828*53ee8cc1Swenshuai.xi  			_MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0xa1,  0x01);
1829*53ee8cc1Swenshuai.xi  			//Release dmd_mcu rst to wake up dmd51
1830*53ee8cc1Swenshuai.xi  			_MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + 0xa0,  0x00);
1831*53ee8cc1Swenshuai.xi  		}
1832*53ee8cc1Swenshuai.xi 
1833*53ee8cc1Swenshuai.xi  		_MSB201X_I2C_CH_Reset(devID, 5);
1834*53ee8cc1Swenshuai.xi 
1835*53ee8cc1Swenshuai.xi 
1836*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
1837*53ee8cc1Swenshuai.xi     	printf(">Demod Loadcode done.");
1838*53ee8cc1Swenshuai.xi     #endif
1839*53ee8cc1Swenshuai.xi 
1840*53ee8cc1Swenshuai.xi     return TRUE;
1841*53ee8cc1Swenshuai.xi }
1842*53ee8cc1Swenshuai.xi 
1843*53ee8cc1Swenshuai.xi /*
1844*53ee8cc1Swenshuai.xi static MS_BOOL  _MDrv_DMD_MSB201X_DSPReg_Init(MS_U8 devID)
1845*53ee8cc1Swenshuai.xi {
1846*53ee8cc1Swenshuai.xi     MS_U8    idx = 0, idx2 = 0;
1847*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
1848*53ee8cc1Swenshuai.xi 
1849*53ee8cc1Swenshuai.xi     for (idx = 0; idx<sizeof(MSB201X_DVBC_DSPREG_TABLE); idx++)
1850*53ee8cc1Swenshuai.xi     {
1851*53ee8cc1Swenshuai.xi     	for(idx2 = 0; idx2<DEMOD_MAX_CHANNEL; idx2++)
1852*53ee8cc1Swenshuai.xi     	{
1853*53ee8cc1Swenshuai.xi         if( _MDrv_DMD_MSB201X_SetDSPReg(devID, idx2, idx, pDemod->DVBC_DSP_REG[idx2][idx])!=TRUE)
1854*53ee8cc1Swenshuai.xi         {
1855*53ee8cc1Swenshuai.xi             printf("dvbc dsp reg init NG\n");
1856*53ee8cc1Swenshuai.xi             return FALSE;
1857*53ee8cc1Swenshuai.xi         }
1858*53ee8cc1Swenshuai.xi     	}
1859*53ee8cc1Swenshuai.xi     }
1860*53ee8cc1Swenshuai.xi 
1861*53ee8cc1Swenshuai.xi     // FSM enable
1862*53ee8cc1Swenshuai.xi     for(idx = 0; idx<DEMOD_MAX_CHANNEL; idx++)
1863*53ee8cc1Swenshuai.xi     	_MDrv_DMD_MSB201X_Active(devID, idx, TRUE);
1864*53ee8cc1Swenshuai.xi 
1865*53ee8cc1Swenshuai.xi     printf("DVBC dsp reg init ok\n");
1866*53ee8cc1Swenshuai.xi 
1867*53ee8cc1Swenshuai.xi     return TRUE;
1868*53ee8cc1Swenshuai.xi }
1869*53ee8cc1Swenshuai.xi */
1870*53ee8cc1Swenshuai.xi 
1871*53ee8cc1Swenshuai.xi 
1872*53ee8cc1Swenshuai.xi MS_U16 _MSB201X_CHIP_MATCH_TABLE[] =
1873*53ee8cc1Swenshuai.xi {
1874*53ee8cc1Swenshuai.xi     //Kaiser, Kaiserin, Keltic, Kronus, Kappa
1875*53ee8cc1Swenshuai.xi     0x56,       0x41,     0x72,  0x2F,  0x75,
1876*53ee8cc1Swenshuai.xi };
1877*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_LoadDSPCode(MS_U8 devID)1878*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_LoadDSPCode(MS_U8 devID)
1879*53ee8cc1Swenshuai.xi {
1880*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
1881*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
1882*53ee8cc1Swenshuai.xi     DMD_LOCK();
1883*53ee8cc1Swenshuai.xi     //bRet = _LoadDSPCode();
1884*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
1885*53ee8cc1Swenshuai.xi     return bRet;
1886*53ee8cc1Swenshuai.xi }
1887*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_SetActive(MS_U8 devID,MS_U8 u8DemodIndex,MS_BOOL bEnable)1888*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_SetActive(MS_U8 devID, MS_U8 u8DemodIndex, MS_BOOL bEnable)
1889*53ee8cc1Swenshuai.xi {
1890*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
1891*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
1892*53ee8cc1Swenshuai.xi 
1893*53ee8cc1Swenshuai.xi     DMD_LOCK();
1894*53ee8cc1Swenshuai.xi 
1895*53ee8cc1Swenshuai.xi     bRet=_MDrv_DMD_MSB201X_Active(devID, u8DemodIndex, bEnable);
1896*53ee8cc1Swenshuai.xi 
1897*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
1898*53ee8cc1Swenshuai.xi     return bRet;
1899*53ee8cc1Swenshuai.xi }
1900*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_InitClkgen(MS_U8 devID)1901*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_InitClkgen(MS_U8 devID)  //koln need modified
1902*53ee8cc1Swenshuai.xi {
1903*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 3);
1904*53ee8cc1Swenshuai.xi 
1905*53ee8cc1Swenshuai.xi 	  //inivec.task.cpp
1906*53ee8cc1Swenshuai.xi 
1907*53ee8cc1Swenshuai.xi 
1908*53ee8cc1Swenshuai.xi     // DMD HK init clk start
1909*53ee8cc1Swenshuai.xi // -------------------------------------------------------------------
1910*53ee8cc1Swenshuai.xi // Initialize DMD_ANA_MISC
1911*53ee8cc1Swenshuai.xi // -------------------------------------------------------------------
1912*53ee8cc1Swenshuai.xi 
1913*53ee8cc1Swenshuai.xi     // Koln add
1914*53ee8cc1Swenshuai.xi     // [0]	reg_pd_ldo25i_ana   // 2.5v LDO power down
1915*53ee8cc1Swenshuai.xi     // [1]	reg_pd_ldo25q_ana   // 2.5v LDO power down
1916*53ee8cc1Swenshuai.xi     // [2]	reg_pd_ldo25i_dig   // 2.5v LDO power down
1917*53ee8cc1Swenshuai.xi     // [3]	reg_pd_ldo25q_dig   // 2.5v LDO power down
1918*53ee8cc1Swenshuai.xi     // [4]	reg_pd_ldo25_ref    // 2.5v LDO power down
1919*53ee8cc1Swenshuai.xi     // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h53, 2'b01, 16'h0000);
1920*53ee8cc1Swenshuai.xi     //wreg 4106 0x53 0x0000
1921*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x53)*2  ,  0x00);
1922*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x53)*2+1,  0x00);
1923*53ee8cc1Swenshuai.xi 
1924*53ee8cc1Swenshuai.xi     // [0]	reg_tst_ldo25i
1925*53ee8cc1Swenshuai.xi     // [1]	reg_tst_ldo25q
1926*53ee8cc1Swenshuai.xi     // [5:4]	reg_tst_ldo25i_selfb
1927*53ee8cc1Swenshuai.xi     // [7:6]	reg_tst_ldo25q_selfb
1928*53ee8cc1Swenshuai.xi     // [8]	reg_pd_dm2p5ldoi = 1'b0
1929*53ee8cc1Swenshuai.xi     // [9]	reg_pd_dm2p5ldoq = 1'b0
1930*53ee8cc1Swenshuai.xi     // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h4f, 2'b11, 16'h0000);
1931*53ee8cc1Swenshuai.xi     // wreg 4106 0x4f 0x0000
1932*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x4f)*2  ,  0x00);
1933*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x4f)*2+1,  0x00);
1934*53ee8cc1Swenshuai.xi 
1935*53ee8cc1Swenshuai.xi     // [0]	reg_tst_ldo11_clk
1936*53ee8cc1Swenshuai.xi     // [1]	reg_tst_ldo26
1937*53ee8cc1Swenshuai.xi     // [2]	reg_tst_ldo11_cmp
1938*53ee8cc1Swenshuai.xi     // [3]	reg_pd_dm1p1ldo_clk = 1'b0
1939*53ee8cc1Swenshuai.xi     // [4]	reg_pd_dm1p1ldo_cmp = 1'b0
1940*53ee8cc1Swenshuai.xi     // [6]	reg_tst_ldo26_selfb
1941*53ee8cc1Swenshuai.xi     // [7]	reg_pd_dm2p6ldo = 1'b0
1942*53ee8cc1Swenshuai.xi     // [9:8]	reg_tst_ldo11_cmp_selfb
1943*53ee8cc1Swenshuai.xi     // [11:10]	reg_tst_ldo11_clk_selfb
1944*53ee8cc1Swenshuai.xi     // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h4e, 2'b11, 16'h0000);
1945*53ee8cc1Swenshuai.xi     //wreg 4106 0x4e 0x0000
1946*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x4e)*2  ,  0x00);
1947*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x4e)*2+1,  0x00);
1948*53ee8cc1Swenshuai.xi 
1949*53ee8cc1Swenshuai.xi 
1950*53ee8cc1Swenshuai.xi     // [1:0]	reg_mpll_loop_div_first       feedback divider 00:div by 1 01:div by 2 10:div by 4 11:div by 8
1951*53ee8cc1Swenshuai.xi     // [15:8]	reg_mpll_loop_div_second      feedback divider, div by binary data number
1952*53ee8cc1Swenshuai.xi     // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h33, 2'b11, 16'h1201);  // Loop divider ; VCO = 24*(2^2)*9 = 864
1953*53ee8cc1Swenshuai.xi //    wreg 4106 0x33 0x1201
1954*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x33)*2  ,  0x01);
1955*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x33)*2+1,  0x12);
1956*53ee8cc1Swenshuai.xi 
1957*53ee8cc1Swenshuai.xi     // [2:0]	reg_mpll_ictrl		    charge pump current control
1958*53ee8cc1Swenshuai.xi     // [3]	reg_mpll_in_sel		    1.8V or 3.3V reference clock domain select (1'b0=0==>3.3 V reference clock domain)
1959*53ee8cc1Swenshuai.xi     // [4]	reg_mpll_xtal2adc_sel	    select the XTAL clock bypass to MPLL_ADC_CLK
1960*53ee8cc1Swenshuai.xi     // [5]	reg_mpll_xtal2next_pll_sel  crystal clock bypass to next PLL select
1961*53ee8cc1Swenshuai.xi     // [6]	reg_mpll_vco_offset	    set VCO initial offset frequency
1962*53ee8cc1Swenshuai.xi     // [7]	reg_mpll_pd		    gated reference clock and power down PLL analog_3v: 1=power down
1963*53ee8cc1Swenshuai.xi     // [8]	reg_xtal_en		    XTAL enable register; 1: enable
1964*53ee8cc1Swenshuai.xi     // [10:9]	reg_xtal_sel		    XTAL driven strength select.
1965*53ee8cc1Swenshuai.xi     // [11]  	reg_mpll_porst		    MPLL input  power on reset, connect to reg as MPLL_RESET
1966*53ee8cc1Swenshuai.xi     // [12]  	reg_mpll_reset		    PLL software reset; 1:reset
1967*53ee8cc1Swenshuai.xi     // [13]  	reg_pd_dmpll_clk	    XTAL to MPLL clock reference power down
1968*53ee8cc1Swenshuai.xi     // [14]  	reg_pd_3p3_1		    XTAL to CLK_24M_3P3_1 power down
1969*53ee8cc1Swenshuai.xi     // [15]  	reg_pd_3p3_2		    XTAL to CLK_24M_3P3_2 power down
1970*53ee8cc1Swenshuai.xi     // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h35, 2'b11, 16'h1803); // MPLL reset
1971*53ee8cc1Swenshuai.xi     //wreg 4106 0x35 0x1803
1972*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x35)*2  ,  0x03);
1973*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x35)*2+1,  0x18);
1974*53ee8cc1Swenshuai.xi 
1975*53ee8cc1Swenshuai.xi     // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h35, 2'b11, 16'h0003); // release MPLl reset
1976*53ee8cc1Swenshuai.xi     //wreg 4106 0x35 0x0003
1977*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x35)*2  ,  0x03);
1978*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x35)*2+1,  0x00);
1979*53ee8cc1Swenshuai.xi 
1980*53ee8cc1Swenshuai.xi     // [0]	reg_mpll_clk_dp_pd	dummy
1981*53ee8cc1Swenshuai.xi     // [1]	reg_adc_clk_pd		ADC output clock power down
1982*53ee8cc1Swenshuai.xi     // [2]	reg_mpll_div2_pd	MPLL_DIV2 power down
1983*53ee8cc1Swenshuai.xi     // [3]	reg_mpll_div3_pd	MPLL_DIV3 power down
1984*53ee8cc1Swenshuai.xi     // [4]	reg_mpll_div4_pd	MPLL_DIV4 power down
1985*53ee8cc1Swenshuai.xi     // [5]	reg_mpll_div8_pd	MPLL_DIV8 power down
1986*53ee8cc1Swenshuai.xi     // [6]	reg_mpll_div10_pd	MPLL_DIV10 power down
1987*53ee8cc1Swenshuai.xi     // [13:8]  reg_mpll_adc_div_sel	select the ADC clock divide ratio,ADC clk=XTAL_IN
1988*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h30, 2'b11, 16'h1e00);  // divide ADC clock to 28.8Mhz = 24*36/30
1989*53ee8cc1Swenshuai.xi       //wreg 4106 0x30 0x1e00
1990*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x30)*2  ,  0x00);
1991*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x30)*2+1,  0x1e);
1992*53ee8cc1Swenshuai.xi 
1993*53ee8cc1Swenshuai.xi 
1994*53ee8cc1Swenshuai.xi     //$display("--------------------------------------");
1995*53ee8cc1Swenshuai.xi     //$display("Initialize ADC I/Q");
1996*53ee8cc1Swenshuai.xi     //$display("--------------------------------------");
1997*53ee8cc1Swenshuai.xi 
1998*53ee8cc1Swenshuai.xi     // [0]	Q channel ADC power down
1999*53ee8cc1Swenshuai.xi     // [1]	I channel ADC power down
2000*53ee8cc1Swenshuai.xi     // [2]	Q channel clamp enable. 0:enable, 1:disable
2001*53ee8cc1Swenshuai.xi     // [3]	I channel clamp enable. 0:enable, 1:disable
2002*53ee8cc1Swenshuai.xi     // [6:4]    I channel input mux control;
2003*53ee8cc1Swenshuai.xi     //		3'b000=I channel ADC calibration mode input
2004*53ee8cc1Swenshuai.xi     //	    	3'b001=VIF signal from VIFPGA
2005*53ee8cc1Swenshuai.xi     //	    	3'b100=DVB or ATSC mode input from PAD_I(Q)P(M)
2006*53ee8cc1Swenshuai.xi     //	    	all the other combination are only for test mode, don't use without understanding.
2007*53ee8cc1Swenshuai.xi     // [10:8]   Q channel input mux control;
2008*53ee8cc1Swenshuai.xi     //		3'b000=Q channel ADC calibration mode input
2009*53ee8cc1Swenshuai.xi     //	    	3'b001=VIF signal from VIFPGA 3'b010 = SSIF signal from PAD_SIFP(M)
2010*53ee8cc1Swenshuai.xi     //	    	3'b100=DVB or ATSC mode input from PAD_I(Q)P(M)
2011*53ee8cc1Swenshuai.xi     //	    	all the other combination are only for test mode, don't use without understanding.
2012*53ee8cc1Swenshuai.xi     // [12]	ADC I,Q swap enable; 1: swap
2013*53ee8cc1Swenshuai.xi     // [13]	ADC clock out select; 1: ADC_CLKQ
2014*53ee8cc1Swenshuai.xi     // [14]	ADC linear calibration bypass enable; 1:enable
2015*53ee8cc1Swenshuai.xi     // [15]	ADC internal 1.2v regulator control always 0 in T3
2016*53ee8cc1Swenshuai.xi         // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h01, 2'b11, 16'h0440); // Set IMUXS QMUXS
2017*53ee8cc1Swenshuai.xi         //wreg 4106 0x01 0x0440
2018*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x01)*2  ,  0x40);
2019*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x01)*2+1,  0x04);
2020*53ee8cc1Swenshuai.xi 
2021*53ee8cc1Swenshuai.xi     // [2:0]	reg_imuxs_s
2022*53ee8cc1Swenshuai.xi     // [6:4]	reg_qmuxs_s
2023*53ee8cc1Swenshuai.xi     // [9:8]	reg_iclpstr_s
2024*53ee8cc1Swenshuai.xi     // [13:12]	reg_qclpstr_s
2025*53ee8cc1Swenshuai.xi         // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h45, 2'b01, 16'h0000); // Set IMUXS QMUXS
2026*53ee8cc1Swenshuai.xi         //wreg 4106 0x45 0x0000
2027*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x45)*2  ,  0x00);
2028*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x45)*2+1,  0x00);
2029*53ee8cc1Swenshuai.xi 
2030*53ee8cc1Swenshuai.xi 
2031*53ee8cc1Swenshuai.xi     // [0]	Channel I ADC power down: 1=power dwon
2032*53ee8cc1Swenshuai.xi     // [1]	Channel Q ADC power down: 1=power dwon
2033*53ee8cc1Swenshuai.xi     // [2]	power down clamp buffer for test mode
2034*53ee8cc1Swenshuai.xi     // [3]	change ADC reference voltage for SSIF
2035*53ee8cc1Swenshuai.xi     // [6:4]    ADC source bias current control
2036*53ee8cc1Swenshuai.xi     // [9:8]    XTAL receiver amp gain
2037*53ee8cc1Swenshuai.xi         // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h0c, 2'b11, 16'h0000); // Set enable ADC clock
2038*53ee8cc1Swenshuai.xi     //    wreg 4106 0x0c 0x0000
2039*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x0c)*2  ,  0x00);
2040*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x0c)*2+1,  0x00);
2041*53ee8cc1Swenshuai.xi 
2042*53ee8cc1Swenshuai.xi 
2043*53ee8cc1Swenshuai.xi     // [0]	reg_linear_cal_start_q	0	0	1
2044*53ee8cc1Swenshuai.xi     // [1]	reg_linear_cal_mode_q	0	0	1
2045*53ee8cc1Swenshuai.xi     // [2]	reg_linear_cal_en_q	0	0	1
2046*53ee8cc1Swenshuai.xi     // [3]	reg_linear_cal_code0_oren_q	0	0	1
2047*53ee8cc1Swenshuai.xi     // [6:4]	reg_linear_cal_status_sel_q	2	0	3
2048*53ee8cc1Swenshuai.xi     // [7]	reg_pwdn_vcalbuf	0	0	1
2049*53ee8cc1Swenshuai.xi 
2050*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h0f, 2'b01, 16'h0000); // Set reg_pwdn_vcalbuf = 1'b0
2051*53ee8cc1Swenshuai.xi  //     wreg 4106 0x0f 0x0000
2052*53ee8cc1Swenshuai.xi  	   _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x0f)*2  ,  0x00);
2053*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x0f)*2+1,  0x00);
2054*53ee8cc1Swenshuai.xi 
2055*53ee8cc1Swenshuai.xi 
2056*53ee8cc1Swenshuai.xi     // [3:0]	clamp voltage control
2057*53ee8cc1Swenshuai.xi     //          3'b000 = 0.7v
2058*53ee8cc1Swenshuai.xi     //          3'b001 = 0.75v
2059*53ee8cc1Swenshuai.xi     //          3'b010 = 0.5v
2060*53ee8cc1Swenshuai.xi     //          3'b011 = 0.4v
2061*53ee8cc1Swenshuai.xi     //          3'b100 = 0.8v
2062*53ee8cc1Swenshuai.xi     //          3'b101 = 0.9v
2063*53ee8cc1Swenshuai.xi     //          3'b110 = 0.65v
2064*53ee8cc1Swenshuai.xi     //          3'b111 = 0.60v
2065*53ee8cc1Swenshuai.xi     // [4]	REFERENCE power down
2066*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h20, 2'b11, 16'h0000); // Disable PWDN_REF
2067*53ee8cc1Swenshuai.xi       //wreg 4106 0x20 0x0000
2068*53ee8cc1Swenshuai.xi  	   _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x20)*2  ,  0x00);
2069*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x20)*2+1,  0x00);
2070*53ee8cc1Swenshuai.xi     // Set ADC gain is 1
2071*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h0b, 2'b11, 16'h0505);
2072*53ee8cc1Swenshuai.xi       //wreg 4106 0x0b 0x0505
2073*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x0b)*2  ,  0x05);
2074*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x0b)*2+1,  0x05);
2075*53ee8cc1Swenshuai.xi 
2076*53ee8cc1Swenshuai.xi     // Disable ADC Sign bit
2077*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h2e, 2'b11, 16'h0000);
2078*53ee8cc1Swenshuai.xi       //wreg 4106 0x2e 0x0000
2079*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x2e)*2  ,  0x00);
2080*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x2e)*2+1,  0x00);
2081*53ee8cc1Swenshuai.xi 
2082*53ee8cc1Swenshuai.xi     // ADC I channel offset
2083*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h2a, 2'b11, 16'h0c00);
2084*53ee8cc1Swenshuai.xi       //wreg 4106 0x2a 0x0c00
2085*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x2a)*2  ,  0x00);
2086*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x2a)*2+1,  0x0c);
2087*53ee8cc1Swenshuai.xi 
2088*53ee8cc1Swenshuai.xi     // ADC Q channel offset
2089*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h2b, 2'b11, 16'h0c00);
2090*53ee8cc1Swenshuai.xi       //wreg 4106 0x2b 0x0c00
2091*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x2b)*2  ,  0x00);
2092*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x2b)*2+1,  0x0c);
2093*53ee8cc1Swenshuai.xi 
2094*53ee8cc1Swenshuai.xi 
2095*53ee8cc1Swenshuai.xi         // [5:0]reg_ckg_mcu
2096*53ee8cc1Swenshuai.xi         // [6]	reg_power_good_mask
2097*53ee8cc1Swenshuai.xi         // [11:8]reg_ckg_inner
2098*53ee8cc1Swenshuai.xi 	// [15:12]reg_ckg_iicm1
2099*53ee8cc1Swenshuai.xi     	// `RIU_W((`RIUBASE_TOP>>1)+7'h0b, 2'b11, 16'h0430);
2100*53ee8cc1Swenshuai.xi     	//wreg 4105 0x0b 0x0030
2101*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x2b)*2  ,  0x30);
2102*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x2b)*2+1,  0x00);
2103*53ee8cc1Swenshuai.xi 
2104*53ee8cc1Swenshuai.xi 
2105*53ee8cc1Swenshuai.xi         // [1:0]reg_chanout_sel
2106*53ee8cc1Swenshuai.xi         // [2]	reg_iq_filter_enable	= 1
2107*53ee8cc1Swenshuai.xi         // [3]	reg_iq_filter_sel
2108*53ee8cc1Swenshuai.xi         // [5:4]reg_adc_debug_clk_sel
2109*53ee8cc1Swenshuai.xi     	// `RIU_W((`RIUBASE_ADCPLL>>1)+7'h17, 2'b11, 16'h0004);
2110*53ee8cc1Swenshuai.xi     	//wreg 4106 0x17 0x0004
2111*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x17)*2  ,  0x04);
2112*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x17)*2+1,  0x00);
2113*53ee8cc1Swenshuai.xi 
2114*53ee8cc1Swenshuai.xi 
2115*53ee8cc1Swenshuai.xi 
2116*53ee8cc1Swenshuai.xi     // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h51, 2'b01, 16'h0081); // 2 channel DVBC
2117*53ee8cc1Swenshuai.xi     //wreg 4106 0x51 0x0081
2118*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x51)*2  ,  0x81);
2119*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x51)*2+1,  0x00);
2120*53ee8cc1Swenshuai.xi 
2121*53ee8cc1Swenshuai.xi 
2122*53ee8cc1Swenshuai.xi // -------------------------------------------------------------------
2123*53ee8cc1Swenshuai.xi // Release clock gating
2124*53ee8cc1Swenshuai.xi // -------------------------------------------------------------------
2125*53ee8cc1Swenshuai.xi     //$display("--------------------------------------");
2126*53ee8cc1Swenshuai.xi     //$display("Release clock gating");
2127*53ee8cc1Swenshuai.xi     //$display("--------------------------------------");
2128*53ee8cc1Swenshuai.xi 
2129*53ee8cc1Swenshuai.xi     // [0]	reg_xtal_en
2130*53ee8cc1Swenshuai.xi     // [9:8]	reg_clk_pd_iic
2131*53ee8cc1Swenshuai.xi     // [10]	reg_clk_pd_all
2132*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h09, 2'b11, 16'h0101);
2133*53ee8cc1Swenshuai.xi       //wreg 4105 0x09 0x0101
2134*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x09)*2  ,  0x01);
2135*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x09)*2+1,  0x01);
2136*53ee8cc1Swenshuai.xi 
2137*53ee8cc1Swenshuai.xi     // [3:0]	reg_ckg_adcd
2138*53ee8cc1Swenshuai.xi     // [7:4]	reg_ckg_sadc
2139*53ee8cc1Swenshuai.xi     // [11:8]	reg_ckg_iicm
2140*53ee8cc1Swenshuai.xi     // [13:12]	reg_ckg_sbus
2141*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h0a, 2'b11, 16'h0000);
2142*53ee8cc1Swenshuai.xi       //wreg 4105 0x0a 0x0000
2143*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x0a)*2  ,  0x00);
2144*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x0a)*2+1,  0x00);
2145*53ee8cc1Swenshuai.xi 
2146*53ee8cc1Swenshuai.xi     // [5:0]	reg_ckg_mcu
2147*53ee8cc1Swenshuai.xi     // [6]	reg_ckg_live
2148*53ee8cc1Swenshuai.xi     // [11:8]	reg_ckg_inner
2149*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h0b, 2'b11, 16'h0030);
2150*53ee8cc1Swenshuai.xi //      wreg 4105 0x0b 0x0030
2151*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x0b)*2  ,  0x00);
2152*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x0b)*2+1,  0x00);
2153*53ee8cc1Swenshuai.xi 
2154*53ee8cc1Swenshuai.xi 
2155*53ee8cc1Swenshuai.xi     // @0x0912
2156*53ee8cc1Swenshuai.xi     // [3:0]	reg_ckg_dvbtm_ts
2157*53ee8cc1Swenshuai.xi     // [4]	reg_dvbtm_ts_out_mode
2158*53ee8cc1Swenshuai.xi     // [5]	reg_dvbtm_ts_clk_pol
2159*53ee8cc1Swenshuai.xi     // [15:8]	reg_dvbtm_ts_clk_divnum
2160*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h12, 2'b11, 16'h1418);
2161*53ee8cc1Swenshuai.xi       //wreg 4105 0x12 0x1418
2162*53ee8cc1Swenshuai.xi      //_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2  ,  0x18);
2163*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2  ,  0x10);
2164*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2+1,  0x14);
2165*53ee8cc1Swenshuai.xi 
2166*53ee8cc1Swenshuai.xi     // @0x0913
2167*53ee8cc1Swenshuai.xi     // [5:0]	reg_ckg_spi
2168*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h13, 2'b11, 16'h0020);
2169*53ee8cc1Swenshuai.xi       //wreg 4105 0x13 0x0020
2170*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x13)*2  ,  0x20);
2171*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x13)*2+1,  0x00);
2172*53ee8cc1Swenshuai.xi 
2173*53ee8cc1Swenshuai.xi 
2174*53ee8cc1Swenshuai.xi     // @0x091b
2175*53ee8cc1Swenshuai.xi     // [10:8]	reg_ckg_syn_miu
2176*53ee8cc1Swenshuai.xi     // [14:12]	reg_ckg_syn_ts
2177*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h1b, 2'b11, 16'h0000);
2178*53ee8cc1Swenshuai.xi //      wreg 4105 0x1b 0x0000
2179*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x1b)*2  ,  0x00);
2180*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x1b)*2+1,  0x00);
2181*53ee8cc1Swenshuai.xi 
2182*53ee8cc1Swenshuai.xi 
2183*53ee8cc1Swenshuai.xi 
2184*53ee8cc1Swenshuai.xi     // @0x091c
2185*53ee8cc1Swenshuai.xi     // [4:0]	reg_ckg_bist
2186*53ee8cc1Swenshuai.xi     // [11:8]	reg_ckg_adcd_d2
2187*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h1c, 2'b11, 16'h0000);
2188*53ee8cc1Swenshuai.xi       //wreg 4105 0x1c 0x0000
2189*53ee8cc1Swenshuai.xi 
2190*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x1c)*2  ,  0x00);
2191*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x1c)*2+1,  0x00);
2192*53ee8cc1Swenshuai.xi 
2193*53ee8cc1Swenshuai.xi 
2194*53ee8cc1Swenshuai.xi     // [1:0]	reg_iicm_pad_sel
2195*53ee8cc1Swenshuai.xi     // [4]	reg_i2c_sbpm_en
2196*53ee8cc1Swenshuai.xi     // [12:8]	reg_i2c_sbpm_idle_num
2197*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h08, 2'b01, 16'h0a01);
2198*53ee8cc1Swenshuai.xi       //wreg 4105 0x08 0x0a01
2199*53ee8cc1Swenshuai.xi 
2200*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x08)*2  ,  0x01);
2201*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x08)*2+1,  0x0a);
2202*53ee8cc1Swenshuai.xi 
2203*53ee8cc1Swenshuai.xi     // [8]	reg_turn_off_pad
2204*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h28, 2'b10, 16'h0000);
2205*53ee8cc1Swenshuai.xi      // wreg 4105 0x28 0x0000
2206*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x28)*2  ,  0x00);
2207*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x28)*2+1,  0x00);
2208*53ee8cc1Swenshuai.xi 
2209*53ee8cc1Swenshuai.xi 
2210*53ee8cc1Swenshuai.xi 
2211*53ee8cc1Swenshuai.xi 
2212*53ee8cc1Swenshuai.xi     //$display("--------------------------------------");
2213*53ee8cc1Swenshuai.xi     //$display("Initialize Transport Stream synthesizer and APLL");
2214*53ee8cc1Swenshuai.xi     //$display("--------------------------------------");
2215*53ee8cc1Swenshuai.xi 
2216*53ee8cc1Swenshuai.xi     // ////////////////////////////////////////////////////
2217*53ee8cc1Swenshuai.xi     //
2218*53ee8cc1Swenshuai.xi     //	According to analog APLL designer's suggest:
2219*53ee8cc1Swenshuai.xi     //	APLL_LOOP_DIV = 5'b00000
2220*53ee8cc1Swenshuai.xi     //	apll input frequency range 54MHz~106MHz synthesizer clock
2221*53ee8cc1Swenshuai.xi     //	so apll_1x_out = synthesizer_out * (apll_ts_mode + 1)
2222*53ee8cc1Swenshuai.xi     //
2223*53ee8cc1Swenshuai.xi     //	=> apll_1x_out should 40Mhz ~ 130Mhz
2224*53ee8cc1Swenshuai.xi     //
2225*53ee8cc1Swenshuai.xi     //	Current setting:
2226*53ee8cc1Swenshuai.xi     //	apll_1x_out = (432/8.0) * (1+1) = 108MHz
2227*53ee8cc1Swenshuai.xi     //	choose reg_ckg_ts_apll_div[2:0] = 3'd4
2228*53ee8cc1Swenshuai.xi     //	ts_clk_apll_div = 108/(2^4) = 6.75MHz
2229*53ee8cc1Swenshuai.xi     //
2230*53ee8cc1Swenshuai.xi     // ////////////////////////////////////////////////////
2231*53ee8cc1Swenshuai.xi 
2232*53ee8cc1Swenshuai.xi 
2233*53ee8cc1Swenshuai.xi     // [15:0]	reg_synth_set[15: 0]
2234*53ee8cc1Swenshuai.xi     // [ 7:0]	reg_synth_set[23:16]
2235*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h51, 2'b11, 16'h0000);
2236*53ee8cc1Swenshuai.xi       //wreg 4105 0x51 0x0000
2237*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x51)*2  ,  0x00);
2238*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x51)*2+1,  0x00);
2239*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h52, 2'b11, 16'h0040);
2240*53ee8cc1Swenshuai.xi       //wreg 4105 0x52 0x0040
2241*53ee8cc1Swenshuai.xi 		 _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x52)*2  ,  0x40);
2242*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x52)*2+1,  0x00);
2243*53ee8cc1Swenshuai.xi 
2244*53ee8cc1Swenshuai.xi 
2245*53ee8cc1Swenshuai.xi     // [0]	reg_synth_reset
2246*53ee8cc1Swenshuai.xi     // [1]	reg_synth_ssc_en
2247*53ee8cc1Swenshuai.xi     // [2]	reg_synth_ssc_mode
2248*53ee8cc1Swenshuai.xi     // [4]	reg_synth_sld
2249*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h50, 2'b01, 16'h0010);
2250*53ee8cc1Swenshuai.xi       //wreg 4105 0x50 0x0010
2251*53ee8cc1Swenshuai.xi 
2252*53ee8cc1Swenshuai.xi 		 _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x50)*2  ,  0x10);
2253*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x50)*2+1,  0x00);
2254*53ee8cc1Swenshuai.xi 
2255*53ee8cc1Swenshuai.xi     // #10_000;
2256*53ee8cc1Swenshuai.xi     //delay 0  ****
2257*53ee8cc1Swenshuai.xi 
2258*53ee8cc1Swenshuai.xi 
2259*53ee8cc1Swenshuai.xi     // [1:0]	reg_apll_loop_div_first
2260*53ee8cc1Swenshuai.xi     // [15:8]	reg_apll_loop_div_second
2261*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h57, 2'b11, 16'h0000);
2262*53ee8cc1Swenshuai.xi      //wreg 4105 0x57 0x0000
2263*53ee8cc1Swenshuai.xi 
2264*53ee8cc1Swenshuai.xi 		 _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x57)*2  ,  0x00);
2265*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x57)*2+1,  0x00);
2266*53ee8cc1Swenshuai.xi 
2267*53ee8cc1Swenshuai.xi 
2268*53ee8cc1Swenshuai.xi     // [0]	reg_apll_pd
2269*53ee8cc1Swenshuai.xi     // [1]	reg_apll_reset
2270*53ee8cc1Swenshuai.xi     // [2]	reg_apll_porst
2271*53ee8cc1Swenshuai.xi     // [3]	reg_apll_vco_offset
2272*53ee8cc1Swenshuai.xi     // [4]	reg_apll_en_ts
2273*53ee8cc1Swenshuai.xi     // [5]	reg_apll_endcc
2274*53ee8cc1Swenshuai.xi     // [6]	reg_apll_clkin_sel
2275*53ee8cc1Swenshuai.xi     // [8]	reg_apll_ts_mode
2276*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h55, 2'b11, 16'h0100);
2277*53ee8cc1Swenshuai.xi       //wreg 4105 0x55 0x0100
2278*53ee8cc1Swenshuai.xi 		 _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x55)*2  ,  0x00);
2279*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x55)*2+1,  0x01);
2280*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h55, 2'b01, 16'h0110);
2281*53ee8cc1Swenshuai.xi       //wreg 4105 0x55 0x0110
2282*53ee8cc1Swenshuai.xi 		 _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x55)*2  ,  0x10);
2283*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x55)*2+1,  0x01);
2284*53ee8cc1Swenshuai.xi 
2285*53ee8cc1Swenshuai.xi     // [16:0]	reg_apll_test
2286*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h59, 2'b11, 16'h0000);
2287*53ee8cc1Swenshuai.xi       //wreg 4105 0x59 0x0000
2288*53ee8cc1Swenshuai.xi 		 _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x59)*2  ,  0x00);
2289*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x59)*2+1,  0x00);
2290*53ee8cc1Swenshuai.xi 
2291*53ee8cc1Swenshuai.xi     // 0x0920
2292*53ee8cc1Swenshuai.xi     // [3:0]	reg_ckg_ts_apll_div[2:0]
2293*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h20, 2'b01, 16'h0004);
2294*53ee8cc1Swenshuai.xi       //wreg 4105 0x20 0x0004
2295*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x20)*2  ,  0x04);
2296*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x20)*2+1,  0x00);
2297*53ee8cc1Swenshuai.xi 
2298*53ee8cc1Swenshuai.xi 		//  Following register control by reg_CLKGEN1
2299*53ee8cc1Swenshuai.xi 		//        reg_ckg_atsc_dvb_div_sel,  (clkgen0)
2300*53ee8cc1Swenshuai.xi 		//        reg_ckg_atsc_dvbtc_ts_inv, (clkgen0)
2301*53ee8cc1Swenshuai.xi 		//        reg_ckg_atsc_ts,           (clkgen0)
2302*53ee8cc1Swenshuai.xi 		//	reg_ckg_demod_test_in_en,  (clkgen0, clkgen_dmd)
2303*53ee8cc1Swenshuai.xi 		//        reg_ckg_dmdmcu,            (clkgen0)
2304*53ee8cc1Swenshuai.xi 		//        reg_ckg_dvbtc_adc,         (clkgen0, clkgen_dmd)
2305*53ee8cc1Swenshuai.xi 		//	reg_ckg_dvbtc_ts,          (clkgen0)
2306*53ee8cc1Swenshuai.xi 		//        reg_ckg_dvbtm_ts_divnum,   (clkgen0)
2307*53ee8cc1Swenshuai.xi 		//        reg_ckg_dvbtm_ts_out_mode, (clkgen0)
2308*53ee8cc1Swenshuai.xi 		//  reg_ckg_vifdbb_dac,        (clkgen0, clkgen_dmd)
2309*53ee8cc1Swenshuai.xi 		//	reg_ckg_vifdbb_vdac,       (clkgen0, clkgen_dmd)
2310*53ee8cc1Swenshuai.xi 
2311*53ee8cc1Swenshuai.xi 
2312*53ee8cc1Swenshuai.xi 
2313*53ee8cc1Swenshuai.xi 		//$display("Set register at TOP (clkgen) ......");
2314*53ee8cc1Swenshuai.xi 
2315*53ee8cc1Swenshuai.xi 		// { 1'b0, reg_ckg_adcd1[3:0], reg_clk_pd_all, 1'b0, reg_clk_pd_iic, 7'h0, reg_xtal_en }
2316*53ee8cc1Swenshuai.xi 		// `RIU_W((`RIUBASE_TOP>>1)+7'h09, 2'b10, 16'h0000);
2317*53ee8cc1Swenshuai.xi 		//wreg 4105 0x09 0x0000
2318*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x09)*2  ,  0x00);
2319*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x09)*2+1,  0x00);
2320*53ee8cc1Swenshuai.xi 		// { 2'h0, reg_ckg_sbus[1:0], reg_ckg_iicm[3:0], reg_ckg_sadc[3:0], reg_ckg_adcd[3:0] }
2321*53ee8cc1Swenshuai.xi 		// `RIU_W((`RIUBASE_TOP>>1)+7'h0a, 2'b01, 16'h1110);
2322*53ee8cc1Swenshuai.xi //		wreg 4105 0x0a 0x1110
2323*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x0a)*2  ,  0x10);
2324*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x0a)*2+1,  0x11);
2325*53ee8cc1Swenshuai.xi 
2326*53ee8cc1Swenshuai.xi 		// { reg_ckg_demod_mpll[3:0], 4'h0, reg_ckg_dmdxtali[3:0], reg_ckg_dmdmcu[3:0] }
2327*53ee8cc1Swenshuai.xi 		// `RIU_W((`RIUBASE_TOP>>1)+7'h0d, 2'b10, 16'h0000);
2328*53ee8cc1Swenshuai.xi 		//wreg 4105 0x0d 0x0000
2329*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x0d)*2  ,  0x00);
2330*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x0d)*2+1,  0x00);
2331*53ee8cc1Swenshuai.xi 
2332*53ee8cc1Swenshuai.xi 		// DVBC : 24*36/30=28.8 MHz
2333*53ee8cc1Swenshuai.xi 		// `RIU_W((`RIUBASE_ADCPLL>>1)+7'h33, 2'b11, 16'h1201);       // Set MPLL_LOOP_DIV_FIRST and SECOND
2334*53ee8cc1Swenshuai.xi 		//wreg 4106 0x33 0x1201
2335*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x33)*2  ,  0x01);
2336*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x33)*2+1,  0x12);
2337*53ee8cc1Swenshuai.xi      // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h30, 2'b11, 16'h1e00+16'h1); // Set MPLL_ADC_DIV_SEL
2338*53ee8cc1Swenshuai.xi 
2339*53ee8cc1Swenshuai.xi 		// reg_ckg_ts_0 = 4'd0;
2340*53ee8cc1Swenshuai.xi 		// reg_ckg_ts_1 = 4'd0;
2341*53ee8cc1Swenshuai.xi 		// `RIU_W((`RIUBASE_TOP>>1)+7'h23, 2'b01, 16'h0000);
2342*53ee8cc1Swenshuai.xi 		//wreg 4105 0x23 0x0000
2343*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x23)*2  ,  0x00);
2344*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x23)*2+1,  0x00);
2345*53ee8cc1Swenshuai.xi 
2346*53ee8cc1Swenshuai.xi 		//$display("=================================================");
2347*53ee8cc1Swenshuai.xi 		//$display("start demod atop ADC setting ......");
2348*53ee8cc1Swenshuai.xi 		//$display("=================================================");
2349*53ee8cc1Swenshuai.xi 
2350*53ee8cc1Swenshuai.xi 		// { 8'h0, reg_ana_setting_sel[3:0], 3'h0, reg_ana_setting_enable } )
2351*53ee8cc1Swenshuai.xi 		// `RIU_W((`RIUBASE_ADCPLL>>1)+7'h51, 2'b01, 16'h0081);
2352*53ee8cc1Swenshuai.xi 		//wreg 4106 0x51 0x0081
2353*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x51)*2  ,  0x81);
2354*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x51)*2+1,  0x00);
2355*53ee8cc1Swenshuai.xi 
2356*53ee8cc1Swenshuai.xi 		//if agc enable
2357*53ee8cc1Swenshuai.xi 		//wreg 4106 0x18 0x0101
2358*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x18)*2  ,  0x01);
2359*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x18)*2+1,  0x01);
2360*53ee8cc1Swenshuai.xi 
2361*53ee8cc1Swenshuai.xi 		//wreg 4106 0x30 0x1200
2362*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x30)*2  ,  0x00);
2363*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x30)*2+1,  0x12);
2364*53ee8cc1Swenshuai.xi 
2365*53ee8cc1Swenshuai.xi 
2366*53ee8cc1Swenshuai.xi 
2367*53ee8cc1Swenshuai.xi 
2368*53ee8cc1Swenshuai.xi 
2369*53ee8cc1Swenshuai.xi     return TRUE;
2370*53ee8cc1Swenshuai.xi }
2371*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_SoftStop(MS_U8 devID,MS_U8 u8DemodIndex)2372*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_SoftStop(MS_U8 devID, MS_U8 u8DemodIndex)
2373*53ee8cc1Swenshuai.xi {
2374*53ee8cc1Swenshuai.xi     MS_U16     u8WaitCnt=0;
2375*53ee8cc1Swenshuai.xi     MS_U16	banknum;
2376*53ee8cc1Swenshuai.xi     MS_U8		tmp, intr_shift;
2377*53ee8cc1Swenshuai.xi 
2378*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 3);
2379*53ee8cc1Swenshuai.xi     // Select mailbox bank number
2380*53ee8cc1Swenshuai.xi     switch(u8DemodIndex)
2381*53ee8cc1Swenshuai.xi    {
2382*53ee8cc1Swenshuai.xi    	case 0:
2383*53ee8cc1Swenshuai.xi    		banknum = 0x2600;
2384*53ee8cc1Swenshuai.xi 		intr_shift = 0x41;
2385*53ee8cc1Swenshuai.xi 		break;
2386*53ee8cc1Swenshuai.xi 	case 1:
2387*53ee8cc1Swenshuai.xi    		banknum = 0x2900;
2388*53ee8cc1Swenshuai.xi 		intr_shift = 0x51;
2389*53ee8cc1Swenshuai.xi 		break;
2390*53ee8cc1Swenshuai.xi 	case 2:
2391*53ee8cc1Swenshuai.xi    		banknum = 0x3300;
2392*53ee8cc1Swenshuai.xi 		intr_shift = 0x61;
2393*53ee8cc1Swenshuai.xi 		break;
2394*53ee8cc1Swenshuai.xi 	case 3:
2395*53ee8cc1Swenshuai.xi    		banknum = 0x3700;
2396*53ee8cc1Swenshuai.xi 		intr_shift = 0x71;
2397*53ee8cc1Swenshuai.xi 		break;
2398*53ee8cc1Swenshuai.xi 	default :
2399*53ee8cc1Swenshuai.xi 		banknum = 0x2600;
2400*53ee8cc1Swenshuai.xi 		intr_shift = 0x41;
2401*53ee8cc1Swenshuai.xi 		break;
2402*53ee8cc1Swenshuai.xi    }
2403*53ee8cc1Swenshuai.xi 
2404*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, banknum + 0x00, 0xA5);                 // MB_CNTL set read mode
2405*53ee8cc1Swenshuai.xi 
2406*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x3400 + (intr_shift * 2) + 1, 0x02);                         // assert interrupt to VD MCU51
2407*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x3400 + (intr_shift * 2) + 1, 0x00);                         // de-assert interrupt to VD MCU51
2408*53ee8cc1Swenshuai.xi 
2409*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_GetReg(devID, banknum + 0x00, &tmp);
2410*53ee8cc1Swenshuai.xi     while(tmp != 0x5A)           // wait MB_CNTL set done
2411*53ee8cc1Swenshuai.xi     {
2412*53ee8cc1Swenshuai.xi         if (u8WaitCnt++ >= 0xFF)
2413*53ee8cc1Swenshuai.xi         {
2414*53ee8cc1Swenshuai.xi             printf(">> SoftStop Fail!\n");
2415*53ee8cc1Swenshuai.xi             return FALSE;
2416*53ee8cc1Swenshuai.xi         }
2417*53ee8cc1Swenshuai.xi 	 _MDrv_DMD_MSB201X_GetReg(devID, banknum + 0x00, &tmp);
2418*53ee8cc1Swenshuai.xi     }
2419*53ee8cc1Swenshuai.xi 
2420*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, banknum + 0x00, 0x00);                 // MB_CNTL clear
2421*53ee8cc1Swenshuai.xi 
2422*53ee8cc1Swenshuai.xi     return TRUE;
2423*53ee8cc1Swenshuai.xi }
2424*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_Select_Demod_RIU(MS_U8 devID,MS_U8 u8DemodIndex)2425*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_Select_Demod_RIU(MS_U8 devID, MS_U8 u8DemodIndex)  //koln
2426*53ee8cc1Swenshuai.xi {
2427*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 3);
2428*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103C00 + (0x13)*2, u8DemodIndex);
2429*53ee8cc1Swenshuai.xi 
2430*53ee8cc1Swenshuai.xi     return TRUE;
2431*53ee8cc1Swenshuai.xi }
2432*53ee8cc1Swenshuai.xi 
2433*53ee8cc1Swenshuai.xi #if(0)
_MDrv_DMD_MSB201X_TS_MUX_Serial(MS_U8 devID)2434*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_TS_MUX_Serial(MS_U8 devID)
2435*53ee8cc1Swenshuai.xi {
2436*53ee8cc1Swenshuai.xi 
2437*53ee8cc1Swenshuai.xi 
2438*53ee8cc1Swenshuai.xi 	_MSB201X_I2C_CH_Reset(devID, 3);
2439*53ee8cc1Swenshuai.xi 
2440*53ee8cc1Swenshuai.xi // This file is translated by Steven Hung's riu2script.pl									test
2441*53ee8cc1Swenshuai.xi 
2442*53ee8cc1Swenshuai.xi     // `RIU_W ((`RIUBASE_TOP>>1)+7'h12, 2'b11, 16'h0610); //reg_ckg_dvbtm_ts_mux
2443*53ee8cc1Swenshuai.xi     //wreg  0x1009 0x12 0x0220
2444*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x12)*2, 0x0220);
2445*53ee8cc1Swenshuai.xi     // `RIU_W ((`RIUBASE_TOP>>1)+7'h1e, 2'b11, 16'h4444); //reg_ckg_ts_mux
2446*53ee8cc1Swenshuai.xi     //wreg  0x1009 0x1e 0x4444
2447*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x1e)*2, 0x4444);
2448*53ee8cc1Swenshuai.xi     // `RIU_W ((`RIUBASE_TOP>>1)+7'h23, 2'b11, 16'h0000); //reg_ckg_ts_*
2449*53ee8cc1Swenshuai.xi     //wreg  0x1009 0x23 0x0000
2450*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x23)*2, 0x0000);
2451*53ee8cc1Swenshuai.xi     // `RIU_W ((`RIUBASE_TOP>>1)+7'h28, 2'b11, 16'h0000); //all pad in
2452*53ee8cc1Swenshuai.xi     //wreg  0x1009 0x28 0x0000
2453*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x28)*2, 0x0000);
2454*53ee8cc1Swenshuai.xi     // `RIU_W ((`RIUBASE_TOP>>1)+7'h2e, 2'b11, 16'h0103); //en ts
2455*53ee8cc1Swenshuai.xi     // reg_en_ts_err_pad
2456*53ee8cc1Swenshuai.xi     ////wreg 0x1009 0x2e 0x0103
2457*53ee8cc1Swenshuai.xi     // reg_en_ts_pad_serial_3wire_mode
2458*53ee8cc1Swenshuai.xi     //wreg  0x1009 0x2d 0x0003
2459*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x2d)*2, 0x0003);
2460*53ee8cc1Swenshuai.xi     // reg_en_ts_pad_parallel_mode
2461*53ee8cc1Swenshuai.xi     //wreg  0x1009 0x2e 0x0000
2462*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x2e)*2, 0x0000);
2463*53ee8cc1Swenshuai.xi     // reg_en_ts_pad_serial_4wire_mode
2464*53ee8cc1Swenshuai.xi     //wreg  0x1009 0x29 0x0100
2465*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x29)*2, 0x0100);
2466*53ee8cc1Swenshuai.xi     // `RIU_W ((`RIUBASE_TOP>>1)+7'h3b, 2'b11, 16'h0000); //disable reg_ts_sspi_en
2467*53ee8cc1Swenshuai.xi     //wreg  0x1009 0x3b 0x0000
2468*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x3b)*2, 0x0000);
2469*53ee8cc1Swenshuai.xi 
2470*53ee8cc1Swenshuai.xi     // reg_ckg_ts_0~3
2471*53ee8cc1Swenshuai.xi     //wreg  0x1009 0x23 0x8888
2472*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100900 + (0x23)*2, 0x8888);
2473*53ee8cc1Swenshuai.xi 
2474*53ee8cc1Swenshuai.xi     // `RIU_W ((`RIUBASE_DIG>>1)+7'h70, 2'b11, 16'h0000); //reg_swrst_ts_mux
2475*53ee8cc1Swenshuai.xi     //wreg 0x100b 0x70 0x0000
2476*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x100b00 + (0x70)*2, 0x0000);
2477*53ee8cc1Swenshuai.xi 
2478*53ee8cc1Swenshuai.xi 
2479*53ee8cc1Swenshuai.xi     //TS remux bank setting
2480*53ee8cc1Swenshuai.xi     // wreg 42 0x00 0x00ff
2481*53ee8cc1Swenshuai.xi     //wreg 0x1031 0x00 0x00ff
2482*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x103100 + (0x00)*2, 0x00ff);
2483*53ee8cc1Swenshuai.xi 
2484*53ee8cc1Swenshuai.xi     //serial mode
2485*53ee8cc1Swenshuai.xi     //wreg 42 0x01 0x001e
2486*53ee8cc1Swenshuai.xi     //wreg 0x1031 0x01 0x001e
2487*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x103100 + (0x01)*2, 0x001e);
2488*53ee8cc1Swenshuai.xi 
2489*53ee8cc1Swenshuai.xi 
2490*53ee8cc1Swenshuai.xi    //*****************************/
2491*53ee8cc1Swenshuai.xi    //wreg 0x1031 0x04 0x802a
2492*53ee8cc1Swenshuai.xi 	 _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x103100 + (0x04)*2, 0x802a);
2493*53ee8cc1Swenshuai.xi 	 // `RIU_W ((`RIUBASE_TS_MUX>>1)+7'h06, 2'b11, 16'h0020); //reg_client_mask
2494*53ee8cc1Swenshuai.xi 	 //wreg 0x1031 0x06 0x0020
2495*53ee8cc1Swenshuai.xi 	 _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x103100 + (0x06)*2, 0x0020);
2496*53ee8cc1Swenshuai.xi 
2497*53ee8cc1Swenshuai.xi  	 //disable sync mask function
2498*53ee8cc1Swenshuai.xi    //wreg 0x1031 0x02 0x001f
2499*53ee8cc1Swenshuai.xi    _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x103100 + (0x02)*2, 0x001f);
2500*53ee8cc1Swenshuai.xi  	// _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x103100 + (0x02)*2, 0x001f);
2501*53ee8cc1Swenshuai.xi   //*******************************/
2502*53ee8cc1Swenshuai.xi 
2503*53ee8cc1Swenshuai.xi     // wreg  42 0x00 0x03ff
2504*53ee8cc1Swenshuai.xi     //wreg 0x1031 0x00 0x03ff
2505*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x103100 + (0x00)*2, 0x03ff);
2506*53ee8cc1Swenshuai.xi     // wreg  42 0x00 0x00ff
2507*53ee8cc1Swenshuai.xi     //wreg 0x1031 0x00 0x00ff
2508*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x103100 + (0x00)*2, 0x00ff);
2509*53ee8cc1Swenshuai.xi     // wreg  42 0x00 0x000f
2510*53ee8cc1Swenshuai.xi     //wreg 0x1031 0x00 0x000f
2511*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x103100 + (0x00)*2, 0x000f);
2512*53ee8cc1Swenshuai.xi 
2513*53ee8cc1Swenshuai.xi 	return TRUE;
2514*53ee8cc1Swenshuai.xi }
2515*53ee8cc1Swenshuai.xi #endif
2516*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_Restart(MS_U8 devID,MS_U8 u8DemodIndex)2517*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_Restart(MS_U8 devID, MS_U8 u8DemodIndex)
2518*53ee8cc1Swenshuai.xi {
2519*53ee8cc1Swenshuai.xi     MS_U8		reset_shift;
2520*53ee8cc1Swenshuai.xi     MS_U16		banknum;
2521*53ee8cc1Swenshuai.xi 
2522*53ee8cc1Swenshuai.xi 
2523*53ee8cc1Swenshuai.xi     // Select mailbox bank number and DMD_MCU reset shift
2524*53ee8cc1Swenshuai.xi     switch(u8DemodIndex)
2525*53ee8cc1Swenshuai.xi    {
2526*53ee8cc1Swenshuai.xi    	case 0:
2527*53ee8cc1Swenshuai.xi    		banknum = 0x1035;
2528*53ee8cc1Swenshuai.xi 		reset_shift = 0x40;
2529*53ee8cc1Swenshuai.xi 		break;
2530*53ee8cc1Swenshuai.xi 	case 1:
2531*53ee8cc1Swenshuai.xi    		banknum = 0x1036;
2532*53ee8cc1Swenshuai.xi 		reset_shift = 0x50;
2533*53ee8cc1Swenshuai.xi 		break;
2534*53ee8cc1Swenshuai.xi 	/*
2535*53ee8cc1Swenshuai.xi 	case 2:
2536*53ee8cc1Swenshuai.xi    		banknum = 0x3300;
2537*53ee8cc1Swenshuai.xi 		reset_shift = 0x60;
2538*53ee8cc1Swenshuai.xi 		break;
2539*53ee8cc1Swenshuai.xi 	case 3:
2540*53ee8cc1Swenshuai.xi    		banknum = 0x3700;
2541*53ee8cc1Swenshuai.xi 		reset_shift = 0x70;
2542*53ee8cc1Swenshuai.xi 		break;
2543*53ee8cc1Swenshuai.xi 	*/
2544*53ee8cc1Swenshuai.xi 	default :
2545*53ee8cc1Swenshuai.xi    		banknum = 0x1035;
2546*53ee8cc1Swenshuai.xi 		reset_shift = 0x40;
2547*53ee8cc1Swenshuai.xi 		break;
2548*53ee8cc1Swenshuai.xi    }
2549*53ee8cc1Swenshuai.xi 
2550*53ee8cc1Swenshuai.xi     printf(" @MDrv_DMD_MSB201X_Restart!\n");
2551*53ee8cc1Swenshuai.xi 
2552*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 3);
2553*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SoftStop(devID, u8DemodIndex);
2554*53ee8cc1Swenshuai.xi 
2555*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_Select_Demod_RIU(devID, u8DemodIndex);
2556*53ee8cc1Swenshuai.xi 
2557*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + reset_shift*2, 0x01);     // reset DMD_MCU
2558*53ee8cc1Swenshuai.xi 
2559*53ee8cc1Swenshuai.xi     _MSB201X_Delay_Task(5);
2560*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, banknum + 0x00 , 0x00);     // clear MB_CNTL
2561*53ee8cc1Swenshuai.xi 
2562*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, 0x103400 + reset_shift*2, 0x00);
2563*53ee8cc1Swenshuai.xi     _MSB201X_Delay_Task(5);
2564*53ee8cc1Swenshuai.xi 
2565*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, banknum + 0x00 , 0x00);
2566*53ee8cc1Swenshuai.xi 
2567*53ee8cc1Swenshuai.xi     return TRUE;
2568*53ee8cc1Swenshuai.xi }
2569*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_Restart(MS_U8 devID,MS_U8 u8DemodIndex)2570*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_Restart(MS_U8 devID, MS_U8 u8DemodIndex)
2571*53ee8cc1Swenshuai.xi {
2572*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
2573*53ee8cc1Swenshuai.xi     DMD_LOCK();
2574*53ee8cc1Swenshuai.xi 
2575*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_Restart(devID, u8DemodIndex);
2576*53ee8cc1Swenshuai.xi 
2577*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
2578*53ee8cc1Swenshuai.xi     return TRUE;
2579*53ee8cc1Swenshuai.xi }
2580*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_GetPacketErr(MS_U8 devID,MS_U8 u8DemodIndex,MS_U16 * pktErr)2581*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_GetPacketErr(MS_U8 devID,MS_U8 u8DemodIndex, MS_U16 *pktErr)
2582*53ee8cc1Swenshuai.xi {
2583*53ee8cc1Swenshuai.xi     MS_U8            reg = 0, reg_frz = 0;
2584*53ee8cc1Swenshuai.xi     MS_U16           PktErr;
2585*53ee8cc1Swenshuai.xi 
2586*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 5);
2587*53ee8cc1Swenshuai.xi 
2588*53ee8cc1Swenshuai.xi     // bank 1f 0x03 [1:0] reg_bit_err_num_freeze
2589*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_GetReg(devID, BACKEND_REG_BASE+0x03, &reg_frz);
2590*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, BACKEND_REG_BASE+0x03, reg_frz|0x03);
2591*53ee8cc1Swenshuai.xi 
2592*53ee8cc1Swenshuai.xi     // bank 1f 0x66 [7:0] reg_uncrt_pkt_num_7_0
2593*53ee8cc1Swenshuai.xi     //             0x67 [15:8] reg_uncrt_pkt_num_15_8
2594*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_GetReg(devID, BACKEND_REG_BASE+0x67, &reg);
2595*53ee8cc1Swenshuai.xi     PktErr = reg;
2596*53ee8cc1Swenshuai.xi 
2597*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_GetReg(devID, BACKEND_REG_BASE+0x66, &reg);
2598*53ee8cc1Swenshuai.xi     PktErr = (PktErr << 8)|reg;
2599*53ee8cc1Swenshuai.xi 
2600*53ee8cc1Swenshuai.xi     // bank 1f 0x03 [1:0] reg_bit_err_num_freeze
2601*53ee8cc1Swenshuai.xi     reg_frz=reg_frz&(~0x03);
2602*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, BACKEND_REG_BASE+0x03, reg_frz);
2603*53ee8cc1Swenshuai.xi 
2604*53ee8cc1Swenshuai.xi     #if 1
2605*53ee8cc1Swenshuai.xi     	printf("MSB201X Demod %d PktErr = %d \n ", (int)u8DemodIndex, (int)PktErr);
2606*53ee8cc1Swenshuai.xi     #endif
2607*53ee8cc1Swenshuai.xi 
2608*53ee8cc1Swenshuai.xi     *pktErr = PktErr;
2609*53ee8cc1Swenshuai.xi 
2610*53ee8cc1Swenshuai.xi     return TRUE;
2611*53ee8cc1Swenshuai.xi }
2612*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_GetPacketErr(MS_U8 devID,MS_U8 u8DemodIndex,MS_U16 * pktErr)2613*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_GetPacketErr(MS_U8 devID,MS_U8 u8DemodIndex, MS_U16 *pktErr)
2614*53ee8cc1Swenshuai.xi {
2615*53ee8cc1Swenshuai.xi     MS_BOOL          status = true;
2616*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
2617*53ee8cc1Swenshuai.xi     DMD_LOCK();
2618*53ee8cc1Swenshuai.xi 
2619*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_Select_Demod_RIU(devID, u8DemodIndex);
2620*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_GetPacketErr(devID,u8DemodIndex, pktErr);
2621*53ee8cc1Swenshuai.xi 
2622*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
2623*53ee8cc1Swenshuai.xi 
2624*53ee8cc1Swenshuai.xi     return status;
2625*53ee8cc1Swenshuai.xi }
2626*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_GetPostViterbiBer(MS_U8 devID,MS_U8 u8DemodIndex,float * ber)2627*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_GetPostViterbiBer(MS_U8 devID,MS_U8 u8DemodIndex, float *ber)
2628*53ee8cc1Swenshuai.xi {
2629*53ee8cc1Swenshuai.xi     MS_BOOL           status = true;
2630*53ee8cc1Swenshuai.xi     MS_U8             reg = 0, reg_frz = 0;
2631*53ee8cc1Swenshuai.xi     MS_U16            BitErrPeriod;
2632*53ee8cc1Swenshuai.xi     MS_U32            BitErr;
2633*53ee8cc1Swenshuai.xi 
2634*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 5);
2635*53ee8cc1Swenshuai.xi 
2636*53ee8cc1Swenshuai.xi     // bank 1f 0x03 [1:0] reg_bit_err_num_freeze
2637*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_GetReg(devID, BACKEND_REG_BASE+0x03, &reg_frz);
2638*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, BACKEND_REG_BASE+0x03, reg_frz|0x03);
2639*53ee8cc1Swenshuai.xi 
2640*53ee8cc1Swenshuai.xi     // bank 1f 0x46 [7:0] reg_bit_err_sblprd_7_0
2641*53ee8cc1Swenshuai.xi     //             0x47 [15:8] reg_bit_err_sblprd_15_8
2642*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_GetReg(devID, BACKEND_REG_BASE+0x47, &reg);
2643*53ee8cc1Swenshuai.xi     BitErrPeriod = reg;
2644*53ee8cc1Swenshuai.xi 
2645*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_GetReg(devID, BACKEND_REG_BASE+0x46, &reg);
2646*53ee8cc1Swenshuai.xi     BitErrPeriod = (BitErrPeriod << 8)|reg;
2647*53ee8cc1Swenshuai.xi 
2648*53ee8cc1Swenshuai.xi     // bank 1f 0x6a [7:0] reg_bit_err_num_7_0
2649*53ee8cc1Swenshuai.xi     //             0x6b [15:8] reg_bit_err_num_15_8
2650*53ee8cc1Swenshuai.xi     // bank 1f 0x6c [7:0] reg_bit_err_num_23_16
2651*53ee8cc1Swenshuai.xi     //             0x6d [15:8] reg_bit_err_num_31_24
2652*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_GetReg(devID, BACKEND_REG_BASE+0x6d, &reg);
2653*53ee8cc1Swenshuai.xi     BitErr = reg;
2654*53ee8cc1Swenshuai.xi 
2655*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_GetReg(devID, BACKEND_REG_BASE+0x6c, &reg);
2656*53ee8cc1Swenshuai.xi     BitErr = (BitErr << 8)|reg;
2657*53ee8cc1Swenshuai.xi 
2658*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_GetReg(devID, BACKEND_REG_BASE+0x6b, &reg);
2659*53ee8cc1Swenshuai.xi     BitErr = (BitErr << 8)|reg;
2660*53ee8cc1Swenshuai.xi 
2661*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_GetReg(devID, BACKEND_REG_BASE+0x6a, &reg);
2662*53ee8cc1Swenshuai.xi     BitErr = (BitErr << 8)|reg;
2663*53ee8cc1Swenshuai.xi 
2664*53ee8cc1Swenshuai.xi     // bank 1f 0x03 [1:0] reg_bit_err_num_freeze
2665*53ee8cc1Swenshuai.xi     reg_frz=reg_frz&(~0x03);
2666*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_SetReg(devID, BACKEND_REG_BASE+0x03, reg_frz);
2667*53ee8cc1Swenshuai.xi 
2668*53ee8cc1Swenshuai.xi     if (BitErrPeriod == 0 )    //protect 0
2669*53ee8cc1Swenshuai.xi         BitErrPeriod = 1;
2670*53ee8cc1Swenshuai.xi 
2671*53ee8cc1Swenshuai.xi     if (BitErr <=0 )
2672*53ee8cc1Swenshuai.xi         *ber = 0.5f / ((float)BitErrPeriod*128*188*8);
2673*53ee8cc1Swenshuai.xi     else
2674*53ee8cc1Swenshuai.xi         *ber = (float)BitErr / ((float)BitErrPeriod*128*188*8);
2675*53ee8cc1Swenshuai.xi 
2676*53ee8cc1Swenshuai.xi     printf("MSB201X Demod %d PostVitBER = %8.3e \n ", (int)u8DemodIndex, *ber);
2677*53ee8cc1Swenshuai.xi 
2678*53ee8cc1Swenshuai.xi     return TRUE;
2679*53ee8cc1Swenshuai.xi }
2680*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_GetPostViterbiBer(MS_U8 devID,MS_U8 u8DemodIndex,float * ber)2681*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_GetPostViterbiBer(MS_U8 devID,MS_U8 u8DemodIndex, float *ber)
2682*53ee8cc1Swenshuai.xi {
2683*53ee8cc1Swenshuai.xi     MS_BOOL          status = true;
2684*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
2685*53ee8cc1Swenshuai.xi     DMD_LOCK();
2686*53ee8cc1Swenshuai.xi 
2687*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_Select_Demod_RIU(devID, u8DemodIndex);
2688*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_GetPostViterbiBer(devID,u8DemodIndex, ber);
2689*53ee8cc1Swenshuai.xi 
2690*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
2691*53ee8cc1Swenshuai.xi 
2692*53ee8cc1Swenshuai.xi     return status;
2693*53ee8cc1Swenshuai.xi }
2694*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_GetSNR(MS_U8 devID,MS_U8 u8DemodIndex,float * f_snr)2695*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_GetSNR(MS_U8 devID,MS_U8 u8DemodIndex, float *f_snr)
2696*53ee8cc1Swenshuai.xi {
2697*53ee8cc1Swenshuai.xi     MS_BOOL status = true;
2698*53ee8cc1Swenshuai.xi     MS_U8 u8Data = 0;//reg_frz = 0;
2699*53ee8cc1Swenshuai.xi     // MS_U8 freeze = 0;
2700*53ee8cc1Swenshuai.xi     MS_U16 noisepower = 0;
2701*53ee8cc1Swenshuai.xi 
2702*53ee8cc1Swenshuai.xi     if (TRUE == MDrv_DMD_MSB201X_Demod_GetLock(devID, u8DemodIndex) )
2703*53ee8cc1Swenshuai.xi     {
2704*53ee8cc1Swenshuai.xi         _MSB201X_I2C_CH_Reset(devID, 5);
2705*53ee8cc1Swenshuai.xi 
2706*53ee8cc1Swenshuai.xi         // bank 2c 0x3d [0] reg_bit_err_num_freeze
2707*53ee8cc1Swenshuai.xi         status &= _MDrv_DMD_MSB201X_SetReg(devID, EQE_REG_BASE + 0x3a, 0x20);
2708*53ee8cc1Swenshuai.xi         status &= _MDrv_DMD_MSB201X_SetReg(devID, INNC_REG_BASE + 0x05, 0x80);
2709*53ee8cc1Swenshuai.xi         // read vk
2710*53ee8cc1Swenshuai.xi         status &= _MDrv_DMD_MSB201X_GetReg(devID, EQE_REG_BASE + 0x45, &u8Data);
2711*53ee8cc1Swenshuai.xi         noisepower = u8Data;
2712*53ee8cc1Swenshuai.xi         status &= _MDrv_DMD_MSB201X_GetReg(devID, EQE_REG_BASE + 0x44, &u8Data);
2713*53ee8cc1Swenshuai.xi         noisepower = (noisepower<<8)|u8Data;
2714*53ee8cc1Swenshuai.xi 
2715*53ee8cc1Swenshuai.xi         // bank 2c 0x3d [0] reg_bit_err_num_freeze
2716*53ee8cc1Swenshuai.xi         status &= _MDrv_DMD_MSB201X_SetReg(devID, EQE_REG_BASE + 0x3a, 0x00);
2717*53ee8cc1Swenshuai.xi         status &= _MDrv_DMD_MSB201X_SetReg(devID, INNC_REG_BASE + 0x05, 0x00);
2718*53ee8cc1Swenshuai.xi 
2719*53ee8cc1Swenshuai.xi         if(noisepower == 0x0000)
2720*53ee8cc1Swenshuai.xi             noisepower = 0x0001;
2721*53ee8cc1Swenshuai.xi 
2722*53ee8cc1Swenshuai.xi         *f_snr = 10.0f*log10f(65536.0f/(float)noisepower);
2723*53ee8cc1Swenshuai.xi 
2724*53ee8cc1Swenshuai.xi     }
2725*53ee8cc1Swenshuai.xi     else
2726*53ee8cc1Swenshuai.xi     {
2727*53ee8cc1Swenshuai.xi         *f_snr = 0.0f;
2728*53ee8cc1Swenshuai.xi     }
2729*53ee8cc1Swenshuai.xi 
2730*53ee8cc1Swenshuai.xi     return status;
2731*53ee8cc1Swenshuai.xi }
2732*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_GetSNR(MS_U8 devID,MS_U8 u8DemodIndex,float * fSNR)2733*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_GetSNR(MS_U8 devID,MS_U8 u8DemodIndex, float *fSNR)
2734*53ee8cc1Swenshuai.xi {
2735*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
2736*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
2737*53ee8cc1Swenshuai.xi     DMD_LOCK();
2738*53ee8cc1Swenshuai.xi 
2739*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_Select_Demod_RIU(devID, u8DemodIndex);
2740*53ee8cc1Swenshuai.xi     bRet=_MDrv_DMD_MSB201X_GetSNR(devID, u8DemodIndex, fSNR);
2741*53ee8cc1Swenshuai.xi 
2742*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
2743*53ee8cc1Swenshuai.xi 
2744*53ee8cc1Swenshuai.xi     return bRet;
2745*53ee8cc1Swenshuai.xi }
2746*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_Variable_alloc(void)2747*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMD_MSB201X_Variable_alloc(void)
2748*53ee8cc1Swenshuai.xi {
2749*53ee8cc1Swenshuai.xi     MS_U8 i;
2750*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pMSB201X = NULL;
2751*53ee8cc1Swenshuai.xi 
2752*53ee8cc1Swenshuai.xi     if(NULL == pstDemod)
2753*53ee8cc1Swenshuai.xi     {
2754*53ee8cc1Swenshuai.xi         pstDemod = (tMSB201X_Demod_Data *)malloc(sizeof(tMSB201X_Demod_Data) * DEMOD_MAX_INSTANCE);
2755*53ee8cc1Swenshuai.xi         if(NULL == pstDemod)
2756*53ee8cc1Swenshuai.xi         {
2757*53ee8cc1Swenshuai.xi             return FALSE;
2758*53ee8cc1Swenshuai.xi         }
2759*53ee8cc1Swenshuai.xi         else
2760*53ee8cc1Swenshuai.xi         {
2761*53ee8cc1Swenshuai.xi             for(i=0; i< DEMOD_MAX_INSTANCE; i++)
2762*53ee8cc1Swenshuai.xi             {
2763*53ee8cc1Swenshuai.xi                 pMSB201X = (pstDemod + i);
2764*53ee8cc1Swenshuai.xi                 memcpy(pMSB201X, &MSB201X_Demod_Init, sizeof(tMSB201X_Demod_Data));
2765*53ee8cc1Swenshuai.xi             }
2766*53ee8cc1Swenshuai.xi         }
2767*53ee8cc1Swenshuai.xi     }
2768*53ee8cc1Swenshuai.xi 
2769*53ee8cc1Swenshuai.xi     if(NULL == pDemodRest)
2770*53ee8cc1Swenshuai.xi     {
2771*53ee8cc1Swenshuai.xi         pDemodRest = (MS_BOOL*)malloc(sizeof(MS_BOOL) * DEMOD_MAX_INSTANCE);
2772*53ee8cc1Swenshuai.xi         if(NULL == pDemodRest)
2773*53ee8cc1Swenshuai.xi         {
2774*53ee8cc1Swenshuai.xi             return FALSE;
2775*53ee8cc1Swenshuai.xi         }
2776*53ee8cc1Swenshuai.xi         else
2777*53ee8cc1Swenshuai.xi         {
2778*53ee8cc1Swenshuai.xi             for(i=0; i< DEMOD_MAX_INSTANCE; i++)
2779*53ee8cc1Swenshuai.xi                 *(pDemodRest + i) = TRUE;
2780*53ee8cc1Swenshuai.xi         }
2781*53ee8cc1Swenshuai.xi     }
2782*53ee8cc1Swenshuai.xi 
2783*53ee8cc1Swenshuai.xi     return TRUE;
2784*53ee8cc1Swenshuai.xi }
2785*53ee8cc1Swenshuai.xi 
2786*53ee8cc1Swenshuai.xi 
2787*53ee8cc1Swenshuai.xi 
2788*53ee8cc1Swenshuai.xi 
2789*53ee8cc1Swenshuai.xi 
2790*53ee8cc1Swenshuai.xi 
2791*53ee8cc1Swenshuai.xi 
2792*53ee8cc1Swenshuai.xi 
2793*53ee8cc1Swenshuai.xi 
_MSB201X_Demod_SPILoadAll(MS_U8 devID,eDMD_MSB201X_Demod_Index eDemod_Index,MS_U8 * u8_ptr,MS_U16 data_length)2794*53ee8cc1Swenshuai.xi static MS_BOOL _MSB201X_Demod_SPILoadAll(MS_U8 devID, eDMD_MSB201X_Demod_Index eDemod_Index, MS_U8 *u8_ptr, MS_U16 data_length)
2795*53ee8cc1Swenshuai.xi {
2796*53ee8cc1Swenshuai.xi 	MS_BOOL bRet = TRUE;
2797*53ee8cc1Swenshuai.xi 	MS_U32 u32Addr = 0;
2798*53ee8cc1Swenshuai.xi 
2799*53ee8cc1Swenshuai.xi 	_MSB201X_I2C_CH_Reset(devID, 3);
2800*53ee8cc1Swenshuai.xi 
2801*53ee8cc1Swenshuai.xi 
2802*53ee8cc1Swenshuai.xi 
2803*53ee8cc1Swenshuai.xi   //2.Enable sspi2dmd51 sram & select sspi mode
2804*53ee8cc1Swenshuai.xi   //SSPI_RIU_W, addr:0x0974, data:0x3100  (dmdall)
2805*53ee8cc1Swenshuai.xi   MDrv_DMD_SSPI_RIU_Write8(0x0974, 0x00);
2806*53ee8cc1Swenshuai.xi   MDrv_DMD_SSPI_RIU_Write8(0x0975, 0x30);
2807*53ee8cc1Swenshuai.xi   //3. Disable all pad in
2808*53ee8cc1Swenshuai.xi   //SSPI_RIU_W, addr:0x0950, data:0x0000  (dmdall)
2809*53ee8cc1Swenshuai.xi   MDrv_DMD_SSPI_RIU_Write8(0x0950, 0x00);
2810*53ee8cc1Swenshuai.xi   MDrv_DMD_SSPI_RIU_Write8(0x0951, 0x00);
2811*53ee8cc1Swenshuai.xi   //4. DMD51 interrupt by PM51 (Option)
2812*53ee8cc1Swenshuai.xi   //SSPI_RIU_W, addr:0x3482, data:0x0200
2813*53ee8cc1Swenshuai.xi   MDrv_DMD_SSPI_RIU_Write8(0x3482, 0x00);
2814*53ee8cc1Swenshuai.xi   MDrv_DMD_SSPI_RIU_Write8(0x3483, 0x02);
2815*53ee8cc1Swenshuai.xi   //5. Enable program sram clock
2816*53ee8cc1Swenshuai.xi 
2817*53ee8cc1Swenshuai.xi 
2818*53ee8cc1Swenshuai.xi 
2819*53ee8cc1Swenshuai.xi 
2820*53ee8cc1Swenshuai.xi   #if(0)
2821*53ee8cc1Swenshuai.xi   /*  bryan mark test for SPI
2822*53ee8cc1Swenshuai.xi   //b. SSPI_RIU_W, addr:0x0916, data:0x1c30 //xtali
2823*53ee8cc1Swenshuai.xi   MDrv_DMD_SSPI_RIU_Write8(0x0916,0x30);
2824*53ee8cc1Swenshuai.xi   MDrv_DMD_SSPI_RIU_Write8(0x0917,0x1C);
2825*53ee8cc1Swenshuai.xi   //SSPI_RIU_W, addr:0x0916, data:0x1c20 //[5]deglitch
2826*53ee8cc1Swenshuai.xi   MDrv_DMD_SSPI_RIU_Write8(0x0916,0x20);
2827*53ee8cc1Swenshuai.xi   MDrv_DMD_SSPI_RIU_Write8(0x0917,0x1c);
2828*53ee8cc1Swenshuai.xi   */
2829*53ee8cc1Swenshuai.xi   #else
2830*53ee8cc1Swenshuai.xi   //b. SSPI_RIU_W, addr:0x0916, data:0x1c30 //xtali
2831*53ee8cc1Swenshuai.xi   MDrv_DMD_SSPI_RIU_Write8(0x0916,0x00);
2832*53ee8cc1Swenshuai.xi   MDrv_DMD_SSPI_RIU_Write8(0x0917,0x00);
2833*53ee8cc1Swenshuai.xi   #endif
2834*53ee8cc1Swenshuai.xi 
2835*53ee8cc1Swenshuai.xi   //6. Release dmd_mcu periphal rst (All/Single)
2836*53ee8cc1Swenshuai.xi   //SSPI_RIU_W, addr:0x3486, data:0x0000 (dmd0)
2837*53ee8cc1Swenshuai.xi 
2838*53ee8cc1Swenshuai.xi   //load all demod
2839*53ee8cc1Swenshuai.xi   MDrv_DMD_SSPI_RIU_Write8(0x3486,0x00);
2840*53ee8cc1Swenshuai.xi   MDrv_DMD_SSPI_RIU_Write8(0x3487,0x00);
2841*53ee8cc1Swenshuai.xi   MDrv_DMD_SSPI_RIU_Write8(0x34a6,0x00);
2842*53ee8cc1Swenshuai.xi   MDrv_DMD_SSPI_RIU_Write8(0x34a7,0x00);
2843*53ee8cc1Swenshuai.xi 
2844*53ee8cc1Swenshuai.xi 	u32Addr = 0x80000000;//SRAM_BASE<<16;
2845*53ee8cc1Swenshuai.xi        bRet &= MDrv_DMD_SSPI_MIU_Writes(u32Addr, u8_ptr, data_length);
2846*53ee8cc1Swenshuai.xi 
2847*53ee8cc1Swenshuai.xi 	MDrv_DMD_SSPI_RIU_Write8(0x0974, 0x00);
2848*53ee8cc1Swenshuai.xi 	MDrv_DMD_SSPI_RIU_Write8(0x0975, 0x00);//0x01
2849*53ee8cc1Swenshuai.xi 
2850*53ee8cc1Swenshuai.xi 	//MDrv_DMD_SSPI_RIU_Write8(0x0919, 0x00);
2851*53ee8cc1Swenshuai.xi 
2852*53ee8cc1Swenshuai.xi 	MDrv_DMD_SSPI_RIU_Write8(0x3480, 0x00);
2853*53ee8cc1Swenshuai.xi 	MDrv_DMD_SSPI_RIU_Write8(0x3481, 0x01);
2854*53ee8cc1Swenshuai.xi 	MDrv_DMD_SSPI_RIU_Write8(0x34A0, 0x00);
2855*53ee8cc1Swenshuai.xi 	MDrv_DMD_SSPI_RIU_Write8(0x34A1, 0x01);
2856*53ee8cc1Swenshuai.xi 
2857*53ee8cc1Swenshuai.xi 
2858*53ee8cc1Swenshuai.xi 	return bRet;
2859*53ee8cc1Swenshuai.xi }
2860*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_Init(MS_U8 devID,MS_U8 u8DemodIndex,sDMD_MSB201X_InitData * pDMD_MSB201X_InitData,MS_U32 u32InitDataLen)2861*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_Init(MS_U8 devID, MS_U8 u8DemodIndex, sDMD_MSB201X_InitData *pDMD_MSB201X_InitData, MS_U32 u32InitDataLen)
2862*53ee8cc1Swenshuai.xi {
2863*53ee8cc1Swenshuai.xi     MS_U8 idx = 0, u8Mask = 0, u8RegWrite = 0, u8Channel = 0;
2864*53ee8cc1Swenshuai.xi     MS_U16 u16DspAddr = 0;
2865*53ee8cc1Swenshuai.xi     MS_U8 idx2 = 0;
2866*53ee8cc1Swenshuai.xi     MS_U8 u8Data;
2867*53ee8cc1Swenshuai.xi     MS_U8 *code_ptr;
2868*53ee8cc1Swenshuai.xi     MS_U16 code_size;
2869*53ee8cc1Swenshuai.xi 
2870*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_Variable_alloc();
2871*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
2872*53ee8cc1Swenshuai.xi 
2873*53ee8cc1Swenshuai.xi     DMD_LOCK();
2874*53ee8cc1Swenshuai.xi 
2875*53ee8cc1Swenshuai.xi     if ( sizeof(sDMD_MSB201X_InitData) == u32InitDataLen)
2876*53ee8cc1Swenshuai.xi     {
2877*53ee8cc1Swenshuai.xi         memcpy(&pDemod->_sDMD_MSB201X_InitData, pDMD_MSB201X_InitData, u32InitDataLen);
2878*53ee8cc1Swenshuai.xi     }
2879*53ee8cc1Swenshuai.xi     else
2880*53ee8cc1Swenshuai.xi     {
2881*53ee8cc1Swenshuai.xi         DMD_DBG(printf("MDrv_DMD_MSB201X_Init input data structure incorrect\n"));
2882*53ee8cc1Swenshuai.xi         //DMD_UNLOCK();
2883*53ee8cc1Swenshuai.xi         return FALSE;
2884*53ee8cc1Swenshuai.xi     }
2885*53ee8cc1Swenshuai.xi 
2886*53ee8cc1Swenshuai.xi     pDemod->DSP_ReadWrite_Mode = E_MSB201X_I2C_READ_WRITE;
2887*53ee8cc1Swenshuai.xi 
2888*53ee8cc1Swenshuai.xi 
2889*53ee8cc1Swenshuai.xi 
2890*53ee8cc1Swenshuai.xi     if(u8DemodIndex == ALL_DEMOD)
2891*53ee8cc1Swenshuai.xi     {
2892*53ee8cc1Swenshuai.xi 	 //for SPI communication
2893*53ee8cc1Swenshuai.xi     if (pDemod->_sDMD_MSB201X_InitData.bEnableSPILoadCode &&
2894*53ee8cc1Swenshuai.xi         pDemod->_sDMD_MSB201X_InitData.fpMSB201X_SPIPAD_En != NULL)
2895*53ee8cc1Swenshuai.xi     {
2896*53ee8cc1Swenshuai.xi     	 _MSB201X_I2C_CH_Reset(devID, 3);
2897*53ee8cc1Swenshuai.xi         if (!MDrv_DMD_SSPI_Init(0))
2898*53ee8cc1Swenshuai.xi         {
2899*53ee8cc1Swenshuai.xi             printf("MDrv_DMD_MSB201X_Init Init MDrv_DMD_SSPI_Init Fail \n");
2900*53ee8cc1Swenshuai.xi         }
2901*53ee8cc1Swenshuai.xi         //add today
2902*53ee8cc1Swenshuai.xi         pDemod->DSP_ReadWrite_Mode = E_MSB201X_I2C_READ_WRITE;
2903*53ee8cc1Swenshuai.xi 
2904*53ee8cc1Swenshuai.xi 
2905*53ee8cc1Swenshuai.xi         MDrv_MasterSPI_CsPadConfig(0, 0xff);
2906*53ee8cc1Swenshuai.xi         MDrv_MasterSPI_MaxClkConfig(0, 1);
2907*53ee8cc1Swenshuai.xi         //switch SPI pad on demod side
2908*53ee8cc1Swenshuai.xi         (pDemod->_sDMD_MSB201X_InitData.fpMSB201X_SPIPAD_En)(TRUE);
2909*53ee8cc1Swenshuai.xi         // ------enable to use TS_PAD as SSPI_PAD
2910*53ee8cc1Swenshuai.xi         // [0:0] reg_en_sspi_pad
2911*53ee8cc1Swenshuai.xi         // [1:1] reg_ts_sspi_en, 1: use TS_PAD as SSPI_PAD
2912*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB201X_SetReg2Bytes(devID,0x100900 + (0x3b) * 2, 0x0002);
2913*53ee8cc1Swenshuai.xi 
2914*53ee8cc1Swenshuai.xi 
2915*53ee8cc1Swenshuai.xi         /*
2916*53ee8cc1Swenshuai.xi         	//Turn off all pad in
2917*53ee8cc1Swenshuai.xi         	_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x0900 + (0x28) * 2, 0x0000);
2918*53ee8cc1Swenshuai.xi         	//Transport Stream pad on
2919*53ee8cc1Swenshuai.xi         	_MDrv_DMD_MSB201X_SetReg2Bytes(devID, 0x0900 + (0x2d) * 2, 0x00ff);
2920*53ee8cc1Swenshuai.xi         */
2921*53ee8cc1Swenshuai.xi         // ------- MSPI protocol setting
2922*53ee8cc1Swenshuai.xi         // [8] cpha
2923*53ee8cc1Swenshuai.xi         // [9] cpol
2924*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB201X_GetReg(devID,0x100900+(0x3a)*2+1,&u8Data);
2925*53ee8cc1Swenshuai.xi         u8Data &= 0xFC;
2926*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB201X_SetReg(devID,0x100900+(0x3a)*2+1, u8Data);
2927*53ee8cc1Swenshuai.xi         // ------- MSPI driving setting
2928*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB201X_SetReg2Bytes(devID,0x100900+(0x2c)*2, 0x07ff);
2929*53ee8cc1Swenshuai.xi 
2930*53ee8cc1Swenshuai.xi 
2931*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB201X_SSPI_CFG_W(0x02,0x10);
2932*53ee8cc1Swenshuai.xi 
2933*53ee8cc1Swenshuai.xi 	 _MDrv_DMD_MSB201X_InitClkgen(devID);
2934*53ee8cc1Swenshuai.xi 
2935*53ee8cc1Swenshuai.xi 		code_ptr = MSB201X_DVBC_table;
2936*53ee8cc1Swenshuai.xi 		code_size = sizeof(MSB201X_DVBC_table);
2937*53ee8cc1Swenshuai.xi     	 _MSB201X_Demod_SPILoadAll(devID, ALL_DEMOD, code_ptr, code_size);	//load demod FW code via SPI
2938*53ee8cc1Swenshuai.xi 
2939*53ee8cc1Swenshuai.xi 		//_MDrv_DMD_MSR1742_SetReg2Bytes(devID, 0x0900 + (0x3b) * 2, 0x0000);
2940*53ee8cc1Swenshuai.xi         	//(pDemod->_sDMD_MSR1742_InitData.fpMSR1742_SPIPAD_En)(FALSE);
2941*53ee8cc1Swenshuai.xi 
2942*53ee8cc1Swenshuai.xi 		//time_end = MsOS_GetSystemTime();
2943*53ee8cc1Swenshuai.xi 		//printf("=====Brown Demod SPI load code time = %d\n", (time_end-time_start));
2944*53ee8cc1Swenshuai.xi 	pDemod->DSP_ReadWrite_Mode = E_MSB201X_SPI_READ_WRITE;
2945*53ee8cc1Swenshuai.xi 
2946*53ee8cc1Swenshuai.xi 
2947*53ee8cc1Swenshuai.xi 
2948*53ee8cc1Swenshuai.xi     }
2949*53ee8cc1Swenshuai.xi     else
2950*53ee8cc1Swenshuai.xi     {
2951*53ee8cc1Swenshuai.xi     		 _MDrv_DMD_MSB201X_InitClkgen(devID);
2952*53ee8cc1Swenshuai.xi     	        pDemod->_sDMD_MSB201X_InitData.bEnableSPILoadCode = FALSE;
2953*53ee8cc1Swenshuai.xi     		_MSB201X_Demod_LoadAll(devID, ALL_DEMOD);	//load demod FW code
2954*53ee8cc1Swenshuai.xi     		pDemod->DSP_ReadWrite_Mode = E_MSB201X_I2C_READ_WRITE;
2955*53ee8cc1Swenshuai.xi     }
2956*53ee8cc1Swenshuai.xi 
2957*53ee8cc1Swenshuai.xi 
2958*53ee8cc1Swenshuai.xi     	// Init DSP table for all channels
2959*53ee8cc1Swenshuai.xi     	for(idx = 0; idx < DEMOD_MAX_CHANNEL; idx++)
2960*53ee8cc1Swenshuai.xi     	{
2961*53ee8cc1Swenshuai.xi     		memcpy (&pDemod->DVBC_DSP_REG[idx][0],
2962*53ee8cc1Swenshuai.xi                 MSB201X_DVBC_DSPREG_TABLE ,
2963*53ee8cc1Swenshuai.xi                 sizeof(MSB201X_DVBC_DSPREG_TABLE));
2964*53ee8cc1Swenshuai.xi 
2965*53ee8cc1Swenshuai.xi 
2966*53ee8cc1Swenshuai.xi 
2967*53ee8cc1Swenshuai.xi 
2968*53ee8cc1Swenshuai.xi 
2969*53ee8cc1Swenshuai.xi 
2970*53ee8cc1Swenshuai.xi 
2971*53ee8cc1Swenshuai.xi 		for(idx2 = 0; idx2 < sizeof(MSB201X_DVBC_DSPREG_TABLE); idx2++)
2972*53ee8cc1Swenshuai.xi 		{
2973*53ee8cc1Swenshuai.xi 			_MDrv_DMD_MSB201X_SetDSPReg(devID, idx, idx2, MSB201X_DVBC_DSPREG_TABLE[idx2]);
2974*53ee8cc1Swenshuai.xi 
2975*53ee8cc1Swenshuai.xi 		}
2976*53ee8cc1Swenshuai.xi 
2977*53ee8cc1Swenshuai.xi 
2978*53ee8cc1Swenshuai.xi     	}
2979*53ee8cc1Swenshuai.xi 
2980*53ee8cc1Swenshuai.xi 
2981*53ee8cc1Swenshuai.xi 
2982*53ee8cc1Swenshuai.xi     }
2983*53ee8cc1Swenshuai.xi     else
2984*53ee8cc1Swenshuai.xi     {
2985*53ee8cc1Swenshuai.xi     	_MDrv_DMD_MSB201X_InitClkgen(devID);
2986*53ee8cc1Swenshuai.xi     	_MSB201X_Demod_LoadSingle(devID, u8DemodIndex);	//load demod FW code
2987*53ee8cc1Swenshuai.xi 
2988*53ee8cc1Swenshuai.xi 
2989*53ee8cc1Swenshuai.xi 	memcpy (&pDemod->DVBC_DSP_REG[u8DemodIndex][0],
2990*53ee8cc1Swenshuai.xi                 MSB201X_DVBC_DSPREG_TABLE ,
2991*53ee8cc1Swenshuai.xi                 sizeof(MSB201X_DVBC_DSPREG_TABLE));
2992*53ee8cc1Swenshuai.xi 
2993*53ee8cc1Swenshuai.xi 
2994*53ee8cc1Swenshuai.xi 
2995*53ee8cc1Swenshuai.xi 		for(idx2 = 0; idx2 < sizeof(MSB201X_DVBC_DSPREG_TABLE); idx2++)
2996*53ee8cc1Swenshuai.xi 		{
2997*53ee8cc1Swenshuai.xi 			_MDrv_DMD_MSB201X_SetDSPReg(devID, u8DemodIndex, idx2, MSB201X_DVBC_DSPREG_TABLE[idx2]);
2998*53ee8cc1Swenshuai.xi 		}
2999*53ee8cc1Swenshuai.xi 
3000*53ee8cc1Swenshuai.xi     }
3001*53ee8cc1Swenshuai.xi 
3002*53ee8cc1Swenshuai.xi     /* DSP table example :
3003*53ee8cc1Swenshuai.xi 	static MS_U8 u8DSPTable[] =
3004*53ee8cc1Swenshuai.xi     	{
3005*53ee8cc1Swenshuai.xi         //addr_L add_H mask value demod_channel
3006*53ee8cc1Swenshuai.xi         0x01, 00,
3007*53ee8cc1Swenshuai.xi         0x16, 0x00, 0xff, 0xBB, 0, //FS_H  45.474M :0xB1  48M:0xBB
3008*53ee8cc1Swenshuai.xi         0x15, 0x00, 0xff, 0x80, 0, //FS_L  45.474M :0xA2  48M:0x80
3009*53ee8cc1Swenshuai.xi     	};
3010*53ee8cc1Swenshuai.xi     */
3011*53ee8cc1Swenshuai.xi 
3012*53ee8cc1Swenshuai.xi     if (pDemod->_sDMD_MSB201X_InitData.pDVBC_DSP_REG!= NULL)
3013*53ee8cc1Swenshuai.xi     {
3014*53ee8cc1Swenshuai.xi 
3015*53ee8cc1Swenshuai.xi 
3016*53ee8cc1Swenshuai.xi 	 if(1 == pDemod->_sDMD_MSB201X_InitData.pDVBC_DSP_REG[0])
3017*53ee8cc1Swenshuai.xi 	 {
3018*53ee8cc1Swenshuai.xi 	 	pDemod->_sDMD_MSB201X_InitData.pDVBC_DSP_REG += 2;
3019*53ee8cc1Swenshuai.xi 		for(idx = 0; idx < pDemod->_sDMD_MSB201X_InitData.DVBC_DSP_REG_Length-2; idx++)
3020*53ee8cc1Swenshuai.xi 		{
3021*53ee8cc1Swenshuai.xi 			u16DspAddr = *(pDemod->_sDMD_MSB201X_InitData.pDVBC_DSP_REG);
3022*53ee8cc1Swenshuai.xi 			pDemod->_sDMD_MSB201X_InitData.pDVBC_DSP_REG ++;
3023*53ee8cc1Swenshuai.xi 			u16DspAddr = (u16DspAddr) + (*(pDemod->_sDMD_MSB201X_InitData.pDVBC_DSP_REG)<<8);
3024*53ee8cc1Swenshuai.xi 			pDemod->_sDMD_MSB201X_InitData.pDVBC_DSP_REG ++;
3025*53ee8cc1Swenshuai.xi 			u8Mask = *(pDemod->_sDMD_MSB201X_InitData.pDVBC_DSP_REG);
3026*53ee8cc1Swenshuai.xi 			pDemod->_sDMD_MSB201X_InitData.pDVBC_DSP_REG ++;
3027*53ee8cc1Swenshuai.xi 			u8RegWrite = (*(pDemod->_sDMD_MSB201X_InitData.pDVBC_DSP_REG)) & u8Mask;
3028*53ee8cc1Swenshuai.xi 			pDemod->_sDMD_MSB201X_InitData.pDVBC_DSP_REG ++;
3029*53ee8cc1Swenshuai.xi 			u8Channel = *(pDemod->_sDMD_MSB201X_InitData.pDVBC_DSP_REG);
3030*53ee8cc1Swenshuai.xi 
3031*53ee8cc1Swenshuai.xi 			//pDemod->DVBC_DSP_REG[u8Channel][u16DspAddr] = u8RegWrite;
3032*53ee8cc1Swenshuai.xi 
3033*53ee8cc1Swenshuai.xi 			if(ALL_DEMOD == u8DemodIndex)
3034*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetDSPReg(devID, u8Channel, u16DspAddr, u8RegWrite);
3035*53ee8cc1Swenshuai.xi 			else if(u8Channel == u8DemodIndex)
3036*53ee8cc1Swenshuai.xi 				_MDrv_DMD_MSB201X_SetDSPReg(devID, u8Channel, u16DspAddr, u8RegWrite);
3037*53ee8cc1Swenshuai.xi 
3038*53ee8cc1Swenshuai.xi 			memcpy (&pDemod->DVBC_DSP_REG[u8Channel][u16DspAddr],
3039*53ee8cc1Swenshuai.xi                 		&u8RegWrite ,
3040*53ee8cc1Swenshuai.xi                 		1);
3041*53ee8cc1Swenshuai.xi 
3042*53ee8cc1Swenshuai.xi 		}
3043*53ee8cc1Swenshuai.xi 	 }
3044*53ee8cc1Swenshuai.xi     }
3045*53ee8cc1Swenshuai.xi 
3046*53ee8cc1Swenshuai.xi 
3047*53ee8cc1Swenshuai.xi 
3048*53ee8cc1Swenshuai.xi     if(u8DemodIndex == ALL_DEMOD)
3049*53ee8cc1Swenshuai.xi     {
3050*53ee8cc1Swenshuai.xi     	for(idx = 0; idx < DEMOD_MAX_CHANNEL; idx++)
3051*53ee8cc1Swenshuai.xi     	{
3052*53ee8cc1Swenshuai.xi     		// Demod active for all channel
3053*53ee8cc1Swenshuai.xi     		_MDrv_DMD_MSB201X_Active(devID, idx, TRUE);
3054*53ee8cc1Swenshuai.xi     	}
3055*53ee8cc1Swenshuai.xi     }
3056*53ee8cc1Swenshuai.xi     else
3057*53ee8cc1Swenshuai.xi     {
3058*53ee8cc1Swenshuai.xi     		// Demod active for single channel
3059*53ee8cc1Swenshuai.xi     	  _MDrv_DMD_MSB201X_Active(devID, u8DemodIndex, TRUE);
3060*53ee8cc1Swenshuai.xi     }
3061*53ee8cc1Swenshuai.xi 
3062*53ee8cc1Swenshuai.xi 
3063*53ee8cc1Swenshuai.xi     if (E_MSB201X_SPI_READ_WRITE==pDemod->DSP_ReadWrite_Mode)
3064*53ee8cc1Swenshuai.xi     {
3065*53ee8cc1Swenshuai.xi     		//SPI function
3066*53ee8cc1Swenshuai.xi         // ------disable to use TS_PAD as SSPI_PAD after load code
3067*53ee8cc1Swenshuai.xi         // [0:0] reg_en_sspi_pad
3068*53ee8cc1Swenshuai.xi         // [1:1] reg_ts_sspi_en, 1: use TS_PAD as SSPI_PAD
3069*53ee8cc1Swenshuai.xi         pDemod->DSP_ReadWrite_Mode = E_MSB201X_I2C_READ_WRITE;
3070*53ee8cc1Swenshuai.xi         //_MDrv_DMD_MSB201X_SetReg2Bytes(devID,0x100900 + (0x3b) * 2, 0x0001);
3071*53ee8cc1Swenshuai.xi          _MDrv_DMD_MSB201X_SetReg2Bytes(devID,0x100900 + (0x3b) * 2, 0x0000);
3072*53ee8cc1Swenshuai.xi         (pDemod->_sDMD_MSB201X_InitData.fpMSB201X_SPIPAD_En)(FALSE);
3073*53ee8cc1Swenshuai.xi 
3074*53ee8cc1Swenshuai.xi     }
3075*53ee8cc1Swenshuai.xi 
3076*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
3077*53ee8cc1Swenshuai.xi     return TRUE;
3078*53ee8cc1Swenshuai.xi }
3079*53ee8cc1Swenshuai.xi 
3080*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_GetRFLevel(MS_U8 devID,MS_U8 u8DemodIndex,float * fRFPowerDbmResult,float fRFPowerDbm,sDMD_MSB201X_IFAGC_SSI * pIfagcSsi_LoRef,MS_U16 u16IfagcSsi_LoRef_Size,sDMD_MSB201X_IFAGC_ERR * pIfagcErr_LoRef,MS_U16 u16IfagcErr_LoRef_Size)3081*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_GetRFLevel(MS_U8 devID, MS_U8 u8DemodIndex, float *fRFPowerDbmResult, float fRFPowerDbm,
3082*53ee8cc1Swenshuai.xi                                                      sDMD_MSB201X_IFAGC_SSI *pIfagcSsi_LoRef, MS_U16 u16IfagcSsi_LoRef_Size,
3083*53ee8cc1Swenshuai.xi                                                      sDMD_MSB201X_IFAGC_ERR *pIfagcErr_LoRef, MS_U16 u16IfagcErr_LoRef_Size)
3084*53ee8cc1Swenshuai.xi {
3085*53ee8cc1Swenshuai.xi     sDMD_MSB201X_IFAGC_SSI   *ifagc_ssi;
3086*53ee8cc1Swenshuai.xi     sDMD_MSB201X_IFAGC_ERR   *ifagc_err;
3087*53ee8cc1Swenshuai.xi     float   ch_power_db=0.0f;
3088*53ee8cc1Swenshuai.xi     float   ch_power_rf=0.0f;
3089*53ee8cc1Swenshuai.xi     float   ch_power_if=0.0f, ch_power_ifa = 0.0f, ch_power_ifb =0.0f;
3090*53ee8cc1Swenshuai.xi     float   ch_power_takeover=0.0f;
3091*53ee8cc1Swenshuai.xi     MS_U16  if_agc_err = 0;
3092*53ee8cc1Swenshuai.xi     MS_U8   status = true;
3093*53ee8cc1Swenshuai.xi     MS_U8   reg_tmp = 0, reg_tmp2 =0, reg_frz = 0,if_agc_val =0, if_agc_vala =0, if_agc_valb =0, if_agc_val_lsb =0, i;
3094*53ee8cc1Swenshuai.xi     MS_U8   ssi_tbl_len = 0, err_tbl_len = 0;
3095*53ee8cc1Swenshuai.xi 
3096*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_Select_Demod_RIU(devID, u8DemodIndex);
3097*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 5);
3098*53ee8cc1Swenshuai.xi     if (pIfagcSsi_LoRef !=NULL)
3099*53ee8cc1Swenshuai.xi     {
3100*53ee8cc1Swenshuai.xi 	ch_power_rf = fRFPowerDbm;
3101*53ee8cc1Swenshuai.xi 	// get IFAGC status
3102*53ee8cc1Swenshuai.xi         {
3103*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
3104*53ee8cc1Swenshuai.xi             printf("AGC_REF = %d\n", (MS_U16)reg_tmp);
3105*53ee8cc1Swenshuai.xi             #endif
3106*53ee8cc1Swenshuai.xi 
3107*53ee8cc1Swenshuai.xi 		  ifagc_ssi = pIfagcSsi_LoRef;
3108*53ee8cc1Swenshuai.xi                 ssi_tbl_len = u16IfagcSsi_LoRef_Size;
3109*53ee8cc1Swenshuai.xi                 ifagc_err = pIfagcErr_LoRef;
3110*53ee8cc1Swenshuai.xi                 err_tbl_len = u16IfagcErr_LoRef_Size;
3111*53ee8cc1Swenshuai.xi 
3112*53ee8cc1Swenshuai.xi             // bank 5 0x24 [15:0] reg_agc_gain2_out
3113*53ee8cc1Swenshuai.xi             // use only high byte value
3114*53ee8cc1Swenshuai.xi 
3115*53ee8cc1Swenshuai.xi             // select IF gain to read
3116*53ee8cc1Swenshuai.xi             status &= _MDrv_DMD_MSB201X_SetReg(devID, TDF_REG_BASE + 0x16, 0x03);
3117*53ee8cc1Swenshuai.xi             status &= _MDrv_DMD_MSB201X_GetReg(devID, TDF_REG_BASE + 0x03, &reg_frz);
3118*53ee8cc1Swenshuai.xi             status &= _MDrv_DMD_MSB201X_SetReg(devID, TDF_REG_BASE + 0x03, reg_frz | 0x80);
3119*53ee8cc1Swenshuai.xi             status &= _MDrv_DMD_MSB201X_GetReg(devID, TDF_REG_BASE + 0x19, &reg_tmp);
3120*53ee8cc1Swenshuai.xi             if_agc_val = reg_tmp;
3121*53ee8cc1Swenshuai.xi             status &= _MDrv_DMD_MSB201X_GetReg(devID, TDF_REG_BASE + 0x18, &reg_tmp);
3122*53ee8cc1Swenshuai.xi             if_agc_val_lsb = reg_tmp;
3123*53ee8cc1Swenshuai.xi             status &= _MDrv_DMD_MSB201X_SetReg(devID, TDF_REG_BASE + 0x03, reg_frz);
3124*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
3125*53ee8cc1Swenshuai.xi             printf("SSI_IFAGC_H = 0x%x 0x%x\n", if_agc_val,if_agc_val_lsb);
3126*53ee8cc1Swenshuai.xi             #endif
3127*53ee8cc1Swenshuai.xi 
3128*53ee8cc1Swenshuai.xi             ch_power_if=ifagc_ssi[0].power_db;
3129*53ee8cc1Swenshuai.xi             if (if_agc_val >=ifagc_ssi[0].agc_val)
3130*53ee8cc1Swenshuai.xi             {
3131*53ee8cc1Swenshuai.xi                 for(i = 1; i < ssi_tbl_len; i++)
3132*53ee8cc1Swenshuai.xi                 {
3133*53ee8cc1Swenshuai.xi                     if (if_agc_val < ifagc_ssi[i].agc_val)
3134*53ee8cc1Swenshuai.xi                     {
3135*53ee8cc1Swenshuai.xi                         if_agc_valb = ifagc_ssi[i].agc_val;
3136*53ee8cc1Swenshuai.xi                         ch_power_ifb = ifagc_ssi[i].power_db;
3137*53ee8cc1Swenshuai.xi 
3138*53ee8cc1Swenshuai.xi                         i--;
3139*53ee8cc1Swenshuai.xi                         if_agc_vala = ifagc_ssi[i].agc_val;
3140*53ee8cc1Swenshuai.xi                         ch_power_ifa=ifagc_ssi[i].power_db;
3141*53ee8cc1Swenshuai.xi                         while ((i>1) && (if_agc_vala==ifagc_ssi[i-1].agc_val))
3142*53ee8cc1Swenshuai.xi                         {
3143*53ee8cc1Swenshuai.xi                             ch_power_ifa=ifagc_ssi[i-1].power_db;
3144*53ee8cc1Swenshuai.xi                             i--;
3145*53ee8cc1Swenshuai.xi                         }
3146*53ee8cc1Swenshuai.xi                         ch_power_if = ch_power_ifa+(ch_power_ifb-ch_power_ifa)*(float)((if_agc_val-if_agc_vala)*256+if_agc_val_lsb)/((if_agc_valb-if_agc_vala)*256);
3147*53ee8cc1Swenshuai.xi                         break;
3148*53ee8cc1Swenshuai.xi                     }
3149*53ee8cc1Swenshuai.xi                 }
3150*53ee8cc1Swenshuai.xi             }
3151*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
3152*53ee8cc1Swenshuai.xi             printf("if prev %f %x\n", ch_power_ifa, if_agc_vala);
3153*53ee8cc1Swenshuai.xi             printf("if next %f %x\n", ch_power_ifb, if_agc_valb);
3154*53ee8cc1Swenshuai.xi             #endif
3155*53ee8cc1Swenshuai.xi 
3156*53ee8cc1Swenshuai.xi             for(i = 0; i < ssi_tbl_len; i++)
3157*53ee8cc1Swenshuai.xi             {
3158*53ee8cc1Swenshuai.xi                 if (ifagc_ssi[i].agc_val <= ifagc_ssi[i+1].agc_val)
3159*53ee8cc1Swenshuai.xi                 {
3160*53ee8cc1Swenshuai.xi                     ch_power_takeover = ifagc_ssi[i+1].power_db;
3161*53ee8cc1Swenshuai.xi                     break;
3162*53ee8cc1Swenshuai.xi                 }
3163*53ee8cc1Swenshuai.xi             }
3164*53ee8cc1Swenshuai.xi 
3165*53ee8cc1Swenshuai.xi 	     // Only use IFAGC
3166*53ee8cc1Swenshuai.xi 	     if(fRFPowerDbm >= 200.0)
3167*53ee8cc1Swenshuai.xi 	     {
3168*53ee8cc1Swenshuai.xi 		 	ch_power_takeover = 100.0;
3169*53ee8cc1Swenshuai.xi 	     }
3170*53ee8cc1Swenshuai.xi 
3171*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
3172*53ee8cc1Swenshuai.xi             printf("ch_power_rf = %f\n", ch_power_rf);
3173*53ee8cc1Swenshuai.xi             printf("ch_power_if = %f\n", ch_power_if);
3174*53ee8cc1Swenshuai.xi             printf("ch_power_takeover = %f\n", ch_power_takeover);
3175*53ee8cc1Swenshuai.xi             #endif
3176*53ee8cc1Swenshuai.xi 
3177*53ee8cc1Swenshuai.xi             // ch_power_db = (ch_power_rf > ch_power_if)? ch_power_rf : ch_power_if;
3178*53ee8cc1Swenshuai.xi 
3179*53ee8cc1Swenshuai.xi             if(ch_power_rf > (ch_power_takeover + 0.5))
3180*53ee8cc1Swenshuai.xi             {
3181*53ee8cc1Swenshuai.xi                 ch_power_db = ch_power_rf;
3182*53ee8cc1Swenshuai.xi             }
3183*53ee8cc1Swenshuai.xi             else if(ch_power_if < (ch_power_takeover - 0.5))
3184*53ee8cc1Swenshuai.xi             {
3185*53ee8cc1Swenshuai.xi                 ch_power_db = ch_power_if;
3186*53ee8cc1Swenshuai.xi             }
3187*53ee8cc1Swenshuai.xi             else
3188*53ee8cc1Swenshuai.xi             {
3189*53ee8cc1Swenshuai.xi                 ch_power_db = (ch_power_if + ch_power_rf)/2;
3190*53ee8cc1Swenshuai.xi             }
3191*53ee8cc1Swenshuai.xi 
3192*53ee8cc1Swenshuai.xi             // ch_power_db = (ch_power_rf > ch_power_if)? ch_power_if : ch_power_rf;
3193*53ee8cc1Swenshuai.xi 
3194*53ee8cc1Swenshuai.xi             ///////// IF-AGC Error for Add. Attnuation /////////////
3195*53ee8cc1Swenshuai.xi             if(if_agc_val == 0xff)
3196*53ee8cc1Swenshuai.xi             {
3197*53ee8cc1Swenshuai.xi #if 0
3198*53ee8cc1Swenshuai.xi #if ( CHIP_FAMILY_TYPE == CHIP_FAMILY_S7LD )
3199*53ee8cc1Swenshuai.xi                 status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDP_REG_BASE + 0x22, &reg_tmp);
3200*53ee8cc1Swenshuai.xi                 status &= MDrv_SYS_DMD_VD_MBX_WriteReg(TDP_REG_BASE + 0x22, (reg_tmp&0xf0));
3201*53ee8cc1Swenshuai.xi #endif
3202*53ee8cc1Swenshuai.xi #endif
3203*53ee8cc1Swenshuai.xi                 // bank 5 0x04 [15] reg_tdp_lat
3204*53ee8cc1Swenshuai.xi                 status &= _MDrv_DMD_MSB201X_SetReg(devID, TDF_REG_BASE + 0x16, 0x00);
3205*53ee8cc1Swenshuai.xi                 status &= _MDrv_DMD_MSB201X_GetReg(devID, TDF_REG_BASE + 0x03, &reg_frz);
3206*53ee8cc1Swenshuai.xi                 status &= _MDrv_DMD_MSB201X_SetReg(devID, TDF_REG_BASE + 0x03, reg_frz | 0x80);
3207*53ee8cc1Swenshuai.xi #if 0
3208*53ee8cc1Swenshuai.xi         //#if ( CHIP_FAMILY_TYPE == CHIP_FAMILY_S7LD )
3209*53ee8cc1Swenshuai.xi                         // bank 5 0x2c [9:0] reg_agc_error
3210*53ee8cc1Swenshuai.xi                         status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDP_REG_BASE + 0x25, &reg_tmp);
3211*53ee8cc1Swenshuai.xi                         // if_agc_err = reg_tmp & 0x03;
3212*53ee8cc1Swenshuai.xi                         status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDP_REG_BASE + 0x24, &reg_tmp2);
3213*53ee8cc1Swenshuai.xi                         // if_agc_err = (if_agc_err << 6)|(reg_tmp >> 2);
3214*53ee8cc1Swenshuai.xi         //#else
3215*53ee8cc1Swenshuai.xi #endif
3216*53ee8cc1Swenshuai.xi                 // bank 5 0x2c [9:0] reg_agc_error
3217*53ee8cc1Swenshuai.xi                 status &= _MDrv_DMD_MSB201X_GetReg(devID, TDF_REG_BASE + 0x19, &reg_tmp);
3218*53ee8cc1Swenshuai.xi                 // if_agc_err = reg_tmp & 0x03;
3219*53ee8cc1Swenshuai.xi                 status &= _MDrv_DMD_MSB201X_GetReg(devID, TDF_REG_BASE + 0x18, &reg_tmp2);
3220*53ee8cc1Swenshuai.xi                 // if_agc_err = (if_agc_err << 6)|(reg_tmp >> 2);
3221*53ee8cc1Swenshuai.xi         //#endif
3222*53ee8cc1Swenshuai.xi 
3223*53ee8cc1Swenshuai.xi                 if(reg_tmp&0x2)
3224*53ee8cc1Swenshuai.xi                 {
3225*53ee8cc1Swenshuai.xi                     if_agc_err = ((((~reg_tmp)&0x03)<<8)|((~reg_tmp2)&0xff)) + 1;
3226*53ee8cc1Swenshuai.xi                 }
3227*53ee8cc1Swenshuai.xi                 else
3228*53ee8cc1Swenshuai.xi                 {
3229*53ee8cc1Swenshuai.xi                     if_agc_err = reg_tmp<<8|reg_tmp2;
3230*53ee8cc1Swenshuai.xi                 }
3231*53ee8cc1Swenshuai.xi 
3232*53ee8cc1Swenshuai.xi                 // release latch
3233*53ee8cc1Swenshuai.xi                 status &= _MDrv_DMD_MSB201X_SetReg(devID, TDF_REG_BASE + 0x03, reg_frz);
3234*53ee8cc1Swenshuai.xi 
3235*53ee8cc1Swenshuai.xi                 for(i = 0; i < err_tbl_len; i++)
3236*53ee8cc1Swenshuai.xi                 {
3237*53ee8cc1Swenshuai.xi                     if ( if_agc_err <= ifagc_err[i].agc_err )        // signed char comparison
3238*53ee8cc1Swenshuai.xi                     {
3239*53ee8cc1Swenshuai.xi                         ch_power_db += ifagc_err[i].attn_db;
3240*53ee8cc1Swenshuai.xi                         break;
3241*53ee8cc1Swenshuai.xi                     }
3242*53ee8cc1Swenshuai.xi                 }
3243*53ee8cc1Swenshuai.xi                 #ifdef MS_DEBUG
3244*53ee8cc1Swenshuai.xi                 printf("if_agc_err = 0x%x\n", if_agc_err);
3245*53ee8cc1Swenshuai.xi                 #endif
3246*53ee8cc1Swenshuai.xi                 }
3247*53ee8cc1Swenshuai.xi 
3248*53ee8cc1Swenshuai.xi                 // BY 20110812 temporaily remove ch_power_db += SIGNAL_LEVEL_OFFSET;
3249*53ee8cc1Swenshuai.xi         }
3250*53ee8cc1Swenshuai.xi     }
3251*53ee8cc1Swenshuai.xi     else
3252*53ee8cc1Swenshuai.xi     {
3253*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
3254*53ee8cc1Swenshuai.xi         if (fRFPowerDbm>=100.0) // unreasonable input value, get RF level from RFAGG
3255*53ee8cc1Swenshuai.xi         {
3256*53ee8cc1Swenshuai.xi             printf("Error!! please add AGC table\n");
3257*53ee8cc1Swenshuai.xi         }
3258*53ee8cc1Swenshuai.xi         #endif
3259*53ee8cc1Swenshuai.xi         ch_power_db = fRFPowerDbm;
3260*53ee8cc1Swenshuai.xi     }
3261*53ee8cc1Swenshuai.xi     *fRFPowerDbmResult=ch_power_db;
3262*53ee8cc1Swenshuai.xi     return status;
3263*53ee8cc1Swenshuai.xi }
3264*53ee8cc1Swenshuai.xi 
3265*53ee8cc1Swenshuai.xi //MS_BOOL MDrv_DMD_MSB201X_SPI_Pre_Setting(MS_U8 devID, sDMD_MSB201X_InitData *pDMD_MSB201X_InitData)
MDrv_DMD_MSB201X_SPI_Pre_Setting(MS_U8 devID)3266*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_SPI_Pre_Setting(MS_U8 devID)
3267*53ee8cc1Swenshuai.xi {
3268*53ee8cc1Swenshuai.xi //	tMSB201X_Demod_Data *pDemod;
3269*53ee8cc1Swenshuai.xi 	MS_U8 i;
3270*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pMSB201X = NULL;
3271*53ee8cc1Swenshuai.xi     {
3272*53ee8cc1Swenshuai.xi         pstDemod = (tMSB201X_Demod_Data *)malloc(sizeof(tMSB201X_Demod_Data) * DEMOD_MAX_INSTANCE);
3273*53ee8cc1Swenshuai.xi         if(NULL == pstDemod)
3274*53ee8cc1Swenshuai.xi         {
3275*53ee8cc1Swenshuai.xi             return FALSE;
3276*53ee8cc1Swenshuai.xi         }
3277*53ee8cc1Swenshuai.xi         else
3278*53ee8cc1Swenshuai.xi         {
3279*53ee8cc1Swenshuai.xi             for(i=0; i< DEMOD_MAX_INSTANCE; i++)
3280*53ee8cc1Swenshuai.xi             {
3281*53ee8cc1Swenshuai.xi                 pMSB201X = (pstDemod + i);
3282*53ee8cc1Swenshuai.xi                 memcpy(pMSB201X, &MSB201X_Demod_Init, sizeof(tMSB201X_Demod_Data));
3283*53ee8cc1Swenshuai.xi             }
3284*53ee8cc1Swenshuai.xi         }
3285*53ee8cc1Swenshuai.xi     }
3286*53ee8cc1Swenshuai.xi 
3287*53ee8cc1Swenshuai.xi        pMSB201X = pstDemod + devID;
3288*53ee8cc1Swenshuai.xi        //pMSB201X->_sDMD_MSB201X_InitData.fpMSB201X_I2C_Access = pDMD_MSB201X_InitData->fpMSB201X_I2C_Access;
3289*53ee8cc1Swenshuai.xi        pMSB201X->DSP_ReadWrite_Mode = E_MSB201X_SPI_READ_WRITE;
3290*53ee8cc1Swenshuai.xi 
3291*53ee8cc1Swenshuai.xi //	   pDemod = DEMOD_GET_ACTIVE_NODE(devID);
3292*53ee8cc1Swenshuai.xi 
3293*53ee8cc1Swenshuai.xi //	   _MSB201X_I2C_CH_Reset(devID, 3);
3294*53ee8cc1Swenshuai.xi 
3295*53ee8cc1Swenshuai.xi       //pMSB201X->DSP_ReadWrite_Mode = E_MSB201X_SPI_READ_WRITE;  //for inseting the SPI and I2C mode
3296*53ee8cc1Swenshuai.xi 
3297*53ee8cc1Swenshuai.xi     // DMD HK init clk start
3298*53ee8cc1Swenshuai.xi // -------------------------------------------------------------------
3299*53ee8cc1Swenshuai.xi // Initialize DMD_ANA_MISC
3300*53ee8cc1Swenshuai.xi // -------------------------------------------------------------------
3301*53ee8cc1Swenshuai.xi 
3302*53ee8cc1Swenshuai.xi     // Koln add
3303*53ee8cc1Swenshuai.xi     // [0]	reg_pd_ldo25i_ana   // 2.5v LDO power down
3304*53ee8cc1Swenshuai.xi     // [1]	reg_pd_ldo25q_ana   // 2.5v LDO power down
3305*53ee8cc1Swenshuai.xi     // [2]	reg_pd_ldo25i_dig   // 2.5v LDO power down
3306*53ee8cc1Swenshuai.xi     // [3]	reg_pd_ldo25q_dig   // 2.5v LDO power down
3307*53ee8cc1Swenshuai.xi     // [4]	reg_pd_ldo25_ref    // 2.5v LDO power down
3308*53ee8cc1Swenshuai.xi     // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h53, 2'b01, 16'h0000);
3309*53ee8cc1Swenshuai.xi     //wreg 4106 0x53 0x0000
3310*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x53)*2  ,  0x00);
3311*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x53)*2+1,  0x00);
3312*53ee8cc1Swenshuai.xi 
3313*53ee8cc1Swenshuai.xi     // [0]	reg_tst_ldo25i
3314*53ee8cc1Swenshuai.xi     // [1]	reg_tst_ldo25q
3315*53ee8cc1Swenshuai.xi     // [5:4]	reg_tst_ldo25i_selfb
3316*53ee8cc1Swenshuai.xi     // [7:6]	reg_tst_ldo25q_selfb
3317*53ee8cc1Swenshuai.xi     // [8]	reg_pd_dm2p5ldoi = 1'b0
3318*53ee8cc1Swenshuai.xi     // [9]	reg_pd_dm2p5ldoq = 1'b0
3319*53ee8cc1Swenshuai.xi     // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h4f, 2'b11, 16'h0000);
3320*53ee8cc1Swenshuai.xi     // wreg 4106 0x4f 0x0000
3321*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x4f)*2  ,  0x00);
3322*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x4f)*2+1,  0x00);
3323*53ee8cc1Swenshuai.xi 
3324*53ee8cc1Swenshuai.xi     // [0]	reg_tst_ldo11_clk
3325*53ee8cc1Swenshuai.xi     // [1]	reg_tst_ldo26
3326*53ee8cc1Swenshuai.xi     // [2]	reg_tst_ldo11_cmp
3327*53ee8cc1Swenshuai.xi     // [3]	reg_pd_dm1p1ldo_clk = 1'b0
3328*53ee8cc1Swenshuai.xi     // [4]	reg_pd_dm1p1ldo_cmp = 1'b0
3329*53ee8cc1Swenshuai.xi     // [6]	reg_tst_ldo26_selfb
3330*53ee8cc1Swenshuai.xi     // [7]	reg_pd_dm2p6ldo = 1'b0
3331*53ee8cc1Swenshuai.xi     // [9:8]	reg_tst_ldo11_cmp_selfb
3332*53ee8cc1Swenshuai.xi     // [11:10]	reg_tst_ldo11_clk_selfb
3333*53ee8cc1Swenshuai.xi     // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h4e, 2'b11, 16'h0000);
3334*53ee8cc1Swenshuai.xi     //wreg 4106 0x4e 0x0000
3335*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x4e)*2  ,  0x00);
3336*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x4e)*2+1,  0x00);
3337*53ee8cc1Swenshuai.xi 
3338*53ee8cc1Swenshuai.xi 
3339*53ee8cc1Swenshuai.xi     // [1:0]	reg_mpll_loop_div_first       feedback divider 00:div by 1 01:div by 2 10:div by 4 11:div by 8
3340*53ee8cc1Swenshuai.xi     // [15:8]	reg_mpll_loop_div_second      feedback divider, div by binary data number
3341*53ee8cc1Swenshuai.xi     // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h33, 2'b11, 16'h1201);  // Loop divider ; VCO = 24*(2^2)*9 = 864
3342*53ee8cc1Swenshuai.xi //    wreg 4106 0x33 0x1201
3343*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x33)*2  ,  0x01);
3344*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x33)*2+1,  0x12);
3345*53ee8cc1Swenshuai.xi 
3346*53ee8cc1Swenshuai.xi     // [2:0]	reg_mpll_ictrl		    charge pump current control
3347*53ee8cc1Swenshuai.xi     // [3]	reg_mpll_in_sel		    1.8V or 3.3V reference clock domain select (1'b0=0==>3.3 V reference clock domain)
3348*53ee8cc1Swenshuai.xi     // [4]	reg_mpll_xtal2adc_sel	    select the XTAL clock bypass to MPLL_ADC_CLK
3349*53ee8cc1Swenshuai.xi     // [5]	reg_mpll_xtal2next_pll_sel  crystal clock bypass to next PLL select
3350*53ee8cc1Swenshuai.xi     // [6]	reg_mpll_vco_offset	    set VCO initial offset frequency
3351*53ee8cc1Swenshuai.xi     // [7]	reg_mpll_pd		    gated reference clock and power down PLL analog_3v: 1=power down
3352*53ee8cc1Swenshuai.xi     // [8]	reg_xtal_en		    XTAL enable register; 1: enable
3353*53ee8cc1Swenshuai.xi     // [10:9]	reg_xtal_sel		    XTAL driven strength select.
3354*53ee8cc1Swenshuai.xi     // [11]  	reg_mpll_porst		    MPLL input  power on reset, connect to reg as MPLL_RESET
3355*53ee8cc1Swenshuai.xi     // [12]  	reg_mpll_reset		    PLL software reset; 1:reset
3356*53ee8cc1Swenshuai.xi     // [13]  	reg_pd_dmpll_clk	    XTAL to MPLL clock reference power down
3357*53ee8cc1Swenshuai.xi     // [14]  	reg_pd_3p3_1		    XTAL to CLK_24M_3P3_1 power down
3358*53ee8cc1Swenshuai.xi     // [15]  	reg_pd_3p3_2		    XTAL to CLK_24M_3P3_2 power down
3359*53ee8cc1Swenshuai.xi     // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h35, 2'b11, 16'h1803); // MPLL reset
3360*53ee8cc1Swenshuai.xi     //wreg 4106 0x35 0x1803
3361*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x35)*2  ,  0x03);
3362*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x35)*2+1,  0x18);
3363*53ee8cc1Swenshuai.xi 
3364*53ee8cc1Swenshuai.xi     // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h35, 2'b11, 16'h0003); // release MPLl reset
3365*53ee8cc1Swenshuai.xi     //wreg 4106 0x35 0x0003
3366*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x35)*2  ,  0x03);
3367*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x35)*2+1,  0x00);
3368*53ee8cc1Swenshuai.xi 
3369*53ee8cc1Swenshuai.xi     // [0]	reg_mpll_clk_dp_pd	dummy
3370*53ee8cc1Swenshuai.xi     // [1]	reg_adc_clk_pd		ADC output clock power down
3371*53ee8cc1Swenshuai.xi     // [2]	reg_mpll_div2_pd	MPLL_DIV2 power down
3372*53ee8cc1Swenshuai.xi     // [3]	reg_mpll_div3_pd	MPLL_DIV3 power down
3373*53ee8cc1Swenshuai.xi     // [4]	reg_mpll_div4_pd	MPLL_DIV4 power down
3374*53ee8cc1Swenshuai.xi     // [5]	reg_mpll_div8_pd	MPLL_DIV8 power down
3375*53ee8cc1Swenshuai.xi     // [6]	reg_mpll_div10_pd	MPLL_DIV10 power down
3376*53ee8cc1Swenshuai.xi     // [13:8]  reg_mpll_adc_div_sel	select the ADC clock divide ratio,ADC clk=XTAL_IN
3377*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h30, 2'b11, 16'h1e00);  // divide ADC clock to 28.8Mhz = 24*36/30
3378*53ee8cc1Swenshuai.xi       //wreg 4106 0x30 0x1e00
3379*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x30)*2  ,  0x00);
3380*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x30)*2+1,  0x1e);
3381*53ee8cc1Swenshuai.xi 
3382*53ee8cc1Swenshuai.xi 
3383*53ee8cc1Swenshuai.xi     //$display("--------------------------------------");
3384*53ee8cc1Swenshuai.xi     //$display("Initialize ADC I/Q");
3385*53ee8cc1Swenshuai.xi     //$display("--------------------------------------");
3386*53ee8cc1Swenshuai.xi 
3387*53ee8cc1Swenshuai.xi     // [0]	Q channel ADC power down
3388*53ee8cc1Swenshuai.xi     // [1]	I channel ADC power down
3389*53ee8cc1Swenshuai.xi     // [2]	Q channel clamp enable. 0:enable, 1:disable
3390*53ee8cc1Swenshuai.xi     // [3]	I channel clamp enable. 0:enable, 1:disable
3391*53ee8cc1Swenshuai.xi     // [6:4]    I channel input mux control;
3392*53ee8cc1Swenshuai.xi     //		3'b000=I channel ADC calibration mode input
3393*53ee8cc1Swenshuai.xi     //	    	3'b001=VIF signal from VIFPGA
3394*53ee8cc1Swenshuai.xi     //	    	3'b100=DVB or ATSC mode input from PAD_I(Q)P(M)
3395*53ee8cc1Swenshuai.xi     //	    	all the other combination are only for test mode, don't use without understanding.
3396*53ee8cc1Swenshuai.xi     // [10:8]   Q channel input mux control;
3397*53ee8cc1Swenshuai.xi     //		3'b000=Q channel ADC calibration mode input
3398*53ee8cc1Swenshuai.xi     //	    	3'b001=VIF signal from VIFPGA 3'b010 = SSIF signal from PAD_SIFP(M)
3399*53ee8cc1Swenshuai.xi     //	    	3'b100=DVB or ATSC mode input from PAD_I(Q)P(M)
3400*53ee8cc1Swenshuai.xi     //	    	all the other combination are only for test mode, don't use without understanding.
3401*53ee8cc1Swenshuai.xi     // [12]	ADC I,Q swap enable; 1: swap
3402*53ee8cc1Swenshuai.xi     // [13]	ADC clock out select; 1: ADC_CLKQ
3403*53ee8cc1Swenshuai.xi     // [14]	ADC linear calibration bypass enable; 1:enable
3404*53ee8cc1Swenshuai.xi     // [15]	ADC internal 1.2v regulator control always 0 in T3
3405*53ee8cc1Swenshuai.xi         // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h01, 2'b11, 16'h0440); // Set IMUXS QMUXS
3406*53ee8cc1Swenshuai.xi         //wreg 4106 0x01 0x0440
3407*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x01)*2  ,  0x40);
3408*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x01)*2+1,  0x04);
3409*53ee8cc1Swenshuai.xi 
3410*53ee8cc1Swenshuai.xi     // [2:0]	reg_imuxs_s
3411*53ee8cc1Swenshuai.xi     // [6:4]	reg_qmuxs_s
3412*53ee8cc1Swenshuai.xi     // [9:8]	reg_iclpstr_s
3413*53ee8cc1Swenshuai.xi     // [13:12]	reg_qclpstr_s
3414*53ee8cc1Swenshuai.xi         // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h45, 2'b01, 16'h0000); // Set IMUXS QMUXS
3415*53ee8cc1Swenshuai.xi         //wreg 4106 0x45 0x0000
3416*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x45)*2  ,  0x00);
3417*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x45)*2+1,  0x00);
3418*53ee8cc1Swenshuai.xi 
3419*53ee8cc1Swenshuai.xi 
3420*53ee8cc1Swenshuai.xi     // [0]	Channel I ADC power down: 1=power dwon
3421*53ee8cc1Swenshuai.xi     // [1]	Channel Q ADC power down: 1=power dwon
3422*53ee8cc1Swenshuai.xi     // [2]	power down clamp buffer for test mode
3423*53ee8cc1Swenshuai.xi     // [3]	change ADC reference voltage for SSIF
3424*53ee8cc1Swenshuai.xi     // [6:4]    ADC source bias current control
3425*53ee8cc1Swenshuai.xi     // [9:8]    XTAL receiver amp gain
3426*53ee8cc1Swenshuai.xi         // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h0c, 2'b11, 16'h0000); // Set enable ADC clock
3427*53ee8cc1Swenshuai.xi     //    wreg 4106 0x0c 0x0000
3428*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x0c)*2  ,  0x00);
3429*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x0c)*2+1,  0x00);
3430*53ee8cc1Swenshuai.xi 
3431*53ee8cc1Swenshuai.xi 
3432*53ee8cc1Swenshuai.xi     // [0]	reg_linear_cal_start_q	0	0	1
3433*53ee8cc1Swenshuai.xi     // [1]	reg_linear_cal_mode_q	0	0	1
3434*53ee8cc1Swenshuai.xi     // [2]	reg_linear_cal_en_q	0	0	1
3435*53ee8cc1Swenshuai.xi     // [3]	reg_linear_cal_code0_oren_q	0	0	1
3436*53ee8cc1Swenshuai.xi     // [6:4]	reg_linear_cal_status_sel_q	2	0	3
3437*53ee8cc1Swenshuai.xi     // [7]	reg_pwdn_vcalbuf	0	0	1
3438*53ee8cc1Swenshuai.xi 
3439*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h0f, 2'b01, 16'h0000); // Set reg_pwdn_vcalbuf = 1'b0
3440*53ee8cc1Swenshuai.xi  //     wreg 4106 0x0f 0x0000
3441*53ee8cc1Swenshuai.xi  	   _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x0f)*2  ,  0x00);
3442*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x0f)*2+1,  0x00);
3443*53ee8cc1Swenshuai.xi 
3444*53ee8cc1Swenshuai.xi 
3445*53ee8cc1Swenshuai.xi     // [3:0]	clamp voltage control
3446*53ee8cc1Swenshuai.xi     //          3'b000 = 0.7v
3447*53ee8cc1Swenshuai.xi     //          3'b001 = 0.75v
3448*53ee8cc1Swenshuai.xi     //          3'b010 = 0.5v
3449*53ee8cc1Swenshuai.xi     //          3'b011 = 0.4v
3450*53ee8cc1Swenshuai.xi     //          3'b100 = 0.8v
3451*53ee8cc1Swenshuai.xi     //          3'b101 = 0.9v
3452*53ee8cc1Swenshuai.xi     //          3'b110 = 0.65v
3453*53ee8cc1Swenshuai.xi     //          3'b111 = 0.60v
3454*53ee8cc1Swenshuai.xi     // [4]	REFERENCE power down
3455*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h20, 2'b11, 16'h0000); // Disable PWDN_REF
3456*53ee8cc1Swenshuai.xi       //wreg 4106 0x20 0x0000
3457*53ee8cc1Swenshuai.xi  	   _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x20)*2  ,  0x00);
3458*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x20)*2+1,  0x00);
3459*53ee8cc1Swenshuai.xi     // Set ADC gain is 1
3460*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h0b, 2'b11, 16'h0505);
3461*53ee8cc1Swenshuai.xi       //wreg 4106 0x0b 0x0505
3462*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x0b)*2  ,  0x05);
3463*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x0b)*2+1,  0x05);
3464*53ee8cc1Swenshuai.xi 
3465*53ee8cc1Swenshuai.xi     // Disable ADC Sign bit
3466*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h2e, 2'b11, 16'h0000);
3467*53ee8cc1Swenshuai.xi       //wreg 4106 0x2e 0x0000
3468*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x2e)*2  ,  0x00);
3469*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x2e)*2+1,  0x00);
3470*53ee8cc1Swenshuai.xi 
3471*53ee8cc1Swenshuai.xi     // ADC I channel offset
3472*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h2a, 2'b11, 16'h0c00);
3473*53ee8cc1Swenshuai.xi       //wreg 4106 0x2a 0x0c00
3474*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x2a)*2  ,  0x00);
3475*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x2a)*2+1,  0x0c);
3476*53ee8cc1Swenshuai.xi 
3477*53ee8cc1Swenshuai.xi     // ADC Q channel offset
3478*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h2b, 2'b11, 16'h0c00);
3479*53ee8cc1Swenshuai.xi       //wreg 4106 0x2b 0x0c00
3480*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x2b)*2  ,  0x00);
3481*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100A00 + (0x2b)*2+1,  0x0c);
3482*53ee8cc1Swenshuai.xi 
3483*53ee8cc1Swenshuai.xi 
3484*53ee8cc1Swenshuai.xi         // [5:0]reg_ckg_mcu
3485*53ee8cc1Swenshuai.xi         // [6]	reg_power_good_mask
3486*53ee8cc1Swenshuai.xi         // [11:8]reg_ckg_inner
3487*53ee8cc1Swenshuai.xi 	// [15:12]reg_ckg_iicm1
3488*53ee8cc1Swenshuai.xi     	// `RIU_W((`RIUBASE_TOP>>1)+7'h0b, 2'b11, 16'h0430);
3489*53ee8cc1Swenshuai.xi     	//wreg 4105 0x0b 0x0030
3490*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x2b)*2  ,  0x30);
3491*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x2b)*2+1,  0x00);
3492*53ee8cc1Swenshuai.xi 
3493*53ee8cc1Swenshuai.xi 
3494*53ee8cc1Swenshuai.xi         // [1:0]reg_chanout_sel
3495*53ee8cc1Swenshuai.xi         // [2]	reg_iq_filter_enable	= 1
3496*53ee8cc1Swenshuai.xi         // [3]	reg_iq_filter_sel
3497*53ee8cc1Swenshuai.xi         // [5:4]reg_adc_debug_clk_sel
3498*53ee8cc1Swenshuai.xi     	// `RIU_W((`RIUBASE_ADCPLL>>1)+7'h17, 2'b11, 16'h0004);
3499*53ee8cc1Swenshuai.xi     	//wreg 4106 0x17 0x0004
3500*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x17)*2  ,  0x04);
3501*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x17)*2+1,  0x00);
3502*53ee8cc1Swenshuai.xi 
3503*53ee8cc1Swenshuai.xi 
3504*53ee8cc1Swenshuai.xi 
3505*53ee8cc1Swenshuai.xi     // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h51, 2'b01, 16'h0081); // 2 channel DVBC
3506*53ee8cc1Swenshuai.xi     //wreg 4106 0x51 0x0081
3507*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x51)*2  ,  0x81);
3508*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x51)*2+1,  0x00);
3509*53ee8cc1Swenshuai.xi 
3510*53ee8cc1Swenshuai.xi 
3511*53ee8cc1Swenshuai.xi // -------------------------------------------------------------------
3512*53ee8cc1Swenshuai.xi // Release clock gating
3513*53ee8cc1Swenshuai.xi // -------------------------------------------------------------------
3514*53ee8cc1Swenshuai.xi     //$display("--------------------------------------");
3515*53ee8cc1Swenshuai.xi     //$display("Release clock gating");
3516*53ee8cc1Swenshuai.xi     //$display("--------------------------------------");
3517*53ee8cc1Swenshuai.xi 
3518*53ee8cc1Swenshuai.xi     // [0]	reg_xtal_en
3519*53ee8cc1Swenshuai.xi     // [9:8]	reg_clk_pd_iic
3520*53ee8cc1Swenshuai.xi     // [10]	reg_clk_pd_all
3521*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h09, 2'b11, 16'h0101);
3522*53ee8cc1Swenshuai.xi       //wreg 4105 0x09 0x0101
3523*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x09)*2  ,  0x01);
3524*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x09)*2+1,  0x01);
3525*53ee8cc1Swenshuai.xi 
3526*53ee8cc1Swenshuai.xi     // [3:0]	reg_ckg_adcd
3527*53ee8cc1Swenshuai.xi     // [7:4]	reg_ckg_sadc
3528*53ee8cc1Swenshuai.xi     // [11:8]	reg_ckg_iicm
3529*53ee8cc1Swenshuai.xi     // [13:12]	reg_ckg_sbus
3530*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h0a, 2'b11, 16'h0000);
3531*53ee8cc1Swenshuai.xi       //wreg 4105 0x0a 0x0000
3532*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x0a)*2  ,  0x00);
3533*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x0a)*2+1,  0x00);
3534*53ee8cc1Swenshuai.xi 
3535*53ee8cc1Swenshuai.xi     // [5:0]	reg_ckg_mcu
3536*53ee8cc1Swenshuai.xi     // [6]	reg_ckg_live
3537*53ee8cc1Swenshuai.xi     // [11:8]	reg_ckg_inner
3538*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h0b, 2'b11, 16'h0030);
3539*53ee8cc1Swenshuai.xi //      wreg 4105 0x0b 0x0030
3540*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x0b)*2  ,  0x00);
3541*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x0b)*2+1,  0x00);
3542*53ee8cc1Swenshuai.xi 
3543*53ee8cc1Swenshuai.xi 
3544*53ee8cc1Swenshuai.xi     // @0x0912
3545*53ee8cc1Swenshuai.xi     // [3:0]	reg_ckg_dvbtm_ts
3546*53ee8cc1Swenshuai.xi     // [4]	reg_dvbtm_ts_out_mode
3547*53ee8cc1Swenshuai.xi     // [5]	reg_dvbtm_ts_clk_pol
3548*53ee8cc1Swenshuai.xi     // [15:8]	reg_dvbtm_ts_clk_divnum
3549*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h12, 2'b11, 16'h1418);
3550*53ee8cc1Swenshuai.xi       //wreg 4105 0x12 0x1418
3551*53ee8cc1Swenshuai.xi      //_MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2  ,  0x18);
3552*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2  ,  0x10);
3553*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x12)*2+1,  0x14);
3554*53ee8cc1Swenshuai.xi 
3555*53ee8cc1Swenshuai.xi     // @0x0913
3556*53ee8cc1Swenshuai.xi     // [5:0]	reg_ckg_spi
3557*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h13, 2'b11, 16'h0020);
3558*53ee8cc1Swenshuai.xi       //wreg 4105 0x13 0x0020
3559*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x13)*2  ,  0x20);
3560*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x13)*2+1,  0x00);
3561*53ee8cc1Swenshuai.xi 
3562*53ee8cc1Swenshuai.xi 
3563*53ee8cc1Swenshuai.xi     // @0x091b
3564*53ee8cc1Swenshuai.xi     // [10:8]	reg_ckg_syn_miu
3565*53ee8cc1Swenshuai.xi     // [14:12]	reg_ckg_syn_ts
3566*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h1b, 2'b11, 16'h0000);
3567*53ee8cc1Swenshuai.xi //      wreg 4105 0x1b 0x0000
3568*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x1b)*2  ,  0x00);
3569*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x1b)*2+1,  0x00);
3570*53ee8cc1Swenshuai.xi 
3571*53ee8cc1Swenshuai.xi 
3572*53ee8cc1Swenshuai.xi 
3573*53ee8cc1Swenshuai.xi     // @0x091c
3574*53ee8cc1Swenshuai.xi     // [4:0]	reg_ckg_bist
3575*53ee8cc1Swenshuai.xi     // [11:8]	reg_ckg_adcd_d2
3576*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h1c, 2'b11, 16'h0000);
3577*53ee8cc1Swenshuai.xi       //wreg 4105 0x1c 0x0000
3578*53ee8cc1Swenshuai.xi 
3579*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x1c)*2  ,  0x00);
3580*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x1c)*2+1,  0x00);
3581*53ee8cc1Swenshuai.xi 
3582*53ee8cc1Swenshuai.xi 
3583*53ee8cc1Swenshuai.xi     // [1:0]	reg_iicm_pad_sel
3584*53ee8cc1Swenshuai.xi     // [4]	reg_i2c_sbpm_en
3585*53ee8cc1Swenshuai.xi     // [12:8]	reg_i2c_sbpm_idle_num
3586*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h08, 2'b01, 16'h0a01);
3587*53ee8cc1Swenshuai.xi       //wreg 4105 0x08 0x0a01
3588*53ee8cc1Swenshuai.xi 
3589*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x08)*2  ,  0x01);
3590*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x08)*2+1,  0x0a);
3591*53ee8cc1Swenshuai.xi 
3592*53ee8cc1Swenshuai.xi     // [8]	reg_turn_off_pad
3593*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h28, 2'b10, 16'h0000);
3594*53ee8cc1Swenshuai.xi      // wreg 4105 0x28 0x0000
3595*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x28)*2  ,  0x00);
3596*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x28)*2+1,  0x00);
3597*53ee8cc1Swenshuai.xi 
3598*53ee8cc1Swenshuai.xi 
3599*53ee8cc1Swenshuai.xi 
3600*53ee8cc1Swenshuai.xi 
3601*53ee8cc1Swenshuai.xi     //$display("--------------------------------------");
3602*53ee8cc1Swenshuai.xi     //$display("Initialize Transport Stream synthesizer and APLL");
3603*53ee8cc1Swenshuai.xi     //$display("--------------------------------------");
3604*53ee8cc1Swenshuai.xi 
3605*53ee8cc1Swenshuai.xi     // ////////////////////////////////////////////////////
3606*53ee8cc1Swenshuai.xi     //
3607*53ee8cc1Swenshuai.xi     //	According to analog APLL designer's suggest:
3608*53ee8cc1Swenshuai.xi     //	APLL_LOOP_DIV = 5'b00000
3609*53ee8cc1Swenshuai.xi     //	apll input frequency range 54MHz~106MHz synthesizer clock
3610*53ee8cc1Swenshuai.xi     //	so apll_1x_out = synthesizer_out * (apll_ts_mode + 1)
3611*53ee8cc1Swenshuai.xi     //
3612*53ee8cc1Swenshuai.xi     //	=> apll_1x_out should 40Mhz ~ 130Mhz
3613*53ee8cc1Swenshuai.xi     //
3614*53ee8cc1Swenshuai.xi     //	Current setting:
3615*53ee8cc1Swenshuai.xi     //	apll_1x_out = (432/8.0) * (1+1) = 108MHz
3616*53ee8cc1Swenshuai.xi     //	choose reg_ckg_ts_apll_div[2:0] = 3'd4
3617*53ee8cc1Swenshuai.xi     //	ts_clk_apll_div = 108/(2^4) = 6.75MHz
3618*53ee8cc1Swenshuai.xi     //
3619*53ee8cc1Swenshuai.xi     // ////////////////////////////////////////////////////
3620*53ee8cc1Swenshuai.xi 
3621*53ee8cc1Swenshuai.xi 
3622*53ee8cc1Swenshuai.xi     // [15:0]	reg_synth_set[15: 0]
3623*53ee8cc1Swenshuai.xi     // [ 7:0]	reg_synth_set[23:16]
3624*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h51, 2'b11, 16'h0000);
3625*53ee8cc1Swenshuai.xi       //wreg 4105 0x51 0x0000
3626*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x51)*2  ,  0x00);
3627*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x51)*2+1,  0x00);
3628*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h52, 2'b11, 16'h0040);
3629*53ee8cc1Swenshuai.xi       //wreg 4105 0x52 0x0040
3630*53ee8cc1Swenshuai.xi 		 _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x52)*2  ,  0x40);
3631*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x52)*2+1,  0x00);
3632*53ee8cc1Swenshuai.xi 
3633*53ee8cc1Swenshuai.xi 
3634*53ee8cc1Swenshuai.xi     // [0]	reg_synth_reset
3635*53ee8cc1Swenshuai.xi     // [1]	reg_synth_ssc_en
3636*53ee8cc1Swenshuai.xi     // [2]	reg_synth_ssc_mode
3637*53ee8cc1Swenshuai.xi     // [4]	reg_synth_sld
3638*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h50, 2'b01, 16'h0010);
3639*53ee8cc1Swenshuai.xi       //wreg 4105 0x50 0x0010
3640*53ee8cc1Swenshuai.xi 
3641*53ee8cc1Swenshuai.xi 		 _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x50)*2  ,  0x10);
3642*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x50)*2+1,  0x00);
3643*53ee8cc1Swenshuai.xi 
3644*53ee8cc1Swenshuai.xi     // #10_000;
3645*53ee8cc1Swenshuai.xi     //delay 0  ****
3646*53ee8cc1Swenshuai.xi 
3647*53ee8cc1Swenshuai.xi 
3648*53ee8cc1Swenshuai.xi     // [1:0]	reg_apll_loop_div_first
3649*53ee8cc1Swenshuai.xi     // [15:8]	reg_apll_loop_div_second
3650*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h57, 2'b11, 16'h0000);
3651*53ee8cc1Swenshuai.xi      //wreg 4105 0x57 0x0000
3652*53ee8cc1Swenshuai.xi 
3653*53ee8cc1Swenshuai.xi 		 _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x57)*2  ,  0x00);
3654*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x57)*2+1,  0x00);
3655*53ee8cc1Swenshuai.xi 
3656*53ee8cc1Swenshuai.xi 
3657*53ee8cc1Swenshuai.xi     // [0]	reg_apll_pd
3658*53ee8cc1Swenshuai.xi     // [1]	reg_apll_reset
3659*53ee8cc1Swenshuai.xi     // [2]	reg_apll_porst
3660*53ee8cc1Swenshuai.xi     // [3]	reg_apll_vco_offset
3661*53ee8cc1Swenshuai.xi     // [4]	reg_apll_en_ts
3662*53ee8cc1Swenshuai.xi     // [5]	reg_apll_endcc
3663*53ee8cc1Swenshuai.xi     // [6]	reg_apll_clkin_sel
3664*53ee8cc1Swenshuai.xi     // [8]	reg_apll_ts_mode
3665*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h55, 2'b11, 16'h0100);
3666*53ee8cc1Swenshuai.xi       //wreg 4105 0x55 0x0100
3667*53ee8cc1Swenshuai.xi 		 _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x55)*2  ,  0x00);
3668*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x55)*2+1,  0x01);
3669*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h55, 2'b01, 16'h0110);
3670*53ee8cc1Swenshuai.xi       //wreg 4105 0x55 0x0110
3671*53ee8cc1Swenshuai.xi 		 _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x55)*2  ,  0x10);
3672*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x55)*2+1,  0x01);
3673*53ee8cc1Swenshuai.xi 
3674*53ee8cc1Swenshuai.xi     // [16:0]	reg_apll_test
3675*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h59, 2'b11, 16'h0000);
3676*53ee8cc1Swenshuai.xi       //wreg 4105 0x59 0x0000
3677*53ee8cc1Swenshuai.xi 		 _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x59)*2  ,  0x00);
3678*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x59)*2+1,  0x00);
3679*53ee8cc1Swenshuai.xi 
3680*53ee8cc1Swenshuai.xi     // 0x0920
3681*53ee8cc1Swenshuai.xi     // [3:0]	reg_ckg_ts_apll_div[2:0]
3682*53ee8cc1Swenshuai.xi       // `RIU_W((`RIUBASE_TOP>>1)+7'h20, 2'b01, 16'h0004);
3683*53ee8cc1Swenshuai.xi       //wreg 4105 0x20 0x0004
3684*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x20)*2  ,  0x04);
3685*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x20)*2+1,  0x00);
3686*53ee8cc1Swenshuai.xi 
3687*53ee8cc1Swenshuai.xi 		//  Following register control by reg_CLKGEN1
3688*53ee8cc1Swenshuai.xi 		//        reg_ckg_atsc_dvb_div_sel,  (clkgen0)
3689*53ee8cc1Swenshuai.xi 		//        reg_ckg_atsc_dvbtc_ts_inv, (clkgen0)
3690*53ee8cc1Swenshuai.xi 		//        reg_ckg_atsc_ts,           (clkgen0)
3691*53ee8cc1Swenshuai.xi 		//	reg_ckg_demod_test_in_en,  (clkgen0, clkgen_dmd)
3692*53ee8cc1Swenshuai.xi 		//        reg_ckg_dmdmcu,            (clkgen0)
3693*53ee8cc1Swenshuai.xi 		//        reg_ckg_dvbtc_adc,         (clkgen0, clkgen_dmd)
3694*53ee8cc1Swenshuai.xi 		//	reg_ckg_dvbtc_ts,          (clkgen0)
3695*53ee8cc1Swenshuai.xi 		//        reg_ckg_dvbtm_ts_divnum,   (clkgen0)
3696*53ee8cc1Swenshuai.xi 		//        reg_ckg_dvbtm_ts_out_mode, (clkgen0)
3697*53ee8cc1Swenshuai.xi 		//  reg_ckg_vifdbb_dac,        (clkgen0, clkgen_dmd)
3698*53ee8cc1Swenshuai.xi 		//	reg_ckg_vifdbb_vdac,       (clkgen0, clkgen_dmd)
3699*53ee8cc1Swenshuai.xi 
3700*53ee8cc1Swenshuai.xi 
3701*53ee8cc1Swenshuai.xi 
3702*53ee8cc1Swenshuai.xi 		//$display("Set register at TOP (clkgen) ......");
3703*53ee8cc1Swenshuai.xi 
3704*53ee8cc1Swenshuai.xi 		// { 1'b0, reg_ckg_adcd1[3:0], reg_clk_pd_all, 1'b0, reg_clk_pd_iic, 7'h0, reg_xtal_en }
3705*53ee8cc1Swenshuai.xi 		// `RIU_W((`RIUBASE_TOP>>1)+7'h09, 2'b10, 16'h0000);
3706*53ee8cc1Swenshuai.xi 		//wreg 4105 0x09 0x0000
3707*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x09)*2  ,  0x00);
3708*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x09)*2+1,  0x00);
3709*53ee8cc1Swenshuai.xi 		// { 2'h0, reg_ckg_sbus[1:0], reg_ckg_iicm[3:0], reg_ckg_sadc[3:0], reg_ckg_adcd[3:0] }
3710*53ee8cc1Swenshuai.xi 		// `RIU_W((`RIUBASE_TOP>>1)+7'h0a, 2'b01, 16'h1110);
3711*53ee8cc1Swenshuai.xi //		wreg 4105 0x0a 0x1110
3712*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x0a)*2  ,  0x10);
3713*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x0a)*2+1,  0x11);
3714*53ee8cc1Swenshuai.xi 
3715*53ee8cc1Swenshuai.xi 		// { reg_ckg_demod_mpll[3:0], 4'h0, reg_ckg_dmdxtali[3:0], reg_ckg_dmdmcu[3:0] }
3716*53ee8cc1Swenshuai.xi 		// `RIU_W((`RIUBASE_TOP>>1)+7'h0d, 2'b10, 16'h0000);
3717*53ee8cc1Swenshuai.xi 		//wreg 4105 0x0d 0x0000
3718*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x0d)*2  ,  0x00);
3719*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x0d)*2+1,  0x00);
3720*53ee8cc1Swenshuai.xi 
3721*53ee8cc1Swenshuai.xi 		// DVBC : 24*36/30=28.8 MHz
3722*53ee8cc1Swenshuai.xi 		// `RIU_W((`RIUBASE_ADCPLL>>1)+7'h33, 2'b11, 16'h1201);       // Set MPLL_LOOP_DIV_FIRST and SECOND
3723*53ee8cc1Swenshuai.xi 		//wreg 4106 0x33 0x1201
3724*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x33)*2  ,  0x01);
3725*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x33)*2+1,  0x12);
3726*53ee8cc1Swenshuai.xi      // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h30, 2'b11, 16'h1e00+16'h1); // Set MPLL_ADC_DIV_SEL
3727*53ee8cc1Swenshuai.xi 
3728*53ee8cc1Swenshuai.xi 		// reg_ckg_ts_0 = 4'd0;
3729*53ee8cc1Swenshuai.xi 		// reg_ckg_ts_1 = 4'd0;
3730*53ee8cc1Swenshuai.xi 		// `RIU_W((`RIUBASE_TOP>>1)+7'h23, 2'b01, 16'h0000);
3731*53ee8cc1Swenshuai.xi 		//wreg 4105 0x23 0x0000
3732*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x23)*2  ,  0x00);
3733*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100900 + (0x23)*2+1,  0x00);
3734*53ee8cc1Swenshuai.xi 
3735*53ee8cc1Swenshuai.xi 		//$display("=================================================");
3736*53ee8cc1Swenshuai.xi 		//$display("start demod atop ADC setting ......");
3737*53ee8cc1Swenshuai.xi 		//$display("=================================================");
3738*53ee8cc1Swenshuai.xi 
3739*53ee8cc1Swenshuai.xi 		// { 8'h0, reg_ana_setting_sel[3:0], 3'h0, reg_ana_setting_enable } )
3740*53ee8cc1Swenshuai.xi 		// `RIU_W((`RIUBASE_ADCPLL>>1)+7'h51, 2'b01, 16'h0081);
3741*53ee8cc1Swenshuai.xi 		//wreg 4106 0x51 0x0081
3742*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x51)*2  ,  0x81);
3743*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x51)*2+1,  0x00);
3744*53ee8cc1Swenshuai.xi 
3745*53ee8cc1Swenshuai.xi 		//if agc enable
3746*53ee8cc1Swenshuai.xi 		//wreg 4106 0x18 0x0101
3747*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x18)*2  ,  0x01);
3748*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x18)*2+1,  0x01);
3749*53ee8cc1Swenshuai.xi 
3750*53ee8cc1Swenshuai.xi 		//wreg 4106 0x30 0x1200
3751*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x30)*2  ,  0x00);
3752*53ee8cc1Swenshuai.xi      _MDrv_DMD_MSB201X_SetReg(devID, 0x100a00 + (0x30)*2+1,  0x12);
3753*53ee8cc1Swenshuai.xi 
3754*53ee8cc1Swenshuai.xi 
3755*53ee8cc1Swenshuai.xi       free(pstDemod);
3756*53ee8cc1Swenshuai.xi       pstDemod=NULL;
3757*53ee8cc1Swenshuai.xi       return TRUE;
3758*53ee8cc1Swenshuai.xi }
3759*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_GetRFLevel(MS_U8 devID,MS_U8 u8DemodIndex,float * fRFPowerDbmResult,float fRFPowerDbm)3760*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_GetRFLevel(MS_U8 devID, MS_U8 u8DemodIndex, float *fRFPowerDbmResult, float fRFPowerDbm)
3761*53ee8cc1Swenshuai.xi {
3762*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
3763*53ee8cc1Swenshuai.xi 
3764*53ee8cc1Swenshuai.xi     DMD_LOCK();
3765*53ee8cc1Swenshuai.xi 
3766*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_GetRFLevel(devID, u8DemodIndex, fRFPowerDbmResult, fRFPowerDbm,
3767*53ee8cc1Swenshuai.xi                                                      pDemod->_sDMD_MSB201X_InitData.IFAGC_Data[u8DemodIndex].pIFAGC_SSI, pDemod->_sDMD_MSB201X_InitData.IFAGC_Data[u8DemodIndex].IFAGC_SSI_Length,
3768*53ee8cc1Swenshuai.xi                                                      pDemod->_sDMD_MSB201X_InitData.IFAGC_Data[u8DemodIndex].pIFAGC_ERR, pDemod->_sDMD_MSB201X_InitData.IFAGC_Data[u8DemodIndex].IFAGC_ERR_Length);
3769*53ee8cc1Swenshuai.xi 
3770*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
3771*53ee8cc1Swenshuai.xi 
3772*53ee8cc1Swenshuai.xi     return TRUE;
3773*53ee8cc1Swenshuai.xi }
3774*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_GetLock(MS_U8 devID,MS_U8 u8DemodIndex,eDMD_MSB201X_GETLOCK_TYPE eType,float fCurrRFPowerDbm,float fNoChannelRFPowerDbm,MS_U32 u32TimeInterval)3775*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_GetLock(MS_U8 devID, MS_U8 u8DemodIndex, eDMD_MSB201X_GETLOCK_TYPE eType, float fCurrRFPowerDbm, float fNoChannelRFPowerDbm, MS_U32 u32TimeInterval)
3776*53ee8cc1Swenshuai.xi {
3777*53ee8cc1Swenshuai.xi     MS_U16 u16Address = 0;
3778*53ee8cc1Swenshuai.xi     MS_U8 cData = 0;
3779*53ee8cc1Swenshuai.xi     MS_U8 cBitMask = 0;
3780*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
3781*53ee8cc1Swenshuai.xi 
3782*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_Select_Demod_RIU(devID, u8DemodIndex);
3783*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 5);
3784*53ee8cc1Swenshuai.xi #if 0
3785*53ee8cc1Swenshuai.xi     if (fCurrRFPowerDbm < 100.0f)
3786*53ee8cc1Swenshuai.xi     {
3787*53ee8cc1Swenshuai.xi         if (eType == DMD_DVBC_GETLOCK_NO_CHANNEL)
3788*53ee8cc1Swenshuai.xi         {
3789*53ee8cc1Swenshuai.xi             MDrv_SYS_DMD_VD_MBX_ReadReg(FEC_REG_BASE + 0xE0, &cData);
3790*53ee8cc1Swenshuai.xi             if (cData > 5)
3791*53ee8cc1Swenshuai.xi             {
3792*53ee8cc1Swenshuai.xi                 bDMD_DVBC_NoChannelDetectedWithRFPower = FALSE;
3793*53ee8cc1Swenshuai.xi                 u32DMD_DVBC_NoChannelTimeAccWithRFPower = 0;
3794*53ee8cc1Swenshuai.xi             }
3795*53ee8cc1Swenshuai.xi             else
3796*53ee8cc1Swenshuai.xi             {
3797*53ee8cc1Swenshuai.xi                 if ((fCurrRFPowerDbm<fNoChannelRFPowerDbm) && (u32DMD_DVBC_NoChannelTimeAccWithRFPower<10000))
3798*53ee8cc1Swenshuai.xi                 {
3799*53ee8cc1Swenshuai.xi                     u32DMD_DVBC_NoChannelTimeAccWithRFPower+=u32TimeInterval;
3800*53ee8cc1Swenshuai.xi                 }
3801*53ee8cc1Swenshuai.xi                 if (u32DMD_DVBC_NoChannelTimeAccWithRFPower>1500)
3802*53ee8cc1Swenshuai.xi                 {
3803*53ee8cc1Swenshuai.xi                     bDMD_DVBC_NoChannelDetectedWithRFPower=1;
3804*53ee8cc1Swenshuai.xi                     #ifdef MS_DEBUG
3805*53ee8cc1Swenshuai.xi                     printf("INTERN_DVBC_GetLock:DMD_DVBC_GETLOCK_NO_CHANNEL Detected Detected Detected!!\n");
3806*53ee8cc1Swenshuai.xi                     #endif
3807*53ee8cc1Swenshuai.xi                     return TRUE;
3808*53ee8cc1Swenshuai.xi                 }
3809*53ee8cc1Swenshuai.xi             }
3810*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
3811*53ee8cc1Swenshuai.xi             printf("INTERN_DVBC_GetLock:DMD_DVBC_GETLOCK_NO_CHANNEL FSM:%d InputPower:%f Threshold:%f Interval:%ld TimeAcc:%ld NoChannelDetection:%d\n",cData, fCurrRFPowerDbm, fNoChannelRFPowerDbm, u32TimeInterval, u32DMD_DVBC_NoChannelTimeAccWithRFPower, bDMD_DVBC_NoChannelDetectedWithRFPower);
3812*53ee8cc1Swenshuai.xi             #endif
3813*53ee8cc1Swenshuai.xi         }
3814*53ee8cc1Swenshuai.xi     }
3815*53ee8cc1Swenshuai.xi #endif
3816*53ee8cc1Swenshuai.xi 
3817*53ee8cc1Swenshuai.xi     {
3818*53ee8cc1Swenshuai.xi         switch( eType )
3819*53ee8cc1Swenshuai.xi         {
3820*53ee8cc1Swenshuai.xi             case DMD_DVBC_GETLOCK_FEC_LOCK:
3821*53ee8cc1Swenshuai.xi                 _MDrv_DMD_MSB201X_GetReg(devID, FEC_REG_BASE + 0xE0, &cData);
3822*53ee8cc1Swenshuai.xi 
3823*53ee8cc1Swenshuai.xi                 printf(" @_MDrv_DMD_MSB201X_GetLock DevID = %d, Channel = %d, FSM 0x%x\n",devID, u8DemodIndex, cData);
3824*53ee8cc1Swenshuai.xi                 if (cData == 0x0C)
3825*53ee8cc1Swenshuai.xi                 {
3826*53ee8cc1Swenshuai.xi                     if(pDemod->DMD_Lock_Status[u8DemodIndex]== 0)
3827*53ee8cc1Swenshuai.xi                     {
3828*53ee8cc1Swenshuai.xi                       pDemod->DMD_Lock_Status[u8DemodIndex] = 1;
3829*53ee8cc1Swenshuai.xi                       printf("[Demod]lock++++\n");
3830*53ee8cc1Swenshuai.xi 
3831*53ee8cc1Swenshuai.xi                     }
3832*53ee8cc1Swenshuai.xi                     return TRUE;
3833*53ee8cc1Swenshuai.xi                 }
3834*53ee8cc1Swenshuai.xi                 else
3835*53ee8cc1Swenshuai.xi                 {
3836*53ee8cc1Swenshuai.xi                     if(pDemod->DMD_Lock_Status[u8DemodIndex] == 1)
3837*53ee8cc1Swenshuai.xi                     {
3838*53ee8cc1Swenshuai.xi                       pDemod->DMD_Lock_Status[u8DemodIndex] = 0;
3839*53ee8cc1Swenshuai.xi                       printf("[Demod]unlock----\n");
3840*53ee8cc1Swenshuai.xi                     }
3841*53ee8cc1Swenshuai.xi                     return FALSE;
3842*53ee8cc1Swenshuai.xi                 }
3843*53ee8cc1Swenshuai.xi                 break;
3844*53ee8cc1Swenshuai.xi 
3845*53ee8cc1Swenshuai.xi             case DMD_DVBC_GETLOCK_PSYNC_LOCK:
3846*53ee8cc1Swenshuai.xi                 u16Address =  FEC_REG_BASE + 0x2C; //FEC: P-sync Lock,
3847*53ee8cc1Swenshuai.xi                 cBitMask = _BIT1;
3848*53ee8cc1Swenshuai.xi                 break;
3849*53ee8cc1Swenshuai.xi 
3850*53ee8cc1Swenshuai.xi             case DMD_DVBC_GETLOCK_DCR_LOCK:
3851*53ee8cc1Swenshuai.xi                 u16Address =  TDP_REG_BASE + 0x45; //DCR Lock,
3852*53ee8cc1Swenshuai.xi                 cBitMask = _BIT0;
3853*53ee8cc1Swenshuai.xi                 break;
3854*53ee8cc1Swenshuai.xi 
3855*53ee8cc1Swenshuai.xi             case DMD_DVBC_GETLOCK_AGC_LOCK:
3856*53ee8cc1Swenshuai.xi                 u16Address =  TDP_REG_BASE + 0x2F; //AGC Lock,
3857*53ee8cc1Swenshuai.xi                 cBitMask = _BIT0;
3858*53ee8cc1Swenshuai.xi                 break;
3859*53ee8cc1Swenshuai.xi 
3860*53ee8cc1Swenshuai.xi             case DMD_DVBC_GETLOCK_NO_CHANNEL:
3861*53ee8cc1Swenshuai.xi                 u16Address =  TOP_REG_BASE + 0xC3; //no channel,
3862*53ee8cc1Swenshuai.xi                 cBitMask = _BIT2 | _BIT3 | _BIT4;
3863*53ee8cc1Swenshuai.xi                 break;
3864*53ee8cc1Swenshuai.xi 
3865*53ee8cc1Swenshuai.xi             case DMD_DVBC_GETLOCK_ATV_DETECT:
3866*53ee8cc1Swenshuai.xi                 u16Address =  TOP_REG_BASE + 0xC4; //ATV detection,
3867*53ee8cc1Swenshuai.xi                 cBitMask = _BIT1; // check atv
3868*53ee8cc1Swenshuai.xi                 break;
3869*53ee8cc1Swenshuai.xi 
3870*53ee8cc1Swenshuai.xi             case DMD_DVBC_GETLOCK_TR_LOCK:
3871*53ee8cc1Swenshuai.xi                 #if 0 // 20111108 temporarily solution
3872*53ee8cc1Swenshuai.xi                 u16Address =  INNC_REG_BASE + 0x0A*2 + 1; //TR lock indicator,
3873*53ee8cc1Swenshuai.xi                 cBitMask = _BIT4;
3874*53ee8cc1Swenshuai.xi                 break;
3875*53ee8cc1Swenshuai.xi                 #endif
3876*53ee8cc1Swenshuai.xi             case DMD_DVBC_GETLOCK_TR_EVER_LOCK:
3877*53ee8cc1Swenshuai.xi                 u16Address =  TOP_REG_BASE + 0xC4; //TR lock indicator,
3878*53ee8cc1Swenshuai.xi                 cBitMask = _BIT4;
3879*53ee8cc1Swenshuai.xi                 break;
3880*53ee8cc1Swenshuai.xi 
3881*53ee8cc1Swenshuai.xi             default:
3882*53ee8cc1Swenshuai.xi                 return FALSE;
3883*53ee8cc1Swenshuai.xi         }
3884*53ee8cc1Swenshuai.xi 
3885*53ee8cc1Swenshuai.xi         if (_MDrv_DMD_MSB201X_GetReg(devID, u16Address, &cData) == FALSE)
3886*53ee8cc1Swenshuai.xi             return FALSE;
3887*53ee8cc1Swenshuai.xi 
3888*53ee8cc1Swenshuai.xi         if ((cData & cBitMask) != 0)
3889*53ee8cc1Swenshuai.xi         {
3890*53ee8cc1Swenshuai.xi             return TRUE;
3891*53ee8cc1Swenshuai.xi         }
3892*53ee8cc1Swenshuai.xi 
3893*53ee8cc1Swenshuai.xi         return FALSE;
3894*53ee8cc1Swenshuai.xi     }
3895*53ee8cc1Swenshuai.xi 
3896*53ee8cc1Swenshuai.xi     return FALSE;
3897*53ee8cc1Swenshuai.xi }
3898*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_GetLock(MS_U8 devID,MS_U8 u8DemodIndex,eDMD_MSB201X_GETLOCK_TYPE eType,eDMD_MSB201X_LOCK_STATUS * eLockStatus)3899*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_GetLock(MS_U8 devID, MS_U8 u8DemodIndex, eDMD_MSB201X_GETLOCK_TYPE eType, eDMD_MSB201X_LOCK_STATUS *eLockStatus)
3900*53ee8cc1Swenshuai.xi {
3901*53ee8cc1Swenshuai.xi     return MDrv_DMD_MSB201X_GetLockWithRFPower(devID, u8DemodIndex, eType, eLockStatus, 200.0f, -200.0f);
3902*53ee8cc1Swenshuai.xi }
3903*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_GetLockWithRFPower(MS_U8 devID,MS_U8 u8DemodIndex,eDMD_MSB201X_GETLOCK_TYPE eType,eDMD_MSB201X_LOCK_STATUS * eLockStatus,float fCurrRFPowerDbm,float fNoChannelRFPowerDbm)3904*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_GetLockWithRFPower(MS_U8 devID, MS_U8 u8DemodIndex, eDMD_MSB201X_GETLOCK_TYPE eType, eDMD_MSB201X_LOCK_STATUS *eLockStatus, float fCurrRFPowerDbm, float fNoChannelRFPowerDbm)
3905*53ee8cc1Swenshuai.xi {
3906*53ee8cc1Swenshuai.xi     MS_U32 u32CurrScanTime=0;
3907*53ee8cc1Swenshuai.xi     MS_BOOL bRet=FALSE;
3908*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
3909*53ee8cc1Swenshuai.xi 
3910*53ee8cc1Swenshuai.xi     DMD_LOCK();
3911*53ee8cc1Swenshuai.xi     if ( eType == DMD_DVBC_GETLOCK ) // for channel scan
3912*53ee8cc1Swenshuai.xi     {
3913*53ee8cc1Swenshuai.xi         if (_MDrv_DMD_MSB201X_GetLock(devID, u8DemodIndex, DMD_DVBC_GETLOCK_FEC_LOCK, 200.0f, -200.0f, 0))
3914*53ee8cc1Swenshuai.xi         {
3915*53ee8cc1Swenshuai.xi             *eLockStatus = DMD_DVBC_LOCK;
3916*53ee8cc1Swenshuai.xi         }
3917*53ee8cc1Swenshuai.xi         else
3918*53ee8cc1Swenshuai.xi         {
3919*53ee8cc1Swenshuai.xi             MS_U32 u32Timeout = 10000;//(sDMD_DVBC_Info.u16SymbolRate) ? 5000 : 15000;
3920*53ee8cc1Swenshuai.xi             if (pDemod->sDMD_MSB201X_Info[u8DemodIndex].u16SymbolRate == 0)
3921*53ee8cc1Swenshuai.xi             {
3922*53ee8cc1Swenshuai.xi                 u32Timeout = u16DMD_DVBC_AutoSymbol_Timeout;
3923*53ee8cc1Swenshuai.xi             }
3924*53ee8cc1Swenshuai.xi             else
3925*53ee8cc1Swenshuai.xi             {
3926*53ee8cc1Swenshuai.xi                 u32Timeout = (pDemod->sDMD_MSB201X_Info[u8DemodIndex].eQamMode == DMD_DVBC_QAMAUTO) ? u16DMD_DVBC_FixSymbol_AutoQam_Timeout : u16DMD_DVBC_FixSymbol_FixQam_Timeout;
3927*53ee8cc1Swenshuai.xi             }
3928*53ee8cc1Swenshuai.xi 
3929*53ee8cc1Swenshuai.xi             u32CurrScanTime=MsOS_GetSystemTime();
3930*53ee8cc1Swenshuai.xi             if (u32CurrScanTime - pDemod->sDMD_MSB201X_Info[u8DemodIndex].u32ChkScanTimeStart < u32Timeout)
3931*53ee8cc1Swenshuai.xi             {
3932*53ee8cc1Swenshuai.xi                 if (pDemod->u32DMD_DVBC_ScanCount[u8DemodIndex]==0)
3933*53ee8cc1Swenshuai.xi                 {
3934*53ee8cc1Swenshuai.xi                     pDemod->u32DMD_DVBC_PrevScanTime[u8DemodIndex]=u32CurrScanTime;
3935*53ee8cc1Swenshuai.xi                     pDemod->u32DMD_DVBC_ScanCount[u8DemodIndex]++;
3936*53ee8cc1Swenshuai.xi                 }
3937*53ee8cc1Swenshuai.xi 
3938*53ee8cc1Swenshuai.xi                 bRet=_MDrv_DMD_MSB201X_GetRFLevel(devID, u8DemodIndex, &fCurrRFPowerDbm, fCurrRFPowerDbm,
3939*53ee8cc1Swenshuai.xi                                                      pDemod->_sDMD_MSB201X_InitData.IFAGC_Data[u8DemodIndex].pIFAGC_SSI, pDemod->_sDMD_MSB201X_InitData.IFAGC_Data[u8DemodIndex].IFAGC_SSI_Length,
3940*53ee8cc1Swenshuai.xi                                                      pDemod->_sDMD_MSB201X_InitData.IFAGC_Data[u8DemodIndex].pIFAGC_ERR, pDemod->_sDMD_MSB201X_InitData.IFAGC_Data[u8DemodIndex].IFAGC_ERR_Length);
3941*53ee8cc1Swenshuai.xi 
3942*53ee8cc1Swenshuai.xi                 if (_MDrv_DMD_MSB201X_GetLock(devID, u8DemodIndex, DMD_DVBC_GETLOCK_NO_CHANNEL, fCurrRFPowerDbm, fNoChannelRFPowerDbm, u32CurrScanTime-pDemod->u32DMD_DVBC_PrevScanTime[u8DemodIndex]))
3943*53ee8cc1Swenshuai.xi                 {
3944*53ee8cc1Swenshuai.xi                     #ifdef MS_DEBUG
3945*53ee8cc1Swenshuai.xi                     printf("%s %ld UNLOCK:NO_CHANNEL\n", __FUNCTION__, u32CurrScanTime-pDemod->sDMD_MSB201X_Info[u8DemodIndex].u32ChkScanTimeStart);
3946*53ee8cc1Swenshuai.xi                     #endif
3947*53ee8cc1Swenshuai.xi                     *eLockStatus = DMD_DVBC_UNLOCK;
3948*53ee8cc1Swenshuai.xi                 }
3949*53ee8cc1Swenshuai.xi                 else if (_MDrv_DMD_MSB201X_GetLock(devID, u8DemodIndex, DMD_DVBC_GETLOCK_ATV_DETECT, 200.0f, -200.0f, 0))
3950*53ee8cc1Swenshuai.xi                 {
3951*53ee8cc1Swenshuai.xi                     #ifdef MS_DEBUG
3952*53ee8cc1Swenshuai.xi                     printf("%s %ld UNLOCK:ATV_DETECT\n", __FUNCTION__, u32CurrScanTime-pDemod->sDMD_MSB201X_Info[u8DemodIndex].u32ChkScanTimeStart);
3953*53ee8cc1Swenshuai.xi                     #endif
3954*53ee8cc1Swenshuai.xi                     *eLockStatus = DMD_DVBC_UNLOCK;
3955*53ee8cc1Swenshuai.xi                 }
3956*53ee8cc1Swenshuai.xi #ifdef NEW_TR_MODULE
3957*53ee8cc1Swenshuai.xi                 else if ((_MDrv_DMD_MSB201X_GetLock(devID, u8DemodIndex, DMD_DVBC_GETLOCK_TR_EVER_LOCK, 200.0f, -200.0f, 0) == FALSE) && ((u32CurrScanTime - pDemod->sDMD_MSB201X_Info[u8DemodIndex].u32ChkScanTimeStart) > 500))
3958*53ee8cc1Swenshuai.xi #else
3959*53ee8cc1Swenshuai.xi                 else if ((_MDrv_DMD_MSB201X_GetLock(devID, u8DemodIndex, DMD_DVBC_GETLOCK_TR_EVER_LOCK, 200.0f, -200.0f, 0) == FALSE) && ((u32CurrScanTime - pDemod->sDMD_MSB201X_Info[u8DemodIndex].u32ChkScanTimeStart) > 5000))
3960*53ee8cc1Swenshuai.xi #endif
3961*53ee8cc1Swenshuai.xi                 {
3962*53ee8cc1Swenshuai.xi                     #ifdef MS_DEBUG
3963*53ee8cc1Swenshuai.xi                     printf("%s %ld UNLOCK:TR\n", __FUNCTION__, u32CurrScanTime-pDemod->sDMD_MSB201X_Info[u8DemodIndex].u32ChkScanTimeStart);
3964*53ee8cc1Swenshuai.xi                     #endif
3965*53ee8cc1Swenshuai.xi                     *eLockStatus = DMD_DVBC_UNLOCK;
3966*53ee8cc1Swenshuai.xi                 }
3967*53ee8cc1Swenshuai.xi                 else
3968*53ee8cc1Swenshuai.xi                 {
3969*53ee8cc1Swenshuai.xi                     *eLockStatus = DMD_DVBC_CHECKING;
3970*53ee8cc1Swenshuai.xi                 }
3971*53ee8cc1Swenshuai.xi             }
3972*53ee8cc1Swenshuai.xi             else
3973*53ee8cc1Swenshuai.xi             {
3974*53ee8cc1Swenshuai.xi                 #ifdef MS_DEBUG
3975*53ee8cc1Swenshuai.xi                 printf("%s %ld UNLOCK:TIMEOUT %ld\n", __FUNCTION__, MsOS_GetSystemTime(), u32Timeout);
3976*53ee8cc1Swenshuai.xi                 #endif
3977*53ee8cc1Swenshuai.xi                 *eLockStatus = DMD_DVBC_UNLOCK;
3978*53ee8cc1Swenshuai.xi             }
3979*53ee8cc1Swenshuai.xi             pDemod->u32DMD_DVBC_PrevScanTime[u8DemodIndex]=u32CurrScanTime;
3980*53ee8cc1Swenshuai.xi         }
3981*53ee8cc1Swenshuai.xi 
3982*53ee8cc1Swenshuai.xi     }
3983*53ee8cc1Swenshuai.xi     else
3984*53ee8cc1Swenshuai.xi     {
3985*53ee8cc1Swenshuai.xi         if (_MDrv_DMD_MSB201X_GetLock(devID, u8DemodIndex, eType, 200.0f, -200.0f, 0) == TRUE)
3986*53ee8cc1Swenshuai.xi         {
3987*53ee8cc1Swenshuai.xi             *eLockStatus = DMD_DVBC_LOCK;
3988*53ee8cc1Swenshuai.xi         }
3989*53ee8cc1Swenshuai.xi         else
3990*53ee8cc1Swenshuai.xi         {
3991*53ee8cc1Swenshuai.xi             *eLockStatus = DMD_DVBC_UNLOCK;
3992*53ee8cc1Swenshuai.xi         }
3993*53ee8cc1Swenshuai.xi     }
3994*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
3995*53ee8cc1Swenshuai.xi 
3996*53ee8cc1Swenshuai.xi     bRet=TRUE;
3997*53ee8cc1Swenshuai.xi     return bRet;
3998*53ee8cc1Swenshuai.xi }
3999*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_Demod_GetLock(MS_U8 devID,MS_U8 u8DemodIndex)4000*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_Demod_GetLock(MS_U8 devID, MS_U8 u8DemodIndex)
4001*53ee8cc1Swenshuai.xi {
4002*53ee8cc1Swenshuai.xi     MS_U8		cData;
4003*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
4004*53ee8cc1Swenshuai.xi     DMD_LOCK();
4005*53ee8cc1Swenshuai.xi 
4006*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_Select_Demod_RIU(devID, u8DemodIndex);
4007*53ee8cc1Swenshuai.xi 
4008*53ee8cc1Swenshuai.xi     printf(" MDrv_DMD_MSB201X_Demod_GetLock : devID = %d, Channel index = %d \n", (int)devID, (int)u8DemodIndex);
4009*53ee8cc1Swenshuai.xi 
4010*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 5);
4011*53ee8cc1Swenshuai.xi 
4012*53ee8cc1Swenshuai.xi // Only check demod lock or not!
4013*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_GetReg(devID, FEC_REG_BASE + 0xE0, &cData);
4014*53ee8cc1Swenshuai.xi     printf(" MDrv_DMD_MSB201X_Demod_GetLock FSM 0x%x\n",cData);
4015*53ee8cc1Swenshuai.xi     if(cData == 0x0C)
4016*53ee8cc1Swenshuai.xi     {
4017*53ee8cc1Swenshuai.xi     	if(g_dvbc_lock[devID][u8DemodIndex] == 0)
4018*53ee8cc1Swenshuai.xi     	{
4019*53ee8cc1Swenshuai.xi     		g_dvbc_lock[devID][u8DemodIndex] = 1;
4020*53ee8cc1Swenshuai.xi 		printf(" MDrv_DMD_MSB201X_Demod_GetLock : Demod Lock! \n");
4021*53ee8cc1Swenshuai.xi     	}
4022*53ee8cc1Swenshuai.xi 	_MSB201X_I2C_CH_Reset(devID, 3);
4023*53ee8cc1Swenshuai.xi 	return TRUE;
4024*53ee8cc1Swenshuai.xi     }
4025*53ee8cc1Swenshuai.xi     else
4026*53ee8cc1Swenshuai.xi     {
4027*53ee8cc1Swenshuai.xi     	if(g_dvbc_lock[devID][u8DemodIndex] == 1)
4028*53ee8cc1Swenshuai.xi     	{
4029*53ee8cc1Swenshuai.xi     		g_dvbc_lock[devID][u8DemodIndex] = 0;
4030*53ee8cc1Swenshuai.xi 		printf(" MDrv_DMD_MSB201X_Demod_GetLock : Demod Unlock! \n");
4031*53ee8cc1Swenshuai.xi     	}
4032*53ee8cc1Swenshuai.xi 	_MSB201X_I2C_CH_Reset(devID, 3);
4033*53ee8cc1Swenshuai.xi 	return FALSE;
4034*53ee8cc1Swenshuai.xi     }
4035*53ee8cc1Swenshuai.xi 
4036*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
4037*53ee8cc1Swenshuai.xi     return FALSE;
4038*53ee8cc1Swenshuai.xi }
4039*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_Set_TSOut(MS_U8 devID,sDMD_MSB201X_TS_Param * pDMD_MSB201X_TS_Param)4040*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_Set_TSOut(MS_U8 devID, sDMD_MSB201X_TS_Param *pDMD_MSB201X_TS_Param)
4041*53ee8cc1Swenshuai.xi {
4042*53ee8cc1Swenshuai.xi 	tMSB201X_Demod_Data *pDemod=NULL;
4043*53ee8cc1Swenshuai.xi 	pDemod= DEMOD_GET_ACTIVE_NODE(devID);
4044*53ee8cc1Swenshuai.xi     	DMD_LOCK();
4045*53ee8cc1Swenshuai.xi 
4046*53ee8cc1Swenshuai.xi 	_MDrv_DMD_MSB201X_Set_TSOut(devID, pDMD_MSB201X_TS_Param);
4047*53ee8cc1Swenshuai.xi 
4048*53ee8cc1Swenshuai.xi 	DMD_UNLOCK();
4049*53ee8cc1Swenshuai.xi 	return TRUE;
4050*53ee8cc1Swenshuai.xi }
4051*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_CfgExtHeader(MS_U8 devID,MS_U8 u8DemodIndex,sDMD_MSB201X_extHeader * pDMD_MSB201X_extHeader_Param)4052*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_CfgExtHeader(MS_U8 devID, MS_U8 u8DemodIndex,  sDMD_MSB201X_extHeader *pDMD_MSB201X_extHeader_Param)
4053*53ee8cc1Swenshuai.xi {
4054*53ee8cc1Swenshuai.xi 	MS_BOOL bRet = TRUE;
4055*53ee8cc1Swenshuai.xi 	tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
4056*53ee8cc1Swenshuai.xi     	DMD_LOCK();
4057*53ee8cc1Swenshuai.xi 
4058*53ee8cc1Swenshuai.xi 	bRet = _MDrv_DMD_MSB201X_CfgExtHeader(devID, u8DemodIndex, pDMD_MSB201X_extHeader_Param);
4059*53ee8cc1Swenshuai.xi 
4060*53ee8cc1Swenshuai.xi 	DMD_UNLOCK();
4061*53ee8cc1Swenshuai.xi 	return bRet;
4062*53ee8cc1Swenshuai.xi }
4063*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_CfgCIHeader(MS_U8 devID,MS_U8 u8DemodIndex,sDMD_MSB201X_CIHeader * pDMD_MSB201X_CIHeader_Param)4064*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_CfgCIHeader(MS_U8 devID, MS_U8 u8DemodIndex,  sDMD_MSB201X_CIHeader *pDMD_MSB201X_CIHeader_Param)
4065*53ee8cc1Swenshuai.xi {
4066*53ee8cc1Swenshuai.xi 	MS_BOOL bRet = TRUE;
4067*53ee8cc1Swenshuai.xi 	tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
4068*53ee8cc1Swenshuai.xi     	DMD_LOCK();
4069*53ee8cc1Swenshuai.xi 
4070*53ee8cc1Swenshuai.xi 	bRet = _MDrv_DMD_MSB201X_CfgCIHeader(devID, u8DemodIndex, pDMD_MSB201X_CIHeader_Param);
4071*53ee8cc1Swenshuai.xi 
4072*53ee8cc1Swenshuai.xi 	DMD_UNLOCK();
4073*53ee8cc1Swenshuai.xi 	return bRet;
4074*53ee8cc1Swenshuai.xi }
4075*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_GetCurrentModulationType(MS_U8 devID,MS_U8 u8DemodIndex,eDMD_MSB201X_MODULATION_TYPE * pQAMMode)4076*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_GetCurrentModulationType(MS_U8 devID, MS_U8 u8DemodIndex, eDMD_MSB201X_MODULATION_TYPE *pQAMMode)
4077*53ee8cc1Swenshuai.xi {
4078*53ee8cc1Swenshuai.xi     MS_U8 u8Data=0;
4079*53ee8cc1Swenshuai.xi 
4080*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_Select_Demod_RIU(devID, u8DemodIndex);
4081*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 5);
4082*53ee8cc1Swenshuai.xi 
4083*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_GetReg(devID, EQE_REG_BASE + 0x02, &u8Data);
4084*53ee8cc1Swenshuai.xi 
4085*53ee8cc1Swenshuai.xi     switch(u8Data&0x07)
4086*53ee8cc1Swenshuai.xi     {
4087*53ee8cc1Swenshuai.xi         case 0:
4088*53ee8cc1Swenshuai.xi             *pQAMMode = DMD_DVBC_QAM16;
4089*53ee8cc1Swenshuai.xi             return TRUE;
4090*53ee8cc1Swenshuai.xi              break;
4091*53ee8cc1Swenshuai.xi         case 1:
4092*53ee8cc1Swenshuai.xi             *pQAMMode = DMD_DVBC_QAM32;
4093*53ee8cc1Swenshuai.xi             return TRUE;
4094*53ee8cc1Swenshuai.xi             break;
4095*53ee8cc1Swenshuai.xi         case 2:
4096*53ee8cc1Swenshuai.xi             *pQAMMode = DMD_DVBC_QAM64;
4097*53ee8cc1Swenshuai.xi             return TRUE;
4098*53ee8cc1Swenshuai.xi             break;
4099*53ee8cc1Swenshuai.xi         case 3:
4100*53ee8cc1Swenshuai.xi             *pQAMMode = DMD_DVBC_QAM128;
4101*53ee8cc1Swenshuai.xi             return TRUE;
4102*53ee8cc1Swenshuai.xi             break;
4103*53ee8cc1Swenshuai.xi         case 4:
4104*53ee8cc1Swenshuai.xi             *pQAMMode = DMD_DVBC_QAM256;
4105*53ee8cc1Swenshuai.xi             return TRUE;
4106*53ee8cc1Swenshuai.xi             break;
4107*53ee8cc1Swenshuai.xi         default:
4108*53ee8cc1Swenshuai.xi             *pQAMMode = DMD_DVBC_QAMAUTO;
4109*53ee8cc1Swenshuai.xi             return FALSE;
4110*53ee8cc1Swenshuai.xi     }
4111*53ee8cc1Swenshuai.xi }
4112*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_GetCurrentSymbolRate(MS_U8 devID,MS_U8 u8DemodIndex,MS_U16 * u16SymbolRate)4113*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_GetCurrentSymbolRate(MS_U8 devID, MS_U8 u8DemodIndex, MS_U16 *u16SymbolRate)
4114*53ee8cc1Swenshuai.xi {
4115*53ee8cc1Swenshuai.xi     MS_U8  tmp = 0;
4116*53ee8cc1Swenshuai.xi     MS_U16 u16SymbolRateTmp = 0;
4117*53ee8cc1Swenshuai.xi 
4118*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_Select_Demod_RIU(devID, u8DemodIndex);
4119*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 5);
4120*53ee8cc1Swenshuai.xi 
4121*53ee8cc1Swenshuai.xi     // intp
4122*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_GetReg(devID, TOP_REG_BASE + 0xd2, &tmp);
4123*53ee8cc1Swenshuai.xi     u16SymbolRateTmp = tmp;
4124*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_GetReg(devID, TOP_REG_BASE + 0xd1, &tmp);
4125*53ee8cc1Swenshuai.xi     u16SymbolRateTmp = (u16SymbolRateTmp<<8)|tmp;
4126*53ee8cc1Swenshuai.xi 
4127*53ee8cc1Swenshuai.xi     if (abs(u16SymbolRateTmp-6900)<2)
4128*53ee8cc1Swenshuai.xi     {
4129*53ee8cc1Swenshuai.xi         u16SymbolRateTmp=6900;
4130*53ee8cc1Swenshuai.xi     }
4131*53ee8cc1Swenshuai.xi 
4132*53ee8cc1Swenshuai.xi     if (abs(u16SymbolRateTmp-6875)<2)
4133*53ee8cc1Swenshuai.xi     {
4134*53ee8cc1Swenshuai.xi         u16SymbolRateTmp=6875;
4135*53ee8cc1Swenshuai.xi     }
4136*53ee8cc1Swenshuai.xi 
4137*53ee8cc1Swenshuai.xi     *u16SymbolRate = u16SymbolRateTmp;
4138*53ee8cc1Swenshuai.xi 
4139*53ee8cc1Swenshuai.xi     return TRUE;
4140*53ee8cc1Swenshuai.xi }
4141*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_Get_FreqOffset(MS_U8 devID,MS_U8 u8DemodIndex,float * pFreqOff,MS_U8 u8BW)4142*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_Get_FreqOffset(MS_U8 devID, MS_U8 u8DemodIndex, float *pFreqOff, MS_U8 u8BW)
4143*53ee8cc1Swenshuai.xi {
4144*53ee8cc1Swenshuai.xi     MS_U16      FreqB, config_Fc=0;
4145*53ee8cc1Swenshuai.xi     float       FreqCfo_offset,f_Fc;
4146*53ee8cc1Swenshuai.xi     MS_U32      RegCfo_offset, Reg_Fc_over_Fs;
4147*53ee8cc1Swenshuai.xi     //MS_U8       reg_frz = 0, reg = 0;
4148*53ee8cc1Swenshuai.xi     MS_U8       reg = 0;
4149*53ee8cc1Swenshuai.xi     MS_BOOL     status = TRUE;
4150*53ee8cc1Swenshuai.xi 
4151*53ee8cc1Swenshuai.xi     // no use.
4152*53ee8cc1Swenshuai.xi     u8BW = u8BW;
4153*53ee8cc1Swenshuai.xi 
4154*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_Select_Demod_RIU(devID, u8DemodIndex);
4155*53ee8cc1Swenshuai.xi     _MSB201X_I2C_CH_Reset(devID, 5);
4156*53ee8cc1Swenshuai.xi 
4157*53ee8cc1Swenshuai.xi     // bank 2c 0x3d [0] reg_bit_err_num_freeze
4158*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_SetReg(devID, EQE_REG_BASE + 0x3A, 0x20);
4159*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_SetReg(devID, INNC_REG_BASE + 0x05, 0x80);
4160*53ee8cc1Swenshuai.xi 
4161*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_GetReg(devID, EQE_REG_BASE + 0x43, &reg);
4162*53ee8cc1Swenshuai.xi     RegCfo_offset = reg;
4163*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_GetReg(devID, EQE_REG_BASE + 0x42, &reg);
4164*53ee8cc1Swenshuai.xi     RegCfo_offset = (RegCfo_offset<<8)|reg;
4165*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_GetReg(devID, EQE_REG_BASE + 0x41, &reg);
4166*53ee8cc1Swenshuai.xi     RegCfo_offset = (RegCfo_offset<<8)|reg;
4167*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_GetReg(devID, EQE_REG_BASE + 0x40, &reg);
4168*53ee8cc1Swenshuai.xi     RegCfo_offset = (RegCfo_offset<<8)|reg;
4169*53ee8cc1Swenshuai.xi 
4170*53ee8cc1Swenshuai.xi     // bank 2c 0x3d [0] reg_bit_err_num_freeze
4171*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_SetReg(devID, EQE_REG_BASE + 0x3A, 0x00);
4172*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_SetReg(devID, INNC_REG_BASE + 0x05, 0x00);
4173*53ee8cc1Swenshuai.xi 
4174*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_GetReg(devID, TDF_REG_BASE + 0x5b, &reg);
4175*53ee8cc1Swenshuai.xi     Reg_Fc_over_Fs = reg;
4176*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_GetReg(devID, TDF_REG_BASE + 0x5a, &reg);
4177*53ee8cc1Swenshuai.xi     Reg_Fc_over_Fs = (Reg_Fc_over_Fs<<8)|reg;
4178*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_GetReg(devID, TDF_REG_BASE + 0x59, &reg);
4179*53ee8cc1Swenshuai.xi     Reg_Fc_over_Fs = (Reg_Fc_over_Fs<<8)|reg;
4180*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_GetReg(devID, TDF_REG_BASE + 0x58, &reg);
4181*53ee8cc1Swenshuai.xi     Reg_Fc_over_Fs = (Reg_Fc_over_Fs<<8)|reg;
4182*53ee8cc1Swenshuai.xi 
4183*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_GetReg(devID, E_DMD_DVBC_CFG_FIF_H, &reg);
4184*53ee8cc1Swenshuai.xi     config_Fc = reg;
4185*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_GetReg(devID, E_DMD_DVBC_CFG_FIF_L, &reg);
4186*53ee8cc1Swenshuai.xi     config_Fc = (config_Fc<<8)|reg;
4187*53ee8cc1Swenshuai.xi 
4188*53ee8cc1Swenshuai.xi     f_Fc = (float)Reg_Fc_over_Fs/134217728.0f * ((float)DVBC_FS);
4189*53ee8cc1Swenshuai.xi 
4190*53ee8cc1Swenshuai.xi     FreqCfo_offset = (MS_S32)(RegCfo_offset<<4)/16;
4191*53ee8cc1Swenshuai.xi 
4192*53ee8cc1Swenshuai.xi     FreqCfo_offset = FreqCfo_offset/0x8000000/8.0f;
4193*53ee8cc1Swenshuai.xi 
4194*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_GetCurrentSymbolRate(devID, u8DemodIndex, &FreqB);
4195*53ee8cc1Swenshuai.xi 
4196*53ee8cc1Swenshuai.xi     FreqCfo_offset = FreqCfo_offset * FreqB + (f_Fc-(float)config_Fc);
4197*53ee8cc1Swenshuai.xi 
4198*53ee8cc1Swenshuai.xi     *pFreqOff = FreqCfo_offset;
4199*53ee8cc1Swenshuai.xi 
4200*53ee8cc1Swenshuai.xi     return status;
4201*53ee8cc1Swenshuai.xi }
4202*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_GetStatus(MS_U8 devID,MS_U8 u8DemodIndex,eDMD_MSB201X_MODULATION_TYPE * pQAMMode,MS_U16 * u16SymbolRate,float * pFreqOff)4203*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_GetStatus(MS_U8 devID, MS_U8 u8DemodIndex, eDMD_MSB201X_MODULATION_TYPE *pQAMMode, MS_U16 *u16SymbolRate, float *pFreqOff)
4204*53ee8cc1Swenshuai.xi {
4205*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
4206*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
4207*53ee8cc1Swenshuai.xi 
4208*53ee8cc1Swenshuai.xi     DMD_LOCK();
4209*53ee8cc1Swenshuai.xi 
4210*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_GetCurrentModulationType(devID, u8DemodIndex, pQAMMode);
4211*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_GetCurrentSymbolRate(devID, u8DemodIndex, u16SymbolRate);
4212*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_Get_FreqOffset(devID, u8DemodIndex, pFreqOff,8);
4213*53ee8cc1Swenshuai.xi 
4214*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
4215*53ee8cc1Swenshuai.xi 
4216*53ee8cc1Swenshuai.xi     return bRet;
4217*53ee8cc1Swenshuai.xi }
4218*53ee8cc1Swenshuai.xi 
4219*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_GetFWVer(MS_U8 devID,MS_U8 u8DemodIndex,MS_U16 * ver)4220*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_GetFWVer(MS_U8 devID, MS_U8 u8DemodIndex, MS_U16 *ver)
4221*53ee8cc1Swenshuai.xi {
4222*53ee8cc1Swenshuai.xi 
4223*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
4224*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
4225*53ee8cc1Swenshuai.xi 
4226*53ee8cc1Swenshuai.xi     DMD_LOCK();
4227*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_Select_Demod_RIU(devID, u8DemodIndex);
4228*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB201X_Version(devID, u8DemodIndex, ver);
4229*53ee8cc1Swenshuai.xi     //printf("MDrv_DMD_DVBC_GetFWVer %x\n", *ver);
4230*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
4231*53ee8cc1Swenshuai.xi 
4232*53ee8cc1Swenshuai.xi     return bRet;
4233*53ee8cc1Swenshuai.xi 
4234*53ee8cc1Swenshuai.xi }
4235*53ee8cc1Swenshuai.xi 
4236*53ee8cc1Swenshuai.xi 
4237*53ee8cc1Swenshuai.xi #if 0
4238*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_Exit(MS_U8 devID)
4239*53ee8cc1Swenshuai.xi {
4240*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
4241*53ee8cc1Swenshuai.xi 
4242*53ee8cc1Swenshuai.xi     pDemod->bDMD_MSB201X_Power_init_en = FALSE;
4243*53ee8cc1Swenshuai.xi     pDemod->u8DMD_MSB201X_PowerOnInitialization_Flow = 0;
4244*53ee8cc1Swenshuai.xi     pDemod->u8DMD_MSB201X_Sram_Code  = 0x0;
4245*53ee8cc1Swenshuai.xi     pDemod->bDemodRest = TRUE;
4246*53ee8cc1Swenshuai.xi 
4247*53ee8cc1Swenshuai.xi     return TRUE;
4248*53ee8cc1Swenshuai.xi }
4249*53ee8cc1Swenshuai.xi #endif
4250*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB201X_Config(MS_U8 devID,MS_U8 u8DemodIndex,MS_U16 u16SymbolRate,eDMD_MSB201X_MODULATION_TYPE eQamMode,MS_U32 u32IFFreq,MS_BOOL bSpecInv)4251*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB201X_Config(MS_U8 devID, MS_U8 u8DemodIndex, MS_U16 u16SymbolRate, eDMD_MSB201X_MODULATION_TYPE eQamMode, MS_U32 u32IFFreq, MS_BOOL bSpecInv)
4252*53ee8cc1Swenshuai.xi {
4253*53ee8cc1Swenshuai.xi 
4254*53ee8cc1Swenshuai.xi     MS_U8              status = true;
4255*53ee8cc1Swenshuai.xi     MS_U8              reg_symrate_l, reg_symrate_h;
4256*53ee8cc1Swenshuai.xi     //MS_U16             u16Fc = 0;
4257*53ee8cc1Swenshuai.xi 
4258*53ee8cc1Swenshuai.xi     _MDrv_DMD_MSB201X_Select_Demod_RIU(devID, u8DemodIndex);
4259*53ee8cc1Swenshuai.xi     printf(" @_MDrv_DMD_MSB201X_Config, SR=%d, QAM=%d, u32IFFreq=%ld, bSpecInv=%d \n",u16SymbolRate,eQamMode,(long int)u32IFFreq,bSpecInv);
4260*53ee8cc1Swenshuai.xi     printf(" @_MDrv_DMD_MSB201X_Config, t = %ld\n",(long int)MsOS_GetSystemTime());
4261*53ee8cc1Swenshuai.xi     printf("set demod index=%d    dev_id=%d\n",u8DemodIndex,devID);
4262*53ee8cc1Swenshuai.xi 
4263*53ee8cc1Swenshuai.xi     reg_symrate_l = (MS_U8) (u16SymbolRate & 0xff);
4264*53ee8cc1Swenshuai.xi     reg_symrate_h = (MS_U8) (u16SymbolRate >> 8);
4265*53ee8cc1Swenshuai.xi 
4266*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_Restart(devID, u8DemodIndex);
4267*53ee8cc1Swenshuai.xi 
4268*53ee8cc1Swenshuai.xi 
4269*53ee8cc1Swenshuai.xi     if (eQamMode == DMD_DVBC_QAMAUTO)
4270*53ee8cc1Swenshuai.xi     {
4271*53ee8cc1Swenshuai.xi     	#ifdef MS_DEBUG
4272*53ee8cc1Swenshuai.xi         printf("DMD_DVBC_QAMAUTO\n");
4273*53ee8cc1Swenshuai.xi         #endif
4274*53ee8cc1Swenshuai.xi         status &= _MDrv_DMD_MSB201X_SetDSPReg(devID, u8DemodIndex, E_DMD_DVBC_OP_AUTO_SCAN_QAM, 0x01);
4275*53ee8cc1Swenshuai.xi         // give default value.
4276*53ee8cc1Swenshuai.xi         status &= _MDrv_DMD_MSB201X_SetDSPReg(devID, u8DemodIndex, E_DMD_DVBC_CFG_QAM, QAM);
4277*53ee8cc1Swenshuai.xi     }
4278*53ee8cc1Swenshuai.xi     else
4279*53ee8cc1Swenshuai.xi     {
4280*53ee8cc1Swenshuai.xi     	#ifdef MS_DEBUG
4281*53ee8cc1Swenshuai.xi         printf("DMD_DVBC_QAM %d\n", eQamMode);
4282*53ee8cc1Swenshuai.xi         #endif
4283*53ee8cc1Swenshuai.xi         status &= _MDrv_DMD_MSB201X_SetDSPReg(devID, u8DemodIndex, E_DMD_DVBC_OP_AUTO_SCAN_QAM, 0x00);
4284*53ee8cc1Swenshuai.xi         status &= _MDrv_DMD_MSB201X_SetDSPReg(devID, u8DemodIndex, E_DMD_DVBC_CFG_QAM, eQamMode);
4285*53ee8cc1Swenshuai.xi     }
4286*53ee8cc1Swenshuai.xi     		// auto symbol rate enable/disable
4287*53ee8cc1Swenshuai.xi     		#ifdef MS_DEBUG
4288*53ee8cc1Swenshuai.xi     		printf("u16SymbolRate %d\n", u16SymbolRate);
4289*53ee8cc1Swenshuai.xi 		#endif
4290*53ee8cc1Swenshuai.xi 		if (u16SymbolRate == 0)
4291*53ee8cc1Swenshuai.xi     {
4292*53ee8cc1Swenshuai.xi         status &= _MDrv_DMD_MSB201X_SetDSPReg(devID, u8DemodIndex, E_DMD_DVBC_OP_AUTO_SCAN_SYM_RATE, 0x01);
4293*53ee8cc1Swenshuai.xi     }
4294*53ee8cc1Swenshuai.xi     else
4295*53ee8cc1Swenshuai.xi     {
4296*53ee8cc1Swenshuai.xi       status &= _MDrv_DMD_MSB201X_SetDSPReg(devID, u8DemodIndex, E_DMD_DVBC_OP_AUTO_SCAN_SYM_RATE, 0x00);
4297*53ee8cc1Swenshuai.xi 	 		status &= _MDrv_DMD_MSB201X_SetDSPReg(devID, u8DemodIndex, E_DMD_DVBC_CFG_BW0_L, reg_symrate_l);
4298*53ee8cc1Swenshuai.xi 	 		status &= _MDrv_DMD_MSB201X_SetDSPReg(devID, u8DemodIndex, E_DMD_DVBC_CFG_BW0_H, reg_symrate_h);
4299*53ee8cc1Swenshuai.xi     }
4300*53ee8cc1Swenshuai.xi 
4301*53ee8cc1Swenshuai.xi 
4302*53ee8cc1Swenshuai.xi     // IQ Swap
4303*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_SetDSPReg(devID, u8DemodIndex, E_DMD_DVBC_CFG_IQ_SWAP, bSpecInv? 0x01:0x00);
4304*53ee8cc1Swenshuai.xi 
4305*53ee8cc1Swenshuai.xi     // Lif
4306*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_SetDSPReg(devID, u8DemodIndex, E_DMD_DVBC_OP_LIF_EN, (u32IFFreq < 10000) ? 1 : 0);
4307*53ee8cc1Swenshuai.xi     // Fif
4308*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_SetDSPReg(devID, u8DemodIndex, E_DMD_DVBC_CFG_FIF_L, (u32IFFreq)&0xff);
4309*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_SetDSPReg(devID, u8DemodIndex, E_DMD_DVBC_CFG_FIF_H, (u32IFFreq>>8)&0xff);
4310*53ee8cc1Swenshuai.xi 
4311*53ee8cc1Swenshuai.xi     status &= _MDrv_DMD_MSB201X_Active(devID, u8DemodIndex, TRUE);
4312*53ee8cc1Swenshuai.xi     return status;
4313*53ee8cc1Swenshuai.xi }
4314*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_SetConfig(MS_U8 devID,MS_U8 u8DemodIndex,MS_U16 u16SymbolRate,eDMD_MSB201X_MODULATION_TYPE eQamMode,MS_U32 u32IFFreq,MS_BOOL bSpecInv)4315*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_SetConfig(MS_U8 devID, MS_U8 u8DemodIndex, MS_U16 u16SymbolRate, eDMD_MSB201X_MODULATION_TYPE eQamMode, MS_U32 u32IFFreq, MS_BOOL bSpecInv)
4316*53ee8cc1Swenshuai.xi {
4317*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
4318*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
4319*53ee8cc1Swenshuai.xi 
4320*53ee8cc1Swenshuai.xi     DMD_LOCK();
4321*53ee8cc1Swenshuai.xi 
4322*53ee8cc1Swenshuai.xi #if 0
4323*53ee8cc1Swenshuai.xi     if (_sDMD_DVBC_InitData.u8DMD_DVBC_InitExt != NULL)
4324*53ee8cc1Swenshuai.xi     {
4325*53ee8cc1Swenshuai.xi         if (_sDMD_DVBC_InitData.u8DMD_DVBC_InitExt[0]>=1)
4326*53ee8cc1Swenshuai.xi         {
4327*53ee8cc1Swenshuai.xi             u8TSClk = _sDMD_DVBC_InitData.u8DMD_DVBC_InitExt[2];
4328*53ee8cc1Swenshuai.xi         }
4329*53ee8cc1Swenshuai.xi         else
4330*53ee8cc1Swenshuai.xi         {
4331*53ee8cc1Swenshuai.xi             u8TSClk = 0xFF; // parallel mode: 0x0513 => ts_clk=288/(2*(0x16+1))=6.26MHz //@@++--
4332*53ee8cc1Swenshuai.xi         }
4333*53ee8cc1Swenshuai.xi     }
4334*53ee8cc1Swenshuai.xi     else
4335*53ee8cc1Swenshuai.xi     {
4336*53ee8cc1Swenshuai.xi         u8TSClk = 0xFF; // parallel mode: 0x0513 => ts_clk=288/(2*(0x16+1))=6.26MHz //@@++--
4337*53ee8cc1Swenshuai.xi     }
4338*53ee8cc1Swenshuai.xi #endif
4339*53ee8cc1Swenshuai.xi     bRet=_MDrv_DMD_MSB201X_Config(devID, u8DemodIndex, u16SymbolRate, eQamMode, u32IFFreq, bSpecInv);
4340*53ee8cc1Swenshuai.xi     pDemod->sDMD_MSB201X_Info[u8DemodIndex].u16SymbolRate = u16SymbolRate;
4341*53ee8cc1Swenshuai.xi     pDemod->sDMD_MSB201X_Info[u8DemodIndex].eQamMode = eQamMode;
4342*53ee8cc1Swenshuai.xi     pDemod->sDMD_MSB201X_Info[u8DemodIndex].u32IFFreq = u32IFFreq;
4343*53ee8cc1Swenshuai.xi     pDemod->sDMD_MSB201X_Info[u8DemodIndex].bSpecInv = bSpecInv;
4344*53ee8cc1Swenshuai.xi     //pDemod->sDMD_MSB201X_Info.bSerialTS = bSerialTS;
4345*53ee8cc1Swenshuai.xi 
4346*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
4347*53ee8cc1Swenshuai.xi 
4348*53ee8cc1Swenshuai.xi     return bRet;
4349*53ee8cc1Swenshuai.xi }
4350*53ee8cc1Swenshuai.xi 
4351*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB201X_Power_On_Initialization(MS_U8 devID,MS_U8 u8DemodIndex)4352*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB201X_Power_On_Initialization(MS_U8 devID, MS_U8 u8DemodIndex)
4353*53ee8cc1Swenshuai.xi {
4354*53ee8cc1Swenshuai.xi     //MS_U8     status = TRUE;
4355*53ee8cc1Swenshuai.xi     tMSB201X_Demod_Data *pDemod = DEMOD_GET_ACTIVE_NODE(devID);
4356*53ee8cc1Swenshuai.xi     DMD_LOCK();
4357*53ee8cc1Swenshuai.xi 
4358*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
4359*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
4360*53ee8cc1Swenshuai.xi     #endif
4361*53ee8cc1Swenshuai.xi 
4362*53ee8cc1Swenshuai.xi     //_MSB201X_I2C_CH_Reset(devID, 3);
4363*53ee8cc1Swenshuai.xi 
4364*53ee8cc1Swenshuai.xi     //_MSB201X_I2C_CH_Reset(devID, 3);
4365*53ee8cc1Swenshuai.xi 
4366*53ee8cc1Swenshuai.xi     //_MDrv_DMD_MSB201X_InitClkgen(devID);
4367*53ee8cc1Swenshuai.xi 
4368*53ee8cc1Swenshuai.xi 
4369*53ee8cc1Swenshuai.xi     //_MDrv_DMD_MSB201X_TS_MUX_Serial(devID);
4370*53ee8cc1Swenshuai.xi 
4371*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
4372*53ee8cc1Swenshuai.xi     return TRUE;
4373*53ee8cc1Swenshuai.xi }
4374*53ee8cc1Swenshuai.xi 
4375*53ee8cc1Swenshuai.xi 
4376*53ee8cc1Swenshuai.xi 
4377*53ee8cc1Swenshuai.xi 
4378