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