xref: /utopia/UTPA2-700.0.x/modules/demodulator/hal/k6/demod/halDMD_INTERN_common.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) 2006-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 INTERN_DVBT.c
98*53ee8cc1Swenshuai.xi /// @brief INTERN_DVBT DVBT
99*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor, Inc.
100*53ee8cc1Swenshuai.xi //
101*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
102*53ee8cc1Swenshuai.xi #include "MsCommon.h"
103*53ee8cc1Swenshuai.xi #include "MsIRQ.h"
104*53ee8cc1Swenshuai.xi #include "MsOS.h"
105*53ee8cc1Swenshuai.xi #include "MsTypes.h"
106*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
107*53ee8cc1Swenshuai.xi #include "drvDMD_common.h"
108*53ee8cc1Swenshuai.xi #include "drvDMD_VD_MBX.h"
109*53ee8cc1Swenshuai.xi #include "halDMD_INTERN_common.h"
110*53ee8cc1Swenshuai.xi #include "ULog.h"
111*53ee8cc1Swenshuai.xi 
112*53ee8cc1Swenshuai.xi #if defined (__aeon__)          // Non-OS
113*53ee8cc1Swenshuai.xi     #define BASEADDR_RIU 0xA0000000UL
114*53ee8cc1Swenshuai.xi //#elif ( OS_TYPE == linux )    // Linux
115*53ee8cc1Swenshuai.xi //    #define RIU_BASE u32RegOSBase    // MDrv_MIOMap_GetBASE(u32RegOSBase, puSize, MAP_NONPM_BANK)
116*53ee8cc1Swenshuai.xi #else                           // ecos
117*53ee8cc1Swenshuai.xi     #define BASEADDR_RIU 0xBF800000UL
118*53ee8cc1Swenshuai.xi #endif
119*53ee8cc1Swenshuai.xi 
120*53ee8cc1Swenshuai.xi #define RIU_MACRO_START     do {
121*53ee8cc1Swenshuai.xi #define RIU_MACRO_END       } while (0)
122*53ee8cc1Swenshuai.xi 
123*53ee8cc1Swenshuai.xi // Address bus of RIU is 16 bits.
124*53ee8cc1Swenshuai.xi #define RIU_READ_BYTE(addr)         ( READ_BYTE( _hal_DMD.virtDMDBaseAddr + (addr) ) )
125*53ee8cc1Swenshuai.xi #define RIU_READ_2BYTE(addr)        ( READ_WORD( _hal_DMD.virtDMDBaseAddr + (addr) ) )
126*53ee8cc1Swenshuai.xi #define RIU_WRITE_BYTE(addr, val)   { WRITE_BYTE( _hal_DMD.virtDMDBaseAddr + (addr), val) }
127*53ee8cc1Swenshuai.xi #define RIU_WRITE_2BYTE(addr, val)  { WRITE_WORD( _hal_DMD.virtDMDBaseAddr + (addr), val) }
128*53ee8cc1Swenshuai.xi 
129*53ee8cc1Swenshuai.xi //=============================================================
130*53ee8cc1Swenshuai.xi // Standard Form
131*53ee8cc1Swenshuai.xi 
132*53ee8cc1Swenshuai.xi #define RIU_ReadByte( u32Reg )   RIU_READ_BYTE(((u32Reg) << 1) - ((u32Reg) & 1))
133*53ee8cc1Swenshuai.xi 
134*53ee8cc1Swenshuai.xi #define RIU_Read2Byte( u32Reg )    (RIU_READ_2BYTE((u32Reg)<<1))
135*53ee8cc1Swenshuai.xi 
136*53ee8cc1Swenshuai.xi #define RIU_ReadRegBit( u32Reg, u8Mask )   (RIU_READ_BYTE(((u32Reg)<<1) - ((u32Reg) & 1)) & (u8Mask))
137*53ee8cc1Swenshuai.xi 
138*53ee8cc1Swenshuai.xi #define RIU_WriteRegBit( u32Reg, bEnable, u8Mask )                                     \
139*53ee8cc1Swenshuai.xi     RIU_MACRO_START                                                                     \
140*53ee8cc1Swenshuai.xi     RIU_WRITE_BYTE( (((u32Reg) <<1) - ((u32Reg) & 1)) , (bEnable) ? (RIU_READ_BYTE(  (((u32Reg) <<1) - ((u32Reg) & 1))  ) |  (u8Mask)) :                           \
141*53ee8cc1Swenshuai.xi                                 (RIU_READ_BYTE( (((u32Reg) <<1) - ((u32Reg) & 1)) ) & ~(u8Mask)));                            \
142*53ee8cc1Swenshuai.xi     RIU_MACRO_END
143*53ee8cc1Swenshuai.xi 
144*53ee8cc1Swenshuai.xi #define RIU_WriteByte( u32Reg, u8Val )                                                 \
145*53ee8cc1Swenshuai.xi     RIU_MACRO_START                                                                     \
146*53ee8cc1Swenshuai.xi     RIU_WRITE_BYTE(((u32Reg) << 1) - ((u32Reg) & 1), u8Val);   \
147*53ee8cc1Swenshuai.xi     RIU_MACRO_END
148*53ee8cc1Swenshuai.xi 
149*53ee8cc1Swenshuai.xi #define RIU_Write2Byte( u32Reg, u16Val )                                               \
150*53ee8cc1Swenshuai.xi     RIU_MACRO_START                                                                     \
151*53ee8cc1Swenshuai.xi     if ( ((u32Reg) & 0x01) )                                                        \
152*53ee8cc1Swenshuai.xi     {                                                                               \
153*53ee8cc1Swenshuai.xi         RIU_WRITE_BYTE(((u32Reg) << 1) - 1, (MS_U8)((u16Val)));                                  \
154*53ee8cc1Swenshuai.xi         RIU_WRITE_BYTE(((u32Reg) + 1) << 1, (MS_U8)((u16Val) >> 8));                             \
155*53ee8cc1Swenshuai.xi     }                                                                               \
156*53ee8cc1Swenshuai.xi     else                                                                            \
157*53ee8cc1Swenshuai.xi     {                                                                               \
158*53ee8cc1Swenshuai.xi         RIU_WRITE_2BYTE( ((u32Reg)<<1) ,  u16Val);                                                       \
159*53ee8cc1Swenshuai.xi     }                                                                               \
160*53ee8cc1Swenshuai.xi     RIU_MACRO_END
161*53ee8cc1Swenshuai.xi 
162*53ee8cc1Swenshuai.xi #define RIU_WriteByteMask( u32Reg, u8Val, u8Msk )                                      \
163*53ee8cc1Swenshuai.xi     RIU_MACRO_START                                                                     \
164*53ee8cc1Swenshuai.xi     RIU_WRITE_BYTE( (((u32Reg) <<1) - ((u32Reg) & 1)), (RIU_READ_BYTE((((u32Reg) <<1) - ((u32Reg) & 1))) & ~(u8Msk)) | ((u8Val) & (u8Msk)));                   \
165*53ee8cc1Swenshuai.xi     RIU_MACRO_END
166*53ee8cc1Swenshuai.xi 
167*53ee8cc1Swenshuai.xi 
168*53ee8cc1Swenshuai.xi typedef struct
169*53ee8cc1Swenshuai.xi {
170*53ee8cc1Swenshuai.xi     MS_VIRT  virtDMDBaseAddr;
171*53ee8cc1Swenshuai.xi     MS_BOOL bBaseAddrInitialized;
172*53ee8cc1Swenshuai.xi } hal_DMD_t;
173*53ee8cc1Swenshuai.xi 
174*53ee8cc1Swenshuai.xi static hal_DMD_t _hal_DMD = // TODO: review, it would be init in Config()
175*53ee8cc1Swenshuai.xi {
176*53ee8cc1Swenshuai.xi     .virtDMDBaseAddr = BASEADDR_RIU,
177*53ee8cc1Swenshuai.xi     .bBaseAddrInitialized = 0,
178*53ee8cc1Swenshuai.xi };
179*53ee8cc1Swenshuai.xi 
180*53ee8cc1Swenshuai.xi extern s_I2C_Interface_func sI2cInterfaceFunc;
181*53ee8cc1Swenshuai.xi 
HAL_DMD_RegInit(void)182*53ee8cc1Swenshuai.xi MS_BOOL HAL_DMD_RegInit (void)
183*53ee8cc1Swenshuai.xi {
184*53ee8cc1Swenshuai.xi     MS_VIRT virtNonPMBank;
185*53ee8cc1Swenshuai.xi     MS_PHY phyNonPMBankSize;
186*53ee8cc1Swenshuai.xi 
187*53ee8cc1Swenshuai.xi 
188*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","bryan check DMD init!!\n");
189*53ee8cc1Swenshuai.xi     if (!MDrv_MMIO_GetBASE( &virtNonPMBank, &phyNonPMBankSize, MS_MODULE_PM))
190*53ee8cc1Swenshuai.xi     {
191*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
192*53ee8cc1Swenshuai.xi         ULOGD("DEMOD","HAL_DMD_RegInit failure to get MS_MODULE_PM\n");
193*53ee8cc1Swenshuai.xi         #endif
194*53ee8cc1Swenshuai.xi         _hal_DMD.virtDMDBaseAddr = BASEADDR_RIU; // TODO what to do if failed??
195*53ee8cc1Swenshuai.xi         _hal_DMD.bBaseAddrInitialized = 0;
196*53ee8cc1Swenshuai.xi         return FALSE;
197*53ee8cc1Swenshuai.xi     }
198*53ee8cc1Swenshuai.xi 
199*53ee8cc1Swenshuai.xi     //HAL_ParFlash_Config(u32NonPMBank);
200*53ee8cc1Swenshuai.xi     _hal_DMD.virtDMDBaseAddr=virtNonPMBank;
201*53ee8cc1Swenshuai.xi     _hal_DMD.bBaseAddrInitialized = 1;
202*53ee8cc1Swenshuai.xi     return TRUE;
203*53ee8cc1Swenshuai.xi }
204*53ee8cc1Swenshuai.xi 
HAL_DMD_RIU_ReadByte(MS_U32 u32Addr)205*53ee8cc1Swenshuai.xi MS_U8 HAL_DMD_RIU_ReadByte(MS_U32 u32Addr)
206*53ee8cc1Swenshuai.xi {
207*53ee8cc1Swenshuai.xi     if (_hal_DMD.bBaseAddrInitialized)
208*53ee8cc1Swenshuai.xi     {
209*53ee8cc1Swenshuai.xi         return RIU_ReadByte(u32Addr);
210*53ee8cc1Swenshuai.xi     }
211*53ee8cc1Swenshuai.xi     else
212*53ee8cc1Swenshuai.xi     {
213*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
214*53ee8cc1Swenshuai.xi         ULOGD("DEMOD","%s base address un-initialized\n", __FUNCTION__);
215*53ee8cc1Swenshuai.xi         #endif
216*53ee8cc1Swenshuai.xi     }
217*53ee8cc1Swenshuai.xi     return 0;
218*53ee8cc1Swenshuai.xi }
219*53ee8cc1Swenshuai.xi 
HAL_DMD_RIU_ReadRegBit(MS_U32 u32Addr,MS_U8 u8Mask)220*53ee8cc1Swenshuai.xi MS_U8 HAL_DMD_RIU_ReadRegBit(MS_U32 u32Addr, MS_U8 u8Mask)
221*53ee8cc1Swenshuai.xi {
222*53ee8cc1Swenshuai.xi     if (_hal_DMD.bBaseAddrInitialized)
223*53ee8cc1Swenshuai.xi     {
224*53ee8cc1Swenshuai.xi         return RIU_ReadRegBit(u32Addr, u8Mask);
225*53ee8cc1Swenshuai.xi     }
226*53ee8cc1Swenshuai.xi     else
227*53ee8cc1Swenshuai.xi     {
228*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
229*53ee8cc1Swenshuai.xi         ULOGD("DEMOD","%s base address un-initialized\n", __FUNCTION__);
230*53ee8cc1Swenshuai.xi         #endif
231*53ee8cc1Swenshuai.xi     }
232*53ee8cc1Swenshuai.xi     return 0;
233*53ee8cc1Swenshuai.xi }
HAL_DMD_IIC_ReadByte(MS_U16 u16SlaveAddr,MS_U32 u32Addr,MS_U8 * pu8Data)234*53ee8cc1Swenshuai.xi MS_U8 HAL_DMD_IIC_ReadByte(MS_U16 u16SlaveAddr, MS_U32 u32Addr, MS_U8 *pu8Data)
235*53ee8cc1Swenshuai.xi {
236*53ee8cc1Swenshuai.xi 
237*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
238*53ee8cc1Swenshuai.xi     MS_U8 u8MsbData[6] = {0};
239*53ee8cc1Swenshuai.xi 
240*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
241*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
242*53ee8cc1Swenshuai.xi     u8MsbData[2] = 0x00;
243*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u32Addr >> 8) &0xff;
244*53ee8cc1Swenshuai.xi     u8MsbData[4] = u32Addr &0xff;
245*53ee8cc1Swenshuai.xi 
246*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x35;
247*53ee8cc1Swenshuai.xi     bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, 0, 1, u8MsbData);
248*53ee8cc1Swenshuai.xi 
249*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
250*53ee8cc1Swenshuai.xi     bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, 0, 5, u8MsbData);
251*53ee8cc1Swenshuai.xi     bRet &= sI2cInterfaceFunc.I2C_ReadBytes(u16SlaveAddr, 0, 0, 1, pu8Data);
252*53ee8cc1Swenshuai.xi 
253*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x34;
254*53ee8cc1Swenshuai.xi     bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, 0, 1, u8MsbData);
255*53ee8cc1Swenshuai.xi 
256*53ee8cc1Swenshuai.xi     return bRet;
257*53ee8cc1Swenshuai.xi }
HAL_DMD_RIU_Read2Byte(MS_U32 u32Addr)258*53ee8cc1Swenshuai.xi MS_U16 HAL_DMD_RIU_Read2Byte(MS_U32 u32Addr)
259*53ee8cc1Swenshuai.xi {
260*53ee8cc1Swenshuai.xi     if (_hal_DMD.bBaseAddrInitialized)
261*53ee8cc1Swenshuai.xi     {
262*53ee8cc1Swenshuai.xi         return RIU_Read2Byte(u32Addr);
263*53ee8cc1Swenshuai.xi     }
264*53ee8cc1Swenshuai.xi     else
265*53ee8cc1Swenshuai.xi     {
266*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
267*53ee8cc1Swenshuai.xi         ULOGD("DEMOD","%s base address un-initialized\n", __FUNCTION__);
268*53ee8cc1Swenshuai.xi         #endif
269*53ee8cc1Swenshuai.xi     }
270*53ee8cc1Swenshuai.xi     return 0;
271*53ee8cc1Swenshuai.xi }
272*53ee8cc1Swenshuai.xi 
HAL_DMD_IIC_WriteByte(MS_U16 u16SlaveAddr,MS_U32 u32Addr,MS_U8 u8Data)273*53ee8cc1Swenshuai.xi MS_U8 HAL_DMD_IIC_WriteByte(MS_U16 u16SlaveAddr, MS_U32 u32Addr, MS_U8 u8Data)
274*53ee8cc1Swenshuai.xi {
275*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
276*53ee8cc1Swenshuai.xi     MS_U8 u8MsbData[6] = {0};
277*53ee8cc1Swenshuai.xi 
278*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
279*53ee8cc1Swenshuai.xi     u8MsbData[1] = 0x00;
280*53ee8cc1Swenshuai.xi     u8MsbData[2] = 0x00;
281*53ee8cc1Swenshuai.xi     u8MsbData[3] = (u32Addr >> 8) &0xff;
282*53ee8cc1Swenshuai.xi     u8MsbData[4] = u32Addr &0xff;
283*53ee8cc1Swenshuai.xi     u8MsbData[5] = u8Data;
284*53ee8cc1Swenshuai.xi 
285*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x35;
286*53ee8cc1Swenshuai.xi     bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, 0, 1, u8MsbData);
287*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x10;
288*53ee8cc1Swenshuai.xi     bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, 0, 6, u8MsbData);
289*53ee8cc1Swenshuai.xi     u8MsbData[0] = 0x34;
290*53ee8cc1Swenshuai.xi     bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, 0, 1, u8MsbData);
291*53ee8cc1Swenshuai.xi 
292*53ee8cc1Swenshuai.xi     return bRet;
293*53ee8cc1Swenshuai.xi }
HAL_DMD_IIC_WriteBytes(MS_U16 u16SlaveAddr,MS_U32 u32Addr,MS_U8 * u8Data,MS_U8 u8Len)294*53ee8cc1Swenshuai.xi MS_U8 HAL_DMD_IIC_WriteBytes(MS_U16 u16SlaveAddr, MS_U32 u32Addr, MS_U8 *u8Data, MS_U8 u8Len)
295*53ee8cc1Swenshuai.xi {
296*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
297*53ee8cc1Swenshuai.xi     MS_U16 index;
298*53ee8cc1Swenshuai.xi     MS_U8 Data[0x80+5];
299*53ee8cc1Swenshuai.xi 
300*53ee8cc1Swenshuai.xi     Data[0] = 0x10;
301*53ee8cc1Swenshuai.xi     Data[1] = 0x00;
302*53ee8cc1Swenshuai.xi     Data[2] = 0x00;
303*53ee8cc1Swenshuai.xi     Data[3] = (u32Addr >> 8) &0xff;
304*53ee8cc1Swenshuai.xi     Data[4] = u32Addr &0xff;
305*53ee8cc1Swenshuai.xi 
306*53ee8cc1Swenshuai.xi     for(index = 0; index < u8Len ; index++)
307*53ee8cc1Swenshuai.xi     {
308*53ee8cc1Swenshuai.xi          Data[5+index] = u8Data[index];
309*53ee8cc1Swenshuai.xi     }
310*53ee8cc1Swenshuai.xi 
311*53ee8cc1Swenshuai.xi     Data[0] = 0x35;
312*53ee8cc1Swenshuai.xi     bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, 0, 1, Data);
313*53ee8cc1Swenshuai.xi     Data[0] = 0x10;
314*53ee8cc1Swenshuai.xi     bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, 0, 1, Data);
315*53ee8cc1Swenshuai.xi     sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, 0, (5 + u8Len), Data);
316*53ee8cc1Swenshuai.xi     Data[0] = 0x34;
317*53ee8cc1Swenshuai.xi     bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, 0, 1, Data);
318*53ee8cc1Swenshuai.xi 
319*53ee8cc1Swenshuai.xi     return bRet;
320*53ee8cc1Swenshuai.xi }
321*53ee8cc1Swenshuai.xi 
HAL_DMD_I2C_Channel_Set(MS_U16 u16SlaveAddr,MS_U8 ch_num)322*53ee8cc1Swenshuai.xi MS_BOOL HAL_DMD_I2C_Channel_Set(MS_U16 u16SlaveAddr, MS_U8 ch_num)
323*53ee8cc1Swenshuai.xi {
324*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
325*53ee8cc1Swenshuai.xi     MS_U8 Data[5] = {0x53, 0x45, 0x52, 0x44, 0x42};
326*53ee8cc1Swenshuai.xi     //Exit
327*53ee8cc1Swenshuai.xi     Data[0] = 0x34;
328*53ee8cc1Swenshuai.xi     bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, NULL, 1, Data); //MDrv_msb131x_IIC_Write(DEMOD_MSB131X_SLAVE_ID, 0, 0, Data, 1);
329*53ee8cc1Swenshuai.xi     Data[0]=(ch_num & 0x01)? 0x36 : 0x45;
330*53ee8cc1Swenshuai.xi     bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, NULL, 1, Data); //MDrv_msb131x_IIC_Write(DEMOD_MSB131X_SLAVE_ID, 0, 0, Data, 1);
331*53ee8cc1Swenshuai.xi     //Init
332*53ee8cc1Swenshuai.xi     Data[0] = 0x53;
333*53ee8cc1Swenshuai.xi     bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, NULL, 5, Data); //MDrv_msb131x_IIC_Write(DEMOD_MSB131X_SLAVE_ID, 0, 0, Data, 5);
334*53ee8cc1Swenshuai.xi     Data[0]=(ch_num & 0x04)? 0x80 : 0x81;
335*53ee8cc1Swenshuai.xi     bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, NULL, 1, Data); //MDrv_msb131x_IIC_Write(DEMOD_MSB131X_SLAVE_ID, 0, 0, Data, 1);
336*53ee8cc1Swenshuai.xi     if ((ch_num==4)||(ch_num==5)||(ch_num==1))
337*53ee8cc1Swenshuai.xi         Data[0]=0x82;
338*53ee8cc1Swenshuai.xi     else
339*53ee8cc1Swenshuai.xi         Data[0] = 0x83;
340*53ee8cc1Swenshuai.xi      bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, NULL, 1, Data); //MDrv_msb131x_IIC_Write(DEMOD_MSB131X_SLAVE_ID, 0, 0, Data, 1);
341*53ee8cc1Swenshuai.xi 
342*53ee8cc1Swenshuai.xi     if ((ch_num==4)||(ch_num==5))
343*53ee8cc1Swenshuai.xi         Data[0]=0x85;
344*53ee8cc1Swenshuai.xi     else
345*53ee8cc1Swenshuai.xi         Data[0] = 0x84;
346*53ee8cc1Swenshuai.xi 
347*53ee8cc1Swenshuai.xi      bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, NULL, 1, Data); //MDrv_msb131x_IIC_Write(DEMOD_MSB131X_SLAVE_ID, 0, 0, Data, 1);
348*53ee8cc1Swenshuai.xi      Data[0]=(ch_num & 0x01)? 0x51 : 0x53;
349*53ee8cc1Swenshuai.xi      bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, NULL, 1, Data); //MDrv_msb131x_IIC_Write(DEMOD_MSB131X_SLAVE_ID, 0, 0, Data, 1);
350*53ee8cc1Swenshuai.xi      Data[0]=(ch_num & 0x01)? 0x37 : 0x7F;
351*53ee8cc1Swenshuai.xi      bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, NULL, 1, Data); //MDrv_msb131x_IIC_Write(DEMOD_MSB131X_SLAVE_ID, 0, 0, Data, 1);
352*53ee8cc1Swenshuai.xi      Data[0] = 0x35;
353*53ee8cc1Swenshuai.xi      bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, NULL, 1, Data); //MDrv_msb131x_IIC_Write(DEMOD_MSB131X_SLAVE_ID, 0, 0, Data, 1);
354*53ee8cc1Swenshuai.xi      Data[0] = 0x71;
355*53ee8cc1Swenshuai.xi      bRet &= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, NULL, 1, Data); //MDrv_msb131x_IIC_Write(DEMOD_MSB131X_SLAVE_ID, 0, 0, Data, 1);
356*53ee8cc1Swenshuai.xi //     MsOS_ReleaseMutex(_s32MutexId);
357*53ee8cc1Swenshuai.xi      return bRet;
358*53ee8cc1Swenshuai.xi }
359*53ee8cc1Swenshuai.xi 
HAL_DMD_I2C_Channel_Change(MS_U16 u16SlaveAddr,MS_U8 ch_num)360*53ee8cc1Swenshuai.xi MS_BOOL HAL_DMD_I2C_Channel_Change(MS_U16 u16SlaveAddr, MS_U8 ch_num)
361*53ee8cc1Swenshuai.xi {
362*53ee8cc1Swenshuai.xi     MS_BOOL bRet=TRUE;
363*53ee8cc1Swenshuai.xi     MS_U8 Data[5] = {0x53, 0x45, 0x52, 0x44, 0x42};
364*53ee8cc1Swenshuai.xi     Data[0] = (ch_num & 0x01)? 0x81 : 0x80;
365*53ee8cc1Swenshuai.xi     bRet&= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, 0, 1, Data);
366*53ee8cc1Swenshuai.xi     Data[0] = (ch_num & 0x02)? 0x83 : 0x82;
367*53ee8cc1Swenshuai.xi     bRet&= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, 0, 1, Data);
368*53ee8cc1Swenshuai.xi     Data[0] = (ch_num & 0x04)? 0x85 : 0x84;
369*53ee8cc1Swenshuai.xi     bRet&= sI2cInterfaceFunc.I2C_WriteBytes(u16SlaveAddr, 0, 0, 1, Data);
370*53ee8cc1Swenshuai.xi 
371*53ee8cc1Swenshuai.xi     return bRet;
372*53ee8cc1Swenshuai.xi }
HAL_DMD_RIU_WriteByte(MS_U32 u32Addr,MS_U8 u8Value)373*53ee8cc1Swenshuai.xi void HAL_DMD_RIU_WriteByte(MS_U32 u32Addr, MS_U8 u8Value)
374*53ee8cc1Swenshuai.xi {
375*53ee8cc1Swenshuai.xi     if (_hal_DMD.bBaseAddrInitialized)
376*53ee8cc1Swenshuai.xi     {
377*53ee8cc1Swenshuai.xi         RIU_WriteByte(u32Addr, u8Value);
378*53ee8cc1Swenshuai.xi     }
379*53ee8cc1Swenshuai.xi     else
380*53ee8cc1Swenshuai.xi     {
381*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
382*53ee8cc1Swenshuai.xi         ULOGD("DEMOD","%s base address un-initialized\n", __FUNCTION__);
383*53ee8cc1Swenshuai.xi         #endif
384*53ee8cc1Swenshuai.xi     }
385*53ee8cc1Swenshuai.xi }
386*53ee8cc1Swenshuai.xi 
HAL_DMD_RIU_WriteRegBit(MS_U32 u32Addr,MS_BOOL bEnable,MS_U8 u8Mask)387*53ee8cc1Swenshuai.xi void HAL_DMD_RIU_WriteRegBit(MS_U32 u32Addr, MS_BOOL bEnable, MS_U8 u8Mask)
388*53ee8cc1Swenshuai.xi {
389*53ee8cc1Swenshuai.xi     if (_hal_DMD.bBaseAddrInitialized)
390*53ee8cc1Swenshuai.xi     {
391*53ee8cc1Swenshuai.xi         RIU_WriteRegBit(u32Addr, bEnable, u8Mask);
392*53ee8cc1Swenshuai.xi     }
393*53ee8cc1Swenshuai.xi     else
394*53ee8cc1Swenshuai.xi     {
395*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
396*53ee8cc1Swenshuai.xi         ULOGD("DEMOD","%s base address un-initialized\n", __FUNCTION__);
397*53ee8cc1Swenshuai.xi         #endif
398*53ee8cc1Swenshuai.xi     }
399*53ee8cc1Swenshuai.xi }
400*53ee8cc1Swenshuai.xi 
HAL_DMD_RIU_WriteByteMask(MS_U32 u32Addr,MS_U8 u8Value,MS_U8 u8Mask)401*53ee8cc1Swenshuai.xi void HAL_DMD_RIU_WriteByteMask(MS_U32 u32Addr, MS_U8 u8Value, MS_U8 u8Mask)
402*53ee8cc1Swenshuai.xi {
403*53ee8cc1Swenshuai.xi     if (_hal_DMD.bBaseAddrInitialized)
404*53ee8cc1Swenshuai.xi     {
405*53ee8cc1Swenshuai.xi         RIU_WriteByteMask(u32Addr, u8Value, u8Mask);
406*53ee8cc1Swenshuai.xi     }
407*53ee8cc1Swenshuai.xi     else
408*53ee8cc1Swenshuai.xi     {
409*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
410*53ee8cc1Swenshuai.xi         ULOGD("DEMOD","%s base address un-initialized\n", __FUNCTION__);
411*53ee8cc1Swenshuai.xi         #endif
412*53ee8cc1Swenshuai.xi     }
413*53ee8cc1Swenshuai.xi }
414*53ee8cc1Swenshuai.xi 
HAL_DMD_RIU_Write2Byte(MS_U32 u32Addr,MS_U16 u16Value)415*53ee8cc1Swenshuai.xi void HAL_DMD_RIU_Write2Byte(MS_U32 u32Addr, MS_U16 u16Value)
416*53ee8cc1Swenshuai.xi {
417*53ee8cc1Swenshuai.xi     if (_hal_DMD.bBaseAddrInitialized)
418*53ee8cc1Swenshuai.xi     {
419*53ee8cc1Swenshuai.xi         RIU_Write2Byte(u32Addr, u16Value);
420*53ee8cc1Swenshuai.xi     }
421*53ee8cc1Swenshuai.xi     else
422*53ee8cc1Swenshuai.xi     {
423*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
424*53ee8cc1Swenshuai.xi         ULOGD("DEMOD","%s base address un-initialized\n", __FUNCTION__);
425*53ee8cc1Swenshuai.xi         #endif
426*53ee8cc1Swenshuai.xi     }
427*53ee8cc1Swenshuai.xi }
428*53ee8cc1Swenshuai.xi 
429*53ee8cc1Swenshuai.xi //waiting add
HAL_DMD_IFAGC_RegRead(MS_U8 * ifagc_reg,MS_U8 * ifagc_reg_lsb,MS_U16 * ifagc_err)430*53ee8cc1Swenshuai.xi MS_BOOL HAL_DMD_IFAGC_RegRead(MS_U8 *ifagc_reg, MS_U8 *ifagc_reg_lsb, MS_U16 *ifagc_err)
431*53ee8cc1Swenshuai.xi {
432*53ee8cc1Swenshuai.xi 	MS_U8   status = true;
433*53ee8cc1Swenshuai.xi 	MS_U8   reg_tmp = 0, reg_tmp2 =0, reg_frz = 0;
434*53ee8cc1Swenshuai.xi 	// bank 5 0x24 [15:0] reg_agc_gain2_out
435*53ee8cc1Swenshuai.xi   // use only high byte value
436*53ee8cc1Swenshuai.xi 
437*53ee8cc1Swenshuai.xi   // select IF gain to read
438*53ee8cc1Swenshuai.xi   status &= MDrv_SYS_DMD_VD_MBX_WriteReg(TDF_REG_BASE + 0x22, 0x03);
439*53ee8cc1Swenshuai.xi   status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDF_REG_BASE + 0x05, &reg_frz);
440*53ee8cc1Swenshuai.xi   status &= MDrv_SYS_DMD_VD_MBX_WriteReg(TDF_REG_BASE + 0x05, reg_frz | 0x80);
441*53ee8cc1Swenshuai.xi   status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDF_REG_BASE + 0x25, &reg_tmp);
442*53ee8cc1Swenshuai.xi   *ifagc_reg = reg_tmp;
443*53ee8cc1Swenshuai.xi   status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDF_REG_BASE + 0x24, &reg_tmp);
444*53ee8cc1Swenshuai.xi   *ifagc_reg_lsb = reg_tmp;
445*53ee8cc1Swenshuai.xi   status &= MDrv_SYS_DMD_VD_MBX_WriteReg(TDF_REG_BASE + 0x05, reg_frz);
446*53ee8cc1Swenshuai.xi 
447*53ee8cc1Swenshuai.xi   #ifdef MS_DEBUG
448*53ee8cc1Swenshuai.xi   ULOGD("DEMOD","SSI_IFAGC_H = 0x%x 0x%x\n", *ifagc_reg,*ifagc_reg_lsb);
449*53ee8cc1Swenshuai.xi   #endif
450*53ee8cc1Swenshuai.xi 
451*53ee8cc1Swenshuai.xi   *ifagc_err = 0;
452*53ee8cc1Swenshuai.xi   if(*ifagc_reg == 0xff)
453*53ee8cc1Swenshuai.xi   {
454*53ee8cc1Swenshuai.xi     // bank 5 0x04 [15] reg_tdp_lat
455*53ee8cc1Swenshuai.xi     status &= MDrv_SYS_DMD_VD_MBX_WriteReg(TDF_REG_BASE + 0x22, 0x00);
456*53ee8cc1Swenshuai.xi     status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDF_REG_BASE + 0x05, &reg_frz);
457*53ee8cc1Swenshuai.xi     status &= MDrv_SYS_DMD_VD_MBX_WriteReg(TDF_REG_BASE + 0x05, reg_frz | 0x80);
458*53ee8cc1Swenshuai.xi 
459*53ee8cc1Swenshuai.xi     // bank 5 0x2c [9:0] reg_agc_error
460*53ee8cc1Swenshuai.xi     status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDF_REG_BASE + 0x25, &reg_tmp);
461*53ee8cc1Swenshuai.xi     // if_agc_err = reg_tmp & 0x03;
462*53ee8cc1Swenshuai.xi     status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDF_REG_BASE + 0x24, &reg_tmp2);
463*53ee8cc1Swenshuai.xi     // if_agc_err = (if_agc_err << 6)|(reg_tmp >> 2);
464*53ee8cc1Swenshuai.xi 
465*53ee8cc1Swenshuai.xi     if(reg_tmp&0x2)
466*53ee8cc1Swenshuai.xi     {
467*53ee8cc1Swenshuai.xi        *ifagc_err = ((((~reg_tmp)&0x03)<<8)|((~reg_tmp2)&0xff)) + 1;
468*53ee8cc1Swenshuai.xi     }
469*53ee8cc1Swenshuai.xi     else
470*53ee8cc1Swenshuai.xi     {
471*53ee8cc1Swenshuai.xi        *ifagc_err = reg_tmp<<8|reg_tmp2;
472*53ee8cc1Swenshuai.xi     }
473*53ee8cc1Swenshuai.xi 
474*53ee8cc1Swenshuai.xi     // release latch
475*53ee8cc1Swenshuai.xi     status &= MDrv_SYS_DMD_VD_MBX_WriteReg(TDF_REG_BASE + 0x05, reg_frz);
476*53ee8cc1Swenshuai.xi   }
477*53ee8cc1Swenshuai.xi 
478*53ee8cc1Swenshuai.xi 
479*53ee8cc1Swenshuai.xi   return status;
480*53ee8cc1Swenshuai.xi }
481*53ee8cc1Swenshuai.xi 
482*53ee8cc1Swenshuai.xi //waiting mark
483*53ee8cc1Swenshuai.xi #if(0)
HAL_DMD_GetRFLevel(float * fRFPowerDbmResult,float fRFPowerDbm,MS_U8 u8SarValue,DMD_RFAGC_SSI * pRfagcSsi,MS_U16 u16RfagcSsi_Size,DMD_IFAGC_SSI * pIfagcSsi_HiRef,MS_U16 u16IfagcSsi_HiRef_Size,DMD_IFAGC_SSI * pIfagcSsi_LoRef,MS_U16 u16IfagcSsi_LoRef_Size,DMD_IFAGC_ERR * pIfagcErr_LoRef,MS_U16 u16IfagcErr_LoRef_Size,DMD_IFAGC_ERR * pIfagcErr_HiRef,MS_U16 u16IfagcErr_HiRef_Size)484*53ee8cc1Swenshuai.xi MS_BOOL HAL_DMD_GetRFLevel(float *fRFPowerDbmResult, float fRFPowerDbm, MS_U8 u8SarValue,
485*53ee8cc1Swenshuai.xi                                                      DMD_RFAGC_SSI *pRfagcSsi, MS_U16 u16RfagcSsi_Size,
486*53ee8cc1Swenshuai.xi                                                      DMD_IFAGC_SSI *pIfagcSsi_HiRef, MS_U16 u16IfagcSsi_HiRef_Size,
487*53ee8cc1Swenshuai.xi                                                      DMD_IFAGC_SSI *pIfagcSsi_LoRef, MS_U16 u16IfagcSsi_LoRef_Size,
488*53ee8cc1Swenshuai.xi                                                      DMD_IFAGC_ERR *pIfagcErr_LoRef, MS_U16 u16IfagcErr_LoRef_Size,
489*53ee8cc1Swenshuai.xi                                                      DMD_IFAGC_ERR *pIfagcErr_HiRef, MS_U16 u16IfagcErr_HiRef_Size)
490*53ee8cc1Swenshuai.xi {
491*53ee8cc1Swenshuai.xi     DMD_IFAGC_SSI   *ifagc_ssi;
492*53ee8cc1Swenshuai.xi     DMD_IFAGC_ERR   *ifagc_err;
493*53ee8cc1Swenshuai.xi     float   ch_power_db=0.0f;
494*53ee8cc1Swenshuai.xi     float   ch_power_rf=0.0f;
495*53ee8cc1Swenshuai.xi     float   ch_power_if=0.0f, ch_power_ifa = 0.0f, ch_power_ifb =0.0f;
496*53ee8cc1Swenshuai.xi     float   ch_power_takeover=0.0f;
497*53ee8cc1Swenshuai.xi     MS_U16  if_agc_err = 0;
498*53ee8cc1Swenshuai.xi     MS_U8   status = true;
499*53ee8cc1Swenshuai.xi     MS_U8   reg_tmp = 0, reg_tmp2 =0, reg_frz = 0,rf_agc_val =0,if_agc_val =0, if_agc_vala =0, if_agc_valb =0, if_agc_val_lsb =0, i;
500*53ee8cc1Swenshuai.xi     MS_U8   ssi_tbl_len = 0, err_tbl_len = 0;
501*53ee8cc1Swenshuai.xi 
502*53ee8cc1Swenshuai.xi     if ((pIfagcSsi_HiRef != NULL) && (pIfagcSsi_LoRef !=NULL))
503*53ee8cc1Swenshuai.xi     {
504*53ee8cc1Swenshuai.xi         // get RFAGC level
505*53ee8cc1Swenshuai.xi         if (fRFPowerDbm>=100.0) // unreasonable input value, get RF level from RFAGG
506*53ee8cc1Swenshuai.xi         {
507*53ee8cc1Swenshuai.xi             rf_agc_val = u8SarValue;
508*53ee8cc1Swenshuai.xi 
509*53ee8cc1Swenshuai.xi             ch_power_rf=pRfagcSsi[u16RfagcSsi_Size-1].power_db;
510*53ee8cc1Swenshuai.xi             if (rf_agc_val >=pRfagcSsi[0].sar3_val)
511*53ee8cc1Swenshuai.xi             {
512*53ee8cc1Swenshuai.xi                 float   ch_power_rfa = 0, ch_power_rfb =0;
513*53ee8cc1Swenshuai.xi                 MS_U8 rf_agc_vala =0, rf_agc_valb =0;
514*53ee8cc1Swenshuai.xi                 for(i = 1; i < u16RfagcSsi_Size; i++)
515*53ee8cc1Swenshuai.xi                 {
516*53ee8cc1Swenshuai.xi                     if (rf_agc_val < pRfagcSsi[i].sar3_val)
517*53ee8cc1Swenshuai.xi                     {
518*53ee8cc1Swenshuai.xi                         rf_agc_valb = pRfagcSsi[i].sar3_val;
519*53ee8cc1Swenshuai.xi                         ch_power_rfb = pRfagcSsi[i].power_db;
520*53ee8cc1Swenshuai.xi 
521*53ee8cc1Swenshuai.xi                         i--;
522*53ee8cc1Swenshuai.xi                         rf_agc_vala = pRfagcSsi[i].sar3_val;
523*53ee8cc1Swenshuai.xi                         ch_power_rfa=pRfagcSsi[i].power_db;
524*53ee8cc1Swenshuai.xi                         while ((i>1) && (rf_agc_vala==pRfagcSsi[i-1].sar3_val))
525*53ee8cc1Swenshuai.xi                         {
526*53ee8cc1Swenshuai.xi                             ch_power_rfa=pRfagcSsi[i-1].power_db;
527*53ee8cc1Swenshuai.xi                             i--;
528*53ee8cc1Swenshuai.xi                         }
529*53ee8cc1Swenshuai.xi                         ch_power_rf = ch_power_rfa+(ch_power_rfb-ch_power_rfa)*(float)(rf_agc_val-rf_agc_vala)/(rf_agc_valb-rf_agc_vala);
530*53ee8cc1Swenshuai.xi                         break;
531*53ee8cc1Swenshuai.xi                     }
532*53ee8cc1Swenshuai.xi                 }
533*53ee8cc1Swenshuai.xi                 #ifdef MS_DEBUG
534*53ee8cc1Swenshuai.xi                 ULOGD("DEMOD","RF Level from SAR:%f\n", ch_power_rf);
535*53ee8cc1Swenshuai.xi                 ULOGD("DEMOD","SSI_RFAGC (SAR-4) = 0x%x\n", rf_agc_val);
536*53ee8cc1Swenshuai.xi                 ULOGD("DEMOD","rf prev %f %x\n", ch_power_rfa, rf_agc_vala);
537*53ee8cc1Swenshuai.xi                 ULOGD("DEMOD","rf next %f %x\n", ch_power_rfb, rf_agc_valb);
538*53ee8cc1Swenshuai.xi                 #endif
539*53ee8cc1Swenshuai.xi             }
540*53ee8cc1Swenshuai.xi         }
541*53ee8cc1Swenshuai.xi         else
542*53ee8cc1Swenshuai.xi         {
543*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
544*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","RF Level from tuner: %f\n",fRFPowerDbm);
545*53ee8cc1Swenshuai.xi             #endif
546*53ee8cc1Swenshuai.xi             ch_power_rf = fRFPowerDbm;
547*53ee8cc1Swenshuai.xi         }
548*53ee8cc1Swenshuai.xi 
549*53ee8cc1Swenshuai.xi         // get IFAGC status
550*53ee8cc1Swenshuai.xi         {
551*53ee8cc1Swenshuai.xi             status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDP_REG_BASE + 0x13, &reg_tmp);
552*53ee8cc1Swenshuai.xi 
553*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
554*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","AGC_REF = %d\n", (MS_U16)reg_tmp);
555*53ee8cc1Swenshuai.xi             #endif
556*53ee8cc1Swenshuai.xi 
557*53ee8cc1Swenshuai.xi             if (reg_tmp > 200)
558*53ee8cc1Swenshuai.xi             {
559*53ee8cc1Swenshuai.xi                 ifagc_ssi = pIfagcSsi_HiRef;
560*53ee8cc1Swenshuai.xi                 ssi_tbl_len = u16IfagcSsi_HiRef_Size;
561*53ee8cc1Swenshuai.xi                 ifagc_err = pIfagcErr_HiRef;
562*53ee8cc1Swenshuai.xi                 err_tbl_len = u16IfagcErr_HiRef_Size;
563*53ee8cc1Swenshuai.xi             }
564*53ee8cc1Swenshuai.xi             else
565*53ee8cc1Swenshuai.xi             {
566*53ee8cc1Swenshuai.xi                 ifagc_ssi = pIfagcSsi_LoRef;
567*53ee8cc1Swenshuai.xi                 ssi_tbl_len = u16IfagcSsi_LoRef_Size;
568*53ee8cc1Swenshuai.xi                 ifagc_err = pIfagcErr_LoRef;
569*53ee8cc1Swenshuai.xi                 err_tbl_len = u16IfagcErr_LoRef_Size;
570*53ee8cc1Swenshuai.xi             }
571*53ee8cc1Swenshuai.xi 
572*53ee8cc1Swenshuai.xi             // bank 5 0x24 [15:0] reg_agc_gain2_out
573*53ee8cc1Swenshuai.xi             // use only high byte value
574*53ee8cc1Swenshuai.xi 
575*53ee8cc1Swenshuai.xi             // select IF gain to read
576*53ee8cc1Swenshuai.xi             status &= MDrv_SYS_DMD_VD_MBX_WriteReg(TDF_REG_BASE + 0x16, 0x03);
577*53ee8cc1Swenshuai.xi             status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDF_REG_BASE + 0x03, &reg_frz);
578*53ee8cc1Swenshuai.xi             status &= MDrv_SYS_DMD_VD_MBX_WriteReg(TDF_REG_BASE + 0x03, reg_frz | 0x80);
579*53ee8cc1Swenshuai.xi             status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDF_REG_BASE + 0x19, &reg_tmp);
580*53ee8cc1Swenshuai.xi             if_agc_val = reg_tmp;
581*53ee8cc1Swenshuai.xi             status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDF_REG_BASE + 0x18, &reg_tmp);
582*53ee8cc1Swenshuai.xi             if_agc_val_lsb = reg_tmp;
583*53ee8cc1Swenshuai.xi             status &= MDrv_SYS_DMD_VD_MBX_WriteReg(TDF_REG_BASE + 0x03, reg_frz);
584*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
585*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","SSI_IFAGC_H = 0x%x 0x%x\n", if_agc_val,if_agc_val_lsb);
586*53ee8cc1Swenshuai.xi             #endif
587*53ee8cc1Swenshuai.xi 
588*53ee8cc1Swenshuai.xi             ch_power_if=ifagc_ssi[0].power_db;
589*53ee8cc1Swenshuai.xi             if (if_agc_val >=ifagc_ssi[0].agc_val)
590*53ee8cc1Swenshuai.xi             {
591*53ee8cc1Swenshuai.xi                 for(i = 1; i < ssi_tbl_len; i++)
592*53ee8cc1Swenshuai.xi                 {
593*53ee8cc1Swenshuai.xi                     if (if_agc_val < ifagc_ssi[i].agc_val)
594*53ee8cc1Swenshuai.xi                     {
595*53ee8cc1Swenshuai.xi                         if_agc_valb = ifagc_ssi[i].agc_val;
596*53ee8cc1Swenshuai.xi                         ch_power_ifb = ifagc_ssi[i].power_db;
597*53ee8cc1Swenshuai.xi 
598*53ee8cc1Swenshuai.xi                         i--;
599*53ee8cc1Swenshuai.xi                         if_agc_vala = ifagc_ssi[i].agc_val;
600*53ee8cc1Swenshuai.xi                         ch_power_ifa=ifagc_ssi[i].power_db;
601*53ee8cc1Swenshuai.xi                         while ((i>1) && (if_agc_vala==ifagc_ssi[i-1].agc_val))
602*53ee8cc1Swenshuai.xi                         {
603*53ee8cc1Swenshuai.xi                             ch_power_ifa=ifagc_ssi[i-1].power_db;
604*53ee8cc1Swenshuai.xi                             i--;
605*53ee8cc1Swenshuai.xi                         }
606*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);
607*53ee8cc1Swenshuai.xi                         break;
608*53ee8cc1Swenshuai.xi                     }
609*53ee8cc1Swenshuai.xi                 }
610*53ee8cc1Swenshuai.xi             }
611*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
612*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","if prev %f %x\n", ch_power_ifa, if_agc_vala);
613*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","if next %f %x\n", ch_power_ifb, if_agc_valb);
614*53ee8cc1Swenshuai.xi             #endif
615*53ee8cc1Swenshuai.xi 
616*53ee8cc1Swenshuai.xi             for(i = 0; i < ssi_tbl_len; i++)
617*53ee8cc1Swenshuai.xi             {
618*53ee8cc1Swenshuai.xi                 if (ifagc_ssi[i].agc_val <= ifagc_ssi[i+1].agc_val)
619*53ee8cc1Swenshuai.xi                 {
620*53ee8cc1Swenshuai.xi                     ch_power_takeover = ifagc_ssi[i+1].power_db;
621*53ee8cc1Swenshuai.xi                     break;
622*53ee8cc1Swenshuai.xi                 }
623*53ee8cc1Swenshuai.xi             }
624*53ee8cc1Swenshuai.xi 
625*53ee8cc1Swenshuai.xi             #ifdef MS_DEBUG
626*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","ch_power_rf = %f\n", ch_power_rf);
627*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","ch_power_if = %f\n", ch_power_if);
628*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","ch_power_takeover = %f\n", ch_power_takeover);
629*53ee8cc1Swenshuai.xi             #endif
630*53ee8cc1Swenshuai.xi 
631*53ee8cc1Swenshuai.xi             // ch_power_db = (ch_power_rf > ch_power_if)? ch_power_rf : ch_power_if;
632*53ee8cc1Swenshuai.xi 
633*53ee8cc1Swenshuai.xi             if(ch_power_rf > (ch_power_takeover + 0.5))
634*53ee8cc1Swenshuai.xi             {
635*53ee8cc1Swenshuai.xi                 ch_power_db = ch_power_rf;
636*53ee8cc1Swenshuai.xi             }
637*53ee8cc1Swenshuai.xi             else if(ch_power_if < (ch_power_takeover - 0.5))
638*53ee8cc1Swenshuai.xi             {
639*53ee8cc1Swenshuai.xi                 ch_power_db = ch_power_if;
640*53ee8cc1Swenshuai.xi             }
641*53ee8cc1Swenshuai.xi             else
642*53ee8cc1Swenshuai.xi             {
643*53ee8cc1Swenshuai.xi                 ch_power_db = (ch_power_if + ch_power_rf)/2;
644*53ee8cc1Swenshuai.xi             }
645*53ee8cc1Swenshuai.xi 
646*53ee8cc1Swenshuai.xi             // ch_power_db = (ch_power_rf > ch_power_if)? ch_power_if : ch_power_rf;
647*53ee8cc1Swenshuai.xi 
648*53ee8cc1Swenshuai.xi             ///////// IF-AGC Error for Add. Attnuation /////////////
649*53ee8cc1Swenshuai.xi             if(if_agc_val == 0xff)
650*53ee8cc1Swenshuai.xi             {
651*53ee8cc1Swenshuai.xi #if 0
652*53ee8cc1Swenshuai.xi #if ( CHIP_FAMILY_TYPE == CHIP_FAMILY_S7LD )
653*53ee8cc1Swenshuai.xi                 status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDP_REG_BASE + 0x22, &reg_tmp);
654*53ee8cc1Swenshuai.xi                 status &= MDrv_SYS_DMD_VD_MBX_WriteReg(TDP_REG_BASE + 0x22, (reg_tmp&0xf0));
655*53ee8cc1Swenshuai.xi #endif
656*53ee8cc1Swenshuai.xi #endif
657*53ee8cc1Swenshuai.xi                 // bank 5 0x04 [15] reg_tdp_lat
658*53ee8cc1Swenshuai.xi                 status &= MDrv_SYS_DMD_VD_MBX_WriteReg(TDF_REG_BASE + 0x16, 0x00);
659*53ee8cc1Swenshuai.xi                 status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDF_REG_BASE + 0x03, &reg_frz);
660*53ee8cc1Swenshuai.xi                 status &= MDrv_SYS_DMD_VD_MBX_WriteReg(TDF_REG_BASE + 0x03, reg_frz | 0x80);
661*53ee8cc1Swenshuai.xi #if 0
662*53ee8cc1Swenshuai.xi         //#if ( CHIP_FAMILY_TYPE == CHIP_FAMILY_S7LD )
663*53ee8cc1Swenshuai.xi                         // bank 5 0x2c [9:0] reg_agc_error
664*53ee8cc1Swenshuai.xi                         status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDP_REG_BASE + 0x25, &reg_tmp);
665*53ee8cc1Swenshuai.xi                         // if_agc_err = reg_tmp & 0x03;
666*53ee8cc1Swenshuai.xi                         status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDP_REG_BASE + 0x24, &reg_tmp2);
667*53ee8cc1Swenshuai.xi                         // if_agc_err = (if_agc_err << 6)|(reg_tmp >> 2);
668*53ee8cc1Swenshuai.xi         //#else
669*53ee8cc1Swenshuai.xi #endif
670*53ee8cc1Swenshuai.xi                 // bank 5 0x2c [9:0] reg_agc_error
671*53ee8cc1Swenshuai.xi                 status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDF_REG_BASE + 0x19, &reg_tmp);
672*53ee8cc1Swenshuai.xi                 // if_agc_err = reg_tmp & 0x03;
673*53ee8cc1Swenshuai.xi                 status &= MDrv_SYS_DMD_VD_MBX_ReadReg(TDF_REG_BASE + 0x18, &reg_tmp2);
674*53ee8cc1Swenshuai.xi                 // if_agc_err = (if_agc_err << 6)|(reg_tmp >> 2);
675*53ee8cc1Swenshuai.xi         //#endif
676*53ee8cc1Swenshuai.xi 
677*53ee8cc1Swenshuai.xi                 if(reg_tmp&0x2)
678*53ee8cc1Swenshuai.xi                 {
679*53ee8cc1Swenshuai.xi                     if_agc_err = ((((~reg_tmp)&0x03)<<8)|((~reg_tmp2)&0xff)) + 1;
680*53ee8cc1Swenshuai.xi                 }
681*53ee8cc1Swenshuai.xi                 else
682*53ee8cc1Swenshuai.xi                 {
683*53ee8cc1Swenshuai.xi                     if_agc_err = reg_tmp<<8|reg_tmp2;
684*53ee8cc1Swenshuai.xi                 }
685*53ee8cc1Swenshuai.xi 
686*53ee8cc1Swenshuai.xi                 // release latch
687*53ee8cc1Swenshuai.xi                 status &= MDrv_SYS_DMD_VD_MBX_WriteReg(TDF_REG_BASE + 0x03, reg_frz);
688*53ee8cc1Swenshuai.xi 
689*53ee8cc1Swenshuai.xi                 for(i = 0; i < err_tbl_len; i++)
690*53ee8cc1Swenshuai.xi                 {
691*53ee8cc1Swenshuai.xi                     if ( if_agc_err <= ifagc_err[i].agc_err )        // signed char comparison
692*53ee8cc1Swenshuai.xi                     {
693*53ee8cc1Swenshuai.xi                         ch_power_db += ifagc_err[i].attn_db;
694*53ee8cc1Swenshuai.xi                         break;
695*53ee8cc1Swenshuai.xi                     }
696*53ee8cc1Swenshuai.xi                 }
697*53ee8cc1Swenshuai.xi                 #ifdef MS_DEBUG
698*53ee8cc1Swenshuai.xi                 ULOGD("DEMOD","if_agc_err = 0x%x\n", if_agc_err);
699*53ee8cc1Swenshuai.xi                 #endif
700*53ee8cc1Swenshuai.xi                 }
701*53ee8cc1Swenshuai.xi 
702*53ee8cc1Swenshuai.xi                 // BY 20110812 temporaily remove ch_power_db += SIGNAL_LEVEL_OFFSET;
703*53ee8cc1Swenshuai.xi         }
704*53ee8cc1Swenshuai.xi     }
705*53ee8cc1Swenshuai.xi     else
706*53ee8cc1Swenshuai.xi     {
707*53ee8cc1Swenshuai.xi         #ifdef MS_DEBUG
708*53ee8cc1Swenshuai.xi         if (fRFPowerDbm>=100.0) // unreasonable input value, get RF level from RFAGG
709*53ee8cc1Swenshuai.xi         {
710*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","Error!! please add AGC table\n");
711*53ee8cc1Swenshuai.xi         }
712*53ee8cc1Swenshuai.xi         #endif
713*53ee8cc1Swenshuai.xi         ch_power_db = fRFPowerDbm;
714*53ee8cc1Swenshuai.xi     }
715*53ee8cc1Swenshuai.xi     *fRFPowerDbmResult=ch_power_db;
716*53ee8cc1Swenshuai.xi     return status;
717*53ee8cc1Swenshuai.xi }
718*53ee8cc1Swenshuai.xi #endif
719*53ee8cc1Swenshuai.xi 
720*53ee8cc1Swenshuai.xi //waiting mark
721*53ee8cc1Swenshuai.xi #if(0)
HAL_DMD_GetNordigSSI(float fPrel,MS_U16 * strength)722*53ee8cc1Swenshuai.xi void HAL_DMD_GetNordigSSI(float fPrel, MS_U16 *strength)
723*53ee8cc1Swenshuai.xi {
724*53ee8cc1Swenshuai.xi     if (fPrel<-15.0f)
725*53ee8cc1Swenshuai.xi     {
726*53ee8cc1Swenshuai.xi         *strength = 0;
727*53ee8cc1Swenshuai.xi     }
728*53ee8cc1Swenshuai.xi     else if (fPrel<0.0f)
729*53ee8cc1Swenshuai.xi     {
730*53ee8cc1Swenshuai.xi         *strength = (MS_U16)((2.0f/3.0f)*(fPrel+15.0f));
731*53ee8cc1Swenshuai.xi     }
732*53ee8cc1Swenshuai.xi     else if (fPrel<20.0f)
733*53ee8cc1Swenshuai.xi     {
734*53ee8cc1Swenshuai.xi         *strength = (MS_U16)(4.0f*fPrel+10.0f);
735*53ee8cc1Swenshuai.xi     }
736*53ee8cc1Swenshuai.xi     else if (fPrel<35.0f)
737*53ee8cc1Swenshuai.xi     {
738*53ee8cc1Swenshuai.xi         *strength = (MS_U16)((2.0f/3.0f)*(fPrel-20.0f)+90.0f);
739*53ee8cc1Swenshuai.xi     }
740*53ee8cc1Swenshuai.xi     else
741*53ee8cc1Swenshuai.xi     {
742*53ee8cc1Swenshuai.xi         *strength = 100;
743*53ee8cc1Swenshuai.xi     }
744*53ee8cc1Swenshuai.xi 
745*53ee8cc1Swenshuai.xi }
746*53ee8cc1Swenshuai.xi #endif
747*53ee8cc1Swenshuai.xi /*
748*53ee8cc1Swenshuai.xi from Steven.Hung
749*53ee8cc1Swenshuai.xi 2. �n��T12 TS1 TS bus tristate
750*53ee8cc1Swenshuai.xi     Set Bank CHIPTOP, 0x57[13:11]=3��h0; (reg_ts1config[2:0]=0)
751*53ee8cc1Swenshuai.xi 3. �n��T12 IFAGC tristate
752*53ee8cc1Swenshuai.xi     Set Bank CHIPTOP, 0x2[12]=1��h1; (reg_if_agc_pad_oen=1)
753*53ee8cc1Swenshuai.xi */
HAL_DMD_TS1_Tristate(MS_BOOL bEnable)754*53ee8cc1Swenshuai.xi void HAL_DMD_TS1_Tristate(MS_BOOL bEnable)
755*53ee8cc1Swenshuai.xi {
756*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
757*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","HAL_DMD_TS1_Tristate %d\n",bEnable);
758*53ee8cc1Swenshuai.xi     #endif
759*53ee8cc1Swenshuai.xi     if (bEnable)
760*53ee8cc1Swenshuai.xi     {
761*53ee8cc1Swenshuai.xi         HAL_DMD_RIU_WriteByteMask(0x101EAF, 0, BMASK(5:3));
762*53ee8cc1Swenshuai.xi     }
763*53ee8cc1Swenshuai.xi     else
764*53ee8cc1Swenshuai.xi     {
765*53ee8cc1Swenshuai.xi         HAL_DMD_RIU_WriteByteMask(0x101EAF, (BIT_(5))|(BIT_(4))|(BIT_(3)), BMASK(5:3));
766*53ee8cc1Swenshuai.xi     }
767*53ee8cc1Swenshuai.xi }
768*53ee8cc1Swenshuai.xi 
HAL_DMD_RFAGC_Tristate(MS_BOOL bEnable)769*53ee8cc1Swenshuai.xi void HAL_DMD_RFAGC_Tristate(MS_BOOL bEnable)
770*53ee8cc1Swenshuai.xi {
771*53ee8cc1Swenshuai.xi     MS_U8 u8RegMuxBackup = 0;
772*53ee8cc1Swenshuai.xi 
773*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
774*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","HAL_DMD_RFAGC_Tristate %d\n",bEnable);
775*53ee8cc1Swenshuai.xi     #endif
776*53ee8cc1Swenshuai.xi     u8RegMuxBackup = HAL_DMD_RIU_ReadByte(0x101E39);
777*53ee8cc1Swenshuai.xi     HAL_DMD_RIU_WriteByte(0x101E39, 0x00); //mux from DMD MCU to HK
778*53ee8cc1Swenshuai.xi     if (bEnable)
779*53ee8cc1Swenshuai.xi     {
780*53ee8cc1Swenshuai.xi         HAL_DMD_RIU_WriteByteMask(0x11286C, 0, (BIT_(0)));
781*53ee8cc1Swenshuai.xi 
782*53ee8cc1Swenshuai.xi     }
783*53ee8cc1Swenshuai.xi     else
784*53ee8cc1Swenshuai.xi     {
785*53ee8cc1Swenshuai.xi         HAL_DMD_RIU_WriteByteMask(0x11286C, (BIT_(0)), (BIT_(0)));
786*53ee8cc1Swenshuai.xi     }
787*53ee8cc1Swenshuai.xi     HAL_DMD_RIU_WriteByte(0x101E39, u8RegMuxBackup); //mux from HK to DMD MCU
788*53ee8cc1Swenshuai.xi }
789*53ee8cc1Swenshuai.xi 
HAL_DMD_IFAGC_Tristate(MS_BOOL bEnable)790*53ee8cc1Swenshuai.xi void HAL_DMD_IFAGC_Tristate(MS_BOOL bEnable)
791*53ee8cc1Swenshuai.xi {
792*53ee8cc1Swenshuai.xi     MS_U8 u8RegMuxBackup = 0;
793*53ee8cc1Swenshuai.xi 
794*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
795*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","HAL_DMD_IFAGC_Tristate %d\n",bEnable);
796*53ee8cc1Swenshuai.xi     #endif
797*53ee8cc1Swenshuai.xi     u8RegMuxBackup = HAL_DMD_RIU_ReadByte(0x101E39);
798*53ee8cc1Swenshuai.xi     HAL_DMD_RIU_WriteByte(0x101E39, 0x00); //mux from DMD MCU to HK
799*53ee8cc1Swenshuai.xi     if (bEnable)
800*53ee8cc1Swenshuai.xi     {
801*53ee8cc1Swenshuai.xi         HAL_DMD_RIU_WriteByteMask(0x11286C, 0, (BIT_(4)));
802*53ee8cc1Swenshuai.xi     }
803*53ee8cc1Swenshuai.xi     else
804*53ee8cc1Swenshuai.xi     {
805*53ee8cc1Swenshuai.xi         HAL_DMD_RIU_WriteByteMask(0x11286C, (BIT_(4)), (BIT_(4)));
806*53ee8cc1Swenshuai.xi     }
807*53ee8cc1Swenshuai.xi     HAL_DMD_RIU_WriteByte(0x101E39, u8RegMuxBackup); //mux from HK to DMD MCU
808*53ee8cc1Swenshuai.xi }
809*53ee8cc1Swenshuai.xi 
HAL_DMD_IFAGC_TS_Tristate(MS_BOOL bEnable)810*53ee8cc1Swenshuai.xi void HAL_DMD_IFAGC_TS_Tristate(MS_BOOL bEnable)
811*53ee8cc1Swenshuai.xi {
812*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
813*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","HAL_DMD_IFAGC_TS_Tristate %d\n",bEnable);
814*53ee8cc1Swenshuai.xi     #endif
815*53ee8cc1Swenshuai.xi     HAL_DMD_TS1_Tristate(bEnable);
816*53ee8cc1Swenshuai.xi     HAL_DMD_IFAGC_Tristate(bEnable);
817*53ee8cc1Swenshuai.xi }
818*53ee8cc1Swenshuai.xi 
819*53ee8cc1Swenshuai.xi #if(0)
HAL_DMD_TS_GetClockRate(float * fTS_CLK)820*53ee8cc1Swenshuai.xi MS_BOOL HAL_DMD_TS_GetClockRate(float *fTS_CLK)
821*53ee8cc1Swenshuai.xi {
822*53ee8cc1Swenshuai.xi     // from Raymond
823*53ee8cc1Swenshuai.xi     *fTS_CLK=(HAL_DMD_RIU_ReadRegBit(0x103301, BIT_(0)) ? 288.0 : 348.0)/(2*((HAL_DMD_RIU_ReadByte(0x103300)&BMASK(4:0))+1));
824*53ee8cc1Swenshuai.xi     return TRUE;
825*53ee8cc1Swenshuai.xi }
826*53ee8cc1Swenshuai.xi #endif
HAL_DMD_ADC_IMUX_Sel(MS_U8 u8PadSel,MS_BOOL bPGAEnable)827*53ee8cc1Swenshuai.xi static void HAL_DMD_ADC_IMUX_Sel(MS_U8 u8PadSel, MS_BOOL bPGAEnable)
828*53ee8cc1Swenshuai.xi {
829*53ee8cc1Swenshuai.xi         if (u8PadSel==0)
830*53ee8cc1Swenshuai.xi         {
831*53ee8cc1Swenshuai.xi             HAL_DMD_RIU_WriteByteMask(0x112802, 4<<4, BMASK(6:4));
832*53ee8cc1Swenshuai.xi         }
833*53ee8cc1Swenshuai.xi         else
834*53ee8cc1Swenshuai.xi         {
835*53ee8cc1Swenshuai.xi             if (bPGAEnable)
836*53ee8cc1Swenshuai.xi             {
837*53ee8cc1Swenshuai.xi                 HAL_DMD_RIU_WriteByteMask(0x112802, 1<<4, BMASK(6:4));
838*53ee8cc1Swenshuai.xi             }
839*53ee8cc1Swenshuai.xi             else
840*53ee8cc1Swenshuai.xi             {
841*53ee8cc1Swenshuai.xi                 HAL_DMD_RIU_WriteByteMask(0x112802, 2<<4, BMASK(6:4));
842*53ee8cc1Swenshuai.xi             }
843*53ee8cc1Swenshuai.xi         }
844*53ee8cc1Swenshuai.xi }
845*53ee8cc1Swenshuai.xi 
HAL_DMD_ADC_QMUX_Sel(MS_U8 u8PadSel,MS_BOOL bPGAEnable)846*53ee8cc1Swenshuai.xi static void HAL_DMD_ADC_QMUX_Sel(MS_U8 u8PadSel, MS_BOOL bPGAEnable)
847*53ee8cc1Swenshuai.xi {
848*53ee8cc1Swenshuai.xi         if (u8PadSel==0)
849*53ee8cc1Swenshuai.xi         {
850*53ee8cc1Swenshuai.xi             HAL_DMD_RIU_WriteByteMask(0x112803, 4, BMASK(2:0));
851*53ee8cc1Swenshuai.xi         }
852*53ee8cc1Swenshuai.xi         else
853*53ee8cc1Swenshuai.xi         {
854*53ee8cc1Swenshuai.xi             if (bPGAEnable)
855*53ee8cc1Swenshuai.xi             {
856*53ee8cc1Swenshuai.xi                 HAL_DMD_RIU_WriteByteMask(0x112803, 1, BMASK(2:0));
857*53ee8cc1Swenshuai.xi             }
858*53ee8cc1Swenshuai.xi             else
859*53ee8cc1Swenshuai.xi             {
860*53ee8cc1Swenshuai.xi                 HAL_DMD_RIU_WriteByteMask(0x112803, 2, BMASK(2:0));
861*53ee8cc1Swenshuai.xi             }
862*53ee8cc1Swenshuai.xi         }
863*53ee8cc1Swenshuai.xi }
864*53ee8cc1Swenshuai.xi 
865*53ee8cc1Swenshuai.xi 
HAL_DMD_SIF_PGA_Ctl(MS_BOOL bPGAEnable)866*53ee8cc1Swenshuai.xi static void HAL_DMD_SIF_PGA_Ctl(MS_BOOL bPGAEnable)
867*53ee8cc1Swenshuai.xi {
868*53ee8cc1Swenshuai.xi     HAL_DMD_RIU_WriteRegBit(0x112840, bPGAEnable, BIT_(5)); // enable SIF PGA
869*53ee8cc1Swenshuai.xi     HAL_DMD_RIU_WriteRegBit(0x112802, bPGAEnable, BIT_(2)); // disable IMUX clamping
870*53ee8cc1Swenshuai.xi }
871*53ee8cc1Swenshuai.xi 
HAL_DMD_VIF_PGA_Ctl(MS_BOOL bPGAEnable)872*53ee8cc1Swenshuai.xi static void HAL_DMD_VIF_PGA_Ctl(MS_BOOL bPGAEnable)
873*53ee8cc1Swenshuai.xi {
874*53ee8cc1Swenshuai.xi     HAL_DMD_RIU_WriteRegBit(0x112840, bPGAEnable, BIT_(6)); // enable VIF PGA
875*53ee8cc1Swenshuai.xi     HAL_DMD_RIU_WriteRegBit(0x112802, bPGAEnable, BIT_(3)); // disable IMUX clamping
876*53ee8cc1Swenshuai.xi }
877*53ee8cc1Swenshuai.xi 
878*53ee8cc1Swenshuai.xi /************************************************************************************************
879*53ee8cc1Swenshuai.xi   Subject:    ADC I/Q Switch (After Init CLKGen)
880*53ee8cc1Swenshuai.xi   Function:   HAL_DMD_ADC_IQ_Switch
881*53ee8cc1Swenshuai.xi   Parmeter:   u8ADCIQMode : 0=I path, 1=Q path, 2=both IQ
882*53ee8cc1Swenshuai.xi   Parmeter:   u8PadSel : 0=Normal, 1=analog pad
883*53ee8cc1Swenshuai.xi   Parmeter:   bPGAEnable : 0=disable, 1=enable
884*53ee8cc1Swenshuai.xi   Parmeter:   u8PGAGain : default 5
885*53ee8cc1Swenshuai.xi   Return:     MS_BOOL :
886*53ee8cc1Swenshuai.xi   Remark:
887*53ee8cc1Swenshuai.xi *************************************************************************************************/
HAL_DMD_ADC_IQ_Switch(MS_U8 u8ADCIQMode,MS_U8 u8PadSel,MS_BOOL bPGAEnable,MS_U8 u8PGAGain)888*53ee8cc1Swenshuai.xi MS_BOOL HAL_DMD_ADC_IQ_Switch(MS_U8 u8ADCIQMode, MS_U8 u8PadSel, MS_BOOL bPGAEnable, MS_U8 u8PGAGain)
889*53ee8cc1Swenshuai.xi {
890*53ee8cc1Swenshuai.xi     MS_U8 u8RegMuxBackup = 0;
891*53ee8cc1Swenshuai.xi     u8PGAGain=u8PGAGain;
892*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
893*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","HAL_DMD_ADC_IQ_Switch %d %d %d %d\n",u8ADCIQMode, u8PadSel, bPGAEnable, u8PGAGain);
894*53ee8cc1Swenshuai.xi     #endif
895*53ee8cc1Swenshuai.xi 
896*53ee8cc1Swenshuai.xi     u8RegMuxBackup = HAL_DMD_RIU_ReadByte(0x101E39);
897*53ee8cc1Swenshuai.xi     HAL_DMD_RIU_WriteByte(0x101E39, 0x00); //mux from DMD MCU to HK
898*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
899*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","before 0x112803 %x\n",HAL_DMD_RIU_ReadByte(0x112803));
900*53ee8cc1Swenshuai.xi     #endif
901*53ee8cc1Swenshuai.xi     switch(u8ADCIQMode)
902*53ee8cc1Swenshuai.xi     {
903*53ee8cc1Swenshuai.xi         case 0://Normal case, I path
904*53ee8cc1Swenshuai.xi         default:
905*53ee8cc1Swenshuai.xi             HAL_DMD_RIU_WriteRegBit(0x112818, 0, BIT_(0)); // power on I ADC
906*53ee8cc1Swenshuai.xi             HAL_DMD_RIU_WriteRegBit(0x112818, 1, BIT_(1)); // power down Q ADC
907*53ee8cc1Swenshuai.xi             HAL_DMD_RIU_WriteRegBit(0x112803, 0, BIT_(4)); // ADC clock out swap 0:no swap, 1:swap
908*53ee8cc1Swenshuai.xi             HAL_DMD_RIU_WriteRegBit(0x112803, 0, BIT_(5)); // ADC clock out select 0:I, 1:Q
909*53ee8cc1Swenshuai.xi             HAL_DMD_ADC_IMUX_Sel(u8PadSel, bPGAEnable);
910*53ee8cc1Swenshuai.xi             HAL_DMD_SIF_PGA_Ctl(bPGAEnable);
911*53ee8cc1Swenshuai.xi             HAL_DMD_VIF_PGA_Ctl(FALSE);
912*53ee8cc1Swenshuai.xi             break;
913*53ee8cc1Swenshuai.xi         case 1://VIF, Q path, for internal signal saw
914*53ee8cc1Swenshuai.xi             HAL_DMD_RIU_WriteRegBit(0x112818, 1, BIT_(0)); // power down I ADC
915*53ee8cc1Swenshuai.xi             HAL_DMD_RIU_WriteRegBit(0x112818, 0, BIT_(1)); // power on Q ADC
916*53ee8cc1Swenshuai.xi             HAL_DMD_RIU_WriteRegBit(0x112803, 1, BIT_(4)); // ADC clock out swap 0:no swap, 1:swap
917*53ee8cc1Swenshuai.xi             HAL_DMD_RIU_WriteRegBit(0x112803, 1, BIT_(5)); // ADC clock out select 0:I, 1:Q
918*53ee8cc1Swenshuai.xi             HAL_DMD_ADC_QMUX_Sel(u8PadSel, bPGAEnable);
919*53ee8cc1Swenshuai.xi             HAL_DMD_SIF_PGA_Ctl(FALSE);
920*53ee8cc1Swenshuai.xi             HAL_DMD_VIF_PGA_Ctl(bPGAEnable);
921*53ee8cc1Swenshuai.xi             break;
922*53ee8cc1Swenshuai.xi         case 2://both IQ, for ZIF tuner
923*53ee8cc1Swenshuai.xi             break;
924*53ee8cc1Swenshuai.xi     }
925*53ee8cc1Swenshuai.xi     #ifdef MS_DEBUG
926*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","after 0x112803 %x\n",HAL_DMD_RIU_ReadByte(0x112803));
927*53ee8cc1Swenshuai.xi     #endif
928*53ee8cc1Swenshuai.xi     HAL_DMD_RIU_WriteByte(0x101E39, u8RegMuxBackup); //mux from HK to DMD MCU
929*53ee8cc1Swenshuai.xi     return TRUE;
930*53ee8cc1Swenshuai.xi }
931*53ee8cc1Swenshuai.xi 
932*53ee8cc1Swenshuai.xi /************************************************************************************************
933*53ee8cc1Swenshuai.xi   Subject:    HAL_DMD_TSO_Clk_Control
934*53ee8cc1Swenshuai.xi   Function:   ts output clock frequency and phase configure
935*53ee8cc1Swenshuai.xi   Parmeter:   u8cmd_array, clock div,           0x01, div (0x00~0x1f),
936*53ee8cc1Swenshuai.xi                            clock phase inv,     0x02, inv_en (0,1),
937*53ee8cc1Swenshuai.xi                            clock phase tuning,  0x03, phase_tuning_en (0,1), tuning_num (0x00~0x1f)
938*53ee8cc1Swenshuai.xi   Return:     MS_BOOL
939*53ee8cc1Swenshuai.xi   Remark:
940*53ee8cc1Swenshuai.xi *************************************************************************************************/
HAL_DMD_TSO_Clk_Control(MS_U8 * u8cmd_array)941*53ee8cc1Swenshuai.xi MS_BOOL HAL_DMD_TSO_Clk_Control(MS_U8 *u8cmd_array)
942*53ee8cc1Swenshuai.xi {
943*53ee8cc1Swenshuai.xi     MS_U8   u8Temp;
944*53ee8cc1Swenshuai.xi 
945*53ee8cc1Swenshuai.xi     u8Temp = HAL_DMD_RIU_ReadByte(0x103301);
946*53ee8cc1Swenshuai.xi 
947*53ee8cc1Swenshuai.xi     if ( (u8Temp&0x01) == 0x00)
948*53ee8cc1Swenshuai.xi     {
949*53ee8cc1Swenshuai.xi         ULOGD("DEMOD","[utopia][halDMD]Error!!!, we shall select clk_dmplldiv3\n");
950*53ee8cc1Swenshuai.xi         return false;
951*53ee8cc1Swenshuai.xi     }
952*53ee8cc1Swenshuai.xi     switch (u8cmd_array[0])
953*53ee8cc1Swenshuai.xi     {
954*53ee8cc1Swenshuai.xi         case 0x01: // clock frequency,div
955*53ee8cc1Swenshuai.xi             {
956*53ee8cc1Swenshuai.xi                 MS_U8 u8data = 0;
957*53ee8cc1Swenshuai.xi                 u8data = HAL_DMD_RIU_ReadByte(0x103300);
958*53ee8cc1Swenshuai.xi                 u8data &= (0xff-0x1f);
959*53ee8cc1Swenshuai.xi                 u8data |= (u8cmd_array[1]&0x1f);
960*53ee8cc1Swenshuai.xi                 HAL_DMD_RIU_WriteByte(0x103300, u8data);
961*53ee8cc1Swenshuai.xi             }
962*53ee8cc1Swenshuai.xi             break;
963*53ee8cc1Swenshuai.xi         case 0x02: // clock phase inv or not.
964*53ee8cc1Swenshuai.xi             {
965*53ee8cc1Swenshuai.xi                 MS_U8 u8data = 0;
966*53ee8cc1Swenshuai.xi                 u8data = HAL_DMD_RIU_ReadByte(0x103301);
967*53ee8cc1Swenshuai.xi                 u8data &= (0xff-0x02);
968*53ee8cc1Swenshuai.xi                 u8data |= ((u8cmd_array[1]&0x01)<<1);
969*53ee8cc1Swenshuai.xi                 HAL_DMD_RIU_WriteByte(0x103301, u8data);
970*53ee8cc1Swenshuai.xi             }
971*53ee8cc1Swenshuai.xi             break;
972*53ee8cc1Swenshuai.xi         case 0x03:
973*53ee8cc1Swenshuai.xi             {
974*53ee8cc1Swenshuai.xi                 MS_U8 u8data = 0;
975*53ee8cc1Swenshuai.xi 
976*53ee8cc1Swenshuai.xi                 u8data = HAL_DMD_RIU_ReadByte(0x103301);
977*53ee8cc1Swenshuai.xi                 u8data &= (0xff-0x10);
978*53ee8cc1Swenshuai.xi                 u8data |= ((u8cmd_array[1]&0x01)<<4);
979*53ee8cc1Swenshuai.xi                 HAL_DMD_RIU_WriteByte(0x103301, u8data);
980*53ee8cc1Swenshuai.xi 
981*53ee8cc1Swenshuai.xi                 u8data = HAL_DMD_RIU_ReadByte(0x103300+(0x05<<1)+1);
982*53ee8cc1Swenshuai.xi                 u8data &= (0xff-0x1f);
983*53ee8cc1Swenshuai.xi                 u8data |= (u8cmd_array[2]&0x1f);
984*53ee8cc1Swenshuai.xi                 HAL_DMD_RIU_WriteByte(0x103300+(0x05<<1)+1, u8data);
985*53ee8cc1Swenshuai.xi             }
986*53ee8cc1Swenshuai.xi             break;
987*53ee8cc1Swenshuai.xi         default:
988*53ee8cc1Swenshuai.xi             ULOGD("DEMOD","[utopia][halDMD]Error!!!, cmd invalid\n");
989*53ee8cc1Swenshuai.xi             break;
990*53ee8cc1Swenshuai.xi 
991*53ee8cc1Swenshuai.xi     }
992*53ee8cc1Swenshuai.xi #ifdef MS_DEBUG
993*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","0x103300: 0x%x\n",HAL_DMD_RIU_ReadByte(0x103300));
994*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","0x103301: 0x%x\n",HAL_DMD_RIU_ReadByte(0x103301));
995*53ee8cc1Swenshuai.xi     ULOGD("DEMOD","0x10330B: 0x%x\n",HAL_DMD_RIU_ReadByte(0x10330B));
996*53ee8cc1Swenshuai.xi #endif
997*53ee8cc1Swenshuai.xi     return true;
998*53ee8cc1Swenshuai.xi }
999*53ee8cc1Swenshuai.xi 
1000*53ee8cc1Swenshuai.xi /****************************************************************************
1001*53ee8cc1Swenshuai.xi   Subject:    Function providing approx. result of Log10(X)
1002*53ee8cc1Swenshuai.xi   Function:   Log10Approx
1003*53ee8cc1Swenshuai.xi   Parmeter:   Operand X in float
1004*53ee8cc1Swenshuai.xi   Return:     Approx. value of Log10(X) in float
1005*53ee8cc1Swenshuai.xi   Remark:      Ouput range from 0.0, 0.3 to 9.6 (input 1 to 2^32)
1006*53ee8cc1Swenshuai.xi *****************************************************************************/
1007*53ee8cc1Swenshuai.xi /*
1008*53ee8cc1Swenshuai.xi #if(0)
1009*53ee8cc1Swenshuai.xi #if 1
1010*53ee8cc1Swenshuai.xi const float _LogApproxTableX[80] =
1011*53ee8cc1Swenshuai.xi { 1.00, 1.30, 1.69, 2.20, 2.86, 3.71, 4.83, 6.27, 8.16, 10.60, 13.79,
1012*53ee8cc1Swenshuai.xi   17.92, 23.30, 30.29, 39.37, 51.19, 66.54, 86.50, 112.46, 146.19,
1013*53ee8cc1Swenshuai.xi   190.05, 247.06, 321.18, 417.54, 542.80, 705.64, 917.33, 1192.53,
1014*53ee8cc1Swenshuai.xi   1550.29, 2015.38, 2620.00, 3405.99, 4427.79, 5756.13, 7482.97,
1015*53ee8cc1Swenshuai.xi   9727.86, 12646.22, 16440.08, 21372.11, 27783.74, 36118.86,
1016*53ee8cc1Swenshuai.xi   46954.52, 61040.88, 79353.15, 103159.09, 134106.82, 174338.86,
1017*53ee8cc1Swenshuai.xi   226640.52, 294632.68, 383022.48, 497929.22, 647307.99, 841500.39, 1093950.50,
1018*53ee8cc1Swenshuai.xi   1422135.65, 1848776.35, 2403409.25, 3124432.03, 4061761.64, 5280290.13,
1019*53ee8cc1Swenshuai.xi   6864377.17, 8923690.32, 11600797.42, 15081036.65, 19605347.64, 25486951.94,
1020*53ee8cc1Swenshuai.xi   33133037.52, 43072948.77, 55994833.40, 72793283.42, 94631268.45,
1021*53ee8cc1Swenshuai.xi   123020648.99, 159926843.68, 207904896.79, 270276365.82, 351359275.57,
1022*53ee8cc1Swenshuai.xi   456767058.24, 593797175.72, 771936328.43, 1003517226.96
1023*53ee8cc1Swenshuai.xi };
1024*53ee8cc1Swenshuai.xi 
1025*53ee8cc1Swenshuai.xi const float _LogApproxTableY[80] =
1026*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,
1027*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,
1028*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,
1029*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,
1030*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,
1031*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,
1032*53ee8cc1Swenshuai.xi   7.86, 7.98, 8.09, 8.20, 8.32, 8.43, 8.55, 8.66
1033*53ee8cc1Swenshuai.xi };
1034*53ee8cc1Swenshuai.xi 
1035*53ee8cc1Swenshuai.xi float Log10Approx(float flt_x)
1036*53ee8cc1Swenshuai.xi {
1037*53ee8cc1Swenshuai.xi     MS_U8  indx = 0;
1038*53ee8cc1Swenshuai.xi 
1039*53ee8cc1Swenshuai.xi     do {
1040*53ee8cc1Swenshuai.xi         if (flt_x < _LogApproxTableX[indx])
1041*53ee8cc1Swenshuai.xi             break;
1042*53ee8cc1Swenshuai.xi         indx++;
1043*53ee8cc1Swenshuai.xi     }while (indx < 79);   //stop at indx = 80
1044*53ee8cc1Swenshuai.xi 
1045*53ee8cc1Swenshuai.xi     return _LogApproxTableY[indx];
1046*53ee8cc1Swenshuai.xi }
1047*53ee8cc1Swenshuai.xi #else
1048*53ee8cc1Swenshuai.xi float Log10Approx(float flt_x)
1049*53ee8cc1Swenshuai.xi {
1050*53ee8cc1Swenshuai.xi     MS_U32       u32_temp = 1;
1051*53ee8cc1Swenshuai.xi     MS_U8        indx = 0;
1052*53ee8cc1Swenshuai.xi 
1053*53ee8cc1Swenshuai.xi     do {
1054*53ee8cc1Swenshuai.xi         u32_temp = u32_temp << 1;
1055*53ee8cc1Swenshuai.xi         if (flt_x < (float)u32_temp)
1056*53ee8cc1Swenshuai.xi             break;
1057*53ee8cc1Swenshuai.xi     }while (++indx < 32);
1058*53ee8cc1Swenshuai.xi 
1059*53ee8cc1Swenshuai.xi     // 10*log10(X) ~= 0.3*N, when X ~= 2^N
1060*53ee8cc1Swenshuai.xi     return (float)0.3 * indx;
1061*53ee8cc1Swenshuai.xi }
1062*53ee8cc1Swenshuai.xi #endif
1063*53ee8cc1Swenshuai.xi #endif
1064*53ee8cc1Swenshuai.xi */