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