xref: /utopia/UTPA2-700.0.x/modules/demodulator/drv/dvb_extdemod/drvDMD_EXTERN_MSB123xc.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_MSB123xc.h"
119*53ee8cc1Swenshuai.xi #include "include/drvDMD_common.h"
120*53ee8cc1Swenshuai.xi #include "include/drvSAR.h"
121*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
122*53ee8cc1Swenshuai.xi //  Driver Compiler Options
123*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
124*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
125*53ee8cc1Swenshuai.xi #define ERR_DOMOD_MSB(x)     x
126*53ee8cc1Swenshuai.xi #define DBG_DOMOD_MSB(x)      x
127*53ee8cc1Swenshuai.xi #define DBG_DOMOD_FLOW(x)     x
128*53ee8cc1Swenshuai.xi #define DBG_GET_SIGNAL(x)      // x
129*53ee8cc1Swenshuai.xi #define DBG_DEMOD_LOAD_I2C(x)       x
130*53ee8cc1Swenshuai.xi #define DBG_DEMOD_CHECKSUM(x)        // x
131*53ee8cc1Swenshuai.xi #define DBG_FLASH_WP(x)        // x
132*53ee8cc1Swenshuai.xi #endif
133*53ee8cc1Swenshuai.xi 
134*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
135*53ee8cc1Swenshuai.xi //  Local Defines
136*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
137*53ee8cc1Swenshuai.xi #define LOAD_CODE_I2C_BLOCK_NUM          0x80
138*53ee8cc1Swenshuai.xi #define REG_MB_CNTL     0x0C00
139*53ee8cc1Swenshuai.xi #define REG_MB_ADDR_L   0x0C02
140*53ee8cc1Swenshuai.xi #define REG_MB_ADDR_H   0x0C03
141*53ee8cc1Swenshuai.xi #define REG_MB_DATA     0x0C04
142*53ee8cc1Swenshuai.xi 
143*53ee8cc1Swenshuai.xi #define resetDemodTime  50
144*53ee8cc1Swenshuai.xi #define waitFlashTime   50
145*53ee8cc1Swenshuai.xi 
146*53ee8cc1Swenshuai.xi #define SDRAM_DATA_CHECK                 0//1
147*53ee8cc1Swenshuai.xi #define SDRAM_BASE                       0x5000
148*53ee8cc1Swenshuai.xi #define SDRAM_WINDOW_SIZE       0x1000
149*53ee8cc1Swenshuai.xi #define SPI_DEVICE_BUFFER_SIZE           256
150*53ee8cc1Swenshuai.xi #define MAX_MSB123xc_LIB_LEN              131072
151*53ee8cc1Swenshuai.xi 
152*53ee8cc1Swenshuai.xi #define MSB123xc_BOOT  0x01
153*53ee8cc1Swenshuai.xi #define MSB123xc_DVBT2 0x02
154*53ee8cc1Swenshuai.xi #define MSB123xc_DVBT  0x04
155*53ee8cc1Swenshuai.xi #define MSB123xc_DVBC  0x08
156*53ee8cc1Swenshuai.xi #define MSB123xc_ALL   0x0F
157*53ee8cc1Swenshuai.xi 
158*53ee8cc1Swenshuai.xi #define EDINBURGH_BOOT_START_ADDR     0x00000
159*53ee8cc1Swenshuai.xi #define EDINBURGH_BOOT_END_ADDR       0x00FFF
160*53ee8cc1Swenshuai.xi #define EDINBURGH_DVBT2_P1_START_ADDR 0x01000
161*53ee8cc1Swenshuai.xi #define EDINBURGH_DVBT2_P1_END_ADDR   0x08FFF
162*53ee8cc1Swenshuai.xi #define EDINBURGH_DVBT2_P2_START_ADDR 0x09000
163*53ee8cc1Swenshuai.xi #define EDINBURGH_DVBT2_P2_END_ADDR   0x0FFFF
164*53ee8cc1Swenshuai.xi #define EDINBURGH_DVBT_START_ADDR     0x10000
165*53ee8cc1Swenshuai.xi #define EDINBURGH_DVBT_END_ADDR       0x17FFF
166*53ee8cc1Swenshuai.xi #define EDINBURGH_DVBC_START_ADDR     0x18000
167*53ee8cc1Swenshuai.xi #define EDINBURGH_DVBC_END_ADDR       0x1FFFF
168*53ee8cc1Swenshuai.xi 
169*53ee8cc1Swenshuai.xi #define EDINBURGH_WINDOWS_BASE                0x100
170*53ee8cc1Swenshuai.xi #define EDINBURGH_BOOT_WINDOWS_OFFSET         EDINBURGH_WINDOWS_BASE
171*53ee8cc1Swenshuai.xi #define EDINBURGH_DVBT2_P2_WINDOWS_OFFSET    (EDINBURGH_WINDOWS_BASE + 0x08)
172*53ee8cc1Swenshuai.xi #define EDINBURGH_DVBT2_P1_WINDOWS_OFFSET    (EDINBURGH_DVBT2_P2_WINDOWS_OFFSET + 0x08)
173*53ee8cc1Swenshuai.xi #define EDINBURGH_DVBT_WINDOWS_OFFSET        (EDINBURGH_DVBT2_P1_WINDOWS_OFFSET + 0x08)
174*53ee8cc1Swenshuai.xi #define EDINBURGH_DVBC_WINDOWS_OFFSET        (EDINBURGH_DVBT_WINDOWS_OFFSET + 0x08)
175*53ee8cc1Swenshuai.xi 
176*53ee8cc1Swenshuai.xi #define    MSB123xc_MAX_FLASH_ON_RETRY_NUM 3
177*53ee8cc1Swenshuai.xi 
178*53ee8cc1Swenshuai.xi 
179*53ee8cc1Swenshuai.xi /////////////// CONSTANT /////////////////
180*53ee8cc1Swenshuai.xi #define PAGE_WRITE_SIZE         256
181*53ee8cc1Swenshuai.xi #define VERSION_CODE_ADDR       0xFC0
182*53ee8cc1Swenshuai.xi #define VERSION_CODE_SIZE       32
183*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
184*53ee8cc1Swenshuai.xi //  Local Structurs
185*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
186*53ee8cc1Swenshuai.xi 
187*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
188*53ee8cc1Swenshuai.xi //  Global Variables
189*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
190*53ee8cc1Swenshuai.xi #define DMD_LOCK()      \
191*53ee8cc1Swenshuai.xi     do{                         \
192*53ee8cc1Swenshuai.xi         MS_ASSERT(MsOS_In_Interrupt() == FALSE); \
193*53ee8cc1Swenshuai.xi         if (eDMD_MSB123xc_DbgLevel == E_DMD_MSB123xc_DBGLV_DEBUG) printf("%s lock mutex\n", __FUNCTION__);\
194*53ee8cc1Swenshuai.xi         MsOS_ObtainMutex(_s32DMD_Mutex, MSOS_WAIT_FOREVER);\
195*53ee8cc1Swenshuai.xi         }while(0)
196*53ee8cc1Swenshuai.xi 
197*53ee8cc1Swenshuai.xi #define DMD_UNLOCK()      \
198*53ee8cc1Swenshuai.xi     do{                         \
199*53ee8cc1Swenshuai.xi         MsOS_ReleaseMutex(_s32DMD_Mutex);\
200*53ee8cc1Swenshuai.xi         if (eDMD_MSB123xc_DbgLevel == E_DMD_MSB123xc_DBGLV_DEBUG) printf("%s unlock mutex\n", __FUNCTION__); \
201*53ee8cc1Swenshuai.xi         }while(0)
202*53ee8cc1Swenshuai.xi 
203*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
204*53ee8cc1Swenshuai.xi //  Local Variables
205*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
206*53ee8cc1Swenshuai.xi #if 1
207*53ee8cc1Swenshuai.xi static MSIF_Version _drv_dmd_msb123xc_extern_version =
208*53ee8cc1Swenshuai.xi {
209*53ee8cc1Swenshuai.xi     .MW = { DMD_MSB123xc_EXTERN_VER, },
210*53ee8cc1Swenshuai.xi };
211*53ee8cc1Swenshuai.xi #else
212*53ee8cc1Swenshuai.xi static MSIF_Version _drv_dmd_msb123x_extern_version;
213*53ee8cc1Swenshuai.xi #endif
214*53ee8cc1Swenshuai.xi static MS_BOOL bDMD_MSB123xc_Power_init_en = FALSE;
215*53ee8cc1Swenshuai.xi static MS_U8 u8DMD_MSB123xc_PowerOnInitialization_Flow = 0;
216*53ee8cc1Swenshuai.xi static MS_U8 u8DMD_MSB123xc_Sdram_Code = 0x0;
217*53ee8cc1Swenshuai.xi static MS_U8 u8DMD_MSB123xc_Sram_Code  = 0x0;
218*53ee8cc1Swenshuai.xi static sDMD_MSB123xc_InitData _sDMD_MSB123xc_InitData;
219*53ee8cc1Swenshuai.xi static eDMD_MSB123xc_DbgLv eDMD_MSB123xc_DbgLevel=E_DMD_MSB123xc_DBGLV_NONE;
220*53ee8cc1Swenshuai.xi static eDMD_MSB123xc_DemodulatorType  eDMD_MSB123xc_CurrentDemodulatorType=E_DMD_MSB123xc_DEMOD_DVBT;
221*53ee8cc1Swenshuai.xi static MS_S32 _s32DMD_Mutex=-1;
222*53ee8cc1Swenshuai.xi static MS_BOOL bDemodRest = TRUE;
223*53ee8cc1Swenshuai.xi 
224*53ee8cc1Swenshuai.xi MS_U8 MSB123xc_LIB[]=
225*53ee8cc1Swenshuai.xi {
226*53ee8cc1Swenshuai.xi #include "msb123xc_dvbt.dat"
227*53ee8cc1Swenshuai.xi };
228*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------- for DVB-T
229*53ee8cc1Swenshuai.xi //operation
230*53ee8cc1Swenshuai.xi #define RFAGC_EN                0x00
231*53ee8cc1Swenshuai.xi #define HUMDET_EN               0x00
232*53ee8cc1Swenshuai.xi #define DCR_EN                  0x01
233*53ee8cc1Swenshuai.xi #define IIS_EN                  0x01
234*53ee8cc1Swenshuai.xi #define CCI_EN                  0x01
235*53ee8cc1Swenshuai.xi #define ACI_EN                  0x01
236*53ee8cc1Swenshuai.xi #define IQB_EN                  0x00
237*53ee8cc1Swenshuai.xi #define AUTO_IQ_SWAP            0x01
238*53ee8cc1Swenshuai.xi #define AUTO_RFMAX              0x00
239*53ee8cc1Swenshuai.xi #define AUTO_ACI                0x00
240*53ee8cc1Swenshuai.xi #define MODE_CP_FORCED          0x00
241*53ee8cc1Swenshuai.xi #define TPS_FORCED              0x00
242*53ee8cc1Swenshuai.xi #define AUTO_SCAN               0x00
243*53ee8cc1Swenshuai.xi #define RSV_0D                  0x00
244*53ee8cc1Swenshuai.xi #define RSV_0E                  0x00
245*53ee8cc1Swenshuai.xi #define RSV_0F                  0x00
246*53ee8cc1Swenshuai.xi 
247*53ee8cc1Swenshuai.xi //configure
248*53ee8cc1Swenshuai.xi #define RSSI                    0x00
249*53ee8cc1Swenshuai.xi #define ZIF                     0x00
250*53ee8cc1Swenshuai.xi #define FREQ                    0x00
251*53ee8cc1Swenshuai.xi #define FC_L                    0x88
252*53ee8cc1Swenshuai.xi #define FC_H                    0x13
253*53ee8cc1Swenshuai.xi #define FS_L                    0x80
254*53ee8cc1Swenshuai.xi #define FS_H                    0x70
255*53ee8cc1Swenshuai.xi #define BW                      0x03
256*53ee8cc1Swenshuai.xi #define MODE                    0x01
257*53ee8cc1Swenshuai.xi #define CP                      0x03
258*53ee8cc1Swenshuai.xi #define LP_SEL                  0x00
259*53ee8cc1Swenshuai.xi #define CSTL                    0x00
260*53ee8cc1Swenshuai.xi #define HIER                    0x00
261*53ee8cc1Swenshuai.xi #define HPCR                    0x00
262*53ee8cc1Swenshuai.xi #define LPCR                    0x00
263*53ee8cc1Swenshuai.xi #define IQ_SWAP                 0x00
264*53ee8cc1Swenshuai.xi #define RFMAX                   0x01
265*53ee8cc1Swenshuai.xi #define ATV_SYSTEM              0x01
266*53ee8cc1Swenshuai.xi #define ICFO_RANGE              0x01
267*53ee8cc1Swenshuai.xi #define RFAGC_REF               0x64
268*53ee8cc1Swenshuai.xi #define IFAGC_REF_2K            0x4B
269*53ee8cc1Swenshuai.xi #define IFAGC_REF_8K            0x4B
270*53ee8cc1Swenshuai.xi #define IFAGC_REF_ACI           0x4B
271*53ee8cc1Swenshuai.xi #define IFAGC_REF_IIS_2K        0xA0
272*53ee8cc1Swenshuai.xi #define IFAGC_REF_IIS_8K        0xA0
273*53ee8cc1Swenshuai.xi #define IFAGC_ACI_DET_TH_L      0x9A
274*53ee8cc1Swenshuai.xi #define IFAGC_ACI_DET_TH_H      0x01
275*53ee8cc1Swenshuai.xi #define SERIAL_TS               0x00
276*53ee8cc1Swenshuai.xi #define TS_CLK_SEL              0x06
277*53ee8cc1Swenshuai.xi #define TS_OUT_INV              0x01
278*53ee8cc1Swenshuai.xi #define TS_DATA_SWAP            0x00
279*53ee8cc1Swenshuai.xi #define SFO_2K_H                0x00
280*53ee8cc1Swenshuai.xi #define SFO_2K_L                0xC8
281*53ee8cc1Swenshuai.xi #define SFO_8K_H                0x00
282*53ee8cc1Swenshuai.xi #define SFO_8K_L                0xC8
283*53ee8cc1Swenshuai.xi #define CHECK_CHANNEL           0x00
284*53ee8cc1Swenshuai.xi #define SNR_POS                 0x00
285*53ee8cc1Swenshuai.xi #define CCI_KP                  0x00
286*53ee8cc1Swenshuai.xi #define CCI_FSWEEP              0x00
287*53ee8cc1Swenshuai.xi #define TS_CLK_RATE_AUTO        0x00
288*53ee8cc1Swenshuai.xi #define DVBT_IF_INV_PWM_OUT_EN  0x00
289*53ee8cc1Swenshuai.xi #define DVBT_CRC                0x00
290*53ee8cc1Swenshuai.xi 
291*53ee8cc1Swenshuai.xi 
292*53ee8cc1Swenshuai.xi MS_U8 MSB123xc_DVBT_DSPREG_TABLE[] = // andy 2009-12-15  3:55:03 TW model
293*53ee8cc1Swenshuai.xi {
294*53ee8cc1Swenshuai.xi     RFAGC_EN,     HUMDET_EN,    DCR_EN,     IIS_EN,         CCI_EN,      ACI_EN,
295*53ee8cc1Swenshuai.xi     IQB_EN,       AUTO_IQ_SWAP, AUTO_RFMAX, AUTO_ACI,       MODE_CP_FORCED, TPS_FORCED,
296*53ee8cc1Swenshuai.xi     AUTO_SCAN,    RSV_0D,       RSV_0E,     RSV_0F,
297*53ee8cc1Swenshuai.xi     RSSI,         ZIF,          FREQ,       FC_L,           FC_H,        FS_L,      FS_H,
298*53ee8cc1Swenshuai.xi     BW,           MODE,         CP,         LP_SEL,         CSTL,        HIER,      HPCR,
299*53ee8cc1Swenshuai.xi     LPCR,         IQ_SWAP,      RFMAX,      ATV_SYSTEM,     ICFO_RANGE,  RFAGC_REF,
300*53ee8cc1Swenshuai.xi     IFAGC_REF_2K, IFAGC_REF_8K, IFAGC_REF_ACI,  IFAGC_REF_IIS_2K,  IFAGC_REF_IIS_8K, IFAGC_ACI_DET_TH_L,
301*53ee8cc1Swenshuai.xi     IFAGC_ACI_DET_TH_H,         SERIAL_TS,  TS_CLK_SEL,  TS_OUT_INV,  TS_DATA_SWAP,
302*53ee8cc1Swenshuai.xi     SFO_2K_H,     SFO_2K_L,     SFO_8K_H,   SFO_8K_L,       CHECK_CHANNEL,          SNR_POS,
303*53ee8cc1Swenshuai.xi     CCI_KP,       CCI_FSWEEP    , TS_CLK_RATE_AUTO, DVBT_IF_INV_PWM_OUT_EN, DVBT_CRC
304*53ee8cc1Swenshuai.xi };
305*53ee8cc1Swenshuai.xi 
306*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------- for DVB-C
307*53ee8cc1Swenshuai.xi #define SR0_H_AUTO              0x0F
308*53ee8cc1Swenshuai.xi #define SR0_L_AUTO              0xA0
309*53ee8cc1Swenshuai.xi #define SR0_H                   0x1A
310*53ee8cc1Swenshuai.xi #define SR0_L                   0xDB
311*53ee8cc1Swenshuai.xi /*
312*53ee8cc1Swenshuai.xi #define REAGC_EN                0x00 //0x20
313*53ee8cc1Swenshuai.xi #define HUMDET_EN_C             0x00
314*53ee8cc1Swenshuai.xi #define DCR_EN                  0x01
315*53ee8cc1Swenshuai.xi #define IQB_EN                  0x00
316*53ee8cc1Swenshuai.xi #define AUTO_IQ                 0x01
317*53ee8cc1Swenshuai.xi #define AUTO_RFMAX              0x00
318*53ee8cc1Swenshuai.xi #define AUTO_ACI                0x01
319*53ee8cc1Swenshuai.xi */
320*53ee8cc1Swenshuai.xi #define AUTO_SCAN               0x00
321*53ee8cc1Swenshuai.xi #define AUTO_SCAN_SYM_RATE      0x00 //0x28
322*53ee8cc1Swenshuai.xi #define AUTO_SCAN_QAM           0x00
323*53ee8cc1Swenshuai.xi #define ATV_DET_EN              0x01 //0x2A
324*53ee8cc1Swenshuai.xi /*
325*53ee8cc1Swenshuai.xi #define RSV_0B                  0x00
326*53ee8cc1Swenshuai.xi #define RSV_0C                  0x00
327*53ee8cc1Swenshuai.xi #define RSV_0D                  0x00
328*53ee8cc1Swenshuai.xi #define RSV_0E                  0x00
329*53ee8cc1Swenshuai.xi #define RSV_0F                  0x00
330*53ee8cc1Swenshuai.xi */
331*53ee8cc1Swenshuai.xi #define RSSI                    0x00 //0x30
332*53ee8cc1Swenshuai.xi //#define ZIF                     0x00
333*53ee8cc1Swenshuai.xi #define FREQ                    0x00
334*53ee8cc1Swenshuai.xi //#define FC_L                    0xE0
335*53ee8cc1Swenshuai.xi //#define FC_H                    0x2E
336*53ee8cc1Swenshuai.xi //#define FS_L                    0x80
337*53ee8cc1Swenshuai.xi //#define FS_H                    0xBB
338*53ee8cc1Swenshuai.xi #define BW_L                    0xDB
339*53ee8cc1Swenshuai.xi #define BW_H                    0x1A
340*53ee8cc1Swenshuai.xi #define BW1_L                   0xF4
341*53ee8cc1Swenshuai.xi #define BW1_H                   0x1A
342*53ee8cc1Swenshuai.xi #define BW2_L                   0xDB
343*53ee8cc1Swenshuai.xi #define BW2_H                   0x1A
344*53ee8cc1Swenshuai.xi #define BW3_L                   0xDB
345*53ee8cc1Swenshuai.xi #define BW3_H                   0x1A
346*53ee8cc1Swenshuai.xi //#define RSV_0x1F              0x00
347*53ee8cc1Swenshuai.xi //#define RFMAX                 0x00 //0x40
348*53ee8cc1Swenshuai.xi #define QAM                     0x02
349*53ee8cc1Swenshuai.xi #define IQ_SWAP_C               0x01
350*53ee8cc1Swenshuai.xi #define CCI                     0x00
351*53ee8cc1Swenshuai.xi #define SERIAL_TS               0x00 //0: parallel 1:serial
352*53ee8cc1Swenshuai.xi //#define TS_SERIAL_CLK           0x05
353*53ee8cc1Swenshuai.xi #define TS_OUT_INV              0x01 //
354*53ee8cc1Swenshuai.xi #define TS_DATA_SWAP            0x00
355*53ee8cc1Swenshuai.xi 
356*53ee8cc1Swenshuai.xi MS_U8 MSB123xc_DVBC_DSPREG_TABLE[] =
357*53ee8cc1Swenshuai.xi {
358*53ee8cc1Swenshuai.xi     00,     00,     01,     00,     01,     00,     01,       AUTO_SCAN,
359*53ee8cc1Swenshuai.xi     AUTO_SCAN_SYM_RATE, AUTO_SCAN_QAM,  ATV_DET_EN,     00,     00,     00,     00,     00,
360*53ee8cc1Swenshuai.xi     00,     00,     00,     FC_L,           FC_H,           FS_L,           FS_H,
361*53ee8cc1Swenshuai.xi     BW_L,       BW_H,       BW1_L,      BW1_H,      BW2_L,      BW2_H,      BW3_L,      BW3_H,      00,
362*53ee8cc1Swenshuai.xi     00,     QAM,        IQ_SWAP_C,      CCI,        SERIAL_TS,      05,
363*53ee8cc1Swenshuai.xi     TS_OUT_INV,     TS_DATA_SWAP
364*53ee8cc1Swenshuai.xi };
365*53ee8cc1Swenshuai.xi 
366*53ee8cc1Swenshuai.xi //configure
367*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------- for DVB-T2
368*53ee8cc1Swenshuai.xi // BW: 0->1.7M, 1->5M, 2->6M, 3->7M, 4->8M, 5->10M
369*53ee8cc1Swenshuai.xi #define T2_BW_VAL               0x04
370*53ee8cc1Swenshuai.xi 
371*53ee8cc1Swenshuai.xi // FC: FC = FS = 4800 = 0x12C0     (4.80MHz IF)
372*53ee8cc1Swenshuai.xi #define T2_FC_L_VAL            0xC0    // 4.80M
373*53ee8cc1Swenshuai.xi #define T2_FC_H_VAL            0x12
374*53ee8cc1Swenshuai.xi #define T2_TS_SERIAL_VAL        0x00
375*53ee8cc1Swenshuai.xi #define T2_TS_CLK_RATE_VAL      0x06
376*53ee8cc1Swenshuai.xi #define T2_TS_OUT_INV_VAL       0x01
377*53ee8cc1Swenshuai.xi #define T2_TS_DATA_SWAP_VAL     0x00
378*53ee8cc1Swenshuai.xi #define T2_TS_ERR_POL_VAL       0x00
379*53ee8cc1Swenshuai.xi 
380*53ee8cc1Swenshuai.xi MS_U8 MSB123xc_DVBT2_DSPREG_TABLE[] =
381*53ee8cc1Swenshuai.xi {
382*53ee8cc1Swenshuai.xi     T2_BW_VAL, T2_FC_L_VAL, T2_FC_H_VAL,  T2_TS_SERIAL_VAL, T2_TS_CLK_RATE_VAL,
383*53ee8cc1Swenshuai.xi     T2_TS_OUT_INV_VAL, T2_TS_DATA_SWAP_VAL, T2_TS_ERR_POL_VAL
384*53ee8cc1Swenshuai.xi };
385*53ee8cc1Swenshuai.xi 
386*53ee8cc1Swenshuai.xi 
387*53ee8cc1Swenshuai.xi 
388*53ee8cc1Swenshuai.xi 
389*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
390*53ee8cc1Swenshuai.xi //  Debug Functions
391*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
392*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
393*53ee8cc1Swenshuai.xi #define DMD_DBG(x)          (x)
394*53ee8cc1Swenshuai.xi #else
395*53ee8cc1Swenshuai.xi #define DMD_DBG(x)          //(x)
396*53ee8cc1Swenshuai.xi #endif
397*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
398*53ee8cc1Swenshuai.xi //  Local Functions
399*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
400*53ee8cc1Swenshuai.xi 
401*53ee8cc1Swenshuai.xi 
402*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
403*53ee8cc1Swenshuai.xi //  Global Functions
404*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_DMD_MSB123xc_Init(sDMD_MSB123xc_InitData * pDMD_MSB123xc_InitData,MS_U32 u32InitDataLen)405*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB123xc_Init(sDMD_MSB123xc_InitData *pDMD_MSB123xc_InitData, MS_U32 u32InitDataLen)
406*53ee8cc1Swenshuai.xi {
407*53ee8cc1Swenshuai.xi     //char pDMD_MSB123xc_MutexString[16], pDMD_MSB123xc_MutexString_RegRW[16], pDMD_MSB123xc_MutexString_DSPRegRW[16];
408*53ee8cc1Swenshuai.xi     char pDMD_MSB123xc_MutexString[16];
409*53ee8cc1Swenshuai.xi 
410*53ee8cc1Swenshuai.xi     if (_s32DMD_Mutex != -1)
411*53ee8cc1Swenshuai.xi     {
412*53ee8cc1Swenshuai.xi         DMD_DBG(printf("MDrv_DMD_MSB123xc_Init more than once\n"));
413*53ee8cc1Swenshuai.xi         return FALSE;
414*53ee8cc1Swenshuai.xi     }
415*53ee8cc1Swenshuai.xi 
416*53ee8cc1Swenshuai.xi     if (NULL == strncpy(pDMD_MSB123xc_MutexString,"Mutex DMD DVB",16))
417*53ee8cc1Swenshuai.xi     {
418*53ee8cc1Swenshuai.xi         DMD_DBG(printf("MDrv_DMD_MSB123xc_Init strcpy Fail\n"));
419*53ee8cc1Swenshuai.xi         return FALSE;
420*53ee8cc1Swenshuai.xi     }
421*53ee8cc1Swenshuai.xi     _s32DMD_Mutex = MsOS_CreateMutex(E_MSOS_FIFO, pDMD_MSB123xc_MutexString, MSOS_PROCESS_SHARED);
422*53ee8cc1Swenshuai.xi     if (_s32DMD_Mutex == -1)
423*53ee8cc1Swenshuai.xi     {
424*53ee8cc1Swenshuai.xi         DMD_DBG(printf("MDrv_DMD_MSB123xc_Init Create Mutex Fail\n"));
425*53ee8cc1Swenshuai.xi         return FALSE;
426*53ee8cc1Swenshuai.xi     }
427*53ee8cc1Swenshuai.xi 
428*53ee8cc1Swenshuai.xi     DMD_LOCK();
429*53ee8cc1Swenshuai.xi     if ( sizeof(_sDMD_MSB123xc_InitData) == u32InitDataLen)
430*53ee8cc1Swenshuai.xi     {
431*53ee8cc1Swenshuai.xi         memcpy(&_sDMD_MSB123xc_InitData, pDMD_MSB123xc_InitData, u32InitDataLen);
432*53ee8cc1Swenshuai.xi     }
433*53ee8cc1Swenshuai.xi     else
434*53ee8cc1Swenshuai.xi     {
435*53ee8cc1Swenshuai.xi         DMD_DBG(printf("MDrv_DMD_MSB123xc_Init input data structure incorrect\n"));
436*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
437*53ee8cc1Swenshuai.xi         return FALSE;
438*53ee8cc1Swenshuai.xi     }
439*53ee8cc1Swenshuai.xi 
440*53ee8cc1Swenshuai.xi     if (_sDMD_MSB123xc_InitData.pDVBC_DSP_REG!= NULL)
441*53ee8cc1Swenshuai.xi     {
442*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB123xc_Init Init DVBC DSP Table By Device Driver ... \n");
443*53ee8cc1Swenshuai.xi 
444*53ee8cc1Swenshuai.xi         memcpy (&MSB123xc_DVBC_DSPREG_TABLE[0],_sDMD_MSB123xc_InitData.pDVBC_DSP_REG ,sizeof(MSB123xc_DVBC_DSPREG_TABLE));
445*53ee8cc1Swenshuai.xi     }
446*53ee8cc1Swenshuai.xi     else
447*53ee8cc1Swenshuai.xi     {
448*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB123xc_Init Init DVBC DSP Table By Device Driver ... \n");
449*53ee8cc1Swenshuai.xi     }
450*53ee8cc1Swenshuai.xi 
451*53ee8cc1Swenshuai.xi     if (_sDMD_MSB123xc_InitData.pDVBT_DSP_REG!= NULL)
452*53ee8cc1Swenshuai.xi     {
453*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB123xc_Init Init DVBT DSP Table By Device Driver ... \n");
454*53ee8cc1Swenshuai.xi 
455*53ee8cc1Swenshuai.xi         memcpy (&MSB123xc_DVBT_DSPREG_TABLE[0],_sDMD_MSB123xc_InitData.pDVBT_DSP_REG ,sizeof(MSB123xc_DVBT_DSPREG_TABLE));
456*53ee8cc1Swenshuai.xi     }
457*53ee8cc1Swenshuai.xi     else
458*53ee8cc1Swenshuai.xi     {
459*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB123xc_Init Init DVBT DSP Table By Device Driver ... \n");
460*53ee8cc1Swenshuai.xi     }
461*53ee8cc1Swenshuai.xi 
462*53ee8cc1Swenshuai.xi     if (_sDMD_MSB123xc_InitData.pDVBT2_DSP_REG!= NULL)
463*53ee8cc1Swenshuai.xi     {
464*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB123xc_Init Init DVBT2 DSP Table By Device Driver ... \n");
465*53ee8cc1Swenshuai.xi 
466*53ee8cc1Swenshuai.xi         memcpy (&MSB123xc_DVBT2_DSPREG_TABLE[0],_sDMD_MSB123xc_InitData.pDVBT2_DSP_REG ,sizeof(MSB123xc_DVBT2_DSPREG_TABLE));
467*53ee8cc1Swenshuai.xi     }
468*53ee8cc1Swenshuai.xi     else
469*53ee8cc1Swenshuai.xi     {
470*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB123xc_Init Init DVBT2 DSP Table By Device Driver ... \n");
471*53ee8cc1Swenshuai.xi     }
472*53ee8cc1Swenshuai.xi 
473*53ee8cc1Swenshuai.xi     if (_sDMD_MSB123xc_InitData.bEnableSPILoadCode && _sDMD_MSB123xc_InitData.fpMSB123xc_SPIPAD_En != NULL)
474*53ee8cc1Swenshuai.xi     {
475*53ee8cc1Swenshuai.xi         if (!MDrv_DMD_SSPI_Init(0))
476*53ee8cc1Swenshuai.xi         {
477*53ee8cc1Swenshuai.xi             printf("MDrv_DMD_MSB123xc_Init Init MDrv_DMD_SSPI_Init Fail \n");
478*53ee8cc1Swenshuai.xi         }
479*53ee8cc1Swenshuai.xi     }
480*53ee8cc1Swenshuai.xi     else
481*53ee8cc1Swenshuai.xi     {
482*53ee8cc1Swenshuai.xi         _sDMD_MSB123xc_InitData.bEnableSPILoadCode = FALSE;
483*53ee8cc1Swenshuai.xi     }
484*53ee8cc1Swenshuai.xi 
485*53ee8cc1Swenshuai.xi     //eDMD_MSB123xc_DbgLevel = E_DMD_MSB123xc_DBGLV_DEBUG;
486*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
487*53ee8cc1Swenshuai.xi     if (eDMD_MSB123xc_DbgLevel >= E_DMD_MSB123xc_DBGLV_INFO)
488*53ee8cc1Swenshuai.xi     {
489*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB123xc_Init\n");
490*53ee8cc1Swenshuai.xi     }
491*53ee8cc1Swenshuai.xi #endif
492*53ee8cc1Swenshuai.xi 
493*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
494*53ee8cc1Swenshuai.xi     return TRUE;
495*53ee8cc1Swenshuai.xi }
496*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB123xc_Exit(void)497*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB123xc_Exit(void)
498*53ee8cc1Swenshuai.xi {
499*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
500*53ee8cc1Swenshuai.xi     if (eDMD_MSB123xc_DbgLevel >= E_DMD_MSB123xc_DBGLV_DEBUG)
501*53ee8cc1Swenshuai.xi     {
502*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB123xc_Exit \n");
503*53ee8cc1Swenshuai.xi     }
504*53ee8cc1Swenshuai.xi #endif
505*53ee8cc1Swenshuai.xi 
506*53ee8cc1Swenshuai.xi     MsOS_DeleteMutex(_s32DMD_Mutex);
507*53ee8cc1Swenshuai.xi     //MsOS_DeleteMutex(_s32DMD_Mutex_Reg_RW);
508*53ee8cc1Swenshuai.xi     //MsOS_DeleteMutex(_s32DMD_Mutex_DSPReg_RW);
509*53ee8cc1Swenshuai.xi     _s32DMD_Mutex= -1;
510*53ee8cc1Swenshuai.xi     //_s32DMD_Mutex_Reg_RW= -1;
511*53ee8cc1Swenshuai.xi     //_s32DMD_Mutex_DSPReg_RW= -1;
512*53ee8cc1Swenshuai.xi 
513*53ee8cc1Swenshuai.xi     bDMD_MSB123xc_Power_init_en = FALSE;
514*53ee8cc1Swenshuai.xi     u8DMD_MSB123xc_PowerOnInitialization_Flow = 0;
515*53ee8cc1Swenshuai.xi     u8DMD_MSB123xc_Sdram_Code = 0x0;
516*53ee8cc1Swenshuai.xi     u8DMD_MSB123xc_Sram_Code  = 0x0;
517*53ee8cc1Swenshuai.xi     bDemodRest = TRUE;
518*53ee8cc1Swenshuai.xi 
519*53ee8cc1Swenshuai.xi     return TRUE;
520*53ee8cc1Swenshuai.xi }
521*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB123xc_SetDbgLevel(eDMD_MSB123xc_DbgLv u8DbgLevel)522*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB123xc_SetDbgLevel(eDMD_MSB123xc_DbgLv u8DbgLevel)
523*53ee8cc1Swenshuai.xi {
524*53ee8cc1Swenshuai.xi     DMD_LOCK();
525*53ee8cc1Swenshuai.xi     eDMD_MSB123xc_DbgLevel = u8DbgLevel;
526*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
527*53ee8cc1Swenshuai.xi     return TRUE;
528*53ee8cc1Swenshuai.xi }
529*53ee8cc1Swenshuai.xi 
530*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB123xc_GetLibVer(const MSIF_Version ** ppVersion)531*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB123xc_GetLibVer(const MSIF_Version **ppVersion)
532*53ee8cc1Swenshuai.xi {
533*53ee8cc1Swenshuai.xi     DMD_LOCK();
534*53ee8cc1Swenshuai.xi     if (!ppVersion)
535*53ee8cc1Swenshuai.xi     {
536*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
537*53ee8cc1Swenshuai.xi         return FALSE;
538*53ee8cc1Swenshuai.xi     }
539*53ee8cc1Swenshuai.xi 
540*53ee8cc1Swenshuai.xi     *ppVersion = &_drv_dmd_msb123xc_extern_version;
541*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
542*53ee8cc1Swenshuai.xi     return TRUE;
543*53ee8cc1Swenshuai.xi }
544*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB123xc_GetFWVer(MS_U16 * ver)545*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB123xc_GetFWVer(MS_U16 *ver)
546*53ee8cc1Swenshuai.xi {
547*53ee8cc1Swenshuai.xi 
548*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
549*53ee8cc1Swenshuai.xi 
550*53ee8cc1Swenshuai.xi     DMD_LOCK();
551*53ee8cc1Swenshuai.xi     //printf("MDrv_DMD_DVBT_GetFWVer %x\n",*ver);
552*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
553*53ee8cc1Swenshuai.xi 
554*53ee8cc1Swenshuai.xi     return bRet;
555*53ee8cc1Swenshuai.xi 
556*53ee8cc1Swenshuai.xi }
557*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB123xc_GetReg(MS_U16 u16Addr,MS_U8 * pu8Data)558*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMD_MSB123xc_GetReg(MS_U16 u16Addr, MS_U8 *pu8Data)
559*53ee8cc1Swenshuai.xi {
560*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
561*53ee8cc1Swenshuai.xi     MS_U8 u8MsbData[6];
562*53ee8cc1Swenshuai.xi 
563*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
564*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
565*53ee8cc1Swenshuai.xi     u8MsbData[2] = 0x00;
566*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u16Addr >> 8) &0xff;
567*53ee8cc1Swenshuai.xi     u8MsbData[4] = u16Addr & 0xff;
568*53ee8cc1Swenshuai.xi 
569*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x35;
570*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
571*53ee8cc1Swenshuai.xi 
572*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
573*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8MsbData);
574*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_READ_BYTES, 0, NULL, 1, pu8Data);
575*53ee8cc1Swenshuai.xi 
576*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x34;
577*53ee8cc1Swenshuai.xi     bRet=(*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
578*53ee8cc1Swenshuai.xi 
579*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
580*53ee8cc1Swenshuai.xi     if (eDMD_MSB123xc_DbgLevel >= E_DMD_MSB123xc_DBGLV_DEBUG)
581*53ee8cc1Swenshuai.xi     {
582*53ee8cc1Swenshuai.xi         printf("_MDrv_DMD_MSB123xc_GetReg %x %x\n", u16Addr, *pu8Data);
583*53ee8cc1Swenshuai.xi     }
584*53ee8cc1Swenshuai.xi #endif
585*53ee8cc1Swenshuai.xi 
586*53ee8cc1Swenshuai.xi     return bRet;
587*53ee8cc1Swenshuai.xi }
588*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB123xc_GetReg(MS_U16 u16Addr,MS_U8 * pu8Data)589*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB123xc_GetReg(MS_U16 u16Addr, MS_U8 *pu8Data)
590*53ee8cc1Swenshuai.xi {
591*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
592*53ee8cc1Swenshuai.xi 
593*53ee8cc1Swenshuai.xi     DMD_LOCK();
594*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB123xc_GetReg(u16Addr, pu8Data);
595*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
596*53ee8cc1Swenshuai.xi 
597*53ee8cc1Swenshuai.xi     return bRet;
598*53ee8cc1Swenshuai.xi }
599*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB123xc_SetReg(MS_U16 u16Addr,MS_U8 u8Data)600*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMD_MSB123xc_SetReg(MS_U16 u16Addr, MS_U8 u8Data)
601*53ee8cc1Swenshuai.xi {
602*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
603*53ee8cc1Swenshuai.xi     MS_U8 u8MsbData[6];
604*53ee8cc1Swenshuai.xi 
605*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
606*53ee8cc1Swenshuai.xi     if (eDMD_MSB123xc_DbgLevel >= E_DMD_MSB123xc_DBGLV_DEBUG)
607*53ee8cc1Swenshuai.xi     {
608*53ee8cc1Swenshuai.xi         printf("_MDrv_DMD_MSB123xc_SetReg %x %x\n", u16Addr, u8Data);
609*53ee8cc1Swenshuai.xi     }
610*53ee8cc1Swenshuai.xi #endif
611*53ee8cc1Swenshuai.xi 
612*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
613*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
614*53ee8cc1Swenshuai.xi     u8MsbData[2] = 0x00;
615*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u16Addr >> 8) &0xff;
616*53ee8cc1Swenshuai.xi     u8MsbData[4] = u16Addr &0xff;
617*53ee8cc1Swenshuai.xi     u8MsbData[5] = u8Data;
618*53ee8cc1Swenshuai.xi 
619*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x35;
620*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
621*53ee8cc1Swenshuai.xi 
622*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
623*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 6, u8MsbData);
624*53ee8cc1Swenshuai.xi 
625*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x34;
626*53ee8cc1Swenshuai.xi     bRet=(*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
627*53ee8cc1Swenshuai.xi     return bRet;
628*53ee8cc1Swenshuai.xi }
629*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB123xc_SetReg(MS_U16 u16Addr,MS_U8 u8Data)630*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB123xc_SetReg(MS_U16 u16Addr, MS_U8 u8Data)
631*53ee8cc1Swenshuai.xi {
632*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
633*53ee8cc1Swenshuai.xi 
634*53ee8cc1Swenshuai.xi     DMD_LOCK();
635*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB123xc_SetReg(u16Addr, u8Data);
636*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
637*53ee8cc1Swenshuai.xi 
638*53ee8cc1Swenshuai.xi     return bRet;
639*53ee8cc1Swenshuai.xi }
640*53ee8cc1Swenshuai.xi 
641*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB123xc_SetRegs(MS_U16 u16Addr,MS_U8 * u8pData,MS_U16 data_size)642*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMD_MSB123xc_SetRegs(MS_U16 u16Addr, MS_U8* u8pData, MS_U16 data_size)
643*53ee8cc1Swenshuai.xi {
644*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
645*53ee8cc1Swenshuai.xi     MS_U8   u8MsbDataValue[LOAD_CODE_I2C_BLOCK_NUM + 5];
646*53ee8cc1Swenshuai.xi     MS_U16   idx = 0;
647*53ee8cc1Swenshuai.xi 
648*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
649*53ee8cc1Swenshuai.xi     if (eDMD_MSB123xc_DbgLevel >= E_DMD_MSB123xc_DBGLV_DEBUG)
650*53ee8cc1Swenshuai.xi     {
651*53ee8cc1Swenshuai.xi         printf("_MDrv_DMD_MSB123xc_SetRegs %x %x\n", u16Addr, data_size);
652*53ee8cc1Swenshuai.xi     }
653*53ee8cc1Swenshuai.xi #endif
654*53ee8cc1Swenshuai.xi 
655*53ee8cc1Swenshuai.xi     u8MsbDataValue[0] = 0x10;
656*53ee8cc1Swenshuai.xi     u8MsbDataValue[1] = 0x00;
657*53ee8cc1Swenshuai.xi     u8MsbDataValue[2] = 0x00;
658*53ee8cc1Swenshuai.xi     u8MsbDataValue[3] = (u16Addr >> 8) &0xff;
659*53ee8cc1Swenshuai.xi     u8MsbDataValue[4] = u16Addr & 0xff;
660*53ee8cc1Swenshuai.xi     // u8MsbDataValue[5] = 0x00;
661*53ee8cc1Swenshuai.xi 
662*53ee8cc1Swenshuai.xi     for(idx = 0; idx < data_size ; idx++)
663*53ee8cc1Swenshuai.xi     {
664*53ee8cc1Swenshuai.xi         u8MsbDataValue[5+idx] = u8pData[idx];
665*53ee8cc1Swenshuai.xi     }
666*53ee8cc1Swenshuai.xi 
667*53ee8cc1Swenshuai.xi     u8MsbDataValue[0] = 0x35;
668*53ee8cc1Swenshuai.xi     bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbDataValue);
669*53ee8cc1Swenshuai.xi 
670*53ee8cc1Swenshuai.xi     u8MsbDataValue[0] = 0x10;
671*53ee8cc1Swenshuai.xi     bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5 + data_size, u8MsbDataValue);
672*53ee8cc1Swenshuai.xi 
673*53ee8cc1Swenshuai.xi     u8MsbDataValue[0] = 0x34;
674*53ee8cc1Swenshuai.xi     bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbDataValue);
675*53ee8cc1Swenshuai.xi 
676*53ee8cc1Swenshuai.xi     return bRet;
677*53ee8cc1Swenshuai.xi }
678*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB123xc_SetRegs(MS_U16 u16Addr,MS_U8 * u8pData,MS_U16 data_size)679*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB123xc_SetRegs(MS_U16 u16Addr, MS_U8* u8pData, MS_U16 data_size)
680*53ee8cc1Swenshuai.xi {
681*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
682*53ee8cc1Swenshuai.xi 
683*53ee8cc1Swenshuai.xi     DMD_LOCK();
684*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB123xc_SetRegs(u16Addr, u8pData, data_size);
685*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
686*53ee8cc1Swenshuai.xi 
687*53ee8cc1Swenshuai.xi     return bRet;
688*53ee8cc1Swenshuai.xi }
689*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB123xc_SetReg2Bytes(MS_U16 u16Addr,MS_U16 u16Data)690*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_DMD_MSB123xc_SetReg2Bytes(MS_U16 u16Addr, MS_U16 u16Data)
691*53ee8cc1Swenshuai.xi {
692*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
693*53ee8cc1Swenshuai.xi 
694*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
695*53ee8cc1Swenshuai.xi     if (eDMD_MSB123xc_DbgLevel >= E_DMD_MSB123xc_DBGLV_DEBUG)
696*53ee8cc1Swenshuai.xi     {
697*53ee8cc1Swenshuai.xi         printf("_MDrv_DMD_MSB123xc_SetReg2Bytes %x %x\n", u16Addr, u16Data);
698*53ee8cc1Swenshuai.xi     }
699*53ee8cc1Swenshuai.xi #endif
700*53ee8cc1Swenshuai.xi 
701*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_SetReg(u16Addr, (MS_U8)u16Data&0x00ff);
702*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_SetReg(u16Addr + 0x0001, (MS_U8)(u16Data>>8)&0x00ff);
703*53ee8cc1Swenshuai.xi 
704*53ee8cc1Swenshuai.xi     return bRet;
705*53ee8cc1Swenshuai.xi }
706*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB123xc_SetReg2Bytes(MS_U16 u16Addr,MS_U16 u16Data)707*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB123xc_SetReg2Bytes(MS_U16 u16Addr, MS_U16 u16Data)
708*53ee8cc1Swenshuai.xi {
709*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
710*53ee8cc1Swenshuai.xi 
711*53ee8cc1Swenshuai.xi     DMD_LOCK();
712*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB123xc_SetReg2Bytes(u16Addr, u16Data);
713*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
714*53ee8cc1Swenshuai.xi 
715*53ee8cc1Swenshuai.xi     return bRet;
716*53ee8cc1Swenshuai.xi }
717*53ee8cc1Swenshuai.xi 
718*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB123xc_GetDSPReg(MS_U16 u16Addr,MS_U8 * pu8Data)719*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB123xc_GetDSPReg(MS_U16 u16Addr, MS_U8 *pu8Data)
720*53ee8cc1Swenshuai.xi {
721*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
722*53ee8cc1Swenshuai.xi     MS_U8     u8Cntl = 0x00;
723*53ee8cc1Swenshuai.xi     MS_U16    u16Cntr = 0x00;
724*53ee8cc1Swenshuai.xi 
725*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_SetReg(REG_MB_ADDR_H, (MS_U8)(u16Addr >> 8));
726*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_SetReg(REG_MB_ADDR_L, (MS_U8)(u16Addr));
727*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_SetReg(REG_MB_CNTL, 0x03);
728*53ee8cc1Swenshuai.xi 
729*53ee8cc1Swenshuai.xi     do
730*53ee8cc1Swenshuai.xi     {
731*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_GetReg(REG_MB_CNTL, &u8Cntl);
732*53ee8cc1Swenshuai.xi         if (u16Cntr++ > 0x7ff)
733*53ee8cc1Swenshuai.xi         {
734*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
735*53ee8cc1Swenshuai.xi             if (eDMD_MSB123xc_DbgLevel >= E_DMD_MSB123xc_DBGLV_DEBUG)
736*53ee8cc1Swenshuai.xi             {
737*53ee8cc1Swenshuai.xi                 printf("MSB123xc_MB_READ_FAILURE\n");
738*53ee8cc1Swenshuai.xi             }
739*53ee8cc1Swenshuai.xi #endif
740*53ee8cc1Swenshuai.xi             return FALSE;
741*53ee8cc1Swenshuai.xi         }
742*53ee8cc1Swenshuai.xi     }
743*53ee8cc1Swenshuai.xi     while(u8Cntl != 0xff);
744*53ee8cc1Swenshuai.xi 
745*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_GetReg(REG_MB_DATA, pu8Data);
746*53ee8cc1Swenshuai.xi 
747*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
748*53ee8cc1Swenshuai.xi     if (eDMD_MSB123xc_DbgLevel >= E_DMD_MSB123xc_DBGLV_DEBUG)
749*53ee8cc1Swenshuai.xi     {
750*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB123xc_GetDSPReg %x %x\n", u16Addr, *pu8Data);
751*53ee8cc1Swenshuai.xi     }
752*53ee8cc1Swenshuai.xi #endif
753*53ee8cc1Swenshuai.xi 
754*53ee8cc1Swenshuai.xi     return bRet;
755*53ee8cc1Swenshuai.xi }
756*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB123xc_GetDSPReg(MS_U16 u16Addr,MS_U8 * pu8Data)757*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB123xc_GetDSPReg(MS_U16 u16Addr, MS_U8 *pu8Data)
758*53ee8cc1Swenshuai.xi {
759*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
760*53ee8cc1Swenshuai.xi 
761*53ee8cc1Swenshuai.xi     DMD_LOCK();
762*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB123xc_GetDSPReg(u16Addr, pu8Data);
763*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
764*53ee8cc1Swenshuai.xi 
765*53ee8cc1Swenshuai.xi     return bRet;
766*53ee8cc1Swenshuai.xi }
767*53ee8cc1Swenshuai.xi 
_MDrv_DMD_MSB123xc_SetDSPReg(MS_U16 u16Addr,MS_U8 u8Data)768*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_DMD_MSB123xc_SetDSPReg(MS_U16 u16Addr, MS_U8 u8Data)
769*53ee8cc1Swenshuai.xi {
770*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
771*53ee8cc1Swenshuai.xi     MS_U8     u8Cntl = 0x00;
772*53ee8cc1Swenshuai.xi     MS_U16    u16Cntr = 0x00;
773*53ee8cc1Swenshuai.xi 
774*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
775*53ee8cc1Swenshuai.xi     if (eDMD_MSB123xc_DbgLevel >= E_DMD_MSB123xc_DBGLV_DEBUG)
776*53ee8cc1Swenshuai.xi     {
777*53ee8cc1Swenshuai.xi         printf("MDrv_DMD_MSB123xc_SetDSPReg %x %x\n", u16Addr, u8Data);
778*53ee8cc1Swenshuai.xi     }
779*53ee8cc1Swenshuai.xi #endif
780*53ee8cc1Swenshuai.xi 
781*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_SetReg(REG_MB_DATA, u8Data);
782*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_SetReg(REG_MB_ADDR_H, (MS_U8)(u16Addr >> 8));
783*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_SetReg(REG_MB_ADDR_L, (MS_U8)(u16Addr));
784*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_SetReg(REG_MB_CNTL, 0x04);
785*53ee8cc1Swenshuai.xi 
786*53ee8cc1Swenshuai.xi     do
787*53ee8cc1Swenshuai.xi     {
788*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_GetReg(REG_MB_CNTL, &u8Cntl);
789*53ee8cc1Swenshuai.xi         if (u16Cntr++ > 0x7ff)
790*53ee8cc1Swenshuai.xi         {
791*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
792*53ee8cc1Swenshuai.xi             if (eDMD_MSB123xc_DbgLevel >= E_DMD_MSB123xc_DBGLV_DEBUG)
793*53ee8cc1Swenshuai.xi             {
794*53ee8cc1Swenshuai.xi                 printf("MSB123xc_MB_WRITE_FAILURE\n");
795*53ee8cc1Swenshuai.xi             }
796*53ee8cc1Swenshuai.xi #endif
797*53ee8cc1Swenshuai.xi             return false;
798*53ee8cc1Swenshuai.xi         }
799*53ee8cc1Swenshuai.xi     }
800*53ee8cc1Swenshuai.xi     while(u8Cntl != 0xff);
801*53ee8cc1Swenshuai.xi     return bRet;
802*53ee8cc1Swenshuai.xi }
803*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB123xc_SetDSPReg(MS_U16 u16Addr,MS_U8 u8Data)804*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB123xc_SetDSPReg(MS_U16 u16Addr, MS_U8 u8Data)
805*53ee8cc1Swenshuai.xi {
806*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
807*53ee8cc1Swenshuai.xi 
808*53ee8cc1Swenshuai.xi     DMD_LOCK();
809*53ee8cc1Swenshuai.xi     bRet = _MDrv_DMD_MSB123xc_SetDSPReg(u16Addr, u8Data);
810*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
811*53ee8cc1Swenshuai.xi 
812*53ee8cc1Swenshuai.xi     return bRet;
813*53ee8cc1Swenshuai.xi }
814*53ee8cc1Swenshuai.xi 
_MSB123xc_I2C_CH_Reset(MS_U8 ch_num)815*53ee8cc1Swenshuai.xi static MS_BOOL _MSB123xc_I2C_CH_Reset(MS_U8 ch_num)
816*53ee8cc1Swenshuai.xi {
817*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
818*53ee8cc1Swenshuai.xi     //MAPI_U8         addr[4] = {0x00, 0x00, 0x00, 0x00};
819*53ee8cc1Swenshuai.xi     MS_U8         u8data[5] = {0x53, 0x45, 0x52, 0x44, 0x42};
820*53ee8cc1Swenshuai.xi 
821*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
822*53ee8cc1Swenshuai.xi     printf("[msb123xc][beg]I2C_CH_Reset, CH=0x%x\n",ch_num);
823*53ee8cc1Swenshuai.xi #endif
824*53ee8cc1Swenshuai.xi     //DMD_LOCK_REG_RW();
825*53ee8cc1Swenshuai.xi 
826*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h53(PWD1)->8,h45(PWD2)->8,h52(PWD3)->8,h44(PWD4)->8,h42(PWD5)
827*53ee8cc1Swenshuai.xi     //u8data[0] = 0x53;
828*53ee8cc1Swenshuai.xi     //bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8data);
829*53ee8cc1Swenshuai.xi     if (bDemodRest)
830*53ee8cc1Swenshuai.xi     {
831*53ee8cc1Swenshuai.xi         bDemodRest = FALSE;
832*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h53(PWD1)->8,h45(PWD2)->8,h52(PWD3)->8,h44(PWD4)->8,h42(PWD5)
833*53ee8cc1Swenshuai.xi         u8data[0] = 0x53;
834*53ee8cc1Swenshuai.xi         // Don't check Ack because this passward only ack one time for the first time.
835*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8data);
836*53ee8cc1Swenshuai.xi     }
837*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h71(CMD)  //TV.n_iic_
838*53ee8cc1Swenshuai.xi     u8data[0] = 0x71;
839*53ee8cc1Swenshuai.xi     bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8data);
840*53ee8cc1Swenshuai.xi 
841*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h81(CMD)  //TV.n_iic_sel_b0
842*53ee8cc1Swenshuai.xi     u8data[0] = ((ch_num & 0x01) != 0)? 0x81 : 0x80;
843*53ee8cc1Swenshuai.xi     bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8data);
844*53ee8cc1Swenshuai.xi 
845*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h83(CMD)  //TV.n_iic_sel_b1
846*53ee8cc1Swenshuai.xi     u8data[0] = ((ch_num & 0x02) != 0)? 0x83 : 0x82;
847*53ee8cc1Swenshuai.xi     bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8data);
848*53ee8cc1Swenshuai.xi 
849*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h84(CMD)  //TV.n_iic_sel_b2
850*53ee8cc1Swenshuai.xi     u8data[0] = ((ch_num & 0x04) != 0)? 0x85 : 0x84;
851*53ee8cc1Swenshuai.xi     bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8data);
852*53ee8cc1Swenshuai.xi 
853*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h53(CMD)  //TV.n_iic_ad_byte_en2, 32bit read/write
854*53ee8cc1Swenshuai.xi     u8data[0] = 0x53;
855*53ee8cc1Swenshuai.xi     bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8data);
856*53ee8cc1Swenshuai.xi 
857*53ee8cc1Swenshuai.xi     // 8'hb2(SRID)->8,h7f(CMD)  //TV.n_iic_sel_use_cfg
858*53ee8cc1Swenshuai.xi     u8data[0] = 0x7f;
859*53ee8cc1Swenshuai.xi     bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8data);
860*53ee8cc1Swenshuai.xi 
861*53ee8cc1Swenshuai.xi     /*
862*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h35(CMD)  //TV.n_iic_use
863*53ee8cc1Swenshuai.xi         data[0] = 0x35;
864*53ee8cc1Swenshuai.xi         iptr->WriteBytes(0, NULL, 1, data);
865*53ee8cc1Swenshuai.xi 
866*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h71(CMD)  //TV.n_iic_Re-shape
867*53ee8cc1Swenshuai.xi         data[0] = 0x71;
868*53ee8cc1Swenshuai.xi         iptr->WriteBytes(0, NULL, 1, data);
869*53ee8cc1Swenshuai.xi     */
870*53ee8cc1Swenshuai.xi     //DMD_UNLOCK_REG_RW();
871*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
872*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][end]I2C_CH_Reset, CH=0x%x\n",ch_num));
873*53ee8cc1Swenshuai.xi #endif
874*53ee8cc1Swenshuai.xi     return bRet;
875*53ee8cc1Swenshuai.xi }
876*53ee8cc1Swenshuai.xi 
_MSB123xc_HW_init(void)877*53ee8cc1Swenshuai.xi static MS_BOOL _MSB123xc_HW_init(void)
878*53ee8cc1Swenshuai.xi {
879*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
880*53ee8cc1Swenshuai.xi     MS_U8 u8_tmp = 0;
881*53ee8cc1Swenshuai.xi     MS_U8 u8_timeout = 0;
882*53ee8cc1Swenshuai.xi 
883*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
884*53ee8cc1Swenshuai.xi     printf("[msb123xc][beg]MSB123xc_HW_init\n");
885*53ee8cc1Swenshuai.xi #endif
886*53ee8cc1Swenshuai.xi     //DMD_LOCK();
887*53ee8cc1Swenshuai.xi 
888*53ee8cc1Swenshuai.xi     // ASIC INIT for EDB DVB-T2
889*53ee8cc1Swenshuai.xi     {
890*53ee8cc1Swenshuai.xi         // Reset MCU
891*53ee8cc1Swenshuai.xi         // wreg 11 0x19 0x0003  // don't do this in MCU firmware!
892*53ee8cc1Swenshuai.xi         // -------------------------------------------------------------------
893*53ee8cc1Swenshuai.xi         // Initialize DMD_ANA_MISC
894*53ee8cc1Swenshuai.xi         // -------------------------------------------------------------------
895*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
896*53ee8cc1Swenshuai.xi         // [15:8]	reg_mpll_loop_div_second      feedback divider, div by binary data number
897*53ee8cc1Swenshuai.xi         // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h33, 2'b11, 16'h2400);  // Loop divider ; VCO = 24*(2^2)*9 = 864
898*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0A00+(0x33)*2, 0x2400);
899*53ee8cc1Swenshuai.xi 
900*53ee8cc1Swenshuai.xi         // [2:0]	reg_mpll_ictrl		    charge pump current control
901*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)
902*53ee8cc1Swenshuai.xi         // [4]	reg_mpll_xtal2adc_sel	    select the XTAL clock bypass to MPLL_ADC_CLK
903*53ee8cc1Swenshuai.xi         // [5]	reg_mpll_xtal2next_pll_sel  crystal clock bypass to next PLL select
904*53ee8cc1Swenshuai.xi         // [6]	reg_mpll_vco_offset	    set VCO initial offset frequency
905*53ee8cc1Swenshuai.xi         // [7]	reg_mpll_pd		    gated reference clock and power down PLL analog_3v: 1=power down
906*53ee8cc1Swenshuai.xi         // [8]	reg_xtal_en		    XTAL enable register; 1: enable
907*53ee8cc1Swenshuai.xi         // [10:9]	reg_xtal_sel		    XTAL driven strength select.
908*53ee8cc1Swenshuai.xi         // [11]  	reg_mpll_porst		    MPLL input  power on reset, connect to reg as MPLL_RESET
909*53ee8cc1Swenshuai.xi         // [12]  	reg_mpll_reset		    PLL software reset; 1:reset
910*53ee8cc1Swenshuai.xi         // [13]  	reg_pd_dmpll_clk	    XTAL to MPLL clock reference power down
911*53ee8cc1Swenshuai.xi         // [14]  	reg_pd_3p3_1		    XTAL to CLK_24M_3P3_1 power down
912*53ee8cc1Swenshuai.xi         // [15]  	reg_pd_3p3_2		    XTAL to CLK_24M_3P3_2 power down
913*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0A00+(0x35)*2, 0x1804);
914*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0A00+(0x35)*2, 0x0004);
915*53ee8cc1Swenshuai.xi 
916*53ee8cc1Swenshuai.xi         // [15:0]	reg_mpll_test
917*53ee8cc1Swenshuai.xi         // [14]	mpll reset
918*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0A00+(0x34)*2, 0x4000);
919*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0A00+(0x34)*2, 0x0000);
920*53ee8cc1Swenshuai.xi 
921*53ee8cc1Swenshuai.xi         // [0]	reg_mpll_clk_dp_pd	dummy
922*53ee8cc1Swenshuai.xi         // [1]	reg_adc_clk_pd		ADC output clock power down
923*53ee8cc1Swenshuai.xi         // [2]	reg_mpll_div2_pd	MPLL_DIV2 power down
924*53ee8cc1Swenshuai.xi         // [3]	reg_mpll_div3_pd	MPLL_DIV3 power down
925*53ee8cc1Swenshuai.xi         // [4]	reg_mpll_div4_pd	MPLL_DIV4 power down
926*53ee8cc1Swenshuai.xi         // [5]	reg_mpll_div8_pd	MPLL_DIV8 power down
927*53ee8cc1Swenshuai.xi         // [6]	reg_mpll_div10_pd	MPLL_DIV10 power down
928*53ee8cc1Swenshuai.xi         // [13:8]  reg_mpll_adc_div_sel	select the ADC clock divide ratio,ADC clk=XTAL_IN * (LOOP_DIV_FIRST*LOOP_DIV_SECOND)/div_ratio
929*53ee8cc1Swenshuai.xi         // `RIU_W((`RIUBASE_ADCPLL>>1)+7'h30, 2'b11, 16'h1e00);  // divide ADC clock to 28.8Mhz = 24*36/30
930*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0A00+(0x30)*2, 0x1e00);
931*53ee8cc1Swenshuai.xi 
932*53ee8cc1Swenshuai.xi 
933*53ee8cc1Swenshuai.xi         //     --------------------------------------
934*53ee8cc1Swenshuai.xi         //     Initialize ADC I/Q");
935*53ee8cc1Swenshuai.xi         //     --------------------------------------
936*53ee8cc1Swenshuai.xi         // Set IMUXS QMUXS
937*53ee8cc1Swenshuai.xi         // [0]	Q channel ADC power down
938*53ee8cc1Swenshuai.xi         // [1]	I channel ADC power down
939*53ee8cc1Swenshuai.xi         // [2]	Q channel clamp enable. 0:enable, 1:disable
940*53ee8cc1Swenshuai.xi         // [3]	I channel clamp enable. 0:enable, 1:disable
941*53ee8cc1Swenshuai.xi         // [6:4]    I channel input mux control;
942*53ee8cc1Swenshuai.xi         //		3'b000=I channel ADC calibration mode input
943*53ee8cc1Swenshuai.xi         //	    	3'b001=VIF signal from VIFPGA
944*53ee8cc1Swenshuai.xi         //	    	3'b100=DVB or ATSC mode input from PAD_I(Q)P(M)
945*53ee8cc1Swenshuai.xi         //	    	all the other combination are only for test mode, don't use without understanding.
946*53ee8cc1Swenshuai.xi         // [10:8]   Q channel input mux control;
947*53ee8cc1Swenshuai.xi         //		3'b000=Q channel ADC calibration mode input
948*53ee8cc1Swenshuai.xi         //	    	3'b001=VIF signal from VIFPGA 3'b010 = SSIF signal from PAD_SIFP(M)
949*53ee8cc1Swenshuai.xi         //	    	3'b100=DVB or ATSC mode input from PAD_I(Q)P(M)
950*53ee8cc1Swenshuai.xi         //	    	all the other combination are only for test mode, don't use without understanding.
951*53ee8cc1Swenshuai.xi         // [12]	ADC I,Q swap enable; 1: swap
952*53ee8cc1Swenshuai.xi         // [13]	ADC clock out select; 1: ADC_CLKQ
953*53ee8cc1Swenshuai.xi         // [14]	ADC linear calibration bypass enable; 1:enable
954*53ee8cc1Swenshuai.xi         // [15]	ADC internal 1.2v regulator control always 0 in T3
955*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0A00+(0x01)*2, 0x0440);
956*53ee8cc1Swenshuai.xi 
957*53ee8cc1Swenshuai.xi         // Set enable ADC clock
958*53ee8cc1Swenshuai.xi         // [0]	Channel I ADC power down: 1=power dwon
959*53ee8cc1Swenshuai.xi         // [1]	Channel Q ADC power down: 1=power dwon
960*53ee8cc1Swenshuai.xi         // [2]	power down clamp buffer for test mode
961*53ee8cc1Swenshuai.xi         // [3]	change ADC reference voltage for SSIF
962*53ee8cc1Swenshuai.xi         // [6:4]    ADC source bias current control
963*53ee8cc1Swenshuai.xi         // [9:8]    XTAL receiver amp gain
964*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0A00+(0x0c)*2, 0x0000);
965*53ee8cc1Swenshuai.xi 
966*53ee8cc1Swenshuai.xi         // Disable PWDN_REF
967*53ee8cc1Swenshuai.xi         // [3:0]	clamp voltage control
968*53ee8cc1Swenshuai.xi         //          3'b000 = 0.7v
969*53ee8cc1Swenshuai.xi         //          3'b001 = 0.75v
970*53ee8cc1Swenshuai.xi         //          3'b010 = 0.5v
971*53ee8cc1Swenshuai.xi         //          3'b011 = 0.4v
972*53ee8cc1Swenshuai.xi         //          3'b100 = 0.8v
973*53ee8cc1Swenshuai.xi         //          3'b101 = 0.9v
974*53ee8cc1Swenshuai.xi         //          3'b110 = 0.65v
975*53ee8cc1Swenshuai.xi         //          3'b111 = 0.60v
976*53ee8cc1Swenshuai.xi         // [4]	REFERENCE power down
977*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0A00+(0x20)*2, 0x0000);
978*53ee8cc1Swenshuai.xi 
979*53ee8cc1Swenshuai.xi         // Set ADC gain is 1
980*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0A00+(0x0b)*2, 0x0009);
981*53ee8cc1Swenshuai.xi 
982*53ee8cc1Swenshuai.xi         // Disable ADC Sign bit
983*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0A00+(0x2e)*2, 0x0000);
984*53ee8cc1Swenshuai.xi 
985*53ee8cc1Swenshuai.xi         // ADC I channel offset
986*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0A00+(0x2a)*2, 0x0c00);
987*53ee8cc1Swenshuai.xi 
988*53ee8cc1Swenshuai.xi         // ADC Q channel offset
989*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0A00+(0x2b)*2, 0x0c00);
990*53ee8cc1Swenshuai.xi 
991*53ee8cc1Swenshuai.xi         // [2:0]reg_acl_ref
992*53ee8cc1Swenshuai.xi         // [5:4]reg_acl_isel
993*53ee8cc1Swenshuai.xi         // [8]	reg_xtal_pm_isel
994*53ee8cc1Swenshuai.xi         // [9]	reg_bond_mode
995*53ee8cc1Swenshuai.xi         // [10]	reg_clk_bond_mode
996*53ee8cc1Swenshuai.xi         // [11]	reg_clk_usb_3p3_en
997*53ee8cc1Swenshuai.xi         // [13:12]	reg_iq_ctrl	= 2'd1
998*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0A00+(0x19)*2, 0x1e00);
999*53ee8cc1Swenshuai.xi 
1000*53ee8cc1Swenshuai.xi         // [ 4:0]reg_ckg_bist[4:0]
1001*53ee8cc1Swenshuai.xi         // [11:8]reg_ckg_adcd_d2[3:0]
1002*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x1c)*2, 0x0000);
1003*53ee8cc1Swenshuai.xi 
1004*53ee8cc1Swenshuai.xi         // [ 4:0]reg_ckg_dvbtm_sram_t11x_t22x[4:0]
1005*53ee8cc1Swenshuai.xi         // [12:8]reg_ckg_dvbtm_sram_t11x_t24x[4:0]
1006*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x1e)*2, 0x0000);
1007*53ee8cc1Swenshuai.xi 
1008*53ee8cc1Swenshuai.xi         // [15:0]	reg_mpll_test
1009*53ee8cc1Swenshuai.xi         // [4]	mpll lock detector enable
1010*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0A00+(0x34)*2, 0x0010);
1011*53ee8cc1Swenshuai.xi 
1012*53ee8cc1Swenshuai.xi         // -------------------------------------------------------------------
1013*53ee8cc1Swenshuai.xi         // Release clock gating
1014*53ee8cc1Swenshuai.xi         // -------------------------------------------------------------------
1015*53ee8cc1Swenshuai.xi 
1016*53ee8cc1Swenshuai.xi         // [0]	reg_xtal_en
1017*53ee8cc1Swenshuai.xi         // [9:8]	reg_clk_pd_iic
1018*53ee8cc1Swenshuai.xi         // [10]	reg_clk_pd_all
1019*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x09)*2, 0x0101);
1020*53ee8cc1Swenshuai.xi 
1021*53ee8cc1Swenshuai.xi         // [3:0]	reg_ckg_adcd
1022*53ee8cc1Swenshuai.xi         // [7:4]	reg_ckg_sadc
1023*53ee8cc1Swenshuai.xi         // [11:8]	reg_ckg_iicm
1024*53ee8cc1Swenshuai.xi         // [13:12]	reg_ckg_sbus
1025*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x0a)*2, 0x0000);
1026*53ee8cc1Swenshuai.xi 
1027*53ee8cc1Swenshuai.xi         // [5:0]	reg_ckg_mcu
1028*53ee8cc1Swenshuai.xi         // [6]	reg_ckg_live
1029*53ee8cc1Swenshuai.xi         // [11:8]	reg_ckg_inner
1030*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x0b)*2, 0x0030);
1031*53ee8cc1Swenshuai.xi 
1032*53ee8cc1Swenshuai.xi         // @0x0910
1033*53ee8cc1Swenshuai.xi         // [3:0]	reg_ckg_dvbtm_adc
1034*53ee8cc1Swenshuai.xi         // [6:4]	reg_ckg_dvbt_inner1x
1035*53ee8cc1Swenshuai.xi         // [10:8]	reg_ckg_dvbt_inner2x
1036*53ee8cc1Swenshuai.xi         // [14:12]	reg_ckg_dvbt_inner4x
1037*53ee8cc1Swenshuai.xi         //DVBT2
1038*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x10)*2, 0x1110);
1039*53ee8cc1Swenshuai.xi 
1040*53ee8cc1Swenshuai.xi         // @0x0911
1041*53ee8cc1Swenshuai.xi         // [2:0]	reg_ckg_dvbt_outer1x
1042*53ee8cc1Swenshuai.xi         // [6:4]	reg_ckg_dvbt_outer2x
1043*53ee8cc1Swenshuai.xi         // [11:8]	reg_ckg_dvbtc_outer2x
1044*53ee8cc1Swenshuai.xi         //DVBT2
1045*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x11)*2, 0x0111);
1046*53ee8cc1Swenshuai.xi 
1047*53ee8cc1Swenshuai.xi         // @0x0912
1048*53ee8cc1Swenshuai.xi         // [3:0]	reg_ckg_dvbtm_ts
1049*53ee8cc1Swenshuai.xi         // [4]	reg_dvbtm_ts_out_mode
1050*53ee8cc1Swenshuai.xi         // [5]	reg_dvbtm_ts_clk_pol
1051*53ee8cc1Swenshuai.xi         // [15:8]	reg_dvbtm_ts_clk_divnum
1052*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x12)*2, 0x0618);
1053*53ee8cc1Swenshuai.xi 
1054*53ee8cc1Swenshuai.xi         // @0x0913
1055*53ee8cc1Swenshuai.xi         // [5:0]	reg_ckg_spi
1056*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x13)*2, 0x0020);
1057*53ee8cc1Swenshuai.xi 
1058*53ee8cc1Swenshuai.xi         // @0x0914
1059*53ee8cc1Swenshuai.xi         // [12:8]	reg_ckg_dvbtm_sram_t1o2x_t22x
1060*53ee8cc1Swenshuai.xi         //DVBT2
1061*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x14)*2, 0x0000);
1062*53ee8cc1Swenshuai.xi         // `endif
1063*53ee8cc1Swenshuai.xi 
1064*53ee8cc1Swenshuai.xi         // @0x0915
1065*53ee8cc1Swenshuai.xi         // [3:0]	reg_ckg_dvbc_inner
1066*53ee8cc1Swenshuai.xi         // [6:4]	reg_ckg_dvbc_eq
1067*53ee8cc1Swenshuai.xi         // [10:8]	reg_ckg_dvbc_eq8x
1068*53ee8cc1Swenshuai.xi         //DVBT2
1069*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x15)*2, 0x0111);
1070*53ee8cc1Swenshuai.xi 
1071*53ee8cc1Swenshuai.xi         // @0x0916
1072*53ee8cc1Swenshuai.xi         // [3:0]	reg_ckg_dvbtm_adc_2x_4x
1073*53ee8cc1Swenshuai.xi         // [8:4]	reg_ckg_dvbtm_sram_adc_t22x
1074*53ee8cc1Swenshuai.xi         //DVBT2
1075*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x16)*2, 0x0001);
1076*53ee8cc1Swenshuai.xi         // `endif
1077*53ee8cc1Swenshuai.xi 
1078*53ee8cc1Swenshuai.xi         // @0x0917
1079*53ee8cc1Swenshuai.xi         // [4:0]	reg_ckg_dvbtm_sram_t12x_t22x
1080*53ee8cc1Swenshuai.xi         // [12:8]	reg_ckg_dvbtm_sram_t12x_t24x
1081*53ee8cc1Swenshuai.xi         //DVBT2
1082*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x17)*2, 0x0000);
1083*53ee8cc1Swenshuai.xi 
1084*53ee8cc1Swenshuai.xi         // @0x0918
1085*53ee8cc1Swenshuai.xi         // [4:0]	reg_ckg_dvbtm_sram_t14x_t24x
1086*53ee8cc1Swenshuai.xi         // [12:8]	reg_ckg_dvbtm_ts_in
1087*53ee8cc1Swenshuai.xi         //DVBT2
1088*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x18)*2, 0x1000);
1089*53ee8cc1Swenshuai.xi         // `endif
1090*53ee8cc1Swenshuai.xi 
1091*53ee8cc1Swenshuai.xi         // @0x0919
1092*53ee8cc1Swenshuai.xi         // [2:0]	reg_ckg_tdp_jl_inner1x
1093*53ee8cc1Swenshuai.xi         // [6:4]	reg_ckg_tdp_jl_inner4x
1094*53ee8cc1Swenshuai.xi         // [15:8]	reg_ckg_miu
1095*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x19)*2, 0x3c00);
1096*53ee8cc1Swenshuai.xi 
1097*53ee8cc1Swenshuai.xi         // @0x091a
1098*53ee8cc1Swenshuai.xi         // [6:4]	reg_ckg_dvbt2_inner1x
1099*53ee8cc1Swenshuai.xi         // [10:8]	reg_ckg_dvbt2_inner2x
1100*53ee8cc1Swenshuai.xi         // [14:12]	reg_ckg_dvbt2_inner4x
1101*53ee8cc1Swenshuai.xi         //DVBT2
1102*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x1a)*2, 0x0000);
1103*53ee8cc1Swenshuai.xi 
1104*53ee8cc1Swenshuai.xi         // @0x091b
1105*53ee8cc1Swenshuai.xi         // [2:0]	reg_ckg_dvbt2_outer1x
1106*53ee8cc1Swenshuai.xi         // [6:4]	reg_ckg_dvbt2_outer2x
1107*53ee8cc1Swenshuai.xi         // [10:8]	reg_ckg_syn_miu
1108*53ee8cc1Swenshuai.xi         // [14:12]	reg_ckg_syn_ts
1109*53ee8cc1Swenshuai.xi         //DVBT2
1110*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x1b)*2, 0x0000);
1111*53ee8cc1Swenshuai.xi 
1112*53ee8cc1Swenshuai.xi 
1113*53ee8cc1Swenshuai.xi         // @0x091c
1114*53ee8cc1Swenshuai.xi         // [4:0]	reg_ckg_bist
1115*53ee8cc1Swenshuai.xi         // [11:8]	reg_ckg_adcd_d2
1116*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x1c)*2, 0x0000);
1117*53ee8cc1Swenshuai.xi 
1118*53ee8cc1Swenshuai.xi 
1119*53ee8cc1Swenshuai.xi         // [1:0]	reg_iicm_pad_sel
1120*53ee8cc1Swenshuai.xi         // [4]	reg_i2c_sbpm_en
1121*53ee8cc1Swenshuai.xi         // [12:8]	reg_i2c_sbpm_idle_num
1122*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x08)*2, 0x0a01);
1123*53ee8cc1Swenshuai.xi 
1124*53ee8cc1Swenshuai.xi         // [8]	reg_turn_off_pad
1125*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x28)*2, 0x0000);
1126*53ee8cc1Swenshuai.xi 
1127*53ee8cc1Swenshuai.xi         // [15:0]	reg_synth_set[15: 0]
1128*53ee8cc1Swenshuai.xi         // [ 7:0]	reg_synth_set[23:16]
1129*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x51)*2, 0x0000);
1130*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x52)*2, 0x0020);
1131*53ee8cc1Swenshuai.xi 
1132*53ee8cc1Swenshuai.xi 
1133*53ee8cc1Swenshuai.xi         // [0]	reg_synth_reset
1134*53ee8cc1Swenshuai.xi         // [1]	reg_synth_ssc_en
1135*53ee8cc1Swenshuai.xi         // [2]	reg_synth_ssc_mode
1136*53ee8cc1Swenshuai.xi         // [4]	reg_synth_sld
1137*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x50)*2, 0x0010);
1138*53ee8cc1Swenshuai.xi 
1139*53ee8cc1Swenshuai.xi         // [1:0]	reg_apll_loop_div_first
1140*53ee8cc1Swenshuai.xi         // [15:8]	reg_apll_loop_div_second
1141*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x57)*2, 0x0003);
1142*53ee8cc1Swenshuai.xi 
1143*53ee8cc1Swenshuai.xi 
1144*53ee8cc1Swenshuai.xi         // [0]	reg_apll_pd
1145*53ee8cc1Swenshuai.xi         // [1]	reg_apll_reset
1146*53ee8cc1Swenshuai.xi         // [2]	reg_apll_porst
1147*53ee8cc1Swenshuai.xi         // [3]	reg_apll_vco_offset
1148*53ee8cc1Swenshuai.xi         // [4]	reg_apll_en_ts
1149*53ee8cc1Swenshuai.xi         // [5]	reg_apll_endcc
1150*53ee8cc1Swenshuai.xi         // [6]	reg_apll_clkin_sel
1151*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x55)*2, 0x0006);
1152*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x55)*2, 0x0010);
1153*53ee8cc1Swenshuai.xi 
1154*53ee8cc1Swenshuai.xi         // [16:0]	reg_apll_test
1155*53ee8cc1Swenshuai.xi         // [4]	lock detector enable
1156*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x59)*2, 0x0010);
1157*53ee8cc1Swenshuai.xi 
1158*53ee8cc1Swenshuai.xi         // 0x0920
1159*53ee8cc1Swenshuai.xi         // [3:0]	reg_ckg_ts_apll_div[2:0]
1160*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x20)*2, 0x0004);
1161*53ee8cc1Swenshuai.xi 
1162*53ee8cc1Swenshuai.xi         // -------------------------------------------------------------------
1163*53ee8cc1Swenshuai.xi         // initialize MIU
1164*53ee8cc1Swenshuai.xi         // -------------------------------------------------------------------
1165*53ee8cc1Swenshuai.xi         // $display("--------------------------------------");
1166*53ee8cc1Swenshuai.xi         // $display("Initialize MIU ");
1167*53ee8cc1Swenshuai.xi         // $display("--------------------------------------");
1168*53ee8cc1Swenshuai.xi 
1169*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x0f)*2, 0x0000);
1170*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x0f)*2, 0x0000);
1171*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x0f)*2, 0x0000);
1172*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x0f)*2, 0x0c01);
1173*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x0f)*2, 0x0c00);
1174*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x11)*2, 0x0052);
1175*53ee8cc1Swenshuai.xi 
1176*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x10)*2, 0x352b); // 0x29a378 = 166MHz, 0x352b52 = 130MHz
1177*53ee8cc1Swenshuai.xi         //execute reset and porst
1178*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x11)*2, 0x6052);
1179*53ee8cc1Swenshuai.xi         //exit reset and porst
1180*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x11)*2, 0x0052);
1181*53ee8cc1Swenshuai.xi 
1182*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x12)*2, 0xc000);
1183*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x13)*2, 0x0000);
1184*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x16)*2, 0x0030);
1185*53ee8cc1Swenshuai.xi         //bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x1c)*2, 0x0080);
1186*53ee8cc1Swenshuai.xi         // 2012/12/06 add best MIU phase by jason-bf.huang
1187*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x1c)*2, 0x00a0);
1188*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x1b)*2, 0x0067);
1189*53ee8cc1Swenshuai.xi 
1190*53ee8cc1Swenshuai.xi 
1191*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x01)*2, 0x8100);
1192*53ee8cc1Swenshuai.xi         // cke				: [0]
1193*53ee8cc1Swenshuai.xi         // reg_self_refresh		: [1]
1194*53ee8cc1Swenshuai.xi         // reg_dynamic_cke		: [2]
1195*53ee8cc1Swenshuai.xi         // reg_dynamic_ck_odt		: [3]
1196*53ee8cc1Swenshuai.xi         // reg_dram_bus			: [5:4] 00: 16b, 01: 32b, 10: 64b
1197*53ee8cc1Swenshuai.xi         // reg_dram_type			: [7:6] 00: sdr, 01: ddr, 10: ddr2
1198*53ee8cc1Swenshuai.xi         // reg_4ba			: [8]    0: 2bk,  1: 4bk
1199*53ee8cc1Swenshuai.xi         // reg_col_size			: [10:9]
1200*53ee8cc1Swenshuai.xi         // reg_cke_oenz			: [12]
1201*53ee8cc1Swenshuai.xi         // reg_dq_oenz			: [13]
1202*53ee8cc1Swenshuai.xi         // reg_adr_oenz			: [14]
1203*53ee8cc1Swenshuai.xi         // reg_cs_z			: [15]
1204*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x01)*2, 0xe100);
1205*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x01)*2, 0x8100);
1206*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x02)*2, 0x0360);
1207*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x03)*2, 0x0030);
1208*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x04)*2, 0x33c9);
1209*53ee8cc1Swenshuai.xi         // reg_tRAS                      : [3:0]        9
1210*53ee8cc1Swenshuai.xi         // reg_tRC                       : [7:4]        c
1211*53ee8cc1Swenshuai.xi         // reg_tRCD                      : [11:8]       3
1212*53ee8cc1Swenshuai.xi         // reg_tRP                       : [15:12]      3
1213*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x05)*2, 0x4232);
1214*53ee8cc1Swenshuai.xi         // reg_tRRD                      : [3:0]         2
1215*53ee8cc1Swenshuai.xi         // tWR                           : [7:4]         3
1216*53ee8cc1Swenshuai.xi         // reg_tMRD                      : [11:8]        2
1217*53ee8cc1Swenshuai.xi         // reg_tRTP			: [15:12]	4
1218*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x06)*2, 0x5532);
1219*53ee8cc1Swenshuai.xi         // reg_w2r_dly(tWTR)             : [3:0]         2
1220*53ee8cc1Swenshuai.xi         // reg_w2r_oen_dly               : [7:4]         3
1221*53ee8cc1Swenshuai.xi         // reg_r2w_dly(tRTW)             : [11:8]        5
1222*53ee8cc1Swenshuai.xi         // reg_r2w_oen_dly               : [15:12]       5
1223*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x07)*2, 0x400c);
1224*53ee8cc1Swenshuai.xi         // tRFC                          : [5:0]         c
1225*53ee8cc1Swenshuai.xi         // reg_tRAS[4]                   : [6]           0
1226*53ee8cc1Swenshuai.xi         // reg_tRC[4]                    : [7]           0
1227*53ee8cc1Swenshuai.xi         // reg_write_latency             : [10:8]        0
1228*53ee8cc1Swenshuai.xi         // reg_tCCD                      : [15:14]       1
1229*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x0e)*2, 0x1800);
1230*53ee8cc1Swenshuai.xi 
1231*53ee8cc1Swenshuai.xi         //mask other request
1232*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x23)*2, 0x7ffe);
1233*53ee8cc1Swenshuai.xi 
1234*53ee8cc1Swenshuai.xi         //reg_rq0_round_robin		: [0]
1235*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x20)*2, 0xc001);
1236*53ee8cc1Swenshuai.xi 
1237*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(1000);
1238*53ee8cc1Swenshuai.xi 
1239*53ee8cc1Swenshuai.xi         //miu software reset
1240*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x0f)*2, 0x0c01);
1241*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x0f)*2, 0x0c00);
1242*53ee8cc1Swenshuai.xi         //miu software reset
1243*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x0f)*2, 0x0c01);
1244*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x0f)*2, 0x0c00);
1245*53ee8cc1Swenshuai.xi 
1246*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x01)*2, 0x010d);
1247*53ee8cc1Swenshuai.xi 
1248*53ee8cc1Swenshuai.xi         // --------Initial DRAM start here!!!-------
1249*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x00)*2, 0x0001);
1250*53ee8cc1Swenshuai.xi 
1251*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_GetReg(0x1201, &u8_tmp);
1252*53ee8cc1Swenshuai.xi         u8_timeout = 0;
1253*53ee8cc1Swenshuai.xi         while( (u8_tmp&0x80) != 0x80)
1254*53ee8cc1Swenshuai.xi         {
1255*53ee8cc1Swenshuai.xi             if(u8_timeout++>200)
1256*53ee8cc1Swenshuai.xi             {
1257*53ee8cc1Swenshuai.xi                 printf("[msb1233c][err]MIU init failure...\n");
1258*53ee8cc1Swenshuai.xi                 return FALSE;
1259*53ee8cc1Swenshuai.xi             }
1260*53ee8cc1Swenshuai.xi             // 10us delay
1261*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(10);
1262*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB123xc_GetReg(0x1201, &u8_tmp);
1263*53ee8cc1Swenshuai.xi         }
1264*53ee8cc1Swenshuai.xi         // --------Initial Done-------
1265*53ee8cc1Swenshuai.xi 
1266*53ee8cc1Swenshuai.xi         //turn on report counter	: [0]
1267*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x08)*2, 0x0001);
1268*53ee8cc1Swenshuai.xi 
1269*53ee8cc1Swenshuai.xi         // -- miu self test start --
1270*53ee8cc1Swenshuai.xi         //base
1271*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x71)*2, 0x0000);
1272*53ee8cc1Swenshuai.xi         //length
1273*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x72)*2, 0x0010);
1274*53ee8cc1Swenshuai.xi         //test data
1275*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x74)*2, 0x5aa5);
1276*53ee8cc1Swenshuai.xi         //reg_test_en                   : [0]
1277*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x70)*2, 0x0001);
1278*53ee8cc1Swenshuai.xi         // reg_test_mode                 : [2:1] 00 : address,
1279*53ee8cc1Swenshuai.xi         //                                      01 : test data
1280*53ee8cc1Swenshuai.xi         //                                      10 : shift data
1281*53ee8cc1Swenshuai.xi         // reg_inv_data                  : [3]
1282*53ee8cc1Swenshuai.xi         // reg_test_loop                 : [4]
1283*53ee8cc1Swenshuai.xi         // reg_force_out                 : [5]
1284*53ee8cc1Swenshuai.xi         // reg_force_in                  : [6]
1285*53ee8cc1Swenshuai.xi         // reg_read_only                 : [8]
1286*53ee8cc1Swenshuai.xi         // reg_write_only                : [9]
1287*53ee8cc1Swenshuai.xi 
1288*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(1000);
1289*53ee8cc1Swenshuai.xi 
1290*53ee8cc1Swenshuai.xi         //wait test_finish
1291*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_GetReg(0x12E1, &u8_tmp);
1292*53ee8cc1Swenshuai.xi         u8_timeout = 0;
1293*53ee8cc1Swenshuai.xi         while( (u8_tmp&0x80) != 0x80)
1294*53ee8cc1Swenshuai.xi         {
1295*53ee8cc1Swenshuai.xi             if(u8_timeout++>200)
1296*53ee8cc1Swenshuai.xi             {
1297*53ee8cc1Swenshuai.xi                 printf("[msb1233c][err]MIU self test Phase1 failure...\n");
1298*53ee8cc1Swenshuai.xi                 return FALSE;
1299*53ee8cc1Swenshuai.xi             }
1300*53ee8cc1Swenshuai.xi             // 10us delay
1301*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(10);
1302*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB123xc_GetReg(0x12E1, &u8_tmp);
1303*53ee8cc1Swenshuai.xi         }
1304*53ee8cc1Swenshuai.xi 
1305*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(1000);
1306*53ee8cc1Swenshuai.xi 
1307*53ee8cc1Swenshuai.xi         // MIU self test FAIL let program stuck in this while loop
1308*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_GetReg(0x12E1, &u8_tmp);
1309*53ee8cc1Swenshuai.xi         u8_timeout = 0;
1310*53ee8cc1Swenshuai.xi         while( (u8_tmp&0x40) != 0x00)
1311*53ee8cc1Swenshuai.xi         {
1312*53ee8cc1Swenshuai.xi             if(u8_timeout++>200)
1313*53ee8cc1Swenshuai.xi             {
1314*53ee8cc1Swenshuai.xi                 printf("[msb1233c][err]MIU self test Phase2 failure...\n");
1315*53ee8cc1Swenshuai.xi                 return FALSE;
1316*53ee8cc1Swenshuai.xi             }
1317*53ee8cc1Swenshuai.xi             // 10us delay
1318*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(10);
1319*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB123xc_GetReg(0x12E1, &u8_tmp);
1320*53ee8cc1Swenshuai.xi         }
1321*53ee8cc1Swenshuai.xi 
1322*53ee8cc1Swenshuai.xi         //reg_rq0_mask
1323*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1200+(0x23)*2, 0x0000);
1324*53ee8cc1Swenshuai.xi 
1325*53ee8cc1Swenshuai.xi 
1326*53ee8cc1Swenshuai.xi         // -------------------------------------------------------------------
1327*53ee8cc1Swenshuai.xi         // initialize MIU  finish
1328*53ee8cc1Swenshuai.xi         // -------------------------------------------------------------------
1329*53ee8cc1Swenshuai.xi 
1330*53ee8cc1Swenshuai.xi         // -------------------------------------------------------------------
1331*53ee8cc1Swenshuai.xi         //  Turn on pads
1332*53ee8cc1Swenshuai.xi         // -------------------------------------------------------------------
1333*53ee8cc1Swenshuai.xi 
1334*53ee8cc1Swenshuai.xi         // ------Turn off all pad in
1335*53ee8cc1Swenshuai.xi         // [0] reg_set_pad_low
1336*53ee8cc1Swenshuai.xi         // [1] reg_set_pad_high
1337*53ee8cc1Swenshuai.xi         // [2] reg_set_i2cs_pad_low
1338*53ee8cc1Swenshuai.xi         // [3] reg_set_i2cs_pad_high
1339*53ee8cc1Swenshuai.xi         // [8] reg_turn_off_pad
1340*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x28)*2, 0x0000);
1341*53ee8cc1Swenshuai.xi 
1342*53ee8cc1Swenshuai.xi         // ------I2CM pad on
1343*53ee8cc1Swenshuai.xi         // [1:0]    reg_iicm_pad_sel[1:0]	1:iicm enable 2:UART enable
1344*53ee8cc1Swenshuai.xi         // [4]	    reg_i2c_sbpm_en		1: enable I2CS bypass to I2CM function
1345*53ee8cc1Swenshuai.xi         // [12:8]   reg_i2c_sbpm_idle_num[4:0]	a: default
1346*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x08)*2, 0x0a01);
1347*53ee8cc1Swenshuai.xi 
1348*53ee8cc1Swenshuai.xi         // ------Transport Stream pad on (except TS ERR pad)
1349*53ee8cc1Swenshuai.xi         // [15:0]   reg_en_ts_pad[15:0]	0x00ff:normal TS location 0xff00:reverse TS location
1350*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x2d)*2, 0x00ff);
1351*53ee8cc1Swenshuai.xi 
1352*53ee8cc1Swenshuai.xi         // ------Transport Stream pad on (TS ERR pad)
1353*53ee8cc1Swenshuai.xi         // [0]	    reg_en_ts_err_pad	1: enable
1354*53ee8cc1Swenshuai.xi         // [4]	    reg_ts_err_pol	1: inverse 0:normal
1355*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900+(0x2e)*2, 0x0001);
1356*53ee8cc1Swenshuai.xi 
1357*53ee8cc1Swenshuai.xi         // ------AGC pad on
1358*53ee8cc1Swenshuai.xi         // [4]    reg_ifagc_enable	Tuner IF AGC enable. 1:enable
1359*53ee8cc1Swenshuai.xi         // [5]    reg_ifagc_odmode	1: inverse IF AGC
1360*53ee8cc1Swenshuai.xi         // [6]    reg_ifagc_data_sel	IFAGC data select 0: IF AGC 1: RF AGC
1361*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0a00+(0x18)*2, 0x0010);
1362*53ee8cc1Swenshuai.xi     }
1363*53ee8cc1Swenshuai.xi 
1364*53ee8cc1Swenshuai.xi     //DMD_UNLOCK();
1365*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1366*53ee8cc1Swenshuai.xi     printf("[msb123xc][end]MSB123xc_HW_init, bRet=0x%x\n",bRet);
1367*53ee8cc1Swenshuai.xi #endif
1368*53ee8cc1Swenshuai.xi     return bRet;
1369*53ee8cc1Swenshuai.xi }
1370*53ee8cc1Swenshuai.xi 
_Load2Sdram(MS_U8 * u8_ptr,MS_U16 data_length,MS_U16 sdram_win_offset_base)1371*53ee8cc1Swenshuai.xi static MS_BOOL _Load2Sdram(MS_U8 *u8_ptr, MS_U16 data_length, MS_U16 sdram_win_offset_base)
1372*53ee8cc1Swenshuai.xi {
1373*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
1374*53ee8cc1Swenshuai.xi     MS_U16  sdram_win_offset = sdram_win_offset_base;
1375*53ee8cc1Swenshuai.xi     MS_U16  x_data_offset = 0;
1376*53ee8cc1Swenshuai.xi     MS_U16  y_cir_addr = 0;
1377*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1378*53ee8cc1Swenshuai.xi     MS_U32 u32tmm_3 = 0, u32tmm_4 = 0;
1379*53ee8cc1Swenshuai.xi #endif
1380*53ee8cc1Swenshuai.xi 
1381*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1382*53ee8cc1Swenshuai.xi     DBG_DOMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
1383*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][beg]Load2Sdram, len=0x%x, win_offset=0x%x\n",data_length,sdram_win_offset_base));
1384*53ee8cc1Swenshuai.xi     u32tmm_3 = MsOS_GetSystemTime();
1385*53ee8cc1Swenshuai.xi #endif
1386*53ee8cc1Swenshuai.xi 
1387*53ee8cc1Swenshuai.xi     if (_sDMD_MSB123xc_InitData.bEnableSPILoadCode)
1388*53ee8cc1Swenshuai.xi     {
1389*53ee8cc1Swenshuai.xi         MS_U32 u32Addr = 0;
1390*53ee8cc1Swenshuai.xi 
1391*53ee8cc1Swenshuai.xi         u32Addr = (MS_U32)sdram_win_offset_base * 0x1000; // unit: 4K
1392*53ee8cc1Swenshuai.xi         bRet &= MDrv_DMD_SSPI_MIU_Writes(u32Addr, u8_ptr, data_length);
1393*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1394*53ee8cc1Swenshuai.xi         DBG_DEMOD_LOAD_I2C(printf("[msb123xc]u32Addr=%08lx\n",u32Addr));
1395*53ee8cc1Swenshuai.xi #endif
1396*53ee8cc1Swenshuai.xi 
1397*53ee8cc1Swenshuai.xi #if (SDRAM_DATA_CHECK == 1)
1398*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1399*53ee8cc1Swenshuai.xi         DBG_DEMOD_LOAD_I2C(printf("[msb123xc]SDRAM data check...\n"));
1400*53ee8cc1Swenshuai.xi #endif
1401*53ee8cc1Swenshuai.xi         MS_U16 i = 0, j = 0, index = 0;
1402*53ee8cc1Swenshuai.xi         MS_U8 buf[SPI_DEVICE_BUFFER_SIZE]= {0};
1403*53ee8cc1Swenshuai.xi 
1404*53ee8cc1Swenshuai.xi         if((data_length % SPI_DEVICE_BUFFER_SIZE) == 0)
1405*53ee8cc1Swenshuai.xi             index = data_length / SPI_DEVICE_BUFFER_SIZE;
1406*53ee8cc1Swenshuai.xi         else
1407*53ee8cc1Swenshuai.xi             index = data_length / SPI_DEVICE_BUFFER_SIZE + 1;
1408*53ee8cc1Swenshuai.xi 
1409*53ee8cc1Swenshuai.xi         for (i=0; i<index; i++)
1410*53ee8cc1Swenshuai.xi         {
1411*53ee8cc1Swenshuai.xi             memset(buf, 0x00, SPI_DEVICE_BUFFER_SIZE);
1412*53ee8cc1Swenshuai.xi 
1413*53ee8cc1Swenshuai.xi             bRet &= MDrv_DMD_SSPI_MIU_Reads(u32Addr+SPI_DEVICE_BUFFER_SIZE*i, buf, SPI_DEVICE_BUFFER_SIZE);
1414*53ee8cc1Swenshuai.xi             for (j=0; j<SPI_DEVICE_BUFFER_SIZE; j++)
1415*53ee8cc1Swenshuai.xi             {
1416*53ee8cc1Swenshuai.xi                 if (buf[j] != u8_ptr[SPI_DEVICE_BUFFER_SIZE*i+j])
1417*53ee8cc1Swenshuai.xi                 {
1418*53ee8cc1Swenshuai.xi                     printf("[msb123xc]error, u32Addr=0x%08lx, y=0x%x, x=0x%x\n",u32Addr+j, buf[j] , u8_ptr[j]);
1419*53ee8cc1Swenshuai.xi                 }
1420*53ee8cc1Swenshuai.xi             }
1421*53ee8cc1Swenshuai.xi         }
1422*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1423*53ee8cc1Swenshuai.xi         DBG_DEMOD_LOAD_I2C(printf("[msb123xc]SDRAM data check...Done\n"));
1424*53ee8cc1Swenshuai.xi #endif
1425*53ee8cc1Swenshuai.xi #endif
1426*53ee8cc1Swenshuai.xi     }
1427*53ee8cc1Swenshuai.xi     else
1428*53ee8cc1Swenshuai.xi     {
1429*53ee8cc1Swenshuai.xi         if ( _MSB123xc_I2C_CH_Reset(0) == FALSE)
1430*53ee8cc1Swenshuai.xi         {
1431*53ee8cc1Swenshuai.xi             printf(">>>MSB123xc CH0 Reset:Fail\n");
1432*53ee8cc1Swenshuai.xi             return FALSE;
1433*53ee8cc1Swenshuai.xi         }
1434*53ee8cc1Swenshuai.xi         else
1435*53ee8cc1Swenshuai.xi         {
1436*53ee8cc1Swenshuai.xi 
1437*53ee8cc1Swenshuai.xi             // set xData map upper and low bound for 64k DRAM window
1438*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x2B00+(0x63)*2, 0x3F24);
1439*53ee8cc1Swenshuai.xi 
1440*53ee8cc1Swenshuai.xi             // set xData map offset for 64k DRAM window, 64kbytes alignment
1441*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x2B00+(0x64)*2, 0x0000);
1442*53ee8cc1Swenshuai.xi 
1443*53ee8cc1Swenshuai.xi             // set xData map upper and low bound for 4k DRAM window
1444*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x2B00+(0x65)*2, 0x2014);
1445*53ee8cc1Swenshuai.xi 
1446*53ee8cc1Swenshuai.xi             // set xData map offset for 4k DRAM window, 4kbytes alignment
1447*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x2B00+(0x66)*2, sdram_win_offset++);
1448*53ee8cc1Swenshuai.xi 
1449*53ee8cc1Swenshuai.xi             // enable xData map for DRAM
1450*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x2B00+(0x62)*2, 0x0007);
1451*53ee8cc1Swenshuai.xi 
1452*53ee8cc1Swenshuai.xi             for(x_data_offset = 0, y_cir_addr = SDRAM_BASE; x_data_offset < data_length;)
1453*53ee8cc1Swenshuai.xi             {
1454*53ee8cc1Swenshuai.xi                 if (y_cir_addr == (SDRAM_BASE+SDRAM_WINDOW_SIZE))
1455*53ee8cc1Swenshuai.xi                 {
1456*53ee8cc1Swenshuai.xi                     //set xData map offset for 4k DRAM window, 4kbytes alignment
1457*53ee8cc1Swenshuai.xi                     // 0x1000, 4096 bytes
1458*53ee8cc1Swenshuai.xi                     bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x2B00+(0x66)*2, sdram_win_offset++);
1459*53ee8cc1Swenshuai.xi                     y_cir_addr = SDRAM_BASE;
1460*53ee8cc1Swenshuai.xi                 }
1461*53ee8cc1Swenshuai.xi 
1462*53ee8cc1Swenshuai.xi                 // max 0x200, error above.....
1463*53ee8cc1Swenshuai.xi 
1464*53ee8cc1Swenshuai.xi                 if((data_length - x_data_offset) >= LOAD_CODE_I2C_BLOCK_NUM)
1465*53ee8cc1Swenshuai.xi                 {
1466*53ee8cc1Swenshuai.xi                     bRet &= _MDrv_DMD_MSB123xc_SetRegs(y_cir_addr, (u8_ptr + x_data_offset),LOAD_CODE_I2C_BLOCK_NUM);
1467*53ee8cc1Swenshuai.xi                     y_cir_addr += LOAD_CODE_I2C_BLOCK_NUM;
1468*53ee8cc1Swenshuai.xi                     x_data_offset += LOAD_CODE_I2C_BLOCK_NUM;
1469*53ee8cc1Swenshuai.xi                 }
1470*53ee8cc1Swenshuai.xi                 else
1471*53ee8cc1Swenshuai.xi                 {
1472*53ee8cc1Swenshuai.xi                     bRet &= _MDrv_DMD_MSB123xc_SetRegs(y_cir_addr, (u8_ptr + x_data_offset),data_length - x_data_offset);
1473*53ee8cc1Swenshuai.xi                     y_cir_addr += (data_length - x_data_offset);
1474*53ee8cc1Swenshuai.xi                     x_data_offset += (data_length - x_data_offset);
1475*53ee8cc1Swenshuai.xi                 }
1476*53ee8cc1Swenshuai.xi             }
1477*53ee8cc1Swenshuai.xi 
1478*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1479*53ee8cc1Swenshuai.xi             DBG_DEMOD_LOAD_I2C(printf("[msb123xc]x_data_offset=%d,y_cir_addr=%d,z_block_num=%d\n",x_data_offset,y_cir_addr,sdram_win_offset));
1480*53ee8cc1Swenshuai.xi #endif
1481*53ee8cc1Swenshuai.xi #if (SDRAM_DATA_CHECK == 1)
1482*53ee8cc1Swenshuai.xi             // beg data check.
1483*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1484*53ee8cc1Swenshuai.xi             DBG_DEMOD_LOAD_I2C(printf("[msb123xc]SDRAM data check...\n"));
1485*53ee8cc1Swenshuai.xi #endif
1486*53ee8cc1Swenshuai.xi 
1487*53ee8cc1Swenshuai.xi             sdram_win_offset = sdram_win_offset_base;
1488*53ee8cc1Swenshuai.xi 
1489*53ee8cc1Swenshuai.xi             // set xData map offset for 4k DRAM window, 4kbytes alignment
1490*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x2B00+(0x66)*2, sdram_win_offset++);
1491*53ee8cc1Swenshuai.xi 
1492*53ee8cc1Swenshuai.xi             for(x_data_offset = 0, y_cir_addr = SDRAM_BASE; x_data_offset < data_length;)
1493*53ee8cc1Swenshuai.xi             {
1494*53ee8cc1Swenshuai.xi                 MS_U8 u8_tmp;
1495*53ee8cc1Swenshuai.xi                 if (y_cir_addr == (SDRAM_BASE+SDRAM_WINDOW_SIZE))
1496*53ee8cc1Swenshuai.xi                 {
1497*53ee8cc1Swenshuai.xi                     //set xData map offset for 4k DRAM window, 4kbytes alignment
1498*53ee8cc1Swenshuai.xi                     // 0x1000, 4096 bytes
1499*53ee8cc1Swenshuai.xi                     bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x2B00+(0x66)*2, sdram_win_offset++);
1500*53ee8cc1Swenshuai.xi                     y_cir_addr = SDRAM_BASE;
1501*53ee8cc1Swenshuai.xi                 }
1502*53ee8cc1Swenshuai.xi 
1503*53ee8cc1Swenshuai.xi                 bRet &= _MDrv_DMD_MSB123xc_GetReg(y_cir_addr++, &u8_tmp);
1504*53ee8cc1Swenshuai.xi                 if(u8_tmp != *(u8_ptr + x_data_offset++))
1505*53ee8cc1Swenshuai.xi                 {
1506*53ee8cc1Swenshuai.xi                     printf("[msb123xc]error, idx=0x%x, y=0x%x, x=0x%x\n",y_cir_addr-1, u8_tmp, *(u8_ptr + x_data_offset-1));
1507*53ee8cc1Swenshuai.xi                 }
1508*53ee8cc1Swenshuai.xi             }
1509*53ee8cc1Swenshuai.xi 
1510*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1511*53ee8cc1Swenshuai.xi             DBG_DEMOD_LOAD_I2C(printf("[msb123xc]SDRAM data check...Done\n"));
1512*53ee8cc1Swenshuai.xi #endif
1513*53ee8cc1Swenshuai.xi 
1514*53ee8cc1Swenshuai.xi             // end data check
1515*53ee8cc1Swenshuai.xi #endif
1516*53ee8cc1Swenshuai.xi             //  Release xData map for SDRAM
1517*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x2B00+(0x62)*2, 0x0000);
1518*53ee8cc1Swenshuai.xi 
1519*53ee8cc1Swenshuai.xi             // Channel changed from CH 0x00 to CH 0x03
1520*53ee8cc1Swenshuai.xi             if (_MSB123xc_I2C_CH_Reset(3) == FALSE)
1521*53ee8cc1Swenshuai.xi             {
1522*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1523*53ee8cc1Swenshuai.xi                 ERR_DOMOD_MSB(printf(">>>MSB123xc CH3 Reset:Fail\n"));
1524*53ee8cc1Swenshuai.xi #endif
1525*53ee8cc1Swenshuai.xi                 return FALSE;
1526*53ee8cc1Swenshuai.xi             }
1527*53ee8cc1Swenshuai.xi         }
1528*53ee8cc1Swenshuai.xi     }
1529*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1530*53ee8cc1Swenshuai.xi     u32tmm_4 = MsOS_GetSystemTime();
1531*53ee8cc1Swenshuai.xi     printf("[tmm2]t4-t3 = %ld (%ld - %ld)\n",u32tmm_4-u32tmm_3,u32tmm_4,u32tmm_3);
1532*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][end]Load2Sdram, len=0x%x, win_offset=0x%x\n",data_length,sdram_win_offset_base));
1533*53ee8cc1Swenshuai.xi     if (!bRet) printf("%s %d Error\n",__func__, __LINE__);
1534*53ee8cc1Swenshuai.xi #endif
1535*53ee8cc1Swenshuai.xi 
1536*53ee8cc1Swenshuai.xi     return bRet;
1537*53ee8cc1Swenshuai.xi }
1538*53ee8cc1Swenshuai.xi 
_LoadDspCodeToSDRAM_Boot(void)1539*53ee8cc1Swenshuai.xi static MS_BOOL _LoadDspCodeToSDRAM_Boot(void)
1540*53ee8cc1Swenshuai.xi {
1541*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
1542*53ee8cc1Swenshuai.xi     MS_U16  code_size, win_offset;
1543*53ee8cc1Swenshuai.xi     MS_U8   *data_ptr;
1544*53ee8cc1Swenshuai.xi 
1545*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1546*53ee8cc1Swenshuai.xi     DBG_DOMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
1547*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][beg]LoadDspCodeToSDRAM_Boot\n"));
1548*53ee8cc1Swenshuai.xi #endif
1549*53ee8cc1Swenshuai.xi 
1550*53ee8cc1Swenshuai.xi     if(!(u8DMD_MSB123xc_Sdram_Code&MSB123xc_BOOT))
1551*53ee8cc1Swenshuai.xi     {
1552*53ee8cc1Swenshuai.xi         if(sizeof(MSB123xc_LIB) > EDINBURGH_BOOT_START_ADDR)
1553*53ee8cc1Swenshuai.xi         {
1554*53ee8cc1Swenshuai.xi             // boot code
1555*53ee8cc1Swenshuai.xi             data_ptr = MSB123xc_LIB + EDINBURGH_BOOT_START_ADDR;
1556*53ee8cc1Swenshuai.xi             code_size = EDINBURGH_BOOT_END_ADDR - EDINBURGH_BOOT_START_ADDR + 1;
1557*53ee8cc1Swenshuai.xi             win_offset = EDINBURGH_BOOT_WINDOWS_OFFSET;
1558*53ee8cc1Swenshuai.xi             bRet &= _Load2Sdram(data_ptr,code_size,win_offset);
1559*53ee8cc1Swenshuai.xi             if(bRet == true)
1560*53ee8cc1Swenshuai.xi             {
1561*53ee8cc1Swenshuai.xi                 u8DMD_MSB123xc_Sdram_Code |= MSB123xc_BOOT;
1562*53ee8cc1Swenshuai.xi             }
1563*53ee8cc1Swenshuai.xi         }
1564*53ee8cc1Swenshuai.xi         else
1565*53ee8cc1Swenshuai.xi         {
1566*53ee8cc1Swenshuai.xi             printf("@msb123xc, boot code is unavailable!!!\n");
1567*53ee8cc1Swenshuai.xi         }
1568*53ee8cc1Swenshuai.xi     }
1569*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1570*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][end]LoadDspCodeToSDRAM_Boot\n"));
1571*53ee8cc1Swenshuai.xi #endif
1572*53ee8cc1Swenshuai.xi     return bRet;
1573*53ee8cc1Swenshuai.xi }
1574*53ee8cc1Swenshuai.xi 
_LoadDspCodeToSDRAM_dvbt2(void)1575*53ee8cc1Swenshuai.xi static MS_BOOL _LoadDspCodeToSDRAM_dvbt2(void)
1576*53ee8cc1Swenshuai.xi {
1577*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
1578*53ee8cc1Swenshuai.xi     MS_U16  code_size, win_offset;
1579*53ee8cc1Swenshuai.xi     MS_U8   *data_ptr;
1580*53ee8cc1Swenshuai.xi 
1581*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1582*53ee8cc1Swenshuai.xi     DBG_DOMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
1583*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][beg]LoadDspCodeToSDRAM_dvbt2\n"));
1584*53ee8cc1Swenshuai.xi #endif
1585*53ee8cc1Swenshuai.xi 
1586*53ee8cc1Swenshuai.xi     if( !(u8DMD_MSB123xc_Sdram_Code&MSB123xc_DVBT2) )
1587*53ee8cc1Swenshuai.xi     {
1588*53ee8cc1Swenshuai.xi         if(sizeof(MSB123xc_LIB) > EDINBURGH_DVBT2_P1_START_ADDR)
1589*53ee8cc1Swenshuai.xi         {
1590*53ee8cc1Swenshuai.xi             // dvbt2_p2
1591*53ee8cc1Swenshuai.xi             data_ptr = MSB123xc_LIB + EDINBURGH_DVBT2_P2_START_ADDR;
1592*53ee8cc1Swenshuai.xi             code_size = EDINBURGH_DVBT2_P2_END_ADDR - EDINBURGH_DVBT2_P2_START_ADDR + 1;
1593*53ee8cc1Swenshuai.xi             win_offset = EDINBURGH_DVBT2_P2_WINDOWS_OFFSET;
1594*53ee8cc1Swenshuai.xi             bRet &= _Load2Sdram(data_ptr,code_size,win_offset);
1595*53ee8cc1Swenshuai.xi 
1596*53ee8cc1Swenshuai.xi             // dvbt2_p1
1597*53ee8cc1Swenshuai.xi             data_ptr = MSB123xc_LIB + EDINBURGH_DVBT2_P1_START_ADDR;
1598*53ee8cc1Swenshuai.xi             code_size = EDINBURGH_DVBT2_P1_END_ADDR - EDINBURGH_DVBT2_P1_START_ADDR + 1;
1599*53ee8cc1Swenshuai.xi             win_offset = EDINBURGH_DVBT2_P1_WINDOWS_OFFSET;
1600*53ee8cc1Swenshuai.xi             bRet &= _Load2Sdram(data_ptr,code_size,win_offset);
1601*53ee8cc1Swenshuai.xi 
1602*53ee8cc1Swenshuai.xi             if(bRet == true)
1603*53ee8cc1Swenshuai.xi             {
1604*53ee8cc1Swenshuai.xi                 u8DMD_MSB123xc_Sdram_Code |= MSB123xc_DVBT2;
1605*53ee8cc1Swenshuai.xi             }
1606*53ee8cc1Swenshuai.xi         }
1607*53ee8cc1Swenshuai.xi         else
1608*53ee8cc1Swenshuai.xi         {
1609*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1610*53ee8cc1Swenshuai.xi             ERR_DOMOD_MSB(printf("@msb123xc, dvbt2 code is unavailable!!!\n"));
1611*53ee8cc1Swenshuai.xi #endif
1612*53ee8cc1Swenshuai.xi         }
1613*53ee8cc1Swenshuai.xi     }
1614*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1615*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][end]LoadDspCodeToSDRAM_dvbt2\n"));
1616*53ee8cc1Swenshuai.xi #endif
1617*53ee8cc1Swenshuai.xi     return bRet;
1618*53ee8cc1Swenshuai.xi }
1619*53ee8cc1Swenshuai.xi 
_LoadDspCodeToSDRAM_dvbt(void)1620*53ee8cc1Swenshuai.xi static MS_BOOL _LoadDspCodeToSDRAM_dvbt(void)
1621*53ee8cc1Swenshuai.xi {
1622*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
1623*53ee8cc1Swenshuai.xi     MS_U16  code_size, win_offset;
1624*53ee8cc1Swenshuai.xi     MS_U8   *data_ptr;
1625*53ee8cc1Swenshuai.xi 
1626*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1627*53ee8cc1Swenshuai.xi     DBG_DOMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
1628*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][beg]LoadDspCodeToSDRAM_dvbt\n"));
1629*53ee8cc1Swenshuai.xi #endif
1630*53ee8cc1Swenshuai.xi 
1631*53ee8cc1Swenshuai.xi     if(!(u8DMD_MSB123xc_Sdram_Code&MSB123xc_DVBT))
1632*53ee8cc1Swenshuai.xi     {
1633*53ee8cc1Swenshuai.xi         // dvbt code
1634*53ee8cc1Swenshuai.xi         if(sizeof(MSB123xc_LIB) > EDINBURGH_DVBT_START_ADDR)
1635*53ee8cc1Swenshuai.xi         {
1636*53ee8cc1Swenshuai.xi             data_ptr = MSB123xc_LIB + EDINBURGH_DVBT_START_ADDR;
1637*53ee8cc1Swenshuai.xi             code_size = EDINBURGH_DVBT_END_ADDR - EDINBURGH_DVBT_START_ADDR + 1;
1638*53ee8cc1Swenshuai.xi             win_offset = EDINBURGH_DVBT_WINDOWS_OFFSET;
1639*53ee8cc1Swenshuai.xi             bRet &= _Load2Sdram(data_ptr,code_size,win_offset);
1640*53ee8cc1Swenshuai.xi             if(bRet == true)
1641*53ee8cc1Swenshuai.xi             {
1642*53ee8cc1Swenshuai.xi                 u8DMD_MSB123xc_Sdram_Code |= MSB123xc_DVBT;
1643*53ee8cc1Swenshuai.xi             }
1644*53ee8cc1Swenshuai.xi         }
1645*53ee8cc1Swenshuai.xi         else
1646*53ee8cc1Swenshuai.xi         {
1647*53ee8cc1Swenshuai.xi             printf("@msb123xc, dvbt code is unavailable!!!\n");
1648*53ee8cc1Swenshuai.xi         }
1649*53ee8cc1Swenshuai.xi     }
1650*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1651*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][end]LoadDspCodeToSDRAM_dvbt\n"));
1652*53ee8cc1Swenshuai.xi #endif
1653*53ee8cc1Swenshuai.xi     return bRet;
1654*53ee8cc1Swenshuai.xi }
1655*53ee8cc1Swenshuai.xi 
_LoadDspCodeToSDRAM_dvbc(void)1656*53ee8cc1Swenshuai.xi static MS_BOOL _LoadDspCodeToSDRAM_dvbc(void)
1657*53ee8cc1Swenshuai.xi {
1658*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
1659*53ee8cc1Swenshuai.xi     MS_U16  code_size, win_offset;
1660*53ee8cc1Swenshuai.xi     MS_U8   *data_ptr;
1661*53ee8cc1Swenshuai.xi 
1662*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1663*53ee8cc1Swenshuai.xi     DBG_DOMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
1664*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][beg]LoadDspCodeToSDRAM_dvbc\n"));
1665*53ee8cc1Swenshuai.xi #endif
1666*53ee8cc1Swenshuai.xi 
1667*53ee8cc1Swenshuai.xi     if(!(u8DMD_MSB123xc_Sdram_Code&MSB123xc_DVBC))
1668*53ee8cc1Swenshuai.xi     {
1669*53ee8cc1Swenshuai.xi         // dvbc code
1670*53ee8cc1Swenshuai.xi         if(sizeof(MSB123xc_LIB) > EDINBURGH_DVBC_START_ADDR)
1671*53ee8cc1Swenshuai.xi         {
1672*53ee8cc1Swenshuai.xi             data_ptr = MSB123xc_LIB + EDINBURGH_DVBC_START_ADDR;
1673*53ee8cc1Swenshuai.xi             code_size = EDINBURGH_DVBC_END_ADDR - EDINBURGH_DVBC_START_ADDR + 1;
1674*53ee8cc1Swenshuai.xi             win_offset = EDINBURGH_DVBC_WINDOWS_OFFSET;
1675*53ee8cc1Swenshuai.xi             bRet &= _Load2Sdram(data_ptr,code_size,win_offset);
1676*53ee8cc1Swenshuai.xi             if(bRet == true)
1677*53ee8cc1Swenshuai.xi             {
1678*53ee8cc1Swenshuai.xi                 u8DMD_MSB123xc_Sdram_Code |= MSB123xc_DVBC;
1679*53ee8cc1Swenshuai.xi             }
1680*53ee8cc1Swenshuai.xi         }
1681*53ee8cc1Swenshuai.xi         else
1682*53ee8cc1Swenshuai.xi         {
1683*53ee8cc1Swenshuai.xi             printf("@msb123xc, dvbc code is unavailable!!!\n");
1684*53ee8cc1Swenshuai.xi         }
1685*53ee8cc1Swenshuai.xi     }
1686*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1687*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][end]LoadDspCodeToSDRAM_dvbc\n"));
1688*53ee8cc1Swenshuai.xi #endif
1689*53ee8cc1Swenshuai.xi     return bRet;
1690*53ee8cc1Swenshuai.xi }
1691*53ee8cc1Swenshuai.xi 
_LoadDspCodeToSDRAM(MS_U8 code_n)1692*53ee8cc1Swenshuai.xi static MS_BOOL _LoadDspCodeToSDRAM(MS_U8 code_n)
1693*53ee8cc1Swenshuai.xi {
1694*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
1695*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1696*53ee8cc1Swenshuai.xi     MS_U32 u32tmm_7 = 0, u32tmm_8 = 0;
1697*53ee8cc1Swenshuai.xi #endif
1698*53ee8cc1Swenshuai.xi 
1699*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1700*53ee8cc1Swenshuai.xi     DBG_DOMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
1701*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][beg]LoadDspCodeToSDRAM, code_n=0x%x\n",code_n));
1702*53ee8cc1Swenshuai.xi     u32tmm_7 = MsOS_GetSystemTime();
1703*53ee8cc1Swenshuai.xi #endif
1704*53ee8cc1Swenshuai.xi 
1705*53ee8cc1Swenshuai.xi     if (_sDMD_MSB123xc_InitData.bEnableSPILoadCode)
1706*53ee8cc1Swenshuai.xi     {
1707*53ee8cc1Swenshuai.xi         (*_sDMD_MSB123xc_InitData.fpMSB123xc_SPIPAD_En)(TRUE);
1708*53ee8cc1Swenshuai.xi         // ------disable to use TS_PAD as SSPI_PAD after load code
1709*53ee8cc1Swenshuai.xi         // [0:0] reg_en_sspi_pad
1710*53ee8cc1Swenshuai.xi         // [1:1] reg_ts_sspi_en, 1: use TS_PAD as SSPI_PAD
1711*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900 + (0x3b) * 2, 0x0002);
1712*53ee8cc1Swenshuai.xi     }
1713*53ee8cc1Swenshuai.xi 
1714*53ee8cc1Swenshuai.xi     switch(code_n)
1715*53ee8cc1Swenshuai.xi     {
1716*53ee8cc1Swenshuai.xi     case MSB123xc_BOOT:
1717*53ee8cc1Swenshuai.xi     {
1718*53ee8cc1Swenshuai.xi         // boot code
1719*53ee8cc1Swenshuai.xi         bRet &= _LoadDspCodeToSDRAM_Boot();
1720*53ee8cc1Swenshuai.xi     }
1721*53ee8cc1Swenshuai.xi     break;
1722*53ee8cc1Swenshuai.xi     case MSB123xc_DVBT2:
1723*53ee8cc1Swenshuai.xi     {
1724*53ee8cc1Swenshuai.xi         // dvbt2 code
1725*53ee8cc1Swenshuai.xi         bRet &= _LoadDspCodeToSDRAM_dvbt2();
1726*53ee8cc1Swenshuai.xi     }
1727*53ee8cc1Swenshuai.xi     break;
1728*53ee8cc1Swenshuai.xi     case MSB123xc_DVBT:
1729*53ee8cc1Swenshuai.xi     {
1730*53ee8cc1Swenshuai.xi         // dvbt
1731*53ee8cc1Swenshuai.xi         bRet &= _LoadDspCodeToSDRAM_dvbt();
1732*53ee8cc1Swenshuai.xi     }
1733*53ee8cc1Swenshuai.xi     break;
1734*53ee8cc1Swenshuai.xi     case MSB123xc_DVBC:
1735*53ee8cc1Swenshuai.xi     {
1736*53ee8cc1Swenshuai.xi         // dvbtc
1737*53ee8cc1Swenshuai.xi         bRet &= _LoadDspCodeToSDRAM_dvbc();
1738*53ee8cc1Swenshuai.xi     }
1739*53ee8cc1Swenshuai.xi     break;
1740*53ee8cc1Swenshuai.xi     case MSB123xc_ALL:
1741*53ee8cc1Swenshuai.xi     default:
1742*53ee8cc1Swenshuai.xi     {
1743*53ee8cc1Swenshuai.xi         // boot+dvbt2+dvbt+dvbc
1744*53ee8cc1Swenshuai.xi         // boot code
1745*53ee8cc1Swenshuai.xi         bRet &= _LoadDspCodeToSDRAM_Boot();
1746*53ee8cc1Swenshuai.xi         // dvbt2
1747*53ee8cc1Swenshuai.xi         bRet &= _LoadDspCodeToSDRAM_dvbt2();
1748*53ee8cc1Swenshuai.xi         // dvbt
1749*53ee8cc1Swenshuai.xi         bRet &= _LoadDspCodeToSDRAM_dvbt();
1750*53ee8cc1Swenshuai.xi         // dvbtc
1751*53ee8cc1Swenshuai.xi         bRet &= _LoadDspCodeToSDRAM_dvbc();
1752*53ee8cc1Swenshuai.xi     }
1753*53ee8cc1Swenshuai.xi     break;
1754*53ee8cc1Swenshuai.xi     }
1755*53ee8cc1Swenshuai.xi 
1756*53ee8cc1Swenshuai.xi     if (_sDMD_MSB123xc_InitData.bEnableSPILoadCode)
1757*53ee8cc1Swenshuai.xi     {
1758*53ee8cc1Swenshuai.xi         // ------disable to use TS_PAD as SSPI_PAD after load code
1759*53ee8cc1Swenshuai.xi         // [0:0] reg_en_sspi_pad
1760*53ee8cc1Swenshuai.xi         // [1:1] reg_ts_sspi_en, 1: use TS_PAD as SSPI_PAD
1761*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB123xc_SetReg2Bytes(0x0900 + (0x3b) * 2, 0x0001);
1762*53ee8cc1Swenshuai.xi         (*_sDMD_MSB123xc_InitData.fpMSB123xc_SPIPAD_En)(FALSE);
1763*53ee8cc1Swenshuai.xi     }
1764*53ee8cc1Swenshuai.xi 
1765*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1766*53ee8cc1Swenshuai.xi     u32tmm_8 = MsOS_GetSystemTime();
1767*53ee8cc1Swenshuai.xi     printf("[tmm4]t8-t7 = %ld (%ld - %ld)\n",u32tmm_8-u32tmm_7,u32tmm_8,u32tmm_7);
1768*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][end]LoadDspCodeToSDRAM, code_n=0x%x, bRet=0x%x\n",code_n,bRet));
1769*53ee8cc1Swenshuai.xi #endif
1770*53ee8cc1Swenshuai.xi 
1771*53ee8cc1Swenshuai.xi     return bRet;
1772*53ee8cc1Swenshuai.xi }
1773*53ee8cc1Swenshuai.xi 
_MSB123xc_MEM_switch(MS_U8 mem_type)1774*53ee8cc1Swenshuai.xi static MS_BOOL _MSB123xc_MEM_switch(MS_U8 mem_type)
1775*53ee8cc1Swenshuai.xi {
1776*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
1777*53ee8cc1Swenshuai.xi     MS_U8 u8_tmp = 0;
1778*53ee8cc1Swenshuai.xi     MS_U16 timeout = 0;
1779*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1780*53ee8cc1Swenshuai.xi     MS_U32 u32tmm_15 = 0, u32tmm_16 = 0;
1781*53ee8cc1Swenshuai.xi #endif
1782*53ee8cc1Swenshuai.xi 
1783*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1784*53ee8cc1Swenshuai.xi     DBG_DOMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
1785*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][beg]MSB123xc_MEM_switch, mem_type=0x%x\n",mem_type));
1786*53ee8cc1Swenshuai.xi     u32tmm_15 = MsOS_GetSystemTime();
1787*53ee8cc1Swenshuai.xi #endif
1788*53ee8cc1Swenshuai.xi 
1789*53ee8cc1Swenshuai.xi     if(mem_type == 1)
1790*53ee8cc1Swenshuai.xi     {
1791*53ee8cc1Swenshuai.xi 
1792*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg(0x2B80,0x10);
1793*53ee8cc1Swenshuai.xi 
1794*53ee8cc1Swenshuai.xi         // SRAM_START_ADDR 0x0000
1795*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1000,0x0000);
1796*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1004,0x0000);
1797*53ee8cc1Swenshuai.xi 
1798*53ee8cc1Swenshuai.xi         // SRAM_END_ADDR 0x7FFF
1799*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1002,0x0000);
1800*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1006,0x7FFF);
1801*53ee8cc1Swenshuai.xi 
1802*53ee8cc1Swenshuai.xi         // DRAM_START_ADDR 0x8000
1803*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1008,0x0000);
1804*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x100C,0x8000);
1805*53ee8cc1Swenshuai.xi 
1806*53ee8cc1Swenshuai.xi 
1807*53ee8cc1Swenshuai.xi         // DRAM_END_ADDR    0xFFFF
1808*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x100A,0x0000);
1809*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x100E,0xFFFF);
1810*53ee8cc1Swenshuai.xi 
1811*53ee8cc1Swenshuai.xi         // Enable SRAM&SDRAM memory map
1812*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg(0x1018,0x05);
1813*53ee8cc1Swenshuai.xi 
1814*53ee8cc1Swenshuai.xi         // Wait memory map to be enabled
1815*53ee8cc1Swenshuai.xi         do
1816*53ee8cc1Swenshuai.xi         {
1817*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB123xc_GetReg(0x1018,&u8_tmp);
1818*53ee8cc1Swenshuai.xi             if(timeout++ > 500)
1819*53ee8cc1Swenshuai.xi             {
1820*53ee8cc1Swenshuai.xi                 printf("@msb123xc, D+S memory mapping failure.!!!\n");
1821*53ee8cc1Swenshuai.xi                 return FALSE;
1822*53ee8cc1Swenshuai.xi             }
1823*53ee8cc1Swenshuai.xi         }
1824*53ee8cc1Swenshuai.xi         while(u8_tmp != 0x05);
1825*53ee8cc1Swenshuai.xi     }
1826*53ee8cc1Swenshuai.xi     else if(mem_type == 0)
1827*53ee8cc1Swenshuai.xi     {
1828*53ee8cc1Swenshuai.xi         // Enable SRAM&SDRAM memory map
1829*53ee8cc1Swenshuai.xi 
1830*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg(0x2B80,0x10);
1831*53ee8cc1Swenshuai.xi 
1832*53ee8cc1Swenshuai.xi         // DRAM_START_ADDR 0x8000
1833*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x1008,0x0000);
1834*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x100C,0x0000);
1835*53ee8cc1Swenshuai.xi 
1836*53ee8cc1Swenshuai.xi 
1837*53ee8cc1Swenshuai.xi         // DRAM_END_ADDR    0xFFFF
1838*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x100A,0x0000);
1839*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg2Bytes(0x100E,0x7FFF);
1840*53ee8cc1Swenshuai.xi 
1841*53ee8cc1Swenshuai.xi         // Enable SRAM&SDRAM memory map
1842*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg(0x1018,0x04);
1843*53ee8cc1Swenshuai.xi 
1844*53ee8cc1Swenshuai.xi         // Wait memory map to be enabled
1845*53ee8cc1Swenshuai.xi         do
1846*53ee8cc1Swenshuai.xi         {
1847*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB123xc_GetReg(0x1018,&u8_tmp);
1848*53ee8cc1Swenshuai.xi             if(timeout++ > 500)
1849*53ee8cc1Swenshuai.xi             {
1850*53ee8cc1Swenshuai.xi                 printf("@msb123xc, D memory mapping failure.!!!\n");
1851*53ee8cc1Swenshuai.xi                 return FALSE;
1852*53ee8cc1Swenshuai.xi             }
1853*53ee8cc1Swenshuai.xi         }
1854*53ee8cc1Swenshuai.xi         while(u8_tmp != 0x04);
1855*53ee8cc1Swenshuai.xi     }
1856*53ee8cc1Swenshuai.xi     else
1857*53ee8cc1Swenshuai.xi     {
1858*53ee8cc1Swenshuai.xi         printf("@msb123xc, invalid mem type mapping.\n");
1859*53ee8cc1Swenshuai.xi         return FALSE;
1860*53ee8cc1Swenshuai.xi     }
1861*53ee8cc1Swenshuai.xi 
1862*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1863*53ee8cc1Swenshuai.xi     u32tmm_16 = MsOS_GetSystemTime();
1864*53ee8cc1Swenshuai.xi     printf("[tmm8]t16-t15 = %ld (%ld - %ld)\n",u32tmm_16-u32tmm_15,u32tmm_16,u32tmm_15);
1865*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][end]MSB123xc_MEM_switch, , mem_type=0x%x, bRet=0x%x\n",mem_type,bRet));
1866*53ee8cc1Swenshuai.xi #endif
1867*53ee8cc1Swenshuai.xi 
1868*53ee8cc1Swenshuai.xi     return bRet;
1869*53ee8cc1Swenshuai.xi }
1870*53ee8cc1Swenshuai.xi 
_LoadSdram2Sram(MS_U8 CodeNum)1871*53ee8cc1Swenshuai.xi static MS_BOOL _LoadSdram2Sram(MS_U8 CodeNum)
1872*53ee8cc1Swenshuai.xi {
1873*53ee8cc1Swenshuai.xi     MS_BOOL bRet = true;
1874*53ee8cc1Swenshuai.xi     MS_U8   u8_tmp = 0;
1875*53ee8cc1Swenshuai.xi     MS_U8   u8DoneFlag = 0;
1876*53ee8cc1Swenshuai.xi     MS_U32  u32Timeout = 0;
1877*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1878*53ee8cc1Swenshuai.xi     MS_U32 u32tmm_17 = 0, u32tmm_18 = 0;
1879*53ee8cc1Swenshuai.xi #endif
1880*53ee8cc1Swenshuai.xi 
1881*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1882*53ee8cc1Swenshuai.xi     DBG_DOMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
1883*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][beg]LoadSdram2Sram, g_sram_code=0x%x, codeNum=0x%x\n",u8DMD_MSB123xc_Sram_Code,CodeNum));
1884*53ee8cc1Swenshuai.xi     u32tmm_17 = MsOS_GetSystemTime();
1885*53ee8cc1Swenshuai.xi #endif
1886*53ee8cc1Swenshuai.xi 
1887*53ee8cc1Swenshuai.xi     if(CodeNum == u8DMD_MSB123xc_Sram_Code)
1888*53ee8cc1Swenshuai.xi     {
1889*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1890*53ee8cc1Swenshuai.xi         printf("[msb123xc]LoadSdram2Sram, code is available.\n");
1891*53ee8cc1Swenshuai.xi #endif
1892*53ee8cc1Swenshuai.xi         return bRet;
1893*53ee8cc1Swenshuai.xi     }
1894*53ee8cc1Swenshuai.xi 
1895*53ee8cc1Swenshuai.xi     bRet &= _MSB123xc_MEM_switch(0);
1896*53ee8cc1Swenshuai.xi 
1897*53ee8cc1Swenshuai.xi     if(CodeNum == MSB123xc_DVBT2)
1898*53ee8cc1Swenshuai.xi         u8_tmp = 1|0x10;
1899*53ee8cc1Swenshuai.xi     else if(CodeNum == MSB123xc_DVBT)
1900*53ee8cc1Swenshuai.xi         u8_tmp = 2|0x10;
1901*53ee8cc1Swenshuai.xi     else if(CodeNum == MSB123xc_DVBC)
1902*53ee8cc1Swenshuai.xi         u8_tmp = 3|0x10;
1903*53ee8cc1Swenshuai.xi     else
1904*53ee8cc1Swenshuai.xi         u8_tmp = 0|0x10;
1905*53ee8cc1Swenshuai.xi 
1906*53ee8cc1Swenshuai.xi     // Assign f/w code type to load => 0x11: dvbt2, 0x12: dvbt, 0x13: dvbc
1907*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_SetReg(0x0900+(0x4f)*2, u8_tmp);
1908*53ee8cc1Swenshuai.xi 
1909*53ee8cc1Swenshuai.xi     // enable miu mask, miu, mcu, gdma
1910*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_SetReg(0x1200+(0x23)*2 + 1,0x0f);
1911*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_SetReg(0x1200+(0x23)*2,0xf0);
1912*53ee8cc1Swenshuai.xi 
1913*53ee8cc1Swenshuai.xi     MsOS_DelayTaskUs(10);
1914*53ee8cc1Swenshuai.xi     // enable mcu
1915*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_SetReg(0x0b00+(0x19)*2, 0x00);
1916*53ee8cc1Swenshuai.xi 
1917*53ee8cc1Swenshuai.xi     do
1918*53ee8cc1Swenshuai.xi     {
1919*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_GetReg(0x0900+(0x4f)*2, &u8DoneFlag);
1920*53ee8cc1Swenshuai.xi 
1921*53ee8cc1Swenshuai.xi         if (u32Timeout++ > 500)
1922*53ee8cc1Swenshuai.xi         {
1923*53ee8cc1Swenshuai.xi             printf("@msb123xc, LoadSdram2Sram boot move code fail.!!!\n");
1924*53ee8cc1Swenshuai.xi             return FALSE;
1925*53ee8cc1Swenshuai.xi         }
1926*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(1*1000);
1927*53ee8cc1Swenshuai.xi 
1928*53ee8cc1Swenshuai.xi     }
1929*53ee8cc1Swenshuai.xi     while(u8DoneFlag != 0xaa);
1930*53ee8cc1Swenshuai.xi 
1931*53ee8cc1Swenshuai.xi     // mask miu access of mcu
1932*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_SetReg(0x1200+(0x23)*2,0xf2);
1933*53ee8cc1Swenshuai.xi 
1934*53ee8cc1Swenshuai.xi     // 10us delay
1935*53ee8cc1Swenshuai.xi     MsOS_DelayTaskUs(10);
1936*53ee8cc1Swenshuai.xi 
1937*53ee8cc1Swenshuai.xi     // Disable MCU
1938*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_SetReg(0x0b00+(0x19)*2, 0x03);
1939*53ee8cc1Swenshuai.xi 
1940*53ee8cc1Swenshuai.xi     // enable miu mask, miu, mcu, gdma
1941*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_SetReg(0x1200+(0x23)*2 + 1,0x0f);
1942*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_SetReg(0x1200+(0x23)*2,0xf0);
1943*53ee8cc1Swenshuai.xi 
1944*53ee8cc1Swenshuai.xi     bRet &= _MSB123xc_MEM_switch(1);
1945*53ee8cc1Swenshuai.xi 
1946*53ee8cc1Swenshuai.xi     if(bRet == FALSE)
1947*53ee8cc1Swenshuai.xi     {
1948*53ee8cc1Swenshuai.xi         u8DMD_MSB123xc_Sram_Code = 0x00;
1949*53ee8cc1Swenshuai.xi     }
1950*53ee8cc1Swenshuai.xi     else
1951*53ee8cc1Swenshuai.xi     {
1952*53ee8cc1Swenshuai.xi         u8DMD_MSB123xc_Sram_Code = CodeNum;
1953*53ee8cc1Swenshuai.xi     }
1954*53ee8cc1Swenshuai.xi 
1955*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1956*53ee8cc1Swenshuai.xi     u32tmm_18 = MsOS_GetSystemTime();
1957*53ee8cc1Swenshuai.xi     printf("[tmm9]t18-t17 = %ld (%ld - %ld)\n",u32tmm_18-u32tmm_17,u32tmm_18,u32tmm_17);
1958*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][end]LoadSdram2Sram, codeNum=0x%x, g_sram_code=0x%x, bRet=0x%x\n",CodeNum,u8DMD_MSB123xc_Sram_Code,bRet));
1959*53ee8cc1Swenshuai.xi #endif
1960*53ee8cc1Swenshuai.xi 
1961*53ee8cc1Swenshuai.xi     return bRet;
1962*53ee8cc1Swenshuai.xi }
1963*53ee8cc1Swenshuai.xi 
_DTV_DVBC_DSPReg_Init(void)1964*53ee8cc1Swenshuai.xi static MS_BOOL  _DTV_DVBC_DSPReg_Init(void)
1965*53ee8cc1Swenshuai.xi {
1966*53ee8cc1Swenshuai.xi     MS_U8    idx = 0;
1967*53ee8cc1Swenshuai.xi 
1968*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1969*53ee8cc1Swenshuai.xi     DBG_DOMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
1970*53ee8cc1Swenshuai.xi #endif
1971*53ee8cc1Swenshuai.xi     for (idx = 0; idx<((MS_U8)DVBC_PARAM_LEN - (MS_U8)C_opmode_rfagc_en); idx++)
1972*53ee8cc1Swenshuai.xi     {
1973*53ee8cc1Swenshuai.xi         if( _MDrv_DMD_MSB123xc_SetDSPReg(idx + (MS_U8)C_opmode_rfagc_en, MSB123xc_DVBC_DSPREG_TABLE[idx])!=TRUE)
1974*53ee8cc1Swenshuai.xi         {
1975*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1976*53ee8cc1Swenshuai.xi             ERR_DOMOD_MSB(printf("dsp reg init NG\n"));
1977*53ee8cc1Swenshuai.xi #endif
1978*53ee8cc1Swenshuai.xi             return FALSE;
1979*53ee8cc1Swenshuai.xi         }
1980*53ee8cc1Swenshuai.xi     }
1981*53ee8cc1Swenshuai.xi 
1982*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1983*53ee8cc1Swenshuai.xi     ERR_DOMOD_MSB(printf("DVBC dsp reg init ok\n"));
1984*53ee8cc1Swenshuai.xi #endif
1985*53ee8cc1Swenshuai.xi 
1986*53ee8cc1Swenshuai.xi     return TRUE;
1987*53ee8cc1Swenshuai.xi }
1988*53ee8cc1Swenshuai.xi 
1989*53ee8cc1Swenshuai.xi 
_DTV_DVBT_DSPReg_CRC(void)1990*53ee8cc1Swenshuai.xi static MS_U8  _DTV_DVBT_DSPReg_CRC(void)
1991*53ee8cc1Swenshuai.xi {
1992*53ee8cc1Swenshuai.xi     MS_U8 crc = 0;
1993*53ee8cc1Swenshuai.xi     MS_U8 idx = 0;
1994*53ee8cc1Swenshuai.xi 
1995*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
1996*53ee8cc1Swenshuai.xi     DBG_DOMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
1997*53ee8cc1Swenshuai.xi #endif
1998*53ee8cc1Swenshuai.xi     for (idx = 0; idx<(sizeof(MSB123xc_DVBT_DSPREG_TABLE)); idx++)
1999*53ee8cc1Swenshuai.xi     {
2000*53ee8cc1Swenshuai.xi         crc ^= MSB123xc_DVBT_DSPREG_TABLE[idx];
2001*53ee8cc1Swenshuai.xi     }
2002*53ee8cc1Swenshuai.xi 
2003*53ee8cc1Swenshuai.xi     crc = ~crc;
2004*53ee8cc1Swenshuai.xi 
2005*53ee8cc1Swenshuai.xi     return crc;
2006*53ee8cc1Swenshuai.xi }
2007*53ee8cc1Swenshuai.xi 
_DTV_DVBT_DSPReg_Init(void)2008*53ee8cc1Swenshuai.xi static MS_BOOL  _DTV_DVBT_DSPReg_Init(void)
2009*53ee8cc1Swenshuai.xi {
2010*53ee8cc1Swenshuai.xi     //MS_U8    idx = 0;
2011*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2012*53ee8cc1Swenshuai.xi     MS_U32 u32tmm_7 = 0, u32tmm_8 = 0;
2013*53ee8cc1Swenshuai.xi #endif
2014*53ee8cc1Swenshuai.xi 
2015*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2016*53ee8cc1Swenshuai.xi     DBG_DOMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2017*53ee8cc1Swenshuai.xi     u32tmm_7 = MsOS_GetSystemTime();
2018*53ee8cc1Swenshuai.xi #endif
2019*53ee8cc1Swenshuai.xi 
2020*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB123xc_SetDSPReg((MS_U8)T_CONFIG_FC_L, MSB123xc_DVBT_DSPREG_TABLE[0x13]) != TRUE)
2021*53ee8cc1Swenshuai.xi     {
2022*53ee8cc1Swenshuai.xi         printf("T2 dsp reg init NG\n");
2023*53ee8cc1Swenshuai.xi     }
2024*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB123xc_SetDSPReg((MS_U8)T_CONFIG_FC_H, MSB123xc_DVBT_DSPREG_TABLE[0x14]) != TRUE)
2025*53ee8cc1Swenshuai.xi     {
2026*53ee8cc1Swenshuai.xi         printf("T2 dsp reg init NG\n");
2027*53ee8cc1Swenshuai.xi     }
2028*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB123xc_SetDSPReg((MS_U8)T_CONFIG_BW, MSB123xc_DVBT_DSPREG_TABLE[0x17]) != TRUE)
2029*53ee8cc1Swenshuai.xi     {
2030*53ee8cc1Swenshuai.xi         printf("T2 dsp reg init NG\n");
2031*53ee8cc1Swenshuai.xi     }
2032*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB123xc_SetDSPReg((MS_U8)T_CONFIG_IQ_SWAP, MSB123xc_DVBT_DSPREG_TABLE[0x1F]) != TRUE)
2033*53ee8cc1Swenshuai.xi     {
2034*53ee8cc1Swenshuai.xi         printf("T2 dsp reg init NG\n");
2035*53ee8cc1Swenshuai.xi     }
2036*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB123xc_SetDSPReg((MS_U8)T_CONFIG_TS_SERIAL, MSB123xc_DVBT_DSPREG_TABLE[0x2B]) != TRUE)
2037*53ee8cc1Swenshuai.xi     {
2038*53ee8cc1Swenshuai.xi         printf("T2 dsp reg init NG\n");
2039*53ee8cc1Swenshuai.xi     }
2040*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB123xc_SetDSPReg((MS_U8)T_CONFIG_TS_CLK_RATE, MSB123xc_DVBT_DSPREG_TABLE[0x2C]) != TRUE)
2041*53ee8cc1Swenshuai.xi     {
2042*53ee8cc1Swenshuai.xi         printf("T2 dsp reg init NG\n");
2043*53ee8cc1Swenshuai.xi     }
2044*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB123xc_SetDSPReg((MS_U8)T_CONFIG_TS_OUT_INV, MSB123xc_DVBT_DSPREG_TABLE[0x2D]) != TRUE)
2045*53ee8cc1Swenshuai.xi     {
2046*53ee8cc1Swenshuai.xi         printf("T2 dsp reg init NG\n");
2047*53ee8cc1Swenshuai.xi     }
2048*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB123xc_SetDSPReg((MS_U8)T_CONFIG_TS_DATA_SWAP, MSB123xc_DVBT_DSPREG_TABLE[0x2E]) != TRUE)
2049*53ee8cc1Swenshuai.xi     {
2050*53ee8cc1Swenshuai.xi         printf("T2 dsp reg init NG\n");
2051*53ee8cc1Swenshuai.xi     }
2052*53ee8cc1Swenshuai.xi 
2053*53ee8cc1Swenshuai.xi 
2054*53ee8cc1Swenshuai.xi     /*
2055*53ee8cc1Swenshuai.xi         for (idx = 0; idx<((MS_U8)DVBT_PARAM_LEN - (MS_U8)T_OPMODE_RFAGC_EN - 1); idx++)
2056*53ee8cc1Swenshuai.xi         {
2057*53ee8cc1Swenshuai.xi             if( _MDrv_DMD_MSB123xc_SetDSPReg(idx + (MS_U8)T_OPMODE_RFAGC_EN, MSB123xc_DVBT_DSPREG_TABLE[idx])!=TRUE)
2058*53ee8cc1Swenshuai.xi             {
2059*53ee8cc1Swenshuai.xi                 printf("dsp reg init NG\n");
2060*53ee8cc1Swenshuai.xi                 return FALSE;
2061*53ee8cc1Swenshuai.xi             }
2062*53ee8cc1Swenshuai.xi         }
2063*53ee8cc1Swenshuai.xi 
2064*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
2065*53ee8cc1Swenshuai.xi         u32tmm_8 = MsOS_GetSystemTime();
2066*53ee8cc1Swenshuai.xi         printf("[1111]t8 - t7 = %ld (%ld - %ld) \n",u32tmm_8-u32tmm_7,u32tmm_8,u32tmm_7);
2067*53ee8cc1Swenshuai.xi         u32tmm_7 = MsOS_GetSystemTime();
2068*53ee8cc1Swenshuai.xi         #endif
2069*53ee8cc1Swenshuai.xi 
2070*53ee8cc1Swenshuai.xi         MSB123xc_DVBT_DSPREG_TABLE[(MS_U8)T_PARAM_CHECK_SUM-(MS_U8)T_OPMODE_RFAGC_EN] = _DTV_DVBT_DSPReg_CRC();
2071*53ee8cc1Swenshuai.xi 
2072*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
2073*53ee8cc1Swenshuai.xi         u32tmm_8 = MsOS_GetSystemTime();
2074*53ee8cc1Swenshuai.xi         printf("[2222]t8 - t7 = %ld (%ld - %ld) \n",u32tmm_8-u32tmm_7,u32tmm_8,u32tmm_7);
2075*53ee8cc1Swenshuai.xi         u32tmm_7 = MsOS_GetSystemTime();
2076*53ee8cc1Swenshuai.xi         #endif
2077*53ee8cc1Swenshuai.xi 
2078*53ee8cc1Swenshuai.xi         if( _MDrv_DMD_MSB123xc_SetDSPReg((MS_U8)T_PARAM_CHECK_SUM, MSB123xc_DVBT_DSPREG_TABLE[(MS_U8)T_PARAM_CHECK_SUM-(MS_U8)T_OPMODE_RFAGC_EN])!=TRUE)
2079*53ee8cc1Swenshuai.xi         {
2080*53ee8cc1Swenshuai.xi             printf("dsp reg write crc NG\n");
2081*53ee8cc1Swenshuai.xi             return FALSE;
2082*53ee8cc1Swenshuai.xi         }
2083*53ee8cc1Swenshuai.xi     */
2084*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2085*53ee8cc1Swenshuai.xi     u32tmm_8 = MsOS_GetSystemTime();
2086*53ee8cc1Swenshuai.xi     printf("[3333]t8 - t7 = %ld (%ld - %ld) \n",u32tmm_8-u32tmm_7,u32tmm_8,u32tmm_7);
2087*53ee8cc1Swenshuai.xi #endif
2088*53ee8cc1Swenshuai.xi 
2089*53ee8cc1Swenshuai.xi     printf("dvbt dsp reg init ok\n");
2090*53ee8cc1Swenshuai.xi 
2091*53ee8cc1Swenshuai.xi     return TRUE;
2092*53ee8cc1Swenshuai.xi }
2093*53ee8cc1Swenshuai.xi 
_DTV_DVBT2_DSPReg_Init(void)2094*53ee8cc1Swenshuai.xi static MS_BOOL _DTV_DVBT2_DSPReg_Init(void)
2095*53ee8cc1Swenshuai.xi {
2096*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2097*53ee8cc1Swenshuai.xi     DBG_DOMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2098*53ee8cc1Swenshuai.xi #endif
2099*53ee8cc1Swenshuai.xi 
2100*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB123xc_SetDSPReg((MS_U8)E_T2_BW, MSB123xc_DVBT2_DSPREG_TABLE[0]) != TRUE)
2101*53ee8cc1Swenshuai.xi     {
2102*53ee8cc1Swenshuai.xi         printf("T2 dsp reg init NG\n");
2103*53ee8cc1Swenshuai.xi     }
2104*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB123xc_SetDSPReg((MS_U8)E_T2_FC_L, MSB123xc_DVBT2_DSPREG_TABLE[1]) != TRUE)
2105*53ee8cc1Swenshuai.xi     {
2106*53ee8cc1Swenshuai.xi         printf("T2 dsp reg init NG\n");
2107*53ee8cc1Swenshuai.xi     }
2108*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB123xc_SetDSPReg((MS_U8)E_T2_FC_H, MSB123xc_DVBT2_DSPREG_TABLE[2]) != TRUE)
2109*53ee8cc1Swenshuai.xi     {
2110*53ee8cc1Swenshuai.xi         printf("T2 dsp reg init NG\n");
2111*53ee8cc1Swenshuai.xi     }
2112*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB123xc_SetDSPReg((MS_U8)E_T2_TS_SERIAL, MSB123xc_DVBT2_DSPREG_TABLE[3]) != TRUE)
2113*53ee8cc1Swenshuai.xi     {
2114*53ee8cc1Swenshuai.xi         printf("T2 dsp reg init NG\n");
2115*53ee8cc1Swenshuai.xi     }
2116*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB123xc_SetDSPReg((MS_U8)E_T2_TS_CLK_RATE, MSB123xc_DVBT2_DSPREG_TABLE[4]) != TRUE)
2117*53ee8cc1Swenshuai.xi     {
2118*53ee8cc1Swenshuai.xi         printf("T2 dsp reg init NG\n");
2119*53ee8cc1Swenshuai.xi     }
2120*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB123xc_SetDSPReg((MS_U8)E_T2_TS_OUT_INV, MSB123xc_DVBT2_DSPREG_TABLE[5]) != TRUE)
2121*53ee8cc1Swenshuai.xi     {
2122*53ee8cc1Swenshuai.xi         printf("T2 dsp reg init NG\n");
2123*53ee8cc1Swenshuai.xi     }
2124*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB123xc_SetDSPReg((MS_U8)E_T2_TS_DATA_SWAP, MSB123xc_DVBT2_DSPREG_TABLE[6]) != TRUE)
2125*53ee8cc1Swenshuai.xi     {
2126*53ee8cc1Swenshuai.xi         printf("T2 dsp reg init NG\n");
2127*53ee8cc1Swenshuai.xi     }
2128*53ee8cc1Swenshuai.xi     if( _MDrv_DMD_MSB123xc_SetDSPReg((MS_U8)E_T2_TS_ERR_POL, MSB123xc_DVBT2_DSPREG_TABLE[7]) != TRUE)
2129*53ee8cc1Swenshuai.xi     {
2130*53ee8cc1Swenshuai.xi         printf("T2 dsp reg init NG\n");
2131*53ee8cc1Swenshuai.xi     }
2132*53ee8cc1Swenshuai.xi 
2133*53ee8cc1Swenshuai.xi     printf("T2 dsp reg init ok\n");
2134*53ee8cc1Swenshuai.xi 
2135*53ee8cc1Swenshuai.xi     return TRUE;
2136*53ee8cc1Swenshuai.xi }
2137*53ee8cc1Swenshuai.xi 
_LoadDSPCode(void)2138*53ee8cc1Swenshuai.xi static MS_BOOL _LoadDSPCode(void)
2139*53ee8cc1Swenshuai.xi {
2140*53ee8cc1Swenshuai.xi     ////MAPI_U32 u32Now = MsOS_GetSystemTime();
2141*53ee8cc1Swenshuai.xi     //printf("\t\t\tLoadDSPCode TIME   %ld (=%ld-%ld)\n", u32Now-u32StartTime, u32Now, u32StartTime);
2142*53ee8cc1Swenshuai.xi     ////DBG_DOMOD_MSB(printf("\t\t\tLoadDSPCode TIME   %ld (=%ld-%ld)\n", u32Now-u32StartTime, u32Now, u32StartTime));//to measure time
2143*53ee8cc1Swenshuai.xi     //u32StartTime = u32Now;
2144*53ee8cc1Swenshuai.xi 
2145*53ee8cc1Swenshuai.xi     MS_U32        u32Timeout = 0;
2146*53ee8cc1Swenshuai.xi     MS_U8         u8DoneFlag = 0;
2147*53ee8cc1Swenshuai.xi     MS_U8         u8Data = 0;
2148*53ee8cc1Swenshuai.xi     MS_BOOL       bRet = true;
2149*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2150*53ee8cc1Swenshuai.xi     MS_U32 u32tmm_9 = 0, u32tmm_10 = 0, u32tmm_11 = 0, u32tmm_12 = 0, u32tmm_13 = 0;
2151*53ee8cc1Swenshuai.xi #endif
2152*53ee8cc1Swenshuai.xi 
2153*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2154*53ee8cc1Swenshuai.xi     DBG_DOMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2155*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][beg]LoadDspCode\n"));
2156*53ee8cc1Swenshuai.xi     DBG_DOMOD_MSB(printf(">>>MSB123xc: Load DSP...\n"));
2157*53ee8cc1Swenshuai.xi #endif
2158*53ee8cc1Swenshuai.xi 
2159*53ee8cc1Swenshuai.xi     switch(eDMD_MSB123xc_CurrentDemodulatorType)
2160*53ee8cc1Swenshuai.xi     {
2161*53ee8cc1Swenshuai.xi     case E_DMD_MSB123xc_DEMOD_DVBT2:
2162*53ee8cc1Swenshuai.xi         u8Data=1;
2163*53ee8cc1Swenshuai.xi         break;
2164*53ee8cc1Swenshuai.xi     case E_DMD_MSB123xc_DEMOD_DVBT:
2165*53ee8cc1Swenshuai.xi         u8Data=2;
2166*53ee8cc1Swenshuai.xi         break;
2167*53ee8cc1Swenshuai.xi     case E_DMD_MSB123xc_DEMOD_DVBC:
2168*53ee8cc1Swenshuai.xi         u8Data=3;
2169*53ee8cc1Swenshuai.xi         break;
2170*53ee8cc1Swenshuai.xi     default:
2171*53ee8cc1Swenshuai.xi         u8Data=2;
2172*53ee8cc1Swenshuai.xi         return FALSE;
2173*53ee8cc1Swenshuai.xi     }
2174*53ee8cc1Swenshuai.xi 
2175*53ee8cc1Swenshuai.xi     if(_sDMD_MSB123xc_InitData.u8WO_SPI_Flash == 1)
2176*53ee8cc1Swenshuai.xi     {
2177*53ee8cc1Swenshuai.xi         MS_U8 u8FirmwareType = MSB123xc_DVBT;
2178*53ee8cc1Swenshuai.xi 
2179*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2180*53ee8cc1Swenshuai.xi         u32tmm_11 = MsOS_GetSystemTime();
2181*53ee8cc1Swenshuai.xi #endif
2182*53ee8cc1Swenshuai.xi 
2183*53ee8cc1Swenshuai.xi         switch (u8Data)
2184*53ee8cc1Swenshuai.xi         {
2185*53ee8cc1Swenshuai.xi         case 1:
2186*53ee8cc1Swenshuai.xi             u8FirmwareType = MSB123xc_DVBT2;
2187*53ee8cc1Swenshuai.xi             break;
2188*53ee8cc1Swenshuai.xi         case 2:
2189*53ee8cc1Swenshuai.xi         default:
2190*53ee8cc1Swenshuai.xi             u8FirmwareType = MSB123xc_DVBT;
2191*53ee8cc1Swenshuai.xi             break;
2192*53ee8cc1Swenshuai.xi         case 3:
2193*53ee8cc1Swenshuai.xi             u8FirmwareType = MSB123xc_DVBC;
2194*53ee8cc1Swenshuai.xi             break;
2195*53ee8cc1Swenshuai.xi         }
2196*53ee8cc1Swenshuai.xi 
2197*53ee8cc1Swenshuai.xi         bRet &= _LoadDspCodeToSDRAM(u8FirmwareType);
2198*53ee8cc1Swenshuai.xi 
2199*53ee8cc1Swenshuai.xi         // mask miu access for all and mcu
2200*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg(0x1200+(0x23)*2 + 1,0x7f);
2201*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg(0x1200+(0x23)*2,0xfe);
2202*53ee8cc1Swenshuai.xi         // 10us delay
2203*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(10);
2204*53ee8cc1Swenshuai.xi 
2205*53ee8cc1Swenshuai.xi         // Disable MCU
2206*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg(0x0b00+(0x19)*2, 0x03);
2207*53ee8cc1Swenshuai.xi 
2208*53ee8cc1Swenshuai.xi         bRet &= _LoadSdram2Sram(u8FirmwareType);
2209*53ee8cc1Swenshuai.xi 
2210*53ee8cc1Swenshuai.xi         // enable miu access of mcu gdma
2211*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg(0x1200+(0x23)*2,0xf0);
2212*53ee8cc1Swenshuai.xi         // 10us delay
2213*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(10);
2214*53ee8cc1Swenshuai.xi 
2215*53ee8cc1Swenshuai.xi         // Enable MCU
2216*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg(0x0b00+(0x19)*2, 0x00);
2217*53ee8cc1Swenshuai.xi     }
2218*53ee8cc1Swenshuai.xi     else
2219*53ee8cc1Swenshuai.xi     {
2220*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2221*53ee8cc1Swenshuai.xi         u32tmm_9 = MsOS_GetSystemTime();
2222*53ee8cc1Swenshuai.xi #endif
2223*53ee8cc1Swenshuai.xi         // mask miu access for all and mcu
2224*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg(0x1200+(0x23)*2 + 1,0x7f);
2225*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg(0x1200+(0x23)*2,0xfe);
2226*53ee8cc1Swenshuai.xi         // 10us delay
2227*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(10);
2228*53ee8cc1Swenshuai.xi 
2229*53ee8cc1Swenshuai.xi         // Disable MCU
2230*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB123xc_SetReg(0x0b00+(0x19)*2, 0x03);
2231*53ee8cc1Swenshuai.xi 
2232*53ee8cc1Swenshuai.xi         // Run code on bootloader
2233*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB123xc_SetReg(0x1000+(0x0c)*2, 0x02);
2234*53ee8cc1Swenshuai.xi 
2235*53ee8cc1Swenshuai.xi         // Assign f/w code type to load => 0: boot-loader 1: dvbt2, 2: dvbt, 3: dvbc
2236*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB123xc_SetReg(0x0900 + (0x4f) * 2, u8Data);
2237*53ee8cc1Swenshuai.xi 
2238*53ee8cc1Swenshuai.xi 
2239*53ee8cc1Swenshuai.xi         // enable miu access of mcu gdma
2240*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg(0x1200+(0x23)*2,0xf0);
2241*53ee8cc1Swenshuai.xi         // 10us delay
2242*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(10);
2243*53ee8cc1Swenshuai.xi 
2244*53ee8cc1Swenshuai.xi         // Enable MCU
2245*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB123xc_SetReg(0x0b00+(0x19)*2, 0x00);
2246*53ee8cc1Swenshuai.xi 
2247*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2248*53ee8cc1Swenshuai.xi         u32tmm_10 = MsOS_GetSystemTime();
2249*53ee8cc1Swenshuai.xi         printf("[tmm8]t10 - t9 = %ld (%ld - %ld)\n",u32tmm_10-u32tmm_9,u32tmm_10,u32tmm_9);
2250*53ee8cc1Swenshuai.xi #endif
2251*53ee8cc1Swenshuai.xi 
2252*53ee8cc1Swenshuai.xi 
2253*53ee8cc1Swenshuai.xi         do
2254*53ee8cc1Swenshuai.xi         {
2255*53ee8cc1Swenshuai.xi             _MDrv_DMD_MSB123xc_GetReg(0x0900+(0x4f)*2, &u8DoneFlag);
2256*53ee8cc1Swenshuai.xi 
2257*53ee8cc1Swenshuai.xi             if (u32Timeout++ > 500)
2258*53ee8cc1Swenshuai.xi                 return FALSE;
2259*53ee8cc1Swenshuai.xi 
2260*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(1*1000);
2261*53ee8cc1Swenshuai.xi 
2262*53ee8cc1Swenshuai.xi         }
2263*53ee8cc1Swenshuai.xi         while(u8DoneFlag != 0xaa);
2264*53ee8cc1Swenshuai.xi 
2265*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2266*53ee8cc1Swenshuai.xi         u32tmm_11 = MsOS_GetSystemTime();
2267*53ee8cc1Swenshuai.xi         printf("[tmm8]t11 - t10 = %ld (%ld - %ld)\n",u32tmm_11-u32tmm_10,u32tmm_11,u32tmm_10);
2268*53ee8cc1Swenshuai.xi #endif
2269*53ee8cc1Swenshuai.xi 
2270*53ee8cc1Swenshuai.xi         // mask miu access for all and mcu
2271*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg(0x1200+(0x23)*2 + 1,0x7f);
2272*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg(0x1200+(0x23)*2,0xfe);
2273*53ee8cc1Swenshuai.xi         // 10us delay
2274*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(10);
2275*53ee8cc1Swenshuai.xi 
2276*53ee8cc1Swenshuai.xi         // Disable MCU
2277*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB123xc_SetReg(0x0b00+(0x19)*2, 0x03);
2278*53ee8cc1Swenshuai.xi 
2279*53ee8cc1Swenshuai.xi         // Run code on loaded firmware
2280*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB123xc_SetReg(0x1000+(0x0c)*2, 0x05);
2281*53ee8cc1Swenshuai.xi 
2282*53ee8cc1Swenshuai.xi         do
2283*53ee8cc1Swenshuai.xi         {
2284*53ee8cc1Swenshuai.xi             _MDrv_DMD_MSB123xc_GetReg(0x1000+(0x0c)*2, &u8DoneFlag);
2285*53ee8cc1Swenshuai.xi 
2286*53ee8cc1Swenshuai.xi             if (u32Timeout++ > 500)
2287*53ee8cc1Swenshuai.xi                 return FALSE;
2288*53ee8cc1Swenshuai.xi 
2289*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(1*1000);
2290*53ee8cc1Swenshuai.xi 
2291*53ee8cc1Swenshuai.xi         }
2292*53ee8cc1Swenshuai.xi         while(u8DoneFlag != 0x05);
2293*53ee8cc1Swenshuai.xi 
2294*53ee8cc1Swenshuai.xi         // enable miu access of mcu gdma
2295*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_SetReg(0x1200+(0x23)*2,0xf0);
2296*53ee8cc1Swenshuai.xi         // 10us delay
2297*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(10);
2298*53ee8cc1Swenshuai.xi 
2299*53ee8cc1Swenshuai.xi         // Enable MCU
2300*53ee8cc1Swenshuai.xi         _MDrv_DMD_MSB123xc_SetReg(0x0b00+(0x19)*2, 0x00);
2301*53ee8cc1Swenshuai.xi     }
2302*53ee8cc1Swenshuai.xi 
2303*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2304*53ee8cc1Swenshuai.xi     u32tmm_12 = MsOS_GetSystemTime();
2305*53ee8cc1Swenshuai.xi     printf("[tmm8]t12 - t11 = %ld (%ld - %ld), TYPE is %d \n",u32tmm_12-u32tmm_11,u32tmm_12,u32tmm_11, eDMD_MSB123xc_CurrentDemodulatorType);
2306*53ee8cc1Swenshuai.xi #endif
2307*53ee8cc1Swenshuai.xi 
2308*53ee8cc1Swenshuai.xi     switch(eDMD_MSB123xc_CurrentDemodulatorType)
2309*53ee8cc1Swenshuai.xi     {
2310*53ee8cc1Swenshuai.xi     case E_DMD_MSB123xc_DEMOD_DVBT2:
2311*53ee8cc1Swenshuai.xi         _DTV_DVBT2_DSPReg_Init();
2312*53ee8cc1Swenshuai.xi         break;
2313*53ee8cc1Swenshuai.xi     case E_DMD_MSB123xc_DEMOD_DVBT:
2314*53ee8cc1Swenshuai.xi         _DTV_DVBT_DSPReg_Init();
2315*53ee8cc1Swenshuai.xi         break;
2316*53ee8cc1Swenshuai.xi     case E_DMD_MSB123xc_DEMOD_DVBC://mick
2317*53ee8cc1Swenshuai.xi         _DTV_DVBC_DSPReg_Init();
2318*53ee8cc1Swenshuai.xi         break;
2319*53ee8cc1Swenshuai.xi     default:
2320*53ee8cc1Swenshuai.xi         return FALSE;
2321*53ee8cc1Swenshuai.xi     }
2322*53ee8cc1Swenshuai.xi 
2323*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2324*53ee8cc1Swenshuai.xi     u32tmm_13 = MsOS_GetSystemTime();
2325*53ee8cc1Swenshuai.xi     printf("[tmm8]t13 - t12 = %ld (%ld - %ld)\n",u32tmm_13-u32tmm_12,u32tmm_13,u32tmm_12);
2326*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][end]LoadDspCode\n"));
2327*53ee8cc1Swenshuai.xi #endif
2328*53ee8cc1Swenshuai.xi 
2329*53ee8cc1Swenshuai.xi     return bRet;
2330*53ee8cc1Swenshuai.xi }
2331*53ee8cc1Swenshuai.xi 
_msb123xc_flash_mode_en(void)2332*53ee8cc1Swenshuai.xi static MS_BOOL _msb123xc_flash_mode_en(void)
2333*53ee8cc1Swenshuai.xi {
2334*53ee8cc1Swenshuai.xi     MS_BOOL  bRet = TRUE;
2335*53ee8cc1Swenshuai.xi     MS_U8    data[5] = {0x53, 0x45, 0x52, 0x44, 0x42};
2336*53ee8cc1Swenshuai.xi     MS_U8    u8MsbData[6] = {0};
2337*53ee8cc1Swenshuai.xi     MS_U8    ch_num  = 3;
2338*53ee8cc1Swenshuai.xi     MS_U8    u8Data  = 0;
2339*53ee8cc1Swenshuai.xi     MS_U16   u16Addr = 0;
2340*53ee8cc1Swenshuai.xi     MS_U8    retry_num = MSB123xc_MAX_FLASH_ON_RETRY_NUM;
2341*53ee8cc1Swenshuai.xi 
2342*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2343*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][beg]msb123xc_flash_mode_en\n"));
2344*53ee8cc1Swenshuai.xi #endif
2345*53ee8cc1Swenshuai.xi 
2346*53ee8cc1Swenshuai.xi     do
2347*53ee8cc1Swenshuai.xi     {
2348*53ee8cc1Swenshuai.xi 
2349*53ee8cc1Swenshuai.xi         if (retry_num != MSB123xc_MAX_FLASH_ON_RETRY_NUM)
2350*53ee8cc1Swenshuai.xi         {
2351*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2352*53ee8cc1Swenshuai.xi             ERR_DOMOD_MSB(printf("[msb123xc][error]flash mode en fail.....retry=%d\n",retry_num);)
2353*53ee8cc1Swenshuai.xi #endif
2354*53ee8cc1Swenshuai.xi         }
2355*53ee8cc1Swenshuai.xi         // bRet = TRUE;
2356*53ee8cc1Swenshuai.xi         // password
2357*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h53(PWD1)->8,h45(PWD2)->8,h52(PWD3)->8,h44(PWD4)->8,h42(PWD5)
2358*53ee8cc1Swenshuai.xi         data[0] = 0x53;
2359*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, data);
2360*53ee8cc1Swenshuai.xi 
2361*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h71(CMD)  //TV.n_iic_
2362*53ee8cc1Swenshuai.xi         data[0] = 0x71;
2363*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, data);
2364*53ee8cc1Swenshuai.xi 
2365*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h81(CMD)  //TV.n_iic_sel_b0
2366*53ee8cc1Swenshuai.xi         data[0] = ((ch_num & 0x01) != 0)? 0x81 : 0x80;
2367*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, data);
2368*53ee8cc1Swenshuai.xi 
2369*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h83(CMD)  //TV.n_iic_sel_b1
2370*53ee8cc1Swenshuai.xi         data[0] = ((ch_num & 0x02) != 0)? 0x83 : 0x82;
2371*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, data);
2372*53ee8cc1Swenshuai.xi 
2373*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h84(CMD)  //TV.n_iic_sel_b2
2374*53ee8cc1Swenshuai.xi         data[0] = ((ch_num & 0x04) != 0)? 0x85 : 0x84;
2375*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, data);
2376*53ee8cc1Swenshuai.xi 
2377*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h53(CMD)  //TV.n_iic_ad_byte_en2, 32bit read/write
2378*53ee8cc1Swenshuai.xi         data[0] = 0x53;
2379*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, data);
2380*53ee8cc1Swenshuai.xi 
2381*53ee8cc1Swenshuai.xi         // 8'hb2(SRID)->8,h7f(CMD)  //TV.n_iic_sel_use_cfg
2382*53ee8cc1Swenshuai.xi         data[0] = 0x7f;
2383*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, data);
2384*53ee8cc1Swenshuai.xi 
2385*53ee8cc1Swenshuai.xi         /*
2386*53ee8cc1Swenshuai.xi             // 8'hb2(SRID)->8,h35(CMD)  //TV.n_iic_use
2387*53ee8cc1Swenshuai.xi             data[0] = 0x35;
2388*53ee8cc1Swenshuai.xi             bRet &= iptr->WriteBytes(0, NULL, 1, data);
2389*53ee8cc1Swenshuai.xi 
2390*53ee8cc1Swenshuai.xi             // 8'hb2(SRID)->8,h71(CMD)  //TV.n_iic_Re-shape
2391*53ee8cc1Swenshuai.xi             data[0] = 0x71;
2392*53ee8cc1Swenshuai.xi             bRet &= iptr->WriteBytes(0, NULL, 1, data);
2393*53ee8cc1Swenshuai.xi         */
2394*53ee8cc1Swenshuai.xi         bRet = TRUE;
2395*53ee8cc1Swenshuai.xi 
2396*53ee8cc1Swenshuai.xi         // confirm first, 0x99 and 0xaa.
2397*53ee8cc1Swenshuai.xi         // beg read register
2398*53ee8cc1Swenshuai.xi         u16Addr = 0x0900+(0x4f<<1);
2399*53ee8cc1Swenshuai.xi         u8Data = 0x0;
2400*53ee8cc1Swenshuai.xi 
2401*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
2402*53ee8cc1Swenshuai.xi         u8MsbData[1] = 0x00;
2403*53ee8cc1Swenshuai.xi         u8MsbData[2] = 0x00;
2404*53ee8cc1Swenshuai.xi         u8MsbData[3] = (u16Addr >> 8) &0xff;
2405*53ee8cc1Swenshuai.xi         u8MsbData[4] = u16Addr &0xff;
2406*53ee8cc1Swenshuai.xi 
2407*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x35;
2408*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
2409*53ee8cc1Swenshuai.xi 
2410*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
2411*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8MsbData);
2412*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_READ_BYTES, 0, NULL, 1, &u8Data);
2413*53ee8cc1Swenshuai.xi 
2414*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x34;
2415*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
2416*53ee8cc1Swenshuai.xi         // end read register
2417*53ee8cc1Swenshuai.xi 
2418*53ee8cc1Swenshuai.xi         if ((u8Data == 0x99) || (u8Data == 0xaa))
2419*53ee8cc1Swenshuai.xi         {
2420*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2421*53ee8cc1Swenshuai.xi             ERR_DOMOD_MSB(printf("[msb123xc][warning]flash is already on....\n");)
2422*53ee8cc1Swenshuai.xi #endif
2423*53ee8cc1Swenshuai.xi             break;
2424*53ee8cc1Swenshuai.xi         }
2425*53ee8cc1Swenshuai.xi         // flash mode enable.
2426*53ee8cc1Swenshuai.xi         // beg read register
2427*53ee8cc1Swenshuai.xi         u16Addr = 0x0900+(0x28<<1)+1;
2428*53ee8cc1Swenshuai.xi         u8Data = 0x0;
2429*53ee8cc1Swenshuai.xi 
2430*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
2431*53ee8cc1Swenshuai.xi         u8MsbData[1] = 0x00;
2432*53ee8cc1Swenshuai.xi         u8MsbData[2] = 0x00;
2433*53ee8cc1Swenshuai.xi         u8MsbData[3] = (u16Addr >> 8) &0xff;
2434*53ee8cc1Swenshuai.xi         u8MsbData[4] = u16Addr &0xff;
2435*53ee8cc1Swenshuai.xi 
2436*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x35;
2437*53ee8cc1Swenshuai.xi 
2438*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
2439*53ee8cc1Swenshuai.xi 
2440*53ee8cc1Swenshuai.xi 
2441*53ee8cc1Swenshuai.xi 
2442*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
2443*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8MsbData);
2444*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_READ_BYTES, 0, NULL, 1, &u8Data);
2445*53ee8cc1Swenshuai.xi 
2446*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x34;
2447*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
2448*53ee8cc1Swenshuai.xi         // end read register
2449*53ee8cc1Swenshuai.xi 
2450*53ee8cc1Swenshuai.xi         // beg write register
2451*53ee8cc1Swenshuai.xi         u16Addr = 0x0900+(0x28<<1) + 1;
2452*53ee8cc1Swenshuai.xi         u8Data &= (0xff-0x01);
2453*53ee8cc1Swenshuai.xi 
2454*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
2455*53ee8cc1Swenshuai.xi         u8MsbData[1] = 0x00;
2456*53ee8cc1Swenshuai.xi         u8MsbData[2] = 0x00;
2457*53ee8cc1Swenshuai.xi         u8MsbData[3] = (u16Addr >> 8) &0xff;
2458*53ee8cc1Swenshuai.xi         u8MsbData[4] = u16Addr &0xff;
2459*53ee8cc1Swenshuai.xi         u8MsbData[5] = u8Data;
2460*53ee8cc1Swenshuai.xi 
2461*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x35;
2462*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
2463*53ee8cc1Swenshuai.xi 
2464*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
2465*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 6, u8MsbData);
2466*53ee8cc1Swenshuai.xi 
2467*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x34;
2468*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
2469*53ee8cc1Swenshuai.xi         // end write register
2470*53ee8cc1Swenshuai.xi 
2471*53ee8cc1Swenshuai.xi         // beg write register
2472*53ee8cc1Swenshuai.xi         u16Addr = 0x0900+(0x06<<1);
2473*53ee8cc1Swenshuai.xi         u8Data = 0x10;
2474*53ee8cc1Swenshuai.xi 
2475*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
2476*53ee8cc1Swenshuai.xi         u8MsbData[1] = 0x00;
2477*53ee8cc1Swenshuai.xi         u8MsbData[2] = 0x00;
2478*53ee8cc1Swenshuai.xi         u8MsbData[3] = (u16Addr >> 8) &0xff;
2479*53ee8cc1Swenshuai.xi         u8MsbData[4] = u16Addr &0xff;
2480*53ee8cc1Swenshuai.xi         u8MsbData[5] = u8Data;
2481*53ee8cc1Swenshuai.xi 
2482*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x35;
2483*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
2484*53ee8cc1Swenshuai.xi 
2485*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
2486*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 6, u8MsbData);
2487*53ee8cc1Swenshuai.xi 
2488*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x34;
2489*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
2490*53ee8cc1Swenshuai.xi         // end write register
2491*53ee8cc1Swenshuai.xi 
2492*53ee8cc1Swenshuai.xi         // beg write register
2493*53ee8cc1Swenshuai.xi 
2494*53ee8cc1Swenshuai.xi         u16Addr = 0x0900+(0x07<<1);
2495*53ee8cc1Swenshuai.xi         u8Data = 0x10;
2496*53ee8cc1Swenshuai.xi 
2497*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
2498*53ee8cc1Swenshuai.xi         u8MsbData[1] = 0x00;
2499*53ee8cc1Swenshuai.xi         u8MsbData[2] = 0x00;
2500*53ee8cc1Swenshuai.xi         u8MsbData[3] = (u16Addr >> 8) &0xff;
2501*53ee8cc1Swenshuai.xi         u8MsbData[4] = u16Addr &0xff;
2502*53ee8cc1Swenshuai.xi         u8MsbData[5] = u8Data;
2503*53ee8cc1Swenshuai.xi 
2504*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x35;
2505*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
2506*53ee8cc1Swenshuai.xi 
2507*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
2508*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 6, u8MsbData);
2509*53ee8cc1Swenshuai.xi 
2510*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x34;
2511*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
2512*53ee8cc1Swenshuai.xi     }
2513*53ee8cc1Swenshuai.xi     while( (bRet == FALSE) && (retry_num-- != 0));
2514*53ee8cc1Swenshuai.xi     // end write register
2515*53ee8cc1Swenshuai.xi 
2516*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2517*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][end]msb123xc_flash_mode_en,bRet=%d\n",bRet));
2518*53ee8cc1Swenshuai.xi #endif
2519*53ee8cc1Swenshuai.xi 
2520*53ee8cc1Swenshuai.xi     return bRet;
2521*53ee8cc1Swenshuai.xi }
2522*53ee8cc1Swenshuai.xi 
_msb123xc_flash_boot_ready_waiting(MS_U8 * ptimeout)2523*53ee8cc1Swenshuai.xi static MS_BOOL _msb123xc_flash_boot_ready_waiting(MS_U8 *ptimeout)
2524*53ee8cc1Swenshuai.xi {
2525*53ee8cc1Swenshuai.xi 
2526*53ee8cc1Swenshuai.xi     MS_BOOL  bRet = TRUE;
2527*53ee8cc1Swenshuai.xi //    MAPI_U8    data[5] = {0x53, 0x45, 0x52, 0x44, 0x42};
2528*53ee8cc1Swenshuai.xi     MS_U8    u8MsbData[6] = {0};
2529*53ee8cc1Swenshuai.xi     MS_U8    u8Data  = 0;
2530*53ee8cc1Swenshuai.xi     MS_U16   u16Addr = 0;
2531*53ee8cc1Swenshuai.xi     MS_U8    u8_timeout = 0;
2532*53ee8cc1Swenshuai.xi 
2533*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2534*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][beg]msb123xc_flash_boot_ready_waiting\n"));
2535*53ee8cc1Swenshuai.xi #endif
2536*53ee8cc1Swenshuai.xi 
2537*53ee8cc1Swenshuai.xi     // wait for flash->dram ready.
2538*53ee8cc1Swenshuai.xi     // read register
2539*53ee8cc1Swenshuai.xi 
2540*53ee8cc1Swenshuai.xi     u16Addr = 0x0900+(0x4f<<1);
2541*53ee8cc1Swenshuai.xi     u8Data = 0x0;
2542*53ee8cc1Swenshuai.xi 
2543*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
2544*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
2545*53ee8cc1Swenshuai.xi     u8MsbData[2] = 0x00;
2546*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u16Addr >> 8) &0xff;
2547*53ee8cc1Swenshuai.xi     u8MsbData[4] = u16Addr &0xff;
2548*53ee8cc1Swenshuai.xi 
2549*53ee8cc1Swenshuai.xi     u8_timeout = 0xff;
2550*53ee8cc1Swenshuai.xi 
2551*53ee8cc1Swenshuai.xi     while( (u8Data != 0x99) && (u8Data != 0xaa) && (u8_timeout-->0))
2552*53ee8cc1Swenshuai.xi     {
2553*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x35;
2554*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
2555*53ee8cc1Swenshuai.xi 
2556*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x10;
2557*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8MsbData);
2558*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_READ_BYTES, 0, NULL, 1, &u8Data);
2559*53ee8cc1Swenshuai.xi 
2560*53ee8cc1Swenshuai.xi         u8MsbData[0] = 0x34;
2561*53ee8cc1Swenshuai.xi         bRet &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
2562*53ee8cc1Swenshuai.xi         // 10ms
2563*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(1000*10);
2564*53ee8cc1Swenshuai.xi     }
2565*53ee8cc1Swenshuai.xi     // end read register
2566*53ee8cc1Swenshuai.xi     *ptimeout = 0;
2567*53ee8cc1Swenshuai.xi     if (u8_timeout == 0x00)
2568*53ee8cc1Swenshuai.xi     {
2569*53ee8cc1Swenshuai.xi         *ptimeout = 1;
2570*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2571*53ee8cc1Swenshuai.xi         ERR_DOMOD_MSB(printf("[msb123xc][error]msb123xc_flash_boot_ready_waiting, timeout....\n");)
2572*53ee8cc1Swenshuai.xi #endif
2573*53ee8cc1Swenshuai.xi     }
2574*53ee8cc1Swenshuai.xi 
2575*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2576*53ee8cc1Swenshuai.xi     DBG_DEMOD_LOAD_I2C(printf("[msb123xc][end]msb123xc_flash_boot_ready_waiting, t=%d\n",u8_timeout));
2577*53ee8cc1Swenshuai.xi #endif
2578*53ee8cc1Swenshuai.xi     return bRet;
2579*53ee8cc1Swenshuai.xi }
2580*53ee8cc1Swenshuai.xi 
_msb123xc_flash_WP_reg_read(MS_U16 u16Addr,MS_U8 * pu8Data)2581*53ee8cc1Swenshuai.xi static MS_BOOL _msb123xc_flash_WP_reg_read(MS_U16 u16Addr, MS_U8 *pu8Data)
2582*53ee8cc1Swenshuai.xi {
2583*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
2584*53ee8cc1Swenshuai.xi     MS_U8   u8MsbData[5];
2585*53ee8cc1Swenshuai.xi 
2586*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
2587*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
2588*53ee8cc1Swenshuai.xi     u8MsbData[2] = 0x00;
2589*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u16Addr >> 8) &0xff;
2590*53ee8cc1Swenshuai.xi     u8MsbData[4] = u16Addr &0xff;
2591*53ee8cc1Swenshuai.xi 
2592*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x35;
2593*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
2594*53ee8cc1Swenshuai.xi 
2595*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
2596*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8MsbData);
2597*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_READ_BYTES, 0, NULL, 1, pu8Data);
2598*53ee8cc1Swenshuai.xi 
2599*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x34;
2600*53ee8cc1Swenshuai.xi     bRet=(*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
2601*53ee8cc1Swenshuai.xi     return bRet;
2602*53ee8cc1Swenshuai.xi }
2603*53ee8cc1Swenshuai.xi 
_msb123xc_flash_WP_reg_write(MS_U16 u16Addr,MS_U8 u8Data)2604*53ee8cc1Swenshuai.xi static MS_BOOL _msb123xc_flash_WP_reg_write(MS_U16 u16Addr, MS_U8 u8Data)
2605*53ee8cc1Swenshuai.xi {
2606*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
2607*53ee8cc1Swenshuai.xi     MS_U8   u8MsbData[6];
2608*53ee8cc1Swenshuai.xi 
2609*53ee8cc1Swenshuai.xi     //bRet &= iptr->SetSpeed(0);
2610*53ee8cc1Swenshuai.xi 
2611*53ee8cc1Swenshuai.xi 
2612*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
2613*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
2614*53ee8cc1Swenshuai.xi     u8MsbData[2] = 0x00;
2615*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u16Addr >> 8) &0xff;
2616*53ee8cc1Swenshuai.xi     u8MsbData[4] = u16Addr &0xff;
2617*53ee8cc1Swenshuai.xi     u8MsbData[5] = u8Data;
2618*53ee8cc1Swenshuai.xi 
2619*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x35;
2620*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
2621*53ee8cc1Swenshuai.xi 
2622*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
2623*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 6, u8MsbData);
2624*53ee8cc1Swenshuai.xi 
2625*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x34;
2626*53ee8cc1Swenshuai.xi     bRet=(*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
2627*53ee8cc1Swenshuai.xi     return bRet;
2628*53ee8cc1Swenshuai.xi }
2629*53ee8cc1Swenshuai.xi 
_msbMSB123xc_flash_WRSR(MS_U8 reg)2630*53ee8cc1Swenshuai.xi static MS_BOOL _msbMSB123xc_flash_WRSR(MS_U8 reg)
2631*53ee8cc1Swenshuai.xi {
2632*53ee8cc1Swenshuai.xi     MS_U8 bWriteData[5]= {0x4D, 0x53, 0x54, 0x41, 0x52};
2633*53ee8cc1Swenshuai.xi     MS_U8     bAddr[1];
2634*53ee8cc1Swenshuai.xi     MS_BOOL   bRet = TRUE;
2635*53ee8cc1Swenshuai.xi 
2636*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, bWriteData);
2637*53ee8cc1Swenshuai.xi 
2638*53ee8cc1Swenshuai.xi     // WREN
2639*53ee8cc1Swenshuai.xi     bAddr[0] = 0x10;
2640*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x06;
2641*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 1, bWriteData);
2642*53ee8cc1Swenshuai.xi 
2643*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x12;
2644*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
2645*53ee8cc1Swenshuai.xi 
2646*53ee8cc1Swenshuai.xi     // WRSR
2647*53ee8cc1Swenshuai.xi     bAddr[0] = 0x10;
2648*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x01;
2649*53ee8cc1Swenshuai.xi     bWriteData[1] = reg;
2650*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 2, bWriteData);
2651*53ee8cc1Swenshuai.xi 
2652*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x12;
2653*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
2654*53ee8cc1Swenshuai.xi 
2655*53ee8cc1Swenshuai.xi     // WRDI
2656*53ee8cc1Swenshuai.xi     bAddr[0] = 0x10;
2657*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x04;
2658*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 1, bWriteData);
2659*53ee8cc1Swenshuai.xi 
2660*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x12;
2661*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
2662*53ee8cc1Swenshuai.xi 
2663*53ee8cc1Swenshuai.xi     // end
2664*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x24;
2665*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
2666*53ee8cc1Swenshuai.xi 
2667*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2668*53ee8cc1Swenshuai.xi     DBG_FLASH_WP(printf("[wb]msbMSB123xc_flash_WRSR, reg=0x%x\n",reg);)
2669*53ee8cc1Swenshuai.xi #endif
2670*53ee8cc1Swenshuai.xi 
2671*53ee8cc1Swenshuai.xi     return bRet;
2672*53ee8cc1Swenshuai.xi }
2673*53ee8cc1Swenshuai.xi 
_msbMSB123xc_flash_SRSR(MS_U8 * p_reg)2674*53ee8cc1Swenshuai.xi static MS_BOOL _msbMSB123xc_flash_SRSR(MS_U8 *p_reg)
2675*53ee8cc1Swenshuai.xi {
2676*53ee8cc1Swenshuai.xi     MS_U8 bWriteData[5]= {0x4D, 0x53, 0x54, 0x41, 0x52};
2677*53ee8cc1Swenshuai.xi     MS_U8     bAddr[1];
2678*53ee8cc1Swenshuai.xi     MS_BOOL   bRet = TRUE;
2679*53ee8cc1Swenshuai.xi 
2680*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, bWriteData);
2681*53ee8cc1Swenshuai.xi 
2682*53ee8cc1Swenshuai.xi     bAddr[0] = 0x10;
2683*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x05;
2684*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 1, bWriteData);
2685*53ee8cc1Swenshuai.xi 
2686*53ee8cc1Swenshuai.xi     bAddr[0] = 0x11;
2687*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_READ_BYTES, 1, bAddr, 1, p_reg);
2688*53ee8cc1Swenshuai.xi 
2689*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x12;
2690*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
2691*53ee8cc1Swenshuai.xi 
2692*53ee8cc1Swenshuai.xi     // end
2693*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x24 ;
2694*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
2695*53ee8cc1Swenshuai.xi 
2696*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2697*53ee8cc1Swenshuai.xi     DBG_FLASH_WP(printf("[wb]msbMSB123xc_flash_SRSR, reg=0x%x\n",*p_reg);)
2698*53ee8cc1Swenshuai.xi #endif
2699*53ee8cc1Swenshuai.xi 
2700*53ee8cc1Swenshuai.xi     return bRet;
2701*53ee8cc1Swenshuai.xi }
2702*53ee8cc1Swenshuai.xi 
_msb123xc_flash_WP(MS_U8 enable)2703*53ee8cc1Swenshuai.xi static MS_BOOL _msb123xc_flash_WP(MS_U8 enable)
2704*53ee8cc1Swenshuai.xi #if 0
2705*53ee8cc1Swenshuai.xi {
2706*53ee8cc1Swenshuai.xi     MAPI_U8 reg = 0;
2707*53ee8cc1Swenshuai.xi     MAPI_BOOL bRet = true;
2708*53ee8cc1Swenshuai.xi     MAPI_U8 u8_count = 0;
2709*53ee8cc1Swenshuai.xi 
2710*53ee8cc1Swenshuai.xi     DBG_FLASH_WP(printf("[wb]msb1233c_flash_WP_Enable=%d\n",enable);)
2711*53ee8cc1Swenshuai.xi 
2712*53ee8cc1Swenshuai.xi     if (enable == 1)
2713*53ee8cc1Swenshuai.xi     {
2714*53ee8cc1Swenshuai.xi         u8_count = 20;
2715*53ee8cc1Swenshuai.xi         do
2716*53ee8cc1Swenshuai.xi         {
2717*53ee8cc1Swenshuai.xi             msb1233c_flash_SRSR(&reg);
2718*53ee8cc1Swenshuai.xi             usleep(1*1000);
2719*53ee8cc1Swenshuai.xi         }
2720*53ee8cc1Swenshuai.xi         while(reg&0x01 && u8_count--);
2721*53ee8cc1Swenshuai.xi 
2722*53ee8cc1Swenshuai.xi         if (u8_count == 0)
2723*53ee8cc1Swenshuai.xi         {
2724*53ee8cc1Swenshuai.xi             bRet = false;
2725*53ee8cc1Swenshuai.xi             DBG_FLASH_WP(printf("[wb]Err, flash_SRSR timeout!!!\n");)
2726*53ee8cc1Swenshuai.xi             return bRet;
2727*53ee8cc1Swenshuai.xi         }
2728*53ee8cc1Swenshuai.xi 
2729*53ee8cc1Swenshuai.xi         msb1233c_flash_WRSR(reg|0x9c);
2730*53ee8cc1Swenshuai.xi 
2731*53ee8cc1Swenshuai.xi 
2732*53ee8cc1Swenshuai.xi         u8_count = 20;
2733*53ee8cc1Swenshuai.xi         do
2734*53ee8cc1Swenshuai.xi         {
2735*53ee8cc1Swenshuai.xi             msb1233c_flash_SRSR(&reg);
2736*53ee8cc1Swenshuai.xi             usleep(1*1000);
2737*53ee8cc1Swenshuai.xi         }
2738*53ee8cc1Swenshuai.xi         while(reg&0x01 && u8_count--);
2739*53ee8cc1Swenshuai.xi 
2740*53ee8cc1Swenshuai.xi         if (u8_count == 0)
2741*53ee8cc1Swenshuai.xi         {
2742*53ee8cc1Swenshuai.xi             bRet = false;
2743*53ee8cc1Swenshuai.xi             DBG_FLASH_WP(printf("[wb]Err, flash_SRSR timeout!!!\n");)
2744*53ee8cc1Swenshuai.xi             return bRet;
2745*53ee8cc1Swenshuai.xi         }
2746*53ee8cc1Swenshuai.xi 
2747*53ee8cc1Swenshuai.xi         // active low
2748*53ee8cc1Swenshuai.xi         // pull low
2749*53ee8cc1Swenshuai.xi         bRet &= msb1233c_flash_WP_reg_read(0x0900+0x63*2+1, &reg);
2750*53ee8cc1Swenshuai.xi         bRet &= msb1233c_flash_WP_reg_write(0x0900+0x63*2+1, reg&(~0x08));
2751*53ee8cc1Swenshuai.xi 
2752*53ee8cc1Swenshuai.xi         // gpio11 output enable
2753*53ee8cc1Swenshuai.xi         bRet &= msb1233c_flash_WP_reg_read(0x0900+0x64*2+1, &reg);
2754*53ee8cc1Swenshuai.xi         bRet &= msb1233c_flash_WP_reg_write(0x0900+0x64*2+1, reg&(~0x08));
2755*53ee8cc1Swenshuai.xi     }
2756*53ee8cc1Swenshuai.xi     else
2757*53ee8cc1Swenshuai.xi     {
2758*53ee8cc1Swenshuai.xi         // unactive high
2759*53ee8cc1Swenshuai.xi         // pull high
2760*53ee8cc1Swenshuai.xi         bRet &= msb1233c_flash_WP_reg_read(0x0900+0x63*2+1, &reg);
2761*53ee8cc1Swenshuai.xi         bRet &= msb1233c_flash_WP_reg_write(0x0900+0x63*2+1, reg|0x08);
2762*53ee8cc1Swenshuai.xi 
2763*53ee8cc1Swenshuai.xi         // gpio11 output enable
2764*53ee8cc1Swenshuai.xi         bRet &= msb1233c_flash_WP_reg_read(0x0900+0x64*2+1, &reg);
2765*53ee8cc1Swenshuai.xi         bRet &= msb1233c_flash_WP_reg_write(0x0900+0x64*2+1, reg&(~0x08));
2766*53ee8cc1Swenshuai.xi 
2767*53ee8cc1Swenshuai.xi         u8_count = 20;
2768*53ee8cc1Swenshuai.xi         do
2769*53ee8cc1Swenshuai.xi         {
2770*53ee8cc1Swenshuai.xi             msb1233c_flash_SRSR(&reg);
2771*53ee8cc1Swenshuai.xi             usleep(1*1000);
2772*53ee8cc1Swenshuai.xi         }
2773*53ee8cc1Swenshuai.xi         while(reg&0x01 && u8_count--);
2774*53ee8cc1Swenshuai.xi 
2775*53ee8cc1Swenshuai.xi         if (u8_count == 0)
2776*53ee8cc1Swenshuai.xi         {
2777*53ee8cc1Swenshuai.xi             bRet = false;
2778*53ee8cc1Swenshuai.xi             DBG_FLASH_WP(printf("[wb]Err, flash_SRSR timeout!!!\n");)
2779*53ee8cc1Swenshuai.xi             return bRet;
2780*53ee8cc1Swenshuai.xi         }
2781*53ee8cc1Swenshuai.xi 
2782*53ee8cc1Swenshuai.xi         msb1233c_flash_WRSR(reg&(~0x9c));
2783*53ee8cc1Swenshuai.xi 
2784*53ee8cc1Swenshuai.xi         u8_count = 20;
2785*53ee8cc1Swenshuai.xi         do
2786*53ee8cc1Swenshuai.xi         {
2787*53ee8cc1Swenshuai.xi             msb1233c_flash_SRSR(&reg);
2788*53ee8cc1Swenshuai.xi             usleep(1*1000);
2789*53ee8cc1Swenshuai.xi         }
2790*53ee8cc1Swenshuai.xi         while(reg&0x01 && u8_count--);
2791*53ee8cc1Swenshuai.xi 
2792*53ee8cc1Swenshuai.xi         if (u8_count == 0)
2793*53ee8cc1Swenshuai.xi         {
2794*53ee8cc1Swenshuai.xi             bRet = false;
2795*53ee8cc1Swenshuai.xi             DBG_FLASH_WP(printf("[wb]Err, flash_SRSR timeout!!!\n");)
2796*53ee8cc1Swenshuai.xi             return bRet;
2797*53ee8cc1Swenshuai.xi         }
2798*53ee8cc1Swenshuai.xi     }
2799*53ee8cc1Swenshuai.xi 
2800*53ee8cc1Swenshuai.xi     return bRet;
2801*53ee8cc1Swenshuai.xi }
2802*53ee8cc1Swenshuai.xi #else
2803*53ee8cc1Swenshuai.xi {
2804*53ee8cc1Swenshuai.xi     MS_U8 reg = 0;
2805*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
2806*53ee8cc1Swenshuai.xi     MS_U8 u8_count = 0;
2807*53ee8cc1Swenshuai.xi 
2808*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2809*53ee8cc1Swenshuai.xi     DBG_FLASH_WP(printf("[wb]msb123xc_flash_WP_Enable=%d\n",enable);)
2810*53ee8cc1Swenshuai.xi #endif
2811*53ee8cc1Swenshuai.xi 
2812*53ee8cc1Swenshuai.xi     if (enable == 1)
2813*53ee8cc1Swenshuai.xi     {
2814*53ee8cc1Swenshuai.xi         u8_count = 20;
2815*53ee8cc1Swenshuai.xi         do
2816*53ee8cc1Swenshuai.xi         {
2817*53ee8cc1Swenshuai.xi             _msbMSB123xc_flash_SRSR(&reg);
2818*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(1*1000);
2819*53ee8cc1Swenshuai.xi         }
2820*53ee8cc1Swenshuai.xi         while(reg&0x01 && u8_count--);
2821*53ee8cc1Swenshuai.xi 
2822*53ee8cc1Swenshuai.xi         if (u8_count == 0)
2823*53ee8cc1Swenshuai.xi         {
2824*53ee8cc1Swenshuai.xi             bRet = FALSE;
2825*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2826*53ee8cc1Swenshuai.xi             DBG_FLASH_WP(printf("[wb]Err, flash_SRSR timeout!!!\n");)
2827*53ee8cc1Swenshuai.xi #endif
2828*53ee8cc1Swenshuai.xi             return bRet;
2829*53ee8cc1Swenshuai.xi         }
2830*53ee8cc1Swenshuai.xi 
2831*53ee8cc1Swenshuai.xi         _msbMSB123xc_flash_WRSR(reg|0x9c);
2832*53ee8cc1Swenshuai.xi         u8_count = 20;
2833*53ee8cc1Swenshuai.xi 
2834*53ee8cc1Swenshuai.xi         do
2835*53ee8cc1Swenshuai.xi         {
2836*53ee8cc1Swenshuai.xi             _msbMSB123xc_flash_SRSR(&reg);
2837*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(1*1000);
2838*53ee8cc1Swenshuai.xi         }
2839*53ee8cc1Swenshuai.xi         while(reg&0x01 && u8_count--);
2840*53ee8cc1Swenshuai.xi 
2841*53ee8cc1Swenshuai.xi         if (u8_count == 0)
2842*53ee8cc1Swenshuai.xi         {
2843*53ee8cc1Swenshuai.xi             bRet = FALSE;
2844*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2845*53ee8cc1Swenshuai.xi             DBG_FLASH_WP(printf("[wb]Err, flash_SRSR timeout!!!\n");)
2846*53ee8cc1Swenshuai.xi #endif
2847*53ee8cc1Swenshuai.xi             return bRet;
2848*53ee8cc1Swenshuai.xi         }
2849*53ee8cc1Swenshuai.xi 
2850*53ee8cc1Swenshuai.xi         // active low
2851*53ee8cc1Swenshuai.xi         // pull low
2852*53ee8cc1Swenshuai.xi         bRet &= _msb123xc_flash_WP_reg_read(0x0A00+0x22*2, &reg);
2853*53ee8cc1Swenshuai.xi         bRet &= _msb123xc_flash_WP_reg_write(0x0A00+0x22*2, reg&(~0x01));
2854*53ee8cc1Swenshuai.xi         // gpio11 output enable
2855*53ee8cc1Swenshuai.xi         bRet &= _msb123xc_flash_WP_reg_read(0x0A00+0x22*2, &reg);
2856*53ee8cc1Swenshuai.xi         bRet &= _msb123xc_flash_WP_reg_write(0x0A00+0x22*2, reg&(~0x02));
2857*53ee8cc1Swenshuai.xi     }
2858*53ee8cc1Swenshuai.xi     else
2859*53ee8cc1Swenshuai.xi     {
2860*53ee8cc1Swenshuai.xi         // unactive high
2861*53ee8cc1Swenshuai.xi         // pull high
2862*53ee8cc1Swenshuai.xi         bRet &= _msb123xc_flash_WP_reg_read(0x0A00+0x22*2, &reg);
2863*53ee8cc1Swenshuai.xi         bRet &= _msb123xc_flash_WP_reg_write(0x0A00+0x22*2, reg|0x01);
2864*53ee8cc1Swenshuai.xi         // gpio11 output enable
2865*53ee8cc1Swenshuai.xi         bRet &= _msb123xc_flash_WP_reg_read(0x0A00+0x22*2, &reg);
2866*53ee8cc1Swenshuai.xi         bRet &= _msb123xc_flash_WP_reg_write(0x0A00+0x22*2, reg&(~0x02));
2867*53ee8cc1Swenshuai.xi         u8_count = 20;
2868*53ee8cc1Swenshuai.xi 
2869*53ee8cc1Swenshuai.xi         do
2870*53ee8cc1Swenshuai.xi         {
2871*53ee8cc1Swenshuai.xi             _msbMSB123xc_flash_SRSR(&reg);
2872*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(1*1000);
2873*53ee8cc1Swenshuai.xi         }
2874*53ee8cc1Swenshuai.xi         while(reg&0x01 && u8_count--);
2875*53ee8cc1Swenshuai.xi 
2876*53ee8cc1Swenshuai.xi         if (u8_count == 0)
2877*53ee8cc1Swenshuai.xi         {
2878*53ee8cc1Swenshuai.xi             bRet = FALSE;
2879*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2880*53ee8cc1Swenshuai.xi             DBG_FLASH_WP(printf("[wb]Err, flash_SRSR timeout!!!\n");)
2881*53ee8cc1Swenshuai.xi #endif
2882*53ee8cc1Swenshuai.xi             return bRet;
2883*53ee8cc1Swenshuai.xi         }
2884*53ee8cc1Swenshuai.xi         _msbMSB123xc_flash_WRSR(reg&(~0x9c));
2885*53ee8cc1Swenshuai.xi         u8_count = 20;
2886*53ee8cc1Swenshuai.xi 
2887*53ee8cc1Swenshuai.xi         do
2888*53ee8cc1Swenshuai.xi         {
2889*53ee8cc1Swenshuai.xi             _msbMSB123xc_flash_SRSR(&reg);
2890*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(1*1000);
2891*53ee8cc1Swenshuai.xi         }
2892*53ee8cc1Swenshuai.xi         while(reg&0x01 && u8_count--);
2893*53ee8cc1Swenshuai.xi 
2894*53ee8cc1Swenshuai.xi         if (u8_count == 0)
2895*53ee8cc1Swenshuai.xi         {
2896*53ee8cc1Swenshuai.xi             bRet = FALSE;
2897*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2898*53ee8cc1Swenshuai.xi             DBG_FLASH_WP(printf("[wb]Err, flash_SRSR timeout!!!\n");)
2899*53ee8cc1Swenshuai.xi #endif
2900*53ee8cc1Swenshuai.xi             return bRet;
2901*53ee8cc1Swenshuai.xi         }
2902*53ee8cc1Swenshuai.xi     }
2903*53ee8cc1Swenshuai.xi     return bRet;
2904*53ee8cc1Swenshuai.xi }
2905*53ee8cc1Swenshuai.xi #endif
2906*53ee8cc1Swenshuai.xi 
2907*53ee8cc1Swenshuai.xi MS_U8 _MSB123xc_CHIP_MATCH_TABLE[] =
2908*53ee8cc1Swenshuai.xi {
2909*53ee8cc1Swenshuai.xi     //Kaiser, Kaiserin, Keltic, Kronus, Kappa , Clippers, keres
2910*53ee8cc1Swenshuai.xi     0x56,       0x41,     0x72,  0x2F,  0x75,   0x86,    0x7E
2911*53ee8cc1Swenshuai.xi };
2912*53ee8cc1Swenshuai.xi 
_msbMSB123xc_set_bonding_option(MS_U16 u16ChipID)2913*53ee8cc1Swenshuai.xi static MS_BOOL _msbMSB123xc_set_bonding_option(MS_U16 u16ChipID)
2914*53ee8cc1Swenshuai.xi {
2915*53ee8cc1Swenshuai.xi     MS_BOOL  bRet = TRUE;
2916*53ee8cc1Swenshuai.xi     MS_U8    u8Idx;
2917*53ee8cc1Swenshuai.xi     MS_U8    u8MatchFlag  = 0;
2918*53ee8cc1Swenshuai.xi     MS_U8    u8Data  = 0;
2919*53ee8cc1Swenshuai.xi     MS_U32    u32_timeout = 0;
2920*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2921*53ee8cc1Swenshuai.xi     DBG_DOMOD_FLOW(printf("%s(),%d\n",__func__,__LINE__));
2922*53ee8cc1Swenshuai.xi #endif
2923*53ee8cc1Swenshuai.xi 
2924*53ee8cc1Swenshuai.xi     printf("_msbMSB123xc_set_bonding_option u16ChipID %x\n", u16ChipID);
2925*53ee8cc1Swenshuai.xi 
2926*53ee8cc1Swenshuai.xi     for (u8Idx = 0 ; u8Idx < sizeof( _MSB123xc_CHIP_MATCH_TABLE) ; u8Idx++)
2927*53ee8cc1Swenshuai.xi     {
2928*53ee8cc1Swenshuai.xi         if(u16ChipID == _MSB123xc_CHIP_MATCH_TABLE[u8Idx])
2929*53ee8cc1Swenshuai.xi         {
2930*53ee8cc1Swenshuai.xi             printf("_MSB123xc_CHIP_MATCH_TABLE matched!\n");
2931*53ee8cc1Swenshuai.xi             u8MatchFlag = 0x01;
2932*53ee8cc1Swenshuai.xi             break;
2933*53ee8cc1Swenshuai.xi         }
2934*53ee8cc1Swenshuai.xi         else
2935*53ee8cc1Swenshuai.xi         {
2936*53ee8cc1Swenshuai.xi             printf("_MSB123xc_CHIP_MATCH_TABLE did not matched!\n");
2937*53ee8cc1Swenshuai.xi             u8MatchFlag = 0x00;
2938*53ee8cc1Swenshuai.xi         }
2939*53ee8cc1Swenshuai.xi     }
2940*53ee8cc1Swenshuai.xi 
2941*53ee8cc1Swenshuai.xi     if (_MSB123xc_I2C_CH_Reset(3) == FALSE)
2942*53ee8cc1Swenshuai.xi     {
2943*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2944*53ee8cc1Swenshuai.xi         ERR_DOMOD_MSB(printf(">>>MSB123xc CH3 Reset:Fail\n"));
2945*53ee8cc1Swenshuai.xi #endif
2946*53ee8cc1Swenshuai.xi         printf(">>>MSB123xc CH3 Reset:Fail\n");
2947*53ee8cc1Swenshuai.xi         return FALSE;
2948*53ee8cc1Swenshuai.xi     }
2949*53ee8cc1Swenshuai.xi 
2950*53ee8cc1Swenshuai.xi     // MSB123xc : 0x0902[8]=0 , 0x0902[0]=0;
2951*53ee8cc1Swenshuai.xi     // MSB1235 : 0x0902[8]=1 , 0x0902[0]=1; (before overwrite, SDRAM not enable)
2952*53ee8cc1Swenshuai.xi     //                  0x0902[8]=1 , 0x0902[0]=0; (after overwrite, SDRAM enable)
2953*53ee8cc1Swenshuai.xi     // check bonding value, 0x0902[8]
2954*53ee8cc1Swenshuai.xi     bRet &= _MDrv_DMD_MSB123xc_GetReg(0x0900+(0x02)*2+1, &u8Data);
2955*53ee8cc1Swenshuai.xi     if((u8Data & 0x01) == 0x01) //for MSB1236C
2956*53ee8cc1Swenshuai.xi     {
2957*53ee8cc1Swenshuai.xi         if(u8MatchFlag == 0x01)
2958*53ee8cc1Swenshuai.xi         {
2959*53ee8cc1Swenshuai.xi             //check overwrite or not
2960*53ee8cc1Swenshuai.xi             //0x0902[0] : reg_bonding[0]
2961*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB123xc_GetReg(0x0900+(0x02)*2, &u8Data);
2962*53ee8cc1Swenshuai.xi             if((u8Data & 0x01) != 0x00)
2963*53ee8cc1Swenshuai.xi             {
2964*53ee8cc1Swenshuai.xi                 //0x0905[0] : reg_bond_ov_en[0] = 1
2965*53ee8cc1Swenshuai.xi                 //0x0905[8] : reg_bond_ov[0] = 0
2966*53ee8cc1Swenshuai.xi                 // set overwrite enable
2967*53ee8cc1Swenshuai.xi                 bRet &= _MDrv_DMD_MSB123xc_SetReg(0x0900+(0x05)*2, 0x01);
2968*53ee8cc1Swenshuai.xi                 // set overwrite value
2969*53ee8cc1Swenshuai.xi                 bRet &= _MDrv_DMD_MSB123xc_SetReg(0x0900+(0x05)*2+1, 0x00);
2970*53ee8cc1Swenshuai.xi             }
2971*53ee8cc1Swenshuai.xi 
2972*53ee8cc1Swenshuai.xi             do
2973*53ee8cc1Swenshuai.xi             {
2974*53ee8cc1Swenshuai.xi                 bRet &= _MDrv_DMD_MSB123xc_GetReg(0x0900+(0x02)*2, &u8Data);
2975*53ee8cc1Swenshuai.xi                 if(u32_timeout++ > 500)
2976*53ee8cc1Swenshuai.xi                 {
2977*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2978*53ee8cc1Swenshuai.xi                     ERR_DOMOD_MSB(printf("@msb1236c, Set bonding option failure.!!!\n"));
2979*53ee8cc1Swenshuai.xi #endif
2980*53ee8cc1Swenshuai.xi                     return FALSE;
2981*53ee8cc1Swenshuai.xi                 }
2982*53ee8cc1Swenshuai.xi             }
2983*53ee8cc1Swenshuai.xi             while((u8Data & 0x01) == 0x01);
2984*53ee8cc1Swenshuai.xi 
2985*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
2986*53ee8cc1Swenshuai.xi             printf("@ Set bonding option for MSB1236 \n");
2987*53ee8cc1Swenshuai.xi #endif
2988*53ee8cc1Swenshuai.xi         }
2989*53ee8cc1Swenshuai.xi         else
2990*53ee8cc1Swenshuai.xi         {
2991*53ee8cc1Swenshuai.xi             return FALSE;
2992*53ee8cc1Swenshuai.xi         }
2993*53ee8cc1Swenshuai.xi     }
2994*53ee8cc1Swenshuai.xi     else  // for MSB123xc
2995*53ee8cc1Swenshuai.xi     {
2996*53ee8cc1Swenshuai.xi         //check overwrite or not
2997*53ee8cc1Swenshuai.xi         //0x0902[0] : reg_bonding[0]
2998*53ee8cc1Swenshuai.xi         bRet &= _MDrv_DMD_MSB123xc_GetReg(0x0900+(0x02)*2, &u8Data);
2999*53ee8cc1Swenshuai.xi         if((u8Data & 0x01) != 0x00)
3000*53ee8cc1Swenshuai.xi         {
3001*53ee8cc1Swenshuai.xi             //0x0905[0] : reg_bond_ov_en[0] = 1
3002*53ee8cc1Swenshuai.xi             //0x0905[8] : reg_bond_ov[0] = 0
3003*53ee8cc1Swenshuai.xi             // set overwrite enable
3004*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB123xc_SetReg(0x0900+(0x05)*2, 0x01);
3005*53ee8cc1Swenshuai.xi             // set overwrite value
3006*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB123xc_SetReg(0x0900+(0x05)*2+1, 0x00);
3007*53ee8cc1Swenshuai.xi         }
3008*53ee8cc1Swenshuai.xi 
3009*53ee8cc1Swenshuai.xi         do
3010*53ee8cc1Swenshuai.xi         {
3011*53ee8cc1Swenshuai.xi             bRet &= _MDrv_DMD_MSB123xc_GetReg(0x0900+(0x02)*2, &u8Data);
3012*53ee8cc1Swenshuai.xi             if(u32_timeout++ > 500)
3013*53ee8cc1Swenshuai.xi             {
3014*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3015*53ee8cc1Swenshuai.xi                 ERR_DOMOD_MSB(printf("@msbMSB123xc, Set bonding option failure.!!!\n"));
3016*53ee8cc1Swenshuai.xi #endif
3017*53ee8cc1Swenshuai.xi                 return FALSE;
3018*53ee8cc1Swenshuai.xi             }
3019*53ee8cc1Swenshuai.xi         }
3020*53ee8cc1Swenshuai.xi         while((u8Data & 0x01) == 0x01);
3021*53ee8cc1Swenshuai.xi 
3022*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3023*53ee8cc1Swenshuai.xi         printf("@ Set bonding option for MSB123xc \n");
3024*53ee8cc1Swenshuai.xi #endif
3025*53ee8cc1Swenshuai.xi     }
3026*53ee8cc1Swenshuai.xi 
3027*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3028*53ee8cc1Swenshuai.xi     if (!bRet) printf("%s %d Error\n", __func__, __LINE__);
3029*53ee8cc1Swenshuai.xi #endif
3030*53ee8cc1Swenshuai.xi     return bRet;
3031*53ee8cc1Swenshuai.xi }
3032*53ee8cc1Swenshuai.xi 
_IspCheckVer(MS_U8 * pLibData,MS_BOOL * pMatch)3033*53ee8cc1Swenshuai.xi static MS_BOOL _IspCheckVer(MS_U8* pLibData, MS_BOOL* pMatch)
3034*53ee8cc1Swenshuai.xi {
3035*53ee8cc1Swenshuai.xi     MS_U8  bReadData[VERSION_CODE_SIZE];
3036*53ee8cc1Swenshuai.xi     MS_U32  indx = 0;
3037*53ee8cc1Swenshuai.xi     *pMatch = true;
3038*53ee8cc1Swenshuai.xi 
3039*53ee8cc1Swenshuai.xi     MS_U8 bWriteData[5] = {0x4D, 0x53, 0x54, 0x41, 0x52};
3040*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, bWriteData);
3041*53ee8cc1Swenshuai.xi 
3042*53ee8cc1Swenshuai.xi     MS_U8    bAddr[1], bError = true;
3043*53ee8cc1Swenshuai.xi     //MAPI_U16   Count;
3044*53ee8cc1Swenshuai.xi 
3045*53ee8cc1Swenshuai.xi     memset(bReadData, 0 , sizeof(bReadData));
3046*53ee8cc1Swenshuai.xi 
3047*53ee8cc1Swenshuai.xi     bAddr[0] = 0x10;
3048*53ee8cc1Swenshuai.xi     //dwStartAddr=0;
3049*53ee8cc1Swenshuai.xi 
3050*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x03;
3051*53ee8cc1Swenshuai.xi     bWriteData[1] = VERSION_CODE_ADDR >> 16;
3052*53ee8cc1Swenshuai.xi     bWriteData[2] = VERSION_CODE_ADDR >> 8;
3053*53ee8cc1Swenshuai.xi     bWriteData[3] = VERSION_CODE_ADDR & 0xFF;
3054*53ee8cc1Swenshuai.xi 
3055*53ee8cc1Swenshuai.xi     bError &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 4, bWriteData);
3056*53ee8cc1Swenshuai.xi 
3057*53ee8cc1Swenshuai.xi     bAddr[0] = 0x11;
3058*53ee8cc1Swenshuai.xi     bError &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_READ_BYTES, 1, bAddr, VERSION_CODE_SIZE, bReadData);
3059*53ee8cc1Swenshuai.xi 
3060*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x12;
3061*53ee8cc1Swenshuai.xi     bError &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1,  bWriteData);
3062*53ee8cc1Swenshuai.xi 
3063*53ee8cc1Swenshuai.xi     if(FALSE == bError)
3064*53ee8cc1Swenshuai.xi     {
3065*53ee8cc1Swenshuai.xi         bWriteData[0] = 0x24 ;
3066*53ee8cc1Swenshuai.xi         (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
3067*53ee8cc1Swenshuai.xi         return FALSE;
3068*53ee8cc1Swenshuai.xi     }
3069*53ee8cc1Swenshuai.xi 
3070*53ee8cc1Swenshuai.xi     bWriteData[0] = 0x24 ;
3071*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
3072*53ee8cc1Swenshuai.xi 
3073*53ee8cc1Swenshuai.xi     printf("sttest version data = ");
3074*53ee8cc1Swenshuai.xi     for(indx = 0; indx < (VERSION_CODE_SIZE); indx++)
3075*53ee8cc1Swenshuai.xi     {
3076*53ee8cc1Swenshuai.xi         printf(" %x ,", bReadData[indx]);
3077*53ee8cc1Swenshuai.xi         if(pLibData[indx+VERSION_CODE_ADDR] != bReadData[indx])
3078*53ee8cc1Swenshuai.xi         {
3079*53ee8cc1Swenshuai.xi             *pMatch = FALSE;
3080*53ee8cc1Swenshuai.xi             //break;
3081*53ee8cc1Swenshuai.xi         }
3082*53ee8cc1Swenshuai.xi     }
3083*53ee8cc1Swenshuai.xi     printf(" \n");
3084*53ee8cc1Swenshuai.xi 
3085*53ee8cc1Swenshuai.xi     return TRUE;
3086*53ee8cc1Swenshuai.xi }
3087*53ee8cc1Swenshuai.xi 
_dram_crc_check(MS_U16 chksum_lib,MS_BOOL * pMatch)3088*53ee8cc1Swenshuai.xi static MS_BOOL _dram_crc_check(MS_U16 chksum_lib, MS_BOOL* pMatch)
3089*53ee8cc1Swenshuai.xi {
3090*53ee8cc1Swenshuai.xi     MS_U16  chksum = 0;
3091*53ee8cc1Swenshuai.xi     // MAPI_U16  chksum_lib = 0;
3092*53ee8cc1Swenshuai.xi     MS_U16  u16Addr = 0;
3093*53ee8cc1Swenshuai.xi     MS_U8   u8MsbData[5];
3094*53ee8cc1Swenshuai.xi     MS_U8   reg = 0;
3095*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
3096*53ee8cc1Swenshuai.xi     MS_U8   mcu_status = 0;
3097*53ee8cc1Swenshuai.xi 
3098*53ee8cc1Swenshuai.xi     *pMatch = false;
3099*53ee8cc1Swenshuai.xi 
3100*53ee8cc1Swenshuai.xi     // MAPI_U8 bWriteData[5]={0x4D, 0x53, 0x54, 0x41, 0x52};
3101*53ee8cc1Swenshuai.xi     // iptr->WriteBytes(0, NULL, 5, bWriteData);
3102*53ee8cc1Swenshuai.xi 
3103*53ee8cc1Swenshuai.xi /// crc H byte
3104*53ee8cc1Swenshuai.xi     u16Addr = 0x0c00+0x0d*2+1;
3105*53ee8cc1Swenshuai.xi 
3106*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
3107*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
3108*53ee8cc1Swenshuai.xi     u8MsbData[2] = 0x00;
3109*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u16Addr >> 8) &0xff;
3110*53ee8cc1Swenshuai.xi     u8MsbData[4] = u16Addr &0xff;
3111*53ee8cc1Swenshuai.xi 
3112*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x35;
3113*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3114*53ee8cc1Swenshuai.xi 
3115*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
3116*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8MsbData);
3117*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_READ_BYTES, 0, NULL, 1, &reg);
3118*53ee8cc1Swenshuai.xi 
3119*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x34;
3120*53ee8cc1Swenshuai.xi     bRet=(*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3121*53ee8cc1Swenshuai.xi 
3122*53ee8cc1Swenshuai.xi 
3123*53ee8cc1Swenshuai.xi     chksum = reg;
3124*53ee8cc1Swenshuai.xi 
3125*53ee8cc1Swenshuai.xi /// crc L byte
3126*53ee8cc1Swenshuai.xi     u16Addr = 0x0c00+0x0d*2;
3127*53ee8cc1Swenshuai.xi 
3128*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
3129*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
3130*53ee8cc1Swenshuai.xi     u8MsbData[2] = 0x00;
3131*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u16Addr >> 8) &0xff;
3132*53ee8cc1Swenshuai.xi     u8MsbData[4] = u16Addr &0xff;
3133*53ee8cc1Swenshuai.xi 
3134*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x35;
3135*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3136*53ee8cc1Swenshuai.xi 
3137*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
3138*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8MsbData);
3139*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_READ_BYTES, 0, NULL, 1, &reg);
3140*53ee8cc1Swenshuai.xi 
3141*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x34;
3142*53ee8cc1Swenshuai.xi     bRet=(*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3143*53ee8cc1Swenshuai.xi 
3144*53ee8cc1Swenshuai.xi 
3145*53ee8cc1Swenshuai.xi     chksum = (chksum<<8)|reg;
3146*53ee8cc1Swenshuai.xi 
3147*53ee8cc1Swenshuai.xi // get mcu status
3148*53ee8cc1Swenshuai.xi 
3149*53ee8cc1Swenshuai.xi     u16Addr = 0x0900+0x4f*2;
3150*53ee8cc1Swenshuai.xi 
3151*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
3152*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
3153*53ee8cc1Swenshuai.xi     u8MsbData[2] = 0x00;
3154*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u16Addr >> 8) &0xff;
3155*53ee8cc1Swenshuai.xi     u8MsbData[4] = u16Addr &0xff;
3156*53ee8cc1Swenshuai.xi 
3157*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x35;
3158*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3159*53ee8cc1Swenshuai.xi 
3160*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
3161*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, u8MsbData);
3162*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_READ_BYTES, 0, NULL, 1, &reg);
3163*53ee8cc1Swenshuai.xi 
3164*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x34;
3165*53ee8cc1Swenshuai.xi     bRet=(*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_1, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, u8MsbData);
3166*53ee8cc1Swenshuai.xi 
3167*53ee8cc1Swenshuai.xi 
3168*53ee8cc1Swenshuai.xi     mcu_status = reg;
3169*53ee8cc1Swenshuai.xi 
3170*53ee8cc1Swenshuai.xi 
3171*53ee8cc1Swenshuai.xi /// check the crc in dsp lib array
3172*53ee8cc1Swenshuai.xi 
3173*53ee8cc1Swenshuai.xi     if (mcu_status == 0xaa && ((chksum_lib&0xff00) == (chksum&0xff00)) )
3174*53ee8cc1Swenshuai.xi         *pMatch = true;
3175*53ee8cc1Swenshuai.xi     else if(chksum_lib == chksum)
3176*53ee8cc1Swenshuai.xi         *pMatch = true;
3177*53ee8cc1Swenshuai.xi 
3178*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3179*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);
3180*53ee8cc1Swenshuai.xi #endif
3181*53ee8cc1Swenshuai.xi 
3182*53ee8cc1Swenshuai.xi     return bRet;
3183*53ee8cc1Swenshuai.xi }
3184*53ee8cc1Swenshuai.xi 
_IspProcFlash(MS_U8 * pLibArry,MS_U32 dwLibSize)3185*53ee8cc1Swenshuai.xi static MS_BOOL _IspProcFlash(MS_U8* pLibArry, MS_U32 dwLibSize)
3186*53ee8cc1Swenshuai.xi {
3187*53ee8cc1Swenshuai.xi     MS_U32    dwLoop, dwTimeOut;
3188*53ee8cc1Swenshuai.xi     MS_U32    dwStartAddr, dwEndAddr;
3189*53ee8cc1Swenshuai.xi     //MAPI_U16    wLoop;
3190*53ee8cc1Swenshuai.xi     MS_U8     bError = false;//, bWriteData[PAGE_WRITE_SIZE];
3191*53ee8cc1Swenshuai.xi 
3192*53ee8cc1Swenshuai.xi     MS_U8 bWriteData[5]= {0x4D, 0x53, 0x54, 0x41, 0x52};
3193*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, bWriteData);
3194*53ee8cc1Swenshuai.xi 
3195*53ee8cc1Swenshuai.xi     dwStartAddr = (MS_U32) 0;
3196*53ee8cc1Swenshuai.xi     dwEndAddr = dwLibSize;
3197*53ee8cc1Swenshuai.xi 
3198*53ee8cc1Swenshuai.xi 
3199*53ee8cc1Swenshuai.xi     MS_U8     bAddr[1];
3200*53ee8cc1Swenshuai.xi     MS_U8     bReadData=0;
3201*53ee8cc1Swenshuai.xi     for(dwLoop=dwStartAddr; (dwLoop < dwEndAddr); dwLoop+=PAGE_WRITE_SIZE)
3202*53ee8cc1Swenshuai.xi     {
3203*53ee8cc1Swenshuai.xi 
3204*53ee8cc1Swenshuai.xi         dwTimeOut = 10000;
3205*53ee8cc1Swenshuai.xi 
3206*53ee8cc1Swenshuai.xi         while(dwTimeOut--)
3207*53ee8cc1Swenshuai.xi         {
3208*53ee8cc1Swenshuai.xi             bAddr[0] = 0x10;
3209*53ee8cc1Swenshuai.xi             bWriteData[0] = 0x05;
3210*53ee8cc1Swenshuai.xi             (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 1, bWriteData);
3211*53ee8cc1Swenshuai.xi 
3212*53ee8cc1Swenshuai.xi             bAddr[0] = 0x11;
3213*53ee8cc1Swenshuai.xi             (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_READ_BYTES, 1, bAddr, 1, &bReadData);
3214*53ee8cc1Swenshuai.xi 
3215*53ee8cc1Swenshuai.xi             bWriteData[0] = 0x12;
3216*53ee8cc1Swenshuai.xi             (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
3217*53ee8cc1Swenshuai.xi 
3218*53ee8cc1Swenshuai.xi             if (!(bReadData & 0x01))
3219*53ee8cc1Swenshuai.xi                 break;
3220*53ee8cc1Swenshuai.xi 
3221*53ee8cc1Swenshuai.xi             if(dwTimeOut==1)
3222*53ee8cc1Swenshuai.xi             {
3223*53ee8cc1Swenshuai.xi                 bError = 1;
3224*53ee8cc1Swenshuai.xi                 break;
3225*53ee8cc1Swenshuai.xi             }
3226*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(0);
3227*53ee8cc1Swenshuai.xi         }
3228*53ee8cc1Swenshuai.xi 
3229*53ee8cc1Swenshuai.xi         if(!bError)
3230*53ee8cc1Swenshuai.xi         {
3231*53ee8cc1Swenshuai.xi 
3232*53ee8cc1Swenshuai.xi             MS_U8    bAddr[5], bWriteData[1];
3233*53ee8cc1Swenshuai.xi             MS_BOOL bError = TRUE;
3234*53ee8cc1Swenshuai.xi 
3235*53ee8cc1Swenshuai.xi             bAddr[0] = 0x10;
3236*53ee8cc1Swenshuai.xi             bWriteData[0] = 0x06;
3237*53ee8cc1Swenshuai.xi             bError &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 1, bWriteData);
3238*53ee8cc1Swenshuai.xi 
3239*53ee8cc1Swenshuai.xi             bWriteData[0] = 0x12;
3240*53ee8cc1Swenshuai.xi             bError &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
3241*53ee8cc1Swenshuai.xi 
3242*53ee8cc1Swenshuai.xi             // Page Program
3243*53ee8cc1Swenshuai.xi             bAddr[0] = 0x10;
3244*53ee8cc1Swenshuai.xi             bAddr[1] = 0x02;
3245*53ee8cc1Swenshuai.xi             bAddr[2] = dwLoop >> 16;
3246*53ee8cc1Swenshuai.xi             bAddr[3] = dwLoop >> 8;
3247*53ee8cc1Swenshuai.xi             bAddr[4] = dwLoop;
3248*53ee8cc1Swenshuai.xi 
3249*53ee8cc1Swenshuai.xi             bError &= (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 5, bAddr, PAGE_WRITE_SIZE, (pLibArry+dwLoop));
3250*53ee8cc1Swenshuai.xi 
3251*53ee8cc1Swenshuai.xi             bWriteData[0] = 0x12;
3252*53ee8cc1Swenshuai.xi             bError &=  (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
3253*53ee8cc1Swenshuai.xi 
3254*53ee8cc1Swenshuai.xi             bAddr[0] = 0x10;
3255*53ee8cc1Swenshuai.xi             bWriteData[0] = 0x04;
3256*53ee8cc1Swenshuai.xi             bError &=  (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 1, bWriteData);
3257*53ee8cc1Swenshuai.xi 
3258*53ee8cc1Swenshuai.xi             bWriteData[0] = 0x12;
3259*53ee8cc1Swenshuai.xi             bError &=  (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
3260*53ee8cc1Swenshuai.xi 
3261*53ee8cc1Swenshuai.xi             if(bError == FALSE)
3262*53ee8cc1Swenshuai.xi             {
3263*53ee8cc1Swenshuai.xi                 break;
3264*53ee8cc1Swenshuai.xi             }
3265*53ee8cc1Swenshuai.xi         }
3266*53ee8cc1Swenshuai.xi     }
3267*53ee8cc1Swenshuai.xi 
3268*53ee8cc1Swenshuai.xi     bWriteData[0]=0x24 ;
3269*53ee8cc1Swenshuai.xi     (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
3270*53ee8cc1Swenshuai.xi 
3271*53ee8cc1Swenshuai.xi     if(bError==FALSE)
3272*53ee8cc1Swenshuai.xi         return TRUE;
3273*53ee8cc1Swenshuai.xi     else
3274*53ee8cc1Swenshuai.xi         return FALSE;
3275*53ee8cc1Swenshuai.xi 
3276*53ee8cc1Swenshuai.xi }
3277*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB123xc_SetCurrentDemodulatorType(eDMD_MSB123xc_DemodulatorType eCurrentDemodulatorType)3278*53ee8cc1Swenshuai.xi void MDrv_DMD_MSB123xc_SetCurrentDemodulatorType(eDMD_MSB123xc_DemodulatorType eCurrentDemodulatorType)
3279*53ee8cc1Swenshuai.xi {
3280*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3281*53ee8cc1Swenshuai.xi     printf("MDrv_DMD_MSB123xc_SetCurrentDemodulatorType %d\n", eCurrentDemodulatorType);
3282*53ee8cc1Swenshuai.xi #endif
3283*53ee8cc1Swenshuai.xi     eDMD_MSB123xc_CurrentDemodulatorType = eCurrentDemodulatorType;
3284*53ee8cc1Swenshuai.xi }
3285*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB123xc_LoadDSPCode(void)3286*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB123xc_LoadDSPCode(void)
3287*53ee8cc1Swenshuai.xi {
3288*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
3289*53ee8cc1Swenshuai.xi     DMD_LOCK();
3290*53ee8cc1Swenshuai.xi     bRet = _LoadDSPCode();
3291*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
3292*53ee8cc1Swenshuai.xi     return bRet;
3293*53ee8cc1Swenshuai.xi }
MDrv_DMD_MSB123xc_DTV_DVBT_DSPReg_CRC(void)3294*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB123xc_DTV_DVBT_DSPReg_CRC(void)
3295*53ee8cc1Swenshuai.xi {
3296*53ee8cc1Swenshuai.xi     MS_BOOL bRet = TRUE;
3297*53ee8cc1Swenshuai.xi     DMD_LOCK();
3298*53ee8cc1Swenshuai.xi     bRet = _DTV_DVBT_DSPReg_CRC();
3299*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
3300*53ee8cc1Swenshuai.xi     return bRet;
3301*53ee8cc1Swenshuai.xi }
3302*53ee8cc1Swenshuai.xi 
MDrv_DMD_MSB123xc_Power_On_Initialization(void)3303*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_MSB123xc_Power_On_Initialization(void)
3304*53ee8cc1Swenshuai.xi {
3305*53ee8cc1Swenshuai.xi     MS_U8     status = TRUE;
3306*53ee8cc1Swenshuai.xi     MS_BOOL   bMatch = false;
3307*53ee8cc1Swenshuai.xi     MS_U8     u8RetryCnt = 6;
3308*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3309*53ee8cc1Swenshuai.xi     MS_U32 u32tmm_1, u32tmm_2, u32tmm_3, u32tmm_4, u32tmm_5, u32tmm_6 = 0x00;
3310*53ee8cc1Swenshuai.xi #endif
3311*53ee8cc1Swenshuai.xi 
3312*53ee8cc1Swenshuai.xi     DMD_LOCK();
3313*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3314*53ee8cc1Swenshuai.xi     u32tmm_1 = MsOS_GetSystemTime();
3315*53ee8cc1Swenshuai.xi #endif
3316*53ee8cc1Swenshuai.xi 
3317*53ee8cc1Swenshuai.xi     if (_sDMD_MSB123xc_InitData.bPreloadDSPCodeFromMainCHIPI2C)
3318*53ee8cc1Swenshuai.xi     {
3319*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
3320*53ee8cc1Swenshuai.xi         return TRUE;
3321*53ee8cc1Swenshuai.xi     }
3322*53ee8cc1Swenshuai.xi 
3323*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3324*53ee8cc1Swenshuai.xi     if (eDMD_MSB123xc_DbgLevel >= E_DMD_MSB123xc_DBGLV_DEBUG)
3325*53ee8cc1Swenshuai.xi     {
3326*53ee8cc1Swenshuai.xi         printf(">>>MSB123xc: Enter Power_On_Initialization()\n");
3327*53ee8cc1Swenshuai.xi     }
3328*53ee8cc1Swenshuai.xi #endif
3329*53ee8cc1Swenshuai.xi 
3330*53ee8cc1Swenshuai.xi     if ( _msbMSB123xc_set_bonding_option( MDrv_SYS_GetChipID() ) == FALSE )
3331*53ee8cc1Swenshuai.xi     {
3332*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
3333*53ee8cc1Swenshuai.xi         return TRUE;
3334*53ee8cc1Swenshuai.xi     }
3335*53ee8cc1Swenshuai.xi 
3336*53ee8cc1Swenshuai.xi     if (bDMD_MSB123xc_Power_init_en == TRUE)
3337*53ee8cc1Swenshuai.xi     {
3338*53ee8cc1Swenshuai.xi         DMD_UNLOCK();
3339*53ee8cc1Swenshuai.xi         return  TRUE;
3340*53ee8cc1Swenshuai.xi     }
3341*53ee8cc1Swenshuai.xi     else
3342*53ee8cc1Swenshuai.xi     {
3343*53ee8cc1Swenshuai.xi         bDMD_MSB123xc_Power_init_en = (u8DMD_MSB123xc_PowerOnInitialization_Flow == 2) ? (TRUE) : (FALSE);
3344*53ee8cc1Swenshuai.xi     }
3345*53ee8cc1Swenshuai.xi 
3346*53ee8cc1Swenshuai.xi     if(_sDMD_MSB123xc_InitData.u8WO_SPI_Flash== 1)
3347*53ee8cc1Swenshuai.xi     {
3348*53ee8cc1Swenshuai.xi         if (_sDMD_MSB123xc_InitData.bPreloadDSPCodeFromMainCHIPI2C)
3349*53ee8cc1Swenshuai.xi         {
3350*53ee8cc1Swenshuai.xi 
3351*53ee8cc1Swenshuai.xi         }
3352*53ee8cc1Swenshuai.xi         else
3353*53ee8cc1Swenshuai.xi         {
3354*53ee8cc1Swenshuai.xi             //status &= _MSB123xc_I2C_CH_Reset(3);
3355*53ee8cc1Swenshuai.xi             status &= _MSB123xc_HW_init();
3356*53ee8cc1Swenshuai.xi             status &= _LoadDspCodeToSDRAM(MSB123xc_ALL);
3357*53ee8cc1Swenshuai.xi             if (_LoadDSPCode() == FALSE)
3358*53ee8cc1Swenshuai.xi             {
3359*53ee8cc1Swenshuai.xi                 printf(">>>>MSB123xc:Fail\n");
3360*53ee8cc1Swenshuai.xi                 status= FALSE;
3361*53ee8cc1Swenshuai.xi             }
3362*53ee8cc1Swenshuai.xi         }
3363*53ee8cc1Swenshuai.xi     }
3364*53ee8cc1Swenshuai.xi     else
3365*53ee8cc1Swenshuai.xi     {
3366*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3367*53ee8cc1Swenshuai.xi         if (eDMD_MSB123xc_DbgLevel >= E_DMD_MSB123xc_DBGLV_DEBUG)
3368*53ee8cc1Swenshuai.xi         {
3369*53ee8cc1Swenshuai.xi             printf("u8DMD_MSB123xc_PowerOnInitialization_Flow = %d\n", u8DMD_MSB123xc_PowerOnInitialization_Flow);
3370*53ee8cc1Swenshuai.xi         }
3371*53ee8cc1Swenshuai.xi #endif
3372*53ee8cc1Swenshuai.xi         if(u8DMD_MSB123xc_PowerOnInitialization_Flow ==0)
3373*53ee8cc1Swenshuai.xi         {
3374*53ee8cc1Swenshuai.xi             status = _msb123xc_flash_mode_en();
3375*53ee8cc1Swenshuai.xi             if (status == FALSE)
3376*53ee8cc1Swenshuai.xi             {
3377*53ee8cc1Swenshuai.xi                 printf("[msb123xc][error]msb123xc_flash_mode_en fail....\n");
3378*53ee8cc1Swenshuai.xi             }
3379*53ee8cc1Swenshuai.xi             u8DMD_MSB123xc_PowerOnInitialization_Flow++;
3380*53ee8cc1Swenshuai.xi         }
3381*53ee8cc1Swenshuai.xi         else
3382*53ee8cc1Swenshuai.xi         {
3383*53ee8cc1Swenshuai.xi             if(u8DMD_MSB123xc_PowerOnInitialization_Flow<2)
3384*53ee8cc1Swenshuai.xi             {
3385*53ee8cc1Swenshuai.xi                 u8DMD_MSB123xc_PowerOnInitialization_Flow++;
3386*53ee8cc1Swenshuai.xi             }
3387*53ee8cc1Swenshuai.xi 
3388*53ee8cc1Swenshuai.xi             MS_U8     u8DoneFlag = 0;
3389*53ee8cc1Swenshuai.xi             MS_U16    u16_counter = 0;
3390*53ee8cc1Swenshuai.xi 
3391*53ee8cc1Swenshuai.xi             MS_U16    crc16 = 0;
3392*53ee8cc1Swenshuai.xi 
3393*53ee8cc1Swenshuai.xi             crc16 = MSB123xc_LIB[sizeof(MSB123xc_LIB)-2];
3394*53ee8cc1Swenshuai.xi             crc16 = (crc16<<8)|MSB123xc_LIB[sizeof(MSB123xc_LIB)-1];
3395*53ee8cc1Swenshuai.xi 
3396*53ee8cc1Swenshuai.xi             do
3397*53ee8cc1Swenshuai.xi             {
3398*53ee8cc1Swenshuai.xi                 printf(">>>MSB123xc: u8RetryCnt = %d\n",u8RetryCnt);
3399*53ee8cc1Swenshuai.xi 
3400*53ee8cc1Swenshuai.xi                 MS_U8 flash_waiting_ready_timeout = 0;
3401*53ee8cc1Swenshuai.xi                 u8RetryCnt--;
3402*53ee8cc1Swenshuai.xi 
3403*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3404*53ee8cc1Swenshuai.xi                 u32tmm_3 = MsOS_GetSystemTime();
3405*53ee8cc1Swenshuai.xi #endif
3406*53ee8cc1Swenshuai.xi 
3407*53ee8cc1Swenshuai.xi                 status = _msb123xc_flash_boot_ready_waiting(&flash_waiting_ready_timeout);
3408*53ee8cc1Swenshuai.xi                 if ( (flash_waiting_ready_timeout == 1) || (status == FALSE) )
3409*53ee8cc1Swenshuai.xi                 {
3410*53ee8cc1Swenshuai.xi                     printf("[msb123xc][error]msb123xc_flash_boot_ready_waiting fail....\n");
3411*53ee8cc1Swenshuai.xi                 }
3412*53ee8cc1Swenshuai.xi 
3413*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3414*53ee8cc1Swenshuai.xi                 u32tmm_4 = MsOS_GetSystemTime();
3415*53ee8cc1Swenshuai.xi                 printf("[tmm1]t4-t3 = %ld (%ld - %ld)\n",u32tmm_4-u32tmm_3,u32tmm_4,u32tmm_3);
3416*53ee8cc1Swenshuai.xi #endif
3417*53ee8cc1Swenshuai.xi 
3418*53ee8cc1Swenshuai.xi                 if(status == FALSE)
3419*53ee8cc1Swenshuai.xi                 {
3420*53ee8cc1Swenshuai.xi                     if (_sDMD_MSB123xc_InitData.fpGPIOReset != NULL)
3421*53ee8cc1Swenshuai.xi                     {
3422*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3423*53ee8cc1Swenshuai.xi                         printf(">>>MSB123xc: Reset Demodulator\n");
3424*53ee8cc1Swenshuai.xi #endif
3425*53ee8cc1Swenshuai.xi                         (*_sDMD_MSB123xc_InitData.fpGPIOReset)(FALSE); // gptr->SetOff();
3426*53ee8cc1Swenshuai.xi                         MsOS_DelayTaskUs(resetDemodTime*1000);
3427*53ee8cc1Swenshuai.xi                         (*_sDMD_MSB123xc_InitData.fpGPIOReset)(TRUE); // gptr->SetOn();
3428*53ee8cc1Swenshuai.xi                         MsOS_DelayTaskUs(waitFlashTime * 1000);
3429*53ee8cc1Swenshuai.xi                     }
3430*53ee8cc1Swenshuai.xi 
3431*53ee8cc1Swenshuai.xi                     if (_MSB123xc_I2C_CH_Reset(3) == FALSE)
3432*53ee8cc1Swenshuai.xi                     {
3433*53ee8cc1Swenshuai.xi                         printf(">>>MSB123xc CH Reset:Fail\n");
3434*53ee8cc1Swenshuai.xi                         status= FALSE;
3435*53ee8cc1Swenshuai.xi                         continue;
3436*53ee8cc1Swenshuai.xi                     }
3437*53ee8cc1Swenshuai.xi 
3438*53ee8cc1Swenshuai.xi                     u16_counter = 1000;
3439*53ee8cc1Swenshuai.xi                     do
3440*53ee8cc1Swenshuai.xi                     {
3441*53ee8cc1Swenshuai.xi                         // 10 ms
3442*53ee8cc1Swenshuai.xi                         MsOS_DelayTaskUs(10*1000);
3443*53ee8cc1Swenshuai.xi                         u16_counter--;
3444*53ee8cc1Swenshuai.xi                         _MDrv_DMD_MSB123xc_GetReg(0x0900+(0x4f)*2, &u8DoneFlag);
3445*53ee8cc1Swenshuai.xi                     }
3446*53ee8cc1Swenshuai.xi                     while(u8DoneFlag != 0x99 && u16_counter != 0);
3447*53ee8cc1Swenshuai.xi 
3448*53ee8cc1Swenshuai.xi                     if(u16_counter == 0 && u8DoneFlag != 0x99)
3449*53ee8cc1Swenshuai.xi                     {
3450*53ee8cc1Swenshuai.xi                         printf("[wb]Err, MSB123xc didn't ready yet\n");
3451*53ee8cc1Swenshuai.xi                         status = false;
3452*53ee8cc1Swenshuai.xi                     }
3453*53ee8cc1Swenshuai.xi                     else
3454*53ee8cc1Swenshuai.xi                     {
3455*53ee8cc1Swenshuai.xi                         status = TRUE;
3456*53ee8cc1Swenshuai.xi                     }
3457*53ee8cc1Swenshuai.xi 
3458*53ee8cc1Swenshuai.xi                 }
3459*53ee8cc1Swenshuai.xi                 // No need to switch to CH0 before SPI Flash access.
3460*53ee8cc1Swenshuai.xi 
3461*53ee8cc1Swenshuai.xi                 {
3462*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3463*53ee8cc1Swenshuai.xi                     if (eDMD_MSB123xc_DbgLevel >= E_DMD_MSB123xc_DBGLV_DEBUG)
3464*53ee8cc1Swenshuai.xi                     {
3465*53ee8cc1Swenshuai.xi                         printf(">>>MSB123xc: Check Version...");
3466*53ee8cc1Swenshuai.xi                     }
3467*53ee8cc1Swenshuai.xi #endif
3468*53ee8cc1Swenshuai.xi 
3469*53ee8cc1Swenshuai.xi                     if (_IspCheckVer(MSB123xc_LIB, &bMatch) == FALSE)
3470*53ee8cc1Swenshuai.xi                     {
3471*53ee8cc1Swenshuai.xi                         printf(">>> ISP read FAIL!\n");
3472*53ee8cc1Swenshuai.xi                         status= FALSE;
3473*53ee8cc1Swenshuai.xi                         continue;
3474*53ee8cc1Swenshuai.xi                     }
3475*53ee8cc1Swenshuai.xi 
3476*53ee8cc1Swenshuai.xi 
3477*53ee8cc1Swenshuai.xi                     if(bMatch == FALSE)
3478*53ee8cc1Swenshuai.xi                     {
3479*53ee8cc1Swenshuai.xi                         printf(">>> IspCheckVer FAIL!\n");
3480*53ee8cc1Swenshuai.xi                     }
3481*53ee8cc1Swenshuai.xi                     else
3482*53ee8cc1Swenshuai.xi                     {
3483*53ee8cc1Swenshuai.xi                         if (_MSB123xc_I2C_CH_Reset(3) == FALSE)
3484*53ee8cc1Swenshuai.xi                         {
3485*53ee8cc1Swenshuai.xi                             printf(">>>MSB123xc CH Reset:Fail\n");
3486*53ee8cc1Swenshuai.xi                             status= FALSE;
3487*53ee8cc1Swenshuai.xi                             continue;
3488*53ee8cc1Swenshuai.xi                         }
3489*53ee8cc1Swenshuai.xi                         else
3490*53ee8cc1Swenshuai.xi                         {
3491*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3492*53ee8cc1Swenshuai.xi                             if (eDMD_MSB123xc_DbgLevel >= E_DMD_MSB123xc_DBGLV_DEBUG)
3493*53ee8cc1Swenshuai.xi                             {
3494*53ee8cc1Swenshuai.xi                                 printf(">>>MSB123xc CH Reset:OK\n");
3495*53ee8cc1Swenshuai.xi                             }
3496*53ee8cc1Swenshuai.xi #endif
3497*53ee8cc1Swenshuai.xi                         }
3498*53ee8cc1Swenshuai.xi 
3499*53ee8cc1Swenshuai.xi                         if (_dram_crc_check(crc16, &bMatch) == FALSE)
3500*53ee8cc1Swenshuai.xi                         {
3501*53ee8cc1Swenshuai.xi                             printf(">>> reg read fail!\n");
3502*53ee8cc1Swenshuai.xi                             status= FALSE;
3503*53ee8cc1Swenshuai.xi                             continue;
3504*53ee8cc1Swenshuai.xi                         }
3505*53ee8cc1Swenshuai.xi 
3506*53ee8cc1Swenshuai.xi                         if(bMatch == FALSE)
3507*53ee8cc1Swenshuai.xi                             printf(">>> dram crc check FAIL!\n");
3508*53ee8cc1Swenshuai.xi                         else
3509*53ee8cc1Swenshuai.xi                             printf(">>> dram crc check OK!\n");
3510*53ee8cc1Swenshuai.xi 
3511*53ee8cc1Swenshuai.xi 
3512*53ee8cc1Swenshuai.xi                     }
3513*53ee8cc1Swenshuai.xi 
3514*53ee8cc1Swenshuai.xi                     if (_sDMD_MSB123xc_InitData.bFlashWPEnable)
3515*53ee8cc1Swenshuai.xi                     {
3516*53ee8cc1Swenshuai.xi                         if (bMatch == FALSE)
3517*53ee8cc1Swenshuai.xi                         {
3518*53ee8cc1Swenshuai.xi                             // disable flash WP, pull high.
3519*53ee8cc1Swenshuai.xi                             if(_msb123xc_flash_WP(0) == FALSE)
3520*53ee8cc1Swenshuai.xi                             {
3521*53ee8cc1Swenshuai.xi                                 printf("[wb]Err, FLASH WP Disable Fail!!!\n");
3522*53ee8cc1Swenshuai.xi                             }
3523*53ee8cc1Swenshuai.xi                             MsOS_DelayTaskUs(100*1000);
3524*53ee8cc1Swenshuai.xi                         }
3525*53ee8cc1Swenshuai.xi                     }
3526*53ee8cc1Swenshuai.xi 
3527*53ee8cc1Swenshuai.xi                     ////bMatch = true; //FIXME : Remove this to enable auto FW reload.
3528*53ee8cc1Swenshuai.xi                     if (bMatch == FALSE)// Version not match
3529*53ee8cc1Swenshuai.xi                     {
3530*53ee8cc1Swenshuai.xi                         MS_U8 bAddr[1];
3531*53ee8cc1Swenshuai.xi                         MS_U8 bWriteData[5]= {0x4D, 0x53, 0x54, 0x41, 0x52};
3532*53ee8cc1Swenshuai.xi 
3533*53ee8cc1Swenshuai.xi                         printf(">>> Not match! Reload Flash...");
3534*53ee8cc1Swenshuai.xi                         if ( (sizeof(MSB123xc_LIB)%256) != 0)
3535*53ee8cc1Swenshuai.xi                         {
3536*53ee8cc1Swenshuai.xi                             printf(" MSB123xc_LIB 256byte alignment error!%u \n",sizeof(MSB123xc_LIB));
3537*53ee8cc1Swenshuai.xi                         }
3538*53ee8cc1Swenshuai.xi 
3539*53ee8cc1Swenshuai.xi                         (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 5, bWriteData);
3540*53ee8cc1Swenshuai.xi 
3541*53ee8cc1Swenshuai.xi                         bAddr[0] = 0x10;
3542*53ee8cc1Swenshuai.xi                         bWriteData[0] = 0x06;
3543*53ee8cc1Swenshuai.xi                         (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 1, bWriteData);
3544*53ee8cc1Swenshuai.xi 
3545*53ee8cc1Swenshuai.xi                         bWriteData[0] = 0x12;
3546*53ee8cc1Swenshuai.xi                         (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
3547*53ee8cc1Swenshuai.xi 
3548*53ee8cc1Swenshuai.xi                         bAddr[0] = 0x10;
3549*53ee8cc1Swenshuai.xi 
3550*53ee8cc1Swenshuai.xi                         bWriteData[0] = 0xC7;
3551*53ee8cc1Swenshuai.xi                         (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 1, bAddr, 1, bWriteData);
3552*53ee8cc1Swenshuai.xi 
3553*53ee8cc1Swenshuai.xi                         bWriteData[0] = 0x12;
3554*53ee8cc1Swenshuai.xi                         (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
3555*53ee8cc1Swenshuai.xi 
3556*53ee8cc1Swenshuai.xi                         bWriteData[0]=0x24 ;
3557*53ee8cc1Swenshuai.xi                         (*_sDMD_MSB123xc_InitData.fpMSB123xc_I2C_Access)(E_DMD_MSB123xc_DEMOD_I2C_DYNAMIC_SLAVE_ID_2, E_DMD_MSB123xc_DEMOD_I2C_WRITE_BYTES, 0, NULL, 1, bWriteData);
3558*53ee8cc1Swenshuai.xi 
3559*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3560*53ee8cc1Swenshuai.xi                         printf("\t\t\tStart   %ld\n", MsOS_GetSystemTime());
3561*53ee8cc1Swenshuai.xi #endif
3562*53ee8cc1Swenshuai.xi                         if ( (sizeof(MSB123xc_LIB) - 2) > MAX_MSB123xc_LIB_LEN)
3563*53ee8cc1Swenshuai.xi                         {
3564*53ee8cc1Swenshuai.xi                             printf("Err, msb123xcc_lib size(%d) is larger than flash size(%d)\n", sizeof(MSB123xc_LIB), MAX_MSB123xc_LIB_LEN);
3565*53ee8cc1Swenshuai.xi                         }
3566*53ee8cc1Swenshuai.xi 
3567*53ee8cc1Swenshuai.xi                         // if (IspProcFlash(MSB123xc_LIB, sizeof(MSB123xc_LIB)) == MAPI_FALSE)
3568*53ee8cc1Swenshuai.xi                         if (_IspProcFlash(MSB123xc_LIB, sizeof(MSB123xc_LIB)-2) == FALSE)
3569*53ee8cc1Swenshuai.xi                         {
3570*53ee8cc1Swenshuai.xi                             printf("ISP write FAIL\n");
3571*53ee8cc1Swenshuai.xi                             status= FALSE;
3572*53ee8cc1Swenshuai.xi                             continue;
3573*53ee8cc1Swenshuai.xi                         }
3574*53ee8cc1Swenshuai.xi                         else
3575*53ee8cc1Swenshuai.xi                         {
3576*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3577*53ee8cc1Swenshuai.xi                             printf("\t\t\tEnd   %ld\n", MsOS_GetSystemTime());
3578*53ee8cc1Swenshuai.xi #endif
3579*53ee8cc1Swenshuai.xi                             //check again
3580*53ee8cc1Swenshuai.xi                             if ((_IspCheckVer(MSB123xc_LIB, &bMatch) == FALSE)||(bMatch==false))
3581*53ee8cc1Swenshuai.xi                             {
3582*53ee8cc1Swenshuai.xi                                 printf(">>> ISP read FAIL! bMatch %d \n",bMatch);
3583*53ee8cc1Swenshuai.xi                                 status= FALSE;
3584*53ee8cc1Swenshuai.xi                                 continue;
3585*53ee8cc1Swenshuai.xi                             }
3586*53ee8cc1Swenshuai.xi                             else // reset again
3587*53ee8cc1Swenshuai.xi                             {
3588*53ee8cc1Swenshuai.xi                                 if (_sDMD_MSB123xc_InitData.fpGPIOReset != NULL)
3589*53ee8cc1Swenshuai.xi                                 {
3590*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3591*53ee8cc1Swenshuai.xi                                     printf(">>>MSB123xc[2]: Reset Demodulator\n");
3592*53ee8cc1Swenshuai.xi #endif
3593*53ee8cc1Swenshuai.xi                                     (*_sDMD_MSB123xc_InitData.fpGPIOReset)(FALSE); // gptr->SetOff();
3594*53ee8cc1Swenshuai.xi                                     MsOS_DelayTaskUs(resetDemodTime*1000);
3595*53ee8cc1Swenshuai.xi                                     (*_sDMD_MSB123xc_InitData.fpGPIOReset)(TRUE); // gptr->SetOn();
3596*53ee8cc1Swenshuai.xi                                     MsOS_DelayTaskUs(waitFlashTime * 1000);
3597*53ee8cc1Swenshuai.xi                                 }
3598*53ee8cc1Swenshuai.xi 
3599*53ee8cc1Swenshuai.xi                                 if (_MSB123xc_I2C_CH_Reset(3) == FALSE)
3600*53ee8cc1Swenshuai.xi                                 {
3601*53ee8cc1Swenshuai.xi                                     printf(">>>MSB123xc CH Reset:Fail\n");
3602*53ee8cc1Swenshuai.xi                                     status= FALSE;
3603*53ee8cc1Swenshuai.xi                                     continue;
3604*53ee8cc1Swenshuai.xi                                 }
3605*53ee8cc1Swenshuai.xi 
3606*53ee8cc1Swenshuai.xi                                 u16_counter = 1000;
3607*53ee8cc1Swenshuai.xi                                 do
3608*53ee8cc1Swenshuai.xi                                 {
3609*53ee8cc1Swenshuai.xi                                     // 10 ms
3610*53ee8cc1Swenshuai.xi                                     MsOS_DelayTaskUs(10*1000);
3611*53ee8cc1Swenshuai.xi                                     u16_counter--;
3612*53ee8cc1Swenshuai.xi                                     _MDrv_DMD_MSB123xc_GetReg(0x0900+(0x4f)*2, &u8DoneFlag);
3613*53ee8cc1Swenshuai.xi                                 }
3614*53ee8cc1Swenshuai.xi                                 while(u8DoneFlag != 0x99 && u16_counter != 0);
3615*53ee8cc1Swenshuai.xi 
3616*53ee8cc1Swenshuai.xi                                 if(u16_counter == 0 && u8DoneFlag != 0x99)
3617*53ee8cc1Swenshuai.xi                                 {
3618*53ee8cc1Swenshuai.xi                                     printf("[wb]Err, MSB123xc didn't ready yet\n");
3619*53ee8cc1Swenshuai.xi                                     status = FALSE;
3620*53ee8cc1Swenshuai.xi                                 }
3621*53ee8cc1Swenshuai.xi                                 else
3622*53ee8cc1Swenshuai.xi                                     status = TRUE;
3623*53ee8cc1Swenshuai.xi 
3624*53ee8cc1Swenshuai.xi                                 if (_MSB123xc_I2C_CH_Reset(3) == FALSE)
3625*53ee8cc1Swenshuai.xi                                 {
3626*53ee8cc1Swenshuai.xi                                     printf(">>>MSB123xc CH Reset:Fail\n");
3627*53ee8cc1Swenshuai.xi                                     status= FALSE;
3628*53ee8cc1Swenshuai.xi                                     continue;
3629*53ee8cc1Swenshuai.xi                                 }
3630*53ee8cc1Swenshuai.xi                                 else
3631*53ee8cc1Swenshuai.xi                                 {
3632*53ee8cc1Swenshuai.xi                                     printf(">>>MSB123xc CH Reset:OK\n");
3633*53ee8cc1Swenshuai.xi                                 }
3634*53ee8cc1Swenshuai.xi 
3635*53ee8cc1Swenshuai.xi                                 if (_dram_crc_check(crc16, &bMatch) == FALSE)
3636*53ee8cc1Swenshuai.xi                                 {
3637*53ee8cc1Swenshuai.xi                                     printf(">>> reg read fail!\n");
3638*53ee8cc1Swenshuai.xi                                     status= FALSE;
3639*53ee8cc1Swenshuai.xi                                     continue;
3640*53ee8cc1Swenshuai.xi                                 }
3641*53ee8cc1Swenshuai.xi 
3642*53ee8cc1Swenshuai.xi                                 if(bMatch == false)
3643*53ee8cc1Swenshuai.xi                                     printf(">>> dram crc check FAIL!\n");
3644*53ee8cc1Swenshuai.xi                                 else
3645*53ee8cc1Swenshuai.xi                                     printf(">>> dram crc check OK!\n");
3646*53ee8cc1Swenshuai.xi                             }
3647*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3648*53ee8cc1Swenshuai.xi                             printf(" OK\n");
3649*53ee8cc1Swenshuai.xi #endif
3650*53ee8cc1Swenshuai.xi                         }
3651*53ee8cc1Swenshuai.xi                     }
3652*53ee8cc1Swenshuai.xi                     else
3653*53ee8cc1Swenshuai.xi                     {
3654*53ee8cc1Swenshuai.xi                         // Version match, do nothing
3655*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3656*53ee8cc1Swenshuai.xi                         printf(">>> Match\n");
3657*53ee8cc1Swenshuai.xi #endif
3658*53ee8cc1Swenshuai.xi                     } // if (bMatch == false)
3659*53ee8cc1Swenshuai.xi 
3660*53ee8cc1Swenshuai.xi                     if (_sDMD_MSB123xc_InitData.bFlashWPEnable)
3661*53ee8cc1Swenshuai.xi                     {
3662*53ee8cc1Swenshuai.xi                         if (bMatch == TRUE)
3663*53ee8cc1Swenshuai.xi                         {
3664*53ee8cc1Swenshuai.xi                             // Enable flash WP, pull high.
3665*53ee8cc1Swenshuai.xi                             if(_msb123xc_flash_WP(1) == FALSE)
3666*53ee8cc1Swenshuai.xi                             {
3667*53ee8cc1Swenshuai.xi                                 printf("[wb]Err, FLASH WP Enable Fail!!!\n");
3668*53ee8cc1Swenshuai.xi                             }
3669*53ee8cc1Swenshuai.xi                             MsOS_DelayTaskUs(100*1000);
3670*53ee8cc1Swenshuai.xi                         }
3671*53ee8cc1Swenshuai.xi                     }  // bFlashWPEnable
3672*53ee8cc1Swenshuai.xi                 }
3673*53ee8cc1Swenshuai.xi 
3674*53ee8cc1Swenshuai.xi 
3675*53ee8cc1Swenshuai.xi                 if (_MSB123xc_I2C_CH_Reset(3) == FALSE)
3676*53ee8cc1Swenshuai.xi                 {
3677*53ee8cc1Swenshuai.xi                     printf(">>>MSB123xc CH Reset:Fail\n");
3678*53ee8cc1Swenshuai.xi                     status= FALSE;
3679*53ee8cc1Swenshuai.xi                     continue;
3680*53ee8cc1Swenshuai.xi                 }
3681*53ee8cc1Swenshuai.xi                 else
3682*53ee8cc1Swenshuai.xi                 {
3683*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3684*53ee8cc1Swenshuai.xi                     printf(">>>MSB123xc CH Reset:OK\n");
3685*53ee8cc1Swenshuai.xi #endif
3686*53ee8cc1Swenshuai.xi                 }
3687*53ee8cc1Swenshuai.xi 
3688*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3689*53ee8cc1Swenshuai.xi                 u32tmm_5 = MsOS_GetSystemTime();
3690*53ee8cc1Swenshuai.xi #endif
3691*53ee8cc1Swenshuai.xi 
3692*53ee8cc1Swenshuai.xi                 if (_LoadDSPCode() == FALSE)
3693*53ee8cc1Swenshuai.xi                 {
3694*53ee8cc1Swenshuai.xi                     printf(">>>>MSB123xc:Fail\n");
3695*53ee8cc1Swenshuai.xi                     status= FALSE;
3696*53ee8cc1Swenshuai.xi                     continue;
3697*53ee8cc1Swenshuai.xi                 }
3698*53ee8cc1Swenshuai.xi                 else
3699*53ee8cc1Swenshuai.xi                 {
3700*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3701*53ee8cc1Swenshuai.xi                     printf(">>>MSB123xc:OK\n");
3702*53ee8cc1Swenshuai.xi #endif
3703*53ee8cc1Swenshuai.xi                 }
3704*53ee8cc1Swenshuai.xi 
3705*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3706*53ee8cc1Swenshuai.xi                 u32tmm_6 = MsOS_GetSystemTime();
3707*53ee8cc1Swenshuai.xi                 printf("[tmm1]t6-t5 = %ld (%ld - %ld)\n",u32tmm_6-u32tmm_5,u32tmm_6,u32tmm_5);
3708*53ee8cc1Swenshuai.xi #endif
3709*53ee8cc1Swenshuai.xi 
3710*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3711*53ee8cc1Swenshuai.xi                 {
3712*53ee8cc1Swenshuai.xi                     MS_U8 u8ChipRevId = 0;
3713*53ee8cc1Swenshuai.xi                     _MDrv_DMD_MSB123xc_GetReg(0x0900+(0x01)*2, &u8ChipRevId);
3714*53ee8cc1Swenshuai.xi                     printf(">>>MSB123xc:Edinburgh RevID:%x\n", u8ChipRevId);
3715*53ee8cc1Swenshuai.xi 
3716*53ee8cc1Swenshuai.xi 
3717*53ee8cc1Swenshuai.xi                     _MDrv_DMD_MSB123xc_GetReg(0x0900+(0x49)*2, &u8ChipRevId);
3718*53ee8cc1Swenshuai.xi                     printf(">>>MSB123xc:Edinburgh 0x49_L:%x\n", u8ChipRevId);
3719*53ee8cc1Swenshuai.xi 
3720*53ee8cc1Swenshuai.xi                     _MDrv_DMD_MSB123xc_GetReg(0x0900+(0x49)*2+1, &u8ChipRevId);
3721*53ee8cc1Swenshuai.xi                     printf(">>>MSB123xc:Edinburgh 0x49_H:%x\n", u8ChipRevId);
3722*53ee8cc1Swenshuai.xi 
3723*53ee8cc1Swenshuai.xi                     _MDrv_DMD_MSB123xc_GetReg(0x0900+(0x4A)*2, &u8ChipRevId);
3724*53ee8cc1Swenshuai.xi                     printf(">>>MSB123xc:Edinburgh 0x4A_L:%x\n", u8ChipRevId);
3725*53ee8cc1Swenshuai.xi                 }
3726*53ee8cc1Swenshuai.xi #endif
3727*53ee8cc1Swenshuai.xi             }
3728*53ee8cc1Swenshuai.xi             while((u8RetryCnt>0)&&(status==FALSE));
3729*53ee8cc1Swenshuai.xi         }
3730*53ee8cc1Swenshuai.xi     }
3731*53ee8cc1Swenshuai.xi 
3732*53ee8cc1Swenshuai.xi     if(status==FALSE)
3733*53ee8cc1Swenshuai.xi     {
3734*53ee8cc1Swenshuai.xi         printf("msb123xc power_on_init FAIL !!!!!! \n\n");
3735*53ee8cc1Swenshuai.xi     }
3736*53ee8cc1Swenshuai.xi     else
3737*53ee8cc1Swenshuai.xi     {
3738*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
3739*53ee8cc1Swenshuai.xi         printf("msb123xc power_on_init OK !!!!!! \n\n");
3740*53ee8cc1Swenshuai.xi         u32tmm_2 = MsOS_GetSystemTime();
3741*53ee8cc1Swenshuai.xi         printf("[tmm]t2-t1 = %ld (%ld - %ld)\n",u32tmm_2-u32tmm_1,u32tmm_2,u32tmm_1);
3742*53ee8cc1Swenshuai.xi #endif
3743*53ee8cc1Swenshuai.xi     }
3744*53ee8cc1Swenshuai.xi 
3745*53ee8cc1Swenshuai.xi     DMD_UNLOCK();
3746*53ee8cc1Swenshuai.xi     return status;
3747*53ee8cc1Swenshuai.xi }
3748*53ee8cc1Swenshuai.xi 
3749*53ee8cc1Swenshuai.xi 
3750