xref: /utopia/UTPA2-700.0.x/modules/demodulator/drv/dvb_extdemod/drvDMD_EXTERN_MSB124x.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 "MsCommon.h"
109*53ee8cc1Swenshuai.xi #include "MsVersion.h"
110*53ee8cc1Swenshuai.xi #include "MsOS.h"
111*53ee8cc1Swenshuai.xi 
112*53ee8cc1Swenshuai.xi // Internal Definition
113*53ee8cc1Swenshuai.xi //#include "regCHIP.h"
114*53ee8cc1Swenshuai.xi //#include "regAVD.h"
115*53ee8cc1Swenshuai.xi //#include "mapi_tuner.h"
116*53ee8cc1Swenshuai.xi #include "drvSYS.h"
117*53ee8cc1Swenshuai.xi //#include "drvDMD_VD_MBX.h"
118*53ee8cc1Swenshuai.xi #include "drvDMD_EXTERN_MSB124x.h"
119*53ee8cc1Swenshuai.xi #include "include/drvDMD_common.h"
120*53ee8cc1Swenshuai.xi #include "include/drvSAR.h"
121*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
122*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
123*53ee8cc1Swenshuai.xi //  Driver Compiler Options
124*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
125*53ee8cc1Swenshuai.xi #define ERR_DEMOD_MSB(x)     x
126*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
127*53ee8cc1Swenshuai.xi #define DBG_DEMOD_MSB(x)      x
128*53ee8cc1Swenshuai.xi #define DBG_DEMOD_FLOW(x)     x
129*53ee8cc1Swenshuai.xi #define DBG_GET_SIGNAL(x)      // x
130*53ee8cc1Swenshuai.xi #define DBG_DEMOD_LOAD_I2C(x)       x
131*53ee8cc1Swenshuai.xi #define DBG_DEMOD_CHECKSUM(x)        // x
132*53ee8cc1Swenshuai.xi #define DBG_FLASH_WP(x)        // x
133*53ee8cc1Swenshuai.xi #endif
134*53ee8cc1Swenshuai.xi #define DBG_KIRIN_BOND(x)  //x
135*53ee8cc1Swenshuai.xi 
136*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
137*53ee8cc1Swenshuai.xi //  Local Defines
138*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
139*53ee8cc1Swenshuai.xi #define PRINTE(p) printf p
140*53ee8cc1Swenshuai.xi 
141*53ee8cc1Swenshuai.xi #define LOAD_CODE_I2C_BLOCK_NUM          0x400//0x80
142*53ee8cc1Swenshuai.xi #define REG_MB_CNTL     0x0C80
143*53ee8cc1Swenshuai.xi #define REG_MB_ADDR_L   0x0C84
144*53ee8cc1Swenshuai.xi #define REG_MB_ADDR_H   0x0C82
145*53ee8cc1Swenshuai.xi #define REG_MB_DATA     0x0C86
146*53ee8cc1Swenshuai.xi #define REG_FSM_EN       0x0CB8
147*53ee8cc1Swenshuai.xi 
148*53ee8cc1Swenshuai.xi #define resetDemodTime  50
149*53ee8cc1Swenshuai.xi #define waitFlashTime   50
150*53ee8cc1Swenshuai.xi 
151*53ee8cc1Swenshuai.xi #define SDRAM_DATA_CHECK                 0
152*53ee8cc1Swenshuai.xi #define SRAM_DATA_CHECK                0
153*53ee8cc1Swenshuai.xi #define SDRAM_BASE                       0x5000
154*53ee8cc1Swenshuai.xi #define SRAM_BASE                        0x8000
155*53ee8cc1Swenshuai.xi #define SPI_DEVICE_BUFFER_SIZE           256
156*53ee8cc1Swenshuai.xi #define MAX_MSB124X_LIB_LEN              131072
157*53ee8cc1Swenshuai.xi 
158*53ee8cc1Swenshuai.xi #define MSB124X_BOOT  0x01
159*53ee8cc1Swenshuai.xi #define MSB124X_DVBT2 0x02
160*53ee8cc1Swenshuai.xi #define MSB124X_DVBT  0x04
161*53ee8cc1Swenshuai.xi #define MSB124X_DVBC  0x08
162*53ee8cc1Swenshuai.xi #define MSB124X_DVBS2 0x10
163*53ee8cc1Swenshuai.xi #define MSB124X_ALL   0x0F
164*53ee8cc1Swenshuai.xi 
165*53ee8cc1Swenshuai.xi #define MSB124X_BOOT_START_ADDR     0x00000
166*53ee8cc1Swenshuai.xi #define MSB124X_BOOT_END_ADDR       0x007FF
167*53ee8cc1Swenshuai.xi #define MSB124X_DVBT2_P1_START_ADDR 0x00800
168*53ee8cc1Swenshuai.xi #define MSB124X_DVBT2_P1_END_ADDR   0x087FF
169*53ee8cc1Swenshuai.xi #define MSB124X_DVBT2_P2_START_ADDR 0x08800
170*53ee8cc1Swenshuai.xi #define MSB124X_DVBT2_P2_END_ADDR   0x0FFFF
171*53ee8cc1Swenshuai.xi #define MSB124X_DVBT_START_ADDR     0x10000
172*53ee8cc1Swenshuai.xi #define MSB124X_DVBT_END_ADDR       0x17FFF
173*53ee8cc1Swenshuai.xi #define MSB124X_DVBC_START_ADDR     0x18000
174*53ee8cc1Swenshuai.xi #define MSB124X_DVBC_END_ADDR       0x1FFFF
175*53ee8cc1Swenshuai.xi #define MSB124X_DVBS2_P1_START_ADDR    0x20000
176*53ee8cc1Swenshuai.xi #define MSB124X_DVBS2_P1_END_ADDR      0x27FFF
177*53ee8cc1Swenshuai.xi #define MSB124X_DVBS2_P2_START_ADDR    0x28000
178*53ee8cc1Swenshuai.xi #define MSB124X_DVBS2_P2_END_ADDR      0x28FFF
179*53ee8cc1Swenshuai.xi 
180*53ee8cc1Swenshuai.xi 
181*53ee8cc1Swenshuai.xi #define MSB124X_WINDOWS_BASE                0x100
182*53ee8cc1Swenshuai.xi #define MSB124X_BOOT_WINDOWS_OFFSET         MSB124X_WINDOWS_BASE
183*53ee8cc1Swenshuai.xi #define MSB124X_DVBT2_P2_WINDOWS_OFFSET    (MSB124X_WINDOWS_BASE + 0x08)
184*53ee8cc1Swenshuai.xi #define MSB124X_DVBT2_P1_WINDOWS_OFFSET    (MSB124X_DVBT2_P2_WINDOWS_OFFSET + 0x08)
185*53ee8cc1Swenshuai.xi #define MSB124X_DVBT_WINDOWS_OFFSET        (MSB124X_DVBT2_P1_WINDOWS_OFFSET + 0x08)
186*53ee8cc1Swenshuai.xi #define MSB124X_DVBC_WINDOWS_OFFSET        (MSB124X_DVBT_WINDOWS_OFFSET + 0x08)
187*53ee8cc1Swenshuai.xi #define MSB124X_DVBS2_P2_WINDOWS_OFFSET       (MSB124X_DVBC_WINDOWS_OFFSET + 0x08)
188*53ee8cc1Swenshuai.xi #define MSB124X_DVBS2_P1_WINDOWS_OFFSET       (MSB124X_DVBS2_P2_WINDOWS_OFFSET + 0x08)
189*53ee8cc1Swenshuai.xi 
190*53ee8cc1Swenshuai.xi #define MSB124X_MAX_FLASH_ON_RETRY_NUM 3
191*53ee8cc1Swenshuai.xi 
192*53ee8cc1Swenshuai.xi #define UNUSED(x)       (x=x)
193*53ee8cc1Swenshuai.xi 
194*53ee8cc1Swenshuai.xi /////////////// CONSTANT /////////////////
195*53ee8cc1Swenshuai.xi #define PAGE_WRITE_SIZE         256
196*53ee8cc1Swenshuai.xi #define VERSION_CODE_ADDR       0xFC0
197*53ee8cc1Swenshuai.xi #define VERSION_CODE_SIZE       32
198*53ee8cc1Swenshuai.xi 
199*53ee8cc1Swenshuai.xi 
200*53ee8cc1Swenshuai.xi //kirin bonding option
201*53ee8cc1Swenshuai.xi #define DRV_RIU_ReadByte(_u32addr)	(*(volatile MS_U32*)(_u32addr) )
202*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
203*53ee8cc1Swenshuai.xi //  Local Structurs
204*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
205*53ee8cc1Swenshuai.xi 
206*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
207*53ee8cc1Swenshuai.xi //  Global Variables
208*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
209*53ee8cc1Swenshuai.xi #if 1
210*53ee8cc1Swenshuai.xi 
211*53ee8cc1Swenshuai.xi #define DMD_LOCK() _Lock()
212*53ee8cc1Swenshuai.xi #define DMD_UNLOCK()  _UnLock()
213*53ee8cc1Swenshuai.xi 
214*53ee8cc1Swenshuai.xi #else
215*53ee8cc1Swenshuai.xi #define DMD_LOCK()      \
216*53ee8cc1Swenshuai.xi     do{                         \
217*53ee8cc1Swenshuai.xi         MS_ASSERT(MsOS_In_Interrupt() == FALSE); \
218*53ee8cc1Swenshuai.xi         if (eDMD_MSB124X_DbgLevel == E_DMD_MSB124X_DBGLV_DEBUG) printf("%s lock mutex\n", __FUNCTION__);\
219*53ee8cc1Swenshuai.xi         MsOS_ObtainMutex(pDemod->_s32DMD_Mutex, MSOS_WAIT_FOREVER);\
220*53ee8cc1Swenshuai.xi         }while(0)
221*53ee8cc1Swenshuai.xi 
222*53ee8cc1Swenshuai.xi #define DMD_UNLOCK()      \
223*53ee8cc1Swenshuai.xi     do{                         \
224*53ee8cc1Swenshuai.xi         MsOS_ReleaseMutex(pDemod->_s32DMD_Mutex);\
225*53ee8cc1Swenshuai.xi         if (eDMD_MSB124X_DbgLevel == E_DMD_MSB124X_DBGLV_DEBUG) printf("%s unlock mutex\n", __FUNCTION__); \
226*53ee8cc1Swenshuai.xi         }while(0)
227*53ee8cc1Swenshuai.xi #endif
228*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
229*53ee8cc1Swenshuai.xi //  Local Variables
230*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
231*53ee8cc1Swenshuai.xi #if 1
232*53ee8cc1Swenshuai.xi static MSIF_Version _drv_dmd_msb124x_extern_version = {
233*53ee8cc1Swenshuai.xi     .MW = { DMD_MSB124X_EXTERN_VER, },
234*53ee8cc1Swenshuai.xi };
235*53ee8cc1Swenshuai.xi #else
236*53ee8cc1Swenshuai.xi static MSIF_Version _drv_dmd_msb123x_extern_version;
237*53ee8cc1Swenshuai.xi #endif
238*53ee8cc1Swenshuai.xi 
239*53ee8cc1Swenshuai.xi #define DEMOD_MAX_INSTANCE 2
240*53ee8cc1Swenshuai.xi #define DEMOD_GET_ACTIVE_NODE() &_gDemodNode[_gActiveInstanceIndex]
241*53ee8cc1Swenshuai.xi 
242*53ee8cc1Swenshuai.xi 
243*53ee8cc1Swenshuai.xi #if (defined CONFIG_EXT_DVBS_DISABLE) && (CONFIG_EXT_DVBS_DISABLE==1)
244*53ee8cc1Swenshuai.xi MS_U8 MSB124X_LIB[]={
245*53ee8cc1Swenshuai.xi #include "msb124x_dvbt.dat"
246*53ee8cc1Swenshuai.xi };
247*53ee8cc1Swenshuai.xi #else
248*53ee8cc1Swenshuai.xi MS_U8 MSB124X_LIB[]={
249*53ee8cc1Swenshuai.xi #include "msb124x_dvbs_s2_t_t2.dat"
250*53ee8cc1Swenshuai.xi };
251*53ee8cc1Swenshuai.xi #endif
252*53ee8cc1Swenshuai.xi 
253*53ee8cc1Swenshuai.xi MS_U8 MSB1245_LIB[]=
254*53ee8cc1Swenshuai.xi {
255*53ee8cc1Swenshuai.xi #include "msb1245_dvbs.dat"
256*53ee8cc1Swenshuai.xi };
257*53ee8cc1Swenshuai.xi //configure
258*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------- for DVB-T2
259*53ee8cc1Swenshuai.xi // BW: 0->1.7M, 1->5M, 2->6M, 3->7M, 4->8M, 5->10M
260*53ee8cc1Swenshuai.xi #define T2_BW_VAL               0x04
261*53ee8cc1Swenshuai.xi 
262*53ee8cc1Swenshuai.xi // FC: FC = FS = 4800 = 0x12C0     (4.80MHz IF)
263*53ee8cc1Swenshuai.xi #define T2_FC_L_VAL            0xC0    // 4.80M
264*53ee8cc1Swenshuai.xi #define T2_FC_H_VAL            0x12
265*53ee8cc1Swenshuai.xi #define T2_TS_SERIAL_VAL        0x00
266*53ee8cc1Swenshuai.xi #define T2_TS_CLK_RATE_VAL      0x06
267*53ee8cc1Swenshuai.xi #define T2_TS_OUT_INV_VAL       0x01
268*53ee8cc1Swenshuai.xi #define T2_TS_DATA_SWAP_VAL     0x00
269*53ee8cc1Swenshuai.xi #define T2_TS_ERR_POL_VAL       0x00
270*53ee8cc1Swenshuai.xi 
271*53ee8cc1Swenshuai.xi #define T2_TS_SPREAD_SPAN          0x00 //Unit: kHz (0: disable; default: 40 kHz)
272*53ee8cc1Swenshuai.xi #define T2_TS_SPREAD_STEP_SIZE    0x00 //Unit: percent(%) (0: disable; default: 3.0 %)
273*53ee8cc1Swenshuai.xi 
274*53ee8cc1Swenshuai.xi #define T2_TS_PHASE_TUNING_EN     0x00 //0: disable; 1: enable
275*53ee8cc1Swenshuai.xi #define T2_TS_PHASE_TUNING_NUM    0x00 //Unit: degree  <range: 0x00 ~ 0x1F>
276*53ee8cc1Swenshuai.xi 
277*53ee8cc1Swenshuai.xi 
278*53ee8cc1Swenshuai.xi MS_U8 MSB124X_DVBT2_DSPREG_TABLE[] =
279*53ee8cc1Swenshuai.xi {
280*53ee8cc1Swenshuai.xi     T2_BW_VAL, T2_FC_L_VAL, T2_FC_H_VAL,  T2_TS_SERIAL_VAL, T2_TS_CLK_RATE_VAL,
281*53ee8cc1Swenshuai.xi     T2_TS_OUT_INV_VAL, T2_TS_DATA_SWAP_VAL, T2_TS_ERR_POL_VAL,
282*53ee8cc1Swenshuai.xi     T2_TS_SPREAD_SPAN,T2_TS_SPREAD_STEP_SIZE,T2_TS_PHASE_TUNING_EN,T2_TS_PHASE_TUNING_NUM
283*53ee8cc1Swenshuai.xi };
284*53ee8cc1Swenshuai.xi 
285*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------- for DVB-T
286*53ee8cc1Swenshuai.xi //operation
287*53ee8cc1Swenshuai.xi 
288*53ee8cc1Swenshuai.xi //configure
289*53ee8cc1Swenshuai.xi #define T_FC_L                    0xc0
290*53ee8cc1Swenshuai.xi #define T_FC_H                    0x12
291*53ee8cc1Swenshuai.xi #define T_FS_L                    0x80
292*53ee8cc1Swenshuai.xi #define T_FS_H                    0x70
293*53ee8cc1Swenshuai.xi #define T_BW                      0x03
294*53ee8cc1Swenshuai.xi #define T_IQ_SWAP                 0x00
295*53ee8cc1Swenshuai.xi #define T_SERIAL_TS               0x00
296*53ee8cc1Swenshuai.xi #define T_TS_CLK_SEL              0x06
297*53ee8cc1Swenshuai.xi #define T_TS_OUT_INV              0x01
298*53ee8cc1Swenshuai.xi #define T_TS_DATA_SWAP            0x00
299*53ee8cc1Swenshuai.xi #define T_IF_INV_PWM_OUT_EN  0x00
300*53ee8cc1Swenshuai.xi 
301*53ee8cc1Swenshuai.xi #define T_TS_SPREAD_SPAN          0x00   //Unit: kHz (0: disable; default: 40 kHz)
302*53ee8cc1Swenshuai.xi #define T_TS_SPREAD_STEP_SIZE    0x00   //Unit: percent(%) (0: disable; default: 3.0 %)
303*53ee8cc1Swenshuai.xi 
304*53ee8cc1Swenshuai.xi #define T_TS_PHASE_TUNING_EN     0x00 //0: disable; 1: enable
305*53ee8cc1Swenshuai.xi #define T_TS_PHASE_TUNING_NUM    0x00 //Unit: degree  <range: 0x00 ~ 0x1F>
306*53ee8cc1Swenshuai.xi 
307*53ee8cc1Swenshuai.xi MS_U8 MSB124X_DVBT_DSPREG_TABLE[] =
308*53ee8cc1Swenshuai.xi {
309*53ee8cc1Swenshuai.xi     T_BW,  T_FC_L,  T_FC_H,  T_SERIAL_TS,  T_TS_CLK_SEL,  T_TS_OUT_INV,  T_TS_DATA_SWAP,
310*53ee8cc1Swenshuai.xi     T_IQ_SWAP,  T_IF_INV_PWM_OUT_EN,
311*53ee8cc1Swenshuai.xi     T_TS_SPREAD_SPAN,T_TS_SPREAD_STEP_SIZE,T_TS_PHASE_TUNING_EN,T_TS_PHASE_TUNING_NUM
312*53ee8cc1Swenshuai.xi };
313*53ee8cc1Swenshuai.xi 
314*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------- for DVB-C
315*53ee8cc1Swenshuai.xi #define     C_AUTO_SCAN_SYM_RATE    1
316*53ee8cc1Swenshuai.xi #define     C_AUTO_SCAN_QAM	        1
317*53ee8cc1Swenshuai.xi #define     C_IF_INV_PWM_OUT_EN     0
318*53ee8cc1Swenshuai.xi #define     C_ZIF                   0
319*53ee8cc1Swenshuai.xi #define     C_FC_L                  0x88
320*53ee8cc1Swenshuai.xi #define     C_FC_H                  0x13
321*53ee8cc1Swenshuai.xi #define     C_FS_L                  0xC0
322*53ee8cc1Swenshuai.xi #define     C_FS_H                  0x5D
323*53ee8cc1Swenshuai.xi #define     C_BW_L                  0xDB
324*53ee8cc1Swenshuai.xi #define     C_BW_H                  0x1A
325*53ee8cc1Swenshuai.xi #define     C_BW1_L                 0xF4
326*53ee8cc1Swenshuai.xi #define     C_BW1_H                 0x1A
327*53ee8cc1Swenshuai.xi #define     C_BW2_L                 0xDB
328*53ee8cc1Swenshuai.xi #define     C_BW2_H                 0x1A
329*53ee8cc1Swenshuai.xi #define     C_BW3_L                 0x58
330*53ee8cc1Swenshuai.xi #define     C_BW3_H                 0x1B
331*53ee8cc1Swenshuai.xi #define     C_QAM                   2
332*53ee8cc1Swenshuai.xi #define     C_CCI                   0
333*53ee8cc1Swenshuai.xi #define     C_TS_SERIAL             0
334*53ee8cc1Swenshuai.xi #define     C_TS_CLK_RATE           6
335*53ee8cc1Swenshuai.xi #define     C_TS_OUT_INV            1
336*53ee8cc1Swenshuai.xi #define     C_TS_DATA_SWAP          0
337*53ee8cc1Swenshuai.xi #define     C_IQ_SWAP               0
338*53ee8cc1Swenshuai.xi #define     C_TS_SPREAD_SPAN          0x00 //Unit: kHz (0: disable; default: 40 kHz)
339*53ee8cc1Swenshuai.xi #define     C_TS_SPREAD_STEP_SIZE    0x00 //Unit: percent(%) (0: disable; default: 3.0 %)
340*53ee8cc1Swenshuai.xi 
341*53ee8cc1Swenshuai.xi #define     C_TS_PHASE_TUNING_EN     0x00 //0: disable; 1: enable
342*53ee8cc1Swenshuai.xi #define     C_TS_PHASE_TUNING_NUM    0x00 //Unit: degree  <range: 0x00 ~ 0x1F>
343*53ee8cc1Swenshuai.xi 
344*53ee8cc1Swenshuai.xi MS_U8 MSB124X_DVBC_DSPREG_TABLE[] =
345*53ee8cc1Swenshuai.xi {
346*53ee8cc1Swenshuai.xi     C_AUTO_SCAN_SYM_RATE,  //0x20
347*53ee8cc1Swenshuai.xi     C_AUTO_SCAN_QAM,
348*53ee8cc1Swenshuai.xi     C_IF_INV_PWM_OUT_EN,
349*53ee8cc1Swenshuai.xi     C_ZIF,
350*53ee8cc1Swenshuai.xi     C_FC_L,
351*53ee8cc1Swenshuai.xi     C_FC_H,
352*53ee8cc1Swenshuai.xi     C_FS_L,
353*53ee8cc1Swenshuai.xi     C_FS_H,
354*53ee8cc1Swenshuai.xi 
355*53ee8cc1Swenshuai.xi     C_BW_L,             //0x28
356*53ee8cc1Swenshuai.xi     C_BW_H,
357*53ee8cc1Swenshuai.xi     C_BW1_L,
358*53ee8cc1Swenshuai.xi     C_BW1_H,
359*53ee8cc1Swenshuai.xi     C_BW2_L,
360*53ee8cc1Swenshuai.xi     C_BW2_H,
361*53ee8cc1Swenshuai.xi     C_BW3_L,
362*53ee8cc1Swenshuai.xi     C_BW3_H,
363*53ee8cc1Swenshuai.xi 
364*53ee8cc1Swenshuai.xi     C_QAM,               //0x30
365*53ee8cc1Swenshuai.xi     C_CCI,
366*53ee8cc1Swenshuai.xi     C_TS_SERIAL,
367*53ee8cc1Swenshuai.xi     C_TS_CLK_RATE,
368*53ee8cc1Swenshuai.xi     C_TS_OUT_INV,
369*53ee8cc1Swenshuai.xi     C_TS_DATA_SWAP,
370*53ee8cc1Swenshuai.xi     C_IQ_SWAP,
371*53ee8cc1Swenshuai.xi };
372*53ee8cc1Swenshuai.xi 
373*53ee8cc1Swenshuai.xi typedef struct xMSB124XData
374*53ee8cc1Swenshuai.xi {
375*53ee8cc1Swenshuai.xi     MS_BOOL Active;
376*53ee8cc1Swenshuai.xi     MS_BOOL bDMD_MSB124X_Power_init_en;
377*53ee8cc1Swenshuai.xi     MS_U8 u8DMD_MSB124X_PowerOnInitialization_Flow;
378*53ee8cc1Swenshuai.xi     MS_U8 u8DMD_MSB124X_Sdram_Code;
379*53ee8cc1Swenshuai.xi     MS_U8 u8DMD_MSB124X_Sram_Code;
380*53ee8cc1Swenshuai.xi     sDMD_MSB124X_InitData _sDMD_MSB124X_InitData;
381*53ee8cc1Swenshuai.xi     eDMD_MSB124X_DemodulatorType eDMD_MSB124X_CurrentDemodulatorType;
382*53ee8cc1Swenshuai.xi     MS_BOOL bDemodRest;
383*53ee8cc1Swenshuai.xi     MS_U8 DVBT2_DSP_REG[sizeof(MSB124X_DVBT2_DSPREG_TABLE)];
384*53ee8cc1Swenshuai.xi     MS_U8 DVBT_DSP_REG[sizeof(MSB124X_DVBT_DSPREG_TABLE)];
385*53ee8cc1Swenshuai.xi     MS_U8 DVBC_DSP_REG[sizeof(MSB124X_DVBC_DSPREG_TABLE)];
386*53ee8cc1Swenshuai.xi }tMSB124XData;
387*53ee8cc1Swenshuai.xi 
388*53ee8cc1Swenshuai.xi static MS_S32 _gActiveInstanceIndex = 0;
389*53ee8cc1Swenshuai.xi static eDMD_MSB124X_DbgLv eDMD_MSB124X_DbgLevel=E_DMD_MSB124X_DBGLV_NONE;
390*53ee8cc1Swenshuai.xi static tMSB124XData _gDemodNode[DEMOD_MAX_INSTANCE]=
391*53ee8cc1Swenshuai.xi {
392*53ee8cc1Swenshuai.xi   {FALSE, FALSE, 0, 0, 0, {0}, E_DMD_MSB124X_DEMOD_DVBT,TRUE,{0},{0},{0}},
393*53ee8cc1Swenshuai.xi   {FALSE, FALSE, 0, 0, 0, {0}, E_DMD_MSB124X_DEMOD_DVBT,TRUE,{0},{0},{0}},
394*53ee8cc1Swenshuai.xi };
395*53ee8cc1Swenshuai.xi 
396*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
397*53ee8cc1Swenshuai.xi //  Debug Functions
398*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
399*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
400*53ee8cc1Swenshuai.xi #define DMD_DBG(x)          (x)
401*53ee8cc1Swenshuai.xi #else
402*53ee8cc1Swenshuai.xi #define DMD_DBG(x)          //(x)
403*53ee8cc1Swenshuai.xi #endif
404*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
405*53ee8cc1Swenshuai.xi //  Local Functions
406*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
407*53ee8cc1Swenshuai.xi static MS_S32 _s32DMD_Mutex = -1;
408*53ee8cc1Swenshuai.xi static MS_S32 _s32LockOwner = -1;
409*53ee8cc1Swenshuai.xi static MS_S32 _sLockCount = 0;
_Lock(void)410*53ee8cc1Swenshuai.xi static void _Lock(void)
411*53ee8cc1Swenshuai.xi {
412*53ee8cc1Swenshuai.xi     MS_S32 s32CurTaskId = MsOS_GetOSThreadID();
413*53ee8cc1Swenshuai.xi 
414*53ee8cc1Swenshuai.xi     if(_s32DMD_Mutex == -1)
415*53ee8cc1Swenshuai.xi     {
416*53ee8cc1Swenshuai.xi         return;
417*53ee8cc1Swenshuai.xi     }
418*53ee8cc1Swenshuai.xi 
419*53ee8cc1Swenshuai.xi     if (_s32LockOwner == s32CurTaskId)
420*53ee8cc1Swenshuai.xi     {
421*53ee8cc1Swenshuai.xi          _sLockCount++;
422*53ee8cc1Swenshuai.xi     }
423*53ee8cc1Swenshuai.xi     else
424*53ee8cc1Swenshuai.xi     {
425*53ee8cc1Swenshuai.xi 
426*53ee8cc1Swenshuai.xi         MsOS_ObtainMutex(_s32DMD_Mutex, MSOS_WAIT_FOREVER);
427*53ee8cc1Swenshuai.xi         //printf("m_CircularMutex lock\n");
428*53ee8cc1Swenshuai.xi         _sLockCount = 1;
429*53ee8cc1Swenshuai.xi         _s32LockOwner  = s32CurTaskId;
430*53ee8cc1Swenshuai.xi     }
431*53ee8cc1Swenshuai.xi }
_UnLock(void)432*53ee8cc1Swenshuai.xi static void _UnLock(void)
433*53ee8cc1Swenshuai.xi {
434*53ee8cc1Swenshuai.xi     MS_S32 s32CurTaskId = MsOS_GetOSThreadID();
435*53ee8cc1Swenshuai.xi 
436*53ee8cc1Swenshuai.xi     if(_s32DMD_Mutex == -1)
437*53ee8cc1Swenshuai.xi     {
438*53ee8cc1Swenshuai.xi         return;
439*53ee8cc1Swenshuai.xi     }
440*53ee8cc1Swenshuai.xi     if (s32CurTaskId == _s32LockOwner)
441*53ee8cc1Swenshuai.xi     {
442*53ee8cc1Swenshuai.xi        if (--_sLockCount == 0)
443*53ee8cc1Swenshuai.xi        {
444*53ee8cc1Swenshuai.xi            _s32LockOwner = -1;
445*53ee8cc1Swenshuai.xi            //printf("m_CircularMutex unlock\n");
446*53ee8cc1Swenshuai.xi            MsOS_ReleaseMutex(_s32DMD_Mutex);
447*53ee8cc1Swenshuai.xi        }
448*53ee8cc1Swenshuai.xi     }
449*53ee8cc1Swenshuai.xi 
450*53ee8cc1Swenshuai.xi }
451*53ee8cc1Swenshuai.xi 
452*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
453*53ee8cc1Swenshuai.xi //  Global Functions
454*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
455*53ee8cc1Swenshuai.xi #define INDEX_TO_HANDLE(x) ((x)+1)
456*53ee8cc1Swenshuai.xi #define HANDLE_TO_INDEX(x) ((x)-1)
457*53ee8cc1Swenshuai.xi //If using legacy API, mutex is created in Init and deleted in Exit
458*53ee8cc1Swenshuai.xi //If using New API(EX API), mutex is created in CreateNode and deleted in DeleteNode
459*53ee8cc1Swenshuai.xi //Add _CreateMutex, called in Init and CreateNode
_CreateMutex(void)460*53ee8cc1Swenshuai.xi static MS_BOOL _CreateMutex(void)
461*53ee8cc1Swenshuai.xi {
462*53ee8cc1Swenshuai.xi     if (_s32DMD_Mutex == -1)
463*53ee8cc1Swenshuai.xi     {
464*53ee8cc1Swenshuai.xi         _sLockCount = 0;
465*53ee8cc1Swenshuai.xi         _s32LockOwner = -1;
466*53ee8cc1Swenshuai.xi         _s32DMD_Mutex = MsOS_CreateMutex(E_MSOS_FIFO, "_utopia_124x", MSOS_PROCESS_SHARED);
467*53ee8cc1Swenshuai.xi         if (_s32DMD_Mutex == -1)
468*53ee8cc1Swenshuai.xi         {
469*53ee8cc1Swenshuai.xi              DMD_DBG(printf(" Create Mutex Fail\n"));
470*53ee8cc1Swenshuai.xi              return FALSE;
471*53ee8cc1Swenshuai.xi         }
472*53ee8cc1Swenshuai.xi     }
473*53ee8cc1Swenshuai.xi     return TRUE;
474*53ee8cc1Swenshuai.xi }
475*53ee8cc1Swenshuai.xi //Add _DeleteMutex, called in Exit and DeleteNode
476*53ee8cc1Swenshuai.xi 
_DeleteMutex(void)477*53ee8cc1Swenshuai.xi static MS_BOOL _DeleteMutex(void)
478*53ee8cc1Swenshuai.xi {
479*53ee8cc1Swenshuai.xi     int i=0;
480*53ee8cc1Swenshuai.xi     for(i=0; i<DEMOD_MAX_INSTANCE; i++)
481*53ee8cc1Swenshuai.xi     {
482*53ee8cc1Swenshuai.xi         //still having active instance, no need to DeleteMutex
483*53ee8cc1Swenshuai.xi         if(_gDemodNode[i].Active == TRUE)
484*53ee8cc1Swenshuai.xi         {
485*53ee8cc1Swenshuai.xi             return TRUE;
486*53ee8cc1Swenshuai.xi         }
487*53ee8cc1Swenshuai.xi     }
488*53ee8cc1Swenshuai.xi     if (_s32DMD_Mutex != -1)
489*53ee8cc1Swenshuai.xi     {
490*53ee8cc1Swenshuai.xi         MsOS_DeleteMutex(_s32DMD_Mutex);
491*53ee8cc1Swenshuai.xi         _s32DMD_Mutex = -1;
492*53ee8cc1Swenshuai.xi         _sLockCount = 0;
493*53ee8cc1Swenshuai.xi         _s32LockOwner = -1;
494*53ee8cc1Swenshuai.xi     }
495*53ee8cc1Swenshuai.xi     return TRUE;
496*53ee8cc1Swenshuai.xi }
497*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_SwitchHandle(MS_S32 s32Handle)498*53ee8cc1Swenshuai.xi extern MS_BOOL MDrv_DMD_MSB124X_SwitchHandle(MS_S32 s32Handle)
499*53ee8cc1Swenshuai.xi {
500*53ee8cc1Swenshuai.xi     MS_S32 s32Index = HANDLE_TO_INDEX(s32Handle);
501*53ee8cc1Swenshuai.xi     if(s32Index>=DEMOD_MAX_INSTANCE)
502*53ee8cc1Swenshuai.xi         return FALSE;
503*53ee8cc1Swenshuai.xi     if(s32Index<0)
504*53ee8cc1Swenshuai.xi         return FALSE;
505*53ee8cc1Swenshuai.xi     _gActiveInstanceIndex =s32Index;
506*53ee8cc1Swenshuai.xi     return TRUE;
507*53ee8cc1Swenshuai.xi }
MDrv_DMD_MSB124X_GetCurrentHandle(void)508*53ee8cc1Swenshuai.xi extern MS_S32 MDrv_DMD_MSB124X_GetCurrentHandle(void)
509*53ee8cc1Swenshuai.xi {
510*53ee8cc1Swenshuai.xi     return INDEX_TO_HANDLE(_gActiveInstanceIndex);
511*53ee8cc1Swenshuai.xi }
MDrv_MDM_MSB124X_CreateNode(MS_S32 * s32Handle)512*53ee8cc1Swenshuai.xi extern MS_BOOL MDrv_MDM_MSB124X_CreateNode(MS_S32 *s32Handle)
513*53ee8cc1Swenshuai.xi {
514*53ee8cc1Swenshuai.xi     int i=0;
515*53ee8cc1Swenshuai.xi     if(_CreateMutex() == FALSE)
516*53ee8cc1Swenshuai.xi     {
517*53ee8cc1Swenshuai.xi         return FALSE;
518*53ee8cc1Swenshuai.xi     }
519*53ee8cc1Swenshuai.xi     for(i=0; i<DEMOD_MAX_INSTANCE; i++)
520*53ee8cc1Swenshuai.xi     {
521*53ee8cc1Swenshuai.xi         if(_gDemodNode[i].Active == FALSE)
522*53ee8cc1Swenshuai.xi         {
523*53ee8cc1Swenshuai.xi             _gDemodNode[i].Active  = TRUE;
524*53ee8cc1Swenshuai.xi             *s32Handle = INDEX_TO_HANDLE(i);
525*53ee8cc1Swenshuai.xi             return TRUE;
526*53ee8cc1Swenshuai.xi         }
527*53ee8cc1Swenshuai.xi     }
528*53ee8cc1Swenshuai.xi     printf("Slot Full\n");
529*53ee8cc1Swenshuai.xi     return FALSE;
530*53ee8cc1Swenshuai.xi }
MDrv_MDM_MSB124X_DeleteNode(MS_S32 s32Handle)531*53ee8cc1Swenshuai.xi extern MS_BOOL MDrv_MDM_MSB124X_DeleteNode(MS_S32 s32Handle)
532*53ee8cc1Swenshuai.xi {
533*53ee8cc1Swenshuai.xi     MS_S32 s32Index = HANDLE_TO_INDEX(s32Handle);
534*53ee8cc1Swenshuai.xi     if(s32Index>=DEMOD_MAX_INSTANCE)
535*53ee8cc1Swenshuai.xi         return FALSE;
536*53ee8cc1Swenshuai.xi     if(s32Index<0)
537*53ee8cc1Swenshuai.xi         return FALSE;
538*53ee8cc1Swenshuai.xi     if(_gDemodNode[s32Index].Active == TRUE)
539*53ee8cc1Swenshuai.xi     {
540*53ee8cc1Swenshuai.xi         _gDemodNode[s32Index].Active  = FALSE;
541*53ee8cc1Swenshuai.xi         _DeleteMutex();
542*53ee8cc1Swenshuai.xi         return TRUE;
543*53ee8cc1Swenshuai.xi     }
544*53ee8cc1Swenshuai.xi     return FALSE;
545*53ee8cc1Swenshuai.xi }
546*53ee8cc1Swenshuai.xi 
547*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_Init(sDMD_MSB124X_InitData * pDMD_MSB124X_InitData,MS_U32 u32InitDataLen)548*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_Init(sDMD_MSB124X_InitData *pDMD_MSB124X_InitData, MS_U32 u32InitDataLen)
549*53ee8cc1Swenshuai.xi {
550*53ee8cc1Swenshuai.xi     //char pDMD_MSB124X_MutexString[16], pDMD_MSB124X_MutexString_RegRW[16], pDMD_MSB124X_MutexString_DSPRegRW[16];
551*53ee8cc1Swenshuai.xi     //char pDMD_MSB124X_MutexString[16];
552*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
553*53ee8cc1Swenshuai.xi 
554*53ee8cc1Swenshuai.xi     //if (NULL == strncpy(pDMD_MSB124X_MutexString,"Mutex DMD DVB",16))
555*53ee8cc1Swenshuai.xi     //{
556*53ee8cc1Swenshuai.xi        // DMD_DBG(printf("MDrv_DMD_MSB124X_Init strcpy Fail\n"));
557*53ee8cc1Swenshuai.xi         //return FALSE;
558*53ee8cc1Swenshuai.xi     //}
559*53ee8cc1Swenshuai.xi 
560*53ee8cc1Swenshuai.xi     if(_CreateMutex() == FALSE)
561*53ee8cc1Swenshuai.xi     {
562*53ee8cc1Swenshuai.xi         DMD_DBG(printf("MDrv_DMD_MSB124X_Init Create Mutex Fail\n"));
563*53ee8cc1Swenshuai.xi         return FALSE;
564*53ee8cc1Swenshuai.xi     }
565*53ee8cc1Swenshuai.xi 
566*53ee8cc1Swenshuai.xi     DMD_LOCK();
567*53ee8cc1Swenshuai.xi     if ( sizeof(sDMD_MSB124X_InitData) == u32InitDataLen)
568*53ee8cc1Swenshuai.xi     {
569*53ee8cc1Swenshuai.xi         memcpy(&pDemod->_sDMD_MSB124X_InitData, pDMD_MSB124X_InitData, u32InitDataLen);
570*53ee8cc1Swenshuai.xi     }
571*53ee8cc1Swenshuai.xi     else
572*53ee8cc1Swenshuai.xi     {
573*53ee8cc1Swenshuai.xi         DMD_DBG(printf("MDrv_DMD_MSB124X_Init input data structure incorrect\n"));
574*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
575*53ee8cc1Swenshuai.xi         return FALSE;
576*53ee8cc1Swenshuai.xi     }
577*53ee8cc1Swenshuai.xi 
578*53ee8cc1Swenshuai.xi     if (pDemod->_sDMD_MSB124X_InitData.pDVBC_DSP_REG!= NULL)
579*53ee8cc1Swenshuai.xi     {
580*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB124X_Init Init DVBC DSP Table By Device Driver ... \n");
581*53ee8cc1Swenshuai.xi         #if 1
582*53ee8cc1Swenshuai.xi 
583*53ee8cc1Swenshuai.xi         memcpy (&pDemod->DVBC_DSP_REG[0],
584*53ee8cc1Swenshuai.xi                 pDemod->_sDMD_MSB124X_InitData.pDVBC_DSP_REG ,
585*53ee8cc1Swenshuai.xi                 sizeof(MSB124X_DVBC_DSPREG_TABLE));
586*53ee8cc1Swenshuai.xi         #else
587*53ee8cc1Swenshuai.xi         memcpy (&MSB124X_DVBC_DSPREG_TABLE[0],
588*53ee8cc1Swenshuai.xi                 pDemod->_sDMD_MSB124X_InitData.pDVBC_DSP_REG ,
589*53ee8cc1Swenshuai.xi                 sizeof(MSB124X_DVBC_DSPREG_TABLE));
590*53ee8cc1Swenshuai.xi         #endif
591*53ee8cc1Swenshuai.xi     }
592*53ee8cc1Swenshuai.xi     else
593*53ee8cc1Swenshuai.xi     {
594*53ee8cc1Swenshuai.xi         #if 1
595*53ee8cc1Swenshuai.xi 
596*53ee8cc1Swenshuai.xi         memcpy (&pDemod->DVBC_DSP_REG[0],
597*53ee8cc1Swenshuai.xi                 MSB124X_DVBC_DSPREG_TABLE ,
598*53ee8cc1Swenshuai.xi                 sizeof(MSB124X_DVBC_DSPREG_TABLE));
599*53ee8cc1Swenshuai.xi         #endif
600*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB124X_Init Init DVBC DSP Table By Device Driver ... \n");
601*53ee8cc1Swenshuai.xi     }
602*53ee8cc1Swenshuai.xi 
603*53ee8cc1Swenshuai.xi     if (pDemod->_sDMD_MSB124X_InitData.pDVBT_DSP_REG!= NULL)
604*53ee8cc1Swenshuai.xi     {
605*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB124X_Init Init DVBT DSP Table By Device Driver ... \n");
606*53ee8cc1Swenshuai.xi         #if 1
607*53ee8cc1Swenshuai.xi         memcpy (&pDemod->DVBT_DSP_REG[0],
608*53ee8cc1Swenshuai.xi                 pDemod->_sDMD_MSB124X_InitData.pDVBT_DSP_REG ,
609*53ee8cc1Swenshuai.xi                 sizeof(MSB124X_DVBT_DSPREG_TABLE));
610*53ee8cc1Swenshuai.xi         #else
611*53ee8cc1Swenshuai.xi         memcpy (&MSB124X_DVBT_DSPREG_TABLE[0],
612*53ee8cc1Swenshuai.xi                 pDemod->_sDMD_MSB124X_InitData.pDVBT_DSP_REG ,
613*53ee8cc1Swenshuai.xi                 sizeof(MSB124X_DVBT_DSPREG_TABLE));
614*53ee8cc1Swenshuai.xi         #endif
615*53ee8cc1Swenshuai.xi     }
616*53ee8cc1Swenshuai.xi     else
617*53ee8cc1Swenshuai.xi     {
618*53ee8cc1Swenshuai.xi         #if 1
619*53ee8cc1Swenshuai.xi         memcpy (&pDemod->DVBT_DSP_REG[0],
620*53ee8cc1Swenshuai.xi                 MSB124X_DVBT_DSPREG_TABLE ,
621*53ee8cc1Swenshuai.xi                 sizeof(MSB124X_DVBT_DSPREG_TABLE));
622*53ee8cc1Swenshuai.xi         #endif
623*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB124X_Init Init DVBT DSP Table By Device Driver ... \n");
624*53ee8cc1Swenshuai.xi     }
625*53ee8cc1Swenshuai.xi 
626*53ee8cc1Swenshuai.xi     if (pDemod->_sDMD_MSB124X_InitData.pDVBT2_DSP_REG!= NULL)
627*53ee8cc1Swenshuai.xi     {
628*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB124X_Init Init DVBT2 DSP Table By Device Driver ... \n");
629*53ee8cc1Swenshuai.xi 
630*53ee8cc1Swenshuai.xi         #if 1
631*53ee8cc1Swenshuai.xi         memcpy (&pDemod->DVBT2_DSP_REG[0],
632*53ee8cc1Swenshuai.xi                 pDemod->_sDMD_MSB124X_InitData.pDVBT2_DSP_REG ,
633*53ee8cc1Swenshuai.xi                 sizeof(MSB124X_DVBT2_DSPREG_TABLE));
634*53ee8cc1Swenshuai.xi         #else
635*53ee8cc1Swenshuai.xi         memcpy (&MSB124X_DVBT2_DSPREG_TABLE[0],
636*53ee8cc1Swenshuai.xi                 pDemod->_sDMD_MSB124X_InitData.pDVBT2_DSP_REG ,
637*53ee8cc1Swenshuai.xi                 sizeof(MSB124X_DVBT2_DSPREG_TABLE));
638*53ee8cc1Swenshuai.xi         #endif
639*53ee8cc1Swenshuai.xi     }
640*53ee8cc1Swenshuai.xi     else
641*53ee8cc1Swenshuai.xi     {
642*53ee8cc1Swenshuai.xi         #if 1
643*53ee8cc1Swenshuai.xi         memcpy (&pDemod->DVBT2_DSP_REG[0],
644*53ee8cc1Swenshuai.xi                 MSB124X_DVBT2_DSPREG_TABLE,
645*53ee8cc1Swenshuai.xi                 sizeof(MSB124X_DVBT2_DSPREG_TABLE));
646*53ee8cc1Swenshuai.xi         #endif
647*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB124X_Init Init DVBT2 DSP Table By Device Driver ... \n");
648*53ee8cc1Swenshuai.xi     }
649*53ee8cc1Swenshuai.xi 
650*53ee8cc1Swenshuai.xi     if (pDemod->_sDMD_MSB124X_InitData.bEnableSPILoadCode &&
651*53ee8cc1Swenshuai.xi         pDemod->_sDMD_MSB124X_InitData.fpMSB124x_SPIPAD_En != NULL)
652*53ee8cc1Swenshuai.xi     {
653*53ee8cc1Swenshuai.xi         if (!MDrv_DMD_SSPI_Init(0))
654*53ee8cc1Swenshuai.xi         {
655*53ee8cc1Swenshuai.xi             printf("MDrv_DMD_MSB124x_Init Init MDrv_DMD_SSPI_Init Fail \n");
656*53ee8cc1Swenshuai.xi         }
657*53ee8cc1Swenshuai.xi     }
658*53ee8cc1Swenshuai.xi     else
659*53ee8cc1Swenshuai.xi     {
660*53ee8cc1Swenshuai.xi         pDemod->_sDMD_MSB124X_InitData.bEnableSPILoadCode = FALSE;
661*53ee8cc1Swenshuai.xi     }
662*53ee8cc1Swenshuai.xi 
663*53ee8cc1Swenshuai.xi     //eDMD_MSB124X_DbgLevel = E_DMD_MSB124X_DBGLV_DEBUG;
664*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
665*53ee8cc1Swenshuai.xi     if (eDMD_MSB124X_DbgLevel >= E_DMD_MSB124X_DBGLV_INFO)
666*53ee8cc1Swenshuai.xi     {
667*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB124X_Init %d\n", _gActiveInstanceIndex);
668*53ee8cc1Swenshuai.xi     }
669*53ee8cc1Swenshuai.xi     #endif
670*53ee8cc1Swenshuai.xi 
671*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
672*53ee8cc1Swenshuai.xi     return TRUE;
673*53ee8cc1Swenshuai.xi }
674*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_Exit(void)675*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_Exit(void)
676*53ee8cc1Swenshuai.xi {
677*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
678*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
679*53ee8cc1Swenshuai.xi     if (eDMD_MSB124X_DbgLevel >= E_DMD_MSB124X_DBGLV_DEBUG)
680*53ee8cc1Swenshuai.xi     {
681*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB124X_Exit %d\n", _gActiveInstanceIndex);
682*53ee8cc1Swenshuai.xi     }
683*53ee8cc1Swenshuai.xi     #endif
684*53ee8cc1Swenshuai.xi     pDemod->bDMD_MSB124X_Power_init_en = FALSE;
685*53ee8cc1Swenshuai.xi     pDemod->u8DMD_MSB124X_PowerOnInitialization_Flow = 0;
686*53ee8cc1Swenshuai.xi     pDemod->u8DMD_MSB124X_Sdram_Code = 0x0;
687*53ee8cc1Swenshuai.xi     pDemod->u8DMD_MSB124X_Sram_Code  = 0x0;
688*53ee8cc1Swenshuai.xi     pDemod->bDemodRest = TRUE;
689*53ee8cc1Swenshuai.xi     _DeleteMutex();
690*53ee8cc1Swenshuai.xi     return TRUE;
691*53ee8cc1Swenshuai.xi }
692*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_SetDbgLevel(eDMD_MSB124X_DbgLv u8DbgLevel)693*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_SetDbgLevel(eDMD_MSB124X_DbgLv u8DbgLevel)
694*53ee8cc1Swenshuai.xi {
695*53ee8cc1Swenshuai.xi     //DMD_LOCK();
696*53ee8cc1Swenshuai.xi     eDMD_MSB124X_DbgLevel = u8DbgLevel;
697*53ee8cc1Swenshuai.xi     //DMD_UNLOCK();
698*53ee8cc1Swenshuai.xi     return TRUE;
699*53ee8cc1Swenshuai.xi }
700*53ee8cc1Swenshuai.xi 
701*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_GetLibVer(const MSIF_Version ** ppVersion)702*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_GetLibVer(const MSIF_Version **ppVersion)
703*53ee8cc1Swenshuai.xi {
704*53ee8cc1Swenshuai.xi     //tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
705*53ee8cc1Swenshuai.xi     //DMD_LOCK();
706*53ee8cc1Swenshuai.xi     if (!ppVersion)
707*53ee8cc1Swenshuai.xi     {
708*53ee8cc1Swenshuai.xi       //  DMD_UNLOCK();
709*53ee8cc1Swenshuai.xi         return FALSE;
710*53ee8cc1Swenshuai.xi     }
711*53ee8cc1Swenshuai.xi 
712*53ee8cc1Swenshuai.xi     *ppVersion = &_drv_dmd_msb124x_extern_version;
713*53ee8cc1Swenshuai.xi     //DMD_UNLOCK();
714*53ee8cc1Swenshuai.xi     return TRUE;
715*53ee8cc1Swenshuai.xi }
716*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_GetFWVer(MS_U16 * ver)717*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_GetFWVer(MS_U16 *ver)
718*53ee8cc1Swenshuai.xi {
719*53ee8cc1Swenshuai.xi 
720*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
721*53ee8cc1Swenshuai.xi 
722*53ee8cc1Swenshuai.xi     //DMD_LOCK();
723*53ee8cc1Swenshuai.xi     //printf("MDrv_DMD_DVBT_GetFWVer %x\n",*ver);
724*53ee8cc1Swenshuai.xi     //DMD_UNLOCK();
725*53ee8cc1Swenshuai.xi 
726*53ee8cc1Swenshuai.xi     return bRet;
727*53ee8cc1Swenshuai.xi 
728*53ee8cc1Swenshuai.xi }
729*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB124X_GetReg(MS_U16 u16Addr,MS_U8 * pu8Data)730*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMD_MSB124X_GetReg(MS_U16 u16Addr, MS_U8 *pu8Data)
731*53ee8cc1Swenshuai.xi {
732*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
733*53ee8cc1Swenshuai.xi     MS_U8 u8MsbData[6];
734*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
735*53ee8cc1Swenshuai.xi 
736*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
737*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
738*53ee8cc1Swenshuai.xi     u8MsbData[2] = 0x00;
739*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u16Addr >> 8) &0xff;
740*53ee8cc1Swenshuai.xi     u8MsbData[4] = u16Addr & 0xff;
741*53ee8cc1Swenshuai.xi 
742*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x35;
743*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
744*53ee8cc1Swenshuai.xi 
745*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
746*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8MsbData);
747*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_READ_BYTES, 0, NULL, 1, pu8Data);
748*53ee8cc1Swenshuai.xi 
749*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x34;
750*53ee8cc1Swenshuai.xi     bRet=(pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
751*53ee8cc1Swenshuai.xi 
752*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
753*53ee8cc1Swenshuai.xi     if (eDMD_MSB124X_DbgLevel >= E_DMD_MSB124X_DBGLV_DEBUG)
754*53ee8cc1Swenshuai.xi     {
755*53ee8cc1Swenshuai.xi         printf("_MDrv_DMD_MSB124X_GetReg %x %x\n", u16Addr, *pu8Data);
756*53ee8cc1Swenshuai.xi     }
757*53ee8cc1Swenshuai.xi     #endif
758*53ee8cc1Swenshuai.xi 
759*53ee8cc1Swenshuai.xi     return bRet;
760*53ee8cc1Swenshuai.xi }
761*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_GetReg(MS_U16 u16Addr,MS_U8 * pu8Data)762*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_GetReg(MS_U16 u16Addr, MS_U8 *pu8Data)
763*53ee8cc1Swenshuai.xi {
764*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
765*53ee8cc1Swenshuai.xi 
766*53ee8cc1Swenshuai.xi     DMD_LOCK();
767*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB124X_GetReg(u16Addr, pu8Data);
768*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
769*53ee8cc1Swenshuai.xi 
770*53ee8cc1Swenshuai.xi     return bRet;
771*53ee8cc1Swenshuai.xi }
772*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB124X_SetReg(MS_U16 u16Addr,MS_U8 u8Data)773*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMD_MSB124X_SetReg(MS_U16 u16Addr, MS_U8 u8Data)
774*53ee8cc1Swenshuai.xi {
775*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
776*53ee8cc1Swenshuai.xi     MS_U8 u8MsbData[6];
777*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
778*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
779*53ee8cc1Swenshuai.xi     if (eDMD_MSB124X_DbgLevel >= E_DMD_MSB124X_DBGLV_DEBUG)
780*53ee8cc1Swenshuai.xi     {
781*53ee8cc1Swenshuai.xi         printf("_MDrv_DMD_MSB124X_SetReg %x %x\n", u16Addr, u8Data);
782*53ee8cc1Swenshuai.xi     }
783*53ee8cc1Swenshuai.xi     #endif
784*53ee8cc1Swenshuai.xi 
785*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
786*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
787*53ee8cc1Swenshuai.xi     u8MsbData[2] = 0x00;
788*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u16Addr >> 8) &0xff;
789*53ee8cc1Swenshuai.xi     u8MsbData[4] = u16Addr &0xff;
790*53ee8cc1Swenshuai.xi     u8MsbData[5] = u8Data;
791*53ee8cc1Swenshuai.xi 
792*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x35;
793*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
794*53ee8cc1Swenshuai.xi 
795*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
796*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 6, u8MsbData);
797*53ee8cc1Swenshuai.xi 
798*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x34;
799*53ee8cc1Swenshuai.xi     bRet=(pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
800*53ee8cc1Swenshuai.xi     return bRet;
801*53ee8cc1Swenshuai.xi }
802*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_SetReg(MS_U16 u16Addr,MS_U8 u8Data)803*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_SetReg(MS_U16 u16Addr, MS_U8 u8Data)
804*53ee8cc1Swenshuai.xi {
805*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
806*53ee8cc1Swenshuai.xi 
807*53ee8cc1Swenshuai.xi     DMD_LOCK();
808*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB124X_SetReg(u16Addr, u8Data);
809*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
810*53ee8cc1Swenshuai.xi 
811*53ee8cc1Swenshuai.xi     return bRet;
812*53ee8cc1Swenshuai.xi }
813*53ee8cc1Swenshuai.xi 
814*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB124X_SetRegs(MS_U16 u16Addr,MS_U8 * u8pData,MS_U16 data_size)815*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMD_MSB124X_SetRegs(MS_U16 u16Addr, MS_U8* u8pData, MS_U16 data_size)
816*53ee8cc1Swenshuai.xi {
817*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
818*53ee8cc1Swenshuai.xi     MS_U8   u8MsbDataValue[LOAD_CODE_I2C_BLOCK_NUM + 5];
819*53ee8cc1Swenshuai.xi     MS_U16   idx = 0;
820*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
821*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
822*53ee8cc1Swenshuai.xi     if (eDMD_MSB124X_DbgLevel >= E_DMD_MSB124X_DBGLV_DEBUG)
823*53ee8cc1Swenshuai.xi     {
824*53ee8cc1Swenshuai.xi         printf("_MDrv_DMD_MSB124X_SetRegs %x %x\n", u16Addr, data_size);
825*53ee8cc1Swenshuai.xi     }
826*53ee8cc1Swenshuai.xi     #endif
827*53ee8cc1Swenshuai.xi 
828*53ee8cc1Swenshuai.xi     u8MsbDataValue[0] = 0x10;
829*53ee8cc1Swenshuai.xi     u8MsbDataValue[1] = 0x00;
830*53ee8cc1Swenshuai.xi     u8MsbDataValue[2] = 0x00;
831*53ee8cc1Swenshuai.xi     u8MsbDataValue[3] = (u16Addr >> 8) &0xff;
832*53ee8cc1Swenshuai.xi     u8MsbDataValue[4] = u16Addr & 0xff;
833*53ee8cc1Swenshuai.xi     // u8MsbDataValue[5] = 0x00;
834*53ee8cc1Swenshuai.xi 
835*53ee8cc1Swenshuai.xi     for(idx = 0; idx < data_size ; idx++)
836*53ee8cc1Swenshuai.xi     {
837*53ee8cc1Swenshuai.xi         u8MsbDataValue[5+idx] = u8pData[idx];
838*53ee8cc1Swenshuai.xi     }
839*53ee8cc1Swenshuai.xi 
840*53ee8cc1Swenshuai.xi     u8MsbDataValue[0] = 0x35;
841*53ee8cc1Swenshuai.xi     bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbDataValue);
842*53ee8cc1Swenshuai.xi 
843*53ee8cc1Swenshuai.xi     u8MsbDataValue[0] = 0x10;
844*53ee8cc1Swenshuai.xi     bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5 + data_size, u8MsbDataValue);
845*53ee8cc1Swenshuai.xi 
846*53ee8cc1Swenshuai.xi     u8MsbDataValue[0] = 0x34;
847*53ee8cc1Swenshuai.xi     bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbDataValue);
848*53ee8cc1Swenshuai.xi 
849*53ee8cc1Swenshuai.xi     return bRet;
850*53ee8cc1Swenshuai.xi }
851*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_SetRegs(MS_U16 u16Addr,MS_U8 * u8pData,MS_U16 data_size)852*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_SetRegs(MS_U16 u16Addr, MS_U8* u8pData, MS_U16 data_size)
853*53ee8cc1Swenshuai.xi {
854*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
855*53ee8cc1Swenshuai.xi 
856*53ee8cc1Swenshuai.xi     DMD_LOCK();
857*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB124X_SetRegs(u16Addr, u8pData, data_size);
858*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
859*53ee8cc1Swenshuai.xi 
860*53ee8cc1Swenshuai.xi     return bRet;
861*53ee8cc1Swenshuai.xi }
862*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB124X_SetReg2Bytes(MS_U16 u16Addr,MS_U16 u16Data)863*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMD_MSB124X_SetReg2Bytes(MS_U16 u16Addr, MS_U16 u16Data)
864*53ee8cc1Swenshuai.xi {
865*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
866*53ee8cc1Swenshuai.xi 
867*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
868*53ee8cc1Swenshuai.xi     if (eDMD_MSB124X_DbgLevel >= E_DMD_MSB124X_DBGLV_DEBUG)
869*53ee8cc1Swenshuai.xi     {
870*53ee8cc1Swenshuai.xi         printf("_MDrv_DMD_MSB124X_SetReg2Bytes %x %x\n", u16Addr, u16Data);
871*53ee8cc1Swenshuai.xi     }
872*53ee8cc1Swenshuai.xi     #endif
873*53ee8cc1Swenshuai.xi 
874*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(u16Addr, (MS_U8)u16Data&0x00ff);
875*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(u16Addr + 0x0001, (MS_U8)(u16Data>>8)&0x00ff);
876*53ee8cc1Swenshuai.xi 
877*53ee8cc1Swenshuai.xi     return bRet;
878*53ee8cc1Swenshuai.xi }
879*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_SetReg2Bytes(MS_U16 u16Addr,MS_U16 u16Data)880*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_SetReg2Bytes(MS_U16 u16Addr, MS_U16 u16Data)
881*53ee8cc1Swenshuai.xi {
882*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
883*53ee8cc1Swenshuai.xi 
884*53ee8cc1Swenshuai.xi     DMD_LOCK();
885*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB124X_SetReg2Bytes(u16Addr, u16Data);
886*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
887*53ee8cc1Swenshuai.xi 
888*53ee8cc1Swenshuai.xi     return bRet;
889*53ee8cc1Swenshuai.xi }
890*53ee8cc1Swenshuai.xi 
891*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB124X_GetDSPReg(MS_U16 u16Addr,MS_U8 * pu8Data)892*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB124X_GetDSPReg(MS_U16 u16Addr, MS_U8 *pu8Data)
893*53ee8cc1Swenshuai.xi {
894*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
895*53ee8cc1Swenshuai.xi     MS_U8     u8Cntl = 0x00;
896*53ee8cc1Swenshuai.xi     MS_U16    u16Cntr = 0x00;
897*53ee8cc1Swenshuai.xi 
898*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(REG_MB_ADDR_H, (MS_U8)(u16Addr >> 8));
899*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(REG_MB_ADDR_L, (MS_U8)(u16Addr));
900*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(REG_MB_CNTL, 0x03);
901*53ee8cc1Swenshuai.xi 
902*53ee8cc1Swenshuai.xi     do
903*53ee8cc1Swenshuai.xi     {
904*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_GetReg(REG_MB_CNTL, &u8Cntl);
905*53ee8cc1Swenshuai.xi         if (u16Cntr++ > 0x7ff)
906*53ee8cc1Swenshuai.xi         {
907*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
908*53ee8cc1Swenshuai.xi             //if (eDMD_MSB124X_DbgLevel >= E_DMD_MSB124X_DBGLV_DEBUG)
909*53ee8cc1Swenshuai.xi             {
910*53ee8cc1Swenshuai.xi                 printf("MSB124X_MB_READ_FAILURE\n");
911*53ee8cc1Swenshuai.xi             }
912*53ee8cc1Swenshuai.xi             #endif
913*53ee8cc1Swenshuai.xi             return FALSE;
914*53ee8cc1Swenshuai.xi         }
915*53ee8cc1Swenshuai.xi     }
916*53ee8cc1Swenshuai.xi     while(u8Cntl != 0xff);
917*53ee8cc1Swenshuai.xi 
918*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_GetReg(REG_MB_DATA, pu8Data);
919*53ee8cc1Swenshuai.xi 
920*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
921*53ee8cc1Swenshuai.xi     if (eDMD_MSB124X_DbgLevel >= E_DMD_MSB124X_DBGLV_DEBUG)
922*53ee8cc1Swenshuai.xi     {
923*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB124X_GetDSPReg %x %x\n", u16Addr, *pu8Data);
924*53ee8cc1Swenshuai.xi     }
925*53ee8cc1Swenshuai.xi     #endif
926*53ee8cc1Swenshuai.xi 
927*53ee8cc1Swenshuai.xi     return bRet;
928*53ee8cc1Swenshuai.xi }
929*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_GetDSPReg(MS_U16 u16Addr,MS_U8 * pu8Data)930*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_GetDSPReg(MS_U16 u16Addr, MS_U8 *pu8Data)
931*53ee8cc1Swenshuai.xi {
932*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
933*53ee8cc1Swenshuai.xi 
934*53ee8cc1Swenshuai.xi     DMD_LOCK();
935*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB124X_GetDSPReg(u16Addr, pu8Data);
936*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
937*53ee8cc1Swenshuai.xi 
938*53ee8cc1Swenshuai.xi     return bRet;
939*53ee8cc1Swenshuai.xi }
940*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB124X_SetDSPReg(MS_U16 u16Addr,MS_U8 u8Data)941*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB124X_SetDSPReg(MS_U16 u16Addr, MS_U8 u8Data)
942*53ee8cc1Swenshuai.xi {
943*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
944*53ee8cc1Swenshuai.xi     MS_U8     u8Cntl = 0x00;
945*53ee8cc1Swenshuai.xi     MS_U16    u16Cntr = 0x00;
946*53ee8cc1Swenshuai.xi 
947*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
948*53ee8cc1Swenshuai.xi     if (eDMD_MSB124X_DbgLevel >= E_DMD_MSB124X_DBGLV_DEBUG)
949*53ee8cc1Swenshuai.xi     {
950*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB124X_SetDSPReg %x %x\n", u16Addr, u8Data);
951*53ee8cc1Swenshuai.xi     }
952*53ee8cc1Swenshuai.xi     #endif
953*53ee8cc1Swenshuai.xi 
954*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(REG_MB_DATA, u8Data);
955*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(REG_MB_ADDR_H, (MS_U8)(u16Addr >> 8));
956*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(REG_MB_ADDR_L, (MS_U8)(u16Addr));
957*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(REG_MB_CNTL, 0x04);
958*53ee8cc1Swenshuai.xi 
959*53ee8cc1Swenshuai.xi     do
960*53ee8cc1Swenshuai.xi     {
961*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_GetReg(REG_MB_CNTL, &u8Cntl);
962*53ee8cc1Swenshuai.xi         if (u16Cntr++ > 0x7ff)
963*53ee8cc1Swenshuai.xi         {
964*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
965*53ee8cc1Swenshuai.xi             //if (eDMD_MSB124X_DbgLevel >= E_DMD_MSB124X_DBGLV_DEBUG)
966*53ee8cc1Swenshuai.xi             {
967*53ee8cc1Swenshuai.xi                 printf("MSB124X_MB_WRITE_FAILURE\n");
968*53ee8cc1Swenshuai.xi             }
969*53ee8cc1Swenshuai.xi             #endif
970*53ee8cc1Swenshuai.xi             return false;
971*53ee8cc1Swenshuai.xi         }
972*53ee8cc1Swenshuai.xi     }
973*53ee8cc1Swenshuai.xi     while(u8Cntl != 0xff);
974*53ee8cc1Swenshuai.xi     return bRet;
975*53ee8cc1Swenshuai.xi }
976*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_SetDSPReg(MS_U16 u16Addr,MS_U8 u8Data)977*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_SetDSPReg(MS_U16 u16Addr, MS_U8 u8Data)
978*53ee8cc1Swenshuai.xi {
979*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
980*53ee8cc1Swenshuai.xi 
981*53ee8cc1Swenshuai.xi     DMD_LOCK();
982*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB124X_SetDSPReg(u16Addr, u8Data);
983*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
984*53ee8cc1Swenshuai.xi 
985*53ee8cc1Swenshuai.xi     return bRet;
986*53ee8cc1Swenshuai.xi }
987*53ee8cc1Swenshuai.xi 
_MSB124X_I2C_CH_Reset(MS_U8 ch_num)988*53ee8cc1Swenshuai.xi static MS_BOOL _MSB124X_I2C_CH_Reset(MS_U8 ch_num)
989*53ee8cc1Swenshuai.xi {
990*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
991*53ee8cc1Swenshuai.xi     //MAPI_U8         addr[4] = {0x00, 0x00, 0x00, 0x00};
992*53ee8cc1Swenshuai.xi     MS_U8         u8data[5] = {0x53, 0x45, 0x52, 0x44, 0x42};
993*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
994*53ee8cc1Swenshuai.xi 
995*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
996*53ee8cc1Swenshuai.xi     printf("[msb124x][beg]I2C_CH_Reset, CH=0x%x\n",ch_num);
997*53ee8cc1Swenshuai.xi     #endif
998*53ee8cc1Swenshuai.xi     //DMD_LOCK_REG_RW();
999*53ee8cc1Swenshuai.xi 
1000*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h53(PWD1)->8,h45(PWD2)->8,h52(PWD3)->8,h44(PWD4)->8,h42(PWD5)
1001*53ee8cc1Swenshuai.xi     //u8data[0] = 0x53;
1002*53ee8cc1Swenshuai.xi     //bRet &= (*_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8data);
1003*53ee8cc1Swenshuai.xi     if (pDemod->bDemodRest)
1004*53ee8cc1Swenshuai.xi     {
1005*53ee8cc1Swenshuai.xi         pDemod->bDemodRest = FALSE;
1006*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h53(PWD1)->8,h45(PWD2)->8,h52(PWD3)->8,h44(PWD4)->8,h42(PWD5)
1007*53ee8cc1Swenshuai.xi         u8data[0] = 0x53;
1008*53ee8cc1Swenshuai.xi         // Don't check Ack because this passward only ack one time for the first time.
1009*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8data);
1010*53ee8cc1Swenshuai.xi     }
1011*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h71(CMD)  //TV.n_iic_
1012*53ee8cc1Swenshuai.xi     u8data[0] = 0x71;
1013*53ee8cc1Swenshuai.xi     bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8data);
1014*53ee8cc1Swenshuai.xi 
1015*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h81(CMD)  //TV.n_iic_sel_b0
1016*53ee8cc1Swenshuai.xi     u8data[0] = ((ch_num & 0x01) != 0)? 0x81 : 0x80;
1017*53ee8cc1Swenshuai.xi     bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8data);
1018*53ee8cc1Swenshuai.xi 
1019*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h83(CMD)  //TV.n_iic_sel_b1
1020*53ee8cc1Swenshuai.xi     u8data[0] = ((ch_num & 0x02) != 0)? 0x83 : 0x82;
1021*53ee8cc1Swenshuai.xi     bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8data);
1022*53ee8cc1Swenshuai.xi 
1023*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h84(CMD)  //TV.n_iic_sel_b2
1024*53ee8cc1Swenshuai.xi     u8data[0] = ((ch_num & 0x04) != 0)? 0x85 : 0x84;
1025*53ee8cc1Swenshuai.xi     bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8data);
1026*53ee8cc1Swenshuai.xi 
1027*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h53(CMD)  //TV.n_iic_ad_byte_en2, 32bit read/write
1028*53ee8cc1Swenshuai.xi     u8data[0] = 0x53;
1029*53ee8cc1Swenshuai.xi     bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8data);
1030*53ee8cc1Swenshuai.xi 
1031*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h7f(CMD)  //TV.n_iic_sel_use_cfg
1032*53ee8cc1Swenshuai.xi     u8data[0] = 0x7f;
1033*53ee8cc1Swenshuai.xi     bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8data);
1034*53ee8cc1Swenshuai.xi 
1035*53ee8cc1Swenshuai.xi /*
1036*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h35(CMD)  //TV.n_iic_use
1037*53ee8cc1Swenshuai.xi     data[0] = 0x35;
1038*53ee8cc1Swenshuai.xi     iptr->WriteBytes(0, NULL, 1, data);
1039*53ee8cc1Swenshuai.xi 
1040*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h71(CMD)  //TV.n_iic_Re-shape
1041*53ee8cc1Swenshuai.xi     data[0] = 0x71;
1042*53ee8cc1Swenshuai.xi     iptr->WriteBytes(0, NULL, 1, data);
1043*53ee8cc1Swenshuai.xi */
1044*53ee8cc1Swenshuai.xi     //DMD_UNLOCK_REG_RW();
1045*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
1046*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][end]I2C_CH_Reset, CH=0x%x\n",ch_num));
1047*53ee8cc1Swenshuai.xi     #endif
1048*53ee8cc1Swenshuai.xi     return bRet;
1049*53ee8cc1Swenshuai.xi }
1050*53ee8cc1Swenshuai.xi 
_MSB124X_HW_init(void)1051*53ee8cc1Swenshuai.xi static MS_BOOL _MSB124X_HW_init(void)
1052*53ee8cc1Swenshuai.xi {
1053*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
1054*53ee8cc1Swenshuai.xi     MS_U8 u8_tmp = 0;
1055*53ee8cc1Swenshuai.xi     MS_U8 u8_timeout = 0;
1056*53ee8cc1Swenshuai.xi 
1057*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
1058*53ee8cc1Swenshuai.xi     printf("[msb124x][beg]MSB124X_HW_init\n");
1059*53ee8cc1Swenshuai.xi     #endif
1060*53ee8cc1Swenshuai.xi     //DMD_LOCK();
1061*53ee8cc1Swenshuai.xi 
1062*53ee8cc1Swenshuai.xi     // ASIC INIT for WDM DVB-T2
1063*53ee8cc1Swenshuai.xi     // -------------------------------------------------------------------
1064*53ee8cc1Swenshuai.xi     // Initialize DMD_ANA_MISC
1065*53ee8cc1Swenshuai.xi     // -------------------------------------------------------------------
1066*53ee8cc1Swenshuai.xi     // [0]	reg_tst_ldo25i
1067*53ee8cc1Swenshuai.xi     // [1]	reg_tst_ldo25q
1068*53ee8cc1Swenshuai.xi     // [5:4]	reg_tst_ldo25i_selfb
1069*53ee8cc1Swenshuai.xi     // [7:6]	reg_tst_ldo25q_selfb
1070*53ee8cc1Swenshuai.xi     // [8]	reg_pd_dm2p5ldoi = 1'b0
1071*53ee8cc1Swenshuai.xi     // [9]	reg_pd_dm2p5ldoq = 1'b0
1072*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x4f)*2, 0x0000);
1073*53ee8cc1Swenshuai.xi 
1074*53ee8cc1Swenshuai.xi     // [0]	reg_tst_ldo11_clk
1075*53ee8cc1Swenshuai.xi     // [1]	reg_tst_ldo26
1076*53ee8cc1Swenshuai.xi     // [2]	reg_tst_ldo11_cmp
1077*53ee8cc1Swenshuai.xi     // [3]	reg_pd_dm1p1ldo_clk = 1'b0
1078*53ee8cc1Swenshuai.xi     // [4]	reg_pd_dm1p1ldo_cmp = 1'b0
1079*53ee8cc1Swenshuai.xi     // [6]	reg_tst_ldo26_selfb
1080*53ee8cc1Swenshuai.xi     // [7]	reg_pd_dm2p6ldo = 1'b0
1081*53ee8cc1Swenshuai.xi     // [9:8]	reg_tst_ldo11_cmp_selfb
1082*53ee8cc1Swenshuai.xi     // [11:10]	reg_tst_ldo11_clk_selfb
1083*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x4e)*2, 0x0000);
1084*53ee8cc1Swenshuai.xi 
1085*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
1086*53ee8cc1Swenshuai.xi     // [15:8]	reg_mpll_loop_div_second      feedback divider, div by binary data number
1087*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x33)*2, 0x1201);
1088*53ee8cc1Swenshuai.xi 
1089*53ee8cc1Swenshuai.xi     // [2:0]	reg_mpll_ictrl		    charge pump current control
1090*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)
1091*53ee8cc1Swenshuai.xi     // [4]	reg_mpll_xtal2adc_sel	    select the XTAL clock bypass to MPLL_ADC_CLK
1092*53ee8cc1Swenshuai.xi     // [5]	reg_mpll_xtal2next_pll_sel  crystal clock bypass to next PLL select
1093*53ee8cc1Swenshuai.xi     // [6]	reg_mpll_vco_offset	    set VCO initial offset frequency
1094*53ee8cc1Swenshuai.xi     // [7]	reg_mpll_pd		    gated reference clock and power down PLL analog_3v: 1=power down
1095*53ee8cc1Swenshuai.xi     // [8]	reg_xtal_en		    XTAL enable register; 1: enable
1096*53ee8cc1Swenshuai.xi     // [10:9]	reg_xtal_sel		    XTAL driven strength select.
1097*53ee8cc1Swenshuai.xi     // [11]  	reg_mpll_porst		    MPLL input  power on reset, connect to reg as MPLL_RESET
1098*53ee8cc1Swenshuai.xi     // [12]  	reg_mpll_reset		    PLL software reset; 1:reset
1099*53ee8cc1Swenshuai.xi     // [13]  	reg_pd_dmpll_clk	    XTAL to MPLL clock reference power down
1100*53ee8cc1Swenshuai.xi     // [14]  	reg_pd_3p3_1		    XTAL to CLK_24M_3P3_1 power down
1101*53ee8cc1Swenshuai.xi     // [15]  	reg_pd_3p3_2		    XTAL to CLK_24M_3P3_2 power down
1102*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x35)*2, 0x1803);
1103*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x35)*2, 0x0003);
1104*53ee8cc1Swenshuai.xi 
1105*53ee8cc1Swenshuai.xi     // [0]	reg_mpll_clk_dp_pd	dummy
1106*53ee8cc1Swenshuai.xi     // [1]	reg_adc_clk_pd		ADC output clock power down
1107*53ee8cc1Swenshuai.xi     // [2]	reg_mpll_div2_pd	MPLL_DIV2 power down
1108*53ee8cc1Swenshuai.xi     // [3]	reg_mpll_div3_pd	MPLL_DIV3 power down
1109*53ee8cc1Swenshuai.xi     // [4]	reg_mpll_div4_pd	MPLL_DIV4 power down
1110*53ee8cc1Swenshuai.xi     // [5]	reg_mpll_div8_pd	MPLL_DIV8 power down
1111*53ee8cc1Swenshuai.xi     // [6]	reg_mpll_div10_pd	MPLL_DIV10 power down
1112*53ee8cc1Swenshuai.xi           // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h30, 2'b11, 16'h2400);  // divide ADC clock to 24Mhz = 24*36/36
1113*53ee8cc1Swenshuai.xi           bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x30)*2, 0x2400);
1114*53ee8cc1Swenshuai.xi 
1115*53ee8cc1Swenshuai.xi     // $display("--------------------------------------");
1116*53ee8cc1Swenshuai.xi     // $display("Initialize ADC I/Q");
1117*53ee8cc1Swenshuai.xi     // $display("--------------------------------------");
1118*53ee8cc1Swenshuai.xi 
1119*53ee8cc1Swenshuai.xi     // [0]	Q channel ADC power down
1120*53ee8cc1Swenshuai.xi     // [1]	I channel ADC power down
1121*53ee8cc1Swenshuai.xi     // [2]	Q channel clamp enable. 0:enable, 1:disable
1122*53ee8cc1Swenshuai.xi     // [3]	I channel clamp enable. 0:enable, 1:disable
1123*53ee8cc1Swenshuai.xi     // [6:4]    I channel input mux control;
1124*53ee8cc1Swenshuai.xi     //		3'b000=I channel ADC calibration mode input
1125*53ee8cc1Swenshuai.xi     //	    	3'b001=VIF signal from VIFPGA
1126*53ee8cc1Swenshuai.xi     //	    	3'b100=DVB or ATSC mode input from PAD_I(Q)P(M)
1127*53ee8cc1Swenshuai.xi     //	    	all the other combination are only for test mode, don't use without understanding.
1128*53ee8cc1Swenshuai.xi     // [10:8]   Q channel input mux control;
1129*53ee8cc1Swenshuai.xi     //		3'b000=Q channel ADC calibration mode input
1130*53ee8cc1Swenshuai.xi     //	    	3'b001=VIF signal from VIFPGA 3'b010 = SSIF signal from PAD_SIFP(M)
1131*53ee8cc1Swenshuai.xi     //	    	3'b100=DVB or ATSC mode input from PAD_I(Q)P(M)
1132*53ee8cc1Swenshuai.xi     //	    	all the other combination are only for test mode, don't use without understanding.
1133*53ee8cc1Swenshuai.xi     // [12]	ADC I,Q swap enable; 1: swap
1134*53ee8cc1Swenshuai.xi     // [13]	ADC clock out select; 1: ADC_CLKQ
1135*53ee8cc1Swenshuai.xi     // [14]	ADC linear calibration bypass enable; 1:enable
1136*53ee8cc1Swenshuai.xi     // [15]	ADC internal 1.2v regulator control always 0 in T3
1137*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x01)*2, 0x0440);
1138*53ee8cc1Swenshuai.xi 
1139*53ee8cc1Swenshuai.xi     // [2:0]	reg_imuxs_s
1140*53ee8cc1Swenshuai.xi     // [6:4]	reg_qmuxs_s
1141*53ee8cc1Swenshuai.xi     // [9:8]	reg_iclpstr_s
1142*53ee8cc1Swenshuai.xi     // [13:12]	reg_qclpstr_s
1143*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x45)*2, 0x0000);
1144*53ee8cc1Swenshuai.xi 
1145*53ee8cc1Swenshuai.xi         //bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x51)*2, 0x0021);
1146*53ee8cc1Swenshuai.xi 
1147*53ee8cc1Swenshuai.xi     // [0]	Channel I ADC power down: 1=power dwon
1148*53ee8cc1Swenshuai.xi     // [1]	Channel Q ADC power down: 1=power dwon
1149*53ee8cc1Swenshuai.xi     // [2]	power down clamp buffer for test mode
1150*53ee8cc1Swenshuai.xi     // [3]	change ADC reference voltage for SSIF
1151*53ee8cc1Swenshuai.xi     // [6:4]    ADC source bias current control
1152*53ee8cc1Swenshuai.xi     // [9:8]    XTAL receiver amp gain
1153*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x0c)*2, 0x0002);
1154*53ee8cc1Swenshuai.xi 
1155*53ee8cc1Swenshuai.xi     // [0]	reg_linear_cal_start_q	0	0	1
1156*53ee8cc1Swenshuai.xi     // [1]	reg_linear_cal_mode_q	0	0	1
1157*53ee8cc1Swenshuai.xi     // [2]	reg_linear_cal_en_q	0	0	1
1158*53ee8cc1Swenshuai.xi     // [3]	reg_linear_cal_code0_oren_q	0	0	1
1159*53ee8cc1Swenshuai.xi     // [6:4]	reg_linear_cal_status_sel_q	2	0	3
1160*53ee8cc1Swenshuai.xi     // [7]	reg_pwdn_vcalbuf	0	0	1
1161*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x0f)*2, 0x0000);
1162*53ee8cc1Swenshuai.xi 
1163*53ee8cc1Swenshuai.xi     // [3:0]	clamp voltage control
1164*53ee8cc1Swenshuai.xi     //          3'b000 = 0.7v
1165*53ee8cc1Swenshuai.xi     //          3'b001 = 0.75v
1166*53ee8cc1Swenshuai.xi     //          3'b010 = 0.5v
1167*53ee8cc1Swenshuai.xi     //          3'b011 = 0.4v
1168*53ee8cc1Swenshuai.xi     //          3'b100 = 0.8v
1169*53ee8cc1Swenshuai.xi     //          3'b101 = 0.9v
1170*53ee8cc1Swenshuai.xi     //          3'b110 = 0.65v
1171*53ee8cc1Swenshuai.xi     //          3'b111 = 0.60v
1172*53ee8cc1Swenshuai.xi     // [4]	REFERENCE power down
1173*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x20)*2, 0x0000);
1174*53ee8cc1Swenshuai.xi 
1175*53ee8cc1Swenshuai.xi     // Set ADC gain is 1
1176*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x0b)*2, 0x0909);
1177*53ee8cc1Swenshuai.xi 
1178*53ee8cc1Swenshuai.xi     // Disable ADC Sign bit
1179*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x2e)*2, 0x0000);
1180*53ee8cc1Swenshuai.xi 
1181*53ee8cc1Swenshuai.xi     // ADC I channel offset
1182*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x2a)*2, 0x0c00);
1183*53ee8cc1Swenshuai.xi 
1184*53ee8cc1Swenshuai.xi     // ADC Q channel offset
1185*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x2b)*2, 0x0c00);
1186*53ee8cc1Swenshuai.xi 
1187*53ee8cc1Swenshuai.xi     // [2:0]reg_acl_ref
1188*53ee8cc1Swenshuai.xi     // [5:4]reg_acl_isel
1189*53ee8cc1Swenshuai.xi     // [8]	reg_xtal_pm_isel
1190*53ee8cc1Swenshuai.xi     // [9]	reg_bond_mode
1191*53ee8cc1Swenshuai.xi     // [10]	reg_clk_bond_mode
1192*53ee8cc1Swenshuai.xi     // [11]	reg_clk_usb_3p3_en
1193*53ee8cc1Swenshuai.xi     // [13:12]	reg_iq_ctrl	= 2'd1
1194*53ee8cc1Swenshuai.xi 	bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x19)*2, 0x1e00);
1195*53ee8cc1Swenshuai.xi 
1196*53ee8cc1Swenshuai.xi     // [ 4:0]reg_ckg_bist[4:0]
1197*53ee8cc1Swenshuai.xi     // [11:8]reg_ckg_adcd_d2[3:0]
1198*53ee8cc1Swenshuai.xi 	bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x1c)*2, 0x0000);
1199*53ee8cc1Swenshuai.xi 
1200*53ee8cc1Swenshuai.xi     // [ 4:0]reg_ckg_dvbtm_sram_t11x_t22x[4:0]
1201*53ee8cc1Swenshuai.xi     // [12:8]reg_ckg_dvbtm_sram_t11x_t24x[4:0]
1202*53ee8cc1Swenshuai.xi 	bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x1e)*2, 0x0000);
1203*53ee8cc1Swenshuai.xi 
1204*53ee8cc1Swenshuai.xi 
1205*53ee8cc1Swenshuai.xi     // -------------------------------------------------------------------
1206*53ee8cc1Swenshuai.xi     // Release clock gating
1207*53ee8cc1Swenshuai.xi     // -------------------------------------------------------------------
1208*53ee8cc1Swenshuai.xi 
1209*53ee8cc1Swenshuai.xi     // [0]	reg_xtal_en
1210*53ee8cc1Swenshuai.xi     // [9:8]	reg_clk_pd_iic
1211*53ee8cc1Swenshuai.xi     // [10]	reg_clk_pd_all
1212*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x09)*2, 0x0101);
1213*53ee8cc1Swenshuai.xi 
1214*53ee8cc1Swenshuai.xi     // [3:0]	reg_ckg_adcd
1215*53ee8cc1Swenshuai.xi     // [7:4]	reg_ckg_sadc
1216*53ee8cc1Swenshuai.xi     // [11:8]	reg_ckg_iicm
1217*53ee8cc1Swenshuai.xi     // [13:12]	reg_ckg_sbus
1218*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x0a)*2, 0x0000);
1219*53ee8cc1Swenshuai.xi 
1220*53ee8cc1Swenshuai.xi     // [5:0]	reg_ckg_mcu
1221*53ee8cc1Swenshuai.xi     // [6]	reg_ckg_live
1222*53ee8cc1Swenshuai.xi     // [11:8]	reg_ckg_inner
1223*53ee8cc1Swenshuai.xi //      bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x0b)*2, 0x0030);
1224*53ee8cc1Swenshuai.xi     //set MCU ckg to 108MHz by jason
1225*53ee8cc1Swenshuai.xi     // reg_ckg_mcu[4:2] = 0x0
1226*53ee8cc1Swenshuai.xi     // reg_ckg_mcu[5] = 0x0
1227*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x0b)*2, 0x0020);
1228*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x0b)*2, 0x0000);
1229*53ee8cc1Swenshuai.xi 
1230*53ee8cc1Swenshuai.xi     // @0x0910
1231*53ee8cc1Swenshuai.xi     // [3:0]	reg_ckg_dvbtm_adc
1232*53ee8cc1Swenshuai.xi     // [6:4]	reg_ckg_dvbt_inner1x
1233*53ee8cc1Swenshuai.xi     // [10:8]	reg_ckg_dvbt_inner2x
1234*53ee8cc1Swenshuai.xi     // [14:12]	reg_ckg_dvbt_inner4x
1235*53ee8cc1Swenshuai.xi     //DVBT2
1236*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x10)*2, 0x1110);
1237*53ee8cc1Swenshuai.xi 
1238*53ee8cc1Swenshuai.xi     // @0x0911
1239*53ee8cc1Swenshuai.xi     // [2:0]	reg_ckg_dvbt_outer1x
1240*53ee8cc1Swenshuai.xi     // [6:4]	reg_ckg_dvbt_outer2x
1241*53ee8cc1Swenshuai.xi     // [11:8]	reg_ckg_dvbtc_outer2x
1242*53ee8cc1Swenshuai.xi     //DVBT2
1243*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x11)*2, 0x0111);
1244*53ee8cc1Swenshuai.xi 
1245*53ee8cc1Swenshuai.xi     // @0x0912
1246*53ee8cc1Swenshuai.xi     // [3:0]	reg_ckg_dvbtm_ts
1247*53ee8cc1Swenshuai.xi     // [4]	reg_dvbtm_ts_out_mode
1248*53ee8cc1Swenshuai.xi     // [5]	reg_dvbtm_ts_clk_pol
1249*53ee8cc1Swenshuai.xi     // [15:8]	reg_dvbtm_ts_clk_divnum
1250*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x12)*2, 0x1418);
1251*53ee8cc1Swenshuai.xi 
1252*53ee8cc1Swenshuai.xi     // @0x0913
1253*53ee8cc1Swenshuai.xi     // [5:0]	reg_ckg_spi
1254*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x13)*2, 0x0020);
1255*53ee8cc1Swenshuai.xi 
1256*53ee8cc1Swenshuai.xi     // @0x0914
1257*53ee8cc1Swenshuai.xi     // [12:8]	reg_ckg_dvbtm_sram_t1o2x_t22x
1258*53ee8cc1Swenshuai.xi     //DVBT2
1259*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x14)*2, 0x0000);
1260*53ee8cc1Swenshuai.xi 
1261*53ee8cc1Swenshuai.xi     // @0x0915
1262*53ee8cc1Swenshuai.xi     // [3:0]	reg_ckg_dvbc_inner
1263*53ee8cc1Swenshuai.xi     // [6:4]	reg_ckg_dvbc_eq
1264*53ee8cc1Swenshuai.xi     // [10:8]	reg_ckg_dvbc_eq8x
1265*53ee8cc1Swenshuai.xi     //DVBT2
1266*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x15)*2, 0x0111);
1267*53ee8cc1Swenshuai.xi 
1268*53ee8cc1Swenshuai.xi     // @0x0916
1269*53ee8cc1Swenshuai.xi     // [8:4]	reg_ckg_dvbtm_sram_adc_t22x
1270*53ee8cc1Swenshuai.xi     //DVBT2
1271*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x16)*2, 0x0001);
1272*53ee8cc1Swenshuai.xi 
1273*53ee8cc1Swenshuai.xi     // @0x0917
1274*53ee8cc1Swenshuai.xi     // [4:0]	reg_ckg_dvbtm_sram_t12x_t22x
1275*53ee8cc1Swenshuai.xi     // [12:8]	reg_ckg_dvbtm_sram_t12x_t24x
1276*53ee8cc1Swenshuai.xi     //DVBT2
1277*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x17)*2, 0x0000);
1278*53ee8cc1Swenshuai.xi 
1279*53ee8cc1Swenshuai.xi     // @0x0918
1280*53ee8cc1Swenshuai.xi     // [4:0]	reg_ckg_dvbtm_sram_t14x_t24x
1281*53ee8cc1Swenshuai.xi     // [12:8]	reg_ckg_dvbtm_ts_in
1282*53ee8cc1Swenshuai.xi     //DVBT2
1283*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x18)*2, 0x0400);
1284*53ee8cc1Swenshuai.xi 
1285*53ee8cc1Swenshuai.xi     // @0x0919
1286*53ee8cc1Swenshuai.xi     // [2:0]	reg_ckg_tdp_jl_inner1x
1287*53ee8cc1Swenshuai.xi     // [6:4]	reg_ckg_tdp_jl_inner4x
1288*53ee8cc1Swenshuai.xi     // [15:8]	reg_ckg_miu
1289*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x19)*2, 0x3c00);
1290*53ee8cc1Swenshuai.xi 
1291*53ee8cc1Swenshuai.xi     // @0x091a
1292*53ee8cc1Swenshuai.xi     // [6:4]	reg_ckg_dvbt2_inner1x
1293*53ee8cc1Swenshuai.xi     // [10:8]	reg_ckg_dvbt2_inner2x
1294*53ee8cc1Swenshuai.xi     // [14:12]	reg_ckg_dvbt2_inner4x
1295*53ee8cc1Swenshuai.xi      //DVBT2
1296*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x1a)*2, 0x0000);
1297*53ee8cc1Swenshuai.xi 
1298*53ee8cc1Swenshuai.xi     // @0x090e
1299*53ee8cc1Swenshuai.xi     // [3:0]	reg_ckg_dvbs2_ldpc_inner_sram
1300*53ee8cc1Swenshuai.xi     // [7:4]	reg_ckg_dvbs_viterbi_sram
1301*53ee8cc1Swenshuai.xi     //DVBT2
1302*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x0e)*2, 0x0000);
1303*53ee8cc1Swenshuai.xi 
1304*53ee8cc1Swenshuai.xi     // @0x091b
1305*53ee8cc1Swenshuai.xi     // [2:0]	reg_ckg_dvbt2_outer1x
1306*53ee8cc1Swenshuai.xi     // [6:4]	reg_ckg_dvbt2_outer2x
1307*53ee8cc1Swenshuai.xi     // [10:8]	reg_ckg_syn_miu
1308*53ee8cc1Swenshuai.xi     // [14:12]	reg_ckg_syn_ts
1309*53ee8cc1Swenshuai.xi     //DVBT2
1310*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x1b)*2, 0x0000);
1311*53ee8cc1Swenshuai.xi 
1312*53ee8cc1Swenshuai.xi     // @0x091c
1313*53ee8cc1Swenshuai.xi     // [4:0]	reg_ckg_bist
1314*53ee8cc1Swenshuai.xi     // [11:8]	reg_ckg_adcd_d2
1315*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x1c)*2, 0x0000);
1316*53ee8cc1Swenshuai.xi 
1317*53ee8cc1Swenshuai.xi     // @0x091d
1318*53ee8cc1Swenshuai.xi     // [3:0]	reg_ckg_dvbtm_adc_eq_1x
1319*53ee8cc1Swenshuai.xi     // [7:4]	reg_ckg_dvbtm_adc_eq_0p5x
1320*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x1d)*2, 0x0000);
1321*53ee8cc1Swenshuai.xi 
1322*53ee8cc1Swenshuai.xi     // @0x0921
1323*53ee8cc1Swenshuai.xi     // [2:0]	reg_ckg_tdp_teq_inner1x
1324*53ee8cc1Swenshuai.xi     // [14:12]	reg_ckg_tdp_teq_inner2x
1325*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x21)*2, 0x0000);
1326*53ee8cc1Swenshuai.xi 
1327*53ee8cc1Swenshuai.xi     // @0x0922
1328*53ee8cc1Swenshuai.xi     // [3:0]	reg_ckg_dvbt_t2_inner0p5x_dvbc_eq1x
1329*53ee8cc1Swenshuai.xi     // [7:4]	reg_ckg_dvbt_t2_inner2x_dvbc_eq4x
1330*53ee8cc1Swenshuai.xi     // [11:8]	reg_ckg_dvbt_t2_inner1x
1331*53ee8cc1Swenshuai.xi     //DVBT2
1332*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x22)*2, 0x0000);
1333*53ee8cc1Swenshuai.xi 
1334*53ee8cc1Swenshuai.xi     // [1:0]	reg_iicm_pad_sel
1335*53ee8cc1Swenshuai.xi     // [4]	reg_i2c_sbpm_en
1336*53ee8cc1Swenshuai.xi     // [12:8]	reg_i2c_sbpm_idle_num
1337*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x08)*2, 0x0a01);
1338*53ee8cc1Swenshuai.xi 
1339*53ee8cc1Swenshuai.xi     // [8]	reg_turn_off_pad
1340*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x28)*2, 0x0000);
1341*53ee8cc1Swenshuai.xi 
1342*53ee8cc1Swenshuai.xi     // @0x0970
1343*53ee8cc1Swenshuai.xi     // [3:0]	reg_ckg_dvbt_inner2x_srd0p5x
1344*53ee8cc1Swenshuai.xi     // [7:4]	reg_ckg_dvbt2_inner2x_srd0p5x
1345*53ee8cc1Swenshuai.xi     // [12:8]	reg_ckg_dvbtm_sram_t1outer1x_t24x
1346*53ee8cc1Swenshuai.xi     //DVBT2
1347*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x70)*2, 0x0000);
1348*53ee8cc1Swenshuai.xi 
1349*53ee8cc1Swenshuai.xi     // @0x0971
1350*53ee8cc1Swenshuai.xi     // [4:0]	reg_ckg_dvbtm_sram_t12x_t24x_srd1x
1351*53ee8cc1Swenshuai.xi     // [12:8]	reg_ckg_dvbtm_sram_t14x_t24x_srd1x
1352*53ee8cc1Swenshuai.xi     //DVBT2
1353*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x71)*2, 0x0000);
1354*53ee8cc1Swenshuai.xi 
1355*53ee8cc1Swenshuai.xi     // @0x0972
1356*53ee8cc1Swenshuai.xi     // [6:0]	reg_ckg_dvbt2_s2_bch_out
1357*53ee8cc1Swenshuai.xi     // [12:8]	reg_ckg_dvbt2_outer2x
1358*53ee8cc1Swenshuai.xi     //DVBT2
1359*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x72)*2, 0x0000);
1360*53ee8cc1Swenshuai.xi 
1361*53ee8cc1Swenshuai.xi     // @0x0973
1362*53ee8cc1Swenshuai.xi     // [3:0]	reg_ckg_dvbt2_inner4x_s2_inner
1363*53ee8cc1Swenshuai.xi     //DVBT2
1364*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x73)*2, 0x0000);
1365*53ee8cc1Swenshuai.xi 
1366*53ee8cc1Swenshuai.xi     // @0x0974
1367*53ee8cc1Swenshuai.xi     // [4:0]	reg_ckg_dvbtm_sram_t12x_t24x_s2inner
1368*53ee8cc1Swenshuai.xi     // [12:8]	reg_ckg_dvbtm_sram_t14x_t24x_s2inner
1369*53ee8cc1Swenshuai.xi     //DVBT2
1370*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x74)*2, 0x0000);
1371*53ee8cc1Swenshuai.xi 
1372*53ee8cc1Swenshuai.xi     // @0x0975
1373*53ee8cc1Swenshuai.xi     // [4:0]	reg_ckg_dvbtc_rs
1374*53ee8cc1Swenshuai.xi     // [11:8]	reg_ckg_dvbs_outer2x_dvbt_outer2x
1375*53ee8cc1Swenshuai.xi     // [15:12]	reg_ckg_dvbs_outer2x_dvbt_outer2x_miu
1376*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x75)*2, 0xc101);
1377*53ee8cc1Swenshuai.xi 
1378*53ee8cc1Swenshuai.xi     // @0x0976
1379*53ee8cc1Swenshuai.xi     // [4:0]	reg_ckg_dvbs_outer2x_dvbt_outer2x_dvbt2_inner2x
1380*53ee8cc1Swenshuai.xi     //DVBT2
1381*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x76)*2, 0x000c);
1382*53ee8cc1Swenshuai.xi 
1383*53ee8cc1Swenshuai.xi     // @0x0977
1384*53ee8cc1Swenshuai.xi     // [3:0]	reg_ckg_dvbt2_inner4x_dvbtc_rs
1385*53ee8cc1Swenshuai.xi     // [8:4]	reg_ckg_dvbtm_sram_adc_t22x_dvbtc_rs
1386*53ee8cc1Swenshuai.xi     //DVBT2
1387*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x77)*2, 0x0000);
1388*53ee8cc1Swenshuai.xi 
1389*53ee8cc1Swenshuai.xi //    $display("--------------------------------------");
1390*53ee8cc1Swenshuai.xi //    $display("Initialize Transport Stream synthesizer and APLL");
1391*53ee8cc1Swenshuai.xi //    $display("--------------------------------------");
1392*53ee8cc1Swenshuai.xi 
1393*53ee8cc1Swenshuai.xi     // [15:0]	reg_synth_set[15: 0]
1394*53ee8cc1Swenshuai.xi     // [ 7:0]	reg_synth_set[23:16]
1395*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x51)*2, 0x0000);
1396*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x52)*2, 0x0040);
1397*53ee8cc1Swenshuai.xi 
1398*53ee8cc1Swenshuai.xi 
1399*53ee8cc1Swenshuai.xi     // [0]	reg_synth_reset
1400*53ee8cc1Swenshuai.xi     // [1]	reg_synth_ssc_en
1401*53ee8cc1Swenshuai.xi     // [2]	reg_synth_ssc_mode
1402*53ee8cc1Swenshuai.xi     // [4]	reg_synth_sld
1403*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x50)*2, 0x0010);
1404*53ee8cc1Swenshuai.xi 
1405*53ee8cc1Swenshuai.xi     // [1:0]	reg_apll_loop_div_first
1406*53ee8cc1Swenshuai.xi     // [15:8]	reg_apll_loop_div_second
1407*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x57)*2, 0x0000);
1408*53ee8cc1Swenshuai.xi 
1409*53ee8cc1Swenshuai.xi     // [0]	reg_apll_pd
1410*53ee8cc1Swenshuai.xi     // [1]	reg_apll_reset
1411*53ee8cc1Swenshuai.xi     // [2]	reg_apll_porst
1412*53ee8cc1Swenshuai.xi     // [3]	reg_apll_vco_offset
1413*53ee8cc1Swenshuai.xi     // [4]	reg_apll_en_ts
1414*53ee8cc1Swenshuai.xi     // [5]	reg_apll_endcc
1415*53ee8cc1Swenshuai.xi     // [6]	reg_apll_clkin_sel
1416*53ee8cc1Swenshuai.xi     // [8]	reg_apll_ts_mode
1417*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x55)*2, 0x0100);
1418*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x55)*2, 0x0110);
1419*53ee8cc1Swenshuai.xi 
1420*53ee8cc1Swenshuai.xi     // [16:0]	reg_apll_test
1421*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x59)*2, 0x0000);
1422*53ee8cc1Swenshuai.xi 
1423*53ee8cc1Swenshuai.xi     // 0x0920
1424*53ee8cc1Swenshuai.xi     // [3:0]	reg_ckg_ts_apll_div[2:0]
1425*53ee8cc1Swenshuai.xi       bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x20)*2, 0x0004);
1426*53ee8cc1Swenshuai.xi 
1427*53ee8cc1Swenshuai.xi //if(_sDMD_MSB124X_InitData.u8WO_Sdram==0)
1428*53ee8cc1Swenshuai.xi {
1429*53ee8cc1Swenshuai.xi     // -------------------------------------------------------------------
1430*53ee8cc1Swenshuai.xi     // initialize MIU
1431*53ee8cc1Swenshuai.xi     // -------------------------------------------------------------------
1432*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x0f)*2, 0x0000);
1433*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x0f)*2, 0x0000);
1434*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x0f)*2, 0x0000);
1435*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x0f)*2, 0x0c01);
1436*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x0f)*2, 0x0c00);
1437*53ee8cc1Swenshuai.xi 
1438*53ee8cc1Swenshuai.xi 
1439*53ee8cc1Swenshuai.xi // set frequence 180MHz
1440*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x11)*2, 0x60cc);
1441*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x11)*2, 0x00cc);
1442*53ee8cc1Swenshuai.xi     //bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x11)*2, 0x0066);
1443*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x11)*2, 0x004c);  // 133Mhz
1444*53ee8cc1Swenshuai.xi     //bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x10)*2, 0x2666);
1445*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x10)*2, 0x33f8);  // 133Mhz
1446*53ee8cc1Swenshuai.xi     // yihao 20130925 for new apll model
1447*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x12)*2, 0x0000);
1448*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x13)*2, 0x0000);
1449*53ee8cc1Swenshuai.xi     // yihao 20130925 for new apll model
1450*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x16)*2, 0x0000);
1451*53ee8cc1Swenshuai.xi     //bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x1c)*2, 0x0080);
1452*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x1c)*2, 0x00b0);  //fine tune by Yihao Lo
1453*53ee8cc1Swenshuai.xi 
1454*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x01)*2, 0x8100);
1455*53ee8cc1Swenshuai.xi     // cke				: [0]
1456*53ee8cc1Swenshuai.xi     // reg_self_refresh		: [1]
1457*53ee8cc1Swenshuai.xi     // reg_dynamic_cke		: [2]
1458*53ee8cc1Swenshuai.xi     // reg_dynamic_ck_odt		: [3]
1459*53ee8cc1Swenshuai.xi     // reg_dram_bus			: [5:4] 00: 16b, 01: 32b, 10: 64b
1460*53ee8cc1Swenshuai.xi     // reg_dram_type			: [7:6] 00: sdr, 01: ddr, 10: ddr2
1461*53ee8cc1Swenshuai.xi     // reg_4ba			: [8]    0: 2bk,  1: 4bk
1462*53ee8cc1Swenshuai.xi     		// reg_col_size			: [10:9]
1463*53ee8cc1Swenshuai.xi     // reg_cke_oenz			: [12]
1464*53ee8cc1Swenshuai.xi     // reg_dq_oenz			: [13]
1465*53ee8cc1Swenshuai.xi     // reg_adr_oenz			: [14]
1466*53ee8cc1Swenshuai.xi     // reg_cs_z			: [15]
1467*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x01)*2, 0xe100);
1468*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x01)*2, 0x8100);
1469*53ee8cc1Swenshuai.xi     //bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x02)*2, 0x0360);
1470*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x02)*2, 0x0371);  //fine tune by Yihao Lo
1471*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x03)*2, 0x0030);
1472*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x04)*2, 0x33c9);
1473*53ee8cc1Swenshuai.xi     // reg_tRAS                      : [3:0]        9
1474*53ee8cc1Swenshuai.xi     // reg_tRC                       : [7:4]        c
1475*53ee8cc1Swenshuai.xi     // reg_tRCD                      : [11:8]       3
1476*53ee8cc1Swenshuai.xi     // reg_tRP                       : [15:12]      3
1477*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x05)*2, 0x4232);
1478*53ee8cc1Swenshuai.xi     // reg_tRRD                      : [3:0]         2
1479*53ee8cc1Swenshuai.xi     // tWR                           : [7:4]         3
1480*53ee8cc1Swenshuai.xi     // reg_tMRD                      : [11:8]        2
1481*53ee8cc1Swenshuai.xi     // reg_tRTP			: [15:12]	4
1482*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x06)*2, 0x5532);
1483*53ee8cc1Swenshuai.xi     // reg_w2r_dly(tWTR)             : [3:0]         2
1484*53ee8cc1Swenshuai.xi     // reg_w2r_oen_dly               : [7:4]         3
1485*53ee8cc1Swenshuai.xi     // reg_r2w_dly(tRTW)             : [11:8]        5
1486*53ee8cc1Swenshuai.xi     // reg_r2w_oen_dly               : [15:12]       5
1487*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x07)*2, 0x400c);
1488*53ee8cc1Swenshuai.xi     // tRFC                          : [5:0]         c
1489*53ee8cc1Swenshuai.xi     // reg_tRAS[4]                   : [6]           0
1490*53ee8cc1Swenshuai.xi     // reg_tRC[4]                    : [7]           0
1491*53ee8cc1Swenshuai.xi     // reg_write_latency             : [10:8]        0
1492*53ee8cc1Swenshuai.xi     // reg_tCCD                      : [15:14]       1
1493*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x0e)*2, 0x1800);
1494*53ee8cc1Swenshuai.xi 
1495*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x23)*2, 0x7ffe);
1496*53ee8cc1Swenshuai.xi 
1497*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x20)*2, 0xc001);
1498*53ee8cc1Swenshuai.xi 
1499*53ee8cc1Swenshuai.xi     //delay 1
1500*53ee8cc1Swenshuai.xi     MsOS_DelayTaskUs(100);
1501*53ee8cc1Swenshuai.xi 
1502*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x0f)*2, 0x0c01);
1503*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x0f)*2, 0x0c00);
1504*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x0f)*2, 0x0c01);
1505*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x0f)*2, 0x0c00);
1506*53ee8cc1Swenshuai.xi 
1507*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x01)*2, 0x010d);
1508*53ee8cc1Swenshuai.xi 
1509*53ee8cc1Swenshuai.xi 
1510*53ee8cc1Swenshuai.xi // $display("--------Initial DRAM start here!!!");
1511*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x00)*2, 0x0001);
1512*53ee8cc1Swenshuai.xi 
1513*53ee8cc1Swenshuai.xi     // wait(test_chip_top.dut.i_dig_top.miu_inst.miu_reg_0.init_done);
1514*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_GetReg(0x1201, &u8_tmp);
1515*53ee8cc1Swenshuai.xi     //printf(("[MSB124X]MIU wait init done, u8_tmp=0x%x, bRet=0x%x\n", u8_tmp, bRet));
1516*53ee8cc1Swenshuai.xi     while (u8_tmp != 0x80)
1517*53ee8cc1Swenshuai.xi     {
1518*53ee8cc1Swenshuai.xi         if (u8_timeout++ > 200)
1519*53ee8cc1Swenshuai.xi         {
1520*53ee8cc1Swenshuai.xi             printf(("[MSB124X][err]MIU init failure...\n"));
1521*53ee8cc1Swenshuai.xi             return FALSE;
1522*53ee8cc1Swenshuai.xi         }
1523*53ee8cc1Swenshuai.xi         // 10us delay
1524*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(10);
1525*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_GetReg(0x1201, &u8_tmp);
1526*53ee8cc1Swenshuai.xi     }
1527*53ee8cc1Swenshuai.xi     //printf(("[MSB124X]MIU init done, u8_tmp=0x%x, bRet=0x%x\n", u8_tmp, bRet));
1528*53ee8cc1Swenshuai.xi 
1529*53ee8cc1Swenshuai.xi     // $display("--------Initial Done");
1530*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x08)*2, 0x0001);
1531*53ee8cc1Swenshuai.xi 
1532*53ee8cc1Swenshuai.xi     // $display("-------------------------");
1533*53ee8cc1Swenshuai.xi     // $display("-- miu self test start --");
1534*53ee8cc1Swenshuai.xi     // $display("-------------------------");
1535*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x71)*2, 0x0000);
1536*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x72)*2, 0x0010);
1537*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x74)*2, 0x5aa5);
1538*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x70)*2, 0x0001);
1539*53ee8cc1Swenshuai.xi 
1540*53ee8cc1Swenshuai.xi     // #10000;
1541*53ee8cc1Swenshuai.xi     //delay 1
1542*53ee8cc1Swenshuai.xi     MsOS_DelayTaskUs(100);
1543*53ee8cc1Swenshuai.xi 
1544*53ee8cc1Swenshuai.xi     //wait test_finish
1545*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_GetReg((0x1200 + (0x70) * 2 + 1), &u8_tmp);
1546*53ee8cc1Swenshuai.xi     //printf(("[MSB124X]MIU wait test done, u8_tmp=0x%x,bRet=0x%x\n", u8_tmp, bRet));
1547*53ee8cc1Swenshuai.xi     while ((u8_tmp & 0x80) != 0x80)
1548*53ee8cc1Swenshuai.xi     {
1549*53ee8cc1Swenshuai.xi         if (u8_timeout++ > 200)
1550*53ee8cc1Swenshuai.xi         {
1551*53ee8cc1Swenshuai.xi             printf(("[MSB124X][err]MIU self test NOT finished...\n"));
1552*53ee8cc1Swenshuai.xi             return FALSE;
1553*53ee8cc1Swenshuai.xi         }
1554*53ee8cc1Swenshuai.xi         // 10us delay
1555*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(10);
1556*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_GetReg((0x1200 + (0x70) * 2 + 1), &u8_tmp);
1557*53ee8cc1Swenshuai.xi     }
1558*53ee8cc1Swenshuai.xi 
1559*53ee8cc1Swenshuai.xi      // #10000;
1560*53ee8cc1Swenshuai.xi      //delay 1
1561*53ee8cc1Swenshuai.xi      MsOS_DelayTaskUs(100);
1562*53ee8cc1Swenshuai.xi 
1563*53ee8cc1Swenshuai.xi     // MIU self test FAIL let program stuck in this while loop
1564*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_GetReg((0x1200 + (0x70) * 2 + 1), &u8_tmp);
1565*53ee8cc1Swenshuai.xi 
1566*53ee8cc1Swenshuai.xi     if (u8_tmp == 0x40)
1567*53ee8cc1Swenshuai.xi     {
1568*53ee8cc1Swenshuai.xi         printf(("@MSB124X, error, MIU self test fail !!!!\n"));
1569*53ee8cc1Swenshuai.xi         bRet = FALSE;
1570*53ee8cc1Swenshuai.xi     }
1571*53ee8cc1Swenshuai.xi     else
1572*53ee8cc1Swenshuai.xi     {
1573*53ee8cc1Swenshuai.xi         printf(("@MSB124X, MIU self test successful.\n"));
1574*53ee8cc1Swenshuai.xi     }
1575*53ee8cc1Swenshuai.xi 
1576*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1200+(0x23)*2, 0x0000);
1577*53ee8cc1Swenshuai.xi 
1578*53ee8cc1Swenshuai.xi     // -------------------------------------------------------------------
1579*53ee8cc1Swenshuai.xi     // initialize MIU  finish
1580*53ee8cc1Swenshuai.xi     // -------------------------------------------------------------------
1581*53ee8cc1Swenshuai.xi }
1582*53ee8cc1Swenshuai.xi     // -------------------------------------------------------------------
1583*53ee8cc1Swenshuai.xi     //  Turn on pads
1584*53ee8cc1Swenshuai.xi     // -------------------------------------------------------------------
1585*53ee8cc1Swenshuai.xi 
1586*53ee8cc1Swenshuai.xi     // ------Turn off all pad in
1587*53ee8cc1Swenshuai.xi     // [0] reg_set_pad_low
1588*53ee8cc1Swenshuai.xi     // [1] reg_set_pad_high
1589*53ee8cc1Swenshuai.xi     // [2] reg_set_i2cs_pad_low
1590*53ee8cc1Swenshuai.xi     // [3] reg_set_i2cs_pad_high
1591*53ee8cc1Swenshuai.xi     // [8] reg_turn_off_pad
1592*53ee8cc1Swenshuai.xi      bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x28)*2, 0x0000);
1593*53ee8cc1Swenshuai.xi 
1594*53ee8cc1Swenshuai.xi     // ------I2CM pad on
1595*53ee8cc1Swenshuai.xi     // [1:0]    reg_iicm_pad_sel[1:0]	1:iicm enable 2:UART enable
1596*53ee8cc1Swenshuai.xi     // [4]	    reg_i2c_sbpm_en		1: enable I2CS bypass to I2CM function
1597*53ee8cc1Swenshuai.xi     // [12:8]   reg_i2c_sbpm_idle_num[4:0]	a: default
1598*53ee8cc1Swenshuai.xi      bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x08)*2, 0x0a01);
1599*53ee8cc1Swenshuai.xi 
1600*53ee8cc1Swenshuai.xi     // ------Transport Stream pad on (except TS ERR pad)
1601*53ee8cc1Swenshuai.xi     // [15:0]   reg_en_ts_pad[15:0]	0x00ff:normal TS location 0xff00:reverse TS location
1602*53ee8cc1Swenshuai.xi      bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x2d)*2, 0x00ff);
1603*53ee8cc1Swenshuai.xi 
1604*53ee8cc1Swenshuai.xi     // ------Transport Stream pad on (TS ERR pad)
1605*53ee8cc1Swenshuai.xi     // [0]	    reg_en_ts_err_pad	1: enable
1606*53ee8cc1Swenshuai.xi     // [4]	    reg_ts_err_pol	1: inverse 0:normal
1607*53ee8cc1Swenshuai.xi      bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x2e)*2, 0x0000);
1608*53ee8cc1Swenshuai.xi 
1609*53ee8cc1Swenshuai.xi     // ------AGC pad on
1610*53ee8cc1Swenshuai.xi     // [0] reg_ifagc_t_enable
1611*53ee8cc1Swenshuai.xi     // [1] reg_ifagc_t_odmode
1612*53ee8cc1Swenshuai.xi     // [2] reg_ifagc_t_data_sel
1613*53ee8cc1Swenshuai.xi     // [4] reg_ifagc_t_force_enable
1614*53ee8cc1Swenshuai.xi     // [5] reg_ifagc_t_force_value
1615*53ee8cc1Swenshuai.xi     // [8] reg_ifagc_s_enable
1616*53ee8cc1Swenshuai.xi     // [9] reg_ifagc_s_odmode
1617*53ee8cc1Swenshuai.xi     // [10] reg_ifagc_s_data_sel
1618*53ee8cc1Swenshuai.xi     // [12] reg_ifagc_s_force_enable
1619*53ee8cc1Swenshuai.xi     // [13] reg_ifagc_s_force_value
1620*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0a00+(0x18)*2, 0x0001);
1621*53ee8cc1Swenshuai.xi 
1622*53ee8cc1Swenshuai.xi     //DMD_UNLOCK();
1623*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
1624*53ee8cc1Swenshuai.xi     printf("[msb124x][end]MSB124X_HW_init, bRet=0x%x\n",bRet);
1625*53ee8cc1Swenshuai.xi     #endif
1626*53ee8cc1Swenshuai.xi     return bRet;
1627*53ee8cc1Swenshuai.xi }
1628*53ee8cc1Swenshuai.xi 
_Load2Sdram(MS_U8 * u8_ptr,MS_U16 data_length,MS_U16 sdram_win_offset_base)1629*53ee8cc1Swenshuai.xi static MS_BOOL _Load2Sdram(MS_U8 *u8_ptr, MS_U16 data_length, MS_U16 sdram_win_offset_base)
1630*53ee8cc1Swenshuai.xi {
1631*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
1632*53ee8cc1Swenshuai.xi     MS_U16  sdram_win_offset = sdram_win_offset_base;
1633*53ee8cc1Swenshuai.xi     MS_U16  x_data_offset = 0;
1634*53ee8cc1Swenshuai.xi     MS_U16  y_cir_addr = 0;
1635*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
1636*53ee8cc1Swenshuai.xi     MS_U32 u32tmm_3 = 0, u32tmm_4 = 0;
1637*53ee8cc1Swenshuai.xi     #endif
1638*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
1639*53ee8cc1Swenshuai.xi 
1640*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
1641*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
1642*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][beg]Load2Sdram, len=0x%x, win_offset=0x%x\n",data_length,sdram_win_offset_base));
1643*53ee8cc1Swenshuai.xi     u32tmm_3 = MsOS_GetSystemTime();
1644*53ee8cc1Swenshuai.xi     #endif
1645*53ee8cc1Swenshuai.xi 
1646*53ee8cc1Swenshuai.xi     // mask miu access for all and mcu
1647*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(0x1200+(0x23)*2 + 1,0x0f);
1648*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(0x1200+(0x23)*2,0xf0);
1649*53ee8cc1Swenshuai.xi     // 10us delay
1650*53ee8cc1Swenshuai.xi     MsOS_DelayTaskUs(10);
1651*53ee8cc1Swenshuai.xi 
1652*53ee8cc1Swenshuai.xi     // Disable MCU
1653*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(0x0b00+(0x19)*2, 0x03);
1654*53ee8cc1Swenshuai.xi 
1655*53ee8cc1Swenshuai.xi     if (pDemod->_sDMD_MSB124X_InitData.bEnableSPILoadCode)
1656*53ee8cc1Swenshuai.xi     {
1657*53ee8cc1Swenshuai.xi         MS_U32 u32Addr = 0;
1658*53ee8cc1Swenshuai.xi 
1659*53ee8cc1Swenshuai.xi         u32Addr = (MS_U32)sdram_win_offset_base * 0x1000; // unit: 4K
1660*53ee8cc1Swenshuai.xi         bRet &= MDrv_DMD_SSPI_MIU_Writes(u32Addr, u8_ptr, data_length);
1661*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1662*53ee8cc1Swenshuai.xi         DBG_DEMOD_LOAD_I2C(printf("[msb124x]u32Addr=%08lx\n",u32Addr));
1663*53ee8cc1Swenshuai.xi #endif
1664*53ee8cc1Swenshuai.xi 
1665*53ee8cc1Swenshuai.xi #if (SDRAM_DATA_CHECK == 1)
1666*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1667*53ee8cc1Swenshuai.xi         DBG_DEMOD_LOAD_I2C(printf("[msb124x]SDRAM data check...\n"));
1668*53ee8cc1Swenshuai.xi #endif
1669*53ee8cc1Swenshuai.xi         MS_U16 i = 0, j = 0, index = 0;
1670*53ee8cc1Swenshuai.xi         MS_U8 buf[SPI_DEVICE_BUFFER_SIZE]= {0};
1671*53ee8cc1Swenshuai.xi 
1672*53ee8cc1Swenshuai.xi         if((data_length % SPI_DEVICE_BUFFER_SIZE) == 0)
1673*53ee8cc1Swenshuai.xi             index = data_length / SPI_DEVICE_BUFFER_SIZE;
1674*53ee8cc1Swenshuai.xi         else
1675*53ee8cc1Swenshuai.xi             index = data_length / SPI_DEVICE_BUFFER_SIZE + 1;
1676*53ee8cc1Swenshuai.xi 
1677*53ee8cc1Swenshuai.xi         for (i=0; i<index; i++)
1678*53ee8cc1Swenshuai.xi         {
1679*53ee8cc1Swenshuai.xi             memset(buf, 0x00, SPI_DEVICE_BUFFER_SIZE);
1680*53ee8cc1Swenshuai.xi 
1681*53ee8cc1Swenshuai.xi             bRet &= MDrv_DMD_SSPI_MIU_Reads(u32Addr+SPI_DEVICE_BUFFER_SIZE*i, buf, SPI_DEVICE_BUFFER_SIZE);
1682*53ee8cc1Swenshuai.xi             for (j=0; j<SPI_DEVICE_BUFFER_SIZE; j++)
1683*53ee8cc1Swenshuai.xi             {
1684*53ee8cc1Swenshuai.xi                 if (buf[j] != u8_ptr[SPI_DEVICE_BUFFER_SIZE*i+j])
1685*53ee8cc1Swenshuai.xi                 {
1686*53ee8cc1Swenshuai.xi                     printf("[msb124x]error, u32Addr=0x%08lx, y=0x%x, x=0x%x\n",u32Addr+SPI_DEVICE_BUFFER_SIZE*i+j, buf[j] , u8_ptr[j]);
1687*53ee8cc1Swenshuai.xi                 }
1688*53ee8cc1Swenshuai.xi             }
1689*53ee8cc1Swenshuai.xi         }
1690*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1691*53ee8cc1Swenshuai.xi         DBG_DEMOD_LOAD_I2C(printf("[msb124x]SDRAM data check...Done\n"));
1692*53ee8cc1Swenshuai.xi #endif
1693*53ee8cc1Swenshuai.xi #endif
1694*53ee8cc1Swenshuai.xi     }
1695*53ee8cc1Swenshuai.xi     else
1696*53ee8cc1Swenshuai.xi     {
1697*53ee8cc1Swenshuai.xi         // Change CH from 3 to 0
1698*53ee8cc1Swenshuai.xi         if (_MSB124X_I2C_CH_Reset(0) == FALSE)
1699*53ee8cc1Swenshuai.xi         {
1700*53ee8cc1Swenshuai.xi             printf(">>>MSB124X CH0 Reset:Fail\n");
1701*53ee8cc1Swenshuai.xi             return FALSE;
1702*53ee8cc1Swenshuai.xi         }
1703*53ee8cc1Swenshuai.xi         else
1704*53ee8cc1Swenshuai.xi         {
1705*53ee8cc1Swenshuai.xi 
1706*53ee8cc1Swenshuai.xi             // set xData map upper and low bound for 64k DRAM window
1707*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x2B00+(0x63)*2, 0x3F24);
1708*53ee8cc1Swenshuai.xi 
1709*53ee8cc1Swenshuai.xi             // set xData map offset for 64k DRAM window, 64kbytes alignment
1710*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x2B00+(0x64)*2, 0x0000);
1711*53ee8cc1Swenshuai.xi 
1712*53ee8cc1Swenshuai.xi             // set xData map upper and low bound for 4k DRAM window
1713*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x2B00+(0x65)*2, 0x2014);
1714*53ee8cc1Swenshuai.xi 
1715*53ee8cc1Swenshuai.xi             // set xData map offset for 4k DRAM window, 4kbytes alignment
1716*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x2B00+(0x66)*2, sdram_win_offset++);
1717*53ee8cc1Swenshuai.xi 
1718*53ee8cc1Swenshuai.xi             // enable xData map for DRAM
1719*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x2B00+(0x62)*2, 0x0007);
1720*53ee8cc1Swenshuai.xi 
1721*53ee8cc1Swenshuai.xi             for(x_data_offset = 0, y_cir_addr = SDRAM_BASE; x_data_offset < data_length;)
1722*53ee8cc1Swenshuai.xi             {
1723*53ee8cc1Swenshuai.xi                 if (y_cir_addr == 0x6000)
1724*53ee8cc1Swenshuai.xi                 {
1725*53ee8cc1Swenshuai.xi                     //set xData map offset for 4k DRAM window, 4kbytes alignment
1726*53ee8cc1Swenshuai.xi                     // 0x1000, 4096 bytes
1727*53ee8cc1Swenshuai.xi                     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x2B00+(0x66)*2, sdram_win_offset++);
1728*53ee8cc1Swenshuai.xi                     y_cir_addr = SDRAM_BASE;
1729*53ee8cc1Swenshuai.xi                 }
1730*53ee8cc1Swenshuai.xi 
1731*53ee8cc1Swenshuai.xi                 // max 0x200, error above.....
1732*53ee8cc1Swenshuai.xi 
1733*53ee8cc1Swenshuai.xi                 if((data_length - x_data_offset) >= LOAD_CODE_I2C_BLOCK_NUM)
1734*53ee8cc1Swenshuai.xi                 {
1735*53ee8cc1Swenshuai.xi                     bRet &= _MDrv_DMD_MSB124X_SetRegs(y_cir_addr, (u8_ptr + x_data_offset),LOAD_CODE_I2C_BLOCK_NUM);
1736*53ee8cc1Swenshuai.xi                     y_cir_addr += LOAD_CODE_I2C_BLOCK_NUM;
1737*53ee8cc1Swenshuai.xi                     x_data_offset += LOAD_CODE_I2C_BLOCK_NUM;
1738*53ee8cc1Swenshuai.xi                 }
1739*53ee8cc1Swenshuai.xi                 else
1740*53ee8cc1Swenshuai.xi                 {
1741*53ee8cc1Swenshuai.xi                     bRet &= _MDrv_DMD_MSB124X_SetRegs(y_cir_addr, (u8_ptr + x_data_offset),data_length - x_data_offset);
1742*53ee8cc1Swenshuai.xi                     y_cir_addr += (data_length - x_data_offset);
1743*53ee8cc1Swenshuai.xi                     x_data_offset += (data_length - x_data_offset);
1744*53ee8cc1Swenshuai.xi                 }
1745*53ee8cc1Swenshuai.xi             }
1746*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
1747*53ee8cc1Swenshuai.xi             DBG_DEMOD_LOAD_I2C(printf("[msb124x]x_data_offset=%d,y_cir_addr=%d,z_block_num=%d\n",x_data_offset,y_cir_addr,sdram_win_offset));
1748*53ee8cc1Swenshuai.xi             #endif
1749*53ee8cc1Swenshuai.xi #if (SDRAM_DATA_CHECK == 1)
1750*53ee8cc1Swenshuai.xi             // beg data check.
1751*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
1752*53ee8cc1Swenshuai.xi             DBG_DEMOD_LOAD_I2C(printf("[msb124x]SDRAM data check...\n"));
1753*53ee8cc1Swenshuai.xi             #endif
1754*53ee8cc1Swenshuai.xi 
1755*53ee8cc1Swenshuai.xi             sdram_win_offset = sdram_win_offset_base;
1756*53ee8cc1Swenshuai.xi 
1757*53ee8cc1Swenshuai.xi             // set xData map offset for 4k DRAM window, 4kbytes alignment
1758*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x2B00+(0x66)*2, sdram_win_offset++);
1759*53ee8cc1Swenshuai.xi 
1760*53ee8cc1Swenshuai.xi             for(x_data_offset = 0, y_cir_addr = SDRAM_BASE; x_data_offset < data_length;)
1761*53ee8cc1Swenshuai.xi             {
1762*53ee8cc1Swenshuai.xi                 MS_U8 u8_tmp;
1763*53ee8cc1Swenshuai.xi                 if (y_cir_addr == 0x6000)
1764*53ee8cc1Swenshuai.xi                 {
1765*53ee8cc1Swenshuai.xi                     //set xData map offset for 4k DRAM window, 4kbytes alignment
1766*53ee8cc1Swenshuai.xi                     // 0x1000, 4096 bytes
1767*53ee8cc1Swenshuai.xi                     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x2B00+(0x66)*2, sdram_win_offset++);
1768*53ee8cc1Swenshuai.xi                     y_cir_addr = SDRAM_BASE;
1769*53ee8cc1Swenshuai.xi                 }
1770*53ee8cc1Swenshuai.xi 
1771*53ee8cc1Swenshuai.xi                 bRet &= _MDrv_DMD_MSB124X_GetReg(y_cir_addr++, &u8_tmp);
1772*53ee8cc1Swenshuai.xi                 if(u8_tmp != *(u8_ptr + x_data_offset++))
1773*53ee8cc1Swenshuai.xi                 {
1774*53ee8cc1Swenshuai.xi                     printf("[msb124x]error, idx=0x%x, y=0x%x, x=0x%x\n",y_cir_addr-1, u8_tmp, *(u8_ptr + x_data_offset-1));
1775*53ee8cc1Swenshuai.xi                 }
1776*53ee8cc1Swenshuai.xi             }
1777*53ee8cc1Swenshuai.xi 
1778*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
1779*53ee8cc1Swenshuai.xi             DBG_DEMOD_LOAD_I2C(printf("[msb124x]SDRAM data check...Done\n"));
1780*53ee8cc1Swenshuai.xi             #endif
1781*53ee8cc1Swenshuai.xi 
1782*53ee8cc1Swenshuai.xi             // end data check
1783*53ee8cc1Swenshuai.xi #endif
1784*53ee8cc1Swenshuai.xi             //  Release xData map for SDRAM
1785*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x2B00+(0x62)*2, 0x0000);
1786*53ee8cc1Swenshuai.xi 
1787*53ee8cc1Swenshuai.xi             // Channel changed from CH 0x00 to CH 0x03
1788*53ee8cc1Swenshuai.xi             if (_MSB124X_I2C_CH_Reset(3) == FALSE)
1789*53ee8cc1Swenshuai.xi             {
1790*53ee8cc1Swenshuai.xi                 ERR_DEMOD_MSB(printf(">>>MSB124X CH3 Reset:Fail\n"));
1791*53ee8cc1Swenshuai.xi                 return FALSE;
1792*53ee8cc1Swenshuai.xi             }
1793*53ee8cc1Swenshuai.xi         }
1794*53ee8cc1Swenshuai.xi     }
1795*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
1796*53ee8cc1Swenshuai.xi     u32tmm_4 = MsOS_GetSystemTime();
1797*53ee8cc1Swenshuai.xi     printf("[tmm2]t4-t3 = %ld (%ld - %ld)\n",u32tmm_4-u32tmm_3,u32tmm_4,u32tmm_3);
1798*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][end]Load2Sdram, len=0x%x, win_offset=0x%x\n",data_length,sdram_win_offset_base));
1799*53ee8cc1Swenshuai.xi     if (!bRet) printf("%s %d Error\n",__func__, __LINE__);
1800*53ee8cc1Swenshuai.xi     #endif
1801*53ee8cc1Swenshuai.xi 
1802*53ee8cc1Swenshuai.xi     return bRet;
1803*53ee8cc1Swenshuai.xi }
1804*53ee8cc1Swenshuai.xi 
1805*53ee8cc1Swenshuai.xi //no sdram case
_Load2Sram(MS_U8 * u8_ptr,MS_U16 data_length,MS_U16 sram_win_offset_base)1806*53ee8cc1Swenshuai.xi static MS_BOOL _Load2Sram(MS_U8 *u8_ptr, MS_U16 data_length, MS_U16 sram_win_offset_base)
1807*53ee8cc1Swenshuai.xi {
1808*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
1809*53ee8cc1Swenshuai.xi     MS_U16  sram_win_offset = sram_win_offset_base;
1810*53ee8cc1Swenshuai.xi     MS_U16  x_data_offset = 0;
1811*53ee8cc1Swenshuai.xi     MS_U16  y_cir_addr = 0;
1812*53ee8cc1Swenshuai.xi     MS_U8 u8data;
1813*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
1814*53ee8cc1Swenshuai.xi     MS_U32 u32tmm_3 = 0, u32tmm_4 = 0;
1815*53ee8cc1Swenshuai.xi     #endif
1816*53ee8cc1Swenshuai.xi 
1817*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
1818*53ee8cc1Swenshuai.xi 
1819*53ee8cc1Swenshuai.xi     UNUSED(sram_win_offset);
1820*53ee8cc1Swenshuai.xi 
1821*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1822*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
1823*53ee8cc1Swenshuai.xi     u32tmm_3 = MsOS_GetSystemTime();
1824*53ee8cc1Swenshuai.xi #endif
1825*53ee8cc1Swenshuai.xi 
1826*53ee8cc1Swenshuai.xi     if (pDemod->_sDMD_MSB124X_InitData.bEnableSPILoadCode)
1827*53ee8cc1Swenshuai.xi     {
1828*53ee8cc1Swenshuai.xi          MS_U32 u32Addr = 0;
1829*53ee8cc1Swenshuai.xi          // mask miu access for all and mcu
1830*53ee8cc1Swenshuai.xi          bRet &= _MDrv_DMD_MSB124X_SetReg(0x1200+(0x23)*2 + 1,0x0f);
1831*53ee8cc1Swenshuai.xi          bRet &= _MDrv_DMD_MSB124X_SetReg(0x1200+(0x23)*2,0xf0);
1832*53ee8cc1Swenshuai.xi          // 10us delay
1833*53ee8cc1Swenshuai.xi          MsOS_DelayTaskUs(10);
1834*53ee8cc1Swenshuai.xi 
1835*53ee8cc1Swenshuai.xi          // Disable MCU
1836*53ee8cc1Swenshuai.xi          bRet &= _MDrv_DMD_MSB124X_SetReg(0x0b00+(0x19)*2, 0x03);
1837*53ee8cc1Swenshuai.xi 
1838*53ee8cc1Swenshuai.xi         // Enable sspi to sram
1839*53ee8cc1Swenshuai.xi         //[4:4]reg_sspi2sram_en;
1840*53ee8cc1Swenshuai.xi 	 bRet &= _MDrv_DMD_MSB124X_GetReg(0x0900 + (0x3a) * 2, &u8data);
1841*53ee8cc1Swenshuai.xi 	 bRet &= _MDrv_DMD_MSB124X_SetReg(0x0900 + (0x3a) * 2, u8data|0x10);
1842*53ee8cc1Swenshuai.xi 
1843*53ee8cc1Swenshuai.xi          //address[31:31] 1:direct to sram, 0:direct to sdram
1844*53ee8cc1Swenshuai.xi          u32Addr = 0x80000000;//SRAM_BASE<<16;
1845*53ee8cc1Swenshuai.xi          bRet &= MDrv_DMD_SSPI_MIU_Writes(u32Addr, u8_ptr, data_length);
1846*53ee8cc1Swenshuai.xi          //debug only, must remove
1847*53ee8cc1Swenshuai.xi          printf(" @@@ sram download by SPI \n");
1848*53ee8cc1Swenshuai.xi 
1849*53ee8cc1Swenshuai.xi          #ifdef MS_DEBUG
1850*53ee8cc1Swenshuai.xi          DBG_DEMOD_LOAD_I2C(printf("[msb124x]u32Addr=%08lx\n",u32Addr));
1851*53ee8cc1Swenshuai.xi          #endif
1852*53ee8cc1Swenshuai.xi 
1853*53ee8cc1Swenshuai.xi         #if (SRAM_DATA_CHECK == 1)
1854*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
1855*53ee8cc1Swenshuai.xi                 DBG_DEMOD_LOAD_I2C(printf("[msb124x]SRAM data check...\n"));
1856*53ee8cc1Swenshuai.xi         #endif
1857*53ee8cc1Swenshuai.xi                 MS_U16 i = 0, j = 0, index = 0;
1858*53ee8cc1Swenshuai.xi                 MS_U8 buf[SPI_DEVICE_BUFFER_SIZE]= {0};
1859*53ee8cc1Swenshuai.xi 
1860*53ee8cc1Swenshuai.xi                 if((data_length % SPI_DEVICE_BUFFER_SIZE) == 0)
1861*53ee8cc1Swenshuai.xi                     index = data_length / SPI_DEVICE_BUFFER_SIZE;
1862*53ee8cc1Swenshuai.xi                 else
1863*53ee8cc1Swenshuai.xi                     index = data_length / SPI_DEVICE_BUFFER_SIZE + 1;
1864*53ee8cc1Swenshuai.xi 
1865*53ee8cc1Swenshuai.xi                 for (i=0; i<index; i++)
1866*53ee8cc1Swenshuai.xi                 {
1867*53ee8cc1Swenshuai.xi                     memset(buf, 0x00, SPI_DEVICE_BUFFER_SIZE);
1868*53ee8cc1Swenshuai.xi 
1869*53ee8cc1Swenshuai.xi                     bRet &= MDrv_DMD_SSPI_MIU_Reads(u32Addr+SPI_DEVICE_BUFFER_SIZE*i, buf, SPI_DEVICE_BUFFER_SIZE);
1870*53ee8cc1Swenshuai.xi                     for (j=0; j<SPI_DEVICE_BUFFER_SIZE; j++)
1871*53ee8cc1Swenshuai.xi                     {
1872*53ee8cc1Swenshuai.xi                         if (buf[j] != u8_ptr[SPI_DEVICE_BUFFER_SIZE*i+j])
1873*53ee8cc1Swenshuai.xi                         {
1874*53ee8cc1Swenshuai.xi                             printf("[msb124x]error, u32Addr=0x%08lx, y=0x%x, x=0x%x\n",u32Addr+SPI_DEVICE_BUFFER_SIZE*i+j, buf[j] , u8_ptr[j]);
1875*53ee8cc1Swenshuai.xi                         }
1876*53ee8cc1Swenshuai.xi                     }
1877*53ee8cc1Swenshuai.xi                 }
1878*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
1879*53ee8cc1Swenshuai.xi                 DBG_DEMOD_LOAD_I2C(printf("[msb124x]SRAM data check...Done\n"));
1880*53ee8cc1Swenshuai.xi         #endif
1881*53ee8cc1Swenshuai.xi         #endif
1882*53ee8cc1Swenshuai.xi 
1883*53ee8cc1Swenshuai.xi         // Disable sspi to sram
1884*53ee8cc1Swenshuai.xi         //[4:4]reg_sspi2sram_en
1885*53ee8cc1Swenshuai.xi 	 bRet &= _MDrv_DMD_MSB124X_GetReg(0x0900 + (0x3a) * 2, &u8data);
1886*53ee8cc1Swenshuai.xi 	 bRet &= _MDrv_DMD_MSB124X_SetReg(0x0900 + (0x3a) * 2, u8data&(~0x10));
1887*53ee8cc1Swenshuai.xi 
1888*53ee8cc1Swenshuai.xi     }
1889*53ee8cc1Swenshuai.xi     else
1890*53ee8cc1Swenshuai.xi     {
1891*53ee8cc1Swenshuai.xi        //
1892*53ee8cc1Swenshuai.xi 
1893*53ee8cc1Swenshuai.xi        //---------------------------------------------------
1894*53ee8cc1Swenshuai.xi         if (_MSB124X_I2C_CH_Reset(3) == TRUE)
1895*53ee8cc1Swenshuai.xi         {
1896*53ee8cc1Swenshuai.xi              // Start MCU reset
1897*53ee8cc1Swenshuai.xi              bRet &= _MDrv_DMD_MSB124X_SetReg(0x0b32, 0x01);
1898*53ee8cc1Swenshuai.xi 
1899*53ee8cc1Swenshuai.xi              // Disable Watch-Dog
1900*53ee8cc1Swenshuai.xi              bRet &= _MSB124X_I2C_CH_Reset(0) ;
1901*53ee8cc1Swenshuai.xi              bRet &= _MDrv_DMD_MSB124X_SetReg(0x3008, 0x00);
1902*53ee8cc1Swenshuai.xi              bRet &= _MDrv_DMD_MSB124X_SetReg(0x3009, 0x00);
1903*53ee8cc1Swenshuai.xi              bRet &= _MDrv_DMD_MSB124X_SetReg(0x300A, 0x00);
1904*53ee8cc1Swenshuai.xi              bRet &= _MDrv_DMD_MSB124X_SetReg(0x300B, 0x00);
1905*53ee8cc1Swenshuai.xi         }
1906*53ee8cc1Swenshuai.xi          else
1907*53ee8cc1Swenshuai.xi          {
1908*53ee8cc1Swenshuai.xi               ERR_DEMOD_MSB( printf(" _MSB124X_I2C_CH_Reset(3) failed \n"));
1909*53ee8cc1Swenshuai.xi     	    return FALSE;
1910*53ee8cc1Swenshuai.xi          }
1911*53ee8cc1Swenshuai.xi 
1912*53ee8cc1Swenshuai.xi         if (_MSB124X_I2C_CH_Reset(3) == FALSE)
1913*53ee8cc1Swenshuai.xi         {
1914*53ee8cc1Swenshuai.xi             ERR_DEMOD_MSB(printf(">>>MSB124X CH3 Reset:Fail\n"));
1915*53ee8cc1Swenshuai.xi             return FALSE;
1916*53ee8cc1Swenshuai.xi        }
1917*53ee8cc1Swenshuai.xi         else
1918*53ee8cc1Swenshuai.xi         {
1919*53ee8cc1Swenshuai.xi     	  //--------------------------------------------------------------------------
1920*53ee8cc1Swenshuai.xi             //  Set xData map for Program SRAM
1921*53ee8cc1Swenshuai.xi             //--------------------------------------------------------------------------
1922*53ee8cc1Swenshuai.xi             //set lower bound "xb_eram_hb[5:0]"
1923*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg(0x10e1, 0x20);
1924*53ee8cc1Swenshuai.xi             //set upper bound "xb_eram_lb[5:0]"
1925*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg(0x10e0, 0x3f);
1926*53ee8cc1Swenshuai.xi             //set "reg_xd2eram_hk_mcu_psram_en"
1927*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg(0x10e6, 0x08);
1928*53ee8cc1Swenshuai.xi 
1929*53ee8cc1Swenshuai.xi             if (_MSB124X_I2C_CH_Reset(0) == TRUE)
1930*53ee8cc1Swenshuai.xi             {
1931*53ee8cc1Swenshuai.xi                    for (x_data_offset = 0, y_cir_addr = SRAM_BASE; x_data_offset < data_length;)
1932*53ee8cc1Swenshuai.xi                    {
1933*53ee8cc1Swenshuai.xi                             if ((data_length - x_data_offset) >= LOAD_CODE_I2C_BLOCK_NUM)
1934*53ee8cc1Swenshuai.xi                             {
1935*53ee8cc1Swenshuai.xi                                 bRet &= _MDrv_DMD_MSB124X_SetRegs(y_cir_addr, (u8_ptr + x_data_offset), LOAD_CODE_I2C_BLOCK_NUM);
1936*53ee8cc1Swenshuai.xi                                 y_cir_addr += LOAD_CODE_I2C_BLOCK_NUM;
1937*53ee8cc1Swenshuai.xi                                 x_data_offset += LOAD_CODE_I2C_BLOCK_NUM;
1938*53ee8cc1Swenshuai.xi                             }
1939*53ee8cc1Swenshuai.xi                             else
1940*53ee8cc1Swenshuai.xi                             {
1941*53ee8cc1Swenshuai.xi                                 bRet &= _MDrv_DMD_MSB124X_SetRegs(y_cir_addr, (u8_ptr + x_data_offset), data_length - x_data_offset);
1942*53ee8cc1Swenshuai.xi                                 y_cir_addr += (data_length - x_data_offset);
1943*53ee8cc1Swenshuai.xi                                 x_data_offset += (data_length - x_data_offset);
1944*53ee8cc1Swenshuai.xi                             }
1945*53ee8cc1Swenshuai.xi                      }
1946*53ee8cc1Swenshuai.xi 
1947*53ee8cc1Swenshuai.xi            }
1948*53ee8cc1Swenshuai.xi            else
1949*53ee8cc1Swenshuai.xi            {
1950*53ee8cc1Swenshuai.xi                 ERR_DEMOD_MSB( printf(" _MSB124X_I2C_CH_Reset(0) failed \n"));
1951*53ee8cc1Swenshuai.xi                 return FALSE;
1952*53ee8cc1Swenshuai.xi            }
1953*53ee8cc1Swenshuai.xi 
1954*53ee8cc1Swenshuai.xi 
1955*53ee8cc1Swenshuai.xi             //--------------------------------------------------------------------------
1956*53ee8cc1Swenshuai.xi             //  Release xData map for Program SRAM
1957*53ee8cc1Swenshuai.xi             //--------------------------------------------------------------------------
1958*53ee8cc1Swenshuai.xi             //clear  "reg_xd2eram_hk_mcu_psram_en"
1959*53ee8cc1Swenshuai.xi             // `DBG.iic_write( 2, (`RIUBASE_MCU + 8'he6), 8'h00)
1960*53ee8cc1Swenshuai.xi 
1961*53ee8cc1Swenshuai.xi             if (_MSB124X_I2C_CH_Reset(3) == TRUE)
1962*53ee8cc1Swenshuai.xi             {
1963*53ee8cc1Swenshuai.xi                   bRet &= _MDrv_DMD_MSB124X_SetReg(0x10e6, 0x00);
1964*53ee8cc1Swenshuai.xi             }
1965*53ee8cc1Swenshuai.xi             else
1966*53ee8cc1Swenshuai.xi             {
1967*53ee8cc1Swenshuai.xi                   ERR_DEMOD_MSB( printf("_MSB124X_I2C_CH_Reset(3) failed \n"));
1968*53ee8cc1Swenshuai.xi                   return FALSE;
1969*53ee8cc1Swenshuai.xi             }
1970*53ee8cc1Swenshuai.xi 
1971*53ee8cc1Swenshuai.xi             //  Set Inst map for Program SRAM
1972*53ee8cc1Swenshuai.xi             //set lower bound "SRAM_A_START_ADDR"
1973*53ee8cc1Swenshuai.xi              bRet &= _MDrv_DMD_MSB124X_SetReg(0x1004, 0x00);
1974*53ee8cc1Swenshuai.xi              bRet &= _MDrv_DMD_MSB124X_SetReg(0x1005, 0x00);
1975*53ee8cc1Swenshuai.xi              bRet &= _MDrv_DMD_MSB124X_SetReg(0x1000, 0x00);
1976*53ee8cc1Swenshuai.xi             //set upper bound "SRAM_A_END_ADDR"
1977*53ee8cc1Swenshuai.xi              bRet &= _MDrv_DMD_MSB124X_SetReg(0x1006, 0x7F);
1978*53ee8cc1Swenshuai.xi              bRet &= _MDrv_DMD_MSB124X_SetReg(0x1007, 0xFF);
1979*53ee8cc1Swenshuai.xi              bRet &= _MDrv_DMD_MSB124X_SetReg(0x1002, 0x00);
1980*53ee8cc1Swenshuai.xi              // Enable Program SRAM
1981*53ee8cc1Swenshuai.xi              bRet &= _MDrv_DMD_MSB124X_SetReg(0x1018, 0x01);
1982*53ee8cc1Swenshuai.xi 
1983*53ee8cc1Swenshuai.xi              //  End MCU reset
1984*53ee8cc1Swenshuai.xi              bRet &= _MDrv_DMD_MSB124X_SetReg(0x0b32, 0x00);
1985*53ee8cc1Swenshuai.xi 
1986*53ee8cc1Swenshuai.xi         }
1987*53ee8cc1Swenshuai.xi     }
1988*53ee8cc1Swenshuai.xi 
1989*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
1990*53ee8cc1Swenshuai.xi     u32tmm_4 = MsOS_GetSystemTime();
1991*53ee8cc1Swenshuai.xi     printf("[tmm2]t4-t3 = %ld (%ld - %ld)\n",u32tmm_4-u32tmm_3,u32tmm_4,u32tmm_3);
1992*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][end]Load2Sram, len=0x%x, win_offset=0x%x\n",data_length,sram_win_offset_base));
1993*53ee8cc1Swenshuai.xi     if (!bRet) printf("%s %d Error\n",__func__, __LINE__);
1994*53ee8cc1Swenshuai.xi     #endif
1995*53ee8cc1Swenshuai.xi 
1996*53ee8cc1Swenshuai.xi     return bRet;
1997*53ee8cc1Swenshuai.xi 
1998*53ee8cc1Swenshuai.xi }
1999*53ee8cc1Swenshuai.xi 
_LoadDspCodeToSDRAM_Boot(void)2000*53ee8cc1Swenshuai.xi static MS_BOOL _LoadDspCodeToSDRAM_Boot(void)
2001*53ee8cc1Swenshuai.xi {
2002*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
2003*53ee8cc1Swenshuai.xi     MS_U16  code_size, win_offset;
2004*53ee8cc1Swenshuai.xi     MS_U8   *data_ptr;
2005*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
2006*53ee8cc1Swenshuai.xi 
2007*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2008*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2009*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][beg]LoadDspCodeToSDRAM_Boot\n"));
2010*53ee8cc1Swenshuai.xi     #endif
2011*53ee8cc1Swenshuai.xi 
2012*53ee8cc1Swenshuai.xi     if(!(pDemod->u8DMD_MSB124X_Sdram_Code&MSB124X_BOOT))
2013*53ee8cc1Swenshuai.xi     {
2014*53ee8cc1Swenshuai.xi         if(sizeof(MSB124X_LIB) > MSB124X_BOOT_START_ADDR)
2015*53ee8cc1Swenshuai.xi         {
2016*53ee8cc1Swenshuai.xi             // boot code
2017*53ee8cc1Swenshuai.xi             data_ptr = MSB124X_LIB + MSB124X_BOOT_START_ADDR;
2018*53ee8cc1Swenshuai.xi             code_size = MSB124X_BOOT_END_ADDR - MSB124X_BOOT_START_ADDR + 1;
2019*53ee8cc1Swenshuai.xi             win_offset = MSB124X_BOOT_WINDOWS_OFFSET;
2020*53ee8cc1Swenshuai.xi             bRet &= _Load2Sdram(data_ptr,code_size,win_offset);
2021*53ee8cc1Swenshuai.xi             if(bRet == true)
2022*53ee8cc1Swenshuai.xi             {
2023*53ee8cc1Swenshuai.xi                 pDemod->u8DMD_MSB124X_Sdram_Code |= MSB124X_BOOT;
2024*53ee8cc1Swenshuai.xi             }
2025*53ee8cc1Swenshuai.xi         }
2026*53ee8cc1Swenshuai.xi         else
2027*53ee8cc1Swenshuai.xi         {
2028*53ee8cc1Swenshuai.xi             printf("@msb124x, boot code is unavailable!!!\n");
2029*53ee8cc1Swenshuai.xi         }
2030*53ee8cc1Swenshuai.xi     }
2031*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2032*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][end]LoadDspCodeToSDRAM_Boot\n"));
2033*53ee8cc1Swenshuai.xi     #endif
2034*53ee8cc1Swenshuai.xi     return bRet;
2035*53ee8cc1Swenshuai.xi }
2036*53ee8cc1Swenshuai.xi 
_LoadDspCodeToSDRAM_dvbt2(void)2037*53ee8cc1Swenshuai.xi static MS_BOOL _LoadDspCodeToSDRAM_dvbt2(void)
2038*53ee8cc1Swenshuai.xi {
2039*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
2040*53ee8cc1Swenshuai.xi     MS_U16  code_size, win_offset;
2041*53ee8cc1Swenshuai.xi     MS_U8   *data_ptr;
2042*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
2043*53ee8cc1Swenshuai.xi 
2044*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2045*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2046*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][beg]LoadDspCodeToSDRAM_dvbt2\n"));
2047*53ee8cc1Swenshuai.xi     #endif
2048*53ee8cc1Swenshuai.xi 
2049*53ee8cc1Swenshuai.xi     if( !(pDemod->u8DMD_MSB124X_Sdram_Code&MSB124X_DVBT2) )
2050*53ee8cc1Swenshuai.xi     {
2051*53ee8cc1Swenshuai.xi         if(sizeof(MSB124X_LIB) > MSB124X_DVBT2_P1_START_ADDR)
2052*53ee8cc1Swenshuai.xi         {
2053*53ee8cc1Swenshuai.xi             // dvbt2_p2
2054*53ee8cc1Swenshuai.xi             data_ptr = MSB124X_LIB + MSB124X_DVBT2_P2_START_ADDR;
2055*53ee8cc1Swenshuai.xi             code_size = MSB124X_DVBT2_P2_END_ADDR - MSB124X_DVBT2_P2_START_ADDR + 1;
2056*53ee8cc1Swenshuai.xi             win_offset = MSB124X_DVBT2_P2_WINDOWS_OFFSET;
2057*53ee8cc1Swenshuai.xi             bRet &= _Load2Sdram(data_ptr,code_size,win_offset);
2058*53ee8cc1Swenshuai.xi 
2059*53ee8cc1Swenshuai.xi             // dvbt2_p1
2060*53ee8cc1Swenshuai.xi             data_ptr = MSB124X_LIB + MSB124X_DVBT2_P1_START_ADDR;
2061*53ee8cc1Swenshuai.xi             code_size = MSB124X_DVBT2_P1_END_ADDR - MSB124X_DVBT2_P1_START_ADDR + 1;
2062*53ee8cc1Swenshuai.xi             win_offset = MSB124X_DVBT2_P1_WINDOWS_OFFSET;
2063*53ee8cc1Swenshuai.xi             bRet &= _Load2Sdram(data_ptr,code_size,win_offset);
2064*53ee8cc1Swenshuai.xi 
2065*53ee8cc1Swenshuai.xi             if(bRet == true)
2066*53ee8cc1Swenshuai.xi             {
2067*53ee8cc1Swenshuai.xi                 pDemod->u8DMD_MSB124X_Sdram_Code |= MSB124X_DVBT2;
2068*53ee8cc1Swenshuai.xi             }
2069*53ee8cc1Swenshuai.xi         }
2070*53ee8cc1Swenshuai.xi         else
2071*53ee8cc1Swenshuai.xi         {
2072*53ee8cc1Swenshuai.xi             ERR_DEMOD_MSB(printf("@msb124x, dvbt2 code is unavailable!!!\n"));
2073*53ee8cc1Swenshuai.xi         }
2074*53ee8cc1Swenshuai.xi     }
2075*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2076*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][end]LoadDspCodeToSDRAM_dvbt2\n"));
2077*53ee8cc1Swenshuai.xi     #endif
2078*53ee8cc1Swenshuai.xi     return bRet;
2079*53ee8cc1Swenshuai.xi }
2080*53ee8cc1Swenshuai.xi 
_LoadDspCodeToSDRAM_dvbs2(void)2081*53ee8cc1Swenshuai.xi static MS_BOOL _LoadDspCodeToSDRAM_dvbs2(void)
2082*53ee8cc1Swenshuai.xi {
2083*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
2084*53ee8cc1Swenshuai.xi     MS_U16  code_size, win_offset;
2085*53ee8cc1Swenshuai.xi     MS_U8   *data_ptr;
2086*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
2087*53ee8cc1Swenshuai.xi 
2088*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2089*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2090*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][beg]LoadDspCodeToSDRAM_dvbs2\n"));
2091*53ee8cc1Swenshuai.xi     #endif
2092*53ee8cc1Swenshuai.xi     printf("[msb124x][beg]LoadDspCodeToSDRAM_dvbs2\n");
2093*53ee8cc1Swenshuai.xi 
2094*53ee8cc1Swenshuai.xi     if(!(pDemod->u8DMD_MSB124X_Sdram_Code&MSB124X_DVBS2))
2095*53ee8cc1Swenshuai.xi     {
2096*53ee8cc1Swenshuai.xi         // dvbt code
2097*53ee8cc1Swenshuai.xi     if(sizeof(MSB124X_LIB) > MSB124X_DVBS2_P1_START_ADDR)
2098*53ee8cc1Swenshuai.xi         {
2099*53ee8cc1Swenshuai.xi             // dvbs2_p2
2100*53ee8cc1Swenshuai.xi             data_ptr = MSB124X_LIB + MSB124X_DVBS2_P2_START_ADDR;
2101*53ee8cc1Swenshuai.xi             code_size = MSB124X_DVBS2_P2_END_ADDR - MSB124X_DVBS2_P2_START_ADDR + 1;
2102*53ee8cc1Swenshuai.xi             win_offset = MSB124X_DVBS2_P2_WINDOWS_OFFSET;
2103*53ee8cc1Swenshuai.xi             bRet &= _Load2Sdram(data_ptr,code_size,win_offset);
2104*53ee8cc1Swenshuai.xi 
2105*53ee8cc1Swenshuai.xi             // dvbs2_p1
2106*53ee8cc1Swenshuai.xi             data_ptr = MSB124X_LIB + MSB124X_DVBS2_P1_START_ADDR;
2107*53ee8cc1Swenshuai.xi             code_size = MSB124X_DVBS2_P1_END_ADDR - MSB124X_DVBS2_P1_START_ADDR + 1;
2108*53ee8cc1Swenshuai.xi             win_offset = MSB124X_DVBS2_P1_WINDOWS_OFFSET;
2109*53ee8cc1Swenshuai.xi             bRet &= _Load2Sdram(data_ptr,code_size,win_offset);
2110*53ee8cc1Swenshuai.xi          if(bRet == true)
2111*53ee8cc1Swenshuai.xi          {
2112*53ee8cc1Swenshuai.xi              pDemod->u8DMD_MSB124X_Sdram_Code |= MSB124X_DVBS2;
2113*53ee8cc1Swenshuai.xi          }
2114*53ee8cc1Swenshuai.xi         }
2115*53ee8cc1Swenshuai.xi         else
2116*53ee8cc1Swenshuai.xi         {
2117*53ee8cc1Swenshuai.xi          printf("@msb124x, dvbs2 code is unavailable!!!\n");
2118*53ee8cc1Swenshuai.xi         }
2119*53ee8cc1Swenshuai.xi     }
2120*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2121*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][end]LoadDspCodeToSDRAM_dvbs2\n"));
2122*53ee8cc1Swenshuai.xi     #endif
2123*53ee8cc1Swenshuai.xi     return bRet;
2124*53ee8cc1Swenshuai.xi }
2125*53ee8cc1Swenshuai.xi 
2126*53ee8cc1Swenshuai.xi //no sdram case -- DVBS
_LoadDspCodeToSRAM_dvbs2(void)2127*53ee8cc1Swenshuai.xi static MS_BOOL _LoadDspCodeToSRAM_dvbs2(void)
2128*53ee8cc1Swenshuai.xi {
2129*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
2130*53ee8cc1Swenshuai.xi     MS_U16  code_size, win_offset;
2131*53ee8cc1Swenshuai.xi     MS_U8   *data_ptr;
2132*53ee8cc1Swenshuai.xi 
2133*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
2134*53ee8cc1Swenshuai.xi 
2135*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2136*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2137*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][beg]LoadDspCodeToSRAM_dvbs2\n"));
2138*53ee8cc1Swenshuai.xi     #endif
2139*53ee8cc1Swenshuai.xi 
2140*53ee8cc1Swenshuai.xi 
2141*53ee8cc1Swenshuai.xi     if(!(pDemod->u8DMD_MSB124X_Sram_Code&MSB124X_DVBS2))
2142*53ee8cc1Swenshuai.xi     {
2143*53ee8cc1Swenshuai.xi         // dvbs code
2144*53ee8cc1Swenshuai.xi         if(sizeof(MSB124X_LIB) > MSB124X_DVBS2_P1_START_ADDR)
2145*53ee8cc1Swenshuai.xi         {
2146*53ee8cc1Swenshuai.xi          data_ptr = MSB124X_LIB + MSB124X_DVBS2_P1_START_ADDR;
2147*53ee8cc1Swenshuai.xi          code_size = MSB124X_DVBS2_P1_END_ADDR - MSB124X_DVBS2_P1_START_ADDR + 1;
2148*53ee8cc1Swenshuai.xi          win_offset = MSB124X_DVBS2_P1_WINDOWS_OFFSET;
2149*53ee8cc1Swenshuai.xi          bRet &= _Load2Sram(data_ptr,code_size,win_offset);
2150*53ee8cc1Swenshuai.xi          if(bRet == true)
2151*53ee8cc1Swenshuai.xi          {
2152*53ee8cc1Swenshuai.xi              pDemod->u8DMD_MSB124X_Sram_Code |= MSB124X_DVBS2;
2153*53ee8cc1Swenshuai.xi          }
2154*53ee8cc1Swenshuai.xi         }
2155*53ee8cc1Swenshuai.xi         else
2156*53ee8cc1Swenshuai.xi         {
2157*53ee8cc1Swenshuai.xi          printf("@msb124x, dvbs2 code is unavailable!!!\n");
2158*53ee8cc1Swenshuai.xi         }
2159*53ee8cc1Swenshuai.xi     }
2160*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2161*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][end]LoadDspCodeToSRAM_dvbs2\n"));
2162*53ee8cc1Swenshuai.xi     #endif
2163*53ee8cc1Swenshuai.xi     return bRet;
2164*53ee8cc1Swenshuai.xi }
2165*53ee8cc1Swenshuai.xi 
2166*53ee8cc1Swenshuai.xi 
_LoadDspCodeToSDRAM_dvbt(void)2167*53ee8cc1Swenshuai.xi static MS_BOOL _LoadDspCodeToSDRAM_dvbt(void)
2168*53ee8cc1Swenshuai.xi {
2169*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
2170*53ee8cc1Swenshuai.xi     MS_U16  code_size, win_offset;
2171*53ee8cc1Swenshuai.xi     MS_U8   *data_ptr;
2172*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
2173*53ee8cc1Swenshuai.xi 
2174*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2175*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2176*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][beg]LoadDspCodeToSDRAM_dvbt\n"));
2177*53ee8cc1Swenshuai.xi     #endif
2178*53ee8cc1Swenshuai.xi 
2179*53ee8cc1Swenshuai.xi     if(!(pDemod->u8DMD_MSB124X_Sdram_Code&MSB124X_DVBT))
2180*53ee8cc1Swenshuai.xi     {
2181*53ee8cc1Swenshuai.xi         // dvbt code
2182*53ee8cc1Swenshuai.xi         if(sizeof(MSB124X_LIB) > MSB124X_DVBT_START_ADDR)
2183*53ee8cc1Swenshuai.xi         {
2184*53ee8cc1Swenshuai.xi          data_ptr = MSB124X_LIB + MSB124X_DVBT_START_ADDR;
2185*53ee8cc1Swenshuai.xi          code_size = MSB124X_DVBT_END_ADDR - MSB124X_DVBT_START_ADDR + 1;
2186*53ee8cc1Swenshuai.xi          win_offset = MSB124X_DVBT_WINDOWS_OFFSET;
2187*53ee8cc1Swenshuai.xi          bRet &= _Load2Sdram(data_ptr,code_size,win_offset);
2188*53ee8cc1Swenshuai.xi          if(bRet == true)
2189*53ee8cc1Swenshuai.xi          {
2190*53ee8cc1Swenshuai.xi              pDemod->u8DMD_MSB124X_Sdram_Code |= MSB124X_DVBT;
2191*53ee8cc1Swenshuai.xi          }
2192*53ee8cc1Swenshuai.xi         }
2193*53ee8cc1Swenshuai.xi         else
2194*53ee8cc1Swenshuai.xi         {
2195*53ee8cc1Swenshuai.xi          printf("@msb124x, dvbt code is unavailable!!!\n");
2196*53ee8cc1Swenshuai.xi         }
2197*53ee8cc1Swenshuai.xi     }
2198*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2199*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][end]LoadDspCodeToSDRAM_dvbt\n"));
2200*53ee8cc1Swenshuai.xi     #endif
2201*53ee8cc1Swenshuai.xi     return bRet;
2202*53ee8cc1Swenshuai.xi }
2203*53ee8cc1Swenshuai.xi 
2204*53ee8cc1Swenshuai.xi //no sdram case
_LoadDspCodeToSRAM_dvbt(void)2205*53ee8cc1Swenshuai.xi static MS_BOOL _LoadDspCodeToSRAM_dvbt(void)
2206*53ee8cc1Swenshuai.xi {
2207*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
2208*53ee8cc1Swenshuai.xi     MS_U16  code_size, win_offset;
2209*53ee8cc1Swenshuai.xi     MS_U8   *data_ptr;
2210*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
2211*53ee8cc1Swenshuai.xi 
2212*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2213*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2214*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][beg]LoadDspCodeToSRAM_dvbt\n"));
2215*53ee8cc1Swenshuai.xi     #endif
2216*53ee8cc1Swenshuai.xi 
2217*53ee8cc1Swenshuai.xi     if(!(pDemod->u8DMD_MSB124X_Sram_Code&MSB124X_DVBT))
2218*53ee8cc1Swenshuai.xi     {
2219*53ee8cc1Swenshuai.xi         // dvbt code
2220*53ee8cc1Swenshuai.xi         if(sizeof(MSB124X_LIB) > MSB124X_DVBT_START_ADDR)
2221*53ee8cc1Swenshuai.xi         {
2222*53ee8cc1Swenshuai.xi          data_ptr = MSB124X_LIB + MSB124X_DVBT_START_ADDR;
2223*53ee8cc1Swenshuai.xi          code_size = MSB124X_DVBT_END_ADDR - MSB124X_DVBT_START_ADDR + 1;
2224*53ee8cc1Swenshuai.xi          win_offset = MSB124X_DVBT_WINDOWS_OFFSET;
2225*53ee8cc1Swenshuai.xi          bRet &= _Load2Sram(data_ptr,code_size,win_offset);
2226*53ee8cc1Swenshuai.xi          if(bRet == true)
2227*53ee8cc1Swenshuai.xi          {
2228*53ee8cc1Swenshuai.xi              pDemod->u8DMD_MSB124X_Sram_Code |= MSB124X_DVBT;
2229*53ee8cc1Swenshuai.xi          }
2230*53ee8cc1Swenshuai.xi         }
2231*53ee8cc1Swenshuai.xi         else
2232*53ee8cc1Swenshuai.xi         {
2233*53ee8cc1Swenshuai.xi          printf("@msb124x, dvbt code is unavailable!!!\n");
2234*53ee8cc1Swenshuai.xi         }
2235*53ee8cc1Swenshuai.xi     }
2236*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2237*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][end]LoadDspCodeToSRAM_dvbt\n"));
2238*53ee8cc1Swenshuai.xi     #endif
2239*53ee8cc1Swenshuai.xi     return bRet;
2240*53ee8cc1Swenshuai.xi }
2241*53ee8cc1Swenshuai.xi 
_LoadDspCodeToSDRAM_dvbc(void)2242*53ee8cc1Swenshuai.xi static MS_BOOL _LoadDspCodeToSDRAM_dvbc(void)
2243*53ee8cc1Swenshuai.xi {
2244*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
2245*53ee8cc1Swenshuai.xi     MS_U16  code_size, win_offset;
2246*53ee8cc1Swenshuai.xi     MS_U8   *data_ptr;
2247*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
2248*53ee8cc1Swenshuai.xi 
2249*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2250*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2251*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][beg]LoadDspCodeToSDRAM_dvbc\n"));
2252*53ee8cc1Swenshuai.xi     #endif
2253*53ee8cc1Swenshuai.xi 
2254*53ee8cc1Swenshuai.xi     if(!(pDemod->u8DMD_MSB124X_Sdram_Code&MSB124X_DVBC))
2255*53ee8cc1Swenshuai.xi     {
2256*53ee8cc1Swenshuai.xi         // dvbc code
2257*53ee8cc1Swenshuai.xi         if(sizeof(MSB124X_LIB) > MSB124X_DVBC_START_ADDR)
2258*53ee8cc1Swenshuai.xi         {
2259*53ee8cc1Swenshuai.xi             data_ptr = MSB124X_LIB + MSB124X_DVBC_START_ADDR;
2260*53ee8cc1Swenshuai.xi             code_size = MSB124X_DVBC_END_ADDR - MSB124X_DVBC_START_ADDR + 1;
2261*53ee8cc1Swenshuai.xi             win_offset = MSB124X_DVBC_WINDOWS_OFFSET;
2262*53ee8cc1Swenshuai.xi             bRet &= _Load2Sdram(data_ptr,code_size,win_offset);
2263*53ee8cc1Swenshuai.xi             if(bRet == true)
2264*53ee8cc1Swenshuai.xi             {
2265*53ee8cc1Swenshuai.xi                pDemod->u8DMD_MSB124X_Sdram_Code |= MSB124X_DVBC;
2266*53ee8cc1Swenshuai.xi             }
2267*53ee8cc1Swenshuai.xi         }
2268*53ee8cc1Swenshuai.xi         else
2269*53ee8cc1Swenshuai.xi         {
2270*53ee8cc1Swenshuai.xi             printf("@msb124x, dvbc code is unavailable!!!\n");
2271*53ee8cc1Swenshuai.xi         }
2272*53ee8cc1Swenshuai.xi     }
2273*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2274*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][end]LoadDspCodeToSDRAM_dvbc\n"));
2275*53ee8cc1Swenshuai.xi     #endif
2276*53ee8cc1Swenshuai.xi     return bRet;
2277*53ee8cc1Swenshuai.xi }
2278*53ee8cc1Swenshuai.xi 
2279*53ee8cc1Swenshuai.xi //no sdram case
_LoadDspCodeToSRAM_dvbc(void)2280*53ee8cc1Swenshuai.xi static MS_BOOL _LoadDspCodeToSRAM_dvbc(void)
2281*53ee8cc1Swenshuai.xi {
2282*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
2283*53ee8cc1Swenshuai.xi     MS_U16  code_size, win_offset;
2284*53ee8cc1Swenshuai.xi     MS_U8   *data_ptr;
2285*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
2286*53ee8cc1Swenshuai.xi 
2287*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2288*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2289*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][beg]LoadDspCodeToSRAM_dvbc\n"));
2290*53ee8cc1Swenshuai.xi     #endif
2291*53ee8cc1Swenshuai.xi 
2292*53ee8cc1Swenshuai.xi     if(!(pDemod->u8DMD_MSB124X_Sram_Code&MSB124X_DVBC))
2293*53ee8cc1Swenshuai.xi     {
2294*53ee8cc1Swenshuai.xi         // dvbc code
2295*53ee8cc1Swenshuai.xi         if(sizeof(MSB124X_LIB) > MSB124X_DVBC_START_ADDR)
2296*53ee8cc1Swenshuai.xi         {
2297*53ee8cc1Swenshuai.xi             data_ptr = MSB124X_LIB + MSB124X_DVBC_START_ADDR;
2298*53ee8cc1Swenshuai.xi             code_size = MSB124X_DVBC_END_ADDR - MSB124X_DVBC_START_ADDR + 1;
2299*53ee8cc1Swenshuai.xi             win_offset = MSB124X_DVBC_WINDOWS_OFFSET;
2300*53ee8cc1Swenshuai.xi             bRet &= _Load2Sram(data_ptr,code_size,win_offset);
2301*53ee8cc1Swenshuai.xi             if(bRet == true)
2302*53ee8cc1Swenshuai.xi             {
2303*53ee8cc1Swenshuai.xi                pDemod->u8DMD_MSB124X_Sram_Code |= MSB124X_DVBC;
2304*53ee8cc1Swenshuai.xi             }
2305*53ee8cc1Swenshuai.xi         }
2306*53ee8cc1Swenshuai.xi         else
2307*53ee8cc1Swenshuai.xi         {
2308*53ee8cc1Swenshuai.xi             printf("@msb124x, dvbc code is unavailable!!!\n");
2309*53ee8cc1Swenshuai.xi         }
2310*53ee8cc1Swenshuai.xi     }
2311*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2312*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][end]LoadDspCodeToSRAM_dvbc\n"));
2313*53ee8cc1Swenshuai.xi     #endif
2314*53ee8cc1Swenshuai.xi     return bRet;
2315*53ee8cc1Swenshuai.xi }
2316*53ee8cc1Swenshuai.xi 
_LoadDspCodeToSDRAM(MS_U8 code_n)2317*53ee8cc1Swenshuai.xi static MS_BOOL _LoadDspCodeToSDRAM(MS_U8 code_n)
2318*53ee8cc1Swenshuai.xi {
2319*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
2320*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2321*53ee8cc1Swenshuai.xi     MS_U32 u32tmm_7 = 0, u32tmm_8 = 0;
2322*53ee8cc1Swenshuai.xi     #endif
2323*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
2324*53ee8cc1Swenshuai.xi     MS_U8 u8Data;
2325*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2326*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2327*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][beg]LoadDspCodeToSDRAM, code_n=0x%x\n",code_n));
2328*53ee8cc1Swenshuai.xi     u32tmm_7 = MsOS_GetSystemTime();
2329*53ee8cc1Swenshuai.xi     #endif
2330*53ee8cc1Swenshuai.xi 
2331*53ee8cc1Swenshuai.xi     if (pDemod->_sDMD_MSB124X_InitData.bEnableSPILoadCode)
2332*53ee8cc1Swenshuai.xi     {
2333*53ee8cc1Swenshuai.xi         (pDemod->_sDMD_MSB124X_InitData.fpMSB124x_SPIPAD_En)(TRUE);
2334*53ee8cc1Swenshuai.xi         // ------enable to use TS_PAD as SSPI_PAD
2335*53ee8cc1Swenshuai.xi         // [0:0] reg_en_sspi_pad
2336*53ee8cc1Swenshuai.xi         // [1:1] reg_ts_sspi_en, 1: use TS_PAD as SSPI_PAD
2337*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900 + (0x3b) * 2, 0x0002);
2338*53ee8cc1Swenshuai.xi         // ------- MSPI protocol setting
2339*53ee8cc1Swenshuai.xi         // [8] cpha
2340*53ee8cc1Swenshuai.xi         // [9] cpol
2341*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB124X_GetReg(0x0900+(0x3a)*2+1,&u8Data);
2342*53ee8cc1Swenshuai.xi         u8Data &= 0xFC;
2343*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB124X_SetReg(0x0900+(0x3a)*2+1, u8Data);
2344*53ee8cc1Swenshuai.xi         // ------- MSPI driving setting
2345*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x2c)*2, 0x07ff);
2346*53ee8cc1Swenshuai.xi 	}
2347*53ee8cc1Swenshuai.xi 
2348*53ee8cc1Swenshuai.xi     switch(code_n)
2349*53ee8cc1Swenshuai.xi     {
2350*53ee8cc1Swenshuai.xi         case MSB124X_BOOT:
2351*53ee8cc1Swenshuai.xi             {
2352*53ee8cc1Swenshuai.xi                 // boot code
2353*53ee8cc1Swenshuai.xi                 bRet &= _LoadDspCodeToSDRAM_Boot();
2354*53ee8cc1Swenshuai.xi             }
2355*53ee8cc1Swenshuai.xi         break;
2356*53ee8cc1Swenshuai.xi         case MSB124X_DVBT2:
2357*53ee8cc1Swenshuai.xi             {
2358*53ee8cc1Swenshuai.xi                 // dvbt2 code
2359*53ee8cc1Swenshuai.xi                 bRet &= _LoadDspCodeToSDRAM_dvbt2();
2360*53ee8cc1Swenshuai.xi             }
2361*53ee8cc1Swenshuai.xi             break;
2362*53ee8cc1Swenshuai.xi         case MSB124X_DVBT:
2363*53ee8cc1Swenshuai.xi             {
2364*53ee8cc1Swenshuai.xi                 // dvbt
2365*53ee8cc1Swenshuai.xi                 bRet &= _LoadDspCodeToSDRAM_dvbt();
2366*53ee8cc1Swenshuai.xi             }
2367*53ee8cc1Swenshuai.xi             break;
2368*53ee8cc1Swenshuai.xi         case MSB124X_DVBC:
2369*53ee8cc1Swenshuai.xi             {
2370*53ee8cc1Swenshuai.xi                 // dvbtc
2371*53ee8cc1Swenshuai.xi                 bRet &= _LoadDspCodeToSDRAM_dvbc();
2372*53ee8cc1Swenshuai.xi             }
2373*53ee8cc1Swenshuai.xi             break;
2374*53ee8cc1Swenshuai.xi         case MSB124X_DVBS2:
2375*53ee8cc1Swenshuai.xi             {
2376*53ee8cc1Swenshuai.xi                 // dvbtc
2377*53ee8cc1Swenshuai.xi                 bRet &= _LoadDspCodeToSDRAM_dvbs2();
2378*53ee8cc1Swenshuai.xi             }
2379*53ee8cc1Swenshuai.xi             break;
2380*53ee8cc1Swenshuai.xi 
2381*53ee8cc1Swenshuai.xi         case MSB124X_ALL:
2382*53ee8cc1Swenshuai.xi         default:
2383*53ee8cc1Swenshuai.xi             {
2384*53ee8cc1Swenshuai.xi                 // boot+dvbt2+dvbt+dvbc
2385*53ee8cc1Swenshuai.xi                 // boot code
2386*53ee8cc1Swenshuai.xi                 bRet &= _LoadDspCodeToSDRAM_Boot();
2387*53ee8cc1Swenshuai.xi                 // dvbt2
2388*53ee8cc1Swenshuai.xi                 bRet &= _LoadDspCodeToSDRAM_dvbt2();
2389*53ee8cc1Swenshuai.xi                 // dvbt
2390*53ee8cc1Swenshuai.xi                 bRet &= _LoadDspCodeToSDRAM_dvbt();
2391*53ee8cc1Swenshuai.xi                 // dvbtc
2392*53ee8cc1Swenshuai.xi                 bRet &= _LoadDspCodeToSDRAM_dvbc();
2393*53ee8cc1Swenshuai.xi                 bRet &= _LoadDspCodeToSDRAM_dvbs2();
2394*53ee8cc1Swenshuai.xi             }
2395*53ee8cc1Swenshuai.xi             break;
2396*53ee8cc1Swenshuai.xi     }
2397*53ee8cc1Swenshuai.xi 
2398*53ee8cc1Swenshuai.xi     if (pDemod->_sDMD_MSB124X_InitData.bEnableSPILoadCode)
2399*53ee8cc1Swenshuai.xi     {
2400*53ee8cc1Swenshuai.xi         // ------disable to use TS_PAD as SSPI_PAD after load code
2401*53ee8cc1Swenshuai.xi         // [0:0] reg_en_sspi_pad
2402*53ee8cc1Swenshuai.xi         // [1:1] reg_ts_sspi_en, 1: use TS_PAD as SSPI_PAD
2403*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900 + (0x3b) * 2, 0x0001);
2404*53ee8cc1Swenshuai.xi         (pDemod->_sDMD_MSB124X_InitData.fpMSB124x_SPIPAD_En)(FALSE);
2405*53ee8cc1Swenshuai.xi     }
2406*53ee8cc1Swenshuai.xi 
2407*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2408*53ee8cc1Swenshuai.xi     u32tmm_8 = MsOS_GetSystemTime();
2409*53ee8cc1Swenshuai.xi     printf("[tmm4]t8-t7 = %ld (%ld - %ld)\n",u32tmm_8-u32tmm_7,u32tmm_8,u32tmm_7);
2410*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][end]LoadDspCodeToSDRAM, code_n=0x%x, bRet=0x%x\n",code_n,bRet));
2411*53ee8cc1Swenshuai.xi     #endif
2412*53ee8cc1Swenshuai.xi 
2413*53ee8cc1Swenshuai.xi     return bRet;
2414*53ee8cc1Swenshuai.xi }
2415*53ee8cc1Swenshuai.xi 
2416*53ee8cc1Swenshuai.xi //no sdram case
_LoadDspCodeToSRAM(MS_U8 code_n)2417*53ee8cc1Swenshuai.xi static MS_BOOL _LoadDspCodeToSRAM(MS_U8 code_n)
2418*53ee8cc1Swenshuai.xi {
2419*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
2420*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2421*53ee8cc1Swenshuai.xi    // MS_U32 u32tmm_7 = 0, u32tmm_8 = 0;
2422*53ee8cc1Swenshuai.xi     #endif
2423*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
2424*53ee8cc1Swenshuai.xi 
2425*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2426*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2427*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][beg]LoadDspCodeToSRAM, code_n=0x%x\n",code_n));
2428*53ee8cc1Swenshuai.xi    // u32tmm_7 = MsOS_GetSystemTime();
2429*53ee8cc1Swenshuai.xi     #endif
2430*53ee8cc1Swenshuai.xi 
2431*53ee8cc1Swenshuai.xi     if(code_n == pDemod->u8DMD_MSB124X_Sram_Code)
2432*53ee8cc1Swenshuai.xi     {
2433*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
2434*53ee8cc1Swenshuai.xi         printf("[msb124x]LoadDspCodeToSRAM, code is available.\n");
2435*53ee8cc1Swenshuai.xi         #endif
2436*53ee8cc1Swenshuai.xi         return bRet;
2437*53ee8cc1Swenshuai.xi     }
2438*53ee8cc1Swenshuai.xi 
2439*53ee8cc1Swenshuai.xi     if (pDemod->_sDMD_MSB124X_InitData.bEnableSPILoadCode)
2440*53ee8cc1Swenshuai.xi     {
2441*53ee8cc1Swenshuai.xi         (pDemod->_sDMD_MSB124X_InitData.fpMSB124x_SPIPAD_En)(TRUE);
2442*53ee8cc1Swenshuai.xi         // ------enable to use TS_PAD as SSPI_PAD
2443*53ee8cc1Swenshuai.xi         // [0:0] reg_en_sspi_pad
2444*53ee8cc1Swenshuai.xi         // [1:1] reg_ts_sspi_en, 1: use TS_PAD as SSPI_PAD
2445*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900 + (0x3b) * 2, 0x0002);
2446*53ee8cc1Swenshuai.xi 	 //[4:4]reg_sspi2sram_en;
2447*53ee8cc1Swenshuai.xi 	 //bRet &= _MDrv_DMD_MSB124X_GetReg(0x0900 + (0x3a) * 2, &u8data);
2448*53ee8cc1Swenshuai.xi 	 //bRet &= _MDrv_DMD_MSB124X_SetReg(0x0900 + (0x3a) * 2, u8data|0x10);
2449*53ee8cc1Swenshuai.xi 
2450*53ee8cc1Swenshuai.xi     }
2451*53ee8cc1Swenshuai.xi 
2452*53ee8cc1Swenshuai.xi     switch(code_n)
2453*53ee8cc1Swenshuai.xi     {
2454*53ee8cc1Swenshuai.xi         case MSB124X_DVBT:
2455*53ee8cc1Swenshuai.xi             {
2456*53ee8cc1Swenshuai.xi                 // dvbt
2457*53ee8cc1Swenshuai.xi                 bRet &= _LoadDspCodeToSRAM_dvbt();
2458*53ee8cc1Swenshuai.xi             }
2459*53ee8cc1Swenshuai.xi             break;
2460*53ee8cc1Swenshuai.xi         case MSB124X_DVBC:
2461*53ee8cc1Swenshuai.xi             {
2462*53ee8cc1Swenshuai.xi                 // dvbtc
2463*53ee8cc1Swenshuai.xi                 bRet &= _LoadDspCodeToSRAM_dvbc();
2464*53ee8cc1Swenshuai.xi             }
2465*53ee8cc1Swenshuai.xi             break;
2466*53ee8cc1Swenshuai.xi         case MSB124X_DVBS2:
2467*53ee8cc1Swenshuai.xi             {
2468*53ee8cc1Swenshuai.xi                 // dvbs/s2
2469*53ee8cc1Swenshuai.xi                 bRet &= _LoadDspCodeToSRAM_dvbs2();
2470*53ee8cc1Swenshuai.xi             }
2471*53ee8cc1Swenshuai.xi             break;
2472*53ee8cc1Swenshuai.xi         default:
2473*53ee8cc1Swenshuai.xi             {
2474*53ee8cc1Swenshuai.xi                 // boot code
2475*53ee8cc1Swenshuai.xi                 bRet &= _LoadDspCodeToSRAM_dvbt();
2476*53ee8cc1Swenshuai.xi             }
2477*53ee8cc1Swenshuai.xi             break;
2478*53ee8cc1Swenshuai.xi     }
2479*53ee8cc1Swenshuai.xi 
2480*53ee8cc1Swenshuai.xi 
2481*53ee8cc1Swenshuai.xi     if (pDemod->_sDMD_MSB124X_InitData.bEnableSPILoadCode)
2482*53ee8cc1Swenshuai.xi     {
2483*53ee8cc1Swenshuai.xi         // ------disable to use TS_PAD as SSPI_PAD after load code
2484*53ee8cc1Swenshuai.xi         // [0:0] reg_en_sspi_pad
2485*53ee8cc1Swenshuai.xi         // [1:1] reg_ts_sspi_en, 1: use TS_PAD as SSPI_PAD
2486*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900 + (0x3b) * 2, 0x0001);
2487*53ee8cc1Swenshuai.xi 	 //[4:4]reg_sspi2sram_en
2488*53ee8cc1Swenshuai.xi 	 //bRet &= _MDrv_DMD_MSB124X_GetReg(0x0900 + (0x3a) * 2, &u8data);
2489*53ee8cc1Swenshuai.xi 	 //bRet &= _MDrv_DMD_MSB124X_SetReg(0x0900 + (0x3a) * 2, u8data&(~0x10));
2490*53ee8cc1Swenshuai.xi 
2491*53ee8cc1Swenshuai.xi         (pDemod->_sDMD_MSB124X_InitData.fpMSB124x_SPIPAD_En)(FALSE);
2492*53ee8cc1Swenshuai.xi     }
2493*53ee8cc1Swenshuai.xi 
2494*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2495*53ee8cc1Swenshuai.xi     //u32tmm_8 = MsOS_GetSystemTime();
2496*53ee8cc1Swenshuai.xi     //printf("[tmm4]t8-t7 = %ld (%ld - %ld)\n",u32tmm_8-u32tmm_7,u32tmm_8,u32tmm_7);
2497*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][end]LoadDspCodeToSRAM, code_n=0x%x, bRet=0x%x\n",code_n,bRet));
2498*53ee8cc1Swenshuai.xi     #endif
2499*53ee8cc1Swenshuai.xi 
2500*53ee8cc1Swenshuai.xi     return bRet;
2501*53ee8cc1Swenshuai.xi }
2502*53ee8cc1Swenshuai.xi 
2503*53ee8cc1Swenshuai.xi 
2504*53ee8cc1Swenshuai.xi 
_MSB124X_MEM_switch(MS_U8 mem_type)2505*53ee8cc1Swenshuai.xi static MS_BOOL _MSB124X_MEM_switch(MS_U8 mem_type)
2506*53ee8cc1Swenshuai.xi {
2507*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
2508*53ee8cc1Swenshuai.xi     MS_U8 u8_tmp = 0;
2509*53ee8cc1Swenshuai.xi     MS_U8 u8Data = 0;
2510*53ee8cc1Swenshuai.xi     MS_U16 timeout = 0;
2511*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2512*53ee8cc1Swenshuai.xi     MS_U32 u32tmm_15 = 0, u32tmm_16 = 0;
2513*53ee8cc1Swenshuai.xi     #endif
2514*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
2515*53ee8cc1Swenshuai.xi 
2516*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2517*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2518*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][beg]MSB124X_MEM_switch, mem_type=0x%x\n",mem_type));
2519*53ee8cc1Swenshuai.xi     u32tmm_15 = MsOS_GetSystemTime();
2520*53ee8cc1Swenshuai.xi     #endif
2521*53ee8cc1Swenshuai.xi 
2522*53ee8cc1Swenshuai.xi     switch(pDemod->eDMD_MSB124X_CurrentDemodulatorType)
2523*53ee8cc1Swenshuai.xi     {
2524*53ee8cc1Swenshuai.xi         case E_DMD_MSB124X_DEMOD_DVBT2:
2525*53ee8cc1Swenshuai.xi             u8Data=1;
2526*53ee8cc1Swenshuai.xi             break;
2527*53ee8cc1Swenshuai.xi         case E_DMD_MSB124X_DEMOD_DVBT:
2528*53ee8cc1Swenshuai.xi             u8Data=2;
2529*53ee8cc1Swenshuai.xi             break;
2530*53ee8cc1Swenshuai.xi         case E_DMD_MSB124X_DEMOD_DVBC:
2531*53ee8cc1Swenshuai.xi             u8Data=3;
2532*53ee8cc1Swenshuai.xi             break;
2533*53ee8cc1Swenshuai.xi         case E_DMD_MSB124X_DEMOD_DVBS2:
2534*53ee8cc1Swenshuai.xi             u8Data=4;
2535*53ee8cc1Swenshuai.xi             break;
2536*53ee8cc1Swenshuai.xi         default:
2537*53ee8cc1Swenshuai.xi             u8Data=2;
2538*53ee8cc1Swenshuai.xi             return FALSE;
2539*53ee8cc1Swenshuai.xi     }
2540*53ee8cc1Swenshuai.xi 
2541*53ee8cc1Swenshuai.xi     if(mem_type == 1)
2542*53ee8cc1Swenshuai.xi     {
2543*53ee8cc1Swenshuai.xi 
2544*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg(0x2B80,0x10);
2545*53ee8cc1Swenshuai.xi 
2546*53ee8cc1Swenshuai.xi         // SRAM_START_ADDR 0x0000
2547*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1000,0x0000);
2548*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1004,0x0000);
2549*53ee8cc1Swenshuai.xi 
2550*53ee8cc1Swenshuai.xi         // SRAM_END_ADDR 0x7FFF
2551*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1002,0x0000);
2552*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1006,0x7FFF);
2553*53ee8cc1Swenshuai.xi 
2554*53ee8cc1Swenshuai.xi         if(u8Data == 4)
2555*53ee8cc1Swenshuai.xi         {//DVBS
2556*53ee8cc1Swenshuai.xi 
2557*53ee8cc1Swenshuai.xi             // Offset to 1M +128 KB
2558*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg(0x2B80,0x12);//Uint : 64 KB
2559*53ee8cc1Swenshuai.xi 
2560*53ee8cc1Swenshuai.xi             // DRAM_START_ADDR 0x28000
2561*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1008,0x0000);
2562*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x100C,0x8000);
2563*53ee8cc1Swenshuai.xi 
2564*53ee8cc1Swenshuai.xi             // DRAM_END_ADDR    0x2FFFF
2565*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x100A,0x0000);
2566*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x100E,0xFFFF);
2567*53ee8cc1Swenshuai.xi         }
2568*53ee8cc1Swenshuai.xi         else
2569*53ee8cc1Swenshuai.xi         {//DVBT2,DVBT,DVBC
2570*53ee8cc1Swenshuai.xi 
2571*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg(0x2B80,0x10);// Offset to 1M
2572*53ee8cc1Swenshuai.xi 
2573*53ee8cc1Swenshuai.xi         // DRAM_START_ADDR 0x8000
2574*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1008,0x0000);
2575*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x100C,0x8000);
2576*53ee8cc1Swenshuai.xi 
2577*53ee8cc1Swenshuai.xi 
2578*53ee8cc1Swenshuai.xi         // DRAM_END_ADDR    0xFFFF
2579*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x100A,0x0000);
2580*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x100E,0xFFFF);
2581*53ee8cc1Swenshuai.xi 
2582*53ee8cc1Swenshuai.xi         //Disable romA_en & romB_en
2583*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg(0x1038,0x00);
2584*53ee8cc1Swenshuai.xi         }
2585*53ee8cc1Swenshuai.xi         // Enable SRAM&SDRAM memory map
2586*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg(0x1018,0x05);
2587*53ee8cc1Swenshuai.xi 
2588*53ee8cc1Swenshuai.xi         // Wait memory map to be enabled
2589*53ee8cc1Swenshuai.xi         do
2590*53ee8cc1Swenshuai.xi         {
2591*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_GetReg(0x1018,&u8_tmp);
2592*53ee8cc1Swenshuai.xi             if(timeout++ > 500)
2593*53ee8cc1Swenshuai.xi             {
2594*53ee8cc1Swenshuai.xi                 printf("@msb124x, D+S memory mapping failure.!!!\n");
2595*53ee8cc1Swenshuai.xi                 return FALSE;
2596*53ee8cc1Swenshuai.xi             }
2597*53ee8cc1Swenshuai.xi         }
2598*53ee8cc1Swenshuai.xi         while(u8_tmp != 0x05);
2599*53ee8cc1Swenshuai.xi     }
2600*53ee8cc1Swenshuai.xi     else if(mem_type == 0)
2601*53ee8cc1Swenshuai.xi     {
2602*53ee8cc1Swenshuai.xi         // Enable SRAM&SDRAM memory map
2603*53ee8cc1Swenshuai.xi 
2604*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg(0x2B80,0x10);
2605*53ee8cc1Swenshuai.xi 
2606*53ee8cc1Swenshuai.xi         // DRAM_START_ADDR 0x8000
2607*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x1008,0x0000);
2608*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x100C,0x0000);
2609*53ee8cc1Swenshuai.xi 
2610*53ee8cc1Swenshuai.xi 
2611*53ee8cc1Swenshuai.xi         // DRAM_END_ADDR    0xFFFF
2612*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x100A,0x0000);
2613*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x100E,0x7FFF);
2614*53ee8cc1Swenshuai.xi 
2615*53ee8cc1Swenshuai.xi         // Enable SRAM&SDRAM memory map
2616*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg(0x1018,0x04);
2617*53ee8cc1Swenshuai.xi 
2618*53ee8cc1Swenshuai.xi         // Wait memory map to be enabled
2619*53ee8cc1Swenshuai.xi         do
2620*53ee8cc1Swenshuai.xi         {
2621*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_GetReg(0x1018,&u8_tmp);
2622*53ee8cc1Swenshuai.xi             if(timeout++ > 500)
2623*53ee8cc1Swenshuai.xi             {
2624*53ee8cc1Swenshuai.xi                 printf("@msb124x, D memory mapping failure.!!!\n");
2625*53ee8cc1Swenshuai.xi                 return FALSE;
2626*53ee8cc1Swenshuai.xi             }
2627*53ee8cc1Swenshuai.xi         }
2628*53ee8cc1Swenshuai.xi         while(u8_tmp != 0x04);
2629*53ee8cc1Swenshuai.xi     }
2630*53ee8cc1Swenshuai.xi     else
2631*53ee8cc1Swenshuai.xi     {
2632*53ee8cc1Swenshuai.xi        printf("@msb124x, invalid mem type mapping.\n");
2633*53ee8cc1Swenshuai.xi        return FALSE;
2634*53ee8cc1Swenshuai.xi     }
2635*53ee8cc1Swenshuai.xi 
2636*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2637*53ee8cc1Swenshuai.xi     u32tmm_16 = MsOS_GetSystemTime();
2638*53ee8cc1Swenshuai.xi     printf("[tmm8]t16-t15 = %ld (%ld - %ld)\n",u32tmm_16-u32tmm_15,u32tmm_16,u32tmm_15);
2639*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][end]MSB124X_MEM_switch, , mem_type=0x%x, bRet=0x%x\n",mem_type,bRet));
2640*53ee8cc1Swenshuai.xi     #endif
2641*53ee8cc1Swenshuai.xi 
2642*53ee8cc1Swenshuai.xi     return bRet;
2643*53ee8cc1Swenshuai.xi }
2644*53ee8cc1Swenshuai.xi 
_LoadSdram2Sram(MS_U8 CodeNum)2645*53ee8cc1Swenshuai.xi static MS_BOOL _LoadSdram2Sram(MS_U8 CodeNum)
2646*53ee8cc1Swenshuai.xi {
2647*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
2648*53ee8cc1Swenshuai.xi     MS_U8   u8_data = 0;
2649*53ee8cc1Swenshuai.xi     MS_U8   u8_timeout = 0xFF;
2650*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
2651*53ee8cc1Swenshuai.xi 
2652*53ee8cc1Swenshuai.xi 
2653*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2654*53ee8cc1Swenshuai.xi     MS_U32 u32tmm_17 = 0, u32tmm_18 = 0;
2655*53ee8cc1Swenshuai.xi     #endif
2656*53ee8cc1Swenshuai.xi 
2657*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2658*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2659*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][beg]LoadSdram2Sram, g_sram_code=0x%x, codeNum=0x%x\n",u8DMD_MSB124X_Sram_Code,CodeNum));
2660*53ee8cc1Swenshuai.xi     u32tmm_17 = MsOS_GetSystemTime();
2661*53ee8cc1Swenshuai.xi     #endif
2662*53ee8cc1Swenshuai.xi 
2663*53ee8cc1Swenshuai.xi     if(CodeNum == pDemod->u8DMD_MSB124X_Sram_Code)
2664*53ee8cc1Swenshuai.xi     {
2665*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
2666*53ee8cc1Swenshuai.xi         printf("[msb124x]LoadSdram2Sram, code is available.\n");
2667*53ee8cc1Swenshuai.xi         #endif
2668*53ee8cc1Swenshuai.xi         return bRet;
2669*53ee8cc1Swenshuai.xi     }
2670*53ee8cc1Swenshuai.xi /*
2671*53ee8cc1Swenshuai.xi     MS_U8   u8_tmp = 0;
2672*53ee8cc1Swenshuai.xi     MS_U32  u32Timeout = 0;
2673*53ee8cc1Swenshuai.xi     MS_U8   u8DoneFlag = 0;
2674*53ee8cc1Swenshuai.xi 
2675*53ee8cc1Swenshuai.xi     bRet &= _MSB124X_MEM_switch(0);
2676*53ee8cc1Swenshuai.xi 
2677*53ee8cc1Swenshuai.xi     if(CodeNum == MSB124X_DVBT2)
2678*53ee8cc1Swenshuai.xi         u8_tmp = 1|0x10;
2679*53ee8cc1Swenshuai.xi     else if(CodeNum == MSB124X_DVBT)
2680*53ee8cc1Swenshuai.xi         u8_tmp = 2|0x10;
2681*53ee8cc1Swenshuai.xi     else if(CodeNum == MSB124X_DVBC)
2682*53ee8cc1Swenshuai.xi         u8_tmp = 3|0x10;
2683*53ee8cc1Swenshuai.xi     else
2684*53ee8cc1Swenshuai.xi         u8_tmp = 0|0x10;
2685*53ee8cc1Swenshuai.xi 
2686*53ee8cc1Swenshuai.xi     // Assign f/w code type to load => 0x11: dvbt2, 0x12: dvbt, 0x13: dvbc
2687*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(0x0900+(0x4f)*2, u8_tmp);
2688*53ee8cc1Swenshuai.xi 
2689*53ee8cc1Swenshuai.xi     // enable miu mask, miu, mcu, gdma
2690*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(0x1200+(0x23)*2 + 1,0x0f);
2691*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(0x1200+(0x23)*2,0xf0);
2692*53ee8cc1Swenshuai.xi 
2693*53ee8cc1Swenshuai.xi     MsOS_DelayTaskUs(10);
2694*53ee8cc1Swenshuai.xi     // enable mcu
2695*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(0x0b00+(0x19)*2, 0x00);
2696*53ee8cc1Swenshuai.xi 
2697*53ee8cc1Swenshuai.xi     do
2698*53ee8cc1Swenshuai.xi     {
2699*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_GetReg(0x0900+(0x4f)*2, &u8DoneFlag);
2700*53ee8cc1Swenshuai.xi 
2701*53ee8cc1Swenshuai.xi         if (u32Timeout++ > 500)
2702*53ee8cc1Swenshuai.xi         {
2703*53ee8cc1Swenshuai.xi             printf("@msb124x, LoadSdram2Sram boot move code fail.!!!\n");
2704*53ee8cc1Swenshuai.xi             return FALSE;
2705*53ee8cc1Swenshuai.xi         }
2706*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(1*1000);
2707*53ee8cc1Swenshuai.xi 
2708*53ee8cc1Swenshuai.xi     }
2709*53ee8cc1Swenshuai.xi     while(u8DoneFlag != 0xaa);
2710*53ee8cc1Swenshuai.xi 
2711*53ee8cc1Swenshuai.xi     // mask miu access of mcu
2712*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(0x1200+(0x23)*2,0xf2);
2713*53ee8cc1Swenshuai.xi 
2714*53ee8cc1Swenshuai.xi     // 10us delay
2715*53ee8cc1Swenshuai.xi     MsOS_DelayTaskUs(10);
2716*53ee8cc1Swenshuai.xi 
2717*53ee8cc1Swenshuai.xi     // Disable MCU
2718*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(0x0b00+(0x19)*2, 0x03);
2719*53ee8cc1Swenshuai.xi 
2720*53ee8cc1Swenshuai.xi     // enable miu mask, miu, mcu, gdma
2721*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(0x1200+(0x23)*2 + 1,0x0f);
2722*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(0x1200+(0x23)*2,0xf0);
2723*53ee8cc1Swenshuai.xi */
2724*53ee8cc1Swenshuai.xi     // mask miu access of fdp, tdi, djb
2725*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(0x1200 + (0x23) * 2 + 1, 0x0f);
2726*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(0x1200 + (0x23) * 2, 0xf0);
2727*53ee8cc1Swenshuai.xi 
2728*53ee8cc1Swenshuai.xi     // 10us delay
2729*53ee8cc1Swenshuai.xi     MsOS_DelayTaskUs(10);
2730*53ee8cc1Swenshuai.xi 
2731*53ee8cc1Swenshuai.xi     // Disable MCU
2732*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(0x0b00+(0x19)*2, 0x03);
2733*53ee8cc1Swenshuai.xi 
2734*53ee8cc1Swenshuai.xi     // Use GDMA move code from SDRAM to SRAM
2735*53ee8cc1Swenshuai.xi      bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0300+(0x00)*2, 0x4254);     // rst
2736*53ee8cc1Swenshuai.xi      bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0300+(0x00)*2, 0x4257);    // cfg & trig
2737*53ee8cc1Swenshuai.xi 
2738*53ee8cc1Swenshuai.xi    switch(CodeNum)
2739*53ee8cc1Swenshuai.xi    {
2740*53ee8cc1Swenshuai.xi         case 0x02: //DVB-T2 @001000h ~ 008FFFh
2741*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0300+(0x01)*2, 0x0000); // Set src_addr
2742*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0300+(0x02)*2, 0x0011); // start from 1M+64k
2743*53ee8cc1Swenshuai.xi             break;
2744*53ee8cc1Swenshuai.xi 
2745*53ee8cc1Swenshuai.xi         case 0x04: //DVB-T @010000h ~ 017FFFh
2746*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0300+(0x01)*2, 0x8000); // Set src_addr
2747*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0300+(0x02)*2, 0x0011); // start from 1M+96k
2748*53ee8cc1Swenshuai.xi             break;
2749*53ee8cc1Swenshuai.xi 
2750*53ee8cc1Swenshuai.xi         case 0x08: //DVB-C @018000h ~ 01FFFFh
2751*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0300+(0x01)*2, 0x0000); // Set src_addr
2752*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0300+(0x02)*2, 0x0012); // start from 1M+128k
2753*53ee8cc1Swenshuai.xi             break;
2754*53ee8cc1Swenshuai.xi         case 0x10: //DVB-S2 @020000h ~ 027FDFh
2755*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0300+(0x01)*2, 0x0000); // Set src_addr
2756*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0300+(0x02)*2, 0x0013); // start from 1M+160k
2757*53ee8cc1Swenshuai.xi             break;
2758*53ee8cc1Swenshuai.xi         default:
2759*53ee8cc1Swenshuai.xi             bRet &= false;
2760*53ee8cc1Swenshuai.xi             break;
2761*53ee8cc1Swenshuai.xi    }
2762*53ee8cc1Swenshuai.xi 
2763*53ee8cc1Swenshuai.xi     // Set dst_addr
2764*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0300+(0x03)*2, 0x0000);
2765*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0300+(0x04)*2, 0x0000);
2766*53ee8cc1Swenshuai.xi 
2767*53ee8cc1Swenshuai.xi     // Set data_size
2768*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0300+(0x05)*2, 0x8000);
2769*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0300+(0x06)*2, 0x0000);
2770*53ee8cc1Swenshuai.xi 
2771*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_SetReg(0x0300+(0x07)*2, 0x01); //start GDMA
2772*53ee8cc1Swenshuai.xi 
2773*53ee8cc1Swenshuai.xi     // Wait for GDMA
2774*53ee8cc1Swenshuai.xi     do
2775*53ee8cc1Swenshuai.xi     {
2776*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(10);
2777*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_GetReg(0x0300+(0x08)*2, &u8_data);
2778*53ee8cc1Swenshuai.xi         u8_timeout--;
2779*53ee8cc1Swenshuai.xi     }while(((u8_data&0x01) != 0x01) && (u8_timeout != 0x00));
2780*53ee8cc1Swenshuai.xi 
2781*53ee8cc1Swenshuai.xi     if(u8_data != 0x01)
2782*53ee8cc1Swenshuai.xi     {
2783*53ee8cc1Swenshuai.xi         printf("[msb124x][err]LoadSdram2Sram, GDMA move code fail!!\n");
2784*53ee8cc1Swenshuai.xi         return false;
2785*53ee8cc1Swenshuai.xi     }
2786*53ee8cc1Swenshuai.xi 
2787*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2788*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x]LoadSdram2Sram, GDMA move code done!!\n"));
2789*53ee8cc1Swenshuai.xi     #endif
2790*53ee8cc1Swenshuai.xi 
2791*53ee8cc1Swenshuai.xi     //if(CodeNum == 0x02)
2792*53ee8cc1Swenshuai.xi     //    bRet &= _MSB124X_MEM_switch(2);  // setting for rom code
2793*53ee8cc1Swenshuai.xi     //else
2794*53ee8cc1Swenshuai.xi         bRet &= _MSB124X_MEM_switch(1);
2795*53ee8cc1Swenshuai.xi 
2796*53ee8cc1Swenshuai.xi     if(bRet == FALSE)
2797*53ee8cc1Swenshuai.xi     {
2798*53ee8cc1Swenshuai.xi         pDemod->u8DMD_MSB124X_Sram_Code = 0x00;
2799*53ee8cc1Swenshuai.xi     }
2800*53ee8cc1Swenshuai.xi     else
2801*53ee8cc1Swenshuai.xi     {
2802*53ee8cc1Swenshuai.xi         pDemod->u8DMD_MSB124X_Sram_Code = CodeNum;
2803*53ee8cc1Swenshuai.xi     }
2804*53ee8cc1Swenshuai.xi 
2805*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2806*53ee8cc1Swenshuai.xi     u32tmm_18 = MsOS_GetSystemTime();
2807*53ee8cc1Swenshuai.xi     printf("[tmm9]t18-t17 = %ld (%ld - %ld)\n",u32tmm_18-u32tmm_17,u32tmm_18,u32tmm_17);
2808*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][end]LoadSdram2Sram, codeNum=0x%x, g_sram_code=0x%x, bRet=0x%x\n",CodeNum,u8DMD_MSB124X_Sram_Code,bRet));
2809*53ee8cc1Swenshuai.xi     #endif
2810*53ee8cc1Swenshuai.xi 
2811*53ee8cc1Swenshuai.xi     return bRet;
2812*53ee8cc1Swenshuai.xi }
2813*53ee8cc1Swenshuai.xi 
_DTV_DVBC_DSPReg_Init(void)2814*53ee8cc1Swenshuai.xi static MS_BOOL  _DTV_DVBC_DSPReg_Init(void)
2815*53ee8cc1Swenshuai.xi {
2816*53ee8cc1Swenshuai.xi     MS_U8    idx = 0;
2817*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
2818*53ee8cc1Swenshuai.xi 
2819*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2820*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2821*53ee8cc1Swenshuai.xi     #endif
2822*53ee8cc1Swenshuai.xi     for (idx = 0; idx<sizeof(MSB124X_DVBC_DSPREG_TABLE); idx++)
2823*53ee8cc1Swenshuai.xi     {
2824*53ee8cc1Swenshuai.xi         if( _MDrv_DMD_MSB124X_SetDSPReg(idx + 0x20, pDemod->DVBC_DSP_REG[idx])!=TRUE)
2825*53ee8cc1Swenshuai.xi         {
2826*53ee8cc1Swenshuai.xi             printf("dvbc dsp reg init NG\n");
2827*53ee8cc1Swenshuai.xi             return FALSE;
2828*53ee8cc1Swenshuai.xi         }
2829*53ee8cc1Swenshuai.xi     }
2830*53ee8cc1Swenshuai.xi 
2831*53ee8cc1Swenshuai.xi 
2832*53ee8cc1Swenshuai.xi 
2833*53ee8cc1Swenshuai.xi         if( _MDrv_DMD_MSB124X_SetDSPReg(C_config_spread_span, C_TS_SPREAD_SPAN)!=TRUE)
2834*53ee8cc1Swenshuai.xi         {
2835*53ee8cc1Swenshuai.xi             printf("dvbc dsp reg init NG\n");
2836*53ee8cc1Swenshuai.xi             return FALSE;
2837*53ee8cc1Swenshuai.xi         }
2838*53ee8cc1Swenshuai.xi         if( _MDrv_DMD_MSB124X_SetDSPReg(C_config_spread_step, C_TS_SPREAD_STEP_SIZE)!=TRUE)
2839*53ee8cc1Swenshuai.xi         {
2840*53ee8cc1Swenshuai.xi             printf("dvbc dsp reg init NG\n");
2841*53ee8cc1Swenshuai.xi             return FALSE;
2842*53ee8cc1Swenshuai.xi         }
2843*53ee8cc1Swenshuai.xi 
2844*53ee8cc1Swenshuai.xi         if( _MDrv_DMD_MSB124X_SetDSPReg(C_phase_tuning_en, C_TS_PHASE_TUNING_EN)!=TRUE)
2845*53ee8cc1Swenshuai.xi         {
2846*53ee8cc1Swenshuai.xi             printf("dvbc dsp reg init NG\n");
2847*53ee8cc1Swenshuai.xi             return FALSE;
2848*53ee8cc1Swenshuai.xi         }
2849*53ee8cc1Swenshuai.xi         if( _MDrv_DMD_MSB124X_SetDSPReg(C_phase_tuning_num, C_TS_PHASE_TUNING_NUM)!=TRUE)
2850*53ee8cc1Swenshuai.xi         {
2851*53ee8cc1Swenshuai.xi             printf("dvbc dsp reg init NG\n");
2852*53ee8cc1Swenshuai.xi             return FALSE;
2853*53ee8cc1Swenshuai.xi         }
2854*53ee8cc1Swenshuai.xi 
2855*53ee8cc1Swenshuai.xi     printf("DVBC dsp reg init ok\n");
2856*53ee8cc1Swenshuai.xi 
2857*53ee8cc1Swenshuai.xi     return TRUE;
2858*53ee8cc1Swenshuai.xi }
2859*53ee8cc1Swenshuai.xi 
2860*53ee8cc1Swenshuai.xi 
_DTV_DVBT_DSPReg_CRC(void)2861*53ee8cc1Swenshuai.xi static MS_U8  _DTV_DVBT_DSPReg_CRC(void)
2862*53ee8cc1Swenshuai.xi {
2863*53ee8cc1Swenshuai.xi     MS_U8 crc = 0;
2864*53ee8cc1Swenshuai.xi     MS_U8 idx = 0;
2865*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
2866*53ee8cc1Swenshuai.xi 
2867*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2868*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2869*53ee8cc1Swenshuai.xi     #endif
2870*53ee8cc1Swenshuai.xi     for (idx = 0; idx<(sizeof(pDemod->DVBT_DSP_REG)); idx++)
2871*53ee8cc1Swenshuai.xi     {
2872*53ee8cc1Swenshuai.xi         crc ^= pDemod->DVBT_DSP_REG[idx];
2873*53ee8cc1Swenshuai.xi     }
2874*53ee8cc1Swenshuai.xi 
2875*53ee8cc1Swenshuai.xi     crc = ~crc;
2876*53ee8cc1Swenshuai.xi 
2877*53ee8cc1Swenshuai.xi     return crc;
2878*53ee8cc1Swenshuai.xi }
2879*53ee8cc1Swenshuai.xi 
_DTV_DVBT_DSPReg_Init(void)2880*53ee8cc1Swenshuai.xi static MS_BOOL  _DTV_DVBT_DSPReg_Init(void)
2881*53ee8cc1Swenshuai.xi {
2882*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2883*53ee8cc1Swenshuai.xi     MS_U32 u32tmm_7 = 0, u32tmm_8 = 0;
2884*53ee8cc1Swenshuai.xi     #endif
2885*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
2886*53ee8cc1Swenshuai.xi 
2887*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2888*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2889*53ee8cc1Swenshuai.xi     u32tmm_7 = MsOS_GetSystemTime();
2890*53ee8cc1Swenshuai.xi     #endif
2891*53ee8cc1Swenshuai.xi 
2892*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)T_CONFIG_BW, pDemod->DVBT_DSP_REG[0]) != TRUE)
2893*53ee8cc1Swenshuai.xi     {
2894*53ee8cc1Swenshuai.xi       printf("dvbt dsp reg init NG\n"); return FALSE;
2895*53ee8cc1Swenshuai.xi     }
2896*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)T_CONFIG_FC_L, pDemod->DVBT_DSP_REG[1]) != TRUE)
2897*53ee8cc1Swenshuai.xi     {
2898*53ee8cc1Swenshuai.xi       printf("dvbt dsp reg init NG\n"); return FALSE;
2899*53ee8cc1Swenshuai.xi     }
2900*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)T_CONFIG_FC_H, pDemod->DVBT_DSP_REG[2]) != TRUE)
2901*53ee8cc1Swenshuai.xi     {
2902*53ee8cc1Swenshuai.xi       printf("dvbt dsp reg init NG\n"); return FALSE;
2903*53ee8cc1Swenshuai.xi     }
2904*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)T_CONFIG_TS_SERIAL, pDemod->DVBT_DSP_REG[3]) != TRUE)
2905*53ee8cc1Swenshuai.xi     {
2906*53ee8cc1Swenshuai.xi       printf("dvbt dsp reg init NG\n"); return FALSE;
2907*53ee8cc1Swenshuai.xi     }
2908*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)T_CONFIG_TS_CLK_RATE, pDemod->DVBT_DSP_REG[4]) != TRUE)
2909*53ee8cc1Swenshuai.xi     {
2910*53ee8cc1Swenshuai.xi       printf("dvbt dsp reg init NG\n"); return FALSE;
2911*53ee8cc1Swenshuai.xi     }
2912*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)T_CONFIG_TS_OUT_INV, pDemod->DVBT_DSP_REG[5]) != TRUE)
2913*53ee8cc1Swenshuai.xi     {
2914*53ee8cc1Swenshuai.xi       printf("dvbt dsp reg init NG\n"); return FALSE;
2915*53ee8cc1Swenshuai.xi     }
2916*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)T_CONFIG_TS_DATA_SWAP, pDemod->DVBT_DSP_REG[6]) != TRUE)
2917*53ee8cc1Swenshuai.xi     {
2918*53ee8cc1Swenshuai.xi       printf("dvbt dsp reg init NG\n"); return FALSE;
2919*53ee8cc1Swenshuai.xi     }
2920*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)T_CONFIG_IQ_SWAP, pDemod->DVBT_DSP_REG[7]) != TRUE)
2921*53ee8cc1Swenshuai.xi     {
2922*53ee8cc1Swenshuai.xi       printf("dvbt dsp reg init NG\n"); return FALSE;
2923*53ee8cc1Swenshuai.xi     }
2924*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)T_CONFIG_IF_INV_PWM_OUT_EN, pDemod->DVBT_DSP_REG[8]) != TRUE)
2925*53ee8cc1Swenshuai.xi     {
2926*53ee8cc1Swenshuai.xi       printf("dvbt dsp reg init NG\n"); return FALSE;
2927*53ee8cc1Swenshuai.xi     }
2928*53ee8cc1Swenshuai.xi 
2929*53ee8cc1Swenshuai.xi // APLL
2930*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)T_CONFIG_SPREAD_SPAN, T_TS_SPREAD_SPAN) != TRUE)
2931*53ee8cc1Swenshuai.xi     {
2932*53ee8cc1Swenshuai.xi       printf("dvbt dsp reg init NG\n"); return FALSE;
2933*53ee8cc1Swenshuai.xi     }
2934*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)T_CONFIG_SPREAD_STEP, T_TS_SPREAD_STEP_SIZE) != TRUE)
2935*53ee8cc1Swenshuai.xi     {
2936*53ee8cc1Swenshuai.xi       printf("dvbt dsp reg init NG\n"); return FALSE;
2937*53ee8cc1Swenshuai.xi     }
2938*53ee8cc1Swenshuai.xi //APLL
2939*53ee8cc1Swenshuai.xi 
2940*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)T_PHASE_TUNING_EN, T_TS_PHASE_TUNING_EN) != TRUE)
2941*53ee8cc1Swenshuai.xi     {
2942*53ee8cc1Swenshuai.xi       printf("dvbt dsp reg init NG\n"); return FALSE;
2943*53ee8cc1Swenshuai.xi     }
2944*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)T_PHASE_TUNING_NUM, T_TS_PHASE_TUNING_NUM) != TRUE)
2945*53ee8cc1Swenshuai.xi     {
2946*53ee8cc1Swenshuai.xi       printf("dvbt dsp reg init NG\n"); return FALSE;
2947*53ee8cc1Swenshuai.xi     }
2948*53ee8cc1Swenshuai.xi 
2949*53ee8cc1Swenshuai.xi 
2950*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2951*53ee8cc1Swenshuai.xi     u32tmm_8 = MsOS_GetSystemTime();
2952*53ee8cc1Swenshuai.xi     printf("[3333]t8 - t7 = %ld (%ld - %ld) \n",u32tmm_8-u32tmm_7,u32tmm_8,u32tmm_7);
2953*53ee8cc1Swenshuai.xi     #endif
2954*53ee8cc1Swenshuai.xi 
2955*53ee8cc1Swenshuai.xi     printf("dvbt dsp reg init ok\n");
2956*53ee8cc1Swenshuai.xi 
2957*53ee8cc1Swenshuai.xi     return TRUE;
2958*53ee8cc1Swenshuai.xi }
2959*53ee8cc1Swenshuai.xi 
_DTV_DVBT2_DSPReg_Init(void)2960*53ee8cc1Swenshuai.xi static MS_BOOL _DTV_DVBT2_DSPReg_Init(void)
2961*53ee8cc1Swenshuai.xi {
2962*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2963*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2964*53ee8cc1Swenshuai.xi     #endif
2965*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
2966*53ee8cc1Swenshuai.xi 
2967*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)E_T2_BW, pDemod->DVBT2_DSP_REG[0]) != TRUE)
2968*53ee8cc1Swenshuai.xi     {
2969*53ee8cc1Swenshuai.xi       printf("T2 dsp reg init NG\n"); return FALSE;
2970*53ee8cc1Swenshuai.xi     }
2971*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)E_T2_FC_L,  pDemod->DVBT2_DSP_REG[1]) != TRUE)
2972*53ee8cc1Swenshuai.xi     {
2973*53ee8cc1Swenshuai.xi       printf("T2 dsp reg init NG\n"); return FALSE;
2974*53ee8cc1Swenshuai.xi     }
2975*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)E_T2_FC_H,  pDemod->DVBT2_DSP_REG[2]) != TRUE)
2976*53ee8cc1Swenshuai.xi     {
2977*53ee8cc1Swenshuai.xi       printf("T2 dsp reg init NG\n"); return FALSE;
2978*53ee8cc1Swenshuai.xi     }
2979*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)E_T2_TS_SERIAL,  pDemod->DVBT2_DSP_REG[3]) != TRUE)
2980*53ee8cc1Swenshuai.xi     {
2981*53ee8cc1Swenshuai.xi       printf("T2 dsp reg init NG\n"); return FALSE;
2982*53ee8cc1Swenshuai.xi     }
2983*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)E_T2_TS_CLK_RATE,  pDemod->DVBT2_DSP_REG[4]) != TRUE)
2984*53ee8cc1Swenshuai.xi     {
2985*53ee8cc1Swenshuai.xi       printf("T2 dsp reg init NG\n"); return FALSE;
2986*53ee8cc1Swenshuai.xi     }
2987*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)E_T2_TS_OUT_INV,  pDemod->DVBT2_DSP_REG[5]) != TRUE)
2988*53ee8cc1Swenshuai.xi     {
2989*53ee8cc1Swenshuai.xi       printf("T2 dsp reg init NG\n"); return FALSE;
2990*53ee8cc1Swenshuai.xi     }
2991*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)E_T2_TS_DATA_SWAP,  pDemod->DVBT2_DSP_REG[6]) != TRUE)
2992*53ee8cc1Swenshuai.xi     {
2993*53ee8cc1Swenshuai.xi       printf("T2 dsp reg init NG\n"); return FALSE;
2994*53ee8cc1Swenshuai.xi     }
2995*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)E_T2_TS_ERR_POL,  pDemod->DVBT2_DSP_REG[7]) != TRUE)
2996*53ee8cc1Swenshuai.xi     {
2997*53ee8cc1Swenshuai.xi       printf("T2 dsp reg init NG\n"); return FALSE;
2998*53ee8cc1Swenshuai.xi     }
2999*53ee8cc1Swenshuai.xi 
3000*53ee8cc1Swenshuai.xi // APLL span
3001*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)E_T2_SPREAD_SPAN, T2_TS_SPREAD_SPAN) != TRUE)
3002*53ee8cc1Swenshuai.xi     {
3003*53ee8cc1Swenshuai.xi       printf("T2 dsp reg init NG\n"); return FALSE;
3004*53ee8cc1Swenshuai.xi     }
3005*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)E_T2_SPREAD_STEP, T2_TS_SPREAD_STEP_SIZE) != TRUE)
3006*53ee8cc1Swenshuai.xi     {
3007*53ee8cc1Swenshuai.xi       printf("T2 dsp reg init NG\n"); return FALSE;
3008*53ee8cc1Swenshuai.xi     }
3009*53ee8cc1Swenshuai.xi // APLL span
3010*53ee8cc1Swenshuai.xi 
3011*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)E_T2_PHASE_TUNING_EN, T2_TS_PHASE_TUNING_EN) != TRUE)
3012*53ee8cc1Swenshuai.xi     {
3013*53ee8cc1Swenshuai.xi       printf("T2 dsp reg init NG\n"); return FALSE;
3014*53ee8cc1Swenshuai.xi     }
3015*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB124X_SetDSPReg((MS_U8)E_T2_PHASE_TUNING_NUM, T2_TS_PHASE_TUNING_NUM) != TRUE)
3016*53ee8cc1Swenshuai.xi     {
3017*53ee8cc1Swenshuai.xi       printf("T2 dsp reg init NG\n"); return FALSE;
3018*53ee8cc1Swenshuai.xi     }
3019*53ee8cc1Swenshuai.xi 
3020*53ee8cc1Swenshuai.xi     printf("T2 dsp reg init ok\n");
3021*53ee8cc1Swenshuai.xi 
3022*53ee8cc1Swenshuai.xi     return TRUE;
3023*53ee8cc1Swenshuai.xi }
3024*53ee8cc1Swenshuai.xi 
_LoadDSPCode(void)3025*53ee8cc1Swenshuai.xi static MS_BOOL _LoadDSPCode(void)
3026*53ee8cc1Swenshuai.xi {
3027*53ee8cc1Swenshuai.xi     ////MAPI_U32 u32Now = MsOS_GetSystemTime();
3028*53ee8cc1Swenshuai.xi     //printf("\t\t\tLoadDSPCode TIME   %ld (=%ld-%ld)\n", u32Now-u32StartTime, u32Now, u32StartTime);
3029*53ee8cc1Swenshuai.xi     ////DBG_DEMOD_MSB(printf("\t\t\tLoadDSPCode TIME   %ld (=%ld-%ld)\n", u32Now-u32StartTime, u32Now, u32StartTime));//to measure time
3030*53ee8cc1Swenshuai.xi     //u32StartTime = u32Now;
3031*53ee8cc1Swenshuai.xi 
3032*53ee8cc1Swenshuai.xi     MS_U32        u32Timeout = 0;
3033*53ee8cc1Swenshuai.xi     MS_U8         u8DoneFlag = 0;
3034*53ee8cc1Swenshuai.xi     MS_U8         u8Data = 0;
3035*53ee8cc1Swenshuai.xi     MS_BOOL       bRet = true;
3036*53ee8cc1Swenshuai.xi     MS_U8 u8FirmwareType = MSB124X_DVBT;
3037*53ee8cc1Swenshuai.xi     //kirin  bonding option
3038*53ee8cc1Swenshuai.xi     MS_U32 Bonding_Control = 0;
3039*53ee8cc1Swenshuai.xi     MS_U16 Chip_ID = 0;
3040*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
3041*53ee8cc1Swenshuai.xi     MS_U32 u32tmm_9 = 0, u32tmm_10 = 0, u32tmm_11 = 0, u32tmm_12 = 0, u32tmm_13 = 0;
3042*53ee8cc1Swenshuai.xi     #endif
3043*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
3044*53ee8cc1Swenshuai.xi 
3045*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
3046*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
3047*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][beg]LoadDspCode\n"));
3048*53ee8cc1Swenshuai.xi     DBG_DEMOD_MSB(printf(">>>MSB124X: Load DSP...\n"));
3049*53ee8cc1Swenshuai.xi     #endif
3050*53ee8cc1Swenshuai.xi 
3051*53ee8cc1Swenshuai.xi 
3052*53ee8cc1Swenshuai.xi 
3053*53ee8cc1Swenshuai.xi 	/*
3054*53ee8cc1Swenshuai.xi 	add this for Kirin(Windermere MCP) bonding option
3055*53ee8cc1Swenshuai.xi 	*/
3056*53ee8cc1Swenshuai.xi 	#if 1
3057*53ee8cc1Swenshuai.xi 	//kirin  bonding option
3058*53ee8cc1Swenshuai.xi 
3059*53ee8cc1Swenshuai.xi 
3060*53ee8cc1Swenshuai.xi 	Chip_ID = MDrv_SYS_GetChipID();
3061*53ee8cc1Swenshuai.xi 	DBG_KIRIN_BOND(printf(">>> Kirin Debug:Chip ID = %x \n",Chip_ID));
3062*53ee8cc1Swenshuai.xi 
3063*53ee8cc1Swenshuai.xi 	if(((Chip_ID & 0xFF) ==0x98)&&((pDemod->eDMD_MSB124X_CurrentDemodulatorType)==E_DMD_MSB124X_DEMOD_DVBS2))//bit[8:7]
3064*53ee8cc1Swenshuai.xi 	{
3065*53ee8cc1Swenshuai.xi 
3066*53ee8cc1Swenshuai.xi         MS_VIRT u32MMIOBaseAdr;
3067*53ee8cc1Swenshuai.xi         MS_PHY u32BankSize;
3068*53ee8cc1Swenshuai.xi         if (MDrv_MMIO_GetBASE(&u32MMIOBaseAdr, &u32BankSize, MS_MODULE_HW))
3069*53ee8cc1Swenshuai.xi 	      {
3070*53ee8cc1Swenshuai.xi             Bonding_Control = DRV_RIU_ReadByte(((0xBF342BEC-0xBF200000)+u32MMIOBaseAdr));
3071*53ee8cc1Swenshuai.xi             DBG_KIRIN_BOND(printf(">>> Kirin Debug: Bouning_Control = %x \n",Bonding_Control));   //OTP_DVB_SEL; [8:7]=2b'10 means no DVBS/S2
3072*53ee8cc1Swenshuai.xi         }
3073*53ee8cc1Swenshuai.xi 	      if (((Bonding_Control&0x0180)==0x100))
3074*53ee8cc1Swenshuai.xi         {
3075*53ee8cc1Swenshuai.xi 		        DBG_KIRIN_BOND(printf(">>> Kirin Debug: disable DVBS load code of bonding option \n"));
3076*53ee8cc1Swenshuai.xi 		        return false;
3077*53ee8cc1Swenshuai.xi 	      }
3078*53ee8cc1Swenshuai.xi 	}
3079*53ee8cc1Swenshuai.xi 	#endif
3080*53ee8cc1Swenshuai.xi 
3081*53ee8cc1Swenshuai.xi 
3082*53ee8cc1Swenshuai.xi     switch(pDemod->eDMD_MSB124X_CurrentDemodulatorType)
3083*53ee8cc1Swenshuai.xi     {
3084*53ee8cc1Swenshuai.xi         case E_DMD_MSB124X_DEMOD_DVBT2:
3085*53ee8cc1Swenshuai.xi             u8Data=1;
3086*53ee8cc1Swenshuai.xi             break;
3087*53ee8cc1Swenshuai.xi         case E_DMD_MSB124X_DEMOD_DVBT:
3088*53ee8cc1Swenshuai.xi             u8Data=2;
3089*53ee8cc1Swenshuai.xi             break;
3090*53ee8cc1Swenshuai.xi         case E_DMD_MSB124X_DEMOD_DVBC:
3091*53ee8cc1Swenshuai.xi             u8Data=3;
3092*53ee8cc1Swenshuai.xi             break;
3093*53ee8cc1Swenshuai.xi         case E_DMD_MSB124X_DEMOD_DVBS2:
3094*53ee8cc1Swenshuai.xi             u8Data=4;
3095*53ee8cc1Swenshuai.xi             break;
3096*53ee8cc1Swenshuai.xi         default:
3097*53ee8cc1Swenshuai.xi             u8Data=2;
3098*53ee8cc1Swenshuai.xi             return FALSE;
3099*53ee8cc1Swenshuai.xi     }
3100*53ee8cc1Swenshuai.xi 
3101*53ee8cc1Swenshuai.xi     if(pDemod->_sDMD_MSB124X_InitData.u8WO_Sdram==1)   //  1 means no SDRAM on board
3102*53ee8cc1Swenshuai.xi     {
3103*53ee8cc1Swenshuai.xi            //no sdram case
3104*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
3105*53ee8cc1Swenshuai.xi         u32tmm_11 = MsOS_GetSystemTime();
3106*53ee8cc1Swenshuai.xi         #endif
3107*53ee8cc1Swenshuai.xi         switch (u8Data)
3108*53ee8cc1Swenshuai.xi         {
3109*53ee8cc1Swenshuai.xi             //since no sdram IC not support DVBT2
3110*53ee8cc1Swenshuai.xi             case 2:
3111*53ee8cc1Swenshuai.xi             default:
3112*53ee8cc1Swenshuai.xi                 u8FirmwareType = MSB124X_DVBT;
3113*53ee8cc1Swenshuai.xi                 break;
3114*53ee8cc1Swenshuai.xi             case 3:
3115*53ee8cc1Swenshuai.xi                 u8FirmwareType = MSB124X_DVBC;
3116*53ee8cc1Swenshuai.xi                 break;
3117*53ee8cc1Swenshuai.xi             case 4:
3118*53ee8cc1Swenshuai.xi                 u8FirmwareType = MSB124X_DVBS2;
3119*53ee8cc1Swenshuai.xi                 break;
3120*53ee8cc1Swenshuai.xi         }
3121*53ee8cc1Swenshuai.xi         bRet &= _LoadDspCodeToSRAM(u8FirmwareType);
3122*53ee8cc1Swenshuai.xi 
3123*53ee8cc1Swenshuai.xi         bRet &= _MSB124X_MEM_switch(1);
3124*53ee8cc1Swenshuai.xi 
3125*53ee8cc1Swenshuai.xi         // Enable MCU
3126*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg(0x0b00+(0x19)*2, 0x00);
3127*53ee8cc1Swenshuai.xi 
3128*53ee8cc1Swenshuai.xi 
3129*53ee8cc1Swenshuai.xi     }
3130*53ee8cc1Swenshuai.xi     else if((pDemod->_sDMD_MSB124X_InitData.u8WO_SPI_Flash == 1)&&(pDemod->_sDMD_MSB124X_InitData.u8WO_Sdram==0))
3131*53ee8cc1Swenshuai.xi     {
3132*53ee8cc1Swenshuai.xi         //MS_U8 u8FirmwareType = MSB124X_DVBT;
3133*53ee8cc1Swenshuai.xi 
3134*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
3135*53ee8cc1Swenshuai.xi         u32tmm_11 = MsOS_GetSystemTime();
3136*53ee8cc1Swenshuai.xi         #endif
3137*53ee8cc1Swenshuai.xi 
3138*53ee8cc1Swenshuai.xi         switch (u8Data)
3139*53ee8cc1Swenshuai.xi         {
3140*53ee8cc1Swenshuai.xi             case 1:
3141*53ee8cc1Swenshuai.xi                 u8FirmwareType = MSB124X_DVBT2;
3142*53ee8cc1Swenshuai.xi                 break;
3143*53ee8cc1Swenshuai.xi             case 2:
3144*53ee8cc1Swenshuai.xi             default:
3145*53ee8cc1Swenshuai.xi                 u8FirmwareType = MSB124X_DVBT;
3146*53ee8cc1Swenshuai.xi                 break;
3147*53ee8cc1Swenshuai.xi             case 3:
3148*53ee8cc1Swenshuai.xi                 u8FirmwareType = MSB124X_DVBC;
3149*53ee8cc1Swenshuai.xi                 break;
3150*53ee8cc1Swenshuai.xi             case 4:
3151*53ee8cc1Swenshuai.xi                 u8FirmwareType = MSB124X_DVBS2;
3152*53ee8cc1Swenshuai.xi                 break;
3153*53ee8cc1Swenshuai.xi         }
3154*53ee8cc1Swenshuai.xi 
3155*53ee8cc1Swenshuai.xi         bRet &= _LoadDspCodeToSDRAM(u8FirmwareType);
3156*53ee8cc1Swenshuai.xi 
3157*53ee8cc1Swenshuai.xi         bRet &= _LoadSdram2Sram(u8FirmwareType);
3158*53ee8cc1Swenshuai.xi 
3159*53ee8cc1Swenshuai.xi         // Enable MCU
3160*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg(0x0b00+(0x19)*2, 0x00);
3161*53ee8cc1Swenshuai.xi     }
3162*53ee8cc1Swenshuai.xi     else
3163*53ee8cc1Swenshuai.xi     {
3164*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
3165*53ee8cc1Swenshuai.xi         u32tmm_9 = MsOS_GetSystemTime();
3166*53ee8cc1Swenshuai.xi         #endif
3167*53ee8cc1Swenshuai.xi         // mask miu access for all and mcu
3168*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg(0x1200+(0x23)*2 + 1,0x7f);
3169*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg(0x1200+(0x23)*2,0xfe);
3170*53ee8cc1Swenshuai.xi         // 10us delay
3171*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(10);
3172*53ee8cc1Swenshuai.xi 
3173*53ee8cc1Swenshuai.xi         // Disable MCU
3174*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB124X_SetReg(0x0b00+(0x19)*2, 0x03);
3175*53ee8cc1Swenshuai.xi 
3176*53ee8cc1Swenshuai.xi         // Run code on bootloader
3177*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB124X_SetReg(0x1000+(0x0c)*2, 0x02);
3178*53ee8cc1Swenshuai.xi 
3179*53ee8cc1Swenshuai.xi         // Assign f/w code type to load => 0: boot-loader 1: dvbt2, 2: dvbt, 3: dvbc
3180*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB124X_SetReg(0x0900 + (0x4f) * 2, u8Data);
3181*53ee8cc1Swenshuai.xi 
3182*53ee8cc1Swenshuai.xi 
3183*53ee8cc1Swenshuai.xi         // enable miu access of mcu gdma
3184*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg(0x1200+(0x23)*2,0xf0);
3185*53ee8cc1Swenshuai.xi         // 10us delay
3186*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(10);
3187*53ee8cc1Swenshuai.xi 
3188*53ee8cc1Swenshuai.xi         // Enable MCU
3189*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB124X_SetReg(0x0b00+(0x19)*2, 0x00);
3190*53ee8cc1Swenshuai.xi 
3191*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
3192*53ee8cc1Swenshuai.xi         u32tmm_10 = MsOS_GetSystemTime();
3193*53ee8cc1Swenshuai.xi         printf("[tmm8]t10 - t9 = %ld (%ld - %ld)\n",u32tmm_10-u32tmm_9,u32tmm_10,u32tmm_9);
3194*53ee8cc1Swenshuai.xi         #endif
3195*53ee8cc1Swenshuai.xi 
3196*53ee8cc1Swenshuai.xi 
3197*53ee8cc1Swenshuai.xi         do
3198*53ee8cc1Swenshuai.xi         {
3199*53ee8cc1Swenshuai.xi             _MDrv_DMD_MSB124X_GetReg(0x0900+(0x4f)*2, &u8DoneFlag);
3200*53ee8cc1Swenshuai.xi 
3201*53ee8cc1Swenshuai.xi             if (u32Timeout++ > 500)
3202*53ee8cc1Swenshuai.xi                 return FALSE;
3203*53ee8cc1Swenshuai.xi 
3204*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(1*1000);
3205*53ee8cc1Swenshuai.xi 
3206*53ee8cc1Swenshuai.xi         }
3207*53ee8cc1Swenshuai.xi         while(u8DoneFlag != 0xaa);
3208*53ee8cc1Swenshuai.xi 
3209*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
3210*53ee8cc1Swenshuai.xi         u32tmm_11 = MsOS_GetSystemTime();
3211*53ee8cc1Swenshuai.xi         printf("[tmm8]t11 - t10 = %ld (%ld - %ld)\n",u32tmm_11-u32tmm_10,u32tmm_11,u32tmm_10);
3212*53ee8cc1Swenshuai.xi         #endif
3213*53ee8cc1Swenshuai.xi 
3214*53ee8cc1Swenshuai.xi         // mask miu access for all and mcu
3215*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg(0x1200+(0x23)*2 + 1,0x7f);
3216*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg(0x1200+(0x23)*2,0xfe);
3217*53ee8cc1Swenshuai.xi         // 10us delay
3218*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(10);
3219*53ee8cc1Swenshuai.xi 
3220*53ee8cc1Swenshuai.xi         // Disable MCU
3221*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB124X_SetReg(0x0b00+(0x19)*2, 0x03);
3222*53ee8cc1Swenshuai.xi 
3223*53ee8cc1Swenshuai.xi         // Run code on loaded firmware
3224*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB124X_SetReg(0x1000+(0x0c)*2, 0x05);
3225*53ee8cc1Swenshuai.xi 
3226*53ee8cc1Swenshuai.xi         do
3227*53ee8cc1Swenshuai.xi         {
3228*53ee8cc1Swenshuai.xi             _MDrv_DMD_MSB124X_GetReg(0x1000+(0x0c)*2, &u8DoneFlag);
3229*53ee8cc1Swenshuai.xi 
3230*53ee8cc1Swenshuai.xi             if (u32Timeout++ > 500)
3231*53ee8cc1Swenshuai.xi                 return FALSE;
3232*53ee8cc1Swenshuai.xi 
3233*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(1*1000);
3234*53ee8cc1Swenshuai.xi 
3235*53ee8cc1Swenshuai.xi         }
3236*53ee8cc1Swenshuai.xi         while(u8DoneFlag != 0x05);
3237*53ee8cc1Swenshuai.xi 
3238*53ee8cc1Swenshuai.xi         // enable miu access of mcu gdma
3239*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg(0x1200+(0x23)*2,0xf0);
3240*53ee8cc1Swenshuai.xi         // 10us delay
3241*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(10);
3242*53ee8cc1Swenshuai.xi 
3243*53ee8cc1Swenshuai.xi         // Enable MCU
3244*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB124X_SetReg(0x0b00+(0x19)*2, 0x00);
3245*53ee8cc1Swenshuai.xi     }
3246*53ee8cc1Swenshuai.xi 
3247*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
3248*53ee8cc1Swenshuai.xi     u32tmm_12 = MsOS_GetSystemTime();
3249*53ee8cc1Swenshuai.xi     printf("[tmm8]t12 - t11 = %ld (%ld - %ld), TYPE is %d \n",u32tmm_12-u32tmm_11,u32tmm_12,u32tmm_11, eDMD_MSB124X_CurrentDemodulatorType);
3250*53ee8cc1Swenshuai.xi     #endif
3251*53ee8cc1Swenshuai.xi 
3252*53ee8cc1Swenshuai.xi     switch(pDemod->eDMD_MSB124X_CurrentDemodulatorType)
3253*53ee8cc1Swenshuai.xi     {
3254*53ee8cc1Swenshuai.xi         case E_DMD_MSB124X_DEMOD_DVBT2:
3255*53ee8cc1Swenshuai.xi             _DTV_DVBT2_DSPReg_Init();
3256*53ee8cc1Swenshuai.xi             break;
3257*53ee8cc1Swenshuai.xi         case E_DMD_MSB124X_DEMOD_DVBT:
3258*53ee8cc1Swenshuai.xi             _DTV_DVBT_DSPReg_Init();
3259*53ee8cc1Swenshuai.xi             break;
3260*53ee8cc1Swenshuai.xi         case E_DMD_MSB124X_DEMOD_DVBC://mick
3261*53ee8cc1Swenshuai.xi             _DTV_DVBC_DSPReg_Init();
3262*53ee8cc1Swenshuai.xi             break;
3263*53ee8cc1Swenshuai.xi         case E_DMD_MSB124X_DEMOD_DVBS2:
3264*53ee8cc1Swenshuai.xi             printf("_DTV_DVBS_DSPReg_Init NULL\n");
3265*53ee8cc1Swenshuai.xi             break;
3266*53ee8cc1Swenshuai.xi         default:
3267*53ee8cc1Swenshuai.xi             return FALSE;
3268*53ee8cc1Swenshuai.xi     }
3269*53ee8cc1Swenshuai.xi 
3270*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
3271*53ee8cc1Swenshuai.xi     u32tmm_13 = MsOS_GetSystemTime();
3272*53ee8cc1Swenshuai.xi     printf("[tmm8]t13 - t12 = %ld (%ld - %ld)\n",u32tmm_13-u32tmm_12,u32tmm_13,u32tmm_12);
3273*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][end]LoadDspCode\n"));
3274*53ee8cc1Swenshuai.xi     #endif
3275*53ee8cc1Swenshuai.xi 
3276*53ee8cc1Swenshuai.xi     return bRet;
3277*53ee8cc1Swenshuai.xi }
3278*53ee8cc1Swenshuai.xi 
_msb124x_flash_mode_en(void)3279*53ee8cc1Swenshuai.xi static MS_BOOL _msb124x_flash_mode_en(void)
3280*53ee8cc1Swenshuai.xi {
3281*53ee8cc1Swenshuai.xi     MS_BOOL  bRet = TRUE;
3282*53ee8cc1Swenshuai.xi     MS_U8    data[5] = {0x53, 0x45, 0x52, 0x44, 0x42};
3283*53ee8cc1Swenshuai.xi     MS_U8    u8MsbData[6] = {0};
3284*53ee8cc1Swenshuai.xi     MS_U8    ch_num  = 3;
3285*53ee8cc1Swenshuai.xi     MS_U8    u8Data  = 0;
3286*53ee8cc1Swenshuai.xi     MS_U16   u16Addr = 0;
3287*53ee8cc1Swenshuai.xi     MS_U8    retry_num = MSB124X_MAX_FLASH_ON_RETRY_NUM;
3288*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
3289*53ee8cc1Swenshuai.xi 
3290*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
3291*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][beg]msb124x_flash_mode_en\n"));
3292*53ee8cc1Swenshuai.xi     #endif
3293*53ee8cc1Swenshuai.xi 
3294*53ee8cc1Swenshuai.xi     do{
3295*53ee8cc1Swenshuai.xi 
3296*53ee8cc1Swenshuai.xi         if (retry_num != MSB124X_MAX_FLASH_ON_RETRY_NUM)
3297*53ee8cc1Swenshuai.xi         {
3298*53ee8cc1Swenshuai.xi             ERR_DEMOD_MSB(printf("[msb124x][error]flash mode en fail.....retry=%d\n",retry_num);)
3299*53ee8cc1Swenshuai.xi         }
3300*53ee8cc1Swenshuai.xi         // bRet = TRUE;
3301*53ee8cc1Swenshuai.xi         // password
3302*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h53(PWD1)->8,h45(PWD2)->8,h52(PWD3)->8,h44(PWD4)->8,h42(PWD5)
3303*53ee8cc1Swenshuai.xi         data[0] = 0x53;
3304*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, data);
3305*53ee8cc1Swenshuai.xi 
3306*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h71(CMD)  //TV.n_iic_
3307*53ee8cc1Swenshuai.xi         data[0] = 0x71;
3308*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, data);
3309*53ee8cc1Swenshuai.xi 
3310*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h81(CMD)  //TV.n_iic_sel_b0
3311*53ee8cc1Swenshuai.xi         data[0] = ((ch_num & 0x01) != 0)? 0x81 : 0x80;
3312*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, data);
3313*53ee8cc1Swenshuai.xi 
3314*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h83(CMD)  //TV.n_iic_sel_b1
3315*53ee8cc1Swenshuai.xi         data[0] = ((ch_num & 0x02) != 0)? 0x83 : 0x82;
3316*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, data);
3317*53ee8cc1Swenshuai.xi 
3318*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h84(CMD)  //TV.n_iic_sel_b2
3319*53ee8cc1Swenshuai.xi         data[0] = ((ch_num & 0x04) != 0)? 0x85 : 0x84;
3320*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, data);
3321*53ee8cc1Swenshuai.xi 
3322*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h53(CMD)  //TV.n_iic_ad_byte_en2, 32bit read/write
3323*53ee8cc1Swenshuai.xi         data[0] = 0x53;
3324*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, data);
3325*53ee8cc1Swenshuai.xi 
3326*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h7f(CMD)  //TV.n_iic_sel_use_cfg
3327*53ee8cc1Swenshuai.xi         data[0] = 0x7f;
3328*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, data);
3329*53ee8cc1Swenshuai.xi 
3330*53ee8cc1Swenshuai.xi     /*
3331*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h35(CMD)  //TV.n_iic_use
3332*53ee8cc1Swenshuai.xi         data[0] = 0x35;
3333*53ee8cc1Swenshuai.xi         bRet &= iptr->WriteBytes(0, NULL, 1, data);
3334*53ee8cc1Swenshuai.xi 
3335*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h71(CMD)  //TV.n_iic_Re-shape
3336*53ee8cc1Swenshuai.xi         data[0] = 0x71;
3337*53ee8cc1Swenshuai.xi         bRet &= iptr->WriteBytes(0, NULL, 1, data);
3338*53ee8cc1Swenshuai.xi     */
3339*53ee8cc1Swenshuai.xi         bRet = TRUE;
3340*53ee8cc1Swenshuai.xi 
3341*53ee8cc1Swenshuai.xi         // confirm first, 0x99 and 0xaa.
3342*53ee8cc1Swenshuai.xi         // beg read register
3343*53ee8cc1Swenshuai.xi         u16Addr = 0x0900+(0x4f<<1);
3344*53ee8cc1Swenshuai.xi         u8Data = 0x0;
3345*53ee8cc1Swenshuai.xi 
3346*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
3347*53ee8cc1Swenshuai.xi         u8MsbData[1] = 0x00;
3348*53ee8cc1Swenshuai.xi         u8MsbData[2] = 0x00;
3349*53ee8cc1Swenshuai.xi         u8MsbData[3] = (u16Addr >> 8) &0xff;
3350*53ee8cc1Swenshuai.xi         u8MsbData[4] = u16Addr &0xff;
3351*53ee8cc1Swenshuai.xi 
3352*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x35;
3353*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3354*53ee8cc1Swenshuai.xi 
3355*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
3356*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8MsbData);
3357*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_READ_BYTES, 0, NULL, 1, &u8Data);
3358*53ee8cc1Swenshuai.xi 
3359*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x34;
3360*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3361*53ee8cc1Swenshuai.xi         // end read register
3362*53ee8cc1Swenshuai.xi 
3363*53ee8cc1Swenshuai.xi         if ((u8Data == 0x99) || (u8Data == 0xaa))
3364*53ee8cc1Swenshuai.xi         {
3365*53ee8cc1Swenshuai.xi             ERR_DEMOD_MSB(printf("[msb124x][warning]flash is already on....\n");)
3366*53ee8cc1Swenshuai.xi             break;
3367*53ee8cc1Swenshuai.xi         }
3368*53ee8cc1Swenshuai.xi         // flash mode enable.
3369*53ee8cc1Swenshuai.xi         // beg read register
3370*53ee8cc1Swenshuai.xi         u16Addr = 0x0900+(0x28<<1)+1;
3371*53ee8cc1Swenshuai.xi         u8Data = 0x0;
3372*53ee8cc1Swenshuai.xi 
3373*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
3374*53ee8cc1Swenshuai.xi         u8MsbData[1] = 0x00;
3375*53ee8cc1Swenshuai.xi         u8MsbData[2] = 0x00;
3376*53ee8cc1Swenshuai.xi         u8MsbData[3] = (u16Addr >> 8) &0xff;
3377*53ee8cc1Swenshuai.xi         u8MsbData[4] = u16Addr &0xff;
3378*53ee8cc1Swenshuai.xi 
3379*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x35;
3380*53ee8cc1Swenshuai.xi 
3381*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3382*53ee8cc1Swenshuai.xi 
3383*53ee8cc1Swenshuai.xi 
3384*53ee8cc1Swenshuai.xi 
3385*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
3386*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8MsbData);
3387*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_READ_BYTES, 0, NULL, 1, &u8Data);
3388*53ee8cc1Swenshuai.xi 
3389*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x34;
3390*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3391*53ee8cc1Swenshuai.xi         // end read register
3392*53ee8cc1Swenshuai.xi 
3393*53ee8cc1Swenshuai.xi         // beg write register
3394*53ee8cc1Swenshuai.xi         u16Addr = 0x0900+(0x28<<1) + 1;
3395*53ee8cc1Swenshuai.xi         u8Data &= (0xff-0x01);
3396*53ee8cc1Swenshuai.xi 
3397*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
3398*53ee8cc1Swenshuai.xi         u8MsbData[1] = 0x00;
3399*53ee8cc1Swenshuai.xi         u8MsbData[2] = 0x00;
3400*53ee8cc1Swenshuai.xi         u8MsbData[3] = (u16Addr >> 8) &0xff;
3401*53ee8cc1Swenshuai.xi         u8MsbData[4] = u16Addr &0xff;
3402*53ee8cc1Swenshuai.xi         u8MsbData[5] = u8Data;
3403*53ee8cc1Swenshuai.xi 
3404*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x35;
3405*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3406*53ee8cc1Swenshuai.xi 
3407*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
3408*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 6, u8MsbData);
3409*53ee8cc1Swenshuai.xi 
3410*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x34;
3411*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3412*53ee8cc1Swenshuai.xi         // end write register
3413*53ee8cc1Swenshuai.xi 
3414*53ee8cc1Swenshuai.xi         // beg write register
3415*53ee8cc1Swenshuai.xi         u16Addr = 0x0900+(0x06<<1);
3416*53ee8cc1Swenshuai.xi         u8Data = 0x10;
3417*53ee8cc1Swenshuai.xi 
3418*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
3419*53ee8cc1Swenshuai.xi         u8MsbData[1] = 0x00;
3420*53ee8cc1Swenshuai.xi         u8MsbData[2] = 0x00;
3421*53ee8cc1Swenshuai.xi         u8MsbData[3] = (u16Addr >> 8) &0xff;
3422*53ee8cc1Swenshuai.xi         u8MsbData[4] = u16Addr &0xff;
3423*53ee8cc1Swenshuai.xi         u8MsbData[5] = u8Data;
3424*53ee8cc1Swenshuai.xi 
3425*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x35;
3426*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3427*53ee8cc1Swenshuai.xi 
3428*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
3429*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 6, u8MsbData);
3430*53ee8cc1Swenshuai.xi 
3431*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x34;
3432*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3433*53ee8cc1Swenshuai.xi         // end write register
3434*53ee8cc1Swenshuai.xi 
3435*53ee8cc1Swenshuai.xi         // beg write register
3436*53ee8cc1Swenshuai.xi 
3437*53ee8cc1Swenshuai.xi         u16Addr = 0x0900+(0x07<<1);
3438*53ee8cc1Swenshuai.xi         u8Data = 0x10;
3439*53ee8cc1Swenshuai.xi 
3440*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
3441*53ee8cc1Swenshuai.xi         u8MsbData[1] = 0x00;
3442*53ee8cc1Swenshuai.xi         u8MsbData[2] = 0x00;
3443*53ee8cc1Swenshuai.xi         u8MsbData[3] = (u16Addr >> 8) &0xff;
3444*53ee8cc1Swenshuai.xi         u8MsbData[4] = u16Addr &0xff;
3445*53ee8cc1Swenshuai.xi         u8MsbData[5] = u8Data;
3446*53ee8cc1Swenshuai.xi 
3447*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x35;
3448*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3449*53ee8cc1Swenshuai.xi 
3450*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
3451*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 6, u8MsbData);
3452*53ee8cc1Swenshuai.xi 
3453*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x34;
3454*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3455*53ee8cc1Swenshuai.xi     }while( (bRet == FALSE) && (retry_num-- != 0));
3456*53ee8cc1Swenshuai.xi     // end write register
3457*53ee8cc1Swenshuai.xi 
3458*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
3459*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][end]msb124x_flash_mode_en,bRet=%d\n",bRet));
3460*53ee8cc1Swenshuai.xi     #endif
3461*53ee8cc1Swenshuai.xi 
3462*53ee8cc1Swenshuai.xi     return bRet;
3463*53ee8cc1Swenshuai.xi }
3464*53ee8cc1Swenshuai.xi 
_msb124x_flash_boot_ready_waiting(MS_U8 * ptimeout)3465*53ee8cc1Swenshuai.xi static MS_BOOL _msb124x_flash_boot_ready_waiting(MS_U8 *ptimeout)
3466*53ee8cc1Swenshuai.xi {
3467*53ee8cc1Swenshuai.xi 
3468*53ee8cc1Swenshuai.xi     MS_BOOL  bRet = TRUE;
3469*53ee8cc1Swenshuai.xi //    MAPI_U8    data[5] = {0x53, 0x45, 0x52, 0x44, 0x42};
3470*53ee8cc1Swenshuai.xi     MS_U8    u8MsbData[6] = {0};
3471*53ee8cc1Swenshuai.xi     MS_U8    u8Data  = 0;
3472*53ee8cc1Swenshuai.xi     MS_U16   u16Addr = 0;
3473*53ee8cc1Swenshuai.xi     MS_U8    u8_timeout = 0;
3474*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
3475*53ee8cc1Swenshuai.xi 
3476*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
3477*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][beg]msb124x_flash_boot_ready_waiting\n"));
3478*53ee8cc1Swenshuai.xi     #endif
3479*53ee8cc1Swenshuai.xi 
3480*53ee8cc1Swenshuai.xi     // wait for flash->dram ready.
3481*53ee8cc1Swenshuai.xi     // read register
3482*53ee8cc1Swenshuai.xi 
3483*53ee8cc1Swenshuai.xi     u16Addr = 0x0900+(0x4f<<1);
3484*53ee8cc1Swenshuai.xi     u8Data = 0x0;
3485*53ee8cc1Swenshuai.xi 
3486*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
3487*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
3488*53ee8cc1Swenshuai.xi     u8MsbData[2] = 0x00;
3489*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u16Addr >> 8) &0xff;
3490*53ee8cc1Swenshuai.xi     u8MsbData[4] = u16Addr &0xff;
3491*53ee8cc1Swenshuai.xi 
3492*53ee8cc1Swenshuai.xi     u8_timeout = 0xff;
3493*53ee8cc1Swenshuai.xi 
3494*53ee8cc1Swenshuai.xi     while( (u8Data != 0x99) && (u8Data != 0xaa) && (u8_timeout-->0))
3495*53ee8cc1Swenshuai.xi     {
3496*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x35;
3497*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3498*53ee8cc1Swenshuai.xi 
3499*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
3500*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8MsbData);
3501*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_READ_BYTES, 0, NULL, 1, &u8Data);
3502*53ee8cc1Swenshuai.xi 
3503*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x34;
3504*53ee8cc1Swenshuai.xi         bRet &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3505*53ee8cc1Swenshuai.xi         // 10ms
3506*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(1000*10);
3507*53ee8cc1Swenshuai.xi     }
3508*53ee8cc1Swenshuai.xi     // end read register
3509*53ee8cc1Swenshuai.xi     *ptimeout = 0;
3510*53ee8cc1Swenshuai.xi     if (u8_timeout == 0x00)
3511*53ee8cc1Swenshuai.xi     {
3512*53ee8cc1Swenshuai.xi         *ptimeout = 1;
3513*53ee8cc1Swenshuai.xi         ERR_DEMOD_MSB(printf("[msb124x][error]msb124x_flash_boot_ready_waiting, timeout....\n");)
3514*53ee8cc1Swenshuai.xi     }
3515*53ee8cc1Swenshuai.xi 
3516*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
3517*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb124x][end]msb124x_flash_boot_ready_waiting, t=%d\n",u8_timeout));
3518*53ee8cc1Swenshuai.xi     #endif
3519*53ee8cc1Swenshuai.xi     return bRet;
3520*53ee8cc1Swenshuai.xi }
3521*53ee8cc1Swenshuai.xi 
_msb124x_flash_WP_reg_read(MS_U16 u16Addr,MS_U8 * pu8Data)3522*53ee8cc1Swenshuai.xi static MS_BOOL _msb124x_flash_WP_reg_read(MS_U16 u16Addr, MS_U8 *pu8Data)
3523*53ee8cc1Swenshuai.xi {
3524*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
3525*53ee8cc1Swenshuai.xi     MS_U8   u8MsbData[5];
3526*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
3527*53ee8cc1Swenshuai.xi 
3528*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
3529*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
3530*53ee8cc1Swenshuai.xi     u8MsbData[2] = 0x00;
3531*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u16Addr >> 8) &0xff;
3532*53ee8cc1Swenshuai.xi     u8MsbData[4] = u16Addr &0xff;
3533*53ee8cc1Swenshuai.xi 
3534*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x35;
3535*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3536*53ee8cc1Swenshuai.xi 
3537*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
3538*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8MsbData);
3539*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_READ_BYTES, 0, NULL, 1, pu8Data);
3540*53ee8cc1Swenshuai.xi 
3541*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x34;
3542*53ee8cc1Swenshuai.xi     bRet=(pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3543*53ee8cc1Swenshuai.xi     return bRet;
3544*53ee8cc1Swenshuai.xi }
3545*53ee8cc1Swenshuai.xi 
_msb124x_flash_WP_reg_write(MS_U16 u16Addr,MS_U8 u8Data)3546*53ee8cc1Swenshuai.xi static MS_BOOL _msb124x_flash_WP_reg_write(MS_U16 u16Addr, MS_U8 u8Data)
3547*53ee8cc1Swenshuai.xi {
3548*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
3549*53ee8cc1Swenshuai.xi     MS_U8   u8MsbData[6];
3550*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
3551*53ee8cc1Swenshuai.xi 
3552*53ee8cc1Swenshuai.xi     //bRet &= iptr->SetSpeed(0);
3553*53ee8cc1Swenshuai.xi 
3554*53ee8cc1Swenshuai.xi 
3555*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
3556*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
3557*53ee8cc1Swenshuai.xi     u8MsbData[2] = 0x00;
3558*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u16Addr >> 8) &0xff;
3559*53ee8cc1Swenshuai.xi     u8MsbData[4] = u16Addr &0xff;
3560*53ee8cc1Swenshuai.xi     u8MsbData[5] = u8Data;
3561*53ee8cc1Swenshuai.xi 
3562*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x35;
3563*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3564*53ee8cc1Swenshuai.xi 
3565*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
3566*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 6, u8MsbData);
3567*53ee8cc1Swenshuai.xi 
3568*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x34;
3569*53ee8cc1Swenshuai.xi     bRet=(pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3570*53ee8cc1Swenshuai.xi     return bRet;
3571*53ee8cc1Swenshuai.xi }
3572*53ee8cc1Swenshuai.xi 
_msbMSB124X_flash_WRSR(MS_U8 reg)3573*53ee8cc1Swenshuai.xi static MS_BOOL _msbMSB124X_flash_WRSR(MS_U8 reg)
3574*53ee8cc1Swenshuai.xi {
3575*53ee8cc1Swenshuai.xi     MS_U8 bWriteData[5]={0x4D, 0x53, 0x54, 0x41, 0x52};
3576*53ee8cc1Swenshuai.xi     MS_U8     bAddr[1];
3577*53ee8cc1Swenshuai.xi     MS_BOOL   bRet = TRUE;
3578*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
3579*53ee8cc1Swenshuai.xi 
3580*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, bWriteData);
3581*53ee8cc1Swenshuai.xi 
3582*53ee8cc1Swenshuai.xi     // WREN
3583*53ee8cc1Swenshuai.xi     bAddr[0] = 0x10;
3584*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x06;
3585*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 1, bWriteData);
3586*53ee8cc1Swenshuai.xi 
3587*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x12;
3588*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
3589*53ee8cc1Swenshuai.xi 
3590*53ee8cc1Swenshuai.xi     // WRSR
3591*53ee8cc1Swenshuai.xi     bAddr[0] = 0x10;
3592*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x01;
3593*53ee8cc1Swenshuai.xi     bWriteData[1] = reg;
3594*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 2, bWriteData);
3595*53ee8cc1Swenshuai.xi 
3596*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x12;
3597*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
3598*53ee8cc1Swenshuai.xi 
3599*53ee8cc1Swenshuai.xi     // WRDI
3600*53ee8cc1Swenshuai.xi     bAddr[0] = 0x10;
3601*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x04;
3602*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 1, bWriteData);
3603*53ee8cc1Swenshuai.xi 
3604*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x12;
3605*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
3606*53ee8cc1Swenshuai.xi 
3607*53ee8cc1Swenshuai.xi     // end
3608*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x24;
3609*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
3610*53ee8cc1Swenshuai.xi 
3611*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
3612*53ee8cc1Swenshuai.xi     DBG_FLASH_WP(printf("[wb]msbMSB124X_flash_WRSR, reg=0x%x\n",reg);)
3613*53ee8cc1Swenshuai.xi     #endif
3614*53ee8cc1Swenshuai.xi 
3615*53ee8cc1Swenshuai.xi     return bRet;
3616*53ee8cc1Swenshuai.xi }
3617*53ee8cc1Swenshuai.xi 
_msbMSB124X_flash_SRSR(MS_U8 * p_reg)3618*53ee8cc1Swenshuai.xi static MS_BOOL _msbMSB124X_flash_SRSR(MS_U8 *p_reg)
3619*53ee8cc1Swenshuai.xi {
3620*53ee8cc1Swenshuai.xi     MS_U8 bWriteData[5]={0x4D, 0x53, 0x54, 0x41, 0x52};
3621*53ee8cc1Swenshuai.xi     MS_U8     bAddr[1];
3622*53ee8cc1Swenshuai.xi     MS_BOOL   bRet = TRUE;
3623*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
3624*53ee8cc1Swenshuai.xi 
3625*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, bWriteData);
3626*53ee8cc1Swenshuai.xi 
3627*53ee8cc1Swenshuai.xi     bAddr[0] = 0x10;
3628*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x05;
3629*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 1, bWriteData);
3630*53ee8cc1Swenshuai.xi 
3631*53ee8cc1Swenshuai.xi     bAddr[0] = 0x11;
3632*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_READ_BYTES, 1, bAddr, 1, p_reg);
3633*53ee8cc1Swenshuai.xi 
3634*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x12;
3635*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
3636*53ee8cc1Swenshuai.xi 
3637*53ee8cc1Swenshuai.xi     // end
3638*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x24 ;
3639*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
3640*53ee8cc1Swenshuai.xi 
3641*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
3642*53ee8cc1Swenshuai.xi     DBG_FLASH_WP(printf("[wb]msbMSB124X_flash_SRSR, reg=0x%x\n",*p_reg);)
3643*53ee8cc1Swenshuai.xi     #endif
3644*53ee8cc1Swenshuai.xi 
3645*53ee8cc1Swenshuai.xi     return bRet;
3646*53ee8cc1Swenshuai.xi }
3647*53ee8cc1Swenshuai.xi 
_msb124x_flash_WP(MS_U8 enable)3648*53ee8cc1Swenshuai.xi static MS_BOOL _msb124x_flash_WP(MS_U8 enable)
3649*53ee8cc1Swenshuai.xi #if 0
3650*53ee8cc1Swenshuai.xi {
3651*53ee8cc1Swenshuai.xi     MAPI_U8 reg = 0;
3652*53ee8cc1Swenshuai.xi     MAPI_BOOL bRet = true;
3653*53ee8cc1Swenshuai.xi     MAPI_U8 u8_count = 0;
3654*53ee8cc1Swenshuai.xi 
3655*53ee8cc1Swenshuai.xi     DBG_FLASH_WP(printf("[wb]msb1233c_flash_WP_Enable=%d\n",enable);)
3656*53ee8cc1Swenshuai.xi 
3657*53ee8cc1Swenshuai.xi     if (enable == 1)
3658*53ee8cc1Swenshuai.xi     {
3659*53ee8cc1Swenshuai.xi       u8_count = 20;
3660*53ee8cc1Swenshuai.xi       do
3661*53ee8cc1Swenshuai.xi       {
3662*53ee8cc1Swenshuai.xi         msb1233c_flash_SRSR(&reg);
3663*53ee8cc1Swenshuai.xi         usleep(1*1000);
3664*53ee8cc1Swenshuai.xi       }while(reg&0x01 && u8_count--);
3665*53ee8cc1Swenshuai.xi 
3666*53ee8cc1Swenshuai.xi       if (u8_count == 0)
3667*53ee8cc1Swenshuai.xi       {
3668*53ee8cc1Swenshuai.xi         bRet = false;
3669*53ee8cc1Swenshuai.xi         DBG_FLASH_WP(printf("[wb]Err, flash_SRSR timeout!!!\n");)
3670*53ee8cc1Swenshuai.xi         return bRet;
3671*53ee8cc1Swenshuai.xi       }
3672*53ee8cc1Swenshuai.xi 
3673*53ee8cc1Swenshuai.xi       msb1233c_flash_WRSR(reg|0x9c);
3674*53ee8cc1Swenshuai.xi 
3675*53ee8cc1Swenshuai.xi 
3676*53ee8cc1Swenshuai.xi       u8_count = 20;
3677*53ee8cc1Swenshuai.xi       do
3678*53ee8cc1Swenshuai.xi       {
3679*53ee8cc1Swenshuai.xi         msb1233c_flash_SRSR(&reg);
3680*53ee8cc1Swenshuai.xi         usleep(1*1000);
3681*53ee8cc1Swenshuai.xi       }while(reg&0x01 && u8_count--);
3682*53ee8cc1Swenshuai.xi 
3683*53ee8cc1Swenshuai.xi       if (u8_count == 0)
3684*53ee8cc1Swenshuai.xi       {
3685*53ee8cc1Swenshuai.xi         bRet = false;
3686*53ee8cc1Swenshuai.xi         DBG_FLASH_WP(printf("[wb]Err, flash_SRSR timeout!!!\n");)
3687*53ee8cc1Swenshuai.xi         return bRet;
3688*53ee8cc1Swenshuai.xi       }
3689*53ee8cc1Swenshuai.xi 
3690*53ee8cc1Swenshuai.xi       // active low
3691*53ee8cc1Swenshuai.xi       // pull low
3692*53ee8cc1Swenshuai.xi       bRet &= msb1233c_flash_WP_reg_read(0x0900+0x63*2+1, &reg);
3693*53ee8cc1Swenshuai.xi       bRet &= msb1233c_flash_WP_reg_write(0x0900+0x63*2+1, reg&(~0x08));
3694*53ee8cc1Swenshuai.xi 
3695*53ee8cc1Swenshuai.xi       // gpio11 output enable
3696*53ee8cc1Swenshuai.xi       bRet &= msb1233c_flash_WP_reg_read(0x0900+0x64*2+1, &reg);
3697*53ee8cc1Swenshuai.xi       bRet &= msb1233c_flash_WP_reg_write(0x0900+0x64*2+1, reg&(~0x08));
3698*53ee8cc1Swenshuai.xi     }
3699*53ee8cc1Swenshuai.xi     else
3700*53ee8cc1Swenshuai.xi     {
3701*53ee8cc1Swenshuai.xi       // unactive high
3702*53ee8cc1Swenshuai.xi       // pull high
3703*53ee8cc1Swenshuai.xi       bRet &= msb1233c_flash_WP_reg_read(0x0900+0x63*2+1, &reg);
3704*53ee8cc1Swenshuai.xi       bRet &= msb1233c_flash_WP_reg_write(0x0900+0x63*2+1, reg|0x08);
3705*53ee8cc1Swenshuai.xi 
3706*53ee8cc1Swenshuai.xi       // gpio11 output enable
3707*53ee8cc1Swenshuai.xi       bRet &= msb1233c_flash_WP_reg_read(0x0900+0x64*2+1, &reg);
3708*53ee8cc1Swenshuai.xi       bRet &= msb1233c_flash_WP_reg_write(0x0900+0x64*2+1, reg&(~0x08));
3709*53ee8cc1Swenshuai.xi 
3710*53ee8cc1Swenshuai.xi       u8_count = 20;
3711*53ee8cc1Swenshuai.xi       do
3712*53ee8cc1Swenshuai.xi       {
3713*53ee8cc1Swenshuai.xi         msb1233c_flash_SRSR(&reg);
3714*53ee8cc1Swenshuai.xi         usleep(1*1000);
3715*53ee8cc1Swenshuai.xi       }while(reg&0x01 && u8_count--);
3716*53ee8cc1Swenshuai.xi 
3717*53ee8cc1Swenshuai.xi       if (u8_count == 0)
3718*53ee8cc1Swenshuai.xi       {
3719*53ee8cc1Swenshuai.xi         bRet = false;
3720*53ee8cc1Swenshuai.xi         DBG_FLASH_WP(printf("[wb]Err, flash_SRSR timeout!!!\n");)
3721*53ee8cc1Swenshuai.xi         return bRet;
3722*53ee8cc1Swenshuai.xi       }
3723*53ee8cc1Swenshuai.xi 
3724*53ee8cc1Swenshuai.xi       msb1233c_flash_WRSR(reg&(~0x9c));
3725*53ee8cc1Swenshuai.xi 
3726*53ee8cc1Swenshuai.xi       u8_count = 20;
3727*53ee8cc1Swenshuai.xi       do
3728*53ee8cc1Swenshuai.xi       {
3729*53ee8cc1Swenshuai.xi         msb1233c_flash_SRSR(&reg);
3730*53ee8cc1Swenshuai.xi         usleep(1*1000);
3731*53ee8cc1Swenshuai.xi       }while(reg&0x01 && u8_count--);
3732*53ee8cc1Swenshuai.xi 
3733*53ee8cc1Swenshuai.xi       if (u8_count == 0)
3734*53ee8cc1Swenshuai.xi       {
3735*53ee8cc1Swenshuai.xi         bRet = false;
3736*53ee8cc1Swenshuai.xi         DBG_FLASH_WP(printf("[wb]Err, flash_SRSR timeout!!!\n");)
3737*53ee8cc1Swenshuai.xi         return bRet;
3738*53ee8cc1Swenshuai.xi       }
3739*53ee8cc1Swenshuai.xi     }
3740*53ee8cc1Swenshuai.xi 
3741*53ee8cc1Swenshuai.xi     return bRet;
3742*53ee8cc1Swenshuai.xi }
3743*53ee8cc1Swenshuai.xi #else
3744*53ee8cc1Swenshuai.xi {
3745*53ee8cc1Swenshuai.xi     MS_U8 reg = 0;
3746*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
3747*53ee8cc1Swenshuai.xi     MS_U8 u8_count = 0;
3748*53ee8cc1Swenshuai.xi 
3749*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
3750*53ee8cc1Swenshuai.xi     DBG_FLASH_WP(printf("[wb]msb124x_flash_WP_Enable=%d\n",enable);)
3751*53ee8cc1Swenshuai.xi     #endif
3752*53ee8cc1Swenshuai.xi 
3753*53ee8cc1Swenshuai.xi     if (enable == 1)
3754*53ee8cc1Swenshuai.xi     {
3755*53ee8cc1Swenshuai.xi         u8_count = 20;
3756*53ee8cc1Swenshuai.xi         do
3757*53ee8cc1Swenshuai.xi         {
3758*53ee8cc1Swenshuai.xi             _msbMSB124X_flash_SRSR(&reg);
3759*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(1*1000);
3760*53ee8cc1Swenshuai.xi         }while(reg&0x01 && u8_count--);
3761*53ee8cc1Swenshuai.xi 
3762*53ee8cc1Swenshuai.xi         if (u8_count == 0)
3763*53ee8cc1Swenshuai.xi         {
3764*53ee8cc1Swenshuai.xi             bRet = FALSE;
3765*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
3766*53ee8cc1Swenshuai.xi             DBG_FLASH_WP(printf("[wb]Err, flash_SRSR timeout!!!\n");)
3767*53ee8cc1Swenshuai.xi             #endif
3768*53ee8cc1Swenshuai.xi             return bRet;
3769*53ee8cc1Swenshuai.xi         }
3770*53ee8cc1Swenshuai.xi 
3771*53ee8cc1Swenshuai.xi         _msbMSB124X_flash_WRSR(reg|0x9c);
3772*53ee8cc1Swenshuai.xi         u8_count = 20;
3773*53ee8cc1Swenshuai.xi 
3774*53ee8cc1Swenshuai.xi         do
3775*53ee8cc1Swenshuai.xi         {
3776*53ee8cc1Swenshuai.xi             _msbMSB124X_flash_SRSR(&reg);
3777*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(1*1000);
3778*53ee8cc1Swenshuai.xi         }while(reg&0x01 && u8_count--);
3779*53ee8cc1Swenshuai.xi 
3780*53ee8cc1Swenshuai.xi         if (u8_count == 0)
3781*53ee8cc1Swenshuai.xi         {
3782*53ee8cc1Swenshuai.xi             bRet = FALSE;
3783*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
3784*53ee8cc1Swenshuai.xi             DBG_FLASH_WP(printf("[wb]Err, flash_SRSR timeout!!!\n");)
3785*53ee8cc1Swenshuai.xi             #endif
3786*53ee8cc1Swenshuai.xi             return bRet;
3787*53ee8cc1Swenshuai.xi         }
3788*53ee8cc1Swenshuai.xi 
3789*53ee8cc1Swenshuai.xi         // active low
3790*53ee8cc1Swenshuai.xi         // pull low
3791*53ee8cc1Swenshuai.xi         bRet &= _msb124x_flash_WP_reg_read(0x0A00+0x22*2, &reg);
3792*53ee8cc1Swenshuai.xi         bRet &= _msb124x_flash_WP_reg_write(0x0A00+0x22*2, reg&(~0x01));
3793*53ee8cc1Swenshuai.xi         // gpio11 output enable
3794*53ee8cc1Swenshuai.xi         bRet &= _msb124x_flash_WP_reg_read(0x0A00+0x22*2, &reg);
3795*53ee8cc1Swenshuai.xi         bRet &= _msb124x_flash_WP_reg_write(0x0A00+0x22*2, reg&(~0x02));
3796*53ee8cc1Swenshuai.xi     }
3797*53ee8cc1Swenshuai.xi     else
3798*53ee8cc1Swenshuai.xi     {
3799*53ee8cc1Swenshuai.xi         // unactive high
3800*53ee8cc1Swenshuai.xi         // pull high
3801*53ee8cc1Swenshuai.xi         bRet &= _msb124x_flash_WP_reg_read(0x0A00+0x22*2, &reg);
3802*53ee8cc1Swenshuai.xi         bRet &= _msb124x_flash_WP_reg_write(0x0A00+0x22*2, reg|0x01);
3803*53ee8cc1Swenshuai.xi         // gpio11 output enable
3804*53ee8cc1Swenshuai.xi         bRet &= _msb124x_flash_WP_reg_read(0x0A00+0x22*2, &reg);
3805*53ee8cc1Swenshuai.xi         bRet &= _msb124x_flash_WP_reg_write(0x0A00+0x22*2, reg&(~0x02));
3806*53ee8cc1Swenshuai.xi         u8_count = 20;
3807*53ee8cc1Swenshuai.xi 
3808*53ee8cc1Swenshuai.xi         do
3809*53ee8cc1Swenshuai.xi         {
3810*53ee8cc1Swenshuai.xi             _msbMSB124X_flash_SRSR(&reg);
3811*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(1*1000);
3812*53ee8cc1Swenshuai.xi         }while(reg&0x01 && u8_count--);
3813*53ee8cc1Swenshuai.xi 
3814*53ee8cc1Swenshuai.xi         if (u8_count == 0)
3815*53ee8cc1Swenshuai.xi         {
3816*53ee8cc1Swenshuai.xi             bRet = FALSE;
3817*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
3818*53ee8cc1Swenshuai.xi             DBG_FLASH_WP(printf("[wb]Err, flash_SRSR timeout!!!\n");)
3819*53ee8cc1Swenshuai.xi             #endif
3820*53ee8cc1Swenshuai.xi             return bRet;
3821*53ee8cc1Swenshuai.xi         }
3822*53ee8cc1Swenshuai.xi         _msbMSB124X_flash_WRSR(reg&(~0x9c));
3823*53ee8cc1Swenshuai.xi         u8_count = 20;
3824*53ee8cc1Swenshuai.xi 
3825*53ee8cc1Swenshuai.xi         do
3826*53ee8cc1Swenshuai.xi         {
3827*53ee8cc1Swenshuai.xi             _msbMSB124X_flash_SRSR(&reg);
3828*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(1*1000);
3829*53ee8cc1Swenshuai.xi         }while(reg&0x01 && u8_count--);
3830*53ee8cc1Swenshuai.xi 
3831*53ee8cc1Swenshuai.xi         if (u8_count == 0)
3832*53ee8cc1Swenshuai.xi         {
3833*53ee8cc1Swenshuai.xi             bRet = FALSE;
3834*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
3835*53ee8cc1Swenshuai.xi             DBG_FLASH_WP(printf("[wb]Err, flash_SRSR timeout!!!\n");)
3836*53ee8cc1Swenshuai.xi             #endif
3837*53ee8cc1Swenshuai.xi             return bRet;
3838*53ee8cc1Swenshuai.xi         }
3839*53ee8cc1Swenshuai.xi     }
3840*53ee8cc1Swenshuai.xi     return bRet;
3841*53ee8cc1Swenshuai.xi }
3842*53ee8cc1Swenshuai.xi #endif
3843*53ee8cc1Swenshuai.xi 
3844*53ee8cc1Swenshuai.xi MS_U16 _MSB124X_CHIP_MATCH_TABLE[] =
3845*53ee8cc1Swenshuai.xi {
3846*53ee8cc1Swenshuai.xi     //Kaiser, Kaiserin, Keltic, Kronus, Kappa
3847*53ee8cc1Swenshuai.xi     0x56,       0x41,     0x72,  0x2F,  0x75,
3848*53ee8cc1Swenshuai.xi };
3849*53ee8cc1Swenshuai.xi /*
3850*53ee8cc1Swenshuai.xi static MS_BOOL _msbMSB124X_set_bonding_option(MS_U16 u16ChipID)
3851*53ee8cc1Swenshuai.xi {
3852*53ee8cc1Swenshuai.xi     MS_BOOL  bRet = TRUE;
3853*53ee8cc1Swenshuai.xi     MS_U8    u8Idx;
3854*53ee8cc1Swenshuai.xi     MS_U8    u8MatchFlag  = 0;
3855*53ee8cc1Swenshuai.xi     MS_U8    u8Data  = 0;
3856*53ee8cc1Swenshuai.xi     MS_U32    u32_timeout = 0;
3857*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
3858*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
3859*53ee8cc1Swenshuai.xi     #endif
3860*53ee8cc1Swenshuai.xi 
3861*53ee8cc1Swenshuai.xi     printf("_msbMSB124X_set_bonding_option u16ChipID %x\n", u16ChipID);
3862*53ee8cc1Swenshuai.xi 
3863*53ee8cc1Swenshuai.xi     for (u8Idx = 0 ; u8Idx < sizeof( _MSB124X_CHIP_MATCH_TABLE) ; u8Idx++)
3864*53ee8cc1Swenshuai.xi     {
3865*53ee8cc1Swenshuai.xi         if(u16ChipID == _MSB124X_CHIP_MATCH_TABLE[u8Idx])
3866*53ee8cc1Swenshuai.xi         {
3867*53ee8cc1Swenshuai.xi             u8MatchFlag = 0x01;
3868*53ee8cc1Swenshuai.xi             break;
3869*53ee8cc1Swenshuai.xi         }
3870*53ee8cc1Swenshuai.xi         else
3871*53ee8cc1Swenshuai.xi         {
3872*53ee8cc1Swenshuai.xi             u8MatchFlag = 0x00;
3873*53ee8cc1Swenshuai.xi         }
3874*53ee8cc1Swenshuai.xi     }
3875*53ee8cc1Swenshuai.xi 
3876*53ee8cc1Swenshuai.xi     if (_MSB124X_I2C_CH_Reset(3) == FALSE)
3877*53ee8cc1Swenshuai.xi     {
3878*53ee8cc1Swenshuai.xi         printf(">>>MSB124X CH3 Reset:Fail\n");
3879*53ee8cc1Swenshuai.xi         return FALSE;
3880*53ee8cc1Swenshuai.xi     }
3881*53ee8cc1Swenshuai.xi 
3882*53ee8cc1Swenshuai.xi     // MSB124X : 0x0902[8]=0 , 0x0902[0]=0;
3883*53ee8cc1Swenshuai.xi     // MSB1235 : 0x0902[8]=1 , 0x0902[0]=1; (before overwrite, SDRAM not enable)
3884*53ee8cc1Swenshuai.xi     //                  0x0902[8]=1 , 0x0902[0]=0; (after overwrite, SDRAM enable)
3885*53ee8cc1Swenshuai.xi     // check bonding value, 0x0902[8]
3886*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB124X_GetReg(0x0900+(0x02)*2+1, &u8Data);
3887*53ee8cc1Swenshuai.xi     if((u8Data & 0x01) == 0x01) //for MSB1236C
3888*53ee8cc1Swenshuai.xi     {
3889*53ee8cc1Swenshuai.xi         if(u8MatchFlag == 0x01)
3890*53ee8cc1Swenshuai.xi         {
3891*53ee8cc1Swenshuai.xi             //check overwrite or not
3892*53ee8cc1Swenshuai.xi             //0x0902[0] : reg_bonding[0]
3893*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_GetReg(0x0900+(0x02)*2, &u8Data);
3894*53ee8cc1Swenshuai.xi             if((u8Data & 0x01) != 0x00)
3895*53ee8cc1Swenshuai.xi             {
3896*53ee8cc1Swenshuai.xi                 //0x0905[0] : reg_bond_ov_en[0] = 1
3897*53ee8cc1Swenshuai.xi                 //0x0905[8] : reg_bond_ov[0] = 0
3898*53ee8cc1Swenshuai.xi                 // set overwrite enable
3899*53ee8cc1Swenshuai.xi                 bRet &= _MDrv_DMD_MSB124X_SetReg(0x0900+(0x05)*2, 0x01);
3900*53ee8cc1Swenshuai.xi                 // set overwrite value
3901*53ee8cc1Swenshuai.xi                 bRet &= _MDrv_DMD_MSB124X_SetReg(0x0900+(0x05)*2+1, 0x00);
3902*53ee8cc1Swenshuai.xi             }
3903*53ee8cc1Swenshuai.xi 
3904*53ee8cc1Swenshuai.xi             do
3905*53ee8cc1Swenshuai.xi             {
3906*53ee8cc1Swenshuai.xi                 bRet &= _MDrv_DMD_MSB124X_GetReg(0x0900+(0x02)*2, &u8Data);
3907*53ee8cc1Swenshuai.xi                 if(u32_timeout++ > 500)
3908*53ee8cc1Swenshuai.xi                 {
3909*53ee8cc1Swenshuai.xi                     ERR_DEMOD_MSB(printf("@msb124x, Set bonding option failure.!!!\n"));
3910*53ee8cc1Swenshuai.xi                     return FALSE;
3911*53ee8cc1Swenshuai.xi                 }
3912*53ee8cc1Swenshuai.xi             }while((u8Data & 0x01) == 0x01);
3913*53ee8cc1Swenshuai.xi 
3914*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
3915*53ee8cc1Swenshuai.xi             printf("@ Set bonding option for MSB1236 \n");
3916*53ee8cc1Swenshuai.xi             #endif
3917*53ee8cc1Swenshuai.xi         }
3918*53ee8cc1Swenshuai.xi         else
3919*53ee8cc1Swenshuai.xi         {
3920*53ee8cc1Swenshuai.xi             return FALSE;
3921*53ee8cc1Swenshuai.xi         }
3922*53ee8cc1Swenshuai.xi     }
3923*53ee8cc1Swenshuai.xi     else  // for MSB124X
3924*53ee8cc1Swenshuai.xi     {
3925*53ee8cc1Swenshuai.xi         //check overwrite or not
3926*53ee8cc1Swenshuai.xi         //0x0902[0] : reg_bonding[0]
3927*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_GetReg(0x0900+(0x02)*2, &u8Data);
3928*53ee8cc1Swenshuai.xi         if((u8Data & 0x01) != 0x00)
3929*53ee8cc1Swenshuai.xi         {
3930*53ee8cc1Swenshuai.xi             //0x0905[0] : reg_bond_ov_en[0] = 1
3931*53ee8cc1Swenshuai.xi             //0x0905[8] : reg_bond_ov[0] = 0
3932*53ee8cc1Swenshuai.xi             // set overwrite enable
3933*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg(0x0900+(0x05)*2, 0x01);
3934*53ee8cc1Swenshuai.xi             // set overwrite value
3935*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_SetReg(0x0900+(0x05)*2+1, 0x00);
3936*53ee8cc1Swenshuai.xi         }
3937*53ee8cc1Swenshuai.xi 
3938*53ee8cc1Swenshuai.xi         do
3939*53ee8cc1Swenshuai.xi         {
3940*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB124X_GetReg(0x0900+(0x02)*2, &u8Data);
3941*53ee8cc1Swenshuai.xi             if(u32_timeout++ > 500)
3942*53ee8cc1Swenshuai.xi             {
3943*53ee8cc1Swenshuai.xi                 ERR_DEMOD_MSB(printf("@msbMSB124X, Set bonding option failure.!!!\n"));
3944*53ee8cc1Swenshuai.xi                 return FALSE;
3945*53ee8cc1Swenshuai.xi             }
3946*53ee8cc1Swenshuai.xi         }while((u8Data & 0x01) == 0x01);
3947*53ee8cc1Swenshuai.xi 
3948*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
3949*53ee8cc1Swenshuai.xi         printf("@ Set bonding option for MSB124X \n");
3950*53ee8cc1Swenshuai.xi         #endif
3951*53ee8cc1Swenshuai.xi     }
3952*53ee8cc1Swenshuai.xi 
3953*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
3954*53ee8cc1Swenshuai.xi     if (!bRet) printf("%s %d Error\n", __func__, __LINE__);
3955*53ee8cc1Swenshuai.xi     #endif
3956*53ee8cc1Swenshuai.xi     return bRet;
3957*53ee8cc1Swenshuai.xi }
3958*53ee8cc1Swenshuai.xi */
_IspCheckVer(MS_U8 * pLibData,MS_BOOL * pMatch)3959*53ee8cc1Swenshuai.xi static MS_BOOL _IspCheckVer(MS_U8* pLibData, MS_BOOL* pMatch)
3960*53ee8cc1Swenshuai.xi {
3961*53ee8cc1Swenshuai.xi     MS_U8  bReadData[VERSION_CODE_SIZE];
3962*53ee8cc1Swenshuai.xi     MS_U32  indx = 0;
3963*53ee8cc1Swenshuai.xi     *pMatch = true;
3964*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
3965*53ee8cc1Swenshuai.xi 
3966*53ee8cc1Swenshuai.xi     MS_U8 bWriteData[5] = {0x4D, 0x53, 0x54, 0x41, 0x52};
3967*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, bWriteData);
3968*53ee8cc1Swenshuai.xi 
3969*53ee8cc1Swenshuai.xi     MS_U8    bAddr[1], bError = true;
3970*53ee8cc1Swenshuai.xi     //MAPI_U16   Count;
3971*53ee8cc1Swenshuai.xi 
3972*53ee8cc1Swenshuai.xi     memset(bReadData, 0 , sizeof(bReadData));
3973*53ee8cc1Swenshuai.xi 
3974*53ee8cc1Swenshuai.xi     bAddr[0] = 0x10;
3975*53ee8cc1Swenshuai.xi     //dwStartAddr=0;
3976*53ee8cc1Swenshuai.xi 
3977*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x03;
3978*53ee8cc1Swenshuai.xi     bWriteData[1] = VERSION_CODE_ADDR >> 16;
3979*53ee8cc1Swenshuai.xi     bWriteData[2] = VERSION_CODE_ADDR >> 8;
3980*53ee8cc1Swenshuai.xi     bWriteData[3] = VERSION_CODE_ADDR & 0xFF;
3981*53ee8cc1Swenshuai.xi 
3982*53ee8cc1Swenshuai.xi     bError &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 4, bWriteData);
3983*53ee8cc1Swenshuai.xi 
3984*53ee8cc1Swenshuai.xi     bAddr[0] = 0x11;
3985*53ee8cc1Swenshuai.xi     bError &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_READ_BYTES, 1, bAddr, VERSION_CODE_SIZE, bReadData);
3986*53ee8cc1Swenshuai.xi 
3987*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x12;
3988*53ee8cc1Swenshuai.xi     bError &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1,  bWriteData);
3989*53ee8cc1Swenshuai.xi 
3990*53ee8cc1Swenshuai.xi     if(FALSE == bError)
3991*53ee8cc1Swenshuai.xi     {
3992*53ee8cc1Swenshuai.xi         bWriteData[0] = 0x24 ;
3993*53ee8cc1Swenshuai.xi         (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
3994*53ee8cc1Swenshuai.xi         return FALSE;
3995*53ee8cc1Swenshuai.xi     }
3996*53ee8cc1Swenshuai.xi 
3997*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x24 ;
3998*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
3999*53ee8cc1Swenshuai.xi 
4000*53ee8cc1Swenshuai.xi     printf("sttest version data = ");
4001*53ee8cc1Swenshuai.xi     for(indx = 0; indx < (VERSION_CODE_SIZE); indx++)
4002*53ee8cc1Swenshuai.xi     {
4003*53ee8cc1Swenshuai.xi         printf(" %x ,", bReadData[indx]);
4004*53ee8cc1Swenshuai.xi         if(pLibData[indx+VERSION_CODE_ADDR] != bReadData[indx])
4005*53ee8cc1Swenshuai.xi         {
4006*53ee8cc1Swenshuai.xi             *pMatch = FALSE;
4007*53ee8cc1Swenshuai.xi             //break;
4008*53ee8cc1Swenshuai.xi         }
4009*53ee8cc1Swenshuai.xi     }
4010*53ee8cc1Swenshuai.xi     printf(" \n");
4011*53ee8cc1Swenshuai.xi 
4012*53ee8cc1Swenshuai.xi     return TRUE;
4013*53ee8cc1Swenshuai.xi }
4014*53ee8cc1Swenshuai.xi 
_dram_crc_check(MS_U16 chksum_lib,MS_BOOL * pMatch)4015*53ee8cc1Swenshuai.xi static MS_BOOL _dram_crc_check(MS_U16 chksum_lib, MS_BOOL* pMatch)
4016*53ee8cc1Swenshuai.xi {
4017*53ee8cc1Swenshuai.xi     MS_U16  chksum = 0;
4018*53ee8cc1Swenshuai.xi     // MAPI_U16  chksum_lib = 0;
4019*53ee8cc1Swenshuai.xi     MS_U16  u16Addr = 0;
4020*53ee8cc1Swenshuai.xi     MS_U8   u8MsbData[5];
4021*53ee8cc1Swenshuai.xi     MS_U8   reg = 0;
4022*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
4023*53ee8cc1Swenshuai.xi     MS_U8   mcu_status = 0;
4024*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
4025*53ee8cc1Swenshuai.xi 
4026*53ee8cc1Swenshuai.xi     *pMatch = false;
4027*53ee8cc1Swenshuai.xi 
4028*53ee8cc1Swenshuai.xi     // MAPI_U8 bWriteData[5]={0x4D, 0x53, 0x54, 0x41, 0x52};
4029*53ee8cc1Swenshuai.xi     // iptr->WriteBytes(0, NULL, 5, bWriteData);
4030*53ee8cc1Swenshuai.xi 
4031*53ee8cc1Swenshuai.xi /// crc H byte
4032*53ee8cc1Swenshuai.xi     u16Addr = 0x0c00+0x0d*2+1;
4033*53ee8cc1Swenshuai.xi 
4034*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
4035*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
4036*53ee8cc1Swenshuai.xi     u8MsbData[2] = 0x00;
4037*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u16Addr >> 8) &0xff;
4038*53ee8cc1Swenshuai.xi     u8MsbData[4] = u16Addr &0xff;
4039*53ee8cc1Swenshuai.xi 
4040*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x35;
4041*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
4042*53ee8cc1Swenshuai.xi 
4043*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
4044*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8MsbData);
4045*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_READ_BYTES, 0, NULL, 1, &reg);
4046*53ee8cc1Swenshuai.xi 
4047*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x34;
4048*53ee8cc1Swenshuai.xi     bRet=(pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
4049*53ee8cc1Swenshuai.xi 
4050*53ee8cc1Swenshuai.xi 
4051*53ee8cc1Swenshuai.xi    chksum = reg;
4052*53ee8cc1Swenshuai.xi 
4053*53ee8cc1Swenshuai.xi /// crc L byte
4054*53ee8cc1Swenshuai.xi     u16Addr = 0x0c00+0x0d*2;
4055*53ee8cc1Swenshuai.xi 
4056*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
4057*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
4058*53ee8cc1Swenshuai.xi     u8MsbData[2] = 0x00;
4059*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u16Addr >> 8) &0xff;
4060*53ee8cc1Swenshuai.xi     u8MsbData[4] = u16Addr &0xff;
4061*53ee8cc1Swenshuai.xi 
4062*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x35;
4063*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
4064*53ee8cc1Swenshuai.xi 
4065*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
4066*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8MsbData);
4067*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_READ_BYTES, 0, NULL, 1, &reg);
4068*53ee8cc1Swenshuai.xi 
4069*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x34;
4070*53ee8cc1Swenshuai.xi     bRet=(pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
4071*53ee8cc1Swenshuai.xi 
4072*53ee8cc1Swenshuai.xi 
4073*53ee8cc1Swenshuai.xi    chksum = (chksum<<8)|reg;
4074*53ee8cc1Swenshuai.xi 
4075*53ee8cc1Swenshuai.xi // get mcu status
4076*53ee8cc1Swenshuai.xi 
4077*53ee8cc1Swenshuai.xi     u16Addr = 0x0900+0x4f*2;
4078*53ee8cc1Swenshuai.xi 
4079*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
4080*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
4081*53ee8cc1Swenshuai.xi     u8MsbData[2] = 0x00;
4082*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u16Addr >> 8) &0xff;
4083*53ee8cc1Swenshuai.xi     u8MsbData[4] = u16Addr &0xff;
4084*53ee8cc1Swenshuai.xi 
4085*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x35;
4086*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
4087*53ee8cc1Swenshuai.xi 
4088*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
4089*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8MsbData);
4090*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_READ_BYTES, 0, NULL, 1, &reg);
4091*53ee8cc1Swenshuai.xi 
4092*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x34;
4093*53ee8cc1Swenshuai.xi     bRet=(pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
4094*53ee8cc1Swenshuai.xi 
4095*53ee8cc1Swenshuai.xi 
4096*53ee8cc1Swenshuai.xi     mcu_status = reg;
4097*53ee8cc1Swenshuai.xi 
4098*53ee8cc1Swenshuai.xi 
4099*53ee8cc1Swenshuai.xi /// check the crc in dsp lib array
4100*53ee8cc1Swenshuai.xi 
4101*53ee8cc1Swenshuai.xi     if (mcu_status == 0xaa && ((chksum_lib&0xff00) == (chksum&0xff00)) )
4102*53ee8cc1Swenshuai.xi       *pMatch = true;
4103*53ee8cc1Swenshuai.xi     else if(chksum_lib == chksum)
4104*53ee8cc1Swenshuai.xi       *pMatch = true;
4105*53ee8cc1Swenshuai.xi 
4106*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
4107*53ee8cc1Swenshuai.xi     printf("[crc]chksum_lib=0x%x, chksum=0x%x, bRet=%d, Match=%d, mcu_status=0x%x\n",chksum_lib,chksum,bRet,*pMatch,mcu_status);
4108*53ee8cc1Swenshuai.xi     #endif
4109*53ee8cc1Swenshuai.xi 
4110*53ee8cc1Swenshuai.xi     return bRet;
4111*53ee8cc1Swenshuai.xi }
4112*53ee8cc1Swenshuai.xi 
_IspProcFlash(MS_U8 * pLibArry,MS_U32 dwLibSize)4113*53ee8cc1Swenshuai.xi static MS_BOOL _IspProcFlash(MS_U8* pLibArry, MS_U32 dwLibSize)
4114*53ee8cc1Swenshuai.xi {
4115*53ee8cc1Swenshuai.xi     MS_U32    dwLoop, dwTimeOut;
4116*53ee8cc1Swenshuai.xi     MS_U32    dwStartAddr, dwEndAddr;
4117*53ee8cc1Swenshuai.xi     //MAPI_U16    wLoop;
4118*53ee8cc1Swenshuai.xi     MS_U8     bError = false;//, bWriteData[PAGE_WRITE_SIZE];
4119*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
4120*53ee8cc1Swenshuai.xi 
4121*53ee8cc1Swenshuai.xi     MS_U8 bWriteData[5]={0x4D, 0x53, 0x54, 0x41, 0x52};
4122*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, bWriteData);
4123*53ee8cc1Swenshuai.xi 
4124*53ee8cc1Swenshuai.xi     dwStartAddr = (MS_U32) 0;
4125*53ee8cc1Swenshuai.xi     dwEndAddr = dwLibSize;
4126*53ee8cc1Swenshuai.xi 
4127*53ee8cc1Swenshuai.xi 
4128*53ee8cc1Swenshuai.xi     MS_U8     bAddr[1];
4129*53ee8cc1Swenshuai.xi     MS_U8     bReadData=0;
4130*53ee8cc1Swenshuai.xi     for(dwLoop=dwStartAddr; (dwLoop < dwEndAddr); dwLoop+=PAGE_WRITE_SIZE)
4131*53ee8cc1Swenshuai.xi     {
4132*53ee8cc1Swenshuai.xi 
4133*53ee8cc1Swenshuai.xi         dwTimeOut = 10000;
4134*53ee8cc1Swenshuai.xi 
4135*53ee8cc1Swenshuai.xi         while(dwTimeOut--)
4136*53ee8cc1Swenshuai.xi         {
4137*53ee8cc1Swenshuai.xi             bAddr[0] = 0x10;
4138*53ee8cc1Swenshuai.xi             bWriteData[0] = 0x05;
4139*53ee8cc1Swenshuai.xi             (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 1, bWriteData);
4140*53ee8cc1Swenshuai.xi 
4141*53ee8cc1Swenshuai.xi             bAddr[0] = 0x11;
4142*53ee8cc1Swenshuai.xi             (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_READ_BYTES, 1, bAddr, 1, &bReadData);
4143*53ee8cc1Swenshuai.xi 
4144*53ee8cc1Swenshuai.xi             bWriteData[0] = 0x12;
4145*53ee8cc1Swenshuai.xi             (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
4146*53ee8cc1Swenshuai.xi 
4147*53ee8cc1Swenshuai.xi             if (!(bReadData & 0x01))
4148*53ee8cc1Swenshuai.xi                 break;
4149*53ee8cc1Swenshuai.xi 
4150*53ee8cc1Swenshuai.xi             if(dwTimeOut==1)
4151*53ee8cc1Swenshuai.xi             {
4152*53ee8cc1Swenshuai.xi                 bError = 1;
4153*53ee8cc1Swenshuai.xi                 break;
4154*53ee8cc1Swenshuai.xi             }
4155*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(0);
4156*53ee8cc1Swenshuai.xi         }
4157*53ee8cc1Swenshuai.xi 
4158*53ee8cc1Swenshuai.xi         if(!bError)
4159*53ee8cc1Swenshuai.xi         {
4160*53ee8cc1Swenshuai.xi 
4161*53ee8cc1Swenshuai.xi             MS_U8    bAddr[5], bWriteData[1];
4162*53ee8cc1Swenshuai.xi             MS_BOOL bError = TRUE;
4163*53ee8cc1Swenshuai.xi 
4164*53ee8cc1Swenshuai.xi             bAddr[0] = 0x10;
4165*53ee8cc1Swenshuai.xi             bWriteData[0] = 0x06;
4166*53ee8cc1Swenshuai.xi             bError &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 1, bWriteData);
4167*53ee8cc1Swenshuai.xi 
4168*53ee8cc1Swenshuai.xi             bWriteData[0] = 0x12;
4169*53ee8cc1Swenshuai.xi             bError &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
4170*53ee8cc1Swenshuai.xi 
4171*53ee8cc1Swenshuai.xi             // Page Program
4172*53ee8cc1Swenshuai.xi             bAddr[0] = 0x10;
4173*53ee8cc1Swenshuai.xi             bAddr[1] = 0x02;
4174*53ee8cc1Swenshuai.xi             bAddr[2] = dwLoop >> 16;
4175*53ee8cc1Swenshuai.xi             bAddr[3] = dwLoop >> 8;
4176*53ee8cc1Swenshuai.xi             bAddr[4] = dwLoop;
4177*53ee8cc1Swenshuai.xi 
4178*53ee8cc1Swenshuai.xi             bError &= (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 5, bAddr, PAGE_WRITE_SIZE, (pLibArry+dwLoop));
4179*53ee8cc1Swenshuai.xi 
4180*53ee8cc1Swenshuai.xi             bWriteData[0] = 0x12;
4181*53ee8cc1Swenshuai.xi             bError &=  (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
4182*53ee8cc1Swenshuai.xi 
4183*53ee8cc1Swenshuai.xi             bAddr[0] = 0x10;
4184*53ee8cc1Swenshuai.xi             bWriteData[0] = 0x04;
4185*53ee8cc1Swenshuai.xi             bError &=  (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 1, bWriteData);
4186*53ee8cc1Swenshuai.xi 
4187*53ee8cc1Swenshuai.xi             bWriteData[0] = 0x12;
4188*53ee8cc1Swenshuai.xi                 bError &=  (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
4189*53ee8cc1Swenshuai.xi 
4190*53ee8cc1Swenshuai.xi             if(bError == FALSE)
4191*53ee8cc1Swenshuai.xi             {
4192*53ee8cc1Swenshuai.xi                 break;
4193*53ee8cc1Swenshuai.xi             }
4194*53ee8cc1Swenshuai.xi         }
4195*53ee8cc1Swenshuai.xi     }
4196*53ee8cc1Swenshuai.xi 
4197*53ee8cc1Swenshuai.xi     bWriteData[0]=0x24 ;
4198*53ee8cc1Swenshuai.xi     (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
4199*53ee8cc1Swenshuai.xi 
4200*53ee8cc1Swenshuai.xi     if(bError==FALSE)
4201*53ee8cc1Swenshuai.xi         return TRUE;
4202*53ee8cc1Swenshuai.xi     else
4203*53ee8cc1Swenshuai.xi         return FALSE;
4204*53ee8cc1Swenshuai.xi 
4205*53ee8cc1Swenshuai.xi }
4206*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_SetCurrentDemodulatorType(eDMD_MSB124X_DemodulatorType eCurrentDemodulatorType)4207*53ee8cc1Swenshuai.xi void MDrv_DMD_MSB124X_SetCurrentDemodulatorType(eDMD_MSB124X_DemodulatorType eCurrentDemodulatorType)
4208*53ee8cc1Swenshuai.xi {
4209*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
4210*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
4211*53ee8cc1Swenshuai.xi     printf("MDrv_DMD_MSB124X_SetCurrentDemodulatorType %d\n", eCurrentDemodulatorType);
4212*53ee8cc1Swenshuai.xi     #endif
4213*53ee8cc1Swenshuai.xi     pDemod->eDMD_MSB124X_CurrentDemodulatorType = eCurrentDemodulatorType;
4214*53ee8cc1Swenshuai.xi }
4215*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_LoadDSPCode(void)4216*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_LoadDSPCode(void)
4217*53ee8cc1Swenshuai.xi {
4218*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
4219*53ee8cc1Swenshuai.xi     DMD_LOCK();
4220*53ee8cc1Swenshuai.xi     bRet = _LoadDSPCode();
4221*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
4222*53ee8cc1Swenshuai.xi     return bRet;
4223*53ee8cc1Swenshuai.xi }
4224*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_DTV_DVBT_DSPReg_CRC(void)4225*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_DTV_DVBT_DSPReg_CRC(void)
4226*53ee8cc1Swenshuai.xi {
4227*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
4228*53ee8cc1Swenshuai.xi     DMD_LOCK();
4229*53ee8cc1Swenshuai.xi     bRet = _DTV_DVBT_DSPReg_CRC();
4230*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
4231*53ee8cc1Swenshuai.xi     return bRet;
4232*53ee8cc1Swenshuai.xi }
4233*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB1245_LoadDSPCodeToSram(void)4234*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB1245_LoadDSPCodeToSram(void)
4235*53ee8cc1Swenshuai.xi {
4236*53ee8cc1Swenshuai.xi     MS_BOOL bRet=true;
4237*53ee8cc1Swenshuai.xi     MS_U16 u16dat_size;
4238*53ee8cc1Swenshuai.xi     MS_U16 u16Address;
4239*53ee8cc1Swenshuai.xi     MS_U8 u8Data;
4240*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
4241*53ee8cc1Swenshuai.xi 
4242*53ee8cc1Swenshuai.xi     DMD_LOCK();
4243*53ee8cc1Swenshuai.xi 
4244*53ee8cc1Swenshuai.xi     if (pDemod->_sDMD_MSB124X_InitData.bPreloadDSPCodeFromMainCHIPI2C)
4245*53ee8cc1Swenshuai.xi     {
4246*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
4247*53ee8cc1Swenshuai.xi         return TRUE;
4248*53ee8cc1Swenshuai.xi     }
4249*53ee8cc1Swenshuai.xi 
4250*53ee8cc1Swenshuai.xi     //change I2C channel
4251*53ee8cc1Swenshuai.xi     bRet &=_MSB124X_I2C_CH_Reset(3);
4252*53ee8cc1Swenshuai.xi     if (bRet==FALSE)
4253*53ee8cc1Swenshuai.xi     {
4254*53ee8cc1Swenshuai.xi             PRINTE(("utopia MSB1245 i2c change fail!!!\n"));
4255*53ee8cc1Swenshuai.xi     }
4256*53ee8cc1Swenshuai.xi     else
4257*53ee8cc1Swenshuai.xi     {
4258*53ee8cc1Swenshuai.xi             PRINTE(("utopia MSB1245 i2c change success!!!\n"));
4259*53ee8cc1Swenshuai.xi     }
4260*53ee8cc1Swenshuai.xi 
4261*53ee8cc1Swenshuai.xi 
4262*53ee8cc1Swenshuai.xi     //HW version Check
4263*53ee8cc1Swenshuai.xi     u16Address=0x0900;
4264*53ee8cc1Swenshuai.xi     bRet &=_MDrv_DMD_MSB124X_GetReg(u16Address, &u8Data);
4265*53ee8cc1Swenshuai.xi     if (bRet==FALSE)
4266*53ee8cc1Swenshuai.xi     {
4267*53ee8cc1Swenshuai.xi         PRINTE(("utopia MSB1245 i2c read reg fail!!!\n"));
4268*53ee8cc1Swenshuai.xi     }
4269*53ee8cc1Swenshuai.xi     else
4270*53ee8cc1Swenshuai.xi     {
4271*53ee8cc1Swenshuai.xi         PRINTE(("utopia MSB1245 HW version: 0x%x=0x%x\n", u16Address, u8Data));
4272*53ee8cc1Swenshuai.xi     }
4273*53ee8cc1Swenshuai.xi 
4274*53ee8cc1Swenshuai.xi     u16dat_size=sizeof(MSB1245_LIB);
4275*53ee8cc1Swenshuai.xi     if (pDemod->_sDMD_MSB124X_InitData.bEnableSPILoadCode)
4276*53ee8cc1Swenshuai.xi     {
4277*53ee8cc1Swenshuai.xi         //SPI load code
4278*53ee8cc1Swenshuai.xi         (pDemod->_sDMD_MSB124X_InitData.fpMSB124x_SPIPAD_En)(TRUE);
4279*53ee8cc1Swenshuai.xi         // ------enable to use TS_PAD as SSPI_PAD
4280*53ee8cc1Swenshuai.xi         // [0:0] reg_en_sspi_pad
4281*53ee8cc1Swenshuai.xi         // [1:1] reg_ts_sspi_en, 1: use TS_PAD as SSPI_PAD
4282*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900 + (0x3b) * 2, 0x0002);
4283*53ee8cc1Swenshuai.xi         //Turn off all pad in
4284*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900 + (0x28) * 2, 0x0000);
4285*53ee8cc1Swenshuai.xi         //Transport Stream pad on
4286*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900 + (0x2d) * 2, 0x00ff);
4287*53ee8cc1Swenshuai.xi         // ------- MSPI protocol setting
4288*53ee8cc1Swenshuai.xi         // [8] cpha
4289*53ee8cc1Swenshuai.xi         // [9] cpol
4290*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB124X_GetReg(0x0900+(0x3a)*2+1,&u8Data);
4291*53ee8cc1Swenshuai.xi         u8Data &= 0xFC;
4292*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB124X_SetReg(0x0900+(0x3a)*2+1, u8Data);
4293*53ee8cc1Swenshuai.xi 
4294*53ee8cc1Swenshuai.xi 	   // -------------------------------------------------------------------
4295*53ee8cc1Swenshuai.xi        // Initialize DMD_ANA_MISC
4296*53ee8cc1Swenshuai.xi        // -------------------------------------------------------------------
4297*53ee8cc1Swenshuai.xi        // [0]  reg_tst_ldo25i
4298*53ee8cc1Swenshuai.xi        // [1]  reg_tst_ldo25q
4299*53ee8cc1Swenshuai.xi        // [5:4]    reg_tst_ldo25i_selfb
4300*53ee8cc1Swenshuai.xi        // [7:6]    reg_tst_ldo25q_selfb
4301*53ee8cc1Swenshuai.xi        // [8]  reg_pd_dm2p5ldoi = 1'b0
4302*53ee8cc1Swenshuai.xi        // [9]  reg_pd_dm2p5ldoq = 1'b0
4303*53ee8cc1Swenshuai.xi        bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x4f)*2, 0x0000);
4304*53ee8cc1Swenshuai.xi 
4305*53ee8cc1Swenshuai.xi        // [0]  reg_tst_ldo11_clk
4306*53ee8cc1Swenshuai.xi        // [1]  reg_tst_ldo26
4307*53ee8cc1Swenshuai.xi        // [2]  reg_tst_ldo11_cmp
4308*53ee8cc1Swenshuai.xi        // [3]  reg_pd_dm1p1ldo_clk = 1'b0
4309*53ee8cc1Swenshuai.xi        // [4]  reg_pd_dm1p1ldo_cmp = 1'b0
4310*53ee8cc1Swenshuai.xi        // [6]  reg_tst_ldo26_selfb
4311*53ee8cc1Swenshuai.xi        // [7]  reg_pd_dm2p6ldo = 1'b0
4312*53ee8cc1Swenshuai.xi        // [9:8]    reg_tst_ldo11_cmp_selfb
4313*53ee8cc1Swenshuai.xi        // [11:10]  reg_tst_ldo11_clk_selfb
4314*53ee8cc1Swenshuai.xi        bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x4e)*2, 0x0000);
4315*53ee8cc1Swenshuai.xi 
4316*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
4317*53ee8cc1Swenshuai.xi        // [15:8]   reg_mpll_loop_div_second      feedback divider, div by binary data number
4318*53ee8cc1Swenshuai.xi        bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x33)*2, 0x1201);
4319*53ee8cc1Swenshuai.xi 
4320*53ee8cc1Swenshuai.xi        // [2:0]    reg_mpll_ictrl          charge pump current control
4321*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)
4322*53ee8cc1Swenshuai.xi        // [4]  reg_mpll_xtal2adc_sel       select the XTAL clock bypass to MPLL_ADC_CLK
4323*53ee8cc1Swenshuai.xi        // [5]  reg_mpll_xtal2next_pll_sel  crystal clock bypass to next PLL select
4324*53ee8cc1Swenshuai.xi        // [6]  reg_mpll_vco_offset     set VCO initial offset frequency
4325*53ee8cc1Swenshuai.xi        // [7]  reg_mpll_pd         gated reference clock and power down PLL analog_3v: 1=power down
4326*53ee8cc1Swenshuai.xi        // [8]  reg_xtal_en         XTAL enable register; 1: enable
4327*53ee8cc1Swenshuai.xi        // [10:9]   reg_xtal_sel            XTAL driven strength select.
4328*53ee8cc1Swenshuai.xi        // [11]     reg_mpll_porst          MPLL input  power on reset, connect to reg as MPLL_RESET
4329*53ee8cc1Swenshuai.xi        // [12]     reg_mpll_reset          PLL software reset; 1:reset
4330*53ee8cc1Swenshuai.xi        // [13]     reg_pd_dmpll_clk        XTAL to MPLL clock reference power down
4331*53ee8cc1Swenshuai.xi        // [14]     reg_pd_3p3_1            XTAL to CLK_24M_3P3_1 power down
4332*53ee8cc1Swenshuai.xi        // [15]     reg_pd_3p3_2            XTAL to CLK_24M_3P3_2 power down
4333*53ee8cc1Swenshuai.xi        bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x35)*2, 0x1803);
4334*53ee8cc1Swenshuai.xi        bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x35)*2, 0x0003);
4335*53ee8cc1Swenshuai.xi 
4336*53ee8cc1Swenshuai.xi        // [0]  reg_mpll_clk_dp_pd  dummy
4337*53ee8cc1Swenshuai.xi        // [1]  reg_adc_clk_pd      ADC output clock power down
4338*53ee8cc1Swenshuai.xi        // [2]  reg_mpll_div2_pd    MPLL_DIV2 power down
4339*53ee8cc1Swenshuai.xi        // [3]  reg_mpll_div3_pd    MPLL_DIV3 power down
4340*53ee8cc1Swenshuai.xi        // [4]  reg_mpll_div4_pd    MPLL_DIV4 power down
4341*53ee8cc1Swenshuai.xi        // [5]  reg_mpll_div8_pd    MPLL_DIV8 power down
4342*53ee8cc1Swenshuai.xi        // [6]  reg_mpll_div10_pd   MPLL_DIV10 power down
4343*53ee8cc1Swenshuai.xi        // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h30, 2'b11, 16'h2400);  // divide ADC clock to 24Mhz = 24*36/36
4344*53ee8cc1Swenshuai.xi        bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0A00+(0x30)*2, 0x0800);
4345*53ee8cc1Swenshuai.xi 
4346*53ee8cc1Swenshuai.xi        //set MCU CLK to 108MHz
4347*53ee8cc1Swenshuai.xi        bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x0b)*2, 0x0020);
4348*53ee8cc1Swenshuai.xi        bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900+(0x0b)*2, 0x0000);
4349*53ee8cc1Swenshuai.xi 
4350*53ee8cc1Swenshuai.xi         bRet &=_Load2Sram(MSB1245_LIB, u16dat_size,0);
4351*53ee8cc1Swenshuai.xi 
4352*53ee8cc1Swenshuai.xi 
4353*53ee8cc1Swenshuai.xi         // ------disable to use TS_PAD as SSPI_PAD after load code
4354*53ee8cc1Swenshuai.xi         // [0:0] reg_en_sspi_pad
4355*53ee8cc1Swenshuai.xi         // [1:1] reg_ts_sspi_en, 1: use TS_PAD as SSPI_PAD
4356*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900 + (0x3b) * 2, 0x0001);
4357*53ee8cc1Swenshuai.xi         //Transport Stream pad off
4358*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB124X_SetReg2Bytes(0x0900 + (0x2d) * 2, 0x0000);
4359*53ee8cc1Swenshuai.xi         (pDemod->_sDMD_MSB124X_InitData.fpMSB124x_SPIPAD_En)(FALSE);
4360*53ee8cc1Swenshuai.xi 
4361*53ee8cc1Swenshuai.xi          //  Set Inst map for Program SRAM
4362*53ee8cc1Swenshuai.xi         //set lower bound "SRAM_A_START_ADDR"
4363*53ee8cc1Swenshuai.xi          bRet &= _MDrv_DMD_MSB124X_SetReg(0x1004, 0x00);
4364*53ee8cc1Swenshuai.xi          bRet &= _MDrv_DMD_MSB124X_SetReg(0x1005, 0x00);
4365*53ee8cc1Swenshuai.xi          bRet &= _MDrv_DMD_MSB124X_SetReg(0x1000, 0x00);
4366*53ee8cc1Swenshuai.xi         //set upper bound "SRAM_A_END_ADDR"
4367*53ee8cc1Swenshuai.xi          bRet &= _MDrv_DMD_MSB124X_SetReg(0x1006, 0x7F);
4368*53ee8cc1Swenshuai.xi          bRet &= _MDrv_DMD_MSB124X_SetReg(0x1007, 0xFF);
4369*53ee8cc1Swenshuai.xi          bRet &= _MDrv_DMD_MSB124X_SetReg(0x1002, 0x00);
4370*53ee8cc1Swenshuai.xi          // Enable Program SRAM
4371*53ee8cc1Swenshuai.xi          bRet &= _MDrv_DMD_MSB124X_SetReg(0x1018, 0x01);
4372*53ee8cc1Swenshuai.xi 
4373*53ee8cc1Swenshuai.xi          //  End MCU reset
4374*53ee8cc1Swenshuai.xi          bRet &= _MDrv_DMD_MSB124X_SetReg(0x0b32, 0x00);
4375*53ee8cc1Swenshuai.xi 
4376*53ee8cc1Swenshuai.xi         if (bRet==FALSE)
4377*53ee8cc1Swenshuai.xi         {
4378*53ee8cc1Swenshuai.xi             PRINTE(("utopia MSB1245 SPI Load FW fail!!!\n"));
4379*53ee8cc1Swenshuai.xi         }
4380*53ee8cc1Swenshuai.xi         else
4381*53ee8cc1Swenshuai.xi         {
4382*53ee8cc1Swenshuai.xi             PRINTE(("utopia MSB1245 SPI Load FW success!!!\n"));
4383*53ee8cc1Swenshuai.xi         }
4384*53ee8cc1Swenshuai.xi 
4385*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
4386*53ee8cc1Swenshuai.xi         return TRUE;
4387*53ee8cc1Swenshuai.xi     }
4388*53ee8cc1Swenshuai.xi     else
4389*53ee8cc1Swenshuai.xi     {
4390*53ee8cc1Swenshuai.xi         //I2C load code
4391*53ee8cc1Swenshuai.xi         bRet &=_Load2Sram(MSB1245_LIB, u16dat_size,0);
4392*53ee8cc1Swenshuai.xi         if (bRet==FALSE)
4393*53ee8cc1Swenshuai.xi         {
4394*53ee8cc1Swenshuai.xi             PRINTE(("utopia MSB1245 I2C Load FW fail!!!\n"));
4395*53ee8cc1Swenshuai.xi         }
4396*53ee8cc1Swenshuai.xi         else
4397*53ee8cc1Swenshuai.xi         {
4398*53ee8cc1Swenshuai.xi             PRINTE(("utopia MSB1245 I2C Load FW success!!!\n"));
4399*53ee8cc1Swenshuai.xi         }
4400*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
4401*53ee8cc1Swenshuai.xi         return TRUE;
4402*53ee8cc1Swenshuai.xi     }
4403*53ee8cc1Swenshuai.xi 
4404*53ee8cc1Swenshuai.xi }
4405*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_Power_On(void)4406*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_Power_On(void)
4407*53ee8cc1Swenshuai.xi {
4408*53ee8cc1Swenshuai.xi     MS_U8     status = TRUE;
4409*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
4410*53ee8cc1Swenshuai.xi 
4411*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
4412*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
4413*53ee8cc1Swenshuai.xi     #endif
4414*53ee8cc1Swenshuai.xi /*
4415*53ee8cc1Swenshuai.xi          printf("ppp used \n");
4416*53ee8cc1Swenshuai.xi    if ( _msbMSB124X_set_bonding_option( MDrv_SYS_GetChipID() ) == FALSE )
4417*53ee8cc1Swenshuai.xi     {
4418*53ee8cc1Swenshuai.xi     printf("hhhhh-\n");
4419*53ee8cc1Swenshuai.xi   //      return TRUE;
4420*53ee8cc1Swenshuai.xi     }
4421*53ee8cc1Swenshuai.xi    printf("hihi \n");
4422*53ee8cc1Swenshuai.xi */
4423*53ee8cc1Swenshuai.xi     status &= _MSB124X_I2C_CH_Reset(3);
4424*53ee8cc1Swenshuai.xi     status &= _MSB124X_HW_init();
4425*53ee8cc1Swenshuai.xi 
4426*53ee8cc1Swenshuai.xi     if(pDemod->_sDMD_MSB124X_InitData.u8WO_Sdram==0)//with sdram on board
4427*53ee8cc1Swenshuai.xi     {
4428*53ee8cc1Swenshuai.xi         status &= _LoadDspCodeToSDRAM(MSB124X_ALL);//need boot code into sdram
4429*53ee8cc1Swenshuai.xi     }
4430*53ee8cc1Swenshuai.xi 
4431*53ee8cc1Swenshuai.xi     if (_LoadDSPCode() == FALSE)
4432*53ee8cc1Swenshuai.xi     {
4433*53ee8cc1Swenshuai.xi         printf(">>>>MSB124X:Fail\n");
4434*53ee8cc1Swenshuai.xi         status= FALSE;
4435*53ee8cc1Swenshuai.xi     }
4436*53ee8cc1Swenshuai.xi     return TRUE;
4437*53ee8cc1Swenshuai.xi }
4438*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_Power_On_Initialization(void)4439*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_Power_On_Initialization(void)
4440*53ee8cc1Swenshuai.xi {
4441*53ee8cc1Swenshuai.xi     MS_U8     status = TRUE;
4442*53ee8cc1Swenshuai.xi     MS_BOOL   bMatch = false;
4443*53ee8cc1Swenshuai.xi     MS_U8     u8RetryCnt = 6;
4444*53ee8cc1Swenshuai.xi     tMSB124XData *pDemod = DEMOD_GET_ACTIVE_NODE();
4445*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
4446*53ee8cc1Swenshuai.xi     MS_U32 u32tmm_1, u32tmm_2, u32tmm_3, u32tmm_4, u32tmm_5, u32tmm_6 = 0x00;
4447*53ee8cc1Swenshuai.xi     DBG_DEMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
4448*53ee8cc1Swenshuai.xi     #endif
4449*53ee8cc1Swenshuai.xi 
4450*53ee8cc1Swenshuai.xi     DMD_LOCK();
4451*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
4452*53ee8cc1Swenshuai.xi     u32tmm_1 = MsOS_GetSystemTime();
4453*53ee8cc1Swenshuai.xi     #endif
4454*53ee8cc1Swenshuai.xi 
4455*53ee8cc1Swenshuai.xi     if (pDemod->_sDMD_MSB124X_InitData.bPreloadDSPCodeFromMainCHIPI2C)
4456*53ee8cc1Swenshuai.xi     {
4457*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
4458*53ee8cc1Swenshuai.xi         return TRUE;
4459*53ee8cc1Swenshuai.xi     }
4460*53ee8cc1Swenshuai.xi 
4461*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
4462*53ee8cc1Swenshuai.xi     if (eDMD_MSB124X_DbgLevel >= E_DMD_MSB124X_DBGLV_DEBUG)
4463*53ee8cc1Swenshuai.xi     {
4464*53ee8cc1Swenshuai.xi         printf(">>>MSB124X: Enter Power_On_Initialization()\n");
4465*53ee8cc1Swenshuai.xi     }
4466*53ee8cc1Swenshuai.xi     #endif
4467*53ee8cc1Swenshuai.xi 
4468*53ee8cc1Swenshuai.xi     //if ( _msbMSB124X_set_bonding_option( MDrv_SYS_GetChipID() ) == FALSE )
4469*53ee8cc1Swenshuai.xi     //{
4470*53ee8cc1Swenshuai.xi     //    DMD_UNLOCK();
4471*53ee8cc1Swenshuai.xi     //    return TRUE;
4472*53ee8cc1Swenshuai.xi     //}
4473*53ee8cc1Swenshuai.xi 
4474*53ee8cc1Swenshuai.xi     if (pDemod->bDMD_MSB124X_Power_init_en == TRUE)
4475*53ee8cc1Swenshuai.xi     {
4476*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
4477*53ee8cc1Swenshuai.xi         return  TRUE;
4478*53ee8cc1Swenshuai.xi     }
4479*53ee8cc1Swenshuai.xi     else
4480*53ee8cc1Swenshuai.xi     {
4481*53ee8cc1Swenshuai.xi         pDemod->bDMD_MSB124X_Power_init_en = (pDemod->u8DMD_MSB124X_PowerOnInitialization_Flow == 2) ? (TRUE) : (FALSE);
4482*53ee8cc1Swenshuai.xi     }
4483*53ee8cc1Swenshuai.xi 
4484*53ee8cc1Swenshuai.xi     if(pDemod->_sDMD_MSB124X_InitData.u8WO_SPI_Flash== 1)
4485*53ee8cc1Swenshuai.xi     {
4486*53ee8cc1Swenshuai.xi         if (pDemod->_sDMD_MSB124X_InitData.bPreloadDSPCodeFromMainCHIPI2C)
4487*53ee8cc1Swenshuai.xi         {
4488*53ee8cc1Swenshuai.xi 
4489*53ee8cc1Swenshuai.xi         }
4490*53ee8cc1Swenshuai.xi         else
4491*53ee8cc1Swenshuai.xi         {
4492*53ee8cc1Swenshuai.xi             status &= _MSB124X_I2C_CH_Reset(3);
4493*53ee8cc1Swenshuai.xi             status &= _MSB124X_HW_init();
4494*53ee8cc1Swenshuai.xi             if(pDemod->_sDMD_MSB124X_InitData.u8WO_Sdram==0)//with sdram on board
4495*53ee8cc1Swenshuai.xi             {
4496*53ee8cc1Swenshuai.xi             status &= _LoadDspCodeToSDRAM(MSB124X_ALL);
4497*53ee8cc1Swenshuai.xi       }
4498*53ee8cc1Swenshuai.xi 
4499*53ee8cc1Swenshuai.xi             if (_LoadDSPCode() == FALSE)
4500*53ee8cc1Swenshuai.xi             {
4501*53ee8cc1Swenshuai.xi                 printf(">>>>MSB124X:Fail\n");
4502*53ee8cc1Swenshuai.xi                 status= FALSE;
4503*53ee8cc1Swenshuai.xi             }
4504*53ee8cc1Swenshuai.xi         }
4505*53ee8cc1Swenshuai.xi     }
4506*53ee8cc1Swenshuai.xi     else
4507*53ee8cc1Swenshuai.xi     {
4508*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
4509*53ee8cc1Swenshuai.xi         if (eDMD_MSB124X_DbgLevel >= E_DMD_MSB124X_DBGLV_DEBUG)
4510*53ee8cc1Swenshuai.xi         {
4511*53ee8cc1Swenshuai.xi             printf("u8DMD_MSB124X_PowerOnInitialization_Flow = %d\n", u8DMD_MSB124X_PowerOnInitialization_Flow);
4512*53ee8cc1Swenshuai.xi         }
4513*53ee8cc1Swenshuai.xi         #endif
4514*53ee8cc1Swenshuai.xi         if(pDemod->u8DMD_MSB124X_PowerOnInitialization_Flow ==0)
4515*53ee8cc1Swenshuai.xi         {
4516*53ee8cc1Swenshuai.xi                 status = _msb124x_flash_mode_en();
4517*53ee8cc1Swenshuai.xi                 if (status == FALSE)
4518*53ee8cc1Swenshuai.xi                 {
4519*53ee8cc1Swenshuai.xi                     printf("[msb124x][error]msb124x_flash_mode_en fail....\n");
4520*53ee8cc1Swenshuai.xi                 }
4521*53ee8cc1Swenshuai.xi                 pDemod->u8DMD_MSB124X_PowerOnInitialization_Flow++;
4522*53ee8cc1Swenshuai.xi         }
4523*53ee8cc1Swenshuai.xi         else
4524*53ee8cc1Swenshuai.xi         {
4525*53ee8cc1Swenshuai.xi             if(pDemod->u8DMD_MSB124X_PowerOnInitialization_Flow<2)
4526*53ee8cc1Swenshuai.xi             {
4527*53ee8cc1Swenshuai.xi                 pDemod->u8DMD_MSB124X_PowerOnInitialization_Flow++;
4528*53ee8cc1Swenshuai.xi             }
4529*53ee8cc1Swenshuai.xi 
4530*53ee8cc1Swenshuai.xi             MS_U8     u8DoneFlag = 0;
4531*53ee8cc1Swenshuai.xi             MS_U16    u16_counter = 0;
4532*53ee8cc1Swenshuai.xi 
4533*53ee8cc1Swenshuai.xi             MS_U16    crc16 = 0;
4534*53ee8cc1Swenshuai.xi 
4535*53ee8cc1Swenshuai.xi             crc16 = MSB124X_LIB[sizeof(MSB124X_LIB)-2];
4536*53ee8cc1Swenshuai.xi             crc16 = (crc16<<8)|MSB124X_LIB[sizeof(MSB124X_LIB)-1];
4537*53ee8cc1Swenshuai.xi 
4538*53ee8cc1Swenshuai.xi             do
4539*53ee8cc1Swenshuai.xi             {
4540*53ee8cc1Swenshuai.xi                 printf(">>>MSB124X: u8RetryCnt = %d\n",u8RetryCnt);
4541*53ee8cc1Swenshuai.xi 
4542*53ee8cc1Swenshuai.xi                 MS_U8 flash_waiting_ready_timeout = 0;
4543*53ee8cc1Swenshuai.xi                 u8RetryCnt--;
4544*53ee8cc1Swenshuai.xi 
4545*53ee8cc1Swenshuai.xi                 #ifdef MS_DEBUG
4546*53ee8cc1Swenshuai.xi                 u32tmm_3 = MsOS_GetSystemTime();
4547*53ee8cc1Swenshuai.xi                 #endif
4548*53ee8cc1Swenshuai.xi 
4549*53ee8cc1Swenshuai.xi                 status = _msb124x_flash_boot_ready_waiting(&flash_waiting_ready_timeout);
4550*53ee8cc1Swenshuai.xi                 if ( (flash_waiting_ready_timeout == 1) || (status == FALSE) )
4551*53ee8cc1Swenshuai.xi                 {
4552*53ee8cc1Swenshuai.xi                     printf("[msb124x][error]msb124x_flash_boot_ready_waiting fail....\n");
4553*53ee8cc1Swenshuai.xi                 }
4554*53ee8cc1Swenshuai.xi 
4555*53ee8cc1Swenshuai.xi                 #ifdef MS_DEBUG
4556*53ee8cc1Swenshuai.xi                 u32tmm_4 = MsOS_GetSystemTime();
4557*53ee8cc1Swenshuai.xi                 printf("[tmm1]t4-t3 = %ld (%ld - %ld)\n",u32tmm_4-u32tmm_3,u32tmm_4,u32tmm_3);
4558*53ee8cc1Swenshuai.xi                 #endif
4559*53ee8cc1Swenshuai.xi 
4560*53ee8cc1Swenshuai.xi                 if(status == FALSE)
4561*53ee8cc1Swenshuai.xi                 {
4562*53ee8cc1Swenshuai.xi                     if (pDemod->_sDMD_MSB124X_InitData.fpGPIOReset != NULL)
4563*53ee8cc1Swenshuai.xi                     {
4564*53ee8cc1Swenshuai.xi                         #ifdef MS_DEBUG
4565*53ee8cc1Swenshuai.xi                         printf(">>>MSB124X: Reset Demodulator\n");
4566*53ee8cc1Swenshuai.xi                         #endif
4567*53ee8cc1Swenshuai.xi                         (pDemod->_sDMD_MSB124X_InitData.fpGPIOReset)(FALSE); // gptr->SetOff();
4568*53ee8cc1Swenshuai.xi                         MsOS_DelayTaskUs(resetDemodTime*1000);
4569*53ee8cc1Swenshuai.xi                         (pDemod->_sDMD_MSB124X_InitData.fpGPIOReset)(TRUE); // gptr->SetOn();
4570*53ee8cc1Swenshuai.xi                         MsOS_DelayTaskUs(waitFlashTime * 1000);
4571*53ee8cc1Swenshuai.xi                     }
4572*53ee8cc1Swenshuai.xi 
4573*53ee8cc1Swenshuai.xi                     if (_MSB124X_I2C_CH_Reset(3) == FALSE)
4574*53ee8cc1Swenshuai.xi                     {
4575*53ee8cc1Swenshuai.xi                         printf(">>>MSB124X CH Reset:Fail\n");
4576*53ee8cc1Swenshuai.xi                         status= FALSE;
4577*53ee8cc1Swenshuai.xi                         continue;
4578*53ee8cc1Swenshuai.xi                     }
4579*53ee8cc1Swenshuai.xi 
4580*53ee8cc1Swenshuai.xi                     u16_counter = 1000;
4581*53ee8cc1Swenshuai.xi                     do
4582*53ee8cc1Swenshuai.xi                     {
4583*53ee8cc1Swenshuai.xi                         // 10 ms
4584*53ee8cc1Swenshuai.xi                         MsOS_DelayTaskUs(10*1000);
4585*53ee8cc1Swenshuai.xi                         u16_counter--;
4586*53ee8cc1Swenshuai.xi                         _MDrv_DMD_MSB124X_GetReg(0x0900+(0x4f)*2, &u8DoneFlag);
4587*53ee8cc1Swenshuai.xi                     } while(u8DoneFlag != 0x99 && u16_counter != 0);
4588*53ee8cc1Swenshuai.xi 
4589*53ee8cc1Swenshuai.xi                     if(u16_counter == 0 && u8DoneFlag != 0x99)
4590*53ee8cc1Swenshuai.xi                     {
4591*53ee8cc1Swenshuai.xi                         printf("[wb]Err, MSB124X didn't ready yet\n");
4592*53ee8cc1Swenshuai.xi                         status = false;
4593*53ee8cc1Swenshuai.xi                     }
4594*53ee8cc1Swenshuai.xi                     else
4595*53ee8cc1Swenshuai.xi                     {
4596*53ee8cc1Swenshuai.xi                         status = TRUE;
4597*53ee8cc1Swenshuai.xi                     }
4598*53ee8cc1Swenshuai.xi 
4599*53ee8cc1Swenshuai.xi                 }
4600*53ee8cc1Swenshuai.xi                 // No need to switch to CH0 before SPI Flash access.
4601*53ee8cc1Swenshuai.xi 
4602*53ee8cc1Swenshuai.xi                 {
4603*53ee8cc1Swenshuai.xi                     #ifdef MS_DEBUG
4604*53ee8cc1Swenshuai.xi                     if (eDMD_MSB124X_DbgLevel >= E_DMD_MSB124X_DBGLV_DEBUG)
4605*53ee8cc1Swenshuai.xi                     {
4606*53ee8cc1Swenshuai.xi                         printf(">>>MSB124X: Check Version...");
4607*53ee8cc1Swenshuai.xi                     }
4608*53ee8cc1Swenshuai.xi                     #endif
4609*53ee8cc1Swenshuai.xi 
4610*53ee8cc1Swenshuai.xi                     if (_IspCheckVer(MSB124X_LIB, &bMatch) == FALSE)
4611*53ee8cc1Swenshuai.xi                     {
4612*53ee8cc1Swenshuai.xi                         printf(">>> ISP read FAIL!\n");
4613*53ee8cc1Swenshuai.xi                         status= FALSE;
4614*53ee8cc1Swenshuai.xi                         continue;
4615*53ee8cc1Swenshuai.xi                     }
4616*53ee8cc1Swenshuai.xi 
4617*53ee8cc1Swenshuai.xi 
4618*53ee8cc1Swenshuai.xi                     if(bMatch == FALSE)
4619*53ee8cc1Swenshuai.xi                     {
4620*53ee8cc1Swenshuai.xi                       printf(">>> IspCheckVer FAIL!\n");
4621*53ee8cc1Swenshuai.xi                     }
4622*53ee8cc1Swenshuai.xi                     else
4623*53ee8cc1Swenshuai.xi                     {
4624*53ee8cc1Swenshuai.xi                         if (_MSB124X_I2C_CH_Reset(3) == FALSE)
4625*53ee8cc1Swenshuai.xi                         {
4626*53ee8cc1Swenshuai.xi                             printf(">>>MSB124X CH Reset:Fail\n");
4627*53ee8cc1Swenshuai.xi                             status= FALSE;
4628*53ee8cc1Swenshuai.xi                             continue;
4629*53ee8cc1Swenshuai.xi                         }
4630*53ee8cc1Swenshuai.xi                         else
4631*53ee8cc1Swenshuai.xi                         {
4632*53ee8cc1Swenshuai.xi                             #ifdef MS_DEBUG
4633*53ee8cc1Swenshuai.xi                             if (eDMD_MSB124X_DbgLevel >= E_DMD_MSB124X_DBGLV_DEBUG)
4634*53ee8cc1Swenshuai.xi                             {
4635*53ee8cc1Swenshuai.xi                                 printf(">>>MSB124X CH Reset:OK\n");
4636*53ee8cc1Swenshuai.xi                             }
4637*53ee8cc1Swenshuai.xi                             #endif
4638*53ee8cc1Swenshuai.xi                         }
4639*53ee8cc1Swenshuai.xi 
4640*53ee8cc1Swenshuai.xi                         if (_dram_crc_check(crc16, &bMatch) == FALSE)
4641*53ee8cc1Swenshuai.xi                         {
4642*53ee8cc1Swenshuai.xi                             printf(">>> reg read fail!\n");
4643*53ee8cc1Swenshuai.xi                             status= FALSE;
4644*53ee8cc1Swenshuai.xi                             continue;
4645*53ee8cc1Swenshuai.xi                         }
4646*53ee8cc1Swenshuai.xi 
4647*53ee8cc1Swenshuai.xi                         if(bMatch == FALSE)
4648*53ee8cc1Swenshuai.xi                             printf(">>> dram crc check FAIL!\n");
4649*53ee8cc1Swenshuai.xi                         else
4650*53ee8cc1Swenshuai.xi                             printf(">>> dram crc check OK!\n");
4651*53ee8cc1Swenshuai.xi 
4652*53ee8cc1Swenshuai.xi 
4653*53ee8cc1Swenshuai.xi                     }
4654*53ee8cc1Swenshuai.xi 
4655*53ee8cc1Swenshuai.xi                     if (pDemod->_sDMD_MSB124X_InitData.bFlashWPEnable)
4656*53ee8cc1Swenshuai.xi                     {
4657*53ee8cc1Swenshuai.xi                         if (bMatch == FALSE)
4658*53ee8cc1Swenshuai.xi                         {
4659*53ee8cc1Swenshuai.xi                             // disable flash WP, pull high.
4660*53ee8cc1Swenshuai.xi                             if(_msb124x_flash_WP(0) == FALSE)
4661*53ee8cc1Swenshuai.xi                             {
4662*53ee8cc1Swenshuai.xi                                 printf("[wb]Err, FLASH WP Disable Fail!!!\n");
4663*53ee8cc1Swenshuai.xi                             }
4664*53ee8cc1Swenshuai.xi                             MsOS_DelayTaskUs(100*1000);
4665*53ee8cc1Swenshuai.xi                         }
4666*53ee8cc1Swenshuai.xi                     }
4667*53ee8cc1Swenshuai.xi 
4668*53ee8cc1Swenshuai.xi                     ////bMatch = true; //FIXME : Remove this to enable auto FW reload.
4669*53ee8cc1Swenshuai.xi                     if (bMatch == FALSE)// Version not match
4670*53ee8cc1Swenshuai.xi                     {
4671*53ee8cc1Swenshuai.xi                         MS_U8 bAddr[1];
4672*53ee8cc1Swenshuai.xi                         MS_U8 bWriteData[5]={0x4D, 0x53, 0x54, 0x41, 0x52};
4673*53ee8cc1Swenshuai.xi 
4674*53ee8cc1Swenshuai.xi                         printf(">>> Not match! Reload Flash...");
4675*53ee8cc1Swenshuai.xi                         if ( (sizeof(MSB124X_LIB)%256) != 0)
4676*53ee8cc1Swenshuai.xi                         {
4677*53ee8cc1Swenshuai.xi                             printf(" MSB124X_LIB 256byte alignment error!%u \n",sizeof(MSB124X_LIB));
4678*53ee8cc1Swenshuai.xi                         }
4679*53ee8cc1Swenshuai.xi 
4680*53ee8cc1Swenshuai.xi                         (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, bWriteData);
4681*53ee8cc1Swenshuai.xi 
4682*53ee8cc1Swenshuai.xi                         bAddr[0] = 0x10;
4683*53ee8cc1Swenshuai.xi                         bWriteData[0] = 0x06;
4684*53ee8cc1Swenshuai.xi                         (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 1, bWriteData);
4685*53ee8cc1Swenshuai.xi 
4686*53ee8cc1Swenshuai.xi                         bWriteData[0] = 0x12;
4687*53ee8cc1Swenshuai.xi                         (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
4688*53ee8cc1Swenshuai.xi 
4689*53ee8cc1Swenshuai.xi                         bAddr[0] = 0x10;
4690*53ee8cc1Swenshuai.xi 
4691*53ee8cc1Swenshuai.xi                         bWriteData[0] = 0xC7;
4692*53ee8cc1Swenshuai.xi                         (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 1, bWriteData);
4693*53ee8cc1Swenshuai.xi 
4694*53ee8cc1Swenshuai.xi                         bWriteData[0] = 0x12;
4695*53ee8cc1Swenshuai.xi                         (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
4696*53ee8cc1Swenshuai.xi 
4697*53ee8cc1Swenshuai.xi                         bWriteData[0]=0x24 ;
4698*53ee8cc1Swenshuai.xi                         (pDemod->_sDMD_MSB124X_InitData.fpMSB124X_I2C_Access)(E_DMD_MSB124X_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB124X_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
4699*53ee8cc1Swenshuai.xi 
4700*53ee8cc1Swenshuai.xi                         #ifdef MS_DEBUG
4701*53ee8cc1Swenshuai.xi                         printf("\t\t\tStart   %ld\n", MsOS_GetSystemTime());
4702*53ee8cc1Swenshuai.xi                         #endif
4703*53ee8cc1Swenshuai.xi                         if ( (sizeof(MSB124X_LIB) - 2) > MAX_MSB124X_LIB_LEN)
4704*53ee8cc1Swenshuai.xi                         {
4705*53ee8cc1Swenshuai.xi                           printf("Err, msb124xc_lib size(%d) is larger than flash size(%d)\n", sizeof(MSB124X_LIB), MAX_MSB124X_LIB_LEN);
4706*53ee8cc1Swenshuai.xi                         }
4707*53ee8cc1Swenshuai.xi 
4708*53ee8cc1Swenshuai.xi                         // if (IspProcFlash(MSB124X_LIB, sizeof(MSB124X_LIB)) == MAPI_FALSE)
4709*53ee8cc1Swenshuai.xi                         if (_IspProcFlash(MSB124X_LIB, sizeof(MSB124X_LIB)-2) == FALSE)
4710*53ee8cc1Swenshuai.xi                         {
4711*53ee8cc1Swenshuai.xi                             printf("ISP write FAIL\n");
4712*53ee8cc1Swenshuai.xi                             status= FALSE;
4713*53ee8cc1Swenshuai.xi                             continue;
4714*53ee8cc1Swenshuai.xi                         }
4715*53ee8cc1Swenshuai.xi                         else
4716*53ee8cc1Swenshuai.xi                         {
4717*53ee8cc1Swenshuai.xi                             #ifdef MS_DEBUG
4718*53ee8cc1Swenshuai.xi                             printf("\t\t\tEnd   %ld\n", MsOS_GetSystemTime());
4719*53ee8cc1Swenshuai.xi                             #endif
4720*53ee8cc1Swenshuai.xi                             //check again
4721*53ee8cc1Swenshuai.xi                            if ((_IspCheckVer(MSB124X_LIB, &bMatch) == FALSE)||(bMatch==false))
4722*53ee8cc1Swenshuai.xi                             {
4723*53ee8cc1Swenshuai.xi                                 printf(">>> ISP read FAIL! bMatch %d \n",bMatch);
4724*53ee8cc1Swenshuai.xi                                 status= FALSE;
4725*53ee8cc1Swenshuai.xi                                 continue;
4726*53ee8cc1Swenshuai.xi                             }
4727*53ee8cc1Swenshuai.xi                             else // reset again
4728*53ee8cc1Swenshuai.xi                             {
4729*53ee8cc1Swenshuai.xi                                 if (pDemod->_sDMD_MSB124X_InitData.fpGPIOReset != NULL)
4730*53ee8cc1Swenshuai.xi                                 {
4731*53ee8cc1Swenshuai.xi                                     #ifdef MS_DEBUG
4732*53ee8cc1Swenshuai.xi                                     printf(">>>MSB124X[2]: Reset Demodulator\n");
4733*53ee8cc1Swenshuai.xi                                     #endif
4734*53ee8cc1Swenshuai.xi                                     (pDemod->_sDMD_MSB124X_InitData.fpGPIOReset)(FALSE); // gptr->SetOff();
4735*53ee8cc1Swenshuai.xi                                     MsOS_DelayTaskUs(resetDemodTime*1000);
4736*53ee8cc1Swenshuai.xi                                     (pDemod->_sDMD_MSB124X_InitData.fpGPIOReset)(TRUE); // gptr->SetOn();
4737*53ee8cc1Swenshuai.xi                                     MsOS_DelayTaskUs(waitFlashTime * 1000);
4738*53ee8cc1Swenshuai.xi                                 }
4739*53ee8cc1Swenshuai.xi 
4740*53ee8cc1Swenshuai.xi                                 if (_MSB124X_I2C_CH_Reset(3) == FALSE)
4741*53ee8cc1Swenshuai.xi                                 {
4742*53ee8cc1Swenshuai.xi                                     printf(">>>MSB124X CH Reset:Fail\n");
4743*53ee8cc1Swenshuai.xi                                     status= FALSE;
4744*53ee8cc1Swenshuai.xi                                     continue;
4745*53ee8cc1Swenshuai.xi                                 }
4746*53ee8cc1Swenshuai.xi 
4747*53ee8cc1Swenshuai.xi                                 u16_counter = 1000;
4748*53ee8cc1Swenshuai.xi                                 do
4749*53ee8cc1Swenshuai.xi                                 {
4750*53ee8cc1Swenshuai.xi                                     // 10 ms
4751*53ee8cc1Swenshuai.xi                                     MsOS_DelayTaskUs(10*1000);
4752*53ee8cc1Swenshuai.xi                                     u16_counter--;
4753*53ee8cc1Swenshuai.xi                                     _MDrv_DMD_MSB124X_GetReg(0x0900+(0x4f)*2, &u8DoneFlag);
4754*53ee8cc1Swenshuai.xi                                 } while(u8DoneFlag != 0x99 && u16_counter != 0);
4755*53ee8cc1Swenshuai.xi 
4756*53ee8cc1Swenshuai.xi                                 if(u16_counter == 0 && u8DoneFlag != 0x99)
4757*53ee8cc1Swenshuai.xi                                 {
4758*53ee8cc1Swenshuai.xi                                     printf("[wb]Err, MSB124X didn't ready yet\n");
4759*53ee8cc1Swenshuai.xi                                     status = FALSE;
4760*53ee8cc1Swenshuai.xi                                 }
4761*53ee8cc1Swenshuai.xi                                 else
4762*53ee8cc1Swenshuai.xi                                     status = TRUE;
4763*53ee8cc1Swenshuai.xi 
4764*53ee8cc1Swenshuai.xi                                 if (_MSB124X_I2C_CH_Reset(3) == FALSE)
4765*53ee8cc1Swenshuai.xi                                 {
4766*53ee8cc1Swenshuai.xi                                     printf(">>>MSB124X CH Reset:Fail\n");
4767*53ee8cc1Swenshuai.xi                                     status= FALSE;
4768*53ee8cc1Swenshuai.xi                                     continue;
4769*53ee8cc1Swenshuai.xi                                 }
4770*53ee8cc1Swenshuai.xi                                 else
4771*53ee8cc1Swenshuai.xi                                 {
4772*53ee8cc1Swenshuai.xi                                     printf(">>>MSB124X CH Reset:OK\n");
4773*53ee8cc1Swenshuai.xi                                 }
4774*53ee8cc1Swenshuai.xi 
4775*53ee8cc1Swenshuai.xi                                 if (_dram_crc_check(crc16, &bMatch) == FALSE)
4776*53ee8cc1Swenshuai.xi                                 {
4777*53ee8cc1Swenshuai.xi                                     printf(">>> reg read fail!\n");
4778*53ee8cc1Swenshuai.xi                                     status= FALSE;
4779*53ee8cc1Swenshuai.xi                                     continue;
4780*53ee8cc1Swenshuai.xi                                 }
4781*53ee8cc1Swenshuai.xi 
4782*53ee8cc1Swenshuai.xi                                 if(bMatch == false)
4783*53ee8cc1Swenshuai.xi                                   printf(">>> dram crc check FAIL!\n");
4784*53ee8cc1Swenshuai.xi                                 else
4785*53ee8cc1Swenshuai.xi                                   printf(">>> dram crc check OK!\n");
4786*53ee8cc1Swenshuai.xi                             }
4787*53ee8cc1Swenshuai.xi                             #ifdef MS_DEBUG
4788*53ee8cc1Swenshuai.xi                             printf(" OK\n");
4789*53ee8cc1Swenshuai.xi                             #endif
4790*53ee8cc1Swenshuai.xi                         }
4791*53ee8cc1Swenshuai.xi                     }
4792*53ee8cc1Swenshuai.xi                     else
4793*53ee8cc1Swenshuai.xi                     {   // Version match, do nothing
4794*53ee8cc1Swenshuai.xi                         #ifdef MS_DEBUG
4795*53ee8cc1Swenshuai.xi                         printf(">>> Match\n");
4796*53ee8cc1Swenshuai.xi                         #endif
4797*53ee8cc1Swenshuai.xi                     } // if (bMatch == false)
4798*53ee8cc1Swenshuai.xi 
4799*53ee8cc1Swenshuai.xi                     if (pDemod->_sDMD_MSB124X_InitData.bFlashWPEnable)
4800*53ee8cc1Swenshuai.xi                     {
4801*53ee8cc1Swenshuai.xi                         if (bMatch == TRUE)
4802*53ee8cc1Swenshuai.xi                         {
4803*53ee8cc1Swenshuai.xi                             // Enable flash WP, pull high.
4804*53ee8cc1Swenshuai.xi                             if(_msb124x_flash_WP(1) == FALSE)
4805*53ee8cc1Swenshuai.xi                             {
4806*53ee8cc1Swenshuai.xi                                 printf("[wb]Err, FLASH WP Enable Fail!!!\n");
4807*53ee8cc1Swenshuai.xi                             }
4808*53ee8cc1Swenshuai.xi                             MsOS_DelayTaskUs(100*1000);
4809*53ee8cc1Swenshuai.xi                         }
4810*53ee8cc1Swenshuai.xi                     }  // bFlashWPEnable
4811*53ee8cc1Swenshuai.xi                 }
4812*53ee8cc1Swenshuai.xi 
4813*53ee8cc1Swenshuai.xi 
4814*53ee8cc1Swenshuai.xi                 if (_MSB124X_I2C_CH_Reset(3) == FALSE)
4815*53ee8cc1Swenshuai.xi                 {
4816*53ee8cc1Swenshuai.xi                     printf(">>>MSB124X CH Reset:Fail\n");
4817*53ee8cc1Swenshuai.xi                     status= FALSE;
4818*53ee8cc1Swenshuai.xi                     continue;
4819*53ee8cc1Swenshuai.xi                 }
4820*53ee8cc1Swenshuai.xi                 else
4821*53ee8cc1Swenshuai.xi                 {
4822*53ee8cc1Swenshuai.xi                     #ifdef MS_DEBUG
4823*53ee8cc1Swenshuai.xi                     printf(">>>MSB124X CH Reset:OK\n");
4824*53ee8cc1Swenshuai.xi                     #endif
4825*53ee8cc1Swenshuai.xi                 }
4826*53ee8cc1Swenshuai.xi 
4827*53ee8cc1Swenshuai.xi                 #ifdef MS_DEBUG
4828*53ee8cc1Swenshuai.xi                 u32tmm_5 = MsOS_GetSystemTime();
4829*53ee8cc1Swenshuai.xi                 #endif
4830*53ee8cc1Swenshuai.xi 
4831*53ee8cc1Swenshuai.xi                 if (_LoadDSPCode() == FALSE)
4832*53ee8cc1Swenshuai.xi                 {
4833*53ee8cc1Swenshuai.xi                     printf(">>>>MSB124X:Fail\n");
4834*53ee8cc1Swenshuai.xi                     status= FALSE;
4835*53ee8cc1Swenshuai.xi                     continue;
4836*53ee8cc1Swenshuai.xi                 }
4837*53ee8cc1Swenshuai.xi                 else
4838*53ee8cc1Swenshuai.xi                 {
4839*53ee8cc1Swenshuai.xi                     #ifdef MS_DEBUG
4840*53ee8cc1Swenshuai.xi                     printf(">>>MSB124X:OK\n");
4841*53ee8cc1Swenshuai.xi                     #endif
4842*53ee8cc1Swenshuai.xi                 }
4843*53ee8cc1Swenshuai.xi 
4844*53ee8cc1Swenshuai.xi                 #ifdef MS_DEBUG
4845*53ee8cc1Swenshuai.xi                 u32tmm_6 = MsOS_GetSystemTime();
4846*53ee8cc1Swenshuai.xi                 printf("[tmm1]t6-t5 = %ld (%ld - %ld)\n",u32tmm_6-u32tmm_5,u32tmm_6,u32tmm_5);
4847*53ee8cc1Swenshuai.xi                 #endif
4848*53ee8cc1Swenshuai.xi 
4849*53ee8cc1Swenshuai.xi                 #ifdef MS_DEBUG
4850*53ee8cc1Swenshuai.xi                 {
4851*53ee8cc1Swenshuai.xi                     MS_U8 u8ChipRevId = 0;
4852*53ee8cc1Swenshuai.xi                     _MDrv_DMD_MSB124X_GetReg(0x0900+(0x01)*2, &u8ChipRevId);
4853*53ee8cc1Swenshuai.xi                     printf(">>>MSB124X:Edinburgh RevID:%x\n", u8ChipRevId);
4854*53ee8cc1Swenshuai.xi 
4855*53ee8cc1Swenshuai.xi 
4856*53ee8cc1Swenshuai.xi                     _MDrv_DMD_MSB124X_GetReg(0x0900+(0x49)*2, &u8ChipRevId);
4857*53ee8cc1Swenshuai.xi                     printf(">>>MSB124X:Edinburgh 0x49_L:%x\n", u8ChipRevId);
4858*53ee8cc1Swenshuai.xi 
4859*53ee8cc1Swenshuai.xi                     _MDrv_DMD_MSB124X_GetReg(0x0900+(0x49)*2+1, &u8ChipRevId);
4860*53ee8cc1Swenshuai.xi                     printf(">>>MSB124X:Edinburgh 0x49_H:%x\n", u8ChipRevId);
4861*53ee8cc1Swenshuai.xi 
4862*53ee8cc1Swenshuai.xi                     _MDrv_DMD_MSB124X_GetReg(0x0900+(0x4A)*2, &u8ChipRevId);
4863*53ee8cc1Swenshuai.xi                     printf(">>>MSB124X:Edinburgh 0x4A_L:%x\n", u8ChipRevId);
4864*53ee8cc1Swenshuai.xi                 }
4865*53ee8cc1Swenshuai.xi                 #endif
4866*53ee8cc1Swenshuai.xi 
4867*53ee8cc1Swenshuai.xi             }while((u8RetryCnt>0)&&(status==FALSE));
4868*53ee8cc1Swenshuai.xi         }
4869*53ee8cc1Swenshuai.xi     }
4870*53ee8cc1Swenshuai.xi 
4871*53ee8cc1Swenshuai.xi     if(status==FALSE)
4872*53ee8cc1Swenshuai.xi     {
4873*53ee8cc1Swenshuai.xi         printf("msb124x power_on_init FAIL !!!!!! \n\n");
4874*53ee8cc1Swenshuai.xi     }
4875*53ee8cc1Swenshuai.xi     else
4876*53ee8cc1Swenshuai.xi     {
4877*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
4878*53ee8cc1Swenshuai.xi         printf("msb124x power_on_init OK !!!!!! \n\n");
4879*53ee8cc1Swenshuai.xi         u32tmm_2 = MsOS_GetSystemTime();
4880*53ee8cc1Swenshuai.xi         printf("[tmm]t2-t1 = %ld (%ld - %ld)\n",u32tmm_2-u32tmm_1,u32tmm_2,u32tmm_1);
4881*53ee8cc1Swenshuai.xi         #endif
4882*53ee8cc1Swenshuai.xi     }
4883*53ee8cc1Swenshuai.xi 
4884*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
4885*53ee8cc1Swenshuai.xi     return status;
4886*53ee8cc1Swenshuai.xi }
4887*53ee8cc1Swenshuai.xi 
4888*53ee8cc1Swenshuai.xi 
4889*53ee8cc1Swenshuai.xi ////////////////EXT API//////////////////////////////
MDrv_DMD_MSB124X_Init_EX(MS_S32 s32Handle,sDMD_MSB124X_InitData * pDMD_MSB124X_InitData,MS_U32 u32InitDataLen)4890*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_Init_EX(MS_S32 s32Handle, sDMD_MSB124X_InitData *pDMD_MSB124X_InitData, MS_U32 u32InitDataLen)
4891*53ee8cc1Swenshuai.xi {
4892*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
4893*53ee8cc1Swenshuai.xi     DMD_LOCK();
4894*53ee8cc1Swenshuai.xi 
4895*53ee8cc1Swenshuai.xi     if(MDrv_DMD_MSB124X_SwitchHandle(s32Handle) == FALSE)
4896*53ee8cc1Swenshuai.xi     {
4897*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
4898*53ee8cc1Swenshuai.xi         return FALSE;
4899*53ee8cc1Swenshuai.xi     }
4900*53ee8cc1Swenshuai.xi     bRet = MDrv_DMD_MSB124X_Init(pDMD_MSB124X_InitData, u32InitDataLen);
4901*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
4902*53ee8cc1Swenshuai.xi     return bRet;
4903*53ee8cc1Swenshuai.xi }
MDrv_DMD_MSB124X_Exit_EX(MS_S32 s32Handle)4904*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_Exit_EX(MS_S32 s32Handle)
4905*53ee8cc1Swenshuai.xi {
4906*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
4907*53ee8cc1Swenshuai.xi     DMD_LOCK();
4908*53ee8cc1Swenshuai.xi     if(MDrv_DMD_MSB124X_SwitchHandle(s32Handle) == FALSE)
4909*53ee8cc1Swenshuai.xi     {
4910*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
4911*53ee8cc1Swenshuai.xi         return FALSE;
4912*53ee8cc1Swenshuai.xi     }
4913*53ee8cc1Swenshuai.xi     bRet = MDrv_DMD_MSB124X_Exit();
4914*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
4915*53ee8cc1Swenshuai.xi     return bRet;
4916*53ee8cc1Swenshuai.xi }
4917*53ee8cc1Swenshuai.xi //////////////////////////////////////////////////////
MDrv_DMD_MSB124X_GetReg_EX(MS_S32 s32Handle,MS_U16 u16Addr,MS_U8 * pu8Data)4918*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_GetReg_EX(MS_S32 s32Handle, MS_U16 u16Addr, MS_U8 *pu8Data)
4919*53ee8cc1Swenshuai.xi {
4920*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
4921*53ee8cc1Swenshuai.xi 
4922*53ee8cc1Swenshuai.xi     DMD_LOCK();
4923*53ee8cc1Swenshuai.xi 
4924*53ee8cc1Swenshuai.xi     if(MDrv_DMD_MSB124X_SwitchHandle(s32Handle) == FALSE)
4925*53ee8cc1Swenshuai.xi     {
4926*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
4927*53ee8cc1Swenshuai.xi         return FALSE;
4928*53ee8cc1Swenshuai.xi     }
4929*53ee8cc1Swenshuai.xi     bRet = MDrv_DMD_MSB124X_GetReg(u16Addr, pu8Data);
4930*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
4931*53ee8cc1Swenshuai.xi     return bRet;
4932*53ee8cc1Swenshuai.xi }
4933*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_SetReg_EX(MS_S32 s32Handle,MS_U16 u16Addr,MS_U8 u8Data)4934*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_SetReg_EX(MS_S32 s32Handle, MS_U16 u16Addr, MS_U8 u8Data)
4935*53ee8cc1Swenshuai.xi {
4936*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
4937*53ee8cc1Swenshuai.xi 
4938*53ee8cc1Swenshuai.xi     DMD_LOCK();
4939*53ee8cc1Swenshuai.xi 
4940*53ee8cc1Swenshuai.xi     if(MDrv_DMD_MSB124X_SwitchHandle(s32Handle) == FALSE)
4941*53ee8cc1Swenshuai.xi     {
4942*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
4943*53ee8cc1Swenshuai.xi         return FALSE;
4944*53ee8cc1Swenshuai.xi     }
4945*53ee8cc1Swenshuai.xi     bRet = MDrv_DMD_MSB124X_SetReg(u16Addr, u8Data);
4946*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
4947*53ee8cc1Swenshuai.xi     return bRet;
4948*53ee8cc1Swenshuai.xi 
4949*53ee8cc1Swenshuai.xi }
MDrv_DMD_MSB124X_SetRegs_EX(MS_S32 s32Handle,MS_U16 u16Addr,MS_U8 * u8pData,MS_U16 data_size)4950*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_SetRegs_EX(MS_S32 s32Handle,MS_U16 u16Addr, MS_U8* u8pData, MS_U16 data_size)
4951*53ee8cc1Swenshuai.xi {
4952*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
4953*53ee8cc1Swenshuai.xi 
4954*53ee8cc1Swenshuai.xi     DMD_LOCK();
4955*53ee8cc1Swenshuai.xi     if(MDrv_DMD_MSB124X_SwitchHandle(s32Handle) == FALSE)
4956*53ee8cc1Swenshuai.xi     {
4957*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
4958*53ee8cc1Swenshuai.xi         return FALSE;
4959*53ee8cc1Swenshuai.xi     }
4960*53ee8cc1Swenshuai.xi     bRet = MDrv_DMD_MSB124X_SetRegs(u16Addr, u8pData, data_size);
4961*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
4962*53ee8cc1Swenshuai.xi     return bRet;
4963*53ee8cc1Swenshuai.xi 
4964*53ee8cc1Swenshuai.xi }
MDrv_DMD_MSB124X_SetReg2Bytes_EX(MS_S32 s32Handle,MS_U16 u16Addr,MS_U16 u16Data)4965*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_SetReg2Bytes_EX(MS_S32 s32Handle, MS_U16 u16Addr, MS_U16 u16Data)
4966*53ee8cc1Swenshuai.xi {
4967*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
4968*53ee8cc1Swenshuai.xi 
4969*53ee8cc1Swenshuai.xi     DMD_LOCK();
4970*53ee8cc1Swenshuai.xi     if(MDrv_DMD_MSB124X_SwitchHandle(s32Handle) == FALSE)
4971*53ee8cc1Swenshuai.xi     {
4972*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
4973*53ee8cc1Swenshuai.xi         return FALSE;
4974*53ee8cc1Swenshuai.xi     }
4975*53ee8cc1Swenshuai.xi     bRet = MDrv_DMD_MSB124X_SetReg2Bytes(u16Addr, u16Data);
4976*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
4977*53ee8cc1Swenshuai.xi     return bRet;
4978*53ee8cc1Swenshuai.xi 
4979*53ee8cc1Swenshuai.xi }
4980*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_GetDSPReg_EX(MS_S32 s32Handle,MS_U16 u16Addr,MS_U8 * pu8Data)4981*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_GetDSPReg_EX(MS_S32 s32Handle, MS_U16 u16Addr, MS_U8 *pu8Data)
4982*53ee8cc1Swenshuai.xi {
4983*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
4984*53ee8cc1Swenshuai.xi 
4985*53ee8cc1Swenshuai.xi     DMD_LOCK();
4986*53ee8cc1Swenshuai.xi     if(MDrv_DMD_MSB124X_SwitchHandle(s32Handle) == FALSE)
4987*53ee8cc1Swenshuai.xi     {
4988*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
4989*53ee8cc1Swenshuai.xi         return FALSE;
4990*53ee8cc1Swenshuai.xi     }
4991*53ee8cc1Swenshuai.xi     bRet = MDrv_DMD_MSB124X_GetDSPReg(u16Addr, pu8Data);
4992*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
4993*53ee8cc1Swenshuai.xi     return bRet;
4994*53ee8cc1Swenshuai.xi 
4995*53ee8cc1Swenshuai.xi }
4996*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB124X_SetDSPReg_EX(MS_S32 s32Handle,MS_U16 u16Addr,MS_U8 u8Data)4997*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_SetDSPReg_EX(MS_S32 s32Handle, MS_U16 u16Addr, MS_U8 u8Data)
4998*53ee8cc1Swenshuai.xi {
4999*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
5000*53ee8cc1Swenshuai.xi 
5001*53ee8cc1Swenshuai.xi     DMD_LOCK();
5002*53ee8cc1Swenshuai.xi     if(MDrv_DMD_MSB124X_SwitchHandle(s32Handle) == FALSE)
5003*53ee8cc1Swenshuai.xi     {
5004*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
5005*53ee8cc1Swenshuai.xi         return FALSE;
5006*53ee8cc1Swenshuai.xi     }
5007*53ee8cc1Swenshuai.xi     bRet = MDrv_DMD_MSB124X_SetDSPReg(u16Addr, u8Data);
5008*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
5009*53ee8cc1Swenshuai.xi     return bRet;
5010*53ee8cc1Swenshuai.xi 
5011*53ee8cc1Swenshuai.xi }
MDrv_DMD_MSB124X_SetCurrentDemodulatorType_EX(MS_S32 s32Handle,eDMD_MSB124X_DemodulatorType eCurrentDemodulatorType)5012*53ee8cc1Swenshuai.xi void MDrv_DMD_MSB124X_SetCurrentDemodulatorType_EX(MS_S32 s32Handle, eDMD_MSB124X_DemodulatorType eCurrentDemodulatorType)
5013*53ee8cc1Swenshuai.xi {
5014*53ee8cc1Swenshuai.xi 
5015*53ee8cc1Swenshuai.xi     DMD_LOCK();
5016*53ee8cc1Swenshuai.xi     if(MDrv_DMD_MSB124X_SwitchHandle(s32Handle) == FALSE)
5017*53ee8cc1Swenshuai.xi     {
5018*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
5019*53ee8cc1Swenshuai.xi         return ;
5020*53ee8cc1Swenshuai.xi     }
5021*53ee8cc1Swenshuai.xi     MDrv_DMD_MSB124X_SetCurrentDemodulatorType(eCurrentDemodulatorType);
5022*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
5023*53ee8cc1Swenshuai.xi     return ;
5024*53ee8cc1Swenshuai.xi }
MDrv_DMD_MSB124X_LoadDSPCode_EX(MS_S32 s32Handle)5025*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_LoadDSPCode_EX(MS_S32 s32Handle)
5026*53ee8cc1Swenshuai.xi {
5027*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
5028*53ee8cc1Swenshuai.xi 
5029*53ee8cc1Swenshuai.xi     DMD_LOCK();
5030*53ee8cc1Swenshuai.xi     if(MDrv_DMD_MSB124X_SwitchHandle(s32Handle) == FALSE)
5031*53ee8cc1Swenshuai.xi     {
5032*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
5033*53ee8cc1Swenshuai.xi         return FALSE;
5034*53ee8cc1Swenshuai.xi     }
5035*53ee8cc1Swenshuai.xi     bRet = MDrv_DMD_MSB124X_LoadDSPCode();
5036*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
5037*53ee8cc1Swenshuai.xi     return bRet;
5038*53ee8cc1Swenshuai.xi 
5039*53ee8cc1Swenshuai.xi }
MDrv_DMD_MSB124X_DTV_DVBT_DSPReg_CRC_EX(MS_S32 s32Handle)5040*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB124X_DTV_DVBT_DSPReg_CRC_EX(MS_S32 s32Handle)
5041*53ee8cc1Swenshuai.xi {
5042*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
5043*53ee8cc1Swenshuai.xi 
5044*53ee8cc1Swenshuai.xi     DMD_LOCK();
5045*53ee8cc1Swenshuai.xi     if(MDrv_DMD_MSB124X_SwitchHandle(s32Handle) == FALSE)
5046*53ee8cc1Swenshuai.xi     {
5047*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
5048*53ee8cc1Swenshuai.xi         return FALSE;
5049*53ee8cc1Swenshuai.xi     }
5050*53ee8cc1Swenshuai.xi     bRet = MDrv_DMD_MSB124X_DTV_DVBT_DSPReg_CRC();
5051*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
5052*53ee8cc1Swenshuai.xi     return bRet;
5053*53ee8cc1Swenshuai.xi 
5054*53ee8cc1Swenshuai.xi }
MDrv_DMD_MSB124X_Power_On_Initialization_EX(MS_S32 s32Handle)5055*53ee8cc1Swenshuai.xi extern MS_BOOL MDrv_DMD_MSB124X_Power_On_Initialization_EX(MS_S32 s32Handle)
5056*53ee8cc1Swenshuai.xi {
5057*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
5058*53ee8cc1Swenshuai.xi 
5059*53ee8cc1Swenshuai.xi     DMD_LOCK();
5060*53ee8cc1Swenshuai.xi     if(MDrv_DMD_MSB124X_SwitchHandle(s32Handle) == FALSE)
5061*53ee8cc1Swenshuai.xi     {
5062*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
5063*53ee8cc1Swenshuai.xi         return FALSE;
5064*53ee8cc1Swenshuai.xi     }
5065*53ee8cc1Swenshuai.xi     bRet = MDrv_DMD_MSB124X_Power_On_Initialization();
5066*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
5067*53ee8cc1Swenshuai.xi     return bRet;
5068*53ee8cc1Swenshuai.xi 
5069*53ee8cc1Swenshuai.xi }
5070*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
5071*53ee8cc1Swenshuai.xi /// load dsp code
5072*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
MDrv_DMD_MSB1245_LoadDSPCodeToSram_EX(MS_S32 s32Handle)5073*53ee8cc1Swenshuai.xi extern MS_BOOL MDrv_DMD_MSB1245_LoadDSPCodeToSram_EX(MS_S32 s32Handle)
5074*53ee8cc1Swenshuai.xi {
5075*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
5076*53ee8cc1Swenshuai.xi 
5077*53ee8cc1Swenshuai.xi     DMD_LOCK();
5078*53ee8cc1Swenshuai.xi     if(MDrv_DMD_MSB124X_SwitchHandle(s32Handle) == FALSE)
5079*53ee8cc1Swenshuai.xi     {
5080*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
5081*53ee8cc1Swenshuai.xi         return FALSE;
5082*53ee8cc1Swenshuai.xi     }
5083*53ee8cc1Swenshuai.xi     bRet = MDrv_DMD_MSB1245_LoadDSPCodeToSram();
5084*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
5085*53ee8cc1Swenshuai.xi     return bRet;
5086*53ee8cc1Swenshuai.xi 
5087*53ee8cc1Swenshuai.xi }
5088*53ee8cc1Swenshuai.xi 
5089*53ee8cc1Swenshuai.xi 
5090*53ee8cc1Swenshuai.xi 
5091*53ee8cc1Swenshuai.xi 
5092