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(®);
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(®);
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, ®);
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, ®);
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, ®);
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, ®);
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(®);
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(®);
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(®);
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(®);
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, ®);
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, ®);
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, ®);
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, ®);
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(®);
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(®);
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, ®);
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, ®);
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, ®);
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