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