xref: /utopia/UTPA2-700.0.x/modules/demodulator/drv/demod/drvDMD_INTERN_DVBS.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi //    Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi //    No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi //    modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi //    supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi //    Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi //    Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi //    obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi //    such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi //    MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi //    confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi //    third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi //    without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi //    intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi //    and in conformity with any international standard.  You agree to waive any
38*53ee8cc1Swenshuai.xi //    claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi //    incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi //    In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi //    consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi //    revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi //    You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi //    even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi //    request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi //    parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi //    services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi //    MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi //    ("Services").
52*53ee8cc1Swenshuai.xi //    You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi //    writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi //    disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi //    or otherwise:
58*53ee8cc1Swenshuai.xi //    (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi //        mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi //    (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi //        including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi //        of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi //    (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi //    of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi //    Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi //    settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi //    Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi //    with the said Rules.
72*53ee8cc1Swenshuai.xi //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi //    be English.
74*53ee8cc1Swenshuai.xi //    The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // ("MStar Confidential Information") by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi 
95*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
96*53ee8cc1Swenshuai.xi ///
97*53ee8cc1Swenshuai.xi /// file    drvDMD_INTERN_DVBS.c
98*53ee8cc1Swenshuai.xi /// @brief  DVBS 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 "drvDMD_INTERN_DVBS.h"
108*53ee8cc1Swenshuai.xi #include "drvDMD_INTERN_DVBS_v2.h"
109*53ee8cc1Swenshuai.xi //#include <string.h>
110*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
111*53ee8cc1Swenshuai.xi #include <linux/string.h>
112*53ee8cc1Swenshuai.xi #else
113*53ee8cc1Swenshuai.xi #include <string.h>
114*53ee8cc1Swenshuai.xi #include <stdio.h>
115*53ee8cc1Swenshuai.xi #include <math.h>
116*53ee8cc1Swenshuai.xi #endif
117*53ee8cc1Swenshuai.xi #include "MsCommon.h"
118*53ee8cc1Swenshuai.xi #include "MsVersion.h"
119*53ee8cc1Swenshuai.xi #include "MsOS.h"
120*53ee8cc1Swenshuai.xi // Internal Definition
121*53ee8cc1Swenshuai.xi //#include "regCHIP.h"
122*53ee8cc1Swenshuai.xi //#include "regAVD.h"
123*53ee8cc1Swenshuai.xi //#include "mapi_tuner.h"
124*53ee8cc1Swenshuai.xi #include "drvSYS.h"
125*53ee8cc1Swenshuai.xi #include "drvDMD_VD_MBX.h"
126*53ee8cc1Swenshuai.xi #include "halDMD_INTERN_DVBS.h"
127*53ee8cc1Swenshuai.xi #include "halDMD_INTERN_common.h"
128*53ee8cc1Swenshuai.xi #include "../../include/drvSAR.h"  // for Utopia2
129*53ee8cc1Swenshuai.xi #include "utopia.h"
130*53ee8cc1Swenshuai.xi #include "utopia_dapi.h"
131*53ee8cc1Swenshuai.xi #include "ULog.h"
132*53ee8cc1Swenshuai.xi #include "../../include/drvDMD_INTERN_DVBS_v2.h"  // for Utopia2
133*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
134*53ee8cc1Swenshuai.xi //  Driver Compiler Options
135*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
136*53ee8cc1Swenshuai.xi 
137*53ee8cc1Swenshuai.xi 
138*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
139*53ee8cc1Swenshuai.xi //  Local Defines
140*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
141*53ee8cc1Swenshuai.xi #define DVBS2FEC_REG_BASE            0x3D00
142*53ee8cc1Swenshuai.xi //#define MS_DEBUG 1
143*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
144*53ee8cc1Swenshuai.xi //  Local Structurs
145*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
146*53ee8cc1Swenshuai.xi 
147*53ee8cc1Swenshuai.xi 
148*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
149*53ee8cc1Swenshuai.xi //  Global Variables
150*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
151*53ee8cc1Swenshuai.xi extern MS_S16      _s16CurrentCFO;
152*53ee8cc1Swenshuai.xi extern MS_U16      _u16ChannelInfoArray[2][1000];
153*53ee8cc1Swenshuai.xi extern MS_U16      _u16ChannelInfoIndex;
154*53ee8cc1Swenshuai.xi extern MS_U16      _u16LockedCenterFreq;
155*53ee8cc1Swenshuai.xi extern MS_U16      _u16LockedSymbolRate;
156*53ee8cc1Swenshuai.xi extern MS_U8       modulation_order;
157*53ee8cc1Swenshuai.xi extern DMD_DVBS_Info sDMD_DVBS_Info;
158*53ee8cc1Swenshuai.xi extern MS_U8 u8DemodLockFlag;
159*53ee8cc1Swenshuai.xi extern MS_U8        g_dvbs_lock;
160*53ee8cc1Swenshuai.xi extern MS_BOOL     _bDemodType;
161*53ee8cc1Swenshuai.xi extern DMD_DVBS_DbgLv _u8DMD_DVBS_DbgLevel;
162*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
163*53ee8cc1Swenshuai.xi //  Local Variables
164*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
165*53ee8cc1Swenshuai.xi /*
166*53ee8cc1Swenshuai.xi static MS_U16             _u16SignalLevel[185][2]=
167*53ee8cc1Swenshuai.xi {//AV2028 SR=22M, 2/3 CN=5.9
168*53ee8cc1Swenshuai.xi     {32100,    920},{32200,    915},{32350,    910},{32390,    905},{32480,    900},{32550,    895},{32620,    890},{32680,    885},{32750,    880},{32830,    875},
169*53ee8cc1Swenshuai.xi     {32930,    870},{33010,    865},{33100,    860},{33200,    855},{33310,    850},{33410,    845},{33520,    840},{33640,    835},{33770,    830},{33900,    825},
170*53ee8cc1Swenshuai.xi     {34030,    820},{34150,    815},{34290,    810},{34390,    805},{34490,    800},{34580,    795},{34700,    790},{34800,    785},{34880,    780},{34940,    775},
171*53ee8cc1Swenshuai.xi     {35030,    770},{35130,    765},{35180,    760},{35260,    755},{35310,    750},{35340,    745},{35380,    740},{35400,    735},{35450,    730},{35550,    725},
172*53ee8cc1Swenshuai.xi     {35620,    720},{35700,    715},{35800,    710},{35890,    705},{36000,    700},{36120,    695},{36180,    690},{36280,    685},{36400,    680},{36570,    675},
173*53ee8cc1Swenshuai.xi     {36730,    670},{36910,    665},{37060,    660},{37100,    655},{37260,    650},{37340,    645},{37410,    640},{37580,    635},{37670,    630},{37700,    625},
174*53ee8cc1Swenshuai.xi     {37750,    620},{37800,    615},{37860,    610},{37980,    605},{38050,    600},{38170,    595},{38370,    590},{38540,    585},{38710,    580},{38870,    575},
175*53ee8cc1Swenshuai.xi     {39020,    570},{39070,    565},{39100,    560},{39180,    555},{39280,    550},{39460,    545},{39510,    540},{39600,    535},{39620,    530},{39680,    525},
176*53ee8cc1Swenshuai.xi     {39720,    520},{39830,    515},{39880,    510},{39930,    505},{39960,    500},{40000,    495},{40200,    490},{40360,    485},{40540,    480},{40730,    475},
177*53ee8cc1Swenshuai.xi     {40880,    470},{41020,    465},{41150,    460},{41280,    455},{41410,    450},{41520,    445},{41620,    440},{41730,    435},{41840,    430},{41930,    425},
178*53ee8cc1Swenshuai.xi     {42010,    420},{42100,    415},{42180,    410},{42260,    405},{42350,    400},{42440,    395},{42520,    390},{42580,    385},{42660,    380},{42730,    375},
179*53ee8cc1Swenshuai.xi     {42800,    370},{42870,    365},{42940,    360},{43000,    355},{43060,    350},{43130,    345},{43180,    340},{43250,    335},{43310,    330},{43370,    325},
180*53ee8cc1Swenshuai.xi     {43420,    320},{43460,    315},{43520,    310},{43570,    305},{43620,    300},{43660,    295},{43710,    290},{43750,    285},{43810,    280},{43860,    275},
181*53ee8cc1Swenshuai.xi     {43910,    270},{43940,    265},{43990,    260},{44020,    255},{44060,    250},{44110,    245},{44140,    240},{44190,    235},{44230,    230},{44270,    225},
182*53ee8cc1Swenshuai.xi     {44320,    220},{44370,    215},{44400,    210},{44450,    205},{44490,    200},{44530,    195},{44590,    190},{44630,    185},{44660,    180},{44720,    175},
183*53ee8cc1Swenshuai.xi     {44750,    170},{44790,    165},{44830,    160},{44880,    155},{44910,    150},{44960,    145},{45000,    140},{45030,    135},{45070,    130},{45100,    125},
184*53ee8cc1Swenshuai.xi     {45130,    120},{45160,    115},{45200,    110},{45240,    105},{45270,    100},{45300,     95},{45330,     90},{45360,     85},{45400,     80},{45430,     75},
185*53ee8cc1Swenshuai.xi     {45460,     70},{45490,     65},{45530,     60},{45560,     55},{45590,     50},{45630,     45},{45670,     40},{45690,     35},{45740,     30},{45760,     25},
186*53ee8cc1Swenshuai.xi     {45800,     20},{45830,     15},{45860,     10},{45880,      5},{45920,      0}
187*53ee8cc1Swenshuai.xi };
188*53ee8cc1Swenshuai.xi */
189*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
190*53ee8cc1Swenshuai.xi //  Debug Functions
191*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
192*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
193*53ee8cc1Swenshuai.xi #define DMD_DBG(x)          (x)
194*53ee8cc1Swenshuai.xi #else
195*53ee8cc1Swenshuai.xi #define DMD_DBG(x)          //(x)
196*53ee8cc1Swenshuai.xi #endif
197*53ee8cc1Swenshuai.xi 
198*53ee8cc1Swenshuai.xi static    void* ppDVBSInstant = NULL;
199*53ee8cc1Swenshuai.xi static MS_U32 u32DVBSopen = 0;
200*53ee8cc1Swenshuai.xi static MS_U8 u8DVBSUtopiaOpen = 0;   //for SetStillImagePara is earlier called than Init
201*53ee8cc1Swenshuai.xi 
202*53ee8cc1Swenshuai.xi static DMD_DVBS_InitData   AgcSsi_Para;
203*53ee8cc1Swenshuai.xi //static float intern_dvb_c_qam_ref[] = {3.0, 0.0, 0.0, 0.0, 0.0, 80.0}; //16q,32q,64q,128q,256q, and others
204*53ee8cc1Swenshuai.xi 
205*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
206*53ee8cc1Swenshuai.xi //  Local Functions
207*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
208*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX
209*53ee8cc1Swenshuai.xi #if 1
210*53ee8cc1Swenshuai.xi static float _LogApproxTableX[80] =
211*53ee8cc1Swenshuai.xi { 1.00, 1.30, 1.69, 2.20, 2.86, 3.71, 4.83, 6.27, 8.16, 10.60, 13.79,
212*53ee8cc1Swenshuai.xi   17.92, 23.30, 30.29, 39.37, 51.19, 66.54, 86.50, 112.46, 146.19,
213*53ee8cc1Swenshuai.xi   190.05, 247.06, 321.18, 417.54, 542.80, 705.64, 917.33, 1192.53,
214*53ee8cc1Swenshuai.xi   1550.29, 2015.38, 2620.00, 3405.99, 4427.79, 5756.13, 7482.97,
215*53ee8cc1Swenshuai.xi   9727.86, 12646.22, 16440.08, 21372.11, 27783.74, 36118.86,
216*53ee8cc1Swenshuai.xi   46954.52, 61040.88, 79353.15, 103159.09, 134106.82, 174338.86,
217*53ee8cc1Swenshuai.xi   226640.52, 294632.68, 383022.48, 497929.22, 647307.99, 841500.39, 1093950.50,
218*53ee8cc1Swenshuai.xi   1422135.65, 1848776.35, 2403409.25, 3124432.03, 4061761.64, 5280290.13,
219*53ee8cc1Swenshuai.xi   6864377.17, 8923690.32, 11600797.42, 15081036.65, 19605347.64, 25486951.94,
220*53ee8cc1Swenshuai.xi   33133037.52, 43072948.77, 55994833.40, 72793283.42, 94631268.45,
221*53ee8cc1Swenshuai.xi   123020648.99, 159926843.68, 207904896.79, 270276365.82, 351359275.57,
222*53ee8cc1Swenshuai.xi   456767058.24, 593797175.72, 771936328.43, 1003517226.96
223*53ee8cc1Swenshuai.xi };
224*53ee8cc1Swenshuai.xi 
225*53ee8cc1Swenshuai.xi static float _LogApproxTableY[80] =
226*53ee8cc1Swenshuai.xi { 0.00, 0.11, 0.23, 0.34, 0.46, 0.57, 0.68, 0.80, 0.91, 1.03, 1.14, 1.25,
227*53ee8cc1Swenshuai.xi   1.37, 1.48, 1.60, 1.71, 1.82, 1.94, 2.05, 2.16, 2.28, 2.39, 2.51, 2.62,
228*53ee8cc1Swenshuai.xi   2.73, 2.85, 2.96, 3.08, 3.19, 3.30, 3.42, 3.53, 3.65, 3.76, 3.87, 3.99,
229*53ee8cc1Swenshuai.xi   4.10, 4.22, 4.33, 4.44, 4.56, 4.67, 4.79, 4.90, 5.01, 5.13, 5.24, 5.36,
230*53ee8cc1Swenshuai.xi   5.47, 5.58, 5.70, 5.81, 5.93, 6.04, 6.15, 6.27, 6.04, 6.15, 6.27, 6.38,
231*53ee8cc1Swenshuai.xi   6.49, 6.61, 6.72, 6.84, 6.95, 7.06, 7.18, 7.29, 7.41, 7.52, 7.63, 7.75,
232*53ee8cc1Swenshuai.xi   7.86, 7.98, 8.09, 8.20, 8.32, 8.43, 8.55, 8.66
233*53ee8cc1Swenshuai.xi };
234*53ee8cc1Swenshuai.xi 
Log10Approx(float flt_x)235*53ee8cc1Swenshuai.xi static float Log10Approx(float flt_x)
236*53ee8cc1Swenshuai.xi {
237*53ee8cc1Swenshuai.xi     MS_U8  indx = 0;
238*53ee8cc1Swenshuai.xi 
239*53ee8cc1Swenshuai.xi     do {
240*53ee8cc1Swenshuai.xi         if (flt_x < _LogApproxTableX[indx])
241*53ee8cc1Swenshuai.xi             break;
242*53ee8cc1Swenshuai.xi         indx++;
243*53ee8cc1Swenshuai.xi     }while (indx < 79);   //stop at indx = 80
244*53ee8cc1Swenshuai.xi 
245*53ee8cc1Swenshuai.xi     return _LogApproxTableY[indx];
246*53ee8cc1Swenshuai.xi }
247*53ee8cc1Swenshuai.xi #else
Log10Approx(float flt_x)248*53ee8cc1Swenshuai.xi static float Log10Approx(float flt_x)
249*53ee8cc1Swenshuai.xi {
250*53ee8cc1Swenshuai.xi     MS_U32       u32_temp = 1;
251*53ee8cc1Swenshuai.xi     MS_U8        indx = 0;
252*53ee8cc1Swenshuai.xi 
253*53ee8cc1Swenshuai.xi     do {
254*53ee8cc1Swenshuai.xi         u32_temp = u32_temp << 1;
255*53ee8cc1Swenshuai.xi         if (flt_x < (float)u32_temp)
256*53ee8cc1Swenshuai.xi             break;
257*53ee8cc1Swenshuai.xi     }while (++indx < 32);
258*53ee8cc1Swenshuai.xi 
259*53ee8cc1Swenshuai.xi     // 10*log10(X) ~= 0.3*N, when X ~= 2^N
260*53ee8cc1Swenshuai.xi     return (float)0.3 * indx;
261*53ee8cc1Swenshuai.xi }
262*53ee8cc1Swenshuai.xi #endif
263*53ee8cc1Swenshuai.xi #endif
264*53ee8cc1Swenshuai.xi 
265*53ee8cc1Swenshuai.xi #ifdef UFO_SUPPORT_KERNEL_FLOATING
266*53ee8cc1Swenshuai.xi #define MAX_INT 0x7FFFFFFF
267*53ee8cc1Swenshuai.xi #define Pow2_62 0x4000000000000000
268*53ee8cc1Swenshuai.xi 
ABS_32(MS_S32 input)269*53ee8cc1Swenshuai.xi MS_U32 ABS_32(MS_S32 input)
270*53ee8cc1Swenshuai.xi {
271*53ee8cc1Swenshuai.xi     MS_U32 result;
272*53ee8cc1Swenshuai.xi 
273*53ee8cc1Swenshuai.xi     if(input < 0)
274*53ee8cc1Swenshuai.xi     {
275*53ee8cc1Swenshuai.xi         result = (-1)*input;
276*53ee8cc1Swenshuai.xi     }
277*53ee8cc1Swenshuai.xi     else
278*53ee8cc1Swenshuai.xi         result = input;
279*53ee8cc1Swenshuai.xi 
280*53ee8cc1Swenshuai.xi     return result;
281*53ee8cc1Swenshuai.xi }
282*53ee8cc1Swenshuai.xi 
ABS_64(MS_S64 input)283*53ee8cc1Swenshuai.xi MS_U64 ABS_64(MS_S64 input)
284*53ee8cc1Swenshuai.xi {
285*53ee8cc1Swenshuai.xi     MS_U64 result;
286*53ee8cc1Swenshuai.xi 
287*53ee8cc1Swenshuai.xi     if(input < 0)
288*53ee8cc1Swenshuai.xi     {
289*53ee8cc1Swenshuai.xi         result = (-1)*input;
290*53ee8cc1Swenshuai.xi     }
291*53ee8cc1Swenshuai.xi     else
292*53ee8cc1Swenshuai.xi         result = input;
293*53ee8cc1Swenshuai.xi 
294*53ee8cc1Swenshuai.xi     return result;
295*53ee8cc1Swenshuai.xi }
296*53ee8cc1Swenshuai.xi 
Find_MSB(MS_S64 input)297*53ee8cc1Swenshuai.xi MS_U8 Find_MSB(MS_S64 input)
298*53ee8cc1Swenshuai.xi {
299*53ee8cc1Swenshuai.xi     MS_S8 iter = -1;
300*53ee8cc1Swenshuai.xi     MS_U64 data = ABS_64(input);
301*53ee8cc1Swenshuai.xi 
302*53ee8cc1Swenshuai.xi     while(0 != data)
303*53ee8cc1Swenshuai.xi     {
304*53ee8cc1Swenshuai.xi         ++iter;
305*53ee8cc1Swenshuai.xi         data >>= 1;
306*53ee8cc1Swenshuai.xi     }
307*53ee8cc1Swenshuai.xi 
308*53ee8cc1Swenshuai.xi     if(iter >= 0)
309*53ee8cc1Swenshuai.xi     {
310*53ee8cc1Swenshuai.xi         return iter;
311*53ee8cc1Swenshuai.xi     }
312*53ee8cc1Swenshuai.xi 
313*53ee8cc1Swenshuai.xi     return 0;
314*53ee8cc1Swenshuai.xi  }
315*53ee8cc1Swenshuai.xi 
Normalize(MS_FLOAT_ST * input)316*53ee8cc1Swenshuai.xi void Normalize(MS_FLOAT_ST *input)
317*53ee8cc1Swenshuai.xi {
318*53ee8cc1Swenshuai.xi     MS_U8 LSB, sign_flag;
319*53ee8cc1Swenshuai.xi 
320*53ee8cc1Swenshuai.xi     MS_S8 EXP;
321*53ee8cc1Swenshuai.xi     MS_U32 data;
322*53ee8cc1Swenshuai.xi 
323*53ee8cc1Swenshuai.xi     if((*input).DATA == 0)
324*53ee8cc1Swenshuai.xi     {
325*53ee8cc1Swenshuai.xi         (*input).EXP = 0;
326*53ee8cc1Swenshuai.xi     }
327*53ee8cc1Swenshuai.xi     else
328*53ee8cc1Swenshuai.xi     {
329*53ee8cc1Swenshuai.xi         LSB = 0;
330*53ee8cc1Swenshuai.xi 
331*53ee8cc1Swenshuai.xi         if((*input).DATA < 0) // negative value
332*53ee8cc1Swenshuai.xi             sign_flag = 1;
333*53ee8cc1Swenshuai.xi         else
334*53ee8cc1Swenshuai.xi             sign_flag = 0;
335*53ee8cc1Swenshuai.xi 
336*53ee8cc1Swenshuai.xi         data = ABS_32((*input).DATA);
337*53ee8cc1Swenshuai.xi         EXP = (*input).EXP;
338*53ee8cc1Swenshuai.xi 
339*53ee8cc1Swenshuai.xi         if(EXP != 0)
340*53ee8cc1Swenshuai.xi         {
341*53ee8cc1Swenshuai.xi            while( (data & 0x01) == 0x00 )
342*53ee8cc1Swenshuai.xi            {
343*53ee8cc1Swenshuai.xi             ++LSB;
344*53ee8cc1Swenshuai.xi             data >>= 1;
345*53ee8cc1Swenshuai.xi            }
346*53ee8cc1Swenshuai.xi 
347*53ee8cc1Swenshuai.xi            EXP += LSB;
348*53ee8cc1Swenshuai.xi 
349*53ee8cc1Swenshuai.xi            (*input).DATA = data;
350*53ee8cc1Swenshuai.xi            (*input).EXP = EXP;
351*53ee8cc1Swenshuai.xi 
352*53ee8cc1Swenshuai.xi            if(sign_flag == 1)
353*53ee8cc1Swenshuai.xi            {
354*53ee8cc1Swenshuai.xi             (*input).DATA *= (-1);
355*53ee8cc1Swenshuai.xi            }
356*53ee8cc1Swenshuai.xi         }
357*53ee8cc1Swenshuai.xi     }
358*53ee8cc1Swenshuai.xi }
359*53ee8cc1Swenshuai.xi 
MS_FLOAT_OP(MS_FLOAT_ST stRn,MS_FLOAT_ST stRd,OP_type eOpcode)360*53ee8cc1Swenshuai.xi MS_FLOAT_ST MS_FLOAT_OP(MS_FLOAT_ST stRn,MS_FLOAT_ST stRd, OP_type eOpcode)
361*53ee8cc1Swenshuai.xi {
362*53ee8cc1Swenshuai.xi     MS_FLOAT_ST result;
363*53ee8cc1Swenshuai.xi 
364*53ee8cc1Swenshuai.xi     MS_S32 data1, data2;
365*53ee8cc1Swenshuai.xi     MS_U32 udata1, udata2;
366*53ee8cc1Swenshuai.xi     MS_S8 EXP1, EXP2;
367*53ee8cc1Swenshuai.xi     MS_S8 iter, MSB, MSB_temp;
368*53ee8cc1Swenshuai.xi 
369*53ee8cc1Swenshuai.xi     MS_S64 temp;
370*53ee8cc1Swenshuai.xi 
371*53ee8cc1Swenshuai.xi     Normalize(&stRn);
372*53ee8cc1Swenshuai.xi     Normalize(&stRd);
373*53ee8cc1Swenshuai.xi 
374*53ee8cc1Swenshuai.xi     data1 = stRn.DATA;
375*53ee8cc1Swenshuai.xi     data2 = stRd.DATA;
376*53ee8cc1Swenshuai.xi 
377*53ee8cc1Swenshuai.xi     udata1 = ABS_32(data1);
378*53ee8cc1Swenshuai.xi     udata2 = ABS_32(data2);
379*53ee8cc1Swenshuai.xi 
380*53ee8cc1Swenshuai.xi     EXP1 = stRn.EXP;
381*53ee8cc1Swenshuai.xi     EXP2 = stRd.EXP;
382*53ee8cc1Swenshuai.xi 
383*53ee8cc1Swenshuai.xi     switch(eOpcode)
384*53ee8cc1Swenshuai.xi     {
385*53ee8cc1Swenshuai.xi         case add:
386*53ee8cc1Swenshuai.xi         {
387*53ee8cc1Swenshuai.xi             if(EXP1 == EXP2)
388*53ee8cc1Swenshuai.xi             {
389*53ee8cc1Swenshuai.xi                 temp = data1;
390*53ee8cc1Swenshuai.xi                 temp += data2;
391*53ee8cc1Swenshuai.xi 
392*53ee8cc1Swenshuai.xi                 if(temp > MAX_INT || temp < (-1)*MAX_INT)
393*53ee8cc1Swenshuai.xi                 {
394*53ee8cc1Swenshuai.xi                     temp >>= 1;
395*53ee8cc1Swenshuai.xi                     result.DATA = temp;
396*53ee8cc1Swenshuai.xi                     result.EXP = (EXP1 + 1);
397*53ee8cc1Swenshuai.xi                 }
398*53ee8cc1Swenshuai.xi                 else
399*53ee8cc1Swenshuai.xi                 {
400*53ee8cc1Swenshuai.xi                     result.DATA = (data1 + data2);
401*53ee8cc1Swenshuai.xi                     result.EXP = EXP1;
402*53ee8cc1Swenshuai.xi                 }
403*53ee8cc1Swenshuai.xi             }
404*53ee8cc1Swenshuai.xi             else if(EXP1 > EXP2)
405*53ee8cc1Swenshuai.xi             {
406*53ee8cc1Swenshuai.xi                 temp = data1;
407*53ee8cc1Swenshuai.xi 
408*53ee8cc1Swenshuai.xi                 MSB = Find_MSB(temp);
409*53ee8cc1Swenshuai.xi 
410*53ee8cc1Swenshuai.xi                 if( (MSB - EXP2) < 63)
411*53ee8cc1Swenshuai.xi                 {
412*53ee8cc1Swenshuai.xi                     for(iter = EXP1; iter > EXP2;--iter)
413*53ee8cc1Swenshuai.xi                     {
414*53ee8cc1Swenshuai.xi                         temp = (temp << 1);
415*53ee8cc1Swenshuai.xi                     }
416*53ee8cc1Swenshuai.xi 
417*53ee8cc1Swenshuai.xi                     temp += data2;
418*53ee8cc1Swenshuai.xi 
419*53ee8cc1Swenshuai.xi                     if(temp > MAX_INT || temp < (-1)*MAX_INT)
420*53ee8cc1Swenshuai.xi                     {
421*53ee8cc1Swenshuai.xi                         MSB = Find_MSB(temp);
422*53ee8cc1Swenshuai.xi 
423*53ee8cc1Swenshuai.xi                         temp >>= (MSB-30);
424*53ee8cc1Swenshuai.xi                         result.DATA = temp;
425*53ee8cc1Swenshuai.xi                         result.EXP = (EXP2 + (MSB-30));
426*53ee8cc1Swenshuai.xi                     }
427*53ee8cc1Swenshuai.xi                     else
428*53ee8cc1Swenshuai.xi                     {
429*53ee8cc1Swenshuai.xi                         result.DATA = temp;
430*53ee8cc1Swenshuai.xi                         result.EXP = EXP2;
431*53ee8cc1Swenshuai.xi                     }
432*53ee8cc1Swenshuai.xi                 }
433*53ee8cc1Swenshuai.xi                 else
434*53ee8cc1Swenshuai.xi                 {
435*53ee8cc1Swenshuai.xi                     result.DATA = data1;
436*53ee8cc1Swenshuai.xi                     result.EXP = data1;
437*53ee8cc1Swenshuai.xi                 }
438*53ee8cc1Swenshuai.xi             }
439*53ee8cc1Swenshuai.xi             else
440*53ee8cc1Swenshuai.xi             {
441*53ee8cc1Swenshuai.xi                 return MS_FLOAT_OP(stRd, stRn, add);
442*53ee8cc1Swenshuai.xi             }
443*53ee8cc1Swenshuai.xi         }
444*53ee8cc1Swenshuai.xi         break;
445*53ee8cc1Swenshuai.xi 
446*53ee8cc1Swenshuai.xi         case minus:
447*53ee8cc1Swenshuai.xi         {
448*53ee8cc1Swenshuai.xi             stRd.DATA *= (-1);
449*53ee8cc1Swenshuai.xi             return MS_FLOAT_OP(stRn, stRd, add);
450*53ee8cc1Swenshuai.xi         }
451*53ee8cc1Swenshuai.xi         break;
452*53ee8cc1Swenshuai.xi 
453*53ee8cc1Swenshuai.xi         case multiply:
454*53ee8cc1Swenshuai.xi         {
455*53ee8cc1Swenshuai.xi             if(data1 == 0 || data2 == 0)
456*53ee8cc1Swenshuai.xi             {
457*53ee8cc1Swenshuai.xi                 result.DATA = 0;
458*53ee8cc1Swenshuai.xi                 result.EXP = 0;
459*53ee8cc1Swenshuai.xi             }
460*53ee8cc1Swenshuai.xi             else
461*53ee8cc1Swenshuai.xi             {
462*53ee8cc1Swenshuai.xi                 temp = data1;
463*53ee8cc1Swenshuai.xi                 temp *= data2;
464*53ee8cc1Swenshuai.xi 
465*53ee8cc1Swenshuai.xi                 if( (temp <= MAX_INT) && (temp >= (-1*MAX_INT) ) )
466*53ee8cc1Swenshuai.xi                 {
467*53ee8cc1Swenshuai.xi                     result.DATA = data1 * data2;
468*53ee8cc1Swenshuai.xi                     result.EXP = EXP1 + EXP2;
469*53ee8cc1Swenshuai.xi                 }
470*53ee8cc1Swenshuai.xi                 else // overflow
471*53ee8cc1Swenshuai.xi                 {
472*53ee8cc1Swenshuai.xi                     MSB = Find_MSB(temp);
473*53ee8cc1Swenshuai.xi 
474*53ee8cc1Swenshuai.xi                     temp = temp >> (MSB-30);
475*53ee8cc1Swenshuai.xi 
476*53ee8cc1Swenshuai.xi                     result.DATA = (MS_S32)temp;
477*53ee8cc1Swenshuai.xi                     result.EXP = EXP1 + EXP2 + (MSB-30);
478*53ee8cc1Swenshuai.xi                 }
479*53ee8cc1Swenshuai.xi             }
480*53ee8cc1Swenshuai.xi         }
481*53ee8cc1Swenshuai.xi         break;
482*53ee8cc1Swenshuai.xi 
483*53ee8cc1Swenshuai.xi         case divide:
484*53ee8cc1Swenshuai.xi         {
485*53ee8cc1Swenshuai.xi             if(data1 != 0 && data2 != 0)
486*53ee8cc1Swenshuai.xi             {
487*53ee8cc1Swenshuai.xi                 if(udata1 < udata2)
488*53ee8cc1Swenshuai.xi                 {
489*53ee8cc1Swenshuai.xi                     temp = Pow2_62;
490*53ee8cc1Swenshuai.xi                     temp = temp / data2 * data1;
491*53ee8cc1Swenshuai.xi 
492*53ee8cc1Swenshuai.xi                     MSB = Find_MSB(temp);
493*53ee8cc1Swenshuai.xi 
494*53ee8cc1Swenshuai.xi                     if(MSB > 30)
495*53ee8cc1Swenshuai.xi                     {
496*53ee8cc1Swenshuai.xi                         temp >>= (MSB-30);
497*53ee8cc1Swenshuai.xi                         result.DATA = temp;
498*53ee8cc1Swenshuai.xi                         result.EXP = EXP1 - EXP2 + (MSB-30) - 62;
499*53ee8cc1Swenshuai.xi                     }
500*53ee8cc1Swenshuai.xi                     else
501*53ee8cc1Swenshuai.xi                     {
502*53ee8cc1Swenshuai.xi                         result.DATA = temp;
503*53ee8cc1Swenshuai.xi                         result.EXP = EXP1 - EXP2 - 62;
504*53ee8cc1Swenshuai.xi                     }
505*53ee8cc1Swenshuai.xi                 }
506*53ee8cc1Swenshuai.xi                 else if(udata1 == udata2)
507*53ee8cc1Swenshuai.xi                 {
508*53ee8cc1Swenshuai.xi                     result.DATA = data1 / data2;
509*53ee8cc1Swenshuai.xi                     result.EXP = EXP1 - EXP2;
510*53ee8cc1Swenshuai.xi                 }
511*53ee8cc1Swenshuai.xi                 else // udata1 > udata2
512*53ee8cc1Swenshuai.xi                 {
513*53ee8cc1Swenshuai.xi                     MSB = Find_MSB(data1);
514*53ee8cc1Swenshuai.xi                     MSB_temp = Find_MSB(data2);
515*53ee8cc1Swenshuai.xi 
516*53ee8cc1Swenshuai.xi                     EXP2 -= ((MSB-MSB_temp) + 1);
517*53ee8cc1Swenshuai.xi 
518*53ee8cc1Swenshuai.xi                     temp = Pow2_62;
519*53ee8cc1Swenshuai.xi                     temp = temp / ( ((MS_S64)data2) << ((MSB-MSB_temp) + 1)) * data1;
520*53ee8cc1Swenshuai.xi 
521*53ee8cc1Swenshuai.xi                     MSB = Find_MSB(temp);
522*53ee8cc1Swenshuai.xi 
523*53ee8cc1Swenshuai.xi                     if(MSB > 30)
524*53ee8cc1Swenshuai.xi                     {
525*53ee8cc1Swenshuai.xi                         temp >>= (MSB-30);
526*53ee8cc1Swenshuai.xi                         result.DATA = temp;
527*53ee8cc1Swenshuai.xi                         result.EXP = EXP1 - EXP2 + (MSB-30) - 62;
528*53ee8cc1Swenshuai.xi                     }
529*53ee8cc1Swenshuai.xi                     else
530*53ee8cc1Swenshuai.xi                     {
531*53ee8cc1Swenshuai.xi                         result.DATA = temp;
532*53ee8cc1Swenshuai.xi                         result.EXP = EXP1 - EXP2 - 62;
533*53ee8cc1Swenshuai.xi                     }
534*53ee8cc1Swenshuai.xi                 }
535*53ee8cc1Swenshuai.xi             }
536*53ee8cc1Swenshuai.xi             else
537*53ee8cc1Swenshuai.xi             {
538*53ee8cc1Swenshuai.xi                 result.DATA = 0;
539*53ee8cc1Swenshuai.xi                 result.EXP = 0;
540*53ee8cc1Swenshuai.xi             }
541*53ee8cc1Swenshuai.xi         }
542*53ee8cc1Swenshuai.xi         break;
543*53ee8cc1Swenshuai.xi 
544*53ee8cc1Swenshuai.xi         default:
545*53ee8cc1Swenshuai.xi         break;
546*53ee8cc1Swenshuai.xi     }
547*53ee8cc1Swenshuai.xi 
548*53ee8cc1Swenshuai.xi     Normalize(&result);
549*53ee8cc1Swenshuai.xi 
550*53ee8cc1Swenshuai.xi     return result;
551*53ee8cc1Swenshuai.xi }
552*53ee8cc1Swenshuai.xi #endif
553*53ee8cc1Swenshuai.xi 
554*53ee8cc1Swenshuai.xi #ifdef UFO_DEMOD_DVBS_SUPPORT_DMD_INT
MDrv_DMD_DVBS_Reg_INT_CB(fpIntCallBack fpCBReg)555*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_Reg_INT_CB(fpIntCallBack fpCBReg)
556*53ee8cc1Swenshuai.xi {
557*53ee8cc1Swenshuai.xi     DVBS_INT_MODE Drv_DVBS_INT_MODE;
558*53ee8cc1Swenshuai.xi     Drv_DVBS_INT_MODE.fpCB = fpCBReg;
559*53ee8cc1Swenshuai.xi     Drv_DVBS_INT_MODE.ret = FALSE;
560*53ee8cc1Swenshuai.xi 
561*53ee8cc1Swenshuai.xi     if(u32DVBSopen==1)
562*53ee8cc1Swenshuai.xi     {
563*53ee8cc1Swenshuai.xi         UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_INT_MODE,&Drv_DVBS_INT_MODE);
564*53ee8cc1Swenshuai.xi     }
565*53ee8cc1Swenshuai.xi 
566*53ee8cc1Swenshuai.xi     return Drv_DVBS_INT_MODE.ret;
567*53ee8cc1Swenshuai.xi }
568*53ee8cc1Swenshuai.xi #endif
569*53ee8cc1Swenshuai.xi 
570*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
571*53ee8cc1Swenshuai.xi //  Global Functions
572*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_DMD_DVBS_Init(DMD_DVBS_InitData * pDMD_DVBS_InitData,MS_U32 u32InitDataLen)573*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_Init(DMD_DVBS_InitData *pDMD_DVBS_InitData, MS_U32 u32InitDataLen)
574*53ee8cc1Swenshuai.xi {
575*53ee8cc1Swenshuai.xi     void* pAttribte = NULL;
576*53ee8cc1Swenshuai.xi 
577*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
578*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","******check driver layer DVBS init!!*******\n");
579*53ee8cc1Swenshuai.xi     #endif
580*53ee8cc1Swenshuai.xi     DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_Init\n"));
581*53ee8cc1Swenshuai.xi 
582*53ee8cc1Swenshuai.xi     DVBS_Init_PARAM Drv_DVBS_Init_PARAM;
583*53ee8cc1Swenshuai.xi     DMD_DVBS_InitData_Transform Init_Para_Temp;
584*53ee8cc1Swenshuai.xi 
585*53ee8cc1Swenshuai.xi     Init_Para_Temp.u8SarChannel=pDMD_DVBS_InitData->u8SarChannel;
586*53ee8cc1Swenshuai.xi     Init_Para_Temp.u8DMD_DVBS_DSPRegInitExt=pDMD_DVBS_InitData->u8DMD_DVBS_DSPRegInitExt;
587*53ee8cc1Swenshuai.xi     Init_Para_Temp.u8DMD_DVBS_DSPRegInitSize=pDMD_DVBS_InitData->u8DMD_DVBS_DSPRegInitSize;
588*53ee8cc1Swenshuai.xi     Init_Para_Temp.u8DMD_DVBS_InitExt=pDMD_DVBS_InitData->u8DMD_DVBS_InitExt;
589*53ee8cc1Swenshuai.xi     /*
590*53ee8cc1Swenshuai.xi     Init_Para_Temp.pTuner_RfagcSsi=pDMD_DVBS_InitData->pTuner_RfagcSsi;
591*53ee8cc1Swenshuai.xi     Init_Para_Temp.u16Tuner_RfagcSsi_Size=pDMD_DVBS_InitData->u16Tuner_RfagcSsi_Size;
592*53ee8cc1Swenshuai.xi     Init_Para_Temp.pTuner_IfagcSsi_LoRef=pDMD_DVBS_InitData->pTuner_IfagcSsi_LoRef;
593*53ee8cc1Swenshuai.xi     Init_Para_Temp.u16Tuner_IfagcSsi_LoRef_Size=pDMD_DVBS_InitData->u16Tuner_IfagcSsi_LoRef_Size;
594*53ee8cc1Swenshuai.xi     Init_Para_Temp.pTuner_IfagcSsi_HiRef=pDMD_DVBS_InitData->pTuner_IfagcSsi_HiRef;
595*53ee8cc1Swenshuai.xi     Init_Para_Temp.u16Tuner_IfagcSsi_HiRef_Size=pDMD_DVBS_InitData->u16Tuner_IfagcSsi_HiRef_Size;
596*53ee8cc1Swenshuai.xi     Init_Para_Temp.pTuner_IfagcErr_LoRef=pDMD_DVBS_InitData->pTuner_IfagcErr_LoRef;
597*53ee8cc1Swenshuai.xi     Init_Para_Temp.u16Tuner_IfagcErr_LoRef_Size=pDMD_DVBS_InitData->u16Tuner_IfagcErr_LoRef_Size;
598*53ee8cc1Swenshuai.xi     Init_Para_Temp.pTuner_IfagcSsi_HiRef=pDMD_DVBS_InitData->pTuner_IfagcSsi_HiRef;
599*53ee8cc1Swenshuai.xi     Init_Para_Temp.u16Tuner_IfagcErr_HiRef_Size=pDMD_DVBS_InitData->u16Tuner_IfagcErr_HiRef_Size;
600*53ee8cc1Swenshuai.xi     Init_Para_Temp.pSqiCnNordigP1=pDMD_DVBS_InitData->pSqiCnNordigP1;
601*53ee8cc1Swenshuai.xi     Init_Para_Temp.u16SqiCnNordigP1_Size=pDMD_DVBS_InitData->u16SqiCnNordigP1_Size;
602*53ee8cc1Swenshuai.xi     */
603*53ee8cc1Swenshuai.xi 
604*53ee8cc1Swenshuai.xi     AgcSsi_Para.pTuner_RfagcSsi=pDMD_DVBS_InitData->pTuner_RfagcSsi;
605*53ee8cc1Swenshuai.xi     AgcSsi_Para.u16Tuner_RfagcSsi_Size=pDMD_DVBS_InitData->u16Tuner_RfagcSsi_Size;
606*53ee8cc1Swenshuai.xi     AgcSsi_Para.pTuner_IfagcSsi_LoRef=pDMD_DVBS_InitData->pTuner_IfagcSsi_LoRef;
607*53ee8cc1Swenshuai.xi     AgcSsi_Para.u16Tuner_IfagcSsi_LoRef_Size=pDMD_DVBS_InitData->u16Tuner_IfagcSsi_LoRef_Size;
608*53ee8cc1Swenshuai.xi     AgcSsi_Para.pTuner_IfagcSsi_HiRef=pDMD_DVBS_InitData->pTuner_IfagcSsi_HiRef;
609*53ee8cc1Swenshuai.xi     AgcSsi_Para.u16Tuner_IfagcSsi_HiRef_Size=pDMD_DVBS_InitData->u16Tuner_IfagcSsi_HiRef_Size;
610*53ee8cc1Swenshuai.xi     AgcSsi_Para.pTuner_IfagcErr_LoRef=pDMD_DVBS_InitData->pTuner_IfagcErr_LoRef;
611*53ee8cc1Swenshuai.xi     AgcSsi_Para.u16Tuner_IfagcErr_LoRef_Size=pDMD_DVBS_InitData->u16Tuner_IfagcErr_LoRef_Size;
612*53ee8cc1Swenshuai.xi     AgcSsi_Para.pTuner_IfagcSsi_HiRef=pDMD_DVBS_InitData->pTuner_IfagcSsi_HiRef;
613*53ee8cc1Swenshuai.xi     AgcSsi_Para.u16Tuner_IfagcErr_HiRef_Size=pDMD_DVBS_InitData->u16Tuner_IfagcErr_HiRef_Size;
614*53ee8cc1Swenshuai.xi 
615*53ee8cc1Swenshuai.xi     Drv_DVBS_Init_PARAM.u32InitDataLen=sizeof(Init_Para_Temp);
616*53ee8cc1Swenshuai.xi     Drv_DVBS_Init_PARAM.pDMD_DVBS_InitData=&Init_Para_Temp;
617*53ee8cc1Swenshuai.xi     Drv_DVBS_Init_PARAM.ret=false;
618*53ee8cc1Swenshuai.xi 
619*53ee8cc1Swenshuai.xi      if(u8DVBSUtopiaOpen == 0)  // First time open
620*53ee8cc1Swenshuai.xi     {
621*53ee8cc1Swenshuai.xi         if(UtopiaOpen(MODULE_DVBS/*|KERNEL_MODE*/ , &ppDVBSInstant, 0, pAttribte) == UTOPIA_STATUS_SUCCESS)  //kernel space
622*53ee8cc1Swenshuai.xi         //if(UtopiaOpen(MODULE_DVBS , &ppDVBSInstant, 0, pAttribte) == UTOPIA_STATUS_SUCCESS)  //user space
623*53ee8cc1Swenshuai.xi         {
624*53ee8cc1Swenshuai.xi             u32DVBSopen = 1;
625*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","Leo check DVBS utopia open sucessful!!\n");
626*53ee8cc1Swenshuai.xi       //return_val=true;
627*53ee8cc1Swenshuai.xi            // ULOGD("DEMOD","\r\n ======== DVBS Open Successful %x =========", (WORD)u32DVBSopen);
628*53ee8cc1Swenshuai.xi         }
629*53ee8cc1Swenshuai.xi         else
630*53ee8cc1Swenshuai.xi         {
631*53ee8cc1Swenshuai.xi           //  ULOGD("DEMOD","\r\n ======== DVBS Open Fail %x =========", (WORD)u32DVBSopen);
632*53ee8cc1Swenshuai.xi        //return_val=false;
633*53ee8cc1Swenshuai.xi           ULOGD("DEMOD","DVBS utopia open fail!!\n");
634*53ee8cc1Swenshuai.xi           return false;
635*53ee8cc1Swenshuai.xi         }
636*53ee8cc1Swenshuai.xi 
637*53ee8cc1Swenshuai.xi         u8DVBSUtopiaOpen = 1;
638*53ee8cc1Swenshuai.xi     }
639*53ee8cc1Swenshuai.xi 
640*53ee8cc1Swenshuai.xi     if(u32DVBSopen==1)
641*53ee8cc1Swenshuai.xi         UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_Init,&Drv_DVBS_Init_PARAM);
642*53ee8cc1Swenshuai.xi     else
643*53ee8cc1Swenshuai.xi         return false;
644*53ee8cc1Swenshuai.xi 
645*53ee8cc1Swenshuai.xi     return Drv_DVBS_Init_PARAM.ret;
646*53ee8cc1Swenshuai.xi }
647*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_Exit(void)648*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_Exit(void)
649*53ee8cc1Swenshuai.xi {
650*53ee8cc1Swenshuai.xi     DVBS_EXIT_PARAM_PARAM Drv_DVBS_EXIT_PARAM_PARAM;
651*53ee8cc1Swenshuai.xi     Drv_DVBS_EXIT_PARAM_PARAM.ret=false;
652*53ee8cc1Swenshuai.xi     DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_Exit\n"));
653*53ee8cc1Swenshuai.xi 
654*53ee8cc1Swenshuai.xi        if(u32DVBSopen==1)
655*53ee8cc1Swenshuai.xi         UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_Exit,&Drv_DVBS_EXIT_PARAM_PARAM);
656*53ee8cc1Swenshuai.xi       else
657*53ee8cc1Swenshuai.xi         return false;
658*53ee8cc1Swenshuai.xi 
659*53ee8cc1Swenshuai.xi     return Drv_DVBS_EXIT_PARAM_PARAM.ret;
660*53ee8cc1Swenshuai.xi }
661*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_SetDbgLevel(DMD_DVBS_DbgLv u8DbgLevel)662*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_SetDbgLevel(DMD_DVBS_DbgLv u8DbgLevel)
663*53ee8cc1Swenshuai.xi {
664*53ee8cc1Swenshuai.xi     DVBS_SetDbgLevel_PARAM Drv_DVBS_SetDbgLevel_PARAM;
665*53ee8cc1Swenshuai.xi     Drv_DVBS_SetDbgLevel_PARAM.u8DbgLevel=u8DbgLevel;
666*53ee8cc1Swenshuai.xi     Drv_DVBS_SetDbgLevel_PARAM.ret=false;
667*53ee8cc1Swenshuai.xi 
668*53ee8cc1Swenshuai.xi     DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_SetDbgLevel\n"));
669*53ee8cc1Swenshuai.xi     if(u32DVBSopen==1)
670*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_SetDbgLevel,&Drv_DVBS_SetDbgLevel_PARAM);
671*53ee8cc1Swenshuai.xi     else
672*53ee8cc1Swenshuai.xi       return false;
673*53ee8cc1Swenshuai.xi 
674*53ee8cc1Swenshuai.xi     return Drv_DVBS_SetDbgLevel_PARAM.ret;
675*53ee8cc1Swenshuai.xi }
676*53ee8cc1Swenshuai.xi 
677*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
MDrv_DMD_DVBS_GetInfo(void)678*53ee8cc1Swenshuai.xi const DMD_DVBS_Info* MDrv_DMD_DVBS_GetInfo(void)
679*53ee8cc1Swenshuai.xi {
680*53ee8cc1Swenshuai.xi   DVBS_GetInfo_PARAM Drv_DVBS_GetInfo_PARAM;
681*53ee8cc1Swenshuai.xi   Drv_DVBS_GetInfo_PARAM.ret_info=NULL;
682*53ee8cc1Swenshuai.xi 
683*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
684*53ee8cc1Swenshuai.xi   {
685*53ee8cc1Swenshuai.xi     UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetInfo,&Drv_DVBS_GetInfo_PARAM);
686*53ee8cc1Swenshuai.xi   }
687*53ee8cc1Swenshuai.xi   else
688*53ee8cc1Swenshuai.xi   {
689*53ee8cc1Swenshuai.xi     return false;
690*53ee8cc1Swenshuai.xi   }
691*53ee8cc1Swenshuai.xi 
692*53ee8cc1Swenshuai.xi 
693*53ee8cc1Swenshuai.xi   return Drv_DVBS_GetInfo_PARAM.ret_info;
694*53ee8cc1Swenshuai.xi 
695*53ee8cc1Swenshuai.xi }
696*53ee8cc1Swenshuai.xi #endif
697*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_GetLibVer(const MSIF_Version ** ppVersion)698*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetLibVer(const MSIF_Version **ppVersion)
699*53ee8cc1Swenshuai.xi {
700*53ee8cc1Swenshuai.xi    DVBS_GetLibVer_PARAM Drv_DVBS_GetLibVer_PARAM;
701*53ee8cc1Swenshuai.xi    Drv_DVBS_GetLibVer_PARAM.ppVersion=ppVersion;
702*53ee8cc1Swenshuai.xi     Drv_DVBS_GetLibVer_PARAM.ret= false;
703*53ee8cc1Swenshuai.xi 
704*53ee8cc1Swenshuai.xi 
705*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
706*53ee8cc1Swenshuai.xi    {
707*53ee8cc1Swenshuai.xi        UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetLibVer,&Drv_DVBS_GetLibVer_PARAM);
708*53ee8cc1Swenshuai.xi 	    Drv_DVBS_GetLibVer_PARAM.ret= true;
709*53ee8cc1Swenshuai.xi    }
710*53ee8cc1Swenshuai.xi    else
711*53ee8cc1Swenshuai.xi    {
712*53ee8cc1Swenshuai.xi        return false;
713*53ee8cc1Swenshuai.xi    }
714*53ee8cc1Swenshuai.xi 
715*53ee8cc1Swenshuai.xi    return Drv_DVBS_GetLibVer_PARAM.ret;
716*53ee8cc1Swenshuai.xi }
717*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_GetFWVer(MS_U16 * ver)718*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetFWVer(MS_U16 *ver)
719*53ee8cc1Swenshuai.xi {
720*53ee8cc1Swenshuai.xi   DVBS_GetFWVer_PARAM Drv_DVBS_GetFWVer_PARAM;
721*53ee8cc1Swenshuai.xi   Drv_DVBS_GetFWVer_PARAM.ver=ver;
722*53ee8cc1Swenshuai.xi   Drv_DVBS_GetFWVer_PARAM.ret=false;
723*53ee8cc1Swenshuai.xi 
724*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
725*53ee8cc1Swenshuai.xi     UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetFWVer,&Drv_DVBS_GetFWVer_PARAM);
726*53ee8cc1Swenshuai.xi   else
727*53ee8cc1Swenshuai.xi   {
728*53ee8cc1Swenshuai.xi     return false;
729*53ee8cc1Swenshuai.xi   }
730*53ee8cc1Swenshuai.xi 
731*53ee8cc1Swenshuai.xi        return Drv_DVBS_GetFWVer_PARAM.ret;
732*53ee8cc1Swenshuai.xi 
733*53ee8cc1Swenshuai.xi }
734*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_GetDSPReg(MS_U16 u16Addr,MS_U8 * pu8Data)735*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetDSPReg(MS_U16 u16Addr, MS_U8 *pu8Data)
736*53ee8cc1Swenshuai.xi {
737*53ee8cc1Swenshuai.xi #if defined(CHIP_K1)
738*53ee8cc1Swenshuai.xi   DVBS_GetDSPReg_PARAM Drv_DVBS_GetDSPReg_PARAM;
739*53ee8cc1Swenshuai.xi   Drv_DVBS_GetDSPReg_PARAM.u16Addr=u16Addr;
740*53ee8cc1Swenshuai.xi   Drv_DVBS_GetDSPReg_PARAM.pu8Data=pu8Data;
741*53ee8cc1Swenshuai.xi 
742*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
743*53ee8cc1Swenshuai.xi     UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetDSPReg,&Drv_DVBS_GetDSPReg_PARAM);
744*53ee8cc1Swenshuai.xi   else
745*53ee8cc1Swenshuai.xi   {
746*53ee8cc1Swenshuai.xi     return false;
747*53ee8cc1Swenshuai.xi   }
748*53ee8cc1Swenshuai.xi 
749*53ee8cc1Swenshuai.xi   return Drv_DVBS_GetDSPReg_PARAM.ret;
750*53ee8cc1Swenshuai.xi #else
751*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","Not Support function: MDrv_DMD_DVBS_GetDSPReg\n");
752*53ee8cc1Swenshuai.xi   return FALSE;
753*53ee8cc1Swenshuai.xi #endif
754*53ee8cc1Swenshuai.xi }
755*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_SetDSPReg(MS_U16 u16Addr,MS_U8 pu8Data)756*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_SetDSPReg(MS_U16 u16Addr, MS_U8 pu8Data)
757*53ee8cc1Swenshuai.xi {
758*53ee8cc1Swenshuai.xi #if defined(CHIP_K1)
759*53ee8cc1Swenshuai.xi   DVBS_SetDSPReg_PARAM Drv_DVBS_SetDSPReg_PARAM;
760*53ee8cc1Swenshuai.xi 
761*53ee8cc1Swenshuai.xi   Drv_DVBS_SetDSPReg_PARAM.pu8Data=pu8Data;
762*53ee8cc1Swenshuai.xi   Drv_DVBS_SetDSPReg_PARAM.u16Addr=u16Addr;
763*53ee8cc1Swenshuai.xi 
764*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
765*53ee8cc1Swenshuai.xi   {
766*53ee8cc1Swenshuai.xi     UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_SetDSPReg,&Drv_DVBS_SetDSPReg_PARAM);
767*53ee8cc1Swenshuai.xi   }
768*53ee8cc1Swenshuai.xi   else
769*53ee8cc1Swenshuai.xi   {
770*53ee8cc1Swenshuai.xi     return false;
771*53ee8cc1Swenshuai.xi   }
772*53ee8cc1Swenshuai.xi 
773*53ee8cc1Swenshuai.xi     return Drv_DVBS_SetDSPReg_PARAM.ret;
774*53ee8cc1Swenshuai.xi #else
775*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","Not Support function: MDrv_DMD_DVBS_SetDSPReg\n");
776*53ee8cc1Swenshuai.xi   return FALSE;
777*53ee8cc1Swenshuai.xi #endif
778*53ee8cc1Swenshuai.xi }
779*53ee8cc1Swenshuai.xi 
780*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_GetReg(MS_U16 u16Addr,MS_U8 * pu8Data)781*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetReg(MS_U16 u16Addr, MS_U8 *pu8Data)
782*53ee8cc1Swenshuai.xi {
783*53ee8cc1Swenshuai.xi   DVBS_GetReg_PARAM Drv_DVBS_GetReg_PARAM;
784*53ee8cc1Swenshuai.xi   Drv_DVBS_GetReg_PARAM.u16Addr=u16Addr;
785*53ee8cc1Swenshuai.xi   Drv_DVBS_GetReg_PARAM.pu8Data=pu8Data;
786*53ee8cc1Swenshuai.xi   Drv_DVBS_GetReg_PARAM.ret=false;
787*53ee8cc1Swenshuai.xi 
788*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
789*53ee8cc1Swenshuai.xi     {
790*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetReg,&Drv_DVBS_GetReg_PARAM);
791*53ee8cc1Swenshuai.xi    }
792*53ee8cc1Swenshuai.xi     else
793*53ee8cc1Swenshuai.xi     {
794*53ee8cc1Swenshuai.xi       return false;
795*53ee8cc1Swenshuai.xi     }
796*53ee8cc1Swenshuai.xi 
797*53ee8cc1Swenshuai.xi     return Drv_DVBS_GetReg_PARAM.ret;
798*53ee8cc1Swenshuai.xi 
799*53ee8cc1Swenshuai.xi }
800*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_SetReg(MS_U16 u16Addr,MS_U8 u8Data)801*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_SetReg(MS_U16 u16Addr, MS_U8 u8Data)
802*53ee8cc1Swenshuai.xi {
803*53ee8cc1Swenshuai.xi   DVBS_SetReg_PARAM Drv_DVBS_SetReg_PARAM;
804*53ee8cc1Swenshuai.xi   Drv_DVBS_SetReg_PARAM.u16Addr=u16Addr;
805*53ee8cc1Swenshuai.xi   Drv_DVBS_SetReg_PARAM.u8Data=u8Data;
806*53ee8cc1Swenshuai.xi   Drv_DVBS_SetReg_PARAM.ret=false;
807*53ee8cc1Swenshuai.xi 
808*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
809*53ee8cc1Swenshuai.xi     {
810*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_SetReg,&Drv_DVBS_SetReg_PARAM);
811*53ee8cc1Swenshuai.xi    }
812*53ee8cc1Swenshuai.xi     else
813*53ee8cc1Swenshuai.xi     {
814*53ee8cc1Swenshuai.xi       return false;
815*53ee8cc1Swenshuai.xi     }
816*53ee8cc1Swenshuai.xi 
817*53ee8cc1Swenshuai.xi     return Drv_DVBS_SetReg_PARAM.ret;
818*53ee8cc1Swenshuai.xi }
819*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_SetSerialControl(MS_BOOL bEnable)820*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_SetSerialControl(MS_BOOL bEnable)
821*53ee8cc1Swenshuai.xi {
822*53ee8cc1Swenshuai.xi       DVBS_SetSerialControl_PARAM Drv_DVBS_SetSerialControl_PARAM;
823*53ee8cc1Swenshuai.xi       Drv_DVBS_SetSerialControl_PARAM.bEnable=bEnable;
824*53ee8cc1Swenshuai.xi   Drv_DVBS_SetSerialControl_PARAM.ret=false;
825*53ee8cc1Swenshuai.xi 
826*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
827*53ee8cc1Swenshuai.xi     {
828*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_SetSerialControl,&Drv_DVBS_SetSerialControl_PARAM);
829*53ee8cc1Swenshuai.xi    }
830*53ee8cc1Swenshuai.xi     else
831*53ee8cc1Swenshuai.xi     {
832*53ee8cc1Swenshuai.xi       return false;
833*53ee8cc1Swenshuai.xi     }
834*53ee8cc1Swenshuai.xi 
835*53ee8cc1Swenshuai.xi 
836*53ee8cc1Swenshuai.xi     return Drv_DVBS_SetSerialControl_PARAM.ret;
837*53ee8cc1Swenshuai.xi }
838*53ee8cc1Swenshuai.xi 
839*53ee8cc1Swenshuai.xi #ifdef UFO_DEMOD_BLINDSCAN_NEW_FLOW
840*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
MDrv_DMD_DVBS_BlindScan_Config(MS_U32 u32SymbolRate,DMD_DVBS_MODULATION_TYPE eQamMode,MS_U32 u32IFFreq,MS_BOOL bSpecInv,MS_BOOL bSerialTS)841*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_BlindScan_Config(MS_U32 u32SymbolRate, DMD_DVBS_MODULATION_TYPE eQamMode, MS_U32 u32IFFreq, MS_BOOL bSpecInv, MS_BOOL bSerialTS)
842*53ee8cc1Swenshuai.xi {
843*53ee8cc1Swenshuai.xi     return MDrv_DMD_DVBS_BlindScan_Config_symbol_rate_list(u32SymbolRate, eQamMode, u32IFFreq, bSpecInv, bSerialTS, NULL, 0);
844*53ee8cc1Swenshuai.xi }
845*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_BlindScan_Config_symbol_rate_list(MS_U32 u32SymbolRate,DMD_DVBS_MODULATION_TYPE eQamMode,MS_U32 u32IFFreq,MS_BOOL bSpecInv,MS_BOOL bSerialTS,MS_U16 * pu16_symbol_rate_list,MS_U8 u8_symbol_rate_list_num)846*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_BlindScan_Config_symbol_rate_list(MS_U32 u32SymbolRate, DMD_DVBS_MODULATION_TYPE eQamMode, MS_U32 u32IFFreq, MS_BOOL bSpecInv, MS_BOOL bSerialTS, MS_U16 *pu16_symbol_rate_list,MS_U8 u8_symbol_rate_list_num)
847*53ee8cc1Swenshuai.xi {
848*53ee8cc1Swenshuai.xi   MS_U32   u32CurrentSR;
849*53ee8cc1Swenshuai.xi   #ifdef MS_DEBUG
850*53ee8cc1Swenshuai.xi   ULOGD("DEMOD","check driver layer DVBS BlindScan_Config_symbol_rate_list!!\n");
851*53ee8cc1Swenshuai.xi   #endif
852*53ee8cc1Swenshuai.xi 
853*53ee8cc1Swenshuai.xi   DVBS_BlindScan_Config_Symbol_rate_list_PARAM Drv_DVBS_BlindScan_Config_Symbol_rate_list_PARAM;
854*53ee8cc1Swenshuai.xi   Drv_DVBS_BlindScan_Config_Symbol_rate_list_PARAM.u32SymbolRate=u32SymbolRate;
855*53ee8cc1Swenshuai.xi   Drv_DVBS_BlindScan_Config_Symbol_rate_list_PARAM.eQamMode=eQamMode;
856*53ee8cc1Swenshuai.xi   Drv_DVBS_BlindScan_Config_Symbol_rate_list_PARAM.u32IFFreq=u32IFFreq;
857*53ee8cc1Swenshuai.xi   Drv_DVBS_BlindScan_Config_Symbol_rate_list_PARAM.bSpecInv=bSpecInv;
858*53ee8cc1Swenshuai.xi   Drv_DVBS_BlindScan_Config_Symbol_rate_list_PARAM.bSerialTS=bSerialTS;
859*53ee8cc1Swenshuai.xi   Drv_DVBS_BlindScan_Config_Symbol_rate_list_PARAM.pu16_symbol_rate_list=pu16_symbol_rate_list;
860*53ee8cc1Swenshuai.xi   Drv_DVBS_BlindScan_Config_Symbol_rate_list_PARAM.u8_symbol_rate_list_num=u8_symbol_rate_list_num;
861*53ee8cc1Swenshuai.xi   Drv_DVBS_BlindScan_Config_Symbol_rate_list_PARAM.ret=false;
862*53ee8cc1Swenshuai.xi 
863*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
864*53ee8cc1Swenshuai.xi   {
865*53ee8cc1Swenshuai.xi     UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_BlindScan_Config_symbol_rate_list,&Drv_DVBS_BlindScan_Config_Symbol_rate_list_PARAM);
866*53ee8cc1Swenshuai.xi     g_dvbs_lock = 0;
867*53ee8cc1Swenshuai.xi     u8DemodLockFlag=0;
868*53ee8cc1Swenshuai.xi     u32CurrentSR = u32SymbolRate/1000;  //KHz
869*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_Config_Symbol_rate_list_PARAM.ret &= MDrv_SYS_DMD_VD_MBX_WriteDSPReg(E_DMD_S2_MANUAL_TUNE_SYMBOLRATE_L, u32CurrentSR&0xff);
870*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_Config_Symbol_rate_list_PARAM.ret &= MDrv_SYS_DMD_VD_MBX_WriteDSPReg(E_DMD_S2_MANUAL_TUNE_SYMBOLRATE_H, (u32CurrentSR>>8)&0xff);
871*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_Config_Symbol_rate_list_PARAM.ret &= MDrv_SYS_DMD_VD_MBX_WriteDSPReg(E_DMD_S2_MB_DMDTOP_DBG_5, (u32CurrentSR>>16)&0xff);
872*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","drv_DMD_DVBS_BlindScan_Config u32SymbolRate = %d \n", u32CurrentSR);
873*53ee8cc1Swenshuai.xi   }
874*53ee8cc1Swenshuai.xi   else
875*53ee8cc1Swenshuai.xi   {
876*53ee8cc1Swenshuai.xi     return false;
877*53ee8cc1Swenshuai.xi   }
878*53ee8cc1Swenshuai.xi 
879*53ee8cc1Swenshuai.xi   return Drv_DVBS_BlindScan_Config_Symbol_rate_list_PARAM.ret;
880*53ee8cc1Swenshuai.xi }
881*53ee8cc1Swenshuai.xi #endif
882*53ee8cc1Swenshuai.xi #endif
883*53ee8cc1Swenshuai.xi 
884*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
MDrv_DMD_DVBS_SetConfig(MS_U32 u32SymbolRate,DMD_DVBS_MODULATION_TYPE eQamMode,MS_U32 u32IFFreq,MS_BOOL bSpecInv,MS_BOOL bSerialTS)885*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_SetConfig(MS_U32 u32SymbolRate, DMD_DVBS_MODULATION_TYPE eQamMode, MS_U32 u32IFFreq, MS_BOOL bSpecInv, MS_BOOL bSerialTS)
886*53ee8cc1Swenshuai.xi {
887*53ee8cc1Swenshuai.xi   #ifdef MS_DEBUG
888*53ee8cc1Swenshuai.xi   ULOGD("DEMOD","check driver layer DVBS SetConfig!!\n");
889*53ee8cc1Swenshuai.xi   #endif
890*53ee8cc1Swenshuai.xi 
891*53ee8cc1Swenshuai.xi    return MDrv_DMD_DVBS_SetConfig_symbol_rate_list(u32SymbolRate, eQamMode, u32IFFreq, bSpecInv, bSerialTS, NULL, 0);
892*53ee8cc1Swenshuai.xi }
893*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_SetConfig_symbol_rate_list(MS_U32 u32SymbolRate,DMD_DVBS_MODULATION_TYPE eQamMode,MS_U32 u32IFFreq,MS_BOOL bSpecInv,MS_BOOL bSerialTS,MS_U16 * pu16_symbol_rate_list,MS_U8 u8_symbol_rate_list_num)894*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_SetConfig_symbol_rate_list(MS_U32 u32SymbolRate, DMD_DVBS_MODULATION_TYPE eQamMode, MS_U32 u32IFFreq, MS_BOOL bSpecInv, MS_BOOL bSerialTS, MS_U16 *pu16_symbol_rate_list,MS_U8 u8_symbol_rate_list_num)
895*53ee8cc1Swenshuai.xi {
896*53ee8cc1Swenshuai.xi   MS_U32   u32CurrentSR;
897*53ee8cc1Swenshuai.xi   #ifdef MS_DEBUG
898*53ee8cc1Swenshuai.xi   ULOGD("DEMOD","check driver layer DVBS SetConfig_symbol_rate_list!!\n");
899*53ee8cc1Swenshuai.xi   #endif
900*53ee8cc1Swenshuai.xi 
901*53ee8cc1Swenshuai.xi   DVBS_SetConfig_Symbol_rate_list_PARAM Drv_DVBS_SetConfig_Symbol_rate_list_PARAM;
902*53ee8cc1Swenshuai.xi   Drv_DVBS_SetConfig_Symbol_rate_list_PARAM.u16SymbolRate=u32SymbolRate;
903*53ee8cc1Swenshuai.xi   Drv_DVBS_SetConfig_Symbol_rate_list_PARAM.eQamMode=eQamMode;
904*53ee8cc1Swenshuai.xi   Drv_DVBS_SetConfig_Symbol_rate_list_PARAM.u32IFFreq=u32IFFreq;
905*53ee8cc1Swenshuai.xi   Drv_DVBS_SetConfig_Symbol_rate_list_PARAM.bSpecInv=bSpecInv;
906*53ee8cc1Swenshuai.xi   Drv_DVBS_SetConfig_Symbol_rate_list_PARAM.bSerialTS=bSerialTS;
907*53ee8cc1Swenshuai.xi   Drv_DVBS_SetConfig_Symbol_rate_list_PARAM.pu16_symbol_rate_list=pu16_symbol_rate_list;
908*53ee8cc1Swenshuai.xi   Drv_DVBS_SetConfig_Symbol_rate_list_PARAM.u8_symbol_rate_list_num=u8_symbol_rate_list_num;
909*53ee8cc1Swenshuai.xi   Drv_DVBS_SetConfig_Symbol_rate_list_PARAM.ret=false;
910*53ee8cc1Swenshuai.xi 
911*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
912*53ee8cc1Swenshuai.xi   {
913*53ee8cc1Swenshuai.xi     UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_SetConfig_symbol_rate_list,&Drv_DVBS_SetConfig_Symbol_rate_list_PARAM);
914*53ee8cc1Swenshuai.xi     g_dvbs_lock = 0;
915*53ee8cc1Swenshuai.xi     u8DemodLockFlag=0;
916*53ee8cc1Swenshuai.xi     u32CurrentSR = u32SymbolRate/1000;  //KHz
917*53ee8cc1Swenshuai.xi     Drv_DVBS_SetConfig_Symbol_rate_list_PARAM.ret &= MDrv_SYS_DMD_VD_MBX_WriteDSPReg(E_DMD_S2_MANUAL_TUNE_SYMBOLRATE_L, u32CurrentSR&0xff);
918*53ee8cc1Swenshuai.xi     Drv_DVBS_SetConfig_Symbol_rate_list_PARAM.ret &= MDrv_SYS_DMD_VD_MBX_WriteDSPReg(E_DMD_S2_MANUAL_TUNE_SYMBOLRATE_H, (u32CurrentSR>>8)&0xff);
919*53ee8cc1Swenshuai.xi     Drv_DVBS_SetConfig_Symbol_rate_list_PARAM.ret &= MDrv_SYS_DMD_VD_MBX_WriteDSPReg(E_DMD_S2_MB_DMDTOP_DBG_5, (u32CurrentSR>>16)&0xff);
920*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","drv_DMD_DVBS_SetConfig u32SymbolRate = %d \n", (int)u32CurrentSR);
921*53ee8cc1Swenshuai.xi   }
922*53ee8cc1Swenshuai.xi   else
923*53ee8cc1Swenshuai.xi   {
924*53ee8cc1Swenshuai.xi     return false;
925*53ee8cc1Swenshuai.xi   }
926*53ee8cc1Swenshuai.xi 
927*53ee8cc1Swenshuai.xi   return Drv_DVBS_SetConfig_Symbol_rate_list_PARAM.ret;
928*53ee8cc1Swenshuai.xi }
929*53ee8cc1Swenshuai.xi #endif
MDrv_DMD_DVBS_SetActive(MS_BOOL bEnable)930*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_SetActive(MS_BOOL bEnable)
931*53ee8cc1Swenshuai.xi {
932*53ee8cc1Swenshuai.xi   DVBS_SetActive_PARAM Drv_DVBS_SetActive_PARAM;
933*53ee8cc1Swenshuai.xi   Drv_DVBS_SetActive_PARAM.bEnable=bEnable;
934*53ee8cc1Swenshuai.xi   Drv_DVBS_SetActive_PARAM.ret=false;
935*53ee8cc1Swenshuai.xi     DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_SetActive\n"));
936*53ee8cc1Swenshuai.xi 
937*53ee8cc1Swenshuai.xi   #ifdef MS_DEBUG
938*53ee8cc1Swenshuai.xi   ULOGD("DEMOD","check driver layer DVBS SetActive!!\n");
939*53ee8cc1Swenshuai.xi   #endif
940*53ee8cc1Swenshuai.xi 
941*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
942*53ee8cc1Swenshuai.xi   {
943*53ee8cc1Swenshuai.xi     UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_SetActive,&Drv_DVBS_SetActive_PARAM);
944*53ee8cc1Swenshuai.xi   }
945*53ee8cc1Swenshuai.xi   else
946*53ee8cc1Swenshuai.xi   {
947*53ee8cc1Swenshuai.xi     return false;
948*53ee8cc1Swenshuai.xi   }
949*53ee8cc1Swenshuai.xi 
950*53ee8cc1Swenshuai.xi   return Drv_DVBS_SetActive_PARAM.ret;
951*53ee8cc1Swenshuai.xi }
952*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
MDrv_DMD_DVBS_GetLock(DMD_DVBS_GETLOCK_TYPE eType,DMD_DVBS_LOCK_STATUS * eLockStatus)953*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetLock(DMD_DVBS_GETLOCK_TYPE eType, DMD_DVBS_LOCK_STATUS *eLockStatus)
954*53ee8cc1Swenshuai.xi {
955*53ee8cc1Swenshuai.xi     return MDrv_DMD_DVBS_GetLockWithRFPower(eType, eLockStatus, 200.0f, -200.0f);
956*53ee8cc1Swenshuai.xi }
957*53ee8cc1Swenshuai.xi #endif
958*53ee8cc1Swenshuai.xi 
959*53ee8cc1Swenshuai.xi #ifdef UFO_DEMOD_GetParam_NEW_FLOW
MDrv_DMD_DVBS_GetParam(HAL_DEMOD_MS_SAT_CARRIER_PARAM * pParam)960*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetParam(HAL_DEMOD_MS_SAT_CARRIER_PARAM *pParam)
961*53ee8cc1Swenshuai.xi {
962*53ee8cc1Swenshuai.xi     DVBS_GET_INFO Drv_DVBS_GET_INFO;
963*53ee8cc1Swenshuai.xi 
964*53ee8cc1Swenshuai.xi     Drv_DVBS_GET_INFO.ret = FALSE;
965*53ee8cc1Swenshuai.xi 
966*53ee8cc1Swenshuai.xi     if(u32DVBSopen==1)
967*53ee8cc1Swenshuai.xi     {
968*53ee8cc1Swenshuai.xi         UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetParam, &Drv_DVBS_GET_INFO);
969*53ee8cc1Swenshuai.xi     }
970*53ee8cc1Swenshuai.xi 
971*53ee8cc1Swenshuai.xi     pParam->eCodeRate = Drv_DVBS_GET_INFO.eCodeRate;
972*53ee8cc1Swenshuai.xi     pParam->eRollOff = Drv_DVBS_GET_INFO.eRollOff;
973*53ee8cc1Swenshuai.xi     pParam->eConstellation = Drv_DVBS_GET_INFO.eConstellation;
974*53ee8cc1Swenshuai.xi     pParam->eDemodType = Drv_DVBS_GET_INFO.eDemodType;
975*53ee8cc1Swenshuai.xi     pParam->eFreqoff = Drv_DVBS_GET_INFO.eFreqoff;
976*53ee8cc1Swenshuai.xi     pParam->eIQ_Mode = Drv_DVBS_GET_INFO.eIQ_Mode;
977*53ee8cc1Swenshuai.xi 
978*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
979*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","Code rate :%d\n",pParam->eCodeRate);
980*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","Roll-off Factor :%d\n",pParam->eRollOff);
981*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","Modulation mode :%d\n",pParam->eConstellation);
982*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","Demod type :%d\n",pParam->eDemodType);
983*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","CFO :%f\n",pParam->eFreqoff);
984*53ee8cc1Swenshuai.xi #endif
985*53ee8cc1Swenshuai.xi 
986*53ee8cc1Swenshuai.xi     return Drv_DVBS_GET_INFO.ret;
987*53ee8cc1Swenshuai.xi }
988*53ee8cc1Swenshuai.xi #endif
989*53ee8cc1Swenshuai.xi 
990*53ee8cc1Swenshuai.xi #ifdef UFO_DEMOD_GET_AGC_INFO
MDrv_DMD_DVBS_GetAGCInfo(MS_U8 u8dbg_mode,MS_U16 * pu16Data)991*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetAGCInfo(MS_U8 u8dbg_mode, MS_U16 *pu16Data)
992*53ee8cc1Swenshuai.xi {
993*53ee8cc1Swenshuai.xi     DVBS_GET_AGC_INFO Drv_DVBS_GET_AGC_INFO;
994*53ee8cc1Swenshuai.xi 
995*53ee8cc1Swenshuai.xi     Drv_DVBS_GET_AGC_INFO.u8dbg_mode = u8dbg_mode;
996*53ee8cc1Swenshuai.xi     Drv_DVBS_GET_AGC_INFO.pu16Data = pu16Data;
997*53ee8cc1Swenshuai.xi     Drv_DVBS_GET_AGC_INFO.ret = false;
998*53ee8cc1Swenshuai.xi 
999*53ee8cc1Swenshuai.xi     if(u32DVBSopen==1)
1000*53ee8cc1Swenshuai.xi     {
1001*53ee8cc1Swenshuai.xi         UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetAGCInfo, &Drv_DVBS_GET_AGC_INFO);
1002*53ee8cc1Swenshuai.xi     }
1003*53ee8cc1Swenshuai.xi 
1004*53ee8cc1Swenshuai.xi     return Drv_DVBS_GET_AGC_INFO.ret;
1005*53ee8cc1Swenshuai.xi }
1006*53ee8cc1Swenshuai.xi #endif
1007*53ee8cc1Swenshuai.xi 
1008*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
MDrv_DMD_DVBS_GetLockWithRFPower(DMD_DVBS_GETLOCK_TYPE eType,DMD_DVBS_LOCK_STATUS * eLockStatus,float fCurrRFPowerDbm,float fNoChannelRFPowerDbm)1009*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetLockWithRFPower(DMD_DVBS_GETLOCK_TYPE eType, DMD_DVBS_LOCK_STATUS *eLockStatus, float fCurrRFPowerDbm, float fNoChannelRFPowerDbm)
1010*53ee8cc1Swenshuai.xi {
1011*53ee8cc1Swenshuai.xi   MS_BOOL status = true;
1012*53ee8cc1Swenshuai.xi 
1013*53ee8cc1Swenshuai.xi   DMD_IFAGC_SSI   *ifagc_ssi;
1014*53ee8cc1Swenshuai.xi   DMD_IFAGC_ERR   *ifagc_err;
1015*53ee8cc1Swenshuai.xi   float   ch_power_rf=0.0f;
1016*53ee8cc1Swenshuai.xi   float   ch_power_db=0.0f;
1017*53ee8cc1Swenshuai.xi   float   ch_power_if=0.0f, ch_power_ifa = 0.0f, ch_power_ifb =0.0f;
1018*53ee8cc1Swenshuai.xi   MS_U16  if_agc_val =0, if_agc_vala =0, if_agc_valb =0, if_agc_val_lsb =0, i;
1019*53ee8cc1Swenshuai.xi   float   ch_power_takeover=0.0f;
1020*53ee8cc1Swenshuai.xi   MS_U8   ssi_tbl_len = 0, err_tbl_len = 0;
1021*53ee8cc1Swenshuai.xi 
1022*53ee8cc1Swenshuai.xi   MS_U8 ifagc_reg;
1023*53ee8cc1Swenshuai.xi   MS_U8 ifagc_reg_lsb;
1024*53ee8cc1Swenshuai.xi   MS_U16 ifagc_err_reg;
1025*53ee8cc1Swenshuai.xi     MS_U32      u32SymbolRate=0;
1026*53ee8cc1Swenshuai.xi     //float       fSymbolRate;
1027*53ee8cc1Swenshuai.xi     //MS_U8 ISSY_EN = 0;
1028*53ee8cc1Swenshuai.xi     MS_U8 code_rate_idx = 0;
1029*53ee8cc1Swenshuai.xi     MS_U8 pilot_flag = 0;
1030*53ee8cc1Swenshuai.xi     MS_U8 fec_type_idx = 0;
1031*53ee8cc1Swenshuai.xi     MS_U16 k_bch_array[2][42] =
1032*53ee8cc1Swenshuai.xi     {
1033*53ee8cc1Swenshuai.xi         {
1034*53ee8cc1Swenshuai.xi             16008, 21408, 25728, 32208, 38688, 43040, 48408, 51648, 53840, 57472,
1035*53ee8cc1Swenshuai.xi             58192, 14208, 18528, 28968, 32208, 34368, 35448, 35808, 37248, 37248,
1036*53ee8cc1Swenshuai.xi             38688, 40128, 41208, 41568, 43008, 44448, 44808, 45888, 46608, 47328,
1037*53ee8cc1Swenshuai.xi             47328, 48408, 50208, 50208, 55248,     0,     0,     0,     0,     0,
1038*53ee8cc1Swenshuai.xi             0,     0,
1039*53ee8cc1Swenshuai.xi         },
1040*53ee8cc1Swenshuai.xi         {
1041*53ee8cc1Swenshuai.xi             3072,  5232,  6312,  7032,  9552, 10632, 11712, 12432, 13152, 14232,
1042*53ee8cc1Swenshuai.xi             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
1043*53ee8cc1Swenshuai.xi             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
1044*53ee8cc1Swenshuai.xi             0,     0,     0,     0,     0,  3792,  4152,  4872,  7392,  8472,
1045*53ee8cc1Swenshuai.xi             9192, 11352
1046*53ee8cc1Swenshuai.xi         }
1047*53ee8cc1Swenshuai.xi     };
1048*53ee8cc1Swenshuai.xi     MS_U16 n_ldpc_array[2] = {64800, 16200};
1049*53ee8cc1Swenshuai.xi 
1050*53ee8cc1Swenshuai.xi     MS_FLOAT pilot_term = 0;
1051*53ee8cc1Swenshuai.xi     MS_FLOAT k_bch;
1052*53ee8cc1Swenshuai.xi     MS_FLOAT n_ldpc;
1053*53ee8cc1Swenshuai.xi     MS_FLOAT ts_div_num_offset = 1.5;
1054*53ee8cc1Swenshuai.xi     MS_FLOAT ts_div_num_margin_ratio = 1.03;
1055*53ee8cc1Swenshuai.xi     MS_FLOAT ftmp;
1056*53ee8cc1Swenshuai.xi     //MS_U32 u32Time_start,u32Time_end;
1057*53ee8cc1Swenshuai.xi     MS_U32 u32temp=0;
1058*53ee8cc1Swenshuai.xi     //MS_FLOAT pkt_interval;
1059*53ee8cc1Swenshuai.xi     MS_U8 system_type_reg=0;
1060*53ee8cc1Swenshuai.xi     MS_U8 code_rate_reg=0;
1061*53ee8cc1Swenshuai.xi     MS_FLOAT fTSDivNum;
1062*53ee8cc1Swenshuai.xi     MS_U8 u8Data;
1063*53ee8cc1Swenshuai.xi 
1064*53ee8cc1Swenshuai.xi   DVBS_GetLockWithRFPower Drv_DVBS_GetLockWithRFPower;
1065*53ee8cc1Swenshuai.xi 
1066*53ee8cc1Swenshuai.xi   Drv_DVBS_GetLockWithRFPower.eType=eType;
1067*53ee8cc1Swenshuai.xi   Drv_DVBS_GetLockWithRFPower.eLockStatus=eLockStatus;
1068*53ee8cc1Swenshuai.xi   //Drv_DVBS_GetLockWithRFPower.u32CurrRFPowerDbm=(MS_U32)(fCurrRFPowerDbm*10);
1069*53ee8cc1Swenshuai.xi   //Drv_DVBS_GetLockWithRFPower.u32NoChannelRFPowerDbm=(MS_U32)(fNoChannelRFPowerDbm*10);
1070*53ee8cc1Swenshuai.xi   Drv_DVBS_GetLockWithRFPower.ret=false;
1071*53ee8cc1Swenshuai.xi 
1072*53ee8cc1Swenshuai.xi   DVBS_GetIFAGC_PARAM Drv_DVBS_GetIFAGC_PARAM;
1073*53ee8cc1Swenshuai.xi   Drv_DVBS_GetIFAGC_PARAM.ifagc_reg=&ifagc_reg;
1074*53ee8cc1Swenshuai.xi   Drv_DVBS_GetIFAGC_PARAM.ifagc_reg_lsb=&ifagc_reg_lsb;
1075*53ee8cc1Swenshuai.xi   Drv_DVBS_GetIFAGC_PARAM.ifagc_err_reg=&ifagc_err_reg;
1076*53ee8cc1Swenshuai.xi   Drv_DVBS_GetIFAGC_PARAM.ret=false;
1077*53ee8cc1Swenshuai.xi 
1078*53ee8cc1Swenshuai.xi   DVBS_GetTsDivNum_PARAM Drv_DVBS_GetTsDivNum_PARAM;
1079*53ee8cc1Swenshuai.xi   Drv_DVBS_GetTsDivNum_PARAM.u32SymbolRate=&u32SymbolRate;
1080*53ee8cc1Swenshuai.xi   Drv_DVBS_GetTsDivNum_PARAM.system_type_reg=&system_type_reg;
1081*53ee8cc1Swenshuai.xi   Drv_DVBS_GetTsDivNum_PARAM.code_rate_idx=&code_rate_idx;
1082*53ee8cc1Swenshuai.xi   Drv_DVBS_GetTsDivNum_PARAM.fec_type_idx=&fec_type_idx;
1083*53ee8cc1Swenshuai.xi   Drv_DVBS_GetTsDivNum_PARAM.pilot_flag=&pilot_flag;
1084*53ee8cc1Swenshuai.xi   Drv_DVBS_GetTsDivNum_PARAM.u32temp=&u32temp;
1085*53ee8cc1Swenshuai.xi   Drv_DVBS_GetTsDivNum_PARAM.code_rate_reg=&code_rate_reg;
1086*53ee8cc1Swenshuai.xi   Drv_DVBS_GetTsDivNum_PARAM.bRet=false;
1087*53ee8cc1Swenshuai.xi 
1088*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
1089*53ee8cc1Swenshuai.xi   {
1090*53ee8cc1Swenshuai.xi   	if((AgcSsi_Para.pTuner_IfagcSsi_HiRef != NULL) && (AgcSsi_Para.pTuner_IfagcSsi_LoRef != NULL))
1091*53ee8cc1Swenshuai.xi     {
1092*53ee8cc1Swenshuai.xi         UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetIFAGC,&Drv_DVBS_GetIFAGC_PARAM);
1093*53ee8cc1Swenshuai.xi         status &= Drv_DVBS_GetIFAGC_PARAM.ret;
1094*53ee8cc1Swenshuai.xi 
1095*53ee8cc1Swenshuai.xi         ch_power_rf = fCurrRFPowerDbm;
1096*53ee8cc1Swenshuai.xi         if_agc_val = ifagc_reg;
1097*53ee8cc1Swenshuai.xi         if_agc_val_lsb = ifagc_reg_lsb;
1098*53ee8cc1Swenshuai.xi 
1099*53ee8cc1Swenshuai.xi         ifagc_ssi = AgcSsi_Para.pTuner_IfagcSsi_LoRef;
1100*53ee8cc1Swenshuai.xi         ssi_tbl_len = AgcSsi_Para.u16Tuner_IfagcSsi_LoRef_Size;
1101*53ee8cc1Swenshuai.xi         ifagc_err = AgcSsi_Para.pTuner_IfagcErr_LoRef;
1102*53ee8cc1Swenshuai.xi         err_tbl_len = AgcSsi_Para.u16Tuner_IfagcErr_LoRef_Size;
1103*53ee8cc1Swenshuai.xi 
1104*53ee8cc1Swenshuai.xi         ch_power_if=ifagc_ssi[0].power_db;
1105*53ee8cc1Swenshuai.xi         if (if_agc_val >=ifagc_ssi[0].agc_val)
1106*53ee8cc1Swenshuai.xi         {
1107*53ee8cc1Swenshuai.xi                 for(i = 1; i < ssi_tbl_len; i++)
1108*53ee8cc1Swenshuai.xi                 {
1109*53ee8cc1Swenshuai.xi                     if (if_agc_val < ifagc_ssi[i].agc_val)
1110*53ee8cc1Swenshuai.xi                     {
1111*53ee8cc1Swenshuai.xi                         if_agc_valb = ifagc_ssi[i].agc_val;
1112*53ee8cc1Swenshuai.xi                         ch_power_ifb = ifagc_ssi[i].power_db;
1113*53ee8cc1Swenshuai.xi 
1114*53ee8cc1Swenshuai.xi                         i--;
1115*53ee8cc1Swenshuai.xi                         if_agc_vala = ifagc_ssi[i].agc_val;
1116*53ee8cc1Swenshuai.xi                         ch_power_ifa=ifagc_ssi[i].power_db;
1117*53ee8cc1Swenshuai.xi                         while ((i>1) && (if_agc_vala==ifagc_ssi[i-1].agc_val))
1118*53ee8cc1Swenshuai.xi                         {
1119*53ee8cc1Swenshuai.xi                             ch_power_ifa=ifagc_ssi[i-1].power_db;
1120*53ee8cc1Swenshuai.xi                             i--;
1121*53ee8cc1Swenshuai.xi                         }
1122*53ee8cc1Swenshuai.xi                         ch_power_if = ch_power_ifa+(ch_power_ifb-ch_power_ifa)*(float)((if_agc_val-if_agc_vala)*256+if_agc_val_lsb)/((if_agc_valb-if_agc_vala)*256);
1123*53ee8cc1Swenshuai.xi                         break;
1124*53ee8cc1Swenshuai.xi                     }
1125*53ee8cc1Swenshuai.xi                 }
1126*53ee8cc1Swenshuai.xi         }
1127*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
1128*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","if prev %f %x\n", ch_power_ifa, if_agc_vala);
1129*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","if next %f %x\n", ch_power_ifb, if_agc_valb);
1130*53ee8cc1Swenshuai.xi             #endif
1131*53ee8cc1Swenshuai.xi 
1132*53ee8cc1Swenshuai.xi 
1133*53ee8cc1Swenshuai.xi             for(i = 0; i < ssi_tbl_len; i++)
1134*53ee8cc1Swenshuai.xi             {
1135*53ee8cc1Swenshuai.xi                 if (ifagc_ssi[i].agc_val <= ifagc_ssi[i+1].agc_val)
1136*53ee8cc1Swenshuai.xi                 {
1137*53ee8cc1Swenshuai.xi                     ch_power_takeover = ifagc_ssi[i+1].power_db;
1138*53ee8cc1Swenshuai.xi                     break;
1139*53ee8cc1Swenshuai.xi                 }
1140*53ee8cc1Swenshuai.xi             }
1141*53ee8cc1Swenshuai.xi 
1142*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
1143*53ee8cc1Swenshuai.xi             //ULOGD("DEMOD","ch_power_rf = %f\n", ch_power_rf);
1144*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","ch_power_if = %f\n", ch_power_if);
1145*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","ch_power_takeover = %f\n", ch_power_takeover);
1146*53ee8cc1Swenshuai.xi             #endif
1147*53ee8cc1Swenshuai.xi 
1148*53ee8cc1Swenshuai.xi             // ch_power_db = (ch_power_rf > ch_power_if)? ch_power_rf : ch_power_if;
1149*53ee8cc1Swenshuai.xi 
1150*53ee8cc1Swenshuai.xi             if(ch_power_rf > (ch_power_takeover + 0.5))
1151*53ee8cc1Swenshuai.xi             {
1152*53ee8cc1Swenshuai.xi                 ch_power_db = ch_power_rf;
1153*53ee8cc1Swenshuai.xi             }
1154*53ee8cc1Swenshuai.xi             else if(ch_power_if < (ch_power_takeover - 0.5))
1155*53ee8cc1Swenshuai.xi             {
1156*53ee8cc1Swenshuai.xi                 ch_power_db = ch_power_if;
1157*53ee8cc1Swenshuai.xi             }
1158*53ee8cc1Swenshuai.xi             else
1159*53ee8cc1Swenshuai.xi             {
1160*53ee8cc1Swenshuai.xi                 ch_power_db = (ch_power_if + ch_power_rf)/2;
1161*53ee8cc1Swenshuai.xi             }
1162*53ee8cc1Swenshuai.xi 
1163*53ee8cc1Swenshuai.xi             // ch_power_db = (ch_power_rf > ch_power_if)? ch_power_if : ch_power_rf;
1164*53ee8cc1Swenshuai.xi 
1165*53ee8cc1Swenshuai.xi         if(if_agc_val == 0xff)
1166*53ee8cc1Swenshuai.xi         {
1167*53ee8cc1Swenshuai.xi             for(i = 0; i < err_tbl_len; i++)
1168*53ee8cc1Swenshuai.xi             {
1169*53ee8cc1Swenshuai.xi                     if ( ifagc_err_reg <= ifagc_err[i].agc_err )        // signed char comparison
1170*53ee8cc1Swenshuai.xi                     {
1171*53ee8cc1Swenshuai.xi                         ch_power_db += ifagc_err[i].attn_db;
1172*53ee8cc1Swenshuai.xi                         break;
1173*53ee8cc1Swenshuai.xi                     }
1174*53ee8cc1Swenshuai.xi             }
1175*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
1176*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","if_agc_err = 0x%x\n", ifagc_err_reg);
1177*53ee8cc1Swenshuai.xi             #endif
1178*53ee8cc1Swenshuai.xi         }
1179*53ee8cc1Swenshuai.xi     }
1180*53ee8cc1Swenshuai.xi     else
1181*53ee8cc1Swenshuai.xi     {
1182*53ee8cc1Swenshuai.xi     	  #ifdef MS_DEBUG
1183*53ee8cc1Swenshuai.xi         if (fCurrRFPowerDbm>=100.0) // unreasonable input value, get RF level from RFAGG
1184*53ee8cc1Swenshuai.xi         {
1185*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","Error!! please add AGC table\n");
1186*53ee8cc1Swenshuai.xi         }
1187*53ee8cc1Swenshuai.xi         #endif
1188*53ee8cc1Swenshuai.xi         ch_power_db = fCurrRFPowerDbm;
1189*53ee8cc1Swenshuai.xi     }
1190*53ee8cc1Swenshuai.xi 
1191*53ee8cc1Swenshuai.xi     Drv_DVBS_GetLockWithRFPower.u32CurrRFPowerDbm=(MS_U32)(ch_power_db);
1192*53ee8cc1Swenshuai.xi     Drv_DVBS_GetLockWithRFPower.u32NoChannelRFPowerDbm=(MS_U32)(fNoChannelRFPowerDbm);
1193*53ee8cc1Swenshuai.xi     UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetLockWithRFPower,&Drv_DVBS_GetLockWithRFPower);
1194*53ee8cc1Swenshuai.xi     status &= Drv_DVBS_GetLockWithRFPower.ret;
1195*53ee8cc1Swenshuai.xi     if(u8DemodLockFlag==1)
1196*53ee8cc1Swenshuai.xi     {
1197*53ee8cc1Swenshuai.xi         UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetTsDivNum, &Drv_DVBS_GetTsDivNum_PARAM);
1198*53ee8cc1Swenshuai.xi         status &= Drv_DVBS_GetTsDivNum_PARAM.bRet;
1199*53ee8cc1Swenshuai.xi 
1200*53ee8cc1Swenshuai.xi         //fec_type_idx = *Drv_DVBS_GetTsDivNum_PARAM.fec_type_idx;
1201*53ee8cc1Swenshuai.xi         //code_rate_idx = *Drv_DVBS_GetTsDivNum_PARAM.code_rate_idx;
1202*53ee8cc1Swenshuai.xi         //pilot_flag = *Drv_DVBS_GetTsDivNum_PARAM.pilot_flag;
1203*53ee8cc1Swenshuai.xi 
1204*53ee8cc1Swenshuai.xi          if(!system_type_reg)//DVBS2
1205*53ee8cc1Swenshuai.xi          {
1206*53ee8cc1Swenshuai.xi                 k_bch = k_bch_array[fec_type_idx][code_rate_idx];
1207*53ee8cc1Swenshuai.xi                 n_ldpc = n_ldpc_array[fec_type_idx];
1208*53ee8cc1Swenshuai.xi                 pilot_term = ((float) n_ldpc / modulation_order / 1440 * 36) * pilot_flag;
1209*53ee8cc1Swenshuai.xi 
1210*53ee8cc1Swenshuai.xi                 //data rate
1211*53ee8cc1Swenshuai.xi                 ftmp = k_bch/((n_ldpc/modulation_order+90+pilot_term)/u32SymbolRate);
1212*53ee8cc1Swenshuai.xi 
1213*53ee8cc1Swenshuai.xi                 if(sDMD_DVBS_Info.bSerialTS)//serial mode
1214*53ee8cc1Swenshuai.xi                 {
1215*53ee8cc1Swenshuai.xi                     fTSDivNum = 288000.0 / (ftmp) / 2.0 - 1;
1216*53ee8cc1Swenshuai.xi                     //fTSDivNum = fTSDivNum/2-1;// since  288/(2(fTSDivNum+1)) = 288/TS_RATE = A  ==> fTSDivNum = A/2-1
1217*53ee8cc1Swenshuai.xi                 }
1218*53ee8cc1Swenshuai.xi                 else//parallel mode
1219*53ee8cc1Swenshuai.xi                 {
1220*53ee8cc1Swenshuai.xi                     fTSDivNum = 288000.0 / (ftmp/8.0) / 2.0 - 1;
1221*53ee8cc1Swenshuai.xi                     //fTSDivNum = (fTSDivNum-1)/2;
1222*53ee8cc1Swenshuai.xi                 }
1223*53ee8cc1Swenshuai.xi 
1224*53ee8cc1Swenshuai.xi                 fTSDivNum -= ts_div_num_offset;
1225*53ee8cc1Swenshuai.xi 
1226*53ee8cc1Swenshuai.xi                 if(fTSDivNum > 0x1F)
1227*53ee8cc1Swenshuai.xi                     fTSDivNum = 0x1F;
1228*53ee8cc1Swenshuai.xi                 else if(fTSDivNum < 0x01)
1229*53ee8cc1Swenshuai.xi                     fTSDivNum = 0x01;
1230*53ee8cc1Swenshuai.xi 
1231*53ee8cc1Swenshuai.xi                 //ULOGD("DEMOD", ">>>Modulation Order = 0x%x<<<\n", modulation_order);
1232*53ee8cc1Swenshuai.xi                 //ULOGD("DEMOD", ">>>FEC Type = 0x%x<<<\n", fec_type_idx);
1233*53ee8cc1Swenshuai.xi                 //ULOGD("DEMOD", ">>>CR Type = 0x%x<<<\n", code_rate_idx);
1234*53ee8cc1Swenshuai.xi                 //ULOGD("DEMOD", ">>>Pilot Type = 0x%x<<<\n", pilot_flag);
1235*53ee8cc1Swenshuai.xi          }
1236*53ee8cc1Swenshuai.xi          else                                            //S
1237*53ee8cc1Swenshuai.xi          {
1238*53ee8cc1Swenshuai.xi              code_rate_reg = *Drv_DVBS_GetTsDivNum_PARAM.code_rate_reg;
1239*53ee8cc1Swenshuai.xi              switch (code_rate_reg)
1240*53ee8cc1Swenshuai.xi              {
1241*53ee8cc1Swenshuai.xi                 case 0x00: //CR 1/2
1242*53ee8cc1Swenshuai.xi                     if(sDMD_DVBS_Info.bSerialTS)
1243*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((1.0/2.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2)) /2)-ts_div_num_offset;
1244*53ee8cc1Swenshuai.xi                     else
1245*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((1.0/2.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2/8.0))/2)-ts_div_num_offset;
1246*53ee8cc1Swenshuai.xi 
1247*53ee8cc1Swenshuai.xi                     //fTSDivNum = fTSDivNum/2-1-5;
1248*53ee8cc1Swenshuai.xi 
1249*53ee8cc1Swenshuai.xi                     break;
1250*53ee8cc1Swenshuai.xi                 case 0x01: //CR 2/3
1251*53ee8cc1Swenshuai.xi                     if(sDMD_DVBS_Info.bSerialTS)
1252*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((2.0/3.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2)) /2)-ts_div_num_offset;
1253*53ee8cc1Swenshuai.xi                     else
1254*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((2.0/3.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2/8.0))/2)-ts_div_num_offset;
1255*53ee8cc1Swenshuai.xi 
1256*53ee8cc1Swenshuai.xi                     //fTSDivNum = fTSDivNum/2-1-5;
1257*53ee8cc1Swenshuai.xi 
1258*53ee8cc1Swenshuai.xi                     break;
1259*53ee8cc1Swenshuai.xi                 case 0x02: //CR 3/4
1260*53ee8cc1Swenshuai.xi                     if(sDMD_DVBS_Info.bSerialTS)
1261*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((3.0/4.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2)) /2)-ts_div_num_offset;
1262*53ee8cc1Swenshuai.xi                     else
1263*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((3.0/4.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2/8.0))/2)-ts_div_num_offset;
1264*53ee8cc1Swenshuai.xi 
1265*53ee8cc1Swenshuai.xi                       //fTSDivNum = fTSDivNum/2-1-5;
1266*53ee8cc1Swenshuai.xi                     break;
1267*53ee8cc1Swenshuai.xi                 case 0x03: //CR 5/6
1268*53ee8cc1Swenshuai.xi                     if(sDMD_DVBS_Info.bSerialTS)
1269*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((5.0/6.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2)) /2)-ts_div_num_offset;
1270*53ee8cc1Swenshuai.xi                     else
1271*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((5.0/6.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2/8.0))/2)-ts_div_num_offset;
1272*53ee8cc1Swenshuai.xi 
1273*53ee8cc1Swenshuai.xi                     //fTSDivNum = fTSDivNum/2-1-5;
1274*53ee8cc1Swenshuai.xi 
1275*53ee8cc1Swenshuai.xi                     break;
1276*53ee8cc1Swenshuai.xi                 case 0x04: //CR 7/8
1277*53ee8cc1Swenshuai.xi                     if(sDMD_DVBS_Info.bSerialTS)
1278*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((7.0/8.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2)) /2)-ts_div_num_offset;
1279*53ee8cc1Swenshuai.xi                     else
1280*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((7.0/8.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2/8.0))/2)-ts_div_num_offset;
1281*53ee8cc1Swenshuai.xi 
1282*53ee8cc1Swenshuai.xi                     //fTSDivNum = fTSDivNum/2-1-5;
1283*53ee8cc1Swenshuai.xi 
1284*53ee8cc1Swenshuai.xi                     break;
1285*53ee8cc1Swenshuai.xi                 default:
1286*53ee8cc1Swenshuai.xi                     if(sDMD_DVBS_Info.bSerialTS)
1287*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((7.0/8.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2)) /2)-ts_div_num_offset;
1288*53ee8cc1Swenshuai.xi                     else
1289*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((7.0/8.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2/8.0))/2)-ts_div_num_offset;
1290*53ee8cc1Swenshuai.xi 
1291*53ee8cc1Swenshuai.xi                     //fTSDivNum = fTSDivNum/2-1-5;
1292*53ee8cc1Swenshuai.xi 
1293*53ee8cc1Swenshuai.xi                     break;
1294*53ee8cc1Swenshuai.xi              }
1295*53ee8cc1Swenshuai.xi          }
1296*53ee8cc1Swenshuai.xi 
1297*53ee8cc1Swenshuai.xi          //fTSDivNum = 0x01;
1298*53ee8cc1Swenshuai.xi          u8Data = (MS_U8)fTSDivNum;
1299*53ee8cc1Swenshuai.xi 
1300*53ee8cc1Swenshuai.xi 	  #ifdef MS_DEBUG
1301*53ee8cc1Swenshuai.xi          ULOGD("DEMOD", ">>>INTERN_DVBS_GetLock TsClkDivNum = 0x%x<<<\n", u8Data);
1302*53ee8cc1Swenshuai.xi          #endif
1303*53ee8cc1Swenshuai.xi 
1304*53ee8cc1Swenshuai.xi          if (u8Data > 0x1F)
1305*53ee8cc1Swenshuai.xi              u8Data = 0x1F;
1306*53ee8cc1Swenshuai.xi 
1307*53ee8cc1Swenshuai.xi              HAL_DMD_RIU_WriteByte(0x103300, u8Data);
1308*53ee8cc1Swenshuai.xi 
1309*53ee8cc1Swenshuai.xi              //Ts Output Enable
1310*53ee8cc1Swenshuai.xi              HAL_DMD_RIU_WriteByte(0x101eaa,0x10);
1311*53ee8cc1Swenshuai.xi     }
1312*53ee8cc1Swenshuai.xi 
1313*53ee8cc1Swenshuai.xi   }
1314*53ee8cc1Swenshuai.xi   else
1315*53ee8cc1Swenshuai.xi   {
1316*53ee8cc1Swenshuai.xi     return false;
1317*53ee8cc1Swenshuai.xi   }
1318*53ee8cc1Swenshuai.xi 
1319*53ee8cc1Swenshuai.xi   #ifdef MS_DEBUG
1320*53ee8cc1Swenshuai.xi   //if(*(Drv_DVBS_GetLockWithRFPower_Transform.eLockStatus)==DMD_DVBS_LOCK)
1321*53ee8cc1Swenshuai.xi   if(*(Drv_DVBS_GetLockWithRFPower.eLockStatus)==DMD_DVBS_LOCK)
1322*53ee8cc1Swenshuai.xi   {
1323*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","check in drv layer DVBS demod locked!!\n");
1324*53ee8cc1Swenshuai.xi   }
1325*53ee8cc1Swenshuai.xi   else
1326*53ee8cc1Swenshuai.xi   {
1327*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","check in drv layer DVBS demod unlock!!\n");
1328*53ee8cc1Swenshuai.xi     return false;
1329*53ee8cc1Swenshuai.xi   }
1330*53ee8cc1Swenshuai.xi   #endif
1331*53ee8cc1Swenshuai.xi 
1332*53ee8cc1Swenshuai.xi   return status;
1333*53ee8cc1Swenshuai.xi }
1334*53ee8cc1Swenshuai.xi #endif
1335*53ee8cc1Swenshuai.xi 
1336*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
MDrv_DMD_DVBS_GetSignalStrength(MS_U16 * u16Strength)1337*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetSignalStrength(MS_U16 *u16Strength)
1338*53ee8cc1Swenshuai.xi {
1339*53ee8cc1Swenshuai.xi     return MDrv_DMD_DVBS_GetSignalStrengthWithRFPower(u16Strength, 200.0f);
1340*53ee8cc1Swenshuai.xi }
1341*53ee8cc1Swenshuai.xi #endif
1342*53ee8cc1Swenshuai.xi 
1343*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
MDrv_DMD_DVBS_GetSignalStrengthWithRFPower(MS_U16 * u16Strength,float fRFPowerDbm)1344*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetSignalStrengthWithRFPower(MS_U16 *u16Strength, float fRFPowerDbm)
1345*53ee8cc1Swenshuai.xi {
1346*53ee8cc1Swenshuai.xi   MS_BOOL status = true;
1347*53ee8cc1Swenshuai.xi 
1348*53ee8cc1Swenshuai.xi   DMD_IFAGC_SSI   *ifagc_ssi;
1349*53ee8cc1Swenshuai.xi   DMD_IFAGC_ERR   *ifagc_err;
1350*53ee8cc1Swenshuai.xi   float   ch_power_rf=0.0f;
1351*53ee8cc1Swenshuai.xi   float   ch_power_db=0.0f, ch_power_db_rel=0.0f;
1352*53ee8cc1Swenshuai.xi   float   ch_power_if=0.0f, ch_power_ifa = 0.0f, ch_power_ifb =0.0f;
1353*53ee8cc1Swenshuai.xi   MS_U16  if_agc_val =0, if_agc_vala =0, if_agc_valb =0, if_agc_val_lsb =0, i;
1354*53ee8cc1Swenshuai.xi   float   ch_power_takeover=0.0f;
1355*53ee8cc1Swenshuai.xi   MS_U8   ssi_tbl_len = 0, err_tbl_len = 0;
1356*53ee8cc1Swenshuai.xi 
1357*53ee8cc1Swenshuai.xi   MS_U8 ifagc_reg;
1358*53ee8cc1Swenshuai.xi   MS_U8 ifagc_reg_lsb;
1359*53ee8cc1Swenshuai.xi   MS_U16 ifagc_err_reg;
1360*53ee8cc1Swenshuai.xi 
1361*53ee8cc1Swenshuai.xi  // float   ch_power_db=0.0f, ch_power_db_rel=0.0f;
1362*53ee8cc1Swenshuai.xi   DMD_DVBS_DEMOD_TYPE pDemodType;
1363*53ee8cc1Swenshuai.xi   MS_U8  u8_DVBS2_CurrentCodeRateLocal;
1364*53ee8cc1Swenshuai.xi   MS_U8  u8_DVBS2_CurrentConstellationLocal;
1365*53ee8cc1Swenshuai.xi   //MS_U16 u16Data=0;
1366*53ee8cc1Swenshuai.xi   //MS_U8 u8Index;
1367*53ee8cc1Swenshuai.xi   //DMD_DVBS_MODULATION_TYPE Qam_mode;
1368*53ee8cc1Swenshuai.xi  // MS_U16 SymbolRate;
1369*53ee8cc1Swenshuai.xi  // float FreqOff;
1370*53ee8cc1Swenshuai.xi 
1371*53ee8cc1Swenshuai.xi   //DVBS_GetSignalStrengthWithRFPower_PARAM Drv_DVBS_GetSignalStrengthWithRFPower_PARAM;
1372*53ee8cc1Swenshuai.xi   //Drv_DVBS_GetSignalStrengthWithRFPower_PARAM.u16Strength=u16Strength;
1373*53ee8cc1Swenshuai.xi   //Drv_DVBS_GetSignalStrengthWithRFPower_PARAM.fRFPowerDbm=fRFPowerDbm;
1374*53ee8cc1Swenshuai.xi 
1375*53ee8cc1Swenshuai.xi   DVBS_GetIFAGC_PARAM Drv_DVBS_GetIFAGC_PARAM;
1376*53ee8cc1Swenshuai.xi   Drv_DVBS_GetIFAGC_PARAM.ifagc_reg=&ifagc_reg;
1377*53ee8cc1Swenshuai.xi   Drv_DVBS_GetIFAGC_PARAM.ifagc_reg_lsb=&ifagc_reg_lsb;
1378*53ee8cc1Swenshuai.xi   Drv_DVBS_GetIFAGC_PARAM.ifagc_err_reg=&ifagc_err_reg;
1379*53ee8cc1Swenshuai.xi   Drv_DVBS_GetIFAGC_PARAM.ret=false;
1380*53ee8cc1Swenshuai.xi 
1381*53ee8cc1Swenshuai.xi /*
1382*53ee8cc1Swenshuai.xi   DVBS_GetTunrSignalLevel_PWR_PARAM Drv_DVBS_GetTunrSignalLevel_PWR_PARAM;
1383*53ee8cc1Swenshuai.xi   Drv_DVBS_GetTunrSignalLevel_PWR_PARAM.u16Data=&u16Data;
1384*53ee8cc1Swenshuai.xi   Drv_DVBS_GetTunrSignalLevel_PWR_PARAM.bRet=false;
1385*53ee8cc1Swenshuai.xi   */
1386*53ee8cc1Swenshuai.xi   DVBS_GetSignalStrengthWithRFPower_PARAM Drv_DVBS_GetSignalStrengthWithRFPower_PARAM;
1387*53ee8cc1Swenshuai.xi   Drv_DVBS_GetSignalStrengthWithRFPower_PARAM.fRFPowerDbm=(MS_U16)fRFPowerDbm;
1388*53ee8cc1Swenshuai.xi   Drv_DVBS_GetSignalStrengthWithRFPower_PARAM.pDemodType=&pDemodType;
1389*53ee8cc1Swenshuai.xi   Drv_DVBS_GetSignalStrengthWithRFPower_PARAM.u8_DVBS2_CurrentCodeRateLocal=&u8_DVBS2_CurrentCodeRateLocal;
1390*53ee8cc1Swenshuai.xi   Drv_DVBS_GetSignalStrengthWithRFPower_PARAM.u8_DVBS2_CurrentConstellationLocal=&u8_DVBS2_CurrentConstellationLocal;
1391*53ee8cc1Swenshuai.xi   Drv_DVBS_GetSignalStrengthWithRFPower_PARAM.ret=false;
1392*53ee8cc1Swenshuai.xi 
1393*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
1394*53ee8cc1Swenshuai.xi   {
1395*53ee8cc1Swenshuai.xi 
1396*53ee8cc1Swenshuai.xi     if((AgcSsi_Para.pTuner_IfagcSsi_HiRef != NULL) && (AgcSsi_Para.pTuner_IfagcSsi_LoRef != NULL))
1397*53ee8cc1Swenshuai.xi     {
1398*53ee8cc1Swenshuai.xi     	  UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetIFAGC,&Drv_DVBS_GetIFAGC_PARAM);
1399*53ee8cc1Swenshuai.xi         status &= Drv_DVBS_GetIFAGC_PARAM.ret;
1400*53ee8cc1Swenshuai.xi 
1401*53ee8cc1Swenshuai.xi         ch_power_rf = fRFPowerDbm;
1402*53ee8cc1Swenshuai.xi 
1403*53ee8cc1Swenshuai.xi         if_agc_val = ifagc_reg;
1404*53ee8cc1Swenshuai.xi         if_agc_val_lsb = ifagc_reg_lsb;
1405*53ee8cc1Swenshuai.xi 
1406*53ee8cc1Swenshuai.xi         ifagc_ssi = AgcSsi_Para.pTuner_IfagcSsi_LoRef;
1407*53ee8cc1Swenshuai.xi         ssi_tbl_len = AgcSsi_Para.u16Tuner_IfagcSsi_LoRef_Size;
1408*53ee8cc1Swenshuai.xi         ifagc_err = AgcSsi_Para.pTuner_IfagcErr_LoRef;
1409*53ee8cc1Swenshuai.xi         err_tbl_len = AgcSsi_Para.u16Tuner_IfagcErr_LoRef_Size;
1410*53ee8cc1Swenshuai.xi 
1411*53ee8cc1Swenshuai.xi         ch_power_if=ifagc_ssi[0].power_db;
1412*53ee8cc1Swenshuai.xi         if (if_agc_val >=ifagc_ssi[0].agc_val)
1413*53ee8cc1Swenshuai.xi         {
1414*53ee8cc1Swenshuai.xi                 for(i = 1; i < ssi_tbl_len; i++)
1415*53ee8cc1Swenshuai.xi                 {
1416*53ee8cc1Swenshuai.xi                     if (if_agc_val < ifagc_ssi[i].agc_val)
1417*53ee8cc1Swenshuai.xi                     {
1418*53ee8cc1Swenshuai.xi                         if_agc_valb = ifagc_ssi[i].agc_val;
1419*53ee8cc1Swenshuai.xi                         ch_power_ifb = ifagc_ssi[i].power_db;
1420*53ee8cc1Swenshuai.xi 
1421*53ee8cc1Swenshuai.xi                         i--;
1422*53ee8cc1Swenshuai.xi                         if_agc_vala = ifagc_ssi[i].agc_val;
1423*53ee8cc1Swenshuai.xi                         ch_power_ifa=ifagc_ssi[i].power_db;
1424*53ee8cc1Swenshuai.xi                         while ((i>1) && (if_agc_vala==ifagc_ssi[i-1].agc_val))
1425*53ee8cc1Swenshuai.xi                         {
1426*53ee8cc1Swenshuai.xi                             ch_power_ifa=ifagc_ssi[i-1].power_db;
1427*53ee8cc1Swenshuai.xi                             i--;
1428*53ee8cc1Swenshuai.xi                         }
1429*53ee8cc1Swenshuai.xi                         ch_power_if = ch_power_ifa+(ch_power_ifb-ch_power_ifa)*(float)((if_agc_val-if_agc_vala)*256+if_agc_val_lsb)/((if_agc_valb-if_agc_vala)*256);
1430*53ee8cc1Swenshuai.xi                         break;
1431*53ee8cc1Swenshuai.xi                     }
1432*53ee8cc1Swenshuai.xi                 }
1433*53ee8cc1Swenshuai.xi         }
1434*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
1435*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","if prev %f %x\n", ch_power_ifa, if_agc_vala);
1436*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","if next %f %x\n", ch_power_ifb, if_agc_valb);
1437*53ee8cc1Swenshuai.xi             #endif
1438*53ee8cc1Swenshuai.xi 
1439*53ee8cc1Swenshuai.xi             for(i = 0; i < ssi_tbl_len; i++)
1440*53ee8cc1Swenshuai.xi             {
1441*53ee8cc1Swenshuai.xi                 if (ifagc_ssi[i].agc_val <= ifagc_ssi[i+1].agc_val)
1442*53ee8cc1Swenshuai.xi                 {
1443*53ee8cc1Swenshuai.xi                     ch_power_takeover = ifagc_ssi[i+1].power_db;
1444*53ee8cc1Swenshuai.xi                     break;
1445*53ee8cc1Swenshuai.xi                 }
1446*53ee8cc1Swenshuai.xi             }
1447*53ee8cc1Swenshuai.xi 
1448*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
1449*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","ch_power_rf = %f\n", ch_power_rf);
1450*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","ch_power_if = %f\n", ch_power_if);
1451*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","ch_power_takeover = %f\n", ch_power_takeover);
1452*53ee8cc1Swenshuai.xi             #endif
1453*53ee8cc1Swenshuai.xi 
1454*53ee8cc1Swenshuai.xi             // ch_power_db = (ch_power_rf > ch_power_if)? ch_power_rf : ch_power_if;
1455*53ee8cc1Swenshuai.xi 
1456*53ee8cc1Swenshuai.xi             if(ch_power_rf > (ch_power_takeover + 0.5))
1457*53ee8cc1Swenshuai.xi             {
1458*53ee8cc1Swenshuai.xi                 ch_power_db = ch_power_rf;
1459*53ee8cc1Swenshuai.xi             }
1460*53ee8cc1Swenshuai.xi             else if(ch_power_if < (ch_power_takeover - 0.5))
1461*53ee8cc1Swenshuai.xi             {
1462*53ee8cc1Swenshuai.xi                 ch_power_db = ch_power_if;
1463*53ee8cc1Swenshuai.xi             }
1464*53ee8cc1Swenshuai.xi             else
1465*53ee8cc1Swenshuai.xi             {
1466*53ee8cc1Swenshuai.xi                 ch_power_db = (ch_power_if + ch_power_rf)/2;
1467*53ee8cc1Swenshuai.xi             }
1468*53ee8cc1Swenshuai.xi 
1469*53ee8cc1Swenshuai.xi             // ch_power_db = (ch_power_rf > ch_power_if)? ch_power_if : ch_power_rf;
1470*53ee8cc1Swenshuai.xi 
1471*53ee8cc1Swenshuai.xi         if(if_agc_val == 0xff)
1472*53ee8cc1Swenshuai.xi         {
1473*53ee8cc1Swenshuai.xi             for(i = 0; i < err_tbl_len; i++)
1474*53ee8cc1Swenshuai.xi             {
1475*53ee8cc1Swenshuai.xi                     if ( ifagc_err_reg <= ifagc_err[i].agc_err )        // signed char comparison
1476*53ee8cc1Swenshuai.xi                     {
1477*53ee8cc1Swenshuai.xi                         ch_power_db += ifagc_err[i].attn_db;
1478*53ee8cc1Swenshuai.xi                         break;
1479*53ee8cc1Swenshuai.xi                     }
1480*53ee8cc1Swenshuai.xi             }
1481*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
1482*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","if_agc_err = 0x%x\n", ifagc_err_reg);
1483*53ee8cc1Swenshuai.xi            #endif
1484*53ee8cc1Swenshuai.xi         }
1485*53ee8cc1Swenshuai.xi     }
1486*53ee8cc1Swenshuai.xi     else
1487*53ee8cc1Swenshuai.xi     {
1488*53ee8cc1Swenshuai.xi     	  #ifdef MS_DEBUG
1489*53ee8cc1Swenshuai.xi         if (fRFPowerDbm>=100.0) // unreasonable input value, get RF level from RFAGG
1490*53ee8cc1Swenshuai.xi         {
1491*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","Error!! please add AGC table\n");
1492*53ee8cc1Swenshuai.xi         }
1493*53ee8cc1Swenshuai.xi         #endif
1494*53ee8cc1Swenshuai.xi         ch_power_db = fRFPowerDbm;
1495*53ee8cc1Swenshuai.xi     }
1496*53ee8cc1Swenshuai.xi     /*
1497*53ee8cc1Swenshuai.xi     UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetTunrSignalLevel_PWR,&Drv_DVBS_GetTunrSignalLevel_PWR_PARAM);
1498*53ee8cc1Swenshuai.xi         status &= Drv_DVBS_GetTunrSignalLevel_PWR_PARAM.bRet;
1499*53ee8cc1Swenshuai.xi     if (u8DemodLockFlag == 0 || status == FALSE)//Demod unlock
1500*53ee8cc1Swenshuai.xi     {
1501*53ee8cc1Swenshuai.xi         ch_power_db = 0;
1502*53ee8cc1Swenshuai.xi 	 DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]INTERN_DVBS GetSignalStrength failed\n"));
1503*53ee8cc1Swenshuai.xi     }
1504*53ee8cc1Swenshuai.xi     else
1505*53ee8cc1Swenshuai.xi     {
1506*53ee8cc1Swenshuai.xi         for (u8Index=0; u8Index < (sizeof(_u16SignalLevel)/sizeof(_u16SignalLevel[0])); u8Index++)
1507*53ee8cc1Swenshuai.xi         {
1508*53ee8cc1Swenshuai.xi             if ((65535 - u16Data) <= _u16SignalLevel[u8Index][0])
1509*53ee8cc1Swenshuai.xi             {
1510*53ee8cc1Swenshuai.xi                 if (u8Index >=1)
1511*53ee8cc1Swenshuai.xi                 {
1512*53ee8cc1Swenshuai.xi                     ch_power_db = (float)(_u16SignalLevel[u8Index][1])+((float)(_u16SignalLevel[u8Index][0] - (65535 - u16Data)) / (float)(_u16SignalLevel[u8Index][0] - _u16SignalLevel[u8Index-1][0]))*(float)(_u16SignalLevel[u8Index-1][1] - _u16SignalLevel[u8Index][1]);
1513*53ee8cc1Swenshuai.xi                 }
1514*53ee8cc1Swenshuai.xi                 else
1515*53ee8cc1Swenshuai.xi                 {
1516*53ee8cc1Swenshuai.xi                     ch_power_db = _u16SignalLevel[u8Index][1];
1517*53ee8cc1Swenshuai.xi                 }
1518*53ee8cc1Swenshuai.xi                 break;
1519*53ee8cc1Swenshuai.xi             }
1520*53ee8cc1Swenshuai.xi         }
1521*53ee8cc1Swenshuai.xi //----------
1522*53ee8cc1Swenshuai.xi         if (ch_power_db >= 350)
1523*53ee8cc1Swenshuai.xi             ch_power_db = ch_power_db - 35;
1524*53ee8cc1Swenshuai.xi         else if ((ch_power_db < 350) && (ch_power_db >= 250))
1525*53ee8cc1Swenshuai.xi             ch_power_db = ch_power_db - 25;
1526*53ee8cc1Swenshuai.xi         else
1527*53ee8cc1Swenshuai.xi             ch_power_db = ch_power_db - 5;
1528*53ee8cc1Swenshuai.xi 
1529*53ee8cc1Swenshuai.xi         if (ch_power_db < 0)
1530*53ee8cc1Swenshuai.xi             ch_power_db = 0;
1531*53ee8cc1Swenshuai.xi         if (ch_power_db > 920)
1532*53ee8cc1Swenshuai.xi             ch_power_db = 920;
1533*53ee8cc1Swenshuai.xi 
1534*53ee8cc1Swenshuai.xi         ch_power_db = (-1.0)*(ch_power_db/10.0);
1535*53ee8cc1Swenshuai.xi         //DBG_INTERN_DVBS(printf("INTERN_DVBS GetSignalStrength %f\n", ch_power_db));
1536*53ee8cc1Swenshuai.xi         DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]INTERN_DVBS GetSignalStrength %f\n", ch_power_db));
1537*53ee8cc1Swenshuai.xi     }
1538*53ee8cc1Swenshuai.xi     */
1539*53ee8cc1Swenshuai.xi     UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetSignalStrengthWithRFPower,&Drv_DVBS_GetSignalStrengthWithRFPower_PARAM);
1540*53ee8cc1Swenshuai.xi     status &= Drv_DVBS_GetSignalStrengthWithRFPower_PARAM.ret;
1541*53ee8cc1Swenshuai.xi 
1542*53ee8cc1Swenshuai.xi     #if 1
1543*53ee8cc1Swenshuai.xi     if((MS_U8)pDemodType == (MS_U8)DMD_SAT_DVBS)//S
1544*53ee8cc1Swenshuai.xi     {
1545*53ee8cc1Swenshuai.xi         float fDVBS_SSI_Pref[]=
1546*53ee8cc1Swenshuai.xi         {
1547*53ee8cc1Swenshuai.xi             //0,       1,       2,       3,       4
1548*53ee8cc1Swenshuai.xi             -78.9,   -77.15,  -76.14,  -75.19,  -74.57,//QPSK
1549*53ee8cc1Swenshuai.xi         };
1550*53ee8cc1Swenshuai.xi         //status &= MDrv_SYS_DMD_VD_MBX_ReadReg(DVBSTFEC_REG_BASE + 0x84, &u8Data);
1551*53ee8cc1Swenshuai.xi         //u8_DVBS2_CurrentCodeRateLocal = (u8Data & 0x07);
1552*53ee8cc1Swenshuai.xi         ch_power_db_rel = ch_power_db - fDVBS_SSI_Pref[u8_DVBS2_CurrentCodeRateLocal];
1553*53ee8cc1Swenshuai.xi     }
1554*53ee8cc1Swenshuai.xi     else
1555*53ee8cc1Swenshuai.xi     {
1556*53ee8cc1Swenshuai.xi         #if 0
1557*53ee8cc1Swenshuai.xi         float fDVBS2_SSI_Pref[][11]=
1558*53ee8cc1Swenshuai.xi         {
1559*53ee8cc1Swenshuai.xi             //  0,    1,       2,       3,       4,       5,       6,       7,       8,        9,       10
1560*53ee8cc1Swenshuai.xi             //1/4,    1/3,     2/5,     1/2,     3/5,     2/3,     3/4,     4/5,     5/6,      8/9,     9/10
1561*53ee8cc1Swenshuai.xi             {-85.17, -84.08,  -83.15,  -81.86,  -80.63,  -79.77,  -78.84,  -78.19,  -77.69,   -76.68,  -76.46}, //QPSK
1562*53ee8cc1Swenshuai.xi             {   0.0,    0.0,     0.0,     0.0,  -77.36,  -76.24,  -74.95,     0.0,  -73.52,   -72.18,  -71.84}  //8PSK
1563*53ee8cc1Swenshuai.xi         };
1564*53ee8cc1Swenshuai.xi         #endif
1565*53ee8cc1Swenshuai.xi         /*
1566*53ee8cc1Swenshuai.xi         status &= MDrv_SYS_DMD_VD_MBX_ReadReg(DVBS2_INNER_REG_BASE + 0xD7, &u8Data);
1567*53ee8cc1Swenshuai.xi         u8_DVBS2_CurrentCodeRateLocal = (u8Data & 0x3C)>>2;
1568*53ee8cc1Swenshuai.xi 
1569*53ee8cc1Swenshuai.xi         status &= MDrv_SYS_DMD_VD_MBX_ReadReg(DVBS2_INNER_REG_BASE + 0xD7, &u8Data);
1570*53ee8cc1Swenshuai.xi        status &= MDrv_SYS_DMD_VD_MBX_ReadReg(DVBS2_INNER_REG_BASE + 0xD6, &u8Data2);
1571*53ee8cc1Swenshuai.xi 
1572*53ee8cc1Swenshuai.xi         if(((u8Data & 0x03)==0x01) && ((u8Data2 & 0x80)==0x00))
1573*53ee8cc1Swenshuai.xi         {
1574*53ee8cc1Swenshuai.xi             _u8_DVBS2_CurrentConstellationLocal = DMD_DVBS_QPSK;
1575*53ee8cc1Swenshuai.xi         }
1576*53ee8cc1Swenshuai.xi         else if (((u8Data & 0x03)==0x01) && ((u8Data2 & 0x80)==0x80))
1577*53ee8cc1Swenshuai.xi         {
1578*53ee8cc1Swenshuai.xi             _u8_DVBS2_CurrentConstellationLocal = DMD_DVBS_8PSK;//8PSK
1579*53ee8cc1Swenshuai.xi         }
1580*53ee8cc1Swenshuai.xi         */
1581*53ee8cc1Swenshuai.xi         ch_power_db_rel = ch_power_db - (-80);//fDVBS2_SSI_Pref[u8_DVBS2_CurrentConstellationLocal][u8_DVBS2_CurrentCodeRateLocal];
1582*53ee8cc1Swenshuai.xi     }
1583*53ee8cc1Swenshuai.xi     #endif
1584*53ee8cc1Swenshuai.xi 
1585*53ee8cc1Swenshuai.xi     if(ch_power_db_rel <= -15.0f)
1586*53ee8cc1Swenshuai.xi     {
1587*53ee8cc1Swenshuai.xi         *u16Strength= 0;
1588*53ee8cc1Swenshuai.xi     }
1589*53ee8cc1Swenshuai.xi     else if (ch_power_db_rel <= 0.0f)
1590*53ee8cc1Swenshuai.xi     {
1591*53ee8cc1Swenshuai.xi         *u16Strength = (MS_U16)(2.0f/3 * (ch_power_db_rel+15.0f));
1592*53ee8cc1Swenshuai.xi     }
1593*53ee8cc1Swenshuai.xi     else if (ch_power_db_rel <= 20.0f)
1594*53ee8cc1Swenshuai.xi     {
1595*53ee8cc1Swenshuai.xi         *u16Strength = (MS_U16)(4.0f * ch_power_db_rel + 10.0f);
1596*53ee8cc1Swenshuai.xi     }
1597*53ee8cc1Swenshuai.xi     else if (ch_power_db_rel <= 35.0f)
1598*53ee8cc1Swenshuai.xi     {
1599*53ee8cc1Swenshuai.xi         *u16Strength = (MS_U16)(2.0f/3 * (ch_power_db_rel-20.0f) + 90.0);
1600*53ee8cc1Swenshuai.xi     }
1601*53ee8cc1Swenshuai.xi     else
1602*53ee8cc1Swenshuai.xi     {
1603*53ee8cc1Swenshuai.xi         *u16Strength = 100;
1604*53ee8cc1Swenshuai.xi     }
1605*53ee8cc1Swenshuai.xi 
1606*53ee8cc1Swenshuai.xi 	//ULOGD("DEMOD","Signal Strength(SSI) = %d \n", (int)*u16Strength);
1607*53ee8cc1Swenshuai.xi 	sDMD_DVBS_Info.u16Strength=*u16Strength;
1608*53ee8cc1Swenshuai.xi   }
1609*53ee8cc1Swenshuai.xi 
1610*53ee8cc1Swenshuai.xi   else
1611*53ee8cc1Swenshuai.xi   {
1612*53ee8cc1Swenshuai.xi     return false;
1613*53ee8cc1Swenshuai.xi   }
1614*53ee8cc1Swenshuai.xi 
1615*53ee8cc1Swenshuai.xi   return status;
1616*53ee8cc1Swenshuai.xi }
1617*53ee8cc1Swenshuai.xi #endif
1618*53ee8cc1Swenshuai.xi 
1619*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
MDrv_DMD_DVBS_GetSignalQuality(MS_U16 * u16Quality)1620*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetSignalQuality(MS_U16 *u16Quality)
1621*53ee8cc1Swenshuai.xi {
1622*53ee8cc1Swenshuai.xi     return MDrv_DMD_DVBS_GetSignalQualityWithRFPower(u16Quality, 200.0f);
1623*53ee8cc1Swenshuai.xi }
1624*53ee8cc1Swenshuai.xi #endif
1625*53ee8cc1Swenshuai.xi 
1626*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
MDrv_DMD_DVBS_GetSignalQualityWithRFPower(MS_U16 * u16Quality,float fRFPowerDbm)1627*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetSignalQualityWithRFPower(MS_U16 *u16Quality, float fRFPowerDbm)
1628*53ee8cc1Swenshuai.xi {
1629*53ee8cc1Swenshuai.xi     MS_BOOL bRet;
1630*53ee8cc1Swenshuai.xi     float       fber = 0.0;
1631*53ee8cc1Swenshuai.xi     //float       log_ber;
1632*53ee8cc1Swenshuai.xi     MS_BOOL     status = TRUE;
1633*53ee8cc1Swenshuai.xi     float       f_snr = 0.0, ber_sqi = 0.0, cn_rel = 0.0;
1634*53ee8cc1Swenshuai.xi     //MS_U8       u8Data =0;
1635*53ee8cc1Swenshuai.xi     DMD_DVBS_CODE_RATE_TYPE       _u8_DVBS2_CurrentCodeRateLocal ;
1636*53ee8cc1Swenshuai.xi     MS_U16     bchpkt_error,BCH_Eflag2_Window;
1637*53ee8cc1Swenshuai.xi     //fRFPowerDbm = fRFPowerDbm;
1638*53ee8cc1Swenshuai.xi     float snr_poly =0.0;
1639*53ee8cc1Swenshuai.xi     float Fixed_SNR =0.0;
1640*53ee8cc1Swenshuai.xi     double eFlag_PER=0.0;
1641*53ee8cc1Swenshuai.xi 
1642*53ee8cc1Swenshuai.xi 
1643*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
1644*53ee8cc1Swenshuai.xi   {
1645*53ee8cc1Swenshuai.xi     if (u8DemodLockFlag == 1)
1646*53ee8cc1Swenshuai.xi    // if (TRUE == INTERN_DVBS_GetLock(DMD_DVBS_GETLOCK, 200.0f, -200.0f, 0))
1647*53ee8cc1Swenshuai.xi     {
1648*53ee8cc1Swenshuai.xi         if(_bDemodType)  //S2
1649*53ee8cc1Swenshuai.xi         {
1650*53ee8cc1Swenshuai.xi 
1651*53ee8cc1Swenshuai.xi            MDrv_DMD_DVBS_GetSNR(&f_snr);
1652*53ee8cc1Swenshuai.xi            snr_poly = 0.005261367463671*pow(f_snr, 3)-0.116517828301214*pow(f_snr, 2)+0.744836970505452*pow(f_snr, 1)-0.86727609780167;
1653*53ee8cc1Swenshuai.xi            Fixed_SNR = f_snr + snr_poly;
1654*53ee8cc1Swenshuai.xi 
1655*53ee8cc1Swenshuai.xi            if (Fixed_SNR < 17.0)
1656*53ee8cc1Swenshuai.xi               Fixed_SNR = Fixed_SNR;
1657*53ee8cc1Swenshuai.xi            else if ((Fixed_SNR < 20.0) && (Fixed_SNR >= 17.0))
1658*53ee8cc1Swenshuai.xi               Fixed_SNR = Fixed_SNR - 0.8;
1659*53ee8cc1Swenshuai.xi            else if ((Fixed_SNR < 22.5) && (Fixed_SNR >= 20.0))
1660*53ee8cc1Swenshuai.xi               Fixed_SNR = Fixed_SNR - 2.0;
1661*53ee8cc1Swenshuai.xi            else if ((Fixed_SNR < 27.0) && (Fixed_SNR >= 22.5))
1662*53ee8cc1Swenshuai.xi               Fixed_SNR = Fixed_SNR - 3.0;
1663*53ee8cc1Swenshuai.xi            else if ((Fixed_SNR < 29.0) && (Fixed_SNR >= 27.0))
1664*53ee8cc1Swenshuai.xi               Fixed_SNR = Fixed_SNR - 3.5;
1665*53ee8cc1Swenshuai.xi            else if (Fixed_SNR >= 29.0)
1666*53ee8cc1Swenshuai.xi               Fixed_SNR = Fixed_SNR - 3.0;
1667*53ee8cc1Swenshuai.xi 
1668*53ee8cc1Swenshuai.xi 
1669*53ee8cc1Swenshuai.xi            if (Fixed_SNR < 1.0)
1670*53ee8cc1Swenshuai.xi               Fixed_SNR = 1.0;
1671*53ee8cc1Swenshuai.xi            if (Fixed_SNR > 30.0)
1672*53ee8cc1Swenshuai.xi               Fixed_SNR = 30.0;
1673*53ee8cc1Swenshuai.xi 
1674*53ee8cc1Swenshuai.xi             //BCH EFLAG2_Window,  window size 0x2000
1675*53ee8cc1Swenshuai.xi             BCH_Eflag2_Window=0x2000;
1676*53ee8cc1Swenshuai.xi             MDrv_SYS_DMD_VD_MBX_WriteReg(DVBS2FEC_REG_BASE + 0x25*2 + 1, (BCH_Eflag2_Window>>8));
1677*53ee8cc1Swenshuai.xi             MDrv_SYS_DMD_VD_MBX_WriteReg(DVBS2FEC_REG_BASE + 0x25*2 , (BCH_Eflag2_Window&0xff));
1678*53ee8cc1Swenshuai.xi             MDrv_DMD_DVBS_GetPacketErr(&bchpkt_error);
1679*53ee8cc1Swenshuai.xi             eFlag_PER = (float)(bchpkt_error)/(float)(BCH_Eflag2_Window);
1680*53ee8cc1Swenshuai.xi             if(eFlag_PER>0)
1681*53ee8cc1Swenshuai.xi               fber = 0.089267531133002*pow(eFlag_PER, 2) + 0.019640560289510*eFlag_PER + 0.0000001;
1682*53ee8cc1Swenshuai.xi             else
1683*53ee8cc1Swenshuai.xi               fber = 0;
1684*53ee8cc1Swenshuai.xi 
1685*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX
1686*53ee8cc1Swenshuai.xi                     //log_ber = ( - 1) *log10f(1 / fber);
1687*53ee8cc1Swenshuai.xi                     if (fber > 1.0E-1)
1688*53ee8cc1Swenshuai.xi                         ber_sqi = (log10f(1.0f/fber))*20.0f + 8.0f;
1689*53ee8cc1Swenshuai.xi                     else if(fber > 8.5E-7)
1690*53ee8cc1Swenshuai.xi                         ber_sqi = (log10f(1.0f/fber))*20.0f - 30.0f;
1691*53ee8cc1Swenshuai.xi                     else
1692*53ee8cc1Swenshuai.xi                         ber_sqi = 100.0;
1693*53ee8cc1Swenshuai.xi #else
1694*53ee8cc1Swenshuai.xi                     //log_ber = ( - 1) *Log10Approx(1 / fber);
1695*53ee8cc1Swenshuai.xi                     if (fber > 1.0E-1)
1696*53ee8cc1Swenshuai.xi                         ber_sqi = (Log10Approx(1.0f/fber))*20.0f + 8.0f;
1697*53ee8cc1Swenshuai.xi                     else if(fber > 8.5E-7)
1698*53ee8cc1Swenshuai.xi                         ber_sqi = (Log10Approx(1.0f/fber))*20.0f - 30.0f;
1699*53ee8cc1Swenshuai.xi                     else
1700*53ee8cc1Swenshuai.xi                         ber_sqi = 100.0;
1701*53ee8cc1Swenshuai.xi 
1702*53ee8cc1Swenshuai.xi #endif
1703*53ee8cc1Swenshuai.xi 
1704*53ee8cc1Swenshuai.xi             *u16Quality = Fixed_SNR/30*ber_sqi;
1705*53ee8cc1Swenshuai.xi             //DBG_INTERN_DVBS(printf(" Fixed_SNR %f\n",Fixed_SNR));
1706*53ee8cc1Swenshuai.xi             //DBG_INTERN_DVBS(printf(" BCH_Eflag2_Window %d\n",BCH_Eflag2_Window));
1707*53ee8cc1Swenshuai.xi             //DBG_INTERN_DVBS(printf(" eFlag_PER [%f]\n fber [%8.3e]\n ber_sqi [%f]\n",eFlag_PER,fber,ber_sqi));
1708*53ee8cc1Swenshuai.xi         }
1709*53ee8cc1Swenshuai.xi         else  //S
1710*53ee8cc1Swenshuai.xi         {
1711*53ee8cc1Swenshuai.xi             if (MDrv_DMD_DVBS_GetPostViterbiBer(&fber) == FALSE)//ViterbiBer
1712*53ee8cc1Swenshuai.xi             {
1713*53ee8cc1Swenshuai.xi                 ULOGD("DEMOD","GetPostViterbiBer Fail! \n");
1714*53ee8cc1Swenshuai.xi                 bRet= FALSE;
1715*53ee8cc1Swenshuai.xi             }
1716*53ee8cc1Swenshuai.xi             //_fPostBer=fber;
1717*53ee8cc1Swenshuai.xi 
1718*53ee8cc1Swenshuai.xi 
1719*53ee8cc1Swenshuai.xi             if (status==FALSE)
1720*53ee8cc1Swenshuai.xi             {
1721*53ee8cc1Swenshuai.xi                 ULOGD("DEMOD","Maserati_GetSignalQuality GetPostViterbiBer Fail! \n");
1722*53ee8cc1Swenshuai.xi                 bRet= FALSE;
1723*53ee8cc1Swenshuai.xi             }
1724*53ee8cc1Swenshuai.xi             float fDVBS_SQI_CNref[]=
1725*53ee8cc1Swenshuai.xi             {   //0,    1,    2,    3,    4
1726*53ee8cc1Swenshuai.xi                 4.2,   5.9,  6,  6.9,  7.5,//QPSK
1727*53ee8cc1Swenshuai.xi             };
1728*53ee8cc1Swenshuai.xi 
1729*53ee8cc1Swenshuai.xi            DVBS_GetCurrentDemodCodeRate_PARAM Drv_DVBS_GetCurrentDemodCodeRate_PARAM;
1730*53ee8cc1Swenshuai.xi            Drv_DVBS_GetCurrentDemodCodeRate_PARAM.pCodeRate=&_u8_DVBS2_CurrentCodeRateLocal;
1731*53ee8cc1Swenshuai.xi            Drv_DVBS_GetCurrentDemodCodeRate_PARAM.bRet=false;
1732*53ee8cc1Swenshuai.xi 	   UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetCurrentDemodCodeRate,&Drv_DVBS_GetCurrentDemodCodeRate_PARAM);
1733*53ee8cc1Swenshuai.xi #if 0
1734*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX
1735*53ee8cc1Swenshuai.xi             log_ber = ( - 1.0f) *log10f(1.0f / fber);           //BY modify
1736*53ee8cc1Swenshuai.xi #else
1737*53ee8cc1Swenshuai.xi             log_ber = ( - 1.0f) *Log10Approx(1.0f / fber);      //BY modify
1738*53ee8cc1Swenshuai.xi #endif
1739*53ee8cc1Swenshuai.xi             DBG_INTERN_DVBS(printf("\nLog(BER) = %f\n",log_ber));
1740*53ee8cc1Swenshuai.xi #endif
1741*53ee8cc1Swenshuai.xi             if (fber > 2.5E-2)
1742*53ee8cc1Swenshuai.xi                 ber_sqi = 0.0;
1743*53ee8cc1Swenshuai.xi             else if(fber > 8.5E-7)
1744*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX
1745*53ee8cc1Swenshuai.xi                 ber_sqi = (log10f(1.0f/fber))*20.0f - 32.0f; //40.0f;
1746*53ee8cc1Swenshuai.xi #else
1747*53ee8cc1Swenshuai.xi                 ber_sqi = (Log10Approx(1.0f/fber))*20.0f - 32.0f;//40.0f;
1748*53ee8cc1Swenshuai.xi #endif
1749*53ee8cc1Swenshuai.xi             else
1750*53ee8cc1Swenshuai.xi                 ber_sqi = 100.0;
1751*53ee8cc1Swenshuai.xi 
1752*53ee8cc1Swenshuai.xi             status &= MDrv_DMD_DVBS_GetSNR(&f_snr);
1753*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","drv_DVBS_GetSNR = %d \n", (int)f_snr );
1754*53ee8cc1Swenshuai.xi             cn_rel = f_snr - fDVBS_SQI_CNref[_u8_DVBS2_CurrentCodeRateLocal];
1755*53ee8cc1Swenshuai.xi 
1756*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","fber = %f\n", fber );
1757*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","f_snr = %f\n", f_snr );
1758*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","cn_nordig_s1 = %f\n", fDVBS_SQI_CNref[_u8_DVBS2_CurrentCodeRateLocal] );
1759*53ee8cc1Swenshuai.xi 	     ULOGD("DEMOD","cn_rel = %f\n", cn_rel );
1760*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","ber_sqi = %f\n", ber_sqi );
1761*53ee8cc1Swenshuai.xi 
1762*53ee8cc1Swenshuai.xi             if (cn_rel < -7.0f)
1763*53ee8cc1Swenshuai.xi             {
1764*53ee8cc1Swenshuai.xi                 *u16Quality = 0;
1765*53ee8cc1Swenshuai.xi             }
1766*53ee8cc1Swenshuai.xi             else if (cn_rel < 3.0)
1767*53ee8cc1Swenshuai.xi             {
1768*53ee8cc1Swenshuai.xi                 *u16Quality = (MS_U16)(ber_sqi*((cn_rel - 3.0)/10.0 + 1.0));
1769*53ee8cc1Swenshuai.xi             }
1770*53ee8cc1Swenshuai.xi             else
1771*53ee8cc1Swenshuai.xi             {
1772*53ee8cc1Swenshuai.xi                 *u16Quality = (MS_U16)ber_sqi;
1773*53ee8cc1Swenshuai.xi             }
1774*53ee8cc1Swenshuai.xi 
1775*53ee8cc1Swenshuai.xi 
1776*53ee8cc1Swenshuai.xi         }
1777*53ee8cc1Swenshuai.xi             //INTERN_DVBS_GetTunrSignalLevel_PWR();//For Debug.
1778*53ee8cc1Swenshuai.xi             //ULOGD("DEMOD","Signal Quility(SQI) = %d\n", *u16Quality );
1779*53ee8cc1Swenshuai.xi             bRet= TRUE;
1780*53ee8cc1Swenshuai.xi     }
1781*53ee8cc1Swenshuai.xi     else
1782*53ee8cc1Swenshuai.xi     {
1783*53ee8cc1Swenshuai.xi         *u16Quality = 0;
1784*53ee8cc1Swenshuai.xi     }
1785*53ee8cc1Swenshuai.xi      bRet= TRUE;
1786*53ee8cc1Swenshuai.xi      sDMD_DVBS_Info.u16Quality=*u16Quality;
1787*53ee8cc1Swenshuai.xi   }
1788*53ee8cc1Swenshuai.xi   else
1789*53ee8cc1Swenshuai.xi   {
1790*53ee8cc1Swenshuai.xi     return false;
1791*53ee8cc1Swenshuai.xi   }
1792*53ee8cc1Swenshuai.xi   return bRet;
1793*53ee8cc1Swenshuai.xi }
1794*53ee8cc1Swenshuai.xi #endif
1795*53ee8cc1Swenshuai.xi 
1796*53ee8cc1Swenshuai.xi #ifdef CHIP_KAISER
MDrv_DMD_DVBS_ActiveDmdSwitch(MS_U8 demod_no)1797*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_ActiveDmdSwitch(MS_U8 demod_no)
1798*53ee8cc1Swenshuai.xi {
1799*53ee8cc1Swenshuai.xi   DVBS_ActiveDmdSwitch_PARAM Drv_DVBS_ActiveDmdSwitch_PARAM;
1800*53ee8cc1Swenshuai.xi   Drv_DVBS_ActiveDmdSwitch_PARAM.demod_no=demod_no;
1801*53ee8cc1Swenshuai.xi 
1802*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
1803*53ee8cc1Swenshuai.xi   {
1804*53ee8cc1Swenshuai.xi     UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_ActiveDmdSwitch,&Drv_DVBS_ActiveDmdSwitch_PARAM);
1805*53ee8cc1Swenshuai.xi   }
1806*53ee8cc1Swenshuai.xi   else
1807*53ee8cc1Swenshuai.xi   {
1808*53ee8cc1Swenshuai.xi     return false;
1809*53ee8cc1Swenshuai.xi   }
1810*53ee8cc1Swenshuai.xi 
1811*53ee8cc1Swenshuai.xi   return Drv_DVBS_ActiveDmdSwitch_PARAM.ret;
1812*53ee8cc1Swenshuai.xi  }
1813*53ee8cc1Swenshuai.xi #else
MDrv_DMD_DVBS_ActiveDmdSwitch(MS_U8 demod_no)1814*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_ActiveDmdSwitch(MS_U8 demod_no)
1815*53ee8cc1Swenshuai.xi {
1816*53ee8cc1Swenshuai.xi   ULOGD("DEMOD","Doesn't support DVBS_ActiveDmdSwitch function!!!\n");
1817*53ee8cc1Swenshuai.xi   return false;
1818*53ee8cc1Swenshuai.xi }
1819*53ee8cc1Swenshuai.xi #endif
1820*53ee8cc1Swenshuai.xi 
1821*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
MDrv_DMD_DVBS_GetSNR(float * fSNR)1822*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetSNR(float *fSNR)
1823*53ee8cc1Swenshuai.xi {
1824*53ee8cc1Swenshuai.xi     MS_U32 u32NDA_SNR_A =0;
1825*53ee8cc1Swenshuai.xi     MS_U32 u32NDA_SNR_AB =0;
1826*53ee8cc1Swenshuai.xi     //float NDA_SNR_A =0.0;
1827*53ee8cc1Swenshuai.xi     //float NDA_SNR_AB =0.0;
1828*53ee8cc1Swenshuai.xi     float NDA_SNR =0.0;
1829*53ee8cc1Swenshuai.xi     //double NDA_SNR_LINEAR=0.0;
1830*53ee8cc1Swenshuai.xi 
1831*53ee8cc1Swenshuai.xi   DVBS_GetSNR_PARAM Drv_DVBS_GetSNR_PARAM;
1832*53ee8cc1Swenshuai.xi   Drv_DVBS_GetSNR_PARAM.u32NDA_SNR_A=&u32NDA_SNR_A;
1833*53ee8cc1Swenshuai.xi   Drv_DVBS_GetSNR_PARAM.u32NDA_SNR_AB=&u32NDA_SNR_AB;
1834*53ee8cc1Swenshuai.xi   Drv_DVBS_GetSNR_PARAM.ret = false;
1835*53ee8cc1Swenshuai.xi 
1836*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
1837*53ee8cc1Swenshuai.xi   {
1838*53ee8cc1Swenshuai.xi      if  (u8DemodLockFlag == 0)
1839*53ee8cc1Swenshuai.xi     {
1840*53ee8cc1Swenshuai.xi     	Drv_DVBS_GetSNR_PARAM.ret=FALSE;
1841*53ee8cc1Swenshuai.xi     }
1842*53ee8cc1Swenshuai.xi     else
1843*53ee8cc1Swenshuai.xi     {
1844*53ee8cc1Swenshuai.xi        UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetSNR,&Drv_DVBS_GetSNR_PARAM);
1845*53ee8cc1Swenshuai.xi     }
1846*53ee8cc1Swenshuai.xi 
1847*53ee8cc1Swenshuai.xi      if (Drv_DVBS_GetSNR_PARAM.ret== FALSE)
1848*53ee8cc1Swenshuai.xi     {
1849*53ee8cc1Swenshuai.xi        ULOGD("DEMOD","DVBS_GetSNR Fail! \n");
1850*53ee8cc1Swenshuai.xi     }
1851*53ee8cc1Swenshuai.xi     else
1852*53ee8cc1Swenshuai.xi     {
1853*53ee8cc1Swenshuai.xi         #if 0
1854*53ee8cc1Swenshuai.xi         //NDA SNR
1855*53ee8cc1Swenshuai.xi         NDA_SNR_A=(float)u32NDA_SNR_A/65536;
1856*53ee8cc1Swenshuai.xi         NDA_SNR_AB=(float)u32NDA_SNR_AB/4194304;
1857*53ee8cc1Swenshuai.xi         //
1858*53ee8cc1Swenshuai.xi         //since support 16,32APSK we need to add judgement
1859*53ee8cc1Swenshuai.xi         if(modulation_order==4)
1860*53ee8cc1Swenshuai.xi             NDA_SNR_AB=(float)sqrt(NDA_SNR_AB/(2-1.252295758529242));//for 16APSK CR2/3
1861*53ee8cc1Swenshuai.xi         else if(modulation_order==5)//(2-1.41333232789)
1862*53ee8cc1Swenshuai.xi             NDA_SNR_AB=(float)sqrt(NDA_SNR_AB/(2-1.41333232789));//for 32APSK CR3/4
1863*53ee8cc1Swenshuai.xi         else
1864*53ee8cc1Swenshuai.xi             NDA_SNR_AB=(float)sqrt(NDA_SNR_AB);
1865*53ee8cc1Swenshuai.xi 
1866*53ee8cc1Swenshuai.xi         NDA_SNR_LINEAR =(1/((NDA_SNR_A/NDA_SNR_AB)-1)) ;
1867*53ee8cc1Swenshuai.xi 
1868*53ee8cc1Swenshuai.xi         if(NDA_SNR_LINEAR<=0)
1869*53ee8cc1Swenshuai.xi             NDA_SNR=1.0;
1870*53ee8cc1Swenshuai.xi         else
1871*53ee8cc1Swenshuai.xi              NDA_SNR=10*log10(NDA_SNR_LINEAR);
1872*53ee8cc1Swenshuai.xi 
1873*53ee8cc1Swenshuai.xi         //printf("[DVBS]: NDA_SNR ================================: %.1f\n", NDA_SNR);
1874*53ee8cc1Swenshuai.xi         //_f_DVBS_CurrentSNR = NDA_SNR;
1875*53ee8cc1Swenshuai.xi         /*
1876*53ee8cc1Swenshuai.xi             //[DVBS/S2, QPSK/8PSK, 1/2~9/10 the same CN]
1877*53ee8cc1Swenshuai.xi             snr_poly = 0.0;     //use Polynomial curve fitting to fix SNR
1878*53ee8cc1Swenshuai.xi             snr_poly = 0.005261367463671*pow(NDA_SNR, 3)-0.116517828301214*pow(NDA_SNR, 2)+0.744836970505452*pow(NDA_SNR, 1)-0.86727609780167;
1879*53ee8cc1Swenshuai.xi             Fixed_SNR = NDA_SNR + snr_poly;
1880*53ee8cc1Swenshuai.xi             //printf("[DVBS]: NDA_SNR + snr_poly =====================: %.1f\n", Fixed_SNR);
1881*53ee8cc1Swenshuai.xi 
1882*53ee8cc1Swenshuai.xi             if (Fixed_SNR < 17.0)
1883*53ee8cc1Swenshuai.xi                 Fixed_SNR = Fixed_SNR;
1884*53ee8cc1Swenshuai.xi             else if ((Fixed_SNR < 20.0) && (Fixed_SNR >= 17.0))
1885*53ee8cc1Swenshuai.xi                 Fixed_SNR = Fixed_SNR - 0.8;
1886*53ee8cc1Swenshuai.xi             else if ((Fixed_SNR < 22.5) && (Fixed_SNR >= 20.0))
1887*53ee8cc1Swenshuai.xi                 Fixed_SNR = Fixed_SNR - 2.0;
1888*53ee8cc1Swenshuai.xi             else if ((Fixed_SNR < 27.0) && (Fixed_SNR >= 22.5))
1889*53ee8cc1Swenshuai.xi                 Fixed_SNR = Fixed_SNR - 3.0;
1890*53ee8cc1Swenshuai.xi             else if ((Fixed_SNR < 29.0) && (Fixed_SNR >= 27.0))
1891*53ee8cc1Swenshuai.xi                 Fixed_SNR = Fixed_SNR - 3.5;
1892*53ee8cc1Swenshuai.xi             else if (Fixed_SNR >= 29.0)
1893*53ee8cc1Swenshuai.xi                 Fixed_SNR = Fixed_SNR - 3.0;
1894*53ee8cc1Swenshuai.xi 
1895*53ee8cc1Swenshuai.xi             if (Fixed_SNR < 1.0)
1896*53ee8cc1Swenshuai.xi                 Fixed_SNR = 1.0;
1897*53ee8cc1Swenshuai.xi             if (Fixed_SNR > 30.0)
1898*53ee8cc1Swenshuai.xi                 Fixed_SNR = 30.0;
1899*53ee8cc1Swenshuai.xi         */
1900*53ee8cc1Swenshuai.xi 
1901*53ee8cc1Swenshuai.xi         #endif
1902*53ee8cc1Swenshuai.xi 
1903*53ee8cc1Swenshuai.xi         NDA_SNR = u32NDA_SNR_A + ((float)u32NDA_SNR_AB / 256.0);
1904*53ee8cc1Swenshuai.xi 
1905*53ee8cc1Swenshuai.xi         *fSNR = NDA_SNR;
1906*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
1907*53ee8cc1Swenshuai.xi          ULOGD("DEMOD", "[DVBS]: NDA_SNR=============================: %.1f\n", NDA_SNR);
1908*53ee8cc1Swenshuai.xi         #endif
1909*53ee8cc1Swenshuai.xi     	}
1910*53ee8cc1Swenshuai.xi 
1911*53ee8cc1Swenshuai.xi 	Drv_DVBS_GetSNR_PARAM.ret = true;
1912*53ee8cc1Swenshuai.xi   }
1913*53ee8cc1Swenshuai.xi   else
1914*53ee8cc1Swenshuai.xi   {
1915*53ee8cc1Swenshuai.xi     return false;
1916*53ee8cc1Swenshuai.xi   }
1917*53ee8cc1Swenshuai.xi 
1918*53ee8cc1Swenshuai.xi   return Drv_DVBS_GetSNR_PARAM.ret;
1919*53ee8cc1Swenshuai.xi }
1920*53ee8cc1Swenshuai.xi #endif
1921*53ee8cc1Swenshuai.xi 
1922*53ee8cc1Swenshuai.xi #ifdef UFO_SUPPORT_KERNEL_FLOATING
MDrv_DMD_DVBS_GetSNR_Kernel(MS_FLOAT_ST * fSNR)1923*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetSNR_Kernel(MS_FLOAT_ST *fSNR)
1924*53ee8cc1Swenshuai.xi {
1925*53ee8cc1Swenshuai.xi     MS_U32 u32NDA_SNR_A =0;
1926*53ee8cc1Swenshuai.xi     MS_U32 u32NDA_SNR_AB =0;
1927*53ee8cc1Swenshuai.xi     //float NDA_SNR_A =0.0;
1928*53ee8cc1Swenshuai.xi     //float NDA_SNR_AB =0.0;
1929*53ee8cc1Swenshuai.xi     //float NDA_SNR =0.0;
1930*53ee8cc1Swenshuai.xi     MS_FLOAT_ST NDA_SNR;
1931*53ee8cc1Swenshuai.xi     //double NDA_SNR_LINEAR=0.0;
1932*53ee8cc1Swenshuai.xi 
1933*53ee8cc1Swenshuai.xi   DVBS_GetSNR_PARAM Drv_DVBS_GetSNR_PARAM;
1934*53ee8cc1Swenshuai.xi   Drv_DVBS_GetSNR_PARAM.u32NDA_SNR_A=&u32NDA_SNR_A;
1935*53ee8cc1Swenshuai.xi   Drv_DVBS_GetSNR_PARAM.u32NDA_SNR_AB=&u32NDA_SNR_AB;
1936*53ee8cc1Swenshuai.xi   Drv_DVBS_GetSNR_PARAM.ret = false;
1937*53ee8cc1Swenshuai.xi 
1938*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
1939*53ee8cc1Swenshuai.xi   {
1940*53ee8cc1Swenshuai.xi      if  (u8DemodLockFlag == 0)
1941*53ee8cc1Swenshuai.xi     {
1942*53ee8cc1Swenshuai.xi     	Drv_DVBS_GetSNR_PARAM.ret=FALSE;
1943*53ee8cc1Swenshuai.xi     }
1944*53ee8cc1Swenshuai.xi     else
1945*53ee8cc1Swenshuai.xi     {
1946*53ee8cc1Swenshuai.xi        UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetSNR,&Drv_DVBS_GetSNR_PARAM);
1947*53ee8cc1Swenshuai.xi     }
1948*53ee8cc1Swenshuai.xi 
1949*53ee8cc1Swenshuai.xi      if (Drv_DVBS_GetSNR_PARAM.ret== FALSE)
1950*53ee8cc1Swenshuai.xi     {
1951*53ee8cc1Swenshuai.xi        ULOGD("DEMOD","DVBS_GetSNR Fail! \n");
1952*53ee8cc1Swenshuai.xi     }
1953*53ee8cc1Swenshuai.xi     else
1954*53ee8cc1Swenshuai.xi     {
1955*53ee8cc1Swenshuai.xi         #if 0
1956*53ee8cc1Swenshuai.xi         //NDA SNR
1957*53ee8cc1Swenshuai.xi         NDA_SNR_A=(float)u32NDA_SNR_A/65536;
1958*53ee8cc1Swenshuai.xi         NDA_SNR_AB=(float)u32NDA_SNR_AB/4194304;
1959*53ee8cc1Swenshuai.xi         //
1960*53ee8cc1Swenshuai.xi         //since support 16,32APSK we need to add judgement
1961*53ee8cc1Swenshuai.xi         if(modulation_order==4)
1962*53ee8cc1Swenshuai.xi             NDA_SNR_AB=(float)sqrt(NDA_SNR_AB/(2-1.252295758529242));//for 16APSK CR2/3
1963*53ee8cc1Swenshuai.xi         else if(modulation_order==5)//(2-1.41333232789)
1964*53ee8cc1Swenshuai.xi             NDA_SNR_AB=(float)sqrt(NDA_SNR_AB/(2-1.41333232789));//for 32APSK CR3/4
1965*53ee8cc1Swenshuai.xi         else
1966*53ee8cc1Swenshuai.xi             NDA_SNR_AB=(float)sqrt(NDA_SNR_AB);
1967*53ee8cc1Swenshuai.xi 
1968*53ee8cc1Swenshuai.xi         NDA_SNR_LINEAR =(1/((NDA_SNR_A/NDA_SNR_AB)-1)) ;
1969*53ee8cc1Swenshuai.xi 
1970*53ee8cc1Swenshuai.xi         if(NDA_SNR_LINEAR<=0)
1971*53ee8cc1Swenshuai.xi             NDA_SNR=1.0;
1972*53ee8cc1Swenshuai.xi         else
1973*53ee8cc1Swenshuai.xi              NDA_SNR=10*log10(NDA_SNR_LINEAR);
1974*53ee8cc1Swenshuai.xi 
1975*53ee8cc1Swenshuai.xi         //printf("[DVBS]: NDA_SNR ================================: %.1f\n", NDA_SNR);
1976*53ee8cc1Swenshuai.xi         //_f_DVBS_CurrentSNR = NDA_SNR;
1977*53ee8cc1Swenshuai.xi         /*
1978*53ee8cc1Swenshuai.xi             //[DVBS/S2, QPSK/8PSK, 1/2~9/10 the same CN]
1979*53ee8cc1Swenshuai.xi             snr_poly = 0.0;     //use Polynomial curve fitting to fix SNR
1980*53ee8cc1Swenshuai.xi             snr_poly = 0.005261367463671*pow(NDA_SNR, 3)-0.116517828301214*pow(NDA_SNR, 2)+0.744836970505452*pow(NDA_SNR, 1)-0.86727609780167;
1981*53ee8cc1Swenshuai.xi             Fixed_SNR = NDA_SNR + snr_poly;
1982*53ee8cc1Swenshuai.xi             //printf("[DVBS]: NDA_SNR + snr_poly =====================: %.1f\n", Fixed_SNR);
1983*53ee8cc1Swenshuai.xi 
1984*53ee8cc1Swenshuai.xi             if (Fixed_SNR < 17.0)
1985*53ee8cc1Swenshuai.xi                 Fixed_SNR = Fixed_SNR;
1986*53ee8cc1Swenshuai.xi             else if ((Fixed_SNR < 20.0) && (Fixed_SNR >= 17.0))
1987*53ee8cc1Swenshuai.xi                 Fixed_SNR = Fixed_SNR - 0.8;
1988*53ee8cc1Swenshuai.xi             else if ((Fixed_SNR < 22.5) && (Fixed_SNR >= 20.0))
1989*53ee8cc1Swenshuai.xi                 Fixed_SNR = Fixed_SNR - 2.0;
1990*53ee8cc1Swenshuai.xi             else if ((Fixed_SNR < 27.0) && (Fixed_SNR >= 22.5))
1991*53ee8cc1Swenshuai.xi                 Fixed_SNR = Fixed_SNR - 3.0;
1992*53ee8cc1Swenshuai.xi             else if ((Fixed_SNR < 29.0) && (Fixed_SNR >= 27.0))
1993*53ee8cc1Swenshuai.xi                 Fixed_SNR = Fixed_SNR - 3.5;
1994*53ee8cc1Swenshuai.xi             else if (Fixed_SNR >= 29.0)
1995*53ee8cc1Swenshuai.xi                 Fixed_SNR = Fixed_SNR - 3.0;
1996*53ee8cc1Swenshuai.xi 
1997*53ee8cc1Swenshuai.xi             if (Fixed_SNR < 1.0)
1998*53ee8cc1Swenshuai.xi                 Fixed_SNR = 1.0;
1999*53ee8cc1Swenshuai.xi             if (Fixed_SNR > 30.0)
2000*53ee8cc1Swenshuai.xi                 Fixed_SNR = 30.0;
2001*53ee8cc1Swenshuai.xi         */
2002*53ee8cc1Swenshuai.xi 
2003*53ee8cc1Swenshuai.xi         #endif
2004*53ee8cc1Swenshuai.xi 
2005*53ee8cc1Swenshuai.xi         //NDA_SNR = u32NDA_SNR_A + ((float)u32NDA_SNR_AB / 256.0);
2006*53ee8cc1Swenshuai.xi 
2007*53ee8cc1Swenshuai.xi         NDA_SNR.DATA = ((u32NDA_SNR_A << 8) | u32NDA_SNR_AB);
2008*53ee8cc1Swenshuai.xi         NDA_SNR.EXP = -8;
2009*53ee8cc1Swenshuai.xi 
2010*53ee8cc1Swenshuai.xi         *fSNR = NDA_SNR;
2011*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
2012*53ee8cc1Swenshuai.xi          ULOGD("DEMOD", "[DVBS]: NDA_SNR=============================: %d*2^%d\n", NDA_SNR.DATA, NDA_SNR.EXP);
2013*53ee8cc1Swenshuai.xi         #endif
2014*53ee8cc1Swenshuai.xi     	}
2015*53ee8cc1Swenshuai.xi   }
2016*53ee8cc1Swenshuai.xi 
2017*53ee8cc1Swenshuai.xi   return Drv_DVBS_GetSNR_PARAM.ret;
2018*53ee8cc1Swenshuai.xi }
2019*53ee8cc1Swenshuai.xi #endif
2020*53ee8cc1Swenshuai.xi 
2021*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
MDrv_DMD_DVBS_GetPostViterbiBer(float * ber)2022*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetPostViterbiBer(float *ber)
2023*53ee8cc1Swenshuai.xi {
2024*53ee8cc1Swenshuai.xi   MS_U16 BitErrPeriod_reg;
2025*53ee8cc1Swenshuai.xi   MS_U32 BitErr_reg;
2026*53ee8cc1Swenshuai.xi 
2027*53ee8cc1Swenshuai.xi   DVBS_GetPostViterbiBer_PARAM Drv_DVBS_GetPostViterbiBer_PARAM;
2028*53ee8cc1Swenshuai.xi   Drv_DVBS_GetPostViterbiBer_PARAM.BitErr_reg=&BitErr_reg;
2029*53ee8cc1Swenshuai.xi   Drv_DVBS_GetPostViterbiBer_PARAM.BitErrPeriod_reg=&BitErrPeriod_reg;
2030*53ee8cc1Swenshuai.xi   Drv_DVBS_GetPostViterbiBer_PARAM.ret=false;
2031*53ee8cc1Swenshuai.xi 
2032*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
2033*53ee8cc1Swenshuai.xi   {
2034*53ee8cc1Swenshuai.xi     UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetPostViterbiBer,&Drv_DVBS_GetPostViterbiBer_PARAM);
2035*53ee8cc1Swenshuai.xi 
2036*53ee8cc1Swenshuai.xi     if (BitErrPeriod_reg == 0 )    //PRD
2037*53ee8cc1Swenshuai.xi         BitErrPeriod_reg = 1;
2038*53ee8cc1Swenshuai.xi 
2039*53ee8cc1Swenshuai.xi     if(_bDemodType) //DVBS2
2040*53ee8cc1Swenshuai.xi     {
2041*53ee8cc1Swenshuai.xi         if (BitErr_reg <= 0 )
2042*53ee8cc1Swenshuai.xi             *ber = 0.5f / (float)(BitErrPeriod_reg) / 64800.0;
2043*53ee8cc1Swenshuai.xi         else
2044*53ee8cc1Swenshuai.xi             *ber = (float)BitErr_reg / (float)(BitErrPeriod_reg) / 64800.0;
2045*53ee8cc1Swenshuai.xi 
2046*53ee8cc1Swenshuai.xi         if (*ber <= 0.0f)
2047*53ee8cc1Swenshuai.xi             *ber = 1.0e-10f;
2048*53ee8cc1Swenshuai.xi 
2049*53ee8cc1Swenshuai.xi         DMD_DBG(ULOGD("DEMOD","BER = %8.3e \n ", *ber));
2050*53ee8cc1Swenshuai.xi     }
2051*53ee8cc1Swenshuai.xi     else
2052*53ee8cc1Swenshuai.xi     {
2053*53ee8cc1Swenshuai.xi         if (BitErr_reg <= 0 )
2054*53ee8cc1Swenshuai.xi             *ber = 0.5f / ((float)BitErrPeriod_reg*128*188*8);
2055*53ee8cc1Swenshuai.xi         else
2056*53ee8cc1Swenshuai.xi             *ber = (float)BitErr_reg / ((float)BitErrPeriod_reg*128*188*8);
2057*53ee8cc1Swenshuai.xi 
2058*53ee8cc1Swenshuai.xi         if (*ber <= 0.0f)
2059*53ee8cc1Swenshuai.xi             *ber = 1.0e-10f;
2060*53ee8cc1Swenshuai.xi 
2061*53ee8cc1Swenshuai.xi         DMD_DBG(ULOGD("DEMOD","PostVitBER = %8.3e \n ", *ber));
2062*53ee8cc1Swenshuai.xi     }
2063*53ee8cc1Swenshuai.xi 
2064*53ee8cc1Swenshuai.xi     Drv_DVBS_GetPostViterbiBer_PARAM.ret=true;
2065*53ee8cc1Swenshuai.xi   }
2066*53ee8cc1Swenshuai.xi 
2067*53ee8cc1Swenshuai.xi   return Drv_DVBS_GetPostViterbiBer_PARAM.ret;
2068*53ee8cc1Swenshuai.xi }
2069*53ee8cc1Swenshuai.xi #endif
2070*53ee8cc1Swenshuai.xi 
2071*53ee8cc1Swenshuai.xi #ifdef UFO_SUPPORT_KERNEL_FLOATING
MDrv_DMD_DVBS_GetBER_Kernel(MS_FLOAT_ST * ber)2072*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetBER_Kernel(MS_FLOAT_ST *ber)
2073*53ee8cc1Swenshuai.xi {
2074*53ee8cc1Swenshuai.xi   MS_U16 BitErrPeriod_reg;
2075*53ee8cc1Swenshuai.xi   MS_U32 BitErr_reg;
2076*53ee8cc1Swenshuai.xi 
2077*53ee8cc1Swenshuai.xi   MS_FLOAT_ST temp;
2078*53ee8cc1Swenshuai.xi 
2079*53ee8cc1Swenshuai.xi   DVBS_GetPostViterbiBer_PARAM Drv_DVBS_GetPostViterbiBer_PARAM;
2080*53ee8cc1Swenshuai.xi   Drv_DVBS_GetPostViterbiBer_PARAM.BitErr_reg=&BitErr_reg;
2081*53ee8cc1Swenshuai.xi   Drv_DVBS_GetPostViterbiBer_PARAM.BitErrPeriod_reg=&BitErrPeriod_reg;
2082*53ee8cc1Swenshuai.xi   Drv_DVBS_GetPostViterbiBer_PARAM.ret=false;
2083*53ee8cc1Swenshuai.xi 
2084*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
2085*53ee8cc1Swenshuai.xi   {
2086*53ee8cc1Swenshuai.xi     UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetPostViterbiBer,&Drv_DVBS_GetPostViterbiBer_PARAM);
2087*53ee8cc1Swenshuai.xi 
2088*53ee8cc1Swenshuai.xi     if(BitErrPeriod_reg == 0)
2089*53ee8cc1Swenshuai.xi     {
2090*53ee8cc1Swenshuai.xi         (*ber).DATA = 1;
2091*53ee8cc1Swenshuai.xi         (*ber).EXP = 0;
2092*53ee8cc1Swenshuai.xi     }
2093*53ee8cc1Swenshuai.xi     else if(BitErr_reg == 0)
2094*53ee8cc1Swenshuai.xi     {
2095*53ee8cc1Swenshuai.xi         (*ber).DATA = 0;
2096*53ee8cc1Swenshuai.xi         (*ber).EXP = 0;
2097*53ee8cc1Swenshuai.xi     }
2098*53ee8cc1Swenshuai.xi     else
2099*53ee8cc1Swenshuai.xi     {
2100*53ee8cc1Swenshuai.xi         (*ber).DATA = BitErr_reg;
2101*53ee8cc1Swenshuai.xi         (*ber).EXP = 0;
2102*53ee8cc1Swenshuai.xi 
2103*53ee8cc1Swenshuai.xi         if(_bDemodType) //DVBS2
2104*53ee8cc1Swenshuai.xi         {
2105*53ee8cc1Swenshuai.xi             temp.DATA = BitErrPeriod_reg*64800;
2106*53ee8cc1Swenshuai.xi             temp.EXP = 0;
2107*53ee8cc1Swenshuai.xi         }
2108*53ee8cc1Swenshuai.xi         else
2109*53ee8cc1Swenshuai.xi         {
2110*53ee8cc1Swenshuai.xi             temp.DATA = BitErrPeriod_reg*128*188*8;
2111*53ee8cc1Swenshuai.xi             temp.EXP = 0;
2112*53ee8cc1Swenshuai.xi         }
2113*53ee8cc1Swenshuai.xi 
2114*53ee8cc1Swenshuai.xi         *ber = MS_FLOAT_OP(*ber, temp, divide);
2115*53ee8cc1Swenshuai.xi     }
2116*53ee8cc1Swenshuai.xi 
2117*53ee8cc1Swenshuai.xi     DMD_DBG(ULOGD("DEMOD","BER = %d*2^%d \n", (*ber).DATA, (*ber).EXP));
2118*53ee8cc1Swenshuai.xi   }
2119*53ee8cc1Swenshuai.xi 
2120*53ee8cc1Swenshuai.xi   return Drv_DVBS_GetPostViterbiBer_PARAM.ret;
2121*53ee8cc1Swenshuai.xi }
2122*53ee8cc1Swenshuai.xi #endif
MDrv_DMD_DVBS_GetPacketErr(MS_U16 * pktErr)2123*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetPacketErr(MS_U16 *pktErr)
2124*53ee8cc1Swenshuai.xi {
2125*53ee8cc1Swenshuai.xi     DVBS_GetPacketErr_PARAM Drv_DVBS_GetPacketErr_PARAM;
2126*53ee8cc1Swenshuai.xi     Drv_DVBS_GetPacketErr_PARAM.pktErr=pktErr;
2127*53ee8cc1Swenshuai.xi     Drv_DVBS_GetPacketErr_PARAM.ret=false;
2128*53ee8cc1Swenshuai.xi 
2129*53ee8cc1Swenshuai.xi     if(u32DVBSopen==1)
2130*53ee8cc1Swenshuai.xi     {
2131*53ee8cc1Swenshuai.xi         UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetPacketErr,&Drv_DVBS_GetPacketErr_PARAM);
2132*53ee8cc1Swenshuai.xi     }
2133*53ee8cc1Swenshuai.xi 
2134*53ee8cc1Swenshuai.xi     return Drv_DVBS_GetPacketErr_PARAM.ret;
2135*53ee8cc1Swenshuai.xi }
2136*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_GetCellID(MS_U16 * u16CellID)2137*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetCellID(MS_U16 *u16CellID)
2138*53ee8cc1Swenshuai.xi {
2139*53ee8cc1Swenshuai.xi   DVBS_GetCellID_PARAM Drv_DVBS_GetCellID_PARAM;
2140*53ee8cc1Swenshuai.xi   Drv_DVBS_GetCellID_PARAM.u16CellID=u16CellID;
2141*53ee8cc1Swenshuai.xi   Drv_DVBS_GetCellID_PARAM.ret=false;
2142*53ee8cc1Swenshuai.xi 
2143*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
2144*53ee8cc1Swenshuai.xi   {
2145*53ee8cc1Swenshuai.xi     UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetCellID,&Drv_DVBS_GetCellID_PARAM);
2146*53ee8cc1Swenshuai.xi   }
2147*53ee8cc1Swenshuai.xi   else
2148*53ee8cc1Swenshuai.xi   {
2149*53ee8cc1Swenshuai.xi     return false;
2150*53ee8cc1Swenshuai.xi   }
2151*53ee8cc1Swenshuai.xi 
2152*53ee8cc1Swenshuai.xi   return Drv_DVBS_GetCellID_PARAM.ret;
2153*53ee8cc1Swenshuai.xi 
2154*53ee8cc1Swenshuai.xi }
2155*53ee8cc1Swenshuai.xi 
2156*53ee8cc1Swenshuai.xi 
2157*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
MDrv_DMD_DVBS_GetStatus(DMD_DVBS_MODULATION_TYPE * pQAMMode,MS_U32 * u32SymbolRate,float * pFreqOff)2158*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_GetStatus(DMD_DVBS_MODULATION_TYPE *pQAMMode, MS_U32 *u32SymbolRate, float *pFreqOff)
2159*53ee8cc1Swenshuai.xi {
2160*53ee8cc1Swenshuai.xi   MS_S16 s16CFO=0;
2161*53ee8cc1Swenshuai.xi 
2162*53ee8cc1Swenshuai.xi   DVBS_GetStatus_PARAM Drv_DVBS_GetStatus_PARAM;
2163*53ee8cc1Swenshuai.xi   Drv_DVBS_GetStatus_PARAM.pQAMMode=pQAMMode;
2164*53ee8cc1Swenshuai.xi   Drv_DVBS_GetStatus_PARAM.u32SymbolRate=u32SymbolRate;
2165*53ee8cc1Swenshuai.xi   Drv_DVBS_GetStatus_PARAM.s16CFO=&s16CFO;
2166*53ee8cc1Swenshuai.xi   Drv_DVBS_GetStatus_PARAM.ret=false;
2167*53ee8cc1Swenshuai.xi 
2168*53ee8cc1Swenshuai.xi   //float f_Fc, FreqCfo_offset;
2169*53ee8cc1Swenshuai.xi 
2170*53ee8cc1Swenshuai.xi   if(u32DVBSopen==1)
2171*53ee8cc1Swenshuai.xi   {
2172*53ee8cc1Swenshuai.xi     UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_GetStatus,&Drv_DVBS_GetStatus_PARAM);
2173*53ee8cc1Swenshuai.xi       if(abs(s16CFO)%1000 >= 500)
2174*53ee8cc1Swenshuai.xi       {
2175*53ee8cc1Swenshuai.xi     	   if(s16CFO < 0)
2176*53ee8cc1Swenshuai.xi     		*pFreqOff=(s16CFO/1000)-1.0;
2177*53ee8cc1Swenshuai.xi     	   else
2178*53ee8cc1Swenshuai.xi     		*pFreqOff=(s16CFO/1000)+1.0;
2179*53ee8cc1Swenshuai.xi       }
2180*53ee8cc1Swenshuai.xi       else
2181*53ee8cc1Swenshuai.xi     	   *pFreqOff = s16CFO/1000;
2182*53ee8cc1Swenshuai.xi 
2183*53ee8cc1Swenshuai.xi     *pQAMMode = *(Drv_DVBS_GetStatus_PARAM.pQAMMode);
2184*53ee8cc1Swenshuai.xi     *u32SymbolRate = *(Drv_DVBS_GetStatus_PARAM.u32SymbolRate);
2185*53ee8cc1Swenshuai.xi 
2186*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
2187*53ee8cc1Swenshuai.xi     if (_u8DMD_DVBS_DbgLevel >= DMD_DVBS_DBGLV_INFO)
2188*53ee8cc1Swenshuai.xi     {
2189*53ee8cc1Swenshuai.xi         ULOGD("DEMOD","MDrv_DMD_DVBS_GetStatus %d %d %f \n", *pQAMMode, *u32SymbolRate, *pFreqOff);
2190*53ee8cc1Swenshuai.xi     }
2191*53ee8cc1Swenshuai.xi     #endif
2192*53ee8cc1Swenshuai.xi   }
2193*53ee8cc1Swenshuai.xi   else
2194*53ee8cc1Swenshuai.xi   {
2195*53ee8cc1Swenshuai.xi     return false;
2196*53ee8cc1Swenshuai.xi   }
2197*53ee8cc1Swenshuai.xi 
2198*53ee8cc1Swenshuai.xi   return Drv_DVBS_GetStatus_PARAM.ret;
2199*53ee8cc1Swenshuai.xi }
2200*53ee8cc1Swenshuai.xi #endif
2201*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_SetPowerState(EN_POWER_MODE u16PowerState)2202*53ee8cc1Swenshuai.xi MS_U32 MDrv_DMD_DVBS_SetPowerState(EN_POWER_MODE u16PowerState)
2203*53ee8cc1Swenshuai.xi {
2204*53ee8cc1Swenshuai.xi     DVBS_SetPowerState_PARAM Drv_DVBS_SetPowerState_PARAM;
2205*53ee8cc1Swenshuai.xi     Drv_DVBS_SetPowerState_PARAM.u16PowerState=u16PowerState;
2206*53ee8cc1Swenshuai.xi     Drv_DVBS_SetPowerState_PARAM.ret_U32=false;
2207*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_SetPowerState\n"));
2208*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2209*53ee8cc1Swenshuai.xi    {
2210*53ee8cc1Swenshuai.xi   UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_SetPowerState,&Drv_DVBS_SetPowerState_PARAM);
2211*53ee8cc1Swenshuai.xi    }
2212*53ee8cc1Swenshuai.xi    else
2213*53ee8cc1Swenshuai.xi    {
2214*53ee8cc1Swenshuai.xi   return false;
2215*53ee8cc1Swenshuai.xi     }
2216*53ee8cc1Swenshuai.xi 
2217*53ee8cc1Swenshuai.xi     return Drv_DVBS_SetPowerState_PARAM.ret_U32;
2218*53ee8cc1Swenshuai.xi }
2219*53ee8cc1Swenshuai.xi 
2220*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
MDrv_DMD_DVBS_Get_FreqOffset(float * pFreqOff,MS_U8 u8BW)2221*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_Get_FreqOffset(float *pFreqOff, MS_U8 u8BW)
2222*53ee8cc1Swenshuai.xi {
2223*53ee8cc1Swenshuai.xi     MS_S16 s16CFO=0;
2224*53ee8cc1Swenshuai.xi     DVBS_Get_FreqOffset_PARAM Drv_DVBS_Get_FreqOffset_PARAM;
2225*53ee8cc1Swenshuai.xi     Drv_DVBS_Get_FreqOffset_PARAM.s16CFO=&s16CFO;
2226*53ee8cc1Swenshuai.xi     Drv_DVBS_Get_FreqOffset_PARAM.bRet=false;
2227*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_Get_FreqOffset\n"));
2228*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2229*53ee8cc1Swenshuai.xi    {
2230*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_Get_FreqOffset,&Drv_DVBS_Get_FreqOffset_PARAM);
2231*53ee8cc1Swenshuai.xi       if(abs(s16CFO)%1000 >= 500)
2232*53ee8cc1Swenshuai.xi       {
2233*53ee8cc1Swenshuai.xi     	   if(s16CFO < 0)
2234*53ee8cc1Swenshuai.xi     		*pFreqOff=(s16CFO/1000)-1.0;
2235*53ee8cc1Swenshuai.xi     	   else
2236*53ee8cc1Swenshuai.xi     		*pFreqOff=(s16CFO/1000)+1.0;
2237*53ee8cc1Swenshuai.xi       }
2238*53ee8cc1Swenshuai.xi       else
2239*53ee8cc1Swenshuai.xi     	   *pFreqOff = s16CFO/1000;
2240*53ee8cc1Swenshuai.xi 	  #ifdef MS_DEBUG
2241*53ee8cc1Swenshuai.xi 	   ULOGD("DEMOD","MDrv_DMD_DVBS_Get_FreqOffset %f \n", *pFreqOff);
2242*53ee8cc1Swenshuai.xi          #endif
2243*53ee8cc1Swenshuai.xi           //DBG_INTERN_DVBS(printf(">>> INTERN_DVBS_Get_FreqOffset *pFreqOff = %d[MHz] <<<\n", (MS_S16)*pFreqOff));
2244*53ee8cc1Swenshuai.xi    }
2245*53ee8cc1Swenshuai.xi    else
2246*53ee8cc1Swenshuai.xi    {
2247*53ee8cc1Swenshuai.xi       return false;
2248*53ee8cc1Swenshuai.xi    }
2249*53ee8cc1Swenshuai.xi 
2250*53ee8cc1Swenshuai.xi    return Drv_DVBS_Get_FreqOffset_PARAM.bRet;
2251*53ee8cc1Swenshuai.xi }
2252*53ee8cc1Swenshuai.xi #endif
2253*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_BlindScan_Start(MS_U16 u16StartFreq,MS_U16 u16EndFreq)2254*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_BlindScan_Start(MS_U16 u16StartFreq, MS_U16 u16EndFreq)
2255*53ee8cc1Swenshuai.xi {
2256*53ee8cc1Swenshuai.xi     DVBS_BlindScan_Start_PARAM Drv_DVBS_BlindScan_Start_PARAM;
2257*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_Start_PARAM.u16StartFreq=u16StartFreq;
2258*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_Start_PARAM.u16EndFreq=u16EndFreq;
2259*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_Start_PARAM.bRet=false;
2260*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_BlindScan_Start\n"));
2261*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2262*53ee8cc1Swenshuai.xi    {
2263*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_BlindScan_Start,&Drv_DVBS_BlindScan_Start_PARAM);
2264*53ee8cc1Swenshuai.xi    }
2265*53ee8cc1Swenshuai.xi    else
2266*53ee8cc1Swenshuai.xi    {
2267*53ee8cc1Swenshuai.xi       return false;
2268*53ee8cc1Swenshuai.xi    }
2269*53ee8cc1Swenshuai.xi 
2270*53ee8cc1Swenshuai.xi    return Drv_DVBS_BlindScan_Start_PARAM.bRet;
2271*53ee8cc1Swenshuai.xi }
2272*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_BlindScan_NextFreq(MS_BOOL * bBlindScanEnd)2273*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_BlindScan_NextFreq(MS_BOOL* bBlindScanEnd)
2274*53ee8cc1Swenshuai.xi {
2275*53ee8cc1Swenshuai.xi     DVBS_BlindScan_NextFreq_PARAM Drv_DVBS_BlindScan_NextFreq_PARAM;
2276*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_NextFreq_PARAM.bBlindScanEnd=bBlindScanEnd;
2277*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_NextFreq_PARAM.bRet=false;
2278*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_BlindScan_NextFreq\n"));
2279*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2280*53ee8cc1Swenshuai.xi    {
2281*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_BlindScan_NextFreq,&Drv_DVBS_BlindScan_NextFreq_PARAM);
2282*53ee8cc1Swenshuai.xi    }
2283*53ee8cc1Swenshuai.xi    else
2284*53ee8cc1Swenshuai.xi    {
2285*53ee8cc1Swenshuai.xi       return false;
2286*53ee8cc1Swenshuai.xi    }
2287*53ee8cc1Swenshuai.xi 
2288*53ee8cc1Swenshuai.xi    return Drv_DVBS_BlindScan_NextFreq_PARAM.bRet;
2289*53ee8cc1Swenshuai.xi }
2290*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_BlindScan_Cancel(void)2291*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_BlindScan_Cancel(void)
2292*53ee8cc1Swenshuai.xi {
2293*53ee8cc1Swenshuai.xi     DVBS_BlindScan_Cancel_PARAM Drv_DVBS_BlindScan_Cancel_PARAM;
2294*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_Cancel_PARAM.bRet=false;
2295*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_BlindScan_Cancel\n"));
2296*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2297*53ee8cc1Swenshuai.xi    {
2298*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_BlindScan_Cancel,&Drv_DVBS_BlindScan_Cancel_PARAM);
2299*53ee8cc1Swenshuai.xi    }
2300*53ee8cc1Swenshuai.xi    else
2301*53ee8cc1Swenshuai.xi    {
2302*53ee8cc1Swenshuai.xi       return false;
2303*53ee8cc1Swenshuai.xi    }
2304*53ee8cc1Swenshuai.xi 
2305*53ee8cc1Swenshuai.xi    return Drv_DVBS_BlindScan_Cancel_PARAM.bRet;
2306*53ee8cc1Swenshuai.xi }
2307*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_BlindScan_End(void)2308*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_BlindScan_End(void)
2309*53ee8cc1Swenshuai.xi {
2310*53ee8cc1Swenshuai.xi     DVBS_BlindScan_End_PARAM Drv_DVBS_Blindscan_End_PARAM;
2311*53ee8cc1Swenshuai.xi     Drv_DVBS_Blindscan_End_PARAM.bRet=false;
2312*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_BlindScan_End\n"));
2313*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2314*53ee8cc1Swenshuai.xi    {
2315*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_BlindScan_End,&Drv_DVBS_Blindscan_End_PARAM);
2316*53ee8cc1Swenshuai.xi    }
2317*53ee8cc1Swenshuai.xi    else
2318*53ee8cc1Swenshuai.xi    {
2319*53ee8cc1Swenshuai.xi       return false;
2320*53ee8cc1Swenshuai.xi    }
2321*53ee8cc1Swenshuai.xi 
2322*53ee8cc1Swenshuai.xi    return Drv_DVBS_Blindscan_End_PARAM.bRet;
2323*53ee8cc1Swenshuai.xi }
2324*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_BlindScan_GetChannel(MS_U16 u16ReadStart,MS_U16 * u16TPNum,HAL_DEMOD_MS_FE_CARRIER_PARAM * pTable)2325*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_BlindScan_GetChannel(MS_U16 u16ReadStart, MS_U16* u16TPNum, HAL_DEMOD_MS_FE_CARRIER_PARAM *pTable)
2326*53ee8cc1Swenshuai.xi {
2327*53ee8cc1Swenshuai.xi     DVBS_BlindScan_GetChannel_PARAM Drv_DVBS_BlindScan_Getchannel_PARAM;
2328*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_Getchannel_PARAM.u16ReadStart=u16ReadStart;
2329*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_Getchannel_PARAM.u16TPNum=u16TPNum;
2330*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_Getchannel_PARAM.pTable=pTable;
2331*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_Getchannel_PARAM.bRet=false;
2332*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_BlindScan_GetChannel\n"));
2333*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2334*53ee8cc1Swenshuai.xi    {
2335*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_BlindScan_GetChannel,&Drv_DVBS_BlindScan_Getchannel_PARAM);
2336*53ee8cc1Swenshuai.xi    }
2337*53ee8cc1Swenshuai.xi    else
2338*53ee8cc1Swenshuai.xi    {
2339*53ee8cc1Swenshuai.xi       return false;
2340*53ee8cc1Swenshuai.xi    }
2341*53ee8cc1Swenshuai.xi 
2342*53ee8cc1Swenshuai.xi    return Drv_DVBS_BlindScan_Getchannel_PARAM.bRet;
2343*53ee8cc1Swenshuai.xi }
2344*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_BlindScan_GetCurrentFreq(MS_U32 * u32CurrentFreq)2345*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_BlindScan_GetCurrentFreq(MS_U32 *u32CurrentFreq)
2346*53ee8cc1Swenshuai.xi {
2347*53ee8cc1Swenshuai.xi     DVBS_BlindScan_GetCurrentFreq_PARAM Drv_DVBS_BlindScan_GetCurrentFreq_PARAM;
2348*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_GetCurrentFreq_PARAM.u32CurrentFreq=u32CurrentFreq;
2349*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_GetCurrentFreq_PARAM.bRet=false;
2350*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_BlindScan_GetCurrentFreq\n"));
2351*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2352*53ee8cc1Swenshuai.xi    {
2353*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_BlindScan_GetCurrentFreq,&Drv_DVBS_BlindScan_GetCurrentFreq_PARAM);
2354*53ee8cc1Swenshuai.xi    }
2355*53ee8cc1Swenshuai.xi    else
2356*53ee8cc1Swenshuai.xi    {
2357*53ee8cc1Swenshuai.xi       return false;
2358*53ee8cc1Swenshuai.xi    }
2359*53ee8cc1Swenshuai.xi 
2360*53ee8cc1Swenshuai.xi    return Drv_DVBS_BlindScan_GetCurrentFreq_PARAM.bRet;
2361*53ee8cc1Swenshuai.xi }
2362*53ee8cc1Swenshuai.xi 
2363*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
MDrv_DMD_DVBS_BlindScan_WaitCurFreqFinished(MS_U8 * u8Progress,MS_U8 * u8FindNum)2364*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_BlindScan_WaitCurFreqFinished(MS_U8* u8Progress,MS_U8 *u8FindNum)
2365*53ee8cc1Swenshuai.xi {
2366*53ee8cc1Swenshuai.xi     MS_U8 substate_reg=2;
2367*53ee8cc1Swenshuai.xi     MS_U32 u32Data=0;
2368*53ee8cc1Swenshuai.xi     MS_U16 symbolrate_reg=0;
2369*53ee8cc1Swenshuai.xi     MS_U16 CFO_reg;
2370*53ee8cc1Swenshuai.xi     DVBS_BlindScan_WaitCurFreqFinished_PARAM Drv_DVBS_BlindScan_WaitCurFreqFinished_PARAM;
2371*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_WaitCurFreqFinished_PARAM.u8Progress=u8Progress;
2372*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_WaitCurFreqFinished_PARAM.u8FindNum=u8FindNum;
2373*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_WaitCurFreqFinished_PARAM.substate_reg=&substate_reg;
2374*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_WaitCurFreqFinished_PARAM.u32Data=&u32Data;
2375*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_WaitCurFreqFinished_PARAM.symbolrate_reg=&symbolrate_reg;
2376*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_WaitCurFreqFinished_PARAM.CFO_reg=&CFO_reg;
2377*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_WaitCurFreqFinished_PARAM.bRet=false;
2378*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_BlindScan_WaitCurFreqFinished\n"));
2379*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2380*53ee8cc1Swenshuai.xi    {
2381*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_BlindScan_WaitCurFreqFinished,&Drv_DVBS_BlindScan_WaitCurFreqFinished_PARAM);
2382*53ee8cc1Swenshuai.xi 
2383*53ee8cc1Swenshuai.xi         substate_reg = *Drv_DVBS_BlindScan_WaitCurFreqFinished_PARAM.substate_reg;
2384*53ee8cc1Swenshuai.xi         u32Data = *Drv_DVBS_BlindScan_WaitCurFreqFinished_PARAM.u32Data;
2385*53ee8cc1Swenshuai.xi         symbolrate_reg = *Drv_DVBS_BlindScan_WaitCurFreqFinished_PARAM.symbolrate_reg;
2386*53ee8cc1Swenshuai.xi         CFO_reg = *Drv_DVBS_BlindScan_WaitCurFreqFinished_PARAM.CFO_reg;
2387*53ee8cc1Swenshuai.xi         //CFO_reg = 0;
2388*53ee8cc1Swenshuai.xi 
2389*53ee8cc1Swenshuai.xi       if(substate_reg==0)
2390*53ee8cc1Swenshuai.xi       {
2391*53ee8cc1Swenshuai.xi         _u16ChannelInfoArray[0][_u16ChannelInfoIndex]=((u32Data+500)/1000);
2392*53ee8cc1Swenshuai.xi         _u16LockedCenterFreq=((u32Data+500)/1000);                //Center Freq
2393*53ee8cc1Swenshuai.xi         _u16ChannelInfoArray[1][_u16ChannelInfoIndex]=(symbolrate_reg);//Symbol Rate
2394*53ee8cc1Swenshuai.xi         _u16LockedSymbolRate=symbolrate_reg;
2395*53ee8cc1Swenshuai.xi         _u16ChannelInfoIndex++;
2396*53ee8cc1Swenshuai.xi         *u8FindNum=_u16ChannelInfoIndex;
2397*53ee8cc1Swenshuai.xi 	 if (CFO_reg*1000 >= 0x8000)
2398*53ee8cc1Swenshuai.xi         {
2399*53ee8cc1Swenshuai.xi            CFO_reg=0x10000- CFO_reg*1000;
2400*53ee8cc1Swenshuai.xi            _s16CurrentCFO=-1*CFO_reg/1000;
2401*53ee8cc1Swenshuai.xi         }
2402*53ee8cc1Swenshuai.xi         else
2403*53ee8cc1Swenshuai.xi         {
2404*53ee8cc1Swenshuai.xi            _s16CurrentCFO=CFO_reg;
2405*53ee8cc1Swenshuai.xi         }
2406*53ee8cc1Swenshuai.xi         DMD_DBG(ULOGD("DEMOD","Current Locked CF:%d BW:%d CFO:%d \n ", _u16LockedCenterFreq, _u16LockedSymbolRate, _s16CurrentCFO));
2407*53ee8cc1Swenshuai.xi       }
2408*53ee8cc1Swenshuai.xi       else if(substate_reg==1)
2409*53ee8cc1Swenshuai.xi       {
2410*53ee8cc1Swenshuai.xi          if (CFO_reg*1000 >= 0x8000)
2411*53ee8cc1Swenshuai.xi          {
2412*53ee8cc1Swenshuai.xi                 CFO_reg=0x1000- CFO_reg*1000;
2413*53ee8cc1Swenshuai.xi                 _s16CurrentCFO=-1*CFO_reg/1000;
2414*53ee8cc1Swenshuai.xi          }
2415*53ee8cc1Swenshuai.xi          else
2416*53ee8cc1Swenshuai.xi          {
2417*53ee8cc1Swenshuai.xi                 _s16CurrentCFO=CFO_reg;
2418*53ee8cc1Swenshuai.xi          }
2419*53ee8cc1Swenshuai.xi          DMD_DBG(ULOGD("DEMOD","Pre Locked CF:%d BW:%d CFO:%d \n ", _u16LockedCenterFreq, _u16LockedSymbolRate, _s16CurrentCFO));
2420*53ee8cc1Swenshuai.xi       }
2421*53ee8cc1Swenshuai.xi       DMD_DBG(ULOGD("DEMOD","MDrv_Demod_BlindScan_WaitCurFreqFinished- u8Progress: %d u8FindNum %d\n", *u8Progress, *u8FindNum));
2422*53ee8cc1Swenshuai.xi 
2423*53ee8cc1Swenshuai.xi    }
2424*53ee8cc1Swenshuai.xi    else
2425*53ee8cc1Swenshuai.xi    {
2426*53ee8cc1Swenshuai.xi       return false;
2427*53ee8cc1Swenshuai.xi    }
2428*53ee8cc1Swenshuai.xi 
2429*53ee8cc1Swenshuai.xi    return Drv_DVBS_BlindScan_WaitCurFreqFinished_PARAM.bRet;
2430*53ee8cc1Swenshuai.xi }
2431*53ee8cc1Swenshuai.xi #endif
2432*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_BlindScan_GetTunerFreq_EX(MS_U16 * u16TunerCenterFreq,MS_U16 * u16TunerCutOffFreq)2433*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_BlindScan_GetTunerFreq_EX(MS_U16 *u16TunerCenterFreq, MS_U16 *u16TunerCutOffFreq)
2434*53ee8cc1Swenshuai.xi {
2435*53ee8cc1Swenshuai.xi     DVBS_BlindScan_GetTunerFreq_PARAM Drv_DVBS_BlindScan_GetTunerFreq_PARAM;
2436*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_GetTunerFreq_PARAM.u16TunerCenterFreq=u16TunerCenterFreq;
2437*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_GetTunerFreq_PARAM.u16TunerCutOffFreq=u16TunerCutOffFreq;
2438*53ee8cc1Swenshuai.xi     Drv_DVBS_BlindScan_GetTunerFreq_PARAM.bRet=false;
2439*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_BlindScan_GetTunerFreq_EX\n"));
2440*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2441*53ee8cc1Swenshuai.xi    {
2442*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_BlindScan_GetTunerFreq,&Drv_DVBS_BlindScan_GetTunerFreq_PARAM);
2443*53ee8cc1Swenshuai.xi    }
2444*53ee8cc1Swenshuai.xi    else
2445*53ee8cc1Swenshuai.xi    {
2446*53ee8cc1Swenshuai.xi       return false;
2447*53ee8cc1Swenshuai.xi    }
2448*53ee8cc1Swenshuai.xi 
2449*53ee8cc1Swenshuai.xi    return Drv_DVBS_BlindScan_GetTunerFreq_PARAM.bRet;
2450*53ee8cc1Swenshuai.xi }
2451*53ee8cc1Swenshuai.xi 
2452*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_DMD_DVBS_DiSEqC_Init(void)2453*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_DiSEqC_Init(void)
2454*53ee8cc1Swenshuai.xi {
2455*53ee8cc1Swenshuai.xi     DVBS_DiSEqC_Init_PARAM Drv_DVBS_DiSEqC_Init_PARAM;
2456*53ee8cc1Swenshuai.xi     Drv_DVBS_DiSEqC_Init_PARAM.bRet=false;
2457*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_DiSEqC_Init\n"));
2458*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2459*53ee8cc1Swenshuai.xi    {
2460*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_DiSEqC_Init,&Drv_DVBS_DiSEqC_Init_PARAM);
2461*53ee8cc1Swenshuai.xi    }
2462*53ee8cc1Swenshuai.xi    else
2463*53ee8cc1Swenshuai.xi    {
2464*53ee8cc1Swenshuai.xi       return false;
2465*53ee8cc1Swenshuai.xi    }
2466*53ee8cc1Swenshuai.xi    return Drv_DVBS_DiSEqC_Init_PARAM.bRet;
2467*53ee8cc1Swenshuai.xi }
2468*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_DiSEqC_SetLNBOut(MS_BOOL bLow)2469*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_DiSEqC_SetLNBOut(MS_BOOL bLow)
2470*53ee8cc1Swenshuai.xi {
2471*53ee8cc1Swenshuai.xi     DVBS_DiSEqC_SetLNBOut_PARAM Drv_DVBS_DiSEqC_SetLNBOut_PARAM;
2472*53ee8cc1Swenshuai.xi     Drv_DVBS_DiSEqC_SetLNBOut_PARAM.bLow=bLow;
2473*53ee8cc1Swenshuai.xi     Drv_DVBS_DiSEqC_SetLNBOut_PARAM.bRet=false;
2474*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_DiSEqC_SetLNBOut\n"));
2475*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2476*53ee8cc1Swenshuai.xi    {
2477*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_DiSEqC_SetLNBOut,&Drv_DVBS_DiSEqC_SetLNBOut_PARAM);
2478*53ee8cc1Swenshuai.xi    }
2479*53ee8cc1Swenshuai.xi    else
2480*53ee8cc1Swenshuai.xi    {
2481*53ee8cc1Swenshuai.xi       return false;
2482*53ee8cc1Swenshuai.xi    }
2483*53ee8cc1Swenshuai.xi    return Drv_DVBS_DiSEqC_SetLNBOut_PARAM.bRet;
2484*53ee8cc1Swenshuai.xi }
2485*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_DiSEqC_GetLNBOut(MS_BOOL * bLNBOutLow)2486*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_DiSEqC_GetLNBOut(MS_BOOL* bLNBOutLow)
2487*53ee8cc1Swenshuai.xi {
2488*53ee8cc1Swenshuai.xi     DVBS_DiSEqC_GetLNBOut_PARAM Drv_DVBS_DiSEqC_GetLNBOut_PARAM;
2489*53ee8cc1Swenshuai.xi     Drv_DVBS_DiSEqC_GetLNBOut_PARAM.bLNBOutLow=bLNBOutLow;
2490*53ee8cc1Swenshuai.xi     Drv_DVBS_DiSEqC_GetLNBOut_PARAM.bRet=false;
2491*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_DiSEqC_GetLNBOut\n"));
2492*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2493*53ee8cc1Swenshuai.xi    {
2494*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_DiSEqC_GetLNBOut,&Drv_DVBS_DiSEqC_GetLNBOut_PARAM);
2495*53ee8cc1Swenshuai.xi    }
2496*53ee8cc1Swenshuai.xi    else
2497*53ee8cc1Swenshuai.xi    {
2498*53ee8cc1Swenshuai.xi       return false;
2499*53ee8cc1Swenshuai.xi    }
2500*53ee8cc1Swenshuai.xi    return Drv_DVBS_DiSEqC_GetLNBOut_PARAM.bRet;
2501*53ee8cc1Swenshuai.xi }
2502*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_DiSEqC_Set22kOnOff(MS_BOOL b22kOn)2503*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_DiSEqC_Set22kOnOff(MS_BOOL b22kOn)
2504*53ee8cc1Swenshuai.xi {
2505*53ee8cc1Swenshuai.xi     DVBS_DiSEqC_Set22kOnOff_PARAM Drv_DVBS_DiSEqC_Set22kOnOff_PARAM;
2506*53ee8cc1Swenshuai.xi     Drv_DVBS_DiSEqC_Set22kOnOff_PARAM.b22kOn=b22kOn;
2507*53ee8cc1Swenshuai.xi     Drv_DVBS_DiSEqC_Set22kOnOff_PARAM.bRet=false;
2508*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_DiSEqC_Set22kOnOff\n"));
2509*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2510*53ee8cc1Swenshuai.xi    {
2511*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_DiSEqC_Set22kOnOff,&Drv_DVBS_DiSEqC_Set22kOnOff_PARAM);
2512*53ee8cc1Swenshuai.xi    }
2513*53ee8cc1Swenshuai.xi    else
2514*53ee8cc1Swenshuai.xi    {
2515*53ee8cc1Swenshuai.xi       return false;
2516*53ee8cc1Swenshuai.xi    }
2517*53ee8cc1Swenshuai.xi    return Drv_DVBS_DiSEqC_Set22kOnOff_PARAM.bRet;
2518*53ee8cc1Swenshuai.xi }
2519*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_DiSEqC_Get22kOnOff(MS_BOOL * b22kOn)2520*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_DiSEqC_Get22kOnOff(MS_BOOL* b22kOn)
2521*53ee8cc1Swenshuai.xi {
2522*53ee8cc1Swenshuai.xi     DVBS_DiSEqC_Get22kOnOff_PARAM Drv_DVBS_DiSEqC_Get22kOnOff_PARAM;
2523*53ee8cc1Swenshuai.xi     Drv_DVBS_DiSEqC_Get22kOnOff_PARAM.b22kOn=b22kOn;
2524*53ee8cc1Swenshuai.xi     Drv_DVBS_DiSEqC_Get22kOnOff_PARAM.bRet=false;
2525*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_DiSEqC_Get22kOnOff\n"));
2526*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2527*53ee8cc1Swenshuai.xi    {
2528*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_DiSEqC_Get22kOnOff,&Drv_DVBS_DiSEqC_Get22kOnOff_PARAM);
2529*53ee8cc1Swenshuai.xi    }
2530*53ee8cc1Swenshuai.xi    else
2531*53ee8cc1Swenshuai.xi    {
2532*53ee8cc1Swenshuai.xi       return false;
2533*53ee8cc1Swenshuai.xi    }
2534*53ee8cc1Swenshuai.xi    return Drv_DVBS_DiSEqC_Get22kOnOff_PARAM.bRet;
2535*53ee8cc1Swenshuai.xi }
2536*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_DiSEqC_SendCmd(MS_U8 * pCmd,MS_U8 u8CmdSize)2537*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_DiSEqC_SendCmd(MS_U8* pCmd,MS_U8 u8CmdSize)
2538*53ee8cc1Swenshuai.xi {
2539*53ee8cc1Swenshuai.xi     DVBS_DiSEqC_SendCmd_PARAM Drv_DVBS_DiSEqC_SendCmd_PARAM;
2540*53ee8cc1Swenshuai.xi     Drv_DVBS_DiSEqC_SendCmd_PARAM.pCmd=pCmd;
2541*53ee8cc1Swenshuai.xi     Drv_DVBS_DiSEqC_SendCmd_PARAM.u8CmdSize=u8CmdSize;
2542*53ee8cc1Swenshuai.xi     Drv_DVBS_DiSEqC_SendCmd_PARAM.bRet=false;
2543*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_DiSEqC_SendCmd\n"));
2544*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2545*53ee8cc1Swenshuai.xi    {
2546*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_DiSEqC_SendCmd,&Drv_DVBS_DiSEqC_SendCmd_PARAM);
2547*53ee8cc1Swenshuai.xi    }
2548*53ee8cc1Swenshuai.xi    else
2549*53ee8cc1Swenshuai.xi    {
2550*53ee8cc1Swenshuai.xi       return false;
2551*53ee8cc1Swenshuai.xi    }
2552*53ee8cc1Swenshuai.xi    return Drv_DVBS_DiSEqC_SendCmd_PARAM.bRet;
2553*53ee8cc1Swenshuai.xi }
2554*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_DiSEqC_SetTxToneMode(MS_BOOL bTxTone22kOff)2555*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_DiSEqC_SetTxToneMode(MS_BOOL bTxTone22kOff)
2556*53ee8cc1Swenshuai.xi {
2557*53ee8cc1Swenshuai.xi     DVBS_DiSEqC_SetTxToneMode_PARAM Drv_DVBS_DiSEqC_SetTxToneMode_PARAM;
2558*53ee8cc1Swenshuai.xi     Drv_DVBS_DiSEqC_SetTxToneMode_PARAM.bTxTone22kOff=bTxTone22kOff;
2559*53ee8cc1Swenshuai.xi     Drv_DVBS_DiSEqC_SetTxToneMode_PARAM.bRet=false;
2560*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_DiSEqC_SetTxToneMode\n"));
2561*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2562*53ee8cc1Swenshuai.xi    {
2563*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_DiSEqC_SetTxToneMode,&Drv_DVBS_DiSEqC_SetTxToneMode_PARAM);
2564*53ee8cc1Swenshuai.xi    }
2565*53ee8cc1Swenshuai.xi    else
2566*53ee8cc1Swenshuai.xi    {
2567*53ee8cc1Swenshuai.xi       return false;
2568*53ee8cc1Swenshuai.xi    }
2569*53ee8cc1Swenshuai.xi    return Drv_DVBS_DiSEqC_SetTxToneMode_PARAM.bRet;
2570*53ee8cc1Swenshuai.xi }
2571*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_DiSEqC_SetTone(MS_BOOL bTone1)2572*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_DiSEqC_SetTone(MS_BOOL bTone1)
2573*53ee8cc1Swenshuai.xi {
2574*53ee8cc1Swenshuai.xi     DVBS_DiSEqC_SetTone_PARAM Drv_DVBS_DiSEqC_SetTone_PARAM;
2575*53ee8cc1Swenshuai.xi     Drv_DVBS_DiSEqC_SetTone_PARAM.bTone1=bTone1;
2576*53ee8cc1Swenshuai.xi     Drv_DVBS_DiSEqC_SetTone_PARAM.bRet=false;
2577*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_DiSEqC_SetTone\n"));
2578*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2579*53ee8cc1Swenshuai.xi    {
2580*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_DiSEqC_SetTone,&Drv_DVBS_DiSEqC_SetTone_PARAM);
2581*53ee8cc1Swenshuai.xi    }
2582*53ee8cc1Swenshuai.xi    else
2583*53ee8cc1Swenshuai.xi    {
2584*53ee8cc1Swenshuai.xi       return false;
2585*53ee8cc1Swenshuai.xi    }
2586*53ee8cc1Swenshuai.xi    return Drv_DVBS_DiSEqC_SetTone_PARAM.bRet;
2587*53ee8cc1Swenshuai.xi }
2588*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS_UnicableAGCCheckPower(MS_BOOL pbAGCCheckPower)2589*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_UnicableAGCCheckPower(MS_BOOL pbAGCCheckPower)
2590*53ee8cc1Swenshuai.xi {
2591*53ee8cc1Swenshuai.xi     DVBS_UnicableAGCCheckPower_PARAM Drv_DVBS_UnicableAGCCheckPower_PARAM;
2592*53ee8cc1Swenshuai.xi     Drv_DVBS_UnicableAGCCheckPower_PARAM.pbAGCCheckPower=pbAGCCheckPower;
2593*53ee8cc1Swenshuai.xi     Drv_DVBS_UnicableAGCCheckPower_PARAM.bRet=false;
2594*53ee8cc1Swenshuai.xi    DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS_UnicableAGCCheckPower\n"));
2595*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2596*53ee8cc1Swenshuai.xi    {
2597*53ee8cc1Swenshuai.xi       UtopiaIoctl(ppDVBSInstant,DMD_DVBS_DRV_CMD_UnicableAGCCheckPower,&Drv_DVBS_UnicableAGCCheckPower_PARAM);
2598*53ee8cc1Swenshuai.xi    }
2599*53ee8cc1Swenshuai.xi    else
2600*53ee8cc1Swenshuai.xi    {
2601*53ee8cc1Swenshuai.xi       return false;
2602*53ee8cc1Swenshuai.xi    }
2603*53ee8cc1Swenshuai.xi    return Drv_DVBS_UnicableAGCCheckPower_PARAM.bRet;
2604*53ee8cc1Swenshuai.xi }
2605*53ee8cc1Swenshuai.xi 
2606*53ee8cc1Swenshuai.xi #if defined UFO_SUPPORT_VCM || defined UFO_DEMOD_DVBS_SUPPORT_DMD_INT
MDrv_DMD_DVBS2_TS_DivNum_Calculation(void)2607*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS2_TS_DivNum_Calculation(void)
2608*53ee8cc1Swenshuai.xi {
2609*53ee8cc1Swenshuai.xi     DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS2_TS_DivNum_Calculation\n"));
2610*53ee8cc1Swenshuai.xi 
2611*53ee8cc1Swenshuai.xi     MS_U32      u32SymbolRate=0;
2612*53ee8cc1Swenshuai.xi     //float       fSymbolRate;
2613*53ee8cc1Swenshuai.xi     //MS_U8 ISSY_EN = 0;
2614*53ee8cc1Swenshuai.xi     MS_U8 code_rate_idx = 0;
2615*53ee8cc1Swenshuai.xi     MS_U8 pilot_flag = 0;
2616*53ee8cc1Swenshuai.xi     MS_U8 fec_type_idx = 0;
2617*53ee8cc1Swenshuai.xi     MS_U16 k_bch_array[2][42] =
2618*53ee8cc1Swenshuai.xi     {
2619*53ee8cc1Swenshuai.xi         {
2620*53ee8cc1Swenshuai.xi             16008, 21408, 25728, 32208, 38688, 43040, 48408, 51648, 53840, 57472,
2621*53ee8cc1Swenshuai.xi             58192, 14208, 18528, 28968, 32208, 34368, 35448, 35808, 37248, 37248,
2622*53ee8cc1Swenshuai.xi             38688, 40128, 41208, 41568, 43008, 44448, 44808, 45888, 46608, 47328,
2623*53ee8cc1Swenshuai.xi             47328, 48408, 50208, 50208, 55248,     0,     0,     0,     0,     0,
2624*53ee8cc1Swenshuai.xi             0,     0,
2625*53ee8cc1Swenshuai.xi         },
2626*53ee8cc1Swenshuai.xi         {
2627*53ee8cc1Swenshuai.xi             3072,  5232,  6312,  7032,  9552, 10632, 11712, 12432, 13152, 14232,
2628*53ee8cc1Swenshuai.xi             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
2629*53ee8cc1Swenshuai.xi             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
2630*53ee8cc1Swenshuai.xi             0,     0,     0,     0,     0,  3792,  4152,  4872,  7392,  8472,
2631*53ee8cc1Swenshuai.xi             9192, 11352
2632*53ee8cc1Swenshuai.xi         }
2633*53ee8cc1Swenshuai.xi     };
2634*53ee8cc1Swenshuai.xi     MS_U16 n_ldpc_array[2] = {64800, 16200};
2635*53ee8cc1Swenshuai.xi 
2636*53ee8cc1Swenshuai.xi     MS_FLOAT pilot_term = 0;
2637*53ee8cc1Swenshuai.xi     MS_FLOAT k_bch;
2638*53ee8cc1Swenshuai.xi     MS_FLOAT n_ldpc;
2639*53ee8cc1Swenshuai.xi     MS_FLOAT ts_div_num_offset = 1.5;
2640*53ee8cc1Swenshuai.xi     MS_FLOAT ts_div_num_margin_ratio = 1.03;
2641*53ee8cc1Swenshuai.xi     MS_FLOAT ftmp;
2642*53ee8cc1Swenshuai.xi     MS_U32 u32temp;
2643*53ee8cc1Swenshuai.xi     MS_U8 system_type_reg;
2644*53ee8cc1Swenshuai.xi     MS_U8 code_rate_reg;
2645*53ee8cc1Swenshuai.xi     MS_FLOAT fTSDivNum;
2646*53ee8cc1Swenshuai.xi     MS_U8 u8Data;
2647*53ee8cc1Swenshuai.xi     MS_BOOL status = TRUE;
2648*53ee8cc1Swenshuai.xi 
2649*53ee8cc1Swenshuai.xi     DVBS_GetTsDivNum_PARAM Drv_DVBS_GetTsDivNum_PARAM;
2650*53ee8cc1Swenshuai.xi     Drv_DVBS_GetTsDivNum_PARAM.u32SymbolRate=&u32SymbolRate;
2651*53ee8cc1Swenshuai.xi     Drv_DVBS_GetTsDivNum_PARAM.system_type_reg=&system_type_reg;
2652*53ee8cc1Swenshuai.xi     Drv_DVBS_GetTsDivNum_PARAM.code_rate_idx=&code_rate_idx;
2653*53ee8cc1Swenshuai.xi     Drv_DVBS_GetTsDivNum_PARAM.fec_type_idx=&fec_type_idx;
2654*53ee8cc1Swenshuai.xi     Drv_DVBS_GetTsDivNum_PARAM.pilot_flag=&pilot_flag;
2655*53ee8cc1Swenshuai.xi     Drv_DVBS_GetTsDivNum_PARAM.u32temp=&u32temp;
2656*53ee8cc1Swenshuai.xi     Drv_DVBS_GetTsDivNum_PARAM.code_rate_reg=&code_rate_reg;
2657*53ee8cc1Swenshuai.xi     Drv_DVBS_GetTsDivNum_PARAM.bRet=false;
2658*53ee8cc1Swenshuai.xi 
2659*53ee8cc1Swenshuai.xi     if(u8DemodLockFlag==1)
2660*53ee8cc1Swenshuai.xi     {
2661*53ee8cc1Swenshuai.xi          UtopiaIoctl(ppDVBSInstant, DMD_DVBS_DRV_CMD_GetTsDivNum, &Drv_DVBS_GetTsDivNum_PARAM);
2662*53ee8cc1Swenshuai.xi          status &= Drv_DVBS_GetTsDivNum_PARAM.bRet;
2663*53ee8cc1Swenshuai.xi 
2664*53ee8cc1Swenshuai.xi          if(!system_type_reg)//DVBS2
2665*53ee8cc1Swenshuai.xi          {
2666*53ee8cc1Swenshuai.xi                 k_bch = k_bch_array[fec_type_idx][code_rate_idx];
2667*53ee8cc1Swenshuai.xi                 n_ldpc = n_ldpc_array[fec_type_idx];
2668*53ee8cc1Swenshuai.xi                 pilot_term = ((float) n_ldpc / modulation_order / 1440 * 36) * pilot_flag;
2669*53ee8cc1Swenshuai.xi 
2670*53ee8cc1Swenshuai.xi                 //data rate
2671*53ee8cc1Swenshuai.xi                 ftmp = k_bch/((n_ldpc/modulation_order+90+pilot_term)/u32SymbolRate);
2672*53ee8cc1Swenshuai.xi 
2673*53ee8cc1Swenshuai.xi                 if(sDMD_DVBS_Info.bSerialTS)//serial mode
2674*53ee8cc1Swenshuai.xi                 {
2675*53ee8cc1Swenshuai.xi                     fTSDivNum = 288000.0 / ftmp / 2.0 - 1;
2676*53ee8cc1Swenshuai.xi                     //fTSDivNum = fTSDivNum/2-1;// since  288/(2(fTSDivNum+1)) = 288/TS_RATE = A  ==> fTSDivNum = A/2-1
2677*53ee8cc1Swenshuai.xi                 }
2678*53ee8cc1Swenshuai.xi                 else//parallel mode
2679*53ee8cc1Swenshuai.xi                 {
2680*53ee8cc1Swenshuai.xi                     fTSDivNum = 288000.0 / (ftmp/8.0) / 2.0 - 1;
2681*53ee8cc1Swenshuai.xi                     //fTSDivNum = (fTSDivNum-1)/2;
2682*53ee8cc1Swenshuai.xi                 }
2683*53ee8cc1Swenshuai.xi 
2684*53ee8cc1Swenshuai.xi                 fTSDivNum -= ts_div_num_offset;
2685*53ee8cc1Swenshuai.xi          }
2686*53ee8cc1Swenshuai.xi          else
2687*53ee8cc1Swenshuai.xi         {
2688*53ee8cc1Swenshuai.xi              code_rate_reg = *Drv_DVBS_GetTsDivNum_PARAM.code_rate_reg;
2689*53ee8cc1Swenshuai.xi              switch (code_rate_reg)
2690*53ee8cc1Swenshuai.xi              {
2691*53ee8cc1Swenshuai.xi                 case 0x00: //CR 1/2
2692*53ee8cc1Swenshuai.xi                     if(sDMD_DVBS_Info.bSerialTS)
2693*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((1.0/2.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2)) /2)-ts_div_num_offset;
2694*53ee8cc1Swenshuai.xi                     else
2695*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((1.0/2.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2/8.0))/2)-ts_div_num_offset;
2696*53ee8cc1Swenshuai.xi 
2697*53ee8cc1Swenshuai.xi                     //fTSDivNum = fTSDivNum/2-1-5;
2698*53ee8cc1Swenshuai.xi 
2699*53ee8cc1Swenshuai.xi                     break;
2700*53ee8cc1Swenshuai.xi                 case 0x01: //CR 2/3
2701*53ee8cc1Swenshuai.xi                     if(sDMD_DVBS_Info.bSerialTS)
2702*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((2.0/3.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2)) /2)-ts_div_num_offset;
2703*53ee8cc1Swenshuai.xi                     else
2704*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((2.0/3.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2/8.0))/2)-ts_div_num_offset;
2705*53ee8cc1Swenshuai.xi 
2706*53ee8cc1Swenshuai.xi                     //fTSDivNum = fTSDivNum/2-1-5;
2707*53ee8cc1Swenshuai.xi 
2708*53ee8cc1Swenshuai.xi                     break;
2709*53ee8cc1Swenshuai.xi                 case 0x02: //CR 3/4
2710*53ee8cc1Swenshuai.xi                     if(sDMD_DVBS_Info.bSerialTS)
2711*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((3.0/4.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2)) /2)-ts_div_num_offset;
2712*53ee8cc1Swenshuai.xi                     else
2713*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((3.0/4.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2/8.0))/2)-ts_div_num_offset;
2714*53ee8cc1Swenshuai.xi 
2715*53ee8cc1Swenshuai.xi                       //fTSDivNum = fTSDivNum/2-1-5;
2716*53ee8cc1Swenshuai.xi                     break;
2717*53ee8cc1Swenshuai.xi                 case 0x03: //CR 5/6
2718*53ee8cc1Swenshuai.xi                     if(sDMD_DVBS_Info.bSerialTS)
2719*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((5.0/6.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2)) /2)-ts_div_num_offset;
2720*53ee8cc1Swenshuai.xi                     else
2721*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((5.0/6.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2/8.0))/2)-ts_div_num_offset;
2722*53ee8cc1Swenshuai.xi 
2723*53ee8cc1Swenshuai.xi                     //fTSDivNum = fTSDivNum/2-1-5;
2724*53ee8cc1Swenshuai.xi 
2725*53ee8cc1Swenshuai.xi                     break;
2726*53ee8cc1Swenshuai.xi                 case 0x04: //CR 7/8
2727*53ee8cc1Swenshuai.xi                     if(sDMD_DVBS_Info.bSerialTS)
2728*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((7.0/8.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2)) /2)-ts_div_num_offset;
2729*53ee8cc1Swenshuai.xi                     else
2730*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((7.0/8.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2/8.0))/2)-ts_div_num_offset;
2731*53ee8cc1Swenshuai.xi 
2732*53ee8cc1Swenshuai.xi                     //fTSDivNum = fTSDivNum/2-1-5;
2733*53ee8cc1Swenshuai.xi 
2734*53ee8cc1Swenshuai.xi                     break;
2735*53ee8cc1Swenshuai.xi                 default:
2736*53ee8cc1Swenshuai.xi                     if(sDMD_DVBS_Info.bSerialTS)
2737*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((7.0/8.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2)) /2)-ts_div_num_offset;
2738*53ee8cc1Swenshuai.xi                     else
2739*53ee8cc1Swenshuai.xi                         fTSDivNum = ((288000/((7.0/8.0)*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2/8.0))/2)-ts_div_num_offset;
2740*53ee8cc1Swenshuai.xi 
2741*53ee8cc1Swenshuai.xi                     //fTSDivNum = fTSDivNum/2-1-5;
2742*53ee8cc1Swenshuai.xi 
2743*53ee8cc1Swenshuai.xi                     break;
2744*53ee8cc1Swenshuai.xi              }
2745*53ee8cc1Swenshuai.xi          }
2746*53ee8cc1Swenshuai.xi 
2747*53ee8cc1Swenshuai.xi         if(fTSDivNum > 0x1F)
2748*53ee8cc1Swenshuai.xi             fTSDivNum = 0x1F;
2749*53ee8cc1Swenshuai.xi         else if(fTSDivNum < 0x01)
2750*53ee8cc1Swenshuai.xi             fTSDivNum = 0x01;
2751*53ee8cc1Swenshuai.xi 
2752*53ee8cc1Swenshuai.xi          u8Data = (MS_U8)fTSDivNum;
2753*53ee8cc1Swenshuai.xi 
2754*53ee8cc1Swenshuai.xi 	  #ifdef MS_DEBUG
2755*53ee8cc1Swenshuai.xi          ULOGD("DEMOD", ">>>INTERN_DVBS_GetLock TsClkDivNum = 0x%x<<<\n", u8Data);
2756*53ee8cc1Swenshuai.xi          #endif
2757*53ee8cc1Swenshuai.xi 
2758*53ee8cc1Swenshuai.xi          HAL_DMD_RIU_WriteByte(0x103300, u8Data);
2759*53ee8cc1Swenshuai.xi 
2760*53ee8cc1Swenshuai.xi          //Ts Output Enable
2761*53ee8cc1Swenshuai.xi          HAL_DMD_RIU_WriteByte(0x101eaa,0x10);
2762*53ee8cc1Swenshuai.xi     }
2763*53ee8cc1Swenshuai.xi 
2764*53ee8cc1Swenshuai.xi     return status;
2765*53ee8cc1Swenshuai.xi }
2766*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS2_Set_Default_IS_ID(MS_U8 * u8IS_ID_table)2767*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS2_Set_Default_IS_ID(MS_U8 *u8IS_ID_table)
2768*53ee8cc1Swenshuai.xi {
2769*53ee8cc1Swenshuai.xi     MS_U8 IS_ID = 0;
2770*53ee8cc1Swenshuai.xi     DVBS_SetDefaultVCM_PARAM Drv_DVBS_SetDefaultVCM_PARAM;
2771*53ee8cc1Swenshuai.xi     Drv_DVBS_SetDefaultVCM_PARAM.u8IS_ID = &IS_ID;
2772*53ee8cc1Swenshuai.xi     Drv_DVBS_SetDefaultVCM_PARAM.u8IS_ID_table = u8IS_ID_table;
2773*53ee8cc1Swenshuai.xi     Drv_DVBS_SetDefaultVCM_PARAM.ret = false;
2774*53ee8cc1Swenshuai.xi     DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS2_Set_Default_IS_ID\n"));
2775*53ee8cc1Swenshuai.xi 
2776*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2777*53ee8cc1Swenshuai.xi     {
2778*53ee8cc1Swenshuai.xi         UtopiaIoctl(ppDVBSInstant, DMD_DVBS_DRV_CMD_Set_Default_IS_ID, &Drv_DVBS_SetDefaultVCM_PARAM);
2779*53ee8cc1Swenshuai.xi     }
2780*53ee8cc1Swenshuai.xi 
2781*53ee8cc1Swenshuai.xi    ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]Defalut IS_ID = %d\n",IS_ID);
2782*53ee8cc1Swenshuai.xi 
2783*53ee8cc1Swenshuai.xi     return Drv_DVBS_SetDefaultVCM_PARAM.ret;
2784*53ee8cc1Swenshuai.xi }
2785*53ee8cc1Swenshuai.xi 
2786*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS2_Set_IS_ID(MS_U8 u8IS_ID)2787*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS2_Set_IS_ID(MS_U8 u8IS_ID)
2788*53ee8cc1Swenshuai.xi {
2789*53ee8cc1Swenshuai.xi     DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS2_Set_IS_ID\n"));
2790*53ee8cc1Swenshuai.xi 
2791*53ee8cc1Swenshuai.xi     DVBS_SetVCM_PARAM Drv_DVBS_SetVCM_PARAM;
2792*53ee8cc1Swenshuai.xi     Drv_DVBS_SetVCM_PARAM.u8IS_ID=u8IS_ID;
2793*53ee8cc1Swenshuai.xi     Drv_DVBS_SetVCM_PARAM.ret=false;
2794*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2795*53ee8cc1Swenshuai.xi     {
2796*53ee8cc1Swenshuai.xi         UtopiaIoctl(ppDVBSInstant, DMD_DVBS_DRV_CMD_Set_IS_ID, &Drv_DVBS_SetVCM_PARAM);
2797*53ee8cc1Swenshuai.xi     }
2798*53ee8cc1Swenshuai.xi     return Drv_DVBS_SetVCM_PARAM.ret;
2799*53ee8cc1Swenshuai.xi }
2800*53ee8cc1Swenshuai.xi 
2801*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS2_Get_IS_ID_INFO(MS_U8 * u8IS_ID,MS_U8 * u8IS_ID_table)2802*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS2_Get_IS_ID_INFO(MS_U8 *u8IS_ID, MS_U8 *u8IS_ID_table)
2803*53ee8cc1Swenshuai.xi {
2804*53ee8cc1Swenshuai.xi     DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS2_Get_IS_ID_INFO\n"));
2805*53ee8cc1Swenshuai.xi 
2806*53ee8cc1Swenshuai.xi     DVBS_GetVCM_PARAM Drv_DVBS_GetVCM_PARAM;
2807*53ee8cc1Swenshuai.xi     Drv_DVBS_GetVCM_PARAM.u8IS_ID=u8IS_ID;
2808*53ee8cc1Swenshuai.xi     Drv_DVBS_GetVCM_PARAM.u8IS_ID_table=u8IS_ID_table;
2809*53ee8cc1Swenshuai.xi     Drv_DVBS_GetVCM_PARAM.ret=false;
2810*53ee8cc1Swenshuai.xi     if(u32DVBSopen==1)
2811*53ee8cc1Swenshuai.xi     {
2812*53ee8cc1Swenshuai.xi         UtopiaIoctl(ppDVBSInstant, DMD_DVBS_DRV_CMD_Get_IS_ID_INFO, &Drv_DVBS_GetVCM_PARAM);
2813*53ee8cc1Swenshuai.xi     }
2814*53ee8cc1Swenshuai.xi 
2815*53ee8cc1Swenshuai.xi     return Drv_DVBS_GetVCM_PARAM.ret;
2816*53ee8cc1Swenshuai.xi }
2817*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS2_VCM_Init(DMD_DVBS_VCM_OPT u8VCM_OPT,MS_U8 u8IS_ID,MS_U32 u32DVBS2_DJB_START_ADDR)2818*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS2_VCM_Init(DMD_DVBS_VCM_OPT u8VCM_OPT, MS_U8 u8IS_ID, MS_U32 u32DVBS2_DJB_START_ADDR)
2819*53ee8cc1Swenshuai.xi {
2820*53ee8cc1Swenshuai.xi     void* pAttribte = NULL;
2821*53ee8cc1Swenshuai.xi 
2822*53ee8cc1Swenshuai.xi     DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS2_VCM_Init\n"));
2823*53ee8cc1Swenshuai.xi 
2824*53ee8cc1Swenshuai.xi     DVBS_VCM_INIT_PARAM Drv_DVBS_VCM_INIT_PARAM;
2825*53ee8cc1Swenshuai.xi     Drv_DVBS_VCM_INIT_PARAM.u8VCM_OPT = u8VCM_OPT;
2826*53ee8cc1Swenshuai.xi     Drv_DVBS_VCM_INIT_PARAM.u8IS_ID = u8IS_ID;
2827*53ee8cc1Swenshuai.xi     Drv_DVBS_VCM_INIT_PARAM.u32DVBS2_DJB_START_ADDR = u32DVBS2_DJB_START_ADDR;
2828*53ee8cc1Swenshuai.xi     Drv_DVBS_VCM_INIT_PARAM.ret = false;
2829*53ee8cc1Swenshuai.xi 
2830*53ee8cc1Swenshuai.xi      if(u8DVBSUtopiaOpen == 0)  // First time open
2831*53ee8cc1Swenshuai.xi     {
2832*53ee8cc1Swenshuai.xi         if(UtopiaOpen(MODULE_DVBS/*|KERNEL_MODE*/ , &ppDVBSInstant, 0, pAttribte) == UTOPIA_STATUS_SUCCESS)  //kernel space
2833*53ee8cc1Swenshuai.xi         //if(UtopiaOpen(MODULE_DVBS , &ppDVBSInstant, 0, pAttribte) == UTOPIA_STATUS_SUCCESS)  //user space
2834*53ee8cc1Swenshuai.xi         {
2835*53ee8cc1Swenshuai.xi             u32DVBSopen = 1;
2836*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","Leo check DVBS utopia open sucessful!!\n");
2837*53ee8cc1Swenshuai.xi       //return_val=true;
2838*53ee8cc1Swenshuai.xi            // ULOGD("DEMOD","\r\n ======== DVBS Open Successful %x =========", (WORD)u32DVBSopen);
2839*53ee8cc1Swenshuai.xi         }
2840*53ee8cc1Swenshuai.xi         else
2841*53ee8cc1Swenshuai.xi         {
2842*53ee8cc1Swenshuai.xi           //  ULOGD("DEMOD","\r\n ======== DVBS Open Fail %x =========", (WORD)u32DVBSopen);
2843*53ee8cc1Swenshuai.xi        //return_val=false;
2844*53ee8cc1Swenshuai.xi           ULOGD("DEMOD","DVBS utopia open fail!!\n");
2845*53ee8cc1Swenshuai.xi           return false;
2846*53ee8cc1Swenshuai.xi         }
2847*53ee8cc1Swenshuai.xi 
2848*53ee8cc1Swenshuai.xi         u8DVBSUtopiaOpen = 1;
2849*53ee8cc1Swenshuai.xi     }
2850*53ee8cc1Swenshuai.xi 
2851*53ee8cc1Swenshuai.xi     if(u32DVBSopen==1)
2852*53ee8cc1Swenshuai.xi     {
2853*53ee8cc1Swenshuai.xi         UtopiaIoctl(ppDVBSInstant, DMD_DVBS_DRV_CMD_VCM_Init, &Drv_DVBS_VCM_INIT_PARAM);
2854*53ee8cc1Swenshuai.xi     }
2855*53ee8cc1Swenshuai.xi 
2856*53ee8cc1Swenshuai.xi     return Drv_DVBS_VCM_INIT_PARAM.ret;
2857*53ee8cc1Swenshuai.xi }
2858*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS2_VCM_Check(void)2859*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS2_VCM_Check(void)
2860*53ee8cc1Swenshuai.xi {
2861*53ee8cc1Swenshuai.xi     DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS2_VCM_Check\n"));
2862*53ee8cc1Swenshuai.xi 
2863*53ee8cc1Swenshuai.xi     DVBS_VCM_CHECK Drv_DVBS_VCM_CHECK;
2864*53ee8cc1Swenshuai.xi     Drv_DVBS_VCM_CHECK.ret = false;
2865*53ee8cc1Swenshuai.xi 
2866*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2867*53ee8cc1Swenshuai.xi     {
2868*53ee8cc1Swenshuai.xi         UtopiaIoctl(ppDVBSInstant, DMD_DVBS_DRV_CMD_VCM_Check, &Drv_DVBS_VCM_CHECK);
2869*53ee8cc1Swenshuai.xi     }
2870*53ee8cc1Swenshuai.xi 
2871*53ee8cc1Swenshuai.xi    return Drv_DVBS_VCM_CHECK.ret;
2872*53ee8cc1Swenshuai.xi }
2873*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS2_VCM_Enabled(MS_U8 u8VCM_ENABLED)2874*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS2_VCM_Enabled(MS_U8 u8VCM_ENABLED)
2875*53ee8cc1Swenshuai.xi {
2876*53ee8cc1Swenshuai.xi     DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS2_VCM_Enabled\n"));
2877*53ee8cc1Swenshuai.xi     DVBS_VCM_ENABLED Drv_DVBS_VCM_ENABLED;
2878*53ee8cc1Swenshuai.xi     Drv_DVBS_VCM_ENABLED.u8VCM_ENABLED = u8VCM_ENABLED;
2879*53ee8cc1Swenshuai.xi     Drv_DVBS_VCM_ENABLED.ret = false;
2880*53ee8cc1Swenshuai.xi 
2881*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2882*53ee8cc1Swenshuai.xi     {
2883*53ee8cc1Swenshuai.xi         UtopiaIoctl(ppDVBSInstant, DMD_DVBS_DRV_CMD_VCM_Enabled, &Drv_DVBS_VCM_ENABLED);
2884*53ee8cc1Swenshuai.xi     }
2885*53ee8cc1Swenshuai.xi 
2886*53ee8cc1Swenshuai.xi    return Drv_DVBS_VCM_ENABLED.ret;
2887*53ee8cc1Swenshuai.xi 
2888*53ee8cc1Swenshuai.xi }
2889*53ee8cc1Swenshuai.xi 
MDrv_DMD_DVBS2_VCM_Change_Mode(DMD_DVBS_VCM_OPT u8VCM_OPT)2890*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS2_VCM_Change_Mode(DMD_DVBS_VCM_OPT u8VCM_OPT)
2891*53ee8cc1Swenshuai.xi {
2892*53ee8cc1Swenshuai.xi     DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS2_VCM_Change_Mode\n"));
2893*53ee8cc1Swenshuai.xi     DVBS_VCM_MODE Drv_DVBS_VCM_MODE;
2894*53ee8cc1Swenshuai.xi     Drv_DVBS_VCM_MODE.u8VCM_OPT = u8VCM_OPT;
2895*53ee8cc1Swenshuai.xi     Drv_DVBS_VCM_MODE.ret = false;
2896*53ee8cc1Swenshuai.xi 
2897*53ee8cc1Swenshuai.xi    if(u32DVBSopen==1)
2898*53ee8cc1Swenshuai.xi     {
2899*53ee8cc1Swenshuai.xi         UtopiaIoctl(ppDVBSInstant, DMD_DVBS_DRV_CMD_VCM_Mode, &Drv_DVBS_VCM_MODE);
2900*53ee8cc1Swenshuai.xi     }
2901*53ee8cc1Swenshuai.xi 
2902*53ee8cc1Swenshuai.xi    return Drv_DVBS_VCM_MODE.ret;
2903*53ee8cc1Swenshuai.xi }
2904*53ee8cc1Swenshuai.xi #endif
2905*53ee8cc1Swenshuai.xi 
2906*53ee8cc1Swenshuai.xi #ifdef UFO_SUPPORT_KERNEL_FLOATING
MDrv_DMD_DVBS_TS_DivNum_Calculation_Kernel(void)2907*53ee8cc1Swenshuai.xi MS_BOOL MDrv_DMD_DVBS_TS_DivNum_Calculation_Kernel(void)
2908*53ee8cc1Swenshuai.xi {
2909*53ee8cc1Swenshuai.xi     DMD_DBG(ULOGD("DEMOD","[drvDMD_INTERN_DVBS.c]MDrv_DMD_DVBS2_TS_DivNum_Calculation\n"));
2910*53ee8cc1Swenshuai.xi 
2911*53ee8cc1Swenshuai.xi     MS_U32      u32SymbolRate=0;
2912*53ee8cc1Swenshuai.xi     //float       fSymbolRate;
2913*53ee8cc1Swenshuai.xi     //MS_U8 ISSY_EN = 0;
2914*53ee8cc1Swenshuai.xi     MS_U8 code_rate_idx = 0;
2915*53ee8cc1Swenshuai.xi     MS_U8 pilot_flag = 0;
2916*53ee8cc1Swenshuai.xi     MS_U8 fec_type_idx = 0;
2917*53ee8cc1Swenshuai.xi     MS_U16 k_bch_array[2][42] =
2918*53ee8cc1Swenshuai.xi     {
2919*53ee8cc1Swenshuai.xi         {
2920*53ee8cc1Swenshuai.xi             16008, 21408, 25728, 32208, 38688, 43040, 48408, 51648, 53840, 57472,
2921*53ee8cc1Swenshuai.xi             58192, 14208, 18528, 28968, 32208, 34368, 35448, 35808, 37248, 37248,
2922*53ee8cc1Swenshuai.xi             38688, 40128, 41208, 41568, 43008, 44448, 44808, 45888, 46608, 47328,
2923*53ee8cc1Swenshuai.xi             47328, 48408, 50208, 50208, 55248,     0,     0,     0,     0,     0,
2924*53ee8cc1Swenshuai.xi             0,     0,
2925*53ee8cc1Swenshuai.xi         },
2926*53ee8cc1Swenshuai.xi         {
2927*53ee8cc1Swenshuai.xi             3072,  5232,  6312,  7032,  9552, 10632, 11712, 12432, 13152, 14232,
2928*53ee8cc1Swenshuai.xi             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
2929*53ee8cc1Swenshuai.xi             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
2930*53ee8cc1Swenshuai.xi             0,     0,     0,     0,     0,  3792,  4152,  4872,  7392,  8472,
2931*53ee8cc1Swenshuai.xi             9192, 11352
2932*53ee8cc1Swenshuai.xi         }
2933*53ee8cc1Swenshuai.xi     };
2934*53ee8cc1Swenshuai.xi     MS_U16 n_ldpc_array[2] = {64800, 16200};
2935*53ee8cc1Swenshuai.xi 
2936*53ee8cc1Swenshuai.xi     MS_U8 DVBS_CR_TABLE[5] = {2,3,4,6,8}; // 1/2, 2/3, 3/4, 5/6, 7/8
2937*53ee8cc1Swenshuai.xi 
2938*53ee8cc1Swenshuai.xi     MS_FLOAT_ST pilot_term;
2939*53ee8cc1Swenshuai.xi     MS_FLOAT_ST k_bch;
2940*53ee8cc1Swenshuai.xi     MS_FLOAT_ST n_ldpc;
2941*53ee8cc1Swenshuai.xi     MS_FLOAT_ST ts_div_num_offset; // 1.5
2942*53ee8cc1Swenshuai.xi 
2943*53ee8cc1Swenshuai.xi     ts_div_num_offset.DATA = 3;
2944*53ee8cc1Swenshuai.xi     ts_div_num_offset.EXP = -1;
2945*53ee8cc1Swenshuai.xi 
2946*53ee8cc1Swenshuai.xi     MS_FLOAT_ST ts_div_num_margin_ratio; // 1.03
2947*53ee8cc1Swenshuai.xi 
2948*53ee8cc1Swenshuai.xi     ts_div_num_margin_ratio.DATA = 1105954079;
2949*53ee8cc1Swenshuai.xi     ts_div_num_margin_ratio.EXP = -30;
2950*53ee8cc1Swenshuai.xi 
2951*53ee8cc1Swenshuai.xi     MS_FLOAT_ST ftmp;
2952*53ee8cc1Swenshuai.xi     MS_FLOAT_ST temp, temp1;
2953*53ee8cc1Swenshuai.xi 
2954*53ee8cc1Swenshuai.xi     MS_U32 u32temp;
2955*53ee8cc1Swenshuai.xi     MS_U8 system_type_reg;
2956*53ee8cc1Swenshuai.xi     MS_U8 code_rate_reg;
2957*53ee8cc1Swenshuai.xi     MS_FLOAT_ST fTSDivNum;
2958*53ee8cc1Swenshuai.xi     MS_U8 u8Data;
2959*53ee8cc1Swenshuai.xi     MS_BOOL status = TRUE;
2960*53ee8cc1Swenshuai.xi 
2961*53ee8cc1Swenshuai.xi     DVBS_GetTsDivNum_PARAM Drv_DVBS_GetTsDivNum_PARAM;
2962*53ee8cc1Swenshuai.xi     Drv_DVBS_GetTsDivNum_PARAM.u32SymbolRate=&u32SymbolRate;
2963*53ee8cc1Swenshuai.xi     Drv_DVBS_GetTsDivNum_PARAM.system_type_reg=&system_type_reg;
2964*53ee8cc1Swenshuai.xi     Drv_DVBS_GetTsDivNum_PARAM.code_rate_idx=&code_rate_idx;
2965*53ee8cc1Swenshuai.xi     Drv_DVBS_GetTsDivNum_PARAM.fec_type_idx=&fec_type_idx;
2966*53ee8cc1Swenshuai.xi     Drv_DVBS_GetTsDivNum_PARAM.pilot_flag=&pilot_flag;
2967*53ee8cc1Swenshuai.xi     Drv_DVBS_GetTsDivNum_PARAM.u32temp=&u32temp;
2968*53ee8cc1Swenshuai.xi     Drv_DVBS_GetTsDivNum_PARAM.code_rate_reg=&code_rate_reg;
2969*53ee8cc1Swenshuai.xi     Drv_DVBS_GetTsDivNum_PARAM.bRet=false;
2970*53ee8cc1Swenshuai.xi 
2971*53ee8cc1Swenshuai.xi     if(u8DemodLockFlag==1)
2972*53ee8cc1Swenshuai.xi     {
2973*53ee8cc1Swenshuai.xi          UtopiaIoctl(ppDVBSInstant, DMD_DVBS_DRV_CMD_GetTsDivNum, &Drv_DVBS_GetTsDivNum_PARAM);
2974*53ee8cc1Swenshuai.xi          status &= Drv_DVBS_GetTsDivNum_PARAM.bRet;
2975*53ee8cc1Swenshuai.xi 
2976*53ee8cc1Swenshuai.xi          if(!system_type_reg) // DVBS2
2977*53ee8cc1Swenshuai.xi          {
2978*53ee8cc1Swenshuai.xi                 k_bch.DATA = k_bch_array[fec_type_idx][code_rate_idx];
2979*53ee8cc1Swenshuai.xi                 k_bch.EXP = 0;
2980*53ee8cc1Swenshuai.xi                 n_ldpc.DATA = n_ldpc_array[fec_type_idx];
2981*53ee8cc1Swenshuai.xi                 n_ldpc.EXP = 0;
2982*53ee8cc1Swenshuai.xi 
2983*53ee8cc1Swenshuai.xi                 pilot_term.DATA = ( n_ldpc.DATA / modulation_order / 1440 * 36) * pilot_flag + 90; // pilot_term + header
2984*53ee8cc1Swenshuai.xi                 pilot_term.EXP = 0;
2985*53ee8cc1Swenshuai.xi 
2986*53ee8cc1Swenshuai.xi                 //data rate
2987*53ee8cc1Swenshuai.xi                 //ftmp = k_bch/(  (n_ldpc/modulation_order+90+pilot_term)  / u32SymbolRate);
2988*53ee8cc1Swenshuai.xi 
2989*53ee8cc1Swenshuai.xi                 temp.DATA = modulation_order;
2990*53ee8cc1Swenshuai.xi                 temp.EXP = 0;
2991*53ee8cc1Swenshuai.xi 
2992*53ee8cc1Swenshuai.xi                 temp = MS_FLOAT_OP(n_ldpc, temp, divide); // temp = n_ldpc / modulation_order
2993*53ee8cc1Swenshuai.xi                 //ULOGD("DEMOD", ">>>n_ldpc / modulation_order = %d*2^%d<<<\n", temp.DATA, temp.EXP);
2994*53ee8cc1Swenshuai.xi 
2995*53ee8cc1Swenshuai.xi                 temp = MS_FLOAT_OP(temp, pilot_term, add); // temp += pilot_term + header(90)
2996*53ee8cc1Swenshuai.xi                 //ULOGD("DEMOD", ">>>n_ldpc / modulation_order + pilot_term + header(90) = %d*2^%d<<<\n", temp.DATA, temp.EXP);
2997*53ee8cc1Swenshuai.xi 
2998*53ee8cc1Swenshuai.xi                 ftmp.DATA = u32SymbolRate;
2999*53ee8cc1Swenshuai.xi                 ftmp.EXP = 0;
3000*53ee8cc1Swenshuai.xi 
3001*53ee8cc1Swenshuai.xi                 ftmp = MS_FLOAT_OP(temp, ftmp, divide); // ftmp = temp /= u32SymbolRate = (n_ldpc/modulation_order+pilot_term+header(90)) / u32SymbolRate
3002*53ee8cc1Swenshuai.xi 
3003*53ee8cc1Swenshuai.xi                 ftmp = MS_FLOAT_OP(k_bch, ftmp, divide); // ftmp = k_bch / ( (n_ldpc/modulation_order+pilot_term+header(90)) / u32SymbolRate)
3004*53ee8cc1Swenshuai.xi 
3005*53ee8cc1Swenshuai.xi                 //ULOGD("DEMOD", ">>>ftmp = %d*2^%d<<<\n", ftmp.DATA, ftmp.EXP);
3006*53ee8cc1Swenshuai.xi 
3007*53ee8cc1Swenshuai.xi                 if(sDMD_DVBS_Info.bSerialTS)//serial mode
3008*53ee8cc1Swenshuai.xi                 {
3009*53ee8cc1Swenshuai.xi                     //fTSDivNum = 288000.0 / ftmp / 2.0 - 1;
3010*53ee8cc1Swenshuai.xi 
3011*53ee8cc1Swenshuai.xi                     temp.DATA = 288000;
3012*53ee8cc1Swenshuai.xi                     temp.EXP = 0;
3013*53ee8cc1Swenshuai.xi 
3014*53ee8cc1Swenshuai.xi                     fTSDivNum = MS_FLOAT_OP(temp, ftmp, divide); // fTSDivNum = 288000 / ftmp
3015*53ee8cc1Swenshuai.xi 
3016*53ee8cc1Swenshuai.xi                     fTSDivNum.EXP -= 1; // fTSDivNum /= 2
3017*53ee8cc1Swenshuai.xi 
3018*53ee8cc1Swenshuai.xi                     temp.DATA = 1;
3019*53ee8cc1Swenshuai.xi                     temp.EXP = 0;
3020*53ee8cc1Swenshuai.xi 
3021*53ee8cc1Swenshuai.xi                     fTSDivNum = MS_FLOAT_OP(fTSDivNum, temp, minus); // fTSDivNum -= 1
3022*53ee8cc1Swenshuai.xi                 }
3023*53ee8cc1Swenshuai.xi                 else//parallel mode
3024*53ee8cc1Swenshuai.xi                 {
3025*53ee8cc1Swenshuai.xi                     //fTSDivNum = 288000.0 / (ftmp/8.0) / 2.0 - 1;
3026*53ee8cc1Swenshuai.xi 
3027*53ee8cc1Swenshuai.xi                     temp.DATA = 288000;
3028*53ee8cc1Swenshuai.xi                     temp.EXP = 3;
3029*53ee8cc1Swenshuai.xi 
3030*53ee8cc1Swenshuai.xi                     fTSDivNum = MS_FLOAT_OP(temp, ftmp, divide); // fTSDivNum = 288000 / (ftmp/8)
3031*53ee8cc1Swenshuai.xi 
3032*53ee8cc1Swenshuai.xi                     fTSDivNum.EXP -= 1; // fTSDivNum /= 2
3033*53ee8cc1Swenshuai.xi 
3034*53ee8cc1Swenshuai.xi                     temp.DATA = 1;
3035*53ee8cc1Swenshuai.xi                     temp.EXP = 0;
3036*53ee8cc1Swenshuai.xi 
3037*53ee8cc1Swenshuai.xi                     fTSDivNum = MS_FLOAT_OP(fTSDivNum, temp, minus); // fTSDivNum -= 1
3038*53ee8cc1Swenshuai.xi 
3039*53ee8cc1Swenshuai.xi                     //ULOGD("DEMOD", ">>>fTSDivNum = %d*2^%d<<<\n", fTSDivNum.DATA, fTSDivNum.EXP);
3040*53ee8cc1Swenshuai.xi                 }
3041*53ee8cc1Swenshuai.xi 
3042*53ee8cc1Swenshuai.xi                 fTSDivNum = MS_FLOAT_OP(fTSDivNum, ts_div_num_offset, minus); // fTSDivNum -= ts_div_num_offset
3043*53ee8cc1Swenshuai.xi          }
3044*53ee8cc1Swenshuai.xi          else // DVBS
3045*53ee8cc1Swenshuai.xi          {
3046*53ee8cc1Swenshuai.xi             if(code_rate_reg < 5)
3047*53ee8cc1Swenshuai.xi                 code_rate_reg = DVBS_CR_TABLE[code_rate_reg]; // mapping code_rate_reg => CR
3048*53ee8cc1Swenshuai.xi             else
3049*53ee8cc1Swenshuai.xi                 code_rate_reg = 8; // default set CR = 7/8
3050*53ee8cc1Swenshuai.xi 
3051*53ee8cc1Swenshuai.xi             temp.DATA = code_rate_reg;
3052*53ee8cc1Swenshuai.xi             temp.EXP = 0;
3053*53ee8cc1Swenshuai.xi             temp1.DATA = code_rate_reg-1;
3054*53ee8cc1Swenshuai.xi             temp1.EXP = 0;
3055*53ee8cc1Swenshuai.xi 
3056*53ee8cc1Swenshuai.xi             ftmp = MS_FLOAT_OP(temp1, temp, divide); // ftmp = (CR_REG-1) / CR_REG = CR
3057*53ee8cc1Swenshuai.xi 
3058*53ee8cc1Swenshuai.xi             temp.DATA = 204;
3059*53ee8cc1Swenshuai.xi             temp.EXP = 0;
3060*53ee8cc1Swenshuai.xi             temp1.DATA = 188;
3061*53ee8cc1Swenshuai.xi             temp1.EXP = 0;
3062*53ee8cc1Swenshuai.xi 
3063*53ee8cc1Swenshuai.xi             temp = MS_FLOAT_OP(temp1, temp, divide); // temp = 188 / 204
3064*53ee8cc1Swenshuai.xi 
3065*53ee8cc1Swenshuai.xi             ftmp = MS_FLOAT_OP(ftmp, temp, multiply); // ftmp = CR * (188/204)
3066*53ee8cc1Swenshuai.xi 
3067*53ee8cc1Swenshuai.xi             temp.DATA = u32SymbolRate*2;
3068*53ee8cc1Swenshuai.xi             temp.EXP = 0;
3069*53ee8cc1Swenshuai.xi 
3070*53ee8cc1Swenshuai.xi             temp = MS_FLOAT_OP(temp, ts_div_num_margin_ratio, multiply); // temp = u32SymbolRate * 2 * ts_div_num_margin_ratio
3071*53ee8cc1Swenshuai.xi 
3072*53ee8cc1Swenshuai.xi             ftmp = MS_FLOAT_OP(ftmp, temp, multiply); // ftmp = CR * (188/204) * u32SymbolRate * 2 * ts_div_num_margin_ratio;
3073*53ee8cc1Swenshuai.xi 
3074*53ee8cc1Swenshuai.xi             if(sDMD_DVBS_Info.bSerialTS) // serial mode
3075*53ee8cc1Swenshuai.xi             {
3076*53ee8cc1Swenshuai.xi                 temp.DATA = 288000;
3077*53ee8cc1Swenshuai.xi                 temp.EXP = 0;
3078*53ee8cc1Swenshuai.xi             }
3079*53ee8cc1Swenshuai.xi             else // parallel mode
3080*53ee8cc1Swenshuai.xi             {
3081*53ee8cc1Swenshuai.xi                 temp.DATA = 288000*8;
3082*53ee8cc1Swenshuai.xi                 temp.EXP = 0;
3083*53ee8cc1Swenshuai.xi             }
3084*53ee8cc1Swenshuai.xi 
3085*53ee8cc1Swenshuai.xi             fTSDivNum = MS_FLOAT_OP(temp, ftmp, divide); // fTSDivNum = (288000*(parallel mode*8) / (CR*(188.0/204.0)*u32SymbolRate*ts_div_num_margin_ratio*2));
3086*53ee8cc1Swenshuai.xi 
3087*53ee8cc1Swenshuai.xi             fTSDivNum.EXP -= 1;// fTSDivNum /= 2
3088*53ee8cc1Swenshuai.xi 
3089*53ee8cc1Swenshuai.xi             fTSDivNum = MS_FLOAT_OP(fTSDivNum, ts_div_num_offset, minus); // fTSDivNum -= ts_div_num_offset
3090*53ee8cc1Swenshuai.xi          }
3091*53ee8cc1Swenshuai.xi 
3092*53ee8cc1Swenshuai.xi         temp.DATA = 0x1F;
3093*53ee8cc1Swenshuai.xi         temp.EXP = 0;
3094*53ee8cc1Swenshuai.xi 
3095*53ee8cc1Swenshuai.xi         if( MS_FLOAT_OP(fTSDivNum, temp, minus).DATA > 0 ) // fTSDivNum > 0x1F
3096*53ee8cc1Swenshuai.xi         {
3097*53ee8cc1Swenshuai.xi             fTSDivNum.DATA = 0x1F;
3098*53ee8cc1Swenshuai.xi             fTSDivNum.EXP = 0;
3099*53ee8cc1Swenshuai.xi         }
3100*53ee8cc1Swenshuai.xi 
3101*53ee8cc1Swenshuai.xi         temp.DATA = 0x01;
3102*53ee8cc1Swenshuai.xi         temp.EXP = 0;
3103*53ee8cc1Swenshuai.xi 
3104*53ee8cc1Swenshuai.xi         if( MS_FLOAT_OP(fTSDivNum, temp, minus).DATA < 0 ) // fTSDivNum < 0x01
3105*53ee8cc1Swenshuai.xi         {
3106*53ee8cc1Swenshuai.xi             fTSDivNum.DATA = 0x01;
3107*53ee8cc1Swenshuai.xi             fTSDivNum.EXP = 0;
3108*53ee8cc1Swenshuai.xi         }
3109*53ee8cc1Swenshuai.xi 
3110*53ee8cc1Swenshuai.xi         // shift bits
3111*53ee8cc1Swenshuai.xi          if(fTSDivNum.EXP >= 0)
3112*53ee8cc1Swenshuai.xi             u8Data = (fTSDivNum.DATA) << (fTSDivNum.EXP);
3113*53ee8cc1Swenshuai.xi          else
3114*53ee8cc1Swenshuai.xi             u8Data = (fTSDivNum.DATA) >> ((-1)*(fTSDivNum.EXP));
3115*53ee8cc1Swenshuai.xi 
3116*53ee8cc1Swenshuai.xi 	  #ifdef MS_DEBUG
3117*53ee8cc1Swenshuai.xi          ULOGD("DEMOD", ">>>INTERN_DVBS_Kernel_Mode TsClkDivNum = 0x%x<<<\n", u8Data);
3118*53ee8cc1Swenshuai.xi          #endif
3119*53ee8cc1Swenshuai.xi 
3120*53ee8cc1Swenshuai.xi          HAL_DMD_RIU_WriteByte(0x103300, u8Data);
3121*53ee8cc1Swenshuai.xi 
3122*53ee8cc1Swenshuai.xi          //Ts Output Enable
3123*53ee8cc1Swenshuai.xi          HAL_DMD_RIU_WriteByte(0x101eaa,0x10);
3124*53ee8cc1Swenshuai.xi     }
3125*53ee8cc1Swenshuai.xi 
3126*53ee8cc1Swenshuai.xi     return status;
3127*53ee8cc1Swenshuai.xi }
3128*53ee8cc1Swenshuai.xi #endif
3129