xref: /utopia/UTPA2-700.0.x/modules/sar/hal/maldives/sar/halSAR.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) 2009-2010 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 #define HAL_SAR_C
96*53ee8cc1Swenshuai.xi 
97*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
98*53ee8cc1Swenshuai.xi //  Include Files
99*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
100*53ee8cc1Swenshuai.xi // Common Definition
101*53ee8cc1Swenshuai.xi #include "MsCommon.h"
102*53ee8cc1Swenshuai.xi #include "MsTypes.h"
103*53ee8cc1Swenshuai.xi 
104*53ee8cc1Swenshuai.xi // Internal Definition
105*53ee8cc1Swenshuai.xi #include "regSAR.h"
106*53ee8cc1Swenshuai.xi #include "halSAR.h"
107*53ee8cc1Swenshuai.xi 
108*53ee8cc1Swenshuai.xi #ifdef CONFIG_MSTAR_DVFS_ENABLE
109*53ee8cc1Swenshuai.xi #include "halSAR_DVFS.h"
110*53ee8cc1Swenshuai.xi #endif
111*53ee8cc1Swenshuai.xi 
112*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
113*53ee8cc1Swenshuai.xi //  Driver Compiler Options
114*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
115*53ee8cc1Swenshuai.xi 
116*53ee8cc1Swenshuai.xi 
117*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
118*53ee8cc1Swenshuai.xi //  Local Defines
119*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
120*53ee8cc1Swenshuai.xi #define BIT0    BIT(0)
121*53ee8cc1Swenshuai.xi #define BIT1    BIT(1)
122*53ee8cc1Swenshuai.xi #define BIT2    BIT(2)
123*53ee8cc1Swenshuai.xi #define BIT3    BIT(3)
124*53ee8cc1Swenshuai.xi #define BIT4    BIT(4)
125*53ee8cc1Swenshuai.xi #define BIT5    BIT(5)
126*53ee8cc1Swenshuai.xi #define BIT6    BIT(6)
127*53ee8cc1Swenshuai.xi #define BIT7    BIT(7)
128*53ee8cc1Swenshuai.xi 
129*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
130*53ee8cc1Swenshuai.xi //  Local Structures
131*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
132*53ee8cc1Swenshuai.xi 
133*53ee8cc1Swenshuai.xi 
134*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
135*53ee8cc1Swenshuai.xi //  Global Variables
136*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
137*53ee8cc1Swenshuai.xi 
138*53ee8cc1Swenshuai.xi 
139*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
140*53ee8cc1Swenshuai.xi //  Local Variables
141*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
142*53ee8cc1Swenshuai.xi static MS_U32 _gMIO_MapBase = 0;
143*53ee8cc1Swenshuai.xi static MS_U32 _gMIO_MapBase_NPM = 0;
144*53ee8cc1Swenshuai.xi static MS_S32 _s32SAR_Dvfs_Mutex;
145*53ee8cc1Swenshuai.xi 
146*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
147*53ee8cc1Swenshuai.xi //  Debug Functions
148*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
149*53ee8cc1Swenshuai.xi #define HAL_SAR_ERR(x, args...)        //{printf(x, ##args);}
150*53ee8cc1Swenshuai.xi #define HAL_SAR_INFO(x, args...)        //{printf(x, ##args);}
151*53ee8cc1Swenshuai.xi 
152*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
153*53ee8cc1Swenshuai.xi //  Local Functions
154*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
155*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
156*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_ReadByte
157*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: read 1 Byte data
158*53ee8cc1Swenshuai.xi /// @param <IN>         \b u32RegAddr: register address
159*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
160*53ee8cc1Swenshuai.xi /// @param <RET>        \b MS_U8
161*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
162*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_ReadByte(MS_U32 u32RegAddr)163*53ee8cc1Swenshuai.xi static MS_U8 HAL_SAR_ReadByte(MS_U32 u32RegAddr)
164*53ee8cc1Swenshuai.xi {
165*53ee8cc1Swenshuai.xi     return ((volatile MS_U8*)(_gMIO_MapBase))[(u32RegAddr << 1) - (u32RegAddr & 1)];
166*53ee8cc1Swenshuai.xi }
167*53ee8cc1Swenshuai.xi 
168*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
169*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_Read2Byte
170*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: read 2 Byte data
171*53ee8cc1Swenshuai.xi /// @param <IN>         \b u32RegAddr: register address
172*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
173*53ee8cc1Swenshuai.xi /// @param <RET>        \b MS_U16
174*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
175*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_Read2Byte(MS_U32 u32RegAddr)176*53ee8cc1Swenshuai.xi static MS_U16 HAL_SAR_Read2Byte(MS_U32 u32RegAddr)
177*53ee8cc1Swenshuai.xi {
178*53ee8cc1Swenshuai.xi     return ((volatile MS_U16*)(_gMIO_MapBase))[(u32RegAddr)];
179*53ee8cc1Swenshuai.xi }
180*53ee8cc1Swenshuai.xi 
181*53ee8cc1Swenshuai.xi //////////////////////////////////////////////////////////////////////////////
182*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_WriteByte
183*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: write 1 Byte data
184*53ee8cc1Swenshuai.xi /// @param <IN>         \b u32RegAddr: register address
185*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8Val : 1 byte data
186*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
187*53ee8cc1Swenshuai.xi /// @param <RET>        \b TRUE: Ok FALSE: Fail
188*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
189*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_WriteByte(MS_U32 u32RegAddr,MS_U8 u8Val)190*53ee8cc1Swenshuai.xi static MS_BOOL HAL_SAR_WriteByte(MS_U32 u32RegAddr, MS_U8 u8Val)
191*53ee8cc1Swenshuai.xi {
192*53ee8cc1Swenshuai.xi     if (!u32RegAddr)
193*53ee8cc1Swenshuai.xi     {
194*53ee8cc1Swenshuai.xi         HAL_SAR_ERR("%s reg error!\n", __FUNCTION__);
195*53ee8cc1Swenshuai.xi         return FALSE;
196*53ee8cc1Swenshuai.xi     }
197*53ee8cc1Swenshuai.xi 
198*53ee8cc1Swenshuai.xi     ((volatile MS_U8*)(_gMIO_MapBase))[(u32RegAddr << 1) - (u32RegAddr & 1)] = u8Val;
199*53ee8cc1Swenshuai.xi     return TRUE;
200*53ee8cc1Swenshuai.xi }
201*53ee8cc1Swenshuai.xi 
202*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
203*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_WriteByteMask
204*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: write 1 Byte data
205*53ee8cc1Swenshuai.xi /// @param <IN>         \b u32RegAddr: register address
206*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8Val : 1 byte data
207*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
208*53ee8cc1Swenshuai.xi /// @param <RET>        \b TRUE: Ok FALSE: Fail
209*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
210*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_WriteByteMask(MS_U32 u32RegAddr,MS_U8 u8ValIn,MS_U8 u8Msk)211*53ee8cc1Swenshuai.xi static MS_BOOL HAL_SAR_WriteByteMask(MS_U32 u32RegAddr, MS_U8 u8ValIn, MS_U8 u8Msk)
212*53ee8cc1Swenshuai.xi {
213*53ee8cc1Swenshuai.xi     MS_U8 u8Val;
214*53ee8cc1Swenshuai.xi     if (!u32RegAddr)
215*53ee8cc1Swenshuai.xi     {
216*53ee8cc1Swenshuai.xi         HAL_SAR_ERR("%s reg error!\n", __FUNCTION__);
217*53ee8cc1Swenshuai.xi         return FALSE;
218*53ee8cc1Swenshuai.xi     }
219*53ee8cc1Swenshuai.xi 
220*53ee8cc1Swenshuai.xi     u8Val = HAL_SAR_ReadByte(u32RegAddr);
221*53ee8cc1Swenshuai.xi     u8Val = (u8Val & ~(u8Msk)) | ((u8ValIn) & (u8Msk));
222*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByte(u32RegAddr, u8Val);
223*53ee8cc1Swenshuai.xi     return TRUE;
224*53ee8cc1Swenshuai.xi }
225*53ee8cc1Swenshuai.xi 
226*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
227*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_ReadRegBit
228*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: write 1 Byte data
229*53ee8cc1Swenshuai.xi /// @param <IN>         \b u32RegAddr: register address
230*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8Val : 1 byte data
231*53ee8cc1Swenshuai.xi /// @param <RET>        \b TRUE: Ok FALSE: Fail
232*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
233*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_ReadRegBit(MS_U32 u32RegAddr,MS_U8 u8Mask)234*53ee8cc1Swenshuai.xi static MS_BOOL HAL_SAR_ReadRegBit(MS_U32 u32RegAddr, MS_U8 u8Mask)
235*53ee8cc1Swenshuai.xi {
236*53ee8cc1Swenshuai.xi     MS_U8 u8Val;
237*53ee8cc1Swenshuai.xi     if (!u32RegAddr)
238*53ee8cc1Swenshuai.xi     {
239*53ee8cc1Swenshuai.xi         HAL_SAR_ERR("%s reg error!\n", __FUNCTION__);
240*53ee8cc1Swenshuai.xi         return FALSE;
241*53ee8cc1Swenshuai.xi     }
242*53ee8cc1Swenshuai.xi 
243*53ee8cc1Swenshuai.xi     u8Val = HAL_SAR_ReadByte(u32RegAddr);
244*53ee8cc1Swenshuai.xi     return (u8Val & u8Mask);
245*53ee8cc1Swenshuai.xi }
246*53ee8cc1Swenshuai.xi 
247*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
248*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_ReadByte_NPM
249*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: read 1 Byte data
250*53ee8cc1Swenshuai.xi /// @param <IN>         \b u32RegAddr: register address
251*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
252*53ee8cc1Swenshuai.xi /// @param <RET>        \b MS_U8
253*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
254*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_ReadByte_NPM(MS_U32 u32RegAddr)255*53ee8cc1Swenshuai.xi static MS_U8 HAL_SAR_ReadByte_NPM(MS_U32 u32RegAddr)
256*53ee8cc1Swenshuai.xi {
257*53ee8cc1Swenshuai.xi     return ((volatile MS_U8*)(_gMIO_MapBase_NPM))[(u32RegAddr << 1) - (u32RegAddr & 1)];
258*53ee8cc1Swenshuai.xi }
259*53ee8cc1Swenshuai.xi 
260*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
261*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_WriteByte_NPM
262*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: write 1 Byte data
263*53ee8cc1Swenshuai.xi /// @param <IN>         \b u32RegAddr: register address
264*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8Val : 1 byte data
265*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
266*53ee8cc1Swenshuai.xi /// @param <RET>        \b TRUE: Ok FALSE: Fail
267*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
268*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_WriteByte_NPM(MS_U32 u32RegAddr,MS_U8 u8Val)269*53ee8cc1Swenshuai.xi static MS_BOOL HAL_SAR_WriteByte_NPM(MS_U32 u32RegAddr, MS_U8 u8Val)
270*53ee8cc1Swenshuai.xi {
271*53ee8cc1Swenshuai.xi     if (!u32RegAddr)
272*53ee8cc1Swenshuai.xi     {
273*53ee8cc1Swenshuai.xi         HAL_SAR_ERR("%s reg error!\n", __FUNCTION__);
274*53ee8cc1Swenshuai.xi         return FALSE;
275*53ee8cc1Swenshuai.xi     }
276*53ee8cc1Swenshuai.xi 
277*53ee8cc1Swenshuai.xi     ((volatile MS_U8*)(_gMIO_MapBase_NPM))[(u32RegAddr << 1) - (u32RegAddr & 1)] = u8Val;
278*53ee8cc1Swenshuai.xi     return TRUE;
279*53ee8cc1Swenshuai.xi }
280*53ee8cc1Swenshuai.xi 
281*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
282*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_WriteByteMask_NPM
283*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: write 1 Byte data
284*53ee8cc1Swenshuai.xi /// @param <IN>         \b u32RegAddr: register address
285*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8Val : 1 byte data
286*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
287*53ee8cc1Swenshuai.xi /// @param <RET>        \b TRUE: Ok FALSE: Fail
288*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
289*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_WriteByteMask_NPM(MS_U32 u32RegAddr,MS_U8 u8ValIn,MS_U8 u8Msk)290*53ee8cc1Swenshuai.xi static MS_BOOL HAL_SAR_WriteByteMask_NPM(MS_U32 u32RegAddr, MS_U8 u8ValIn, MS_U8 u8Msk)
291*53ee8cc1Swenshuai.xi {
292*53ee8cc1Swenshuai.xi     MS_U8 u8Val;
293*53ee8cc1Swenshuai.xi     if (!u32RegAddr)
294*53ee8cc1Swenshuai.xi     {
295*53ee8cc1Swenshuai.xi         HAL_SAR_ERR("%s reg error!\n", __FUNCTION__);
296*53ee8cc1Swenshuai.xi         return FALSE;
297*53ee8cc1Swenshuai.xi     }
298*53ee8cc1Swenshuai.xi 
299*53ee8cc1Swenshuai.xi     u8Val = HAL_SAR_ReadByte_NPM(u32RegAddr);
300*53ee8cc1Swenshuai.xi     u8Val = (u8Val & ~(u8Msk)) | ((u8ValIn) & (u8Msk));
301*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByte_NPM(u32RegAddr, u8Val);
302*53ee8cc1Swenshuai.xi     return TRUE;
303*53ee8cc1Swenshuai.xi }
304*53ee8cc1Swenshuai.xi 
305*53ee8cc1Swenshuai.xi #if 0//Temporarily marked out for compiler warning free
306*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
307*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_Read2Byte
308*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: read 2 Byte data
309*53ee8cc1Swenshuai.xi /// @param <IN>         \b u32RegAddr: register address
310*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
311*53ee8cc1Swenshuai.xi /// @param <RET>        \b MS_U16
312*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
313*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
314*53ee8cc1Swenshuai.xi static MS_U16 HAL_SAR_Read2Byte(MS_U32 u32RegAddr)
315*53ee8cc1Swenshuai.xi {
316*53ee8cc1Swenshuai.xi     return ((volatile MS_U16*)(_gMIO_MapBase))[u32RegAddr];
317*53ee8cc1Swenshuai.xi }
318*53ee8cc1Swenshuai.xi 
319*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
320*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_Write2Byte
321*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: write 2 Byte data
322*53ee8cc1Swenshuai.xi /// @param <IN>         \b u32RegAddr: register address
323*53ee8cc1Swenshuai.xi /// @param <IN>         \b u16Val : 2 byte data
324*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
325*53ee8cc1Swenshuai.xi /// @param <RET>        \b TRUE: Ok FALSE: Fail
326*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
327*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
328*53ee8cc1Swenshuai.xi static MS_BOOL HAL_SAR_Write2Byte(MS_U32 u32RegAddr, MS_U16 u16Val)
329*53ee8cc1Swenshuai.xi {
330*53ee8cc1Swenshuai.xi     if (!u32RegAddr)
331*53ee8cc1Swenshuai.xi     {
332*53ee8cc1Swenshuai.xi         HAL_SAR_ERR("%s reg error!\n", __FUNCTION__);
333*53ee8cc1Swenshuai.xi         return FALSE;
334*53ee8cc1Swenshuai.xi     }
335*53ee8cc1Swenshuai.xi 
336*53ee8cc1Swenshuai.xi     ((volatile MS_U16*)(_gMIO_MapBase))[u32RegAddr] = u16Val;
337*53ee8cc1Swenshuai.xi     return TRUE;
338*53ee8cc1Swenshuai.xi }
339*53ee8cc1Swenshuai.xi 
340*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
341*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_Read4Byte
342*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: read 4 Byte data
343*53ee8cc1Swenshuai.xi /// @param <IN>         \b u32RegAddr: register address
344*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
345*53ee8cc1Swenshuai.xi /// @param <RET>        \b MS_U32
346*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
347*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
348*53ee8cc1Swenshuai.xi static MS_U32 HAL_SAR_Read4Byte(MS_U32 u32RegAddr)
349*53ee8cc1Swenshuai.xi {
350*53ee8cc1Swenshuai.xi     return (HAL_SAR_Read2Byte(u32RegAddr) | HAL_SAR_Read2Byte(u32RegAddr+2) << 16);
351*53ee8cc1Swenshuai.xi }
352*53ee8cc1Swenshuai.xi 
353*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
354*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_Write4Byte
355*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: write 4 Byte data
356*53ee8cc1Swenshuai.xi /// @param <IN>         \b u32RegAddr: register address
357*53ee8cc1Swenshuai.xi /// @param <IN>         \b u32Val : 4 byte data
358*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
359*53ee8cc1Swenshuai.xi /// @param <RET>        \b TRUE: Ok FALSE: Fail
360*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
361*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
362*53ee8cc1Swenshuai.xi static MS_BOOL HAL_SAR_Write4Byte(MS_U32 u32RegAddr, MS_U32 u32Val)
363*53ee8cc1Swenshuai.xi {
364*53ee8cc1Swenshuai.xi     if (!u32RegAddr)
365*53ee8cc1Swenshuai.xi     {
366*53ee8cc1Swenshuai.xi         HAL_SAR_ERR("%s reg error!\n", __FUNCTION__);
367*53ee8cc1Swenshuai.xi         return FALSE;
368*53ee8cc1Swenshuai.xi     }
369*53ee8cc1Swenshuai.xi 
370*53ee8cc1Swenshuai.xi     HAL_SAR_Write2Byte(u32RegAddr, u32Val & 0x0000FFFF);
371*53ee8cc1Swenshuai.xi     HAL_SAR_Write2Byte(u32RegAddr+2, u32Val >> 16);
372*53ee8cc1Swenshuai.xi     return TRUE;
373*53ee8cc1Swenshuai.xi }
374*53ee8cc1Swenshuai.xi 
375*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
376*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_WriteRegBit
377*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: write 1 Byte data
378*53ee8cc1Swenshuai.xi /// @param <IN>         \b u32RegAddr: register address
379*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8Val : 1 byte data
380*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
381*53ee8cc1Swenshuai.xi /// @param <RET>        \b TRUE: Ok FALSE: Fail
382*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
383*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
384*53ee8cc1Swenshuai.xi static MS_BOOL HAL_SAR_WriteRegBit(MS_U32 u32RegAddr, MS_BOOL bEnable, MS_U8 u8Mask)
385*53ee8cc1Swenshuai.xi {
386*53ee8cc1Swenshuai.xi     MS_U8 u8Val;
387*53ee8cc1Swenshuai.xi     if (!u32RegAddr)
388*53ee8cc1Swenshuai.xi     {
389*53ee8cc1Swenshuai.xi         HAL_SAR_ERR("%s reg error!\n", __FUNCTION__);
390*53ee8cc1Swenshuai.xi         return FALSE;
391*53ee8cc1Swenshuai.xi     }
392*53ee8cc1Swenshuai.xi 
393*53ee8cc1Swenshuai.xi     u8Val = HAL_SAR_ReadByte(u32RegAddr);
394*53ee8cc1Swenshuai.xi     u8Val = (bEnable) ? (u8Val | u8Mask) : (u8Val & ~u8Mask);
395*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByte(u32RegAddr, u8Val);
396*53ee8cc1Swenshuai.xi     return TRUE;
397*53ee8cc1Swenshuai.xi }
398*53ee8cc1Swenshuai.xi #endif
399*53ee8cc1Swenshuai.xi 
400*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
401*53ee8cc1Swenshuai.xi //  Global Functions
402*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
403*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
404*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_SetIOMapBase
405*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Set IO Map base
406*53ee8cc1Swenshuai.xi /// @param <IN>         \b u32Base : io map base address
407*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
408*53ee8cc1Swenshuai.xi /// @param <RET>        \b None :
409*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
410*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_SetIOMapBase(MS_U32 u32Base)411*53ee8cc1Swenshuai.xi void HAL_SAR_SetIOMapBase(MS_U32 u32Base)
412*53ee8cc1Swenshuai.xi {
413*53ee8cc1Swenshuai.xi     _gMIO_MapBase = u32Base;
414*53ee8cc1Swenshuai.xi     HAL_SAR_INFO("SAR IOMap base:%8lx Reg offset:%4x\n", u32Base, SAR_REG_BASE);
415*53ee8cc1Swenshuai.xi }
416*53ee8cc1Swenshuai.xi 
417*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
418*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_GetIOMapBase
419*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Get IO Map base
420*53ee8cc1Swenshuai.xi /// @param <IN>         \b None :
421*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
422*53ee8cc1Swenshuai.xi /// @param <RET>        \b MS_U32 : io map base address
423*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
424*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_GetIOMapBase(void)425*53ee8cc1Swenshuai.xi MS_U32 HAL_SAR_GetIOMapBase(void)
426*53ee8cc1Swenshuai.xi {
427*53ee8cc1Swenshuai.xi     return _gMIO_MapBase;
428*53ee8cc1Swenshuai.xi }
429*53ee8cc1Swenshuai.xi 
430*53ee8cc1Swenshuai.xi 
431*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
432*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_CfgChannelBound
433*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Configure sar channel upper/lower bound
434*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8Channel : sar channel (0~7), psarBndCfg: sar bound info
435*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
436*53ee8cc1Swenshuai.xi /// @param <RET>        \b TRUE: Ok FALSE: Fail
437*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
438*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_CfgChannelBound(MS_U8 u8Channel,HAL_SAR_BndCfg * psarBndCfg)439*53ee8cc1Swenshuai.xi MS_BOOL HAL_SAR_CfgChannelBound(MS_U8 u8Channel ,HAL_SAR_BndCfg *psarBndCfg)
440*53ee8cc1Swenshuai.xi {
441*53ee8cc1Swenshuai.xi     MS_U16  wChannelAdcValue = 0;
442*53ee8cc1Swenshuai.xi 
443*53ee8cc1Swenshuai.xi     if(u8Channel >= HAL_SAR_CH_MAXID)
444*53ee8cc1Swenshuai.xi         return FALSE;
445*53ee8cc1Swenshuai.xi 
446*53ee8cc1Swenshuai.xi     switch(u8Channel)
447*53ee8cc1Swenshuai.xi     {
448*53ee8cc1Swenshuai.xi         case HAL_SAR_CH1:
449*53ee8cc1Swenshuai.xi         {
450*53ee8cc1Swenshuai.xi             wChannelAdcValue = psarBndCfg->u8UpBnd;
451*53ee8cc1Swenshuai.xi             wChannelAdcValue <<= 2;
452*53ee8cc1Swenshuai.xi             wChannelAdcValue |= 0x3;
453*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask((REG_SAR_CH1_UPD + 1), (MS_U8) (wChannelAdcValue >> 8), 0x03);
454*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask(REG_SAR_CH1_UPD, (MS_U8) wChannelAdcValue, _SAR_CHN_UPB_MSK);
455*53ee8cc1Swenshuai.xi 
456*53ee8cc1Swenshuai.xi             wChannelAdcValue = psarBndCfg->u8LoBnd;
457*53ee8cc1Swenshuai.xi             wChannelAdcValue <<= 2;
458*53ee8cc1Swenshuai.xi             wChannelAdcValue |= 0x3;
459*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask((REG_SAR_CH1_LOB + 1), (MS_U8) (wChannelAdcValue >> 8), 0x03);
460*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask(REG_SAR_CH1_LOB, (MS_U8) wChannelAdcValue, _SAR_CHN_LOB_MSK);
461*53ee8cc1Swenshuai.xi 
462*53ee8cc1Swenshuai.xi             //HAL_SAR_WriteByteMask(REG_SAR_CH1_UPD,psarBndCfg->u8UpBnd,_SAR_CHN_UPB_MSK);
463*53ee8cc1Swenshuai.xi             //HAL_SAR_WriteByteMask(REG_SAR_CH1_LOB,psarBndCfg->u8LoBnd,_SAR_CHN_LOB_MSK);
464*53ee8cc1Swenshuai.xi         }
465*53ee8cc1Swenshuai.xi         break;
466*53ee8cc1Swenshuai.xi 
467*53ee8cc1Swenshuai.xi         case HAL_SAR_CH2:
468*53ee8cc1Swenshuai.xi         {
469*53ee8cc1Swenshuai.xi             wChannelAdcValue = psarBndCfg->u8UpBnd;
470*53ee8cc1Swenshuai.xi             wChannelAdcValue <<= 2;
471*53ee8cc1Swenshuai.xi             wChannelAdcValue |= 0x3;
472*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask((REG_SAR_CH2_UPD + 1), (MS_U8) (wChannelAdcValue >> 8), 0x03);
473*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask(REG_SAR_CH2_UPD, (MS_U8) wChannelAdcValue, _SAR_CHN_UPB_MSK);
474*53ee8cc1Swenshuai.xi 
475*53ee8cc1Swenshuai.xi             wChannelAdcValue = psarBndCfg->u8LoBnd;
476*53ee8cc1Swenshuai.xi             wChannelAdcValue <<= 2;
477*53ee8cc1Swenshuai.xi             wChannelAdcValue |= 0x3;
478*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask((REG_SAR_CH2_LOB + 1), (MS_U8) (wChannelAdcValue >> 8), 0x03);
479*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask(REG_SAR_CH2_LOB, (MS_U8) wChannelAdcValue, _SAR_CHN_LOB_MSK);
480*53ee8cc1Swenshuai.xi 
481*53ee8cc1Swenshuai.xi             //HAL_SAR_WriteByteMask(REG_SAR_CH2_UPD,psarBndCfg->u8UpBnd,_SAR_CHN_UPB_MSK);
482*53ee8cc1Swenshuai.xi             //HAL_SAR_WriteByteMask(REG_SAR_CH2_LOB,psarBndCfg->u8LoBnd,_SAR_CHN_LOB_MSK);
483*53ee8cc1Swenshuai.xi         }
484*53ee8cc1Swenshuai.xi         break;
485*53ee8cc1Swenshuai.xi 
486*53ee8cc1Swenshuai.xi         case HAL_SAR_CH3:
487*53ee8cc1Swenshuai.xi         {
488*53ee8cc1Swenshuai.xi             wChannelAdcValue = psarBndCfg->u8UpBnd;
489*53ee8cc1Swenshuai.xi             wChannelAdcValue <<= 2;
490*53ee8cc1Swenshuai.xi             wChannelAdcValue |= 0x3;
491*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask((REG_SAR_CH3_UPD + 1), (MS_U8) (wChannelAdcValue >> 8), 0x03);
492*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask(REG_SAR_CH3_UPD, (MS_U8) wChannelAdcValue, _SAR_CHN_UPB_MSK);
493*53ee8cc1Swenshuai.xi 
494*53ee8cc1Swenshuai.xi             wChannelAdcValue = psarBndCfg->u8LoBnd;
495*53ee8cc1Swenshuai.xi             wChannelAdcValue <<= 2;
496*53ee8cc1Swenshuai.xi             wChannelAdcValue |= 0x3;
497*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask((REG_SAR_CH3_LOB + 1), (MS_U8) (wChannelAdcValue >> 8), 0x03);
498*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask(REG_SAR_CH3_LOB, (MS_U8) wChannelAdcValue, _SAR_CHN_LOB_MSK);
499*53ee8cc1Swenshuai.xi 
500*53ee8cc1Swenshuai.xi             //HAL_SAR_WriteByteMask(REG_SAR_CH3_UPD,psarBndCfg->u8UpBnd,_SAR_CHN_UPB_MSK);
501*53ee8cc1Swenshuai.xi             //HAL_SAR_WriteByteMask(REG_SAR_CH3_LOB,psarBndCfg->u8LoBnd,_SAR_CHN_LOB_MSK);
502*53ee8cc1Swenshuai.xi         }
503*53ee8cc1Swenshuai.xi         break;
504*53ee8cc1Swenshuai.xi 
505*53ee8cc1Swenshuai.xi         case HAL_SAR_CH4:
506*53ee8cc1Swenshuai.xi         {
507*53ee8cc1Swenshuai.xi             wChannelAdcValue = psarBndCfg->u8UpBnd;
508*53ee8cc1Swenshuai.xi             wChannelAdcValue <<= 2;
509*53ee8cc1Swenshuai.xi             wChannelAdcValue |= 0x3;
510*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask((REG_SAR_CH4_UPD + 1), (MS_U8) (wChannelAdcValue >> 8), 0x03);
511*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask(REG_SAR_CH4_UPD, (MS_U8) wChannelAdcValue, _SAR_CHN_UPB_MSK);
512*53ee8cc1Swenshuai.xi 
513*53ee8cc1Swenshuai.xi             wChannelAdcValue = psarBndCfg->u8LoBnd;
514*53ee8cc1Swenshuai.xi             wChannelAdcValue <<= 2;
515*53ee8cc1Swenshuai.xi             wChannelAdcValue |= 0x3;
516*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask((REG_SAR_CH4_LOB + 1), (MS_U8) (wChannelAdcValue >> 8), 0x03);
517*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask(REG_SAR_CH4_LOB, (MS_U8) wChannelAdcValue, _SAR_CHN_LOB_MSK);
518*53ee8cc1Swenshuai.xi 
519*53ee8cc1Swenshuai.xi             //HAL_SAR_WriteByteMask(REG_SAR_CH4_UPD,psarBndCfg->u8UpBnd,_SAR_CHN_UPB_MSK);
520*53ee8cc1Swenshuai.xi             //HAL_SAR_WriteByteMask(REG_SAR_CH4_LOB,psarBndCfg->u8LoBnd,_SAR_CHN_LOB_MSK);
521*53ee8cc1Swenshuai.xi         }
522*53ee8cc1Swenshuai.xi         break;
523*53ee8cc1Swenshuai.xi 
524*53ee8cc1Swenshuai.xi         case HAL_SAR_CH5:
525*53ee8cc1Swenshuai.xi         {
526*53ee8cc1Swenshuai.xi             wChannelAdcValue = psarBndCfg->u8UpBnd;
527*53ee8cc1Swenshuai.xi             wChannelAdcValue <<= 2;
528*53ee8cc1Swenshuai.xi             wChannelAdcValue |= 0x3;
529*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask((REG_SAR_CH5_UPD + 1), (MS_U8) (wChannelAdcValue >> 8), 0x03);
530*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask(REG_SAR_CH5_UPD, (MS_U8) wChannelAdcValue, _SAR_CHN_UPB_MSK);
531*53ee8cc1Swenshuai.xi 
532*53ee8cc1Swenshuai.xi             wChannelAdcValue = psarBndCfg->u8LoBnd;
533*53ee8cc1Swenshuai.xi             wChannelAdcValue <<= 2;
534*53ee8cc1Swenshuai.xi             wChannelAdcValue |= 0x3;
535*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask((REG_SAR_CH5_LOB + 1), (MS_U8) (wChannelAdcValue >> 8), 0x03);
536*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask(REG_SAR_CH5_LOB, (MS_U8) wChannelAdcValue, _SAR_CHN_LOB_MSK);
537*53ee8cc1Swenshuai.xi 
538*53ee8cc1Swenshuai.xi             //HAL_SAR_WriteByteMask(REG_SAR_CH5_UPD,psarBndCfg->u8UpBnd,_SAR_CHN_UPB_MSK);
539*53ee8cc1Swenshuai.xi             //HAL_SAR_WriteByteMask(REG_SAR_CH5_LOB,psarBndCfg->u8LoBnd,_SAR_CHN_LOB_MSK);
540*53ee8cc1Swenshuai.xi         }
541*53ee8cc1Swenshuai.xi         break;
542*53ee8cc1Swenshuai.xi 
543*53ee8cc1Swenshuai.xi         case HAL_SAR_CH6:
544*53ee8cc1Swenshuai.xi         {
545*53ee8cc1Swenshuai.xi             wChannelAdcValue = psarBndCfg->u8UpBnd;
546*53ee8cc1Swenshuai.xi             wChannelAdcValue <<= 2;
547*53ee8cc1Swenshuai.xi             wChannelAdcValue |= 0x3;
548*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask((REG_SAR_CH6_UPD + 1), (MS_U8) (wChannelAdcValue >> 8), 0x03);
549*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask(REG_SAR_CH6_UPD, (MS_U8) wChannelAdcValue, _SAR_CHN_UPB_MSK);
550*53ee8cc1Swenshuai.xi 
551*53ee8cc1Swenshuai.xi             wChannelAdcValue = psarBndCfg->u8LoBnd;
552*53ee8cc1Swenshuai.xi             wChannelAdcValue <<= 2;
553*53ee8cc1Swenshuai.xi             wChannelAdcValue |= 0x3;
554*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask((REG_SAR_CH6_LOB + 1), (MS_U8) (wChannelAdcValue >> 8), 0x03);
555*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask(REG_SAR_CH6_LOB, (MS_U8) wChannelAdcValue, _SAR_CHN_LOB_MSK);
556*53ee8cc1Swenshuai.xi 
557*53ee8cc1Swenshuai.xi             //HAL_SAR_WriteByteMask(REG_SAR_CH6_UPD,psarBndCfg->u8UpBnd,_SAR_CHN_UPB_MSK);
558*53ee8cc1Swenshuai.xi             //HAL_SAR_WriteByteMask(REG_SAR_CH6_LOB,psarBndCfg->u8LoBnd,_SAR_CHN_LOB_MSK);
559*53ee8cc1Swenshuai.xi         }
560*53ee8cc1Swenshuai.xi         break;
561*53ee8cc1Swenshuai.xi 
562*53ee8cc1Swenshuai.xi         case HAL_SAR_CH7:
563*53ee8cc1Swenshuai.xi         {
564*53ee8cc1Swenshuai.xi             wChannelAdcValue = psarBndCfg->u8UpBnd;
565*53ee8cc1Swenshuai.xi             wChannelAdcValue <<= 2;
566*53ee8cc1Swenshuai.xi             wChannelAdcValue |= 0x3;
567*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask((REG_SAR_CH7_UPD + 1), (MS_U8) (wChannelAdcValue >> 8), 0x03);
568*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask(REG_SAR_CH7_UPD, (MS_U8) wChannelAdcValue, _SAR_CHN_UPB_MSK);
569*53ee8cc1Swenshuai.xi 
570*53ee8cc1Swenshuai.xi             wChannelAdcValue = psarBndCfg->u8LoBnd;
571*53ee8cc1Swenshuai.xi             wChannelAdcValue <<= 2;
572*53ee8cc1Swenshuai.xi             wChannelAdcValue |= 0x3;
573*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask((REG_SAR_CH7_LOB + 1), (MS_U8) (wChannelAdcValue >> 8), 0x03);
574*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask(REG_SAR_CH7_LOB, (MS_U8) wChannelAdcValue, _SAR_CHN_LOB_MSK);
575*53ee8cc1Swenshuai.xi 
576*53ee8cc1Swenshuai.xi             //HAL_SAR_WriteByteMask(REG_SAR_CH7_UPD,psarBndCfg->u8UpBnd,_SAR_CHN_UPB_MSK);
577*53ee8cc1Swenshuai.xi             //HAL_SAR_WriteByteMask(REG_SAR_CH7_LOB,psarBndCfg->u8LoBnd,_SAR_CHN_LOB_MSK);
578*53ee8cc1Swenshuai.xi         }
579*53ee8cc1Swenshuai.xi         break;
580*53ee8cc1Swenshuai.xi 
581*53ee8cc1Swenshuai.xi         case HAL_SAR_CH8:
582*53ee8cc1Swenshuai.xi         {
583*53ee8cc1Swenshuai.xi             wChannelAdcValue = psarBndCfg->u8UpBnd;
584*53ee8cc1Swenshuai.xi             wChannelAdcValue <<= 2;
585*53ee8cc1Swenshuai.xi             wChannelAdcValue |= 0x3;
586*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask((REG_SAR_CH8_UPD + 1), (MS_U8) (wChannelAdcValue >> 8), 0x03);
587*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask(REG_SAR_CH8_UPD, (MS_U8) wChannelAdcValue, _SAR_CHN_UPB_MSK);
588*53ee8cc1Swenshuai.xi 
589*53ee8cc1Swenshuai.xi             wChannelAdcValue = psarBndCfg->u8LoBnd;
590*53ee8cc1Swenshuai.xi             wChannelAdcValue <<= 2;
591*53ee8cc1Swenshuai.xi             wChannelAdcValue |= 0x3;
592*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask((REG_SAR_CH8_LOB + 1), (MS_U8) (wChannelAdcValue >> 8), 0x03);
593*53ee8cc1Swenshuai.xi             HAL_SAR_WriteByteMask(REG_SAR_CH8_LOB, (MS_U8) wChannelAdcValue, _SAR_CHN_LOB_MSK);
594*53ee8cc1Swenshuai.xi 
595*53ee8cc1Swenshuai.xi             //HAL_SAR_WriteByteMask(REG_SAR_CH8_UPD,psarBndCfg->u8UpBnd,_SAR_CHN_UPB_MSK);
596*53ee8cc1Swenshuai.xi             //HAL_SAR_WriteByteMask(REG_SAR_CH8_LOB,psarBndCfg->u8LoBnd,_SAR_CHN_LOB_MSK);
597*53ee8cc1Swenshuai.xi         }
598*53ee8cc1Swenshuai.xi         break;
599*53ee8cc1Swenshuai.xi 
600*53ee8cc1Swenshuai.xi     }
601*53ee8cc1Swenshuai.xi 
602*53ee8cc1Swenshuai.xi     return TRUE;
603*53ee8cc1Swenshuai.xi }
604*53ee8cc1Swenshuai.xi 
605*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
606*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_GetChannelADC
607*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Get sar channel ADC value
608*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8Channel : sar channel (0~7)
609*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
610*53ee8cc1Swenshuai.xi /// @param <RET>        \b MS_U8: sar ADC value
611*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
612*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_GetChannelADC(MS_U8 u8Channel)613*53ee8cc1Swenshuai.xi MS_U8 HAL_SAR_GetChannelADC(MS_U8 u8Channel)
614*53ee8cc1Swenshuai.xi {
615*53ee8cc1Swenshuai.xi     MS_U32  u32Reg = REG_SAR_ADC_CH1_DATA;
616*53ee8cc1Swenshuai.xi     MS_U16  wChannelAdcValue = 0;
617*53ee8cc1Swenshuai.xi 
618*53ee8cc1Swenshuai.xi     if(u8Channel >= HAL_SAR_CH_MAXID)
619*53ee8cc1Swenshuai.xi         return HAL_SAR_ADC_DATA_MAX;
620*53ee8cc1Swenshuai.xi 
621*53ee8cc1Swenshuai.xi     switch(u8Channel)
622*53ee8cc1Swenshuai.xi     {
623*53ee8cc1Swenshuai.xi         case HAL_SAR_CH1:
624*53ee8cc1Swenshuai.xi             u32Reg = REG_SAR_ADC_CH1_DATA;
625*53ee8cc1Swenshuai.xi             break;
626*53ee8cc1Swenshuai.xi         case HAL_SAR_CH2:
627*53ee8cc1Swenshuai.xi             u32Reg = REG_SAR_ADC_CH2_DATA;
628*53ee8cc1Swenshuai.xi             break;
629*53ee8cc1Swenshuai.xi         case HAL_SAR_CH3:
630*53ee8cc1Swenshuai.xi             u32Reg = REG_SAR_ADC_CH3_DATA;
631*53ee8cc1Swenshuai.xi             break;
632*53ee8cc1Swenshuai.xi         case HAL_SAR_CH4:
633*53ee8cc1Swenshuai.xi             u32Reg = REG_SAR_ADC_CH4_DATA;
634*53ee8cc1Swenshuai.xi             break;
635*53ee8cc1Swenshuai.xi         case HAL_SAR_CH5:
636*53ee8cc1Swenshuai.xi             u32Reg = REG_SAR_ADC_CH5_DATA;
637*53ee8cc1Swenshuai.xi             break;
638*53ee8cc1Swenshuai.xi         case HAL_SAR_CH6:
639*53ee8cc1Swenshuai.xi             u32Reg = REG_SAR_ADC_CH6_DATA;
640*53ee8cc1Swenshuai.xi             break;
641*53ee8cc1Swenshuai.xi         case HAL_SAR_CH7:
642*53ee8cc1Swenshuai.xi             u32Reg = REG_SAR_ADC_CH7_DATA;
643*53ee8cc1Swenshuai.xi             break;
644*53ee8cc1Swenshuai.xi         case HAL_SAR_CH8:
645*53ee8cc1Swenshuai.xi             u32Reg = REG_SAR_ADC_CH8_DATA;
646*53ee8cc1Swenshuai.xi             break;
647*53ee8cc1Swenshuai.xi     }
648*53ee8cc1Swenshuai.xi 
649*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByte(REG_SAR_CTRL1 ,HAL_SAR_ReadByte(REG_SAR_CTRL1)|_SAR_LOAD_EN);
650*53ee8cc1Swenshuai.xi     wChannelAdcValue = (HAL_SAR_Read2Byte(u32Reg) & _SAR_ADC_OUT_10BITMSK);
651*53ee8cc1Swenshuai.xi     wChannelAdcValue = ((wChannelAdcValue >> 2) & _SAR_ADC_OUT_8BITMSK);
652*53ee8cc1Swenshuai.xi     /* because of interface can't be change , we return [9:2] to drv layer */
653*53ee8cc1Swenshuai.xi 
654*53ee8cc1Swenshuai.xi #ifdef CONFIG_MSTAR_DVFS_ENABLE
655*53ee8cc1Swenshuai.xi     HAL_SAR_TSENSOR_OP();
656*53ee8cc1Swenshuai.xi #endif
657*53ee8cc1Swenshuai.xi 
658*53ee8cc1Swenshuai.xi     return (MS_U8) wChannelAdcValue;
659*53ee8cc1Swenshuai.xi }
660*53ee8cc1Swenshuai.xi 
661*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
662*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_CfgSingleChannel
663*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Configure channel for single channel mode
664*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8Channel : sar channel (0~7)
665*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
666*53ee8cc1Swenshuai.xi /// @param <RET>        \b None:
667*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
668*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_CfgSingleChannel(MS_U8 u8Channel)669*53ee8cc1Swenshuai.xi void HAL_SAR_CfgSingleChannel(MS_U8 u8Channel)
670*53ee8cc1Swenshuai.xi {
671*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_CTRL0, u8Channel, _SAR_SINGLE_CH_MSK);
672*53ee8cc1Swenshuai.xi }
673*53ee8cc1Swenshuai.xi 
674*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
675*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_CfgTriggerMode
676*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Configure keypad level(trigger) mode
677*53ee8cc1Swenshuai.xi /// @param <IN>         \b bMode : 0: edge trigger mode, 1: level trigger mode
678*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
679*53ee8cc1Swenshuai.xi /// @param <RET>        \b None :
680*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
681*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_CfgTriggerMode(MS_U8 bMode)682*53ee8cc1Swenshuai.xi void HAL_SAR_CfgTriggerMode(MS_U8 bMode)
683*53ee8cc1Swenshuai.xi {
684*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_CTRL0, ((bMode)? _SAR_LEVEL_TRIGGER : 0), _SAR_LEVEL_TRIGGER);
685*53ee8cc1Swenshuai.xi }
686*53ee8cc1Swenshuai.xi 
687*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
688*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_CfgSingleChannelEn
689*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: enable single channel mode
690*53ee8cc1Swenshuai.xi /// @param <IN>         \b bEnable : 0: disable, 1: enable
691*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
692*53ee8cc1Swenshuai.xi /// @param <RET>        \b None:
693*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
694*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_CfgSingleChannelEn(MS_U8 bEnable)695*53ee8cc1Swenshuai.xi void HAL_SAR_CfgSingleChannelEn(MS_U8 bEnable)
696*53ee8cc1Swenshuai.xi {
697*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_CTRL0, ((bEnable)? _SAR_SINGLE_CH_EN : 0), _SAR_SINGLE_CH_EN);
698*53ee8cc1Swenshuai.xi }
699*53ee8cc1Swenshuai.xi 
700*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
701*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_CfgDigitOperMode
702*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Configure sar digital operation mode
703*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8Mode : 0: one-shot, 1: freerun
704*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
705*53ee8cc1Swenshuai.xi /// @param <RET>        \b None:
706*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
707*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_CfgDigitOperMode(MS_U8 u8Mode)708*53ee8cc1Swenshuai.xi void HAL_SAR_CfgDigitOperMode(MS_U8 u8Mode)
709*53ee8cc1Swenshuai.xi {
710*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_CTRL0, ((u8Mode)? _SAR_MODE : 0), _SAR_MODE);
711*53ee8cc1Swenshuai.xi }
712*53ee8cc1Swenshuai.xi 
713*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
714*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_CfgDigitPowerdown
715*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Configure sar digital power down
716*53ee8cc1Swenshuai.xi /// @param <IN>         \b bEnable : 0: power up, 1: power down
717*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
718*53ee8cc1Swenshuai.xi /// @param <RET>        \b None:
719*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
720*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_CfgDigitPowerdown(MS_U8 bEnable)721*53ee8cc1Swenshuai.xi void HAL_SAR_CfgDigitPowerdown(MS_U8 bEnable)
722*53ee8cc1Swenshuai.xi {
723*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_CTRL0, ((bEnable)? _SAR_PD : 0), _SAR_PD);
724*53ee8cc1Swenshuai.xi }
725*53ee8cc1Swenshuai.xi 
726*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
727*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_CfgStart
728*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Configure sar to trigger start signal
729*53ee8cc1Swenshuai.xi /// @param <IN>         \b bEnable : 0: stop, 1: trigger to start
730*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
731*53ee8cc1Swenshuai.xi /// @param <RET>        \b None:
732*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
733*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_CfgStart(MS_U8 bEnable)734*53ee8cc1Swenshuai.xi void HAL_SAR_CfgStart(MS_U8 bEnable)
735*53ee8cc1Swenshuai.xi {
736*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_CTRL0, ((bEnable)? _SAR_START : 0), _SAR_START);
737*53ee8cc1Swenshuai.xi }
738*53ee8cc1Swenshuai.xi 
739*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
740*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_CfgAtopPowerdown
741*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Configure sar atop power down
742*53ee8cc1Swenshuai.xi /// @param <IN>         \b bEnable : 0: power up, 1: power down
743*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
744*53ee8cc1Swenshuai.xi /// @param <RET>        \b None:
745*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
746*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_CfgAtopPowerdown(MS_U8 bEnable)747*53ee8cc1Swenshuai.xi void HAL_SAR_CfgAtopPowerdown(MS_U8 bEnable)
748*53ee8cc1Swenshuai.xi {
749*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_CTRL1, ((bEnable)? _SAR_ADC_PD : 0), _SAR_ADC_PD);
750*53ee8cc1Swenshuai.xi }
751*53ee8cc1Swenshuai.xi 
752*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
753*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_CfgAtopFreeRun
754*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Configure sar atop freerun mode
755*53ee8cc1Swenshuai.xi /// @param <IN>         \b bEnable : 0: controlled by digital, 1: freerun
756*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
757*53ee8cc1Swenshuai.xi /// @param <RET>        \b None:
758*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
759*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_CfgAtopFreeRun(MS_BOOL bEnable)760*53ee8cc1Swenshuai.xi void HAL_SAR_CfgAtopFreeRun(MS_BOOL bEnable)
761*53ee8cc1Swenshuai.xi {
762*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_CTRL1, ((bEnable)? _SAR_FREERUN : 0), _SAR_FREERUN);
763*53ee8cc1Swenshuai.xi }
764*53ee8cc1Swenshuai.xi 
765*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
766*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_CfgSelection
767*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Configure sar selection
768*53ee8cc1Swenshuai.xi /// @param <IN>         \b bEnable : 0: disable, 1: enable
769*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
770*53ee8cc1Swenshuai.xi /// @param <RET>        \b None:
771*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
772*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_CfgSelection(MS_BOOL bEnable)773*53ee8cc1Swenshuai.xi void HAL_SAR_CfgSelection(MS_BOOL bEnable)
774*53ee8cc1Swenshuai.xi {
775*53ee8cc1Swenshuai.xi     MS_U8 u8CtrlData,u8Mask=_SAR_SEL;
776*53ee8cc1Swenshuai.xi 
777*53ee8cc1Swenshuai.xi     u8CtrlData = (bEnable)? u8Mask : 0;
778*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_CTRL1, u8CtrlData, u8Mask);
779*53ee8cc1Swenshuai.xi }
780*53ee8cc1Swenshuai.xi 
781*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
782*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_CfgHighChannel
783*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Configure to use high sar channel ( 4~7, or 4~5)
784*53ee8cc1Swenshuai.xi /// @param <IN>         \b bEnable : 0: disable, 1: enable
785*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
786*53ee8cc1Swenshuai.xi /// @param <RET>        \b None:
787*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
788*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_CfgHighChannel(MS_BOOL bEnable)789*53ee8cc1Swenshuai.xi void HAL_SAR_CfgHighChannel(MS_BOOL bEnable)
790*53ee8cc1Swenshuai.xi {
791*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_CTRL1, ((bEnable)? _SAR_NCH_EN : 0), _SAR_NCH_EN);
792*53ee8cc1Swenshuai.xi }
793*53ee8cc1Swenshuai.xi 
794*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
795*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_CfgClockSamplePeriod
796*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Configure sample period
797*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8ClkSmpPrd :
798*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
799*53ee8cc1Swenshuai.xi /// @param <RET>        \b None:
800*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
801*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_CfgClockSamplePeriod(MS_U8 u8ClkSmpPrd)802*53ee8cc1Swenshuai.xi void HAL_SAR_CfgClockSamplePeriod(MS_U8 u8ClkSmpPrd)
803*53ee8cc1Swenshuai.xi {
804*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_CKSAMP_PRD, u8ClkSmpPrd, _SAR_CKSAMP_PRD_MSK);
805*53ee8cc1Swenshuai.xi }
806*53ee8cc1Swenshuai.xi 
807*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
808*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_CfgAanlogInputSelect
809*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Configure Analog Input/GPIO
810*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8Channel : sar channel (0~7)
811*53ee8cc1Swenshuai.xi /// @param <IN>         \b bEnable : 0: GPIO, 1: Analog Input
812*53ee8cc1Swenshuai.xi /// @param <RET>        \b None:
813*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
814*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_CfgAanlogInputSelect(MS_U8 u8Channel,MS_BOOL bEnable)815*53ee8cc1Swenshuai.xi void HAL_SAR_CfgAanlogInputSelect(MS_U8 u8Channel, MS_BOOL bEnable)
816*53ee8cc1Swenshuai.xi {
817*53ee8cc1Swenshuai.xi     MS_U8 u8CtrlData,u8Mask;
818*53ee8cc1Swenshuai.xi 
819*53ee8cc1Swenshuai.xi     switch(u8Channel)
820*53ee8cc1Swenshuai.xi     {
821*53ee8cc1Swenshuai.xi         case HAL_SAR_CH1:
822*53ee8cc1Swenshuai.xi             u8CtrlData = (bEnable)? _SAR_AISEL_CH1 : (~_SAR_AISEL_CH1);
823*53ee8cc1Swenshuai.xi             u8Mask=_SAR_AISEL_CH1;
824*53ee8cc1Swenshuai.xi             break;
825*53ee8cc1Swenshuai.xi         case HAL_SAR_CH2:
826*53ee8cc1Swenshuai.xi             u8CtrlData = (bEnable)? _SAR_AISEL_CH2 : (~_SAR_AISEL_CH2);
827*53ee8cc1Swenshuai.xi             u8Mask=_SAR_AISEL_CH2;
828*53ee8cc1Swenshuai.xi             break;
829*53ee8cc1Swenshuai.xi         case HAL_SAR_CH3:
830*53ee8cc1Swenshuai.xi             u8CtrlData = (bEnable)? _SAR_AISEL_CH3 : (~_SAR_AISEL_CH3);
831*53ee8cc1Swenshuai.xi             u8Mask=_SAR_AISEL_CH3;
832*53ee8cc1Swenshuai.xi             break;
833*53ee8cc1Swenshuai.xi         case HAL_SAR_CH4:
834*53ee8cc1Swenshuai.xi             u8CtrlData = (bEnable)? _SAR_AISEL_CH4 : (~_SAR_AISEL_CH4);
835*53ee8cc1Swenshuai.xi             u8Mask=_SAR_AISEL_CH4;
836*53ee8cc1Swenshuai.xi             break;
837*53ee8cc1Swenshuai.xi         case HAL_SAR_CH5:
838*53ee8cc1Swenshuai.xi             u8CtrlData = (bEnable)? _SAR_AISEL_CH5 : (~_SAR_AISEL_CH5);
839*53ee8cc1Swenshuai.xi             u8Mask=_SAR_AISEL_CH5;
840*53ee8cc1Swenshuai.xi             break;
841*53ee8cc1Swenshuai.xi         default: return;
842*53ee8cc1Swenshuai.xi     }
843*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_AISEL, u8CtrlData, u8Mask);
844*53ee8cc1Swenshuai.xi }
845*53ee8cc1Swenshuai.xi 
846*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
847*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_CfgOutputEnable
848*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Configure output enable for sar channel set as GPIO
849*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8Channel : sar channel (0~7)
850*53ee8cc1Swenshuai.xi /// @param <IN>         \b bEnable: 0: output, 1: input
851*53ee8cc1Swenshuai.xi /// @param <RET>        \b None:
852*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
853*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_CfgOutputEnable(MS_U8 u8Channel,MS_BOOL bEnable)854*53ee8cc1Swenshuai.xi void HAL_SAR_CfgOutputEnable(MS_U8 u8Channel, MS_BOOL bEnable)
855*53ee8cc1Swenshuai.xi {
856*53ee8cc1Swenshuai.xi     MS_U8 u8CtrlData,u8Mask;
857*53ee8cc1Swenshuai.xi 
858*53ee8cc1Swenshuai.xi     switch(u8Channel)
859*53ee8cc1Swenshuai.xi     {
860*53ee8cc1Swenshuai.xi         case HAL_SAR_CH1:
861*53ee8cc1Swenshuai.xi             u8CtrlData = (bEnable)? ~_SAR_OEN_GPIO_CH1 : _SAR_OEN_GPIO_CH1;
862*53ee8cc1Swenshuai.xi             u8Mask = _SAR_OEN_GPIO_CH1;
863*53ee8cc1Swenshuai.xi             break;
864*53ee8cc1Swenshuai.xi         case HAL_SAR_CH2:
865*53ee8cc1Swenshuai.xi             u8CtrlData = (bEnable)? ~_SAR_OEN_GPIO_CH2 : _SAR_OEN_GPIO_CH2;
866*53ee8cc1Swenshuai.xi             u8Mask = _SAR_OEN_GPIO_CH2;
867*53ee8cc1Swenshuai.xi             break;
868*53ee8cc1Swenshuai.xi         case HAL_SAR_CH3:
869*53ee8cc1Swenshuai.xi             u8CtrlData = (bEnable)? ~_SAR_OEN_GPIO_CH3 : _SAR_OEN_GPIO_CH3;
870*53ee8cc1Swenshuai.xi             u8Mask = _SAR_OEN_GPIO_CH3;
871*53ee8cc1Swenshuai.xi             break;
872*53ee8cc1Swenshuai.xi         case HAL_SAR_CH4:
873*53ee8cc1Swenshuai.xi             u8CtrlData = (bEnable)? ~_SAR_OEN_GPIO_CH4 : _SAR_OEN_GPIO_CH4;
874*53ee8cc1Swenshuai.xi             u8Mask = _SAR_OEN_GPIO_CH4;
875*53ee8cc1Swenshuai.xi             break;
876*53ee8cc1Swenshuai.xi         case HAL_SAR_CH5:
877*53ee8cc1Swenshuai.xi             u8CtrlData = (bEnable)? ~_SAR_OEN_GPIO_CH5 : _SAR_OEN_GPIO_CH5;
878*53ee8cc1Swenshuai.xi             u8Mask = _SAR_OEN_GPIO_CH5;
879*53ee8cc1Swenshuai.xi             break;
880*53ee8cc1Swenshuai.xi         default: return;
881*53ee8cc1Swenshuai.xi     }
882*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_OEN_GPIO, u8CtrlData, u8Mask);
883*53ee8cc1Swenshuai.xi }
884*53ee8cc1Swenshuai.xi 
885*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
886*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_SetOutput
887*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Set GPIO output value(high/low) for sar channel
888*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8Channel : sar channel (0~7)
889*53ee8cc1Swenshuai.xi /// @param <IN>         \b bHighLow  0: low, 1: high
890*53ee8cc1Swenshuai.xi /// @param <RET>        \b None:
891*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
892*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_SetOutput(MS_U8 u8Channel,MS_BOOL bHighLow)893*53ee8cc1Swenshuai.xi void HAL_SAR_SetOutput(MS_U8 u8Channel, MS_BOOL bHighLow)
894*53ee8cc1Swenshuai.xi {
895*53ee8cc1Swenshuai.xi     MS_U8 u8CtrlData,u8Mask;
896*53ee8cc1Swenshuai.xi 
897*53ee8cc1Swenshuai.xi     switch(u8Channel)
898*53ee8cc1Swenshuai.xi     {
899*53ee8cc1Swenshuai.xi         case HAL_SAR_CH1:
900*53ee8cc1Swenshuai.xi             u8CtrlData = (bHighLow)? _SAR_I_GPIO_CH1 : ~_SAR_I_GPIO_CH1;
901*53ee8cc1Swenshuai.xi             u8Mask = _SAR_I_GPIO_CH1;
902*53ee8cc1Swenshuai.xi             break;
903*53ee8cc1Swenshuai.xi         case HAL_SAR_CH2:
904*53ee8cc1Swenshuai.xi             u8CtrlData = (bHighLow)? _SAR_I_GPIO_CH2 : ~_SAR_I_GPIO_CH2;
905*53ee8cc1Swenshuai.xi             u8Mask = _SAR_I_GPIO_CH2;
906*53ee8cc1Swenshuai.xi             break;
907*53ee8cc1Swenshuai.xi         case HAL_SAR_CH3:
908*53ee8cc1Swenshuai.xi             u8CtrlData = (bHighLow)? _SAR_I_GPIO_CH3 : ~_SAR_I_GPIO_CH3;
909*53ee8cc1Swenshuai.xi             u8Mask = _SAR_I_GPIO_CH3;
910*53ee8cc1Swenshuai.xi             break;
911*53ee8cc1Swenshuai.xi         case HAL_SAR_CH4:
912*53ee8cc1Swenshuai.xi             u8CtrlData = (bHighLow)? _SAR_I_GPIO_CH4 : ~_SAR_I_GPIO_CH4;
913*53ee8cc1Swenshuai.xi             u8Mask = _SAR_I_GPIO_CH4;
914*53ee8cc1Swenshuai.xi             break;
915*53ee8cc1Swenshuai.xi         case HAL_SAR_CH5:
916*53ee8cc1Swenshuai.xi             u8CtrlData = (bHighLow)? _SAR_I_GPIO_CH5 : ~_SAR_I_GPIO_CH5;
917*53ee8cc1Swenshuai.xi             u8Mask = _SAR_I_GPIO_CH5;
918*53ee8cc1Swenshuai.xi             break;
919*53ee8cc1Swenshuai.xi         default: return;
920*53ee8cc1Swenshuai.xi     }
921*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_I_GPIO, u8CtrlData, u8Mask);
922*53ee8cc1Swenshuai.xi }
923*53ee8cc1Swenshuai.xi 
924*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
925*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_GetInput
926*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Get GPIO input value(high/low) for sar channel
927*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8Channel : sar channel (0~7)
928*53ee8cc1Swenshuai.xi /// @param <IN>         \b bHighLow  0: low, 1: high
929*53ee8cc1Swenshuai.xi /// @param <RET>        \b TRUE: High FALSE: Low
930*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
931*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_GetInput(MS_U8 u8Channel)932*53ee8cc1Swenshuai.xi MS_BOOL HAL_SAR_GetInput(MS_U8 u8Channel)
933*53ee8cc1Swenshuai.xi {
934*53ee8cc1Swenshuai.xi     MS_U8 u8Mask;
935*53ee8cc1Swenshuai.xi 
936*53ee8cc1Swenshuai.xi     switch(u8Channel)
937*53ee8cc1Swenshuai.xi     {
938*53ee8cc1Swenshuai.xi         case HAL_SAR_CH1:
939*53ee8cc1Swenshuai.xi             u8Mask = _SAR_C_GPIO_CH1;
940*53ee8cc1Swenshuai.xi             break;
941*53ee8cc1Swenshuai.xi         case HAL_SAR_CH2:
942*53ee8cc1Swenshuai.xi             u8Mask = _SAR_C_GPIO_CH2;
943*53ee8cc1Swenshuai.xi             break;
944*53ee8cc1Swenshuai.xi         case HAL_SAR_CH3:
945*53ee8cc1Swenshuai.xi             u8Mask = _SAR_C_GPIO_CH3;
946*53ee8cc1Swenshuai.xi             break;
947*53ee8cc1Swenshuai.xi         case HAL_SAR_CH4:
948*53ee8cc1Swenshuai.xi             u8Mask = _SAR_C_GPIO_CH4;
949*53ee8cc1Swenshuai.xi             break;
950*53ee8cc1Swenshuai.xi         case HAL_SAR_CH5:
951*53ee8cc1Swenshuai.xi             u8Mask = _SAR_C_GPIO_CH5;
952*53ee8cc1Swenshuai.xi             break;
953*53ee8cc1Swenshuai.xi         default: return FALSE;
954*53ee8cc1Swenshuai.xi     }
955*53ee8cc1Swenshuai.xi     return HAL_SAR_ReadRegBit(REG_SAR_C_GPIO, u8Mask);
956*53ee8cc1Swenshuai.xi }
957*53ee8cc1Swenshuai.xi 
958*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
959*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_CfgIntMask
960*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Interrupt mask for sar int
961*53ee8cc1Swenshuai.xi /// @param <IN>         \b bEnable : 0: enable int, 1: disable int
962*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
963*53ee8cc1Swenshuai.xi /// @param <RET>        \b None:
964*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
965*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_CfgIntMask(MS_BOOL bEnable)966*53ee8cc1Swenshuai.xi void HAL_SAR_CfgIntMask(MS_BOOL bEnable)
967*53ee8cc1Swenshuai.xi {
968*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_STATUS0, ((bEnable)? _SAR_INT_MASK : 0), _SAR_INT_MASK);
969*53ee8cc1Swenshuai.xi }
970*53ee8cc1Swenshuai.xi 
971*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
972*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_CfgIntClear
973*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Interrupt clear for sar int
974*53ee8cc1Swenshuai.xi /// @param <IN>         \b bEnable : 0: not clear, 1: clear
975*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
976*53ee8cc1Swenshuai.xi /// @param <RET>        \b None:
977*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
978*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_CfgIntClear(MS_BOOL bEnable)979*53ee8cc1Swenshuai.xi void HAL_SAR_CfgIntClear(MS_BOOL bEnable)
980*53ee8cc1Swenshuai.xi {
981*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_STATUS0, ((bEnable)? _SAR_INT_CLR : 0), _SAR_INT_CLR);
982*53ee8cc1Swenshuai.xi }
983*53ee8cc1Swenshuai.xi 
984*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
985*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_CfgIntForce
986*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Force interrupt for sar int
987*53ee8cc1Swenshuai.xi /// @param <IN>         \b bEnable : 0: not force, 1: force
988*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
989*53ee8cc1Swenshuai.xi /// @param <RET>        \b None:
990*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
991*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_CfgIntForce(MS_BOOL bEnable)992*53ee8cc1Swenshuai.xi void HAL_SAR_CfgIntForce(MS_BOOL bEnable)
993*53ee8cc1Swenshuai.xi {
994*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_STATUS0, ((bEnable)? _SAR_INT_FORCE : 0), _SAR_INT_FORCE);
995*53ee8cc1Swenshuai.xi }
996*53ee8cc1Swenshuai.xi 
997*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
998*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_GetIntStatus
999*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: get sar interrupt status
1000*53ee8cc1Swenshuai.xi /// @param <IN>         \b None : 0: not force, 1: force
1001*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
1002*53ee8cc1Swenshuai.xi /// @param <RET>        \b TRUE: interrupt comes, FALSE: no interrupt
1003*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
1004*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_GetIntStatus(void)1005*53ee8cc1Swenshuai.xi MS_BOOL HAL_SAR_GetIntStatus(void)
1006*53ee8cc1Swenshuai.xi {
1007*53ee8cc1Swenshuai.xi     MS_U8 u8IntStatus;
1008*53ee8cc1Swenshuai.xi 
1009*53ee8cc1Swenshuai.xi     u8IntStatus = HAL_SAR_ReadByte(REG_SAR_STATUS0) & _SAR_INT_STATUS;
1010*53ee8cc1Swenshuai.xi     return (u8IntStatus)? ENABLE : DISABLE;
1011*53ee8cc1Swenshuai.xi }
1012*53ee8cc1Swenshuai.xi 
1013*53ee8cc1Swenshuai.xi 
1014*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1015*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_SetIOMapBase_NPM
1016*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Set IO Map base
1017*53ee8cc1Swenshuai.xi /// @param <IN>         \b u32Base : io map base address
1018*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
1019*53ee8cc1Swenshuai.xi /// @param <RET>        \b None :
1020*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
1021*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_SetIOMapBase_NPM(MS_U32 u32Base)1022*53ee8cc1Swenshuai.xi void HAL_SAR_SetIOMapBase_NPM(MS_U32 u32Base)
1023*53ee8cc1Swenshuai.xi {
1024*53ee8cc1Swenshuai.xi     _gMIO_MapBase_NPM = u32Base;
1025*53ee8cc1Swenshuai.xi     HAL_SAR_INFO("SAR NPM IOMap base:%8lx Reg offset:%4x\n", u32Base);
1026*53ee8cc1Swenshuai.xi }
1027*53ee8cc1Swenshuai.xi 
1028*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1029*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_GetIOMapBase_NPM
1030*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Get IO Map base
1031*53ee8cc1Swenshuai.xi /// @param <IN>         \b None :
1032*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
1033*53ee8cc1Swenshuai.xi /// @param <RET>        \b MS_U32 : io map base address
1034*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
1035*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_GetIOMapBase_NPM(void)1036*53ee8cc1Swenshuai.xi MS_U32 HAL_SAR_GetIOMapBase_NPM(void)
1037*53ee8cc1Swenshuai.xi {
1038*53ee8cc1Swenshuai.xi     return _gMIO_MapBase_NPM;
1039*53ee8cc1Swenshuai.xi }
1040*53ee8cc1Swenshuai.xi 
1041*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1042*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_SetAdcHSyncChannel
1043*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Switch HSync signal to SAR High channel
1044*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8Channel : ADC HSync channel (0~2)
1045*53ee8cc1Swenshuai.xi /// @param <RET>        \b TRUE: Success FALSE: Fail
1046*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
1047*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_SetAdcHSyncChannel(MS_U8 u8Channel)1048*53ee8cc1Swenshuai.xi MS_BOOL HAL_SAR_SetAdcHSyncChannel(MS_U8 u8Channel)
1049*53ee8cc1Swenshuai.xi {
1050*53ee8cc1Swenshuai.xi     MS_U8 u8HSyncCh;
1051*53ee8cc1Swenshuai.xi 
1052*53ee8cc1Swenshuai.xi     switch(u8Channel)
1053*53ee8cc1Swenshuai.xi     {
1054*53ee8cc1Swenshuai.xi         case HAL_SAR_ADC_HSYNC_CH0:
1055*53ee8cc1Swenshuai.xi             u8HSyncCh = _SAR2_HSYNC_CH0;
1056*53ee8cc1Swenshuai.xi             break;
1057*53ee8cc1Swenshuai.xi         case HAL_SAR_ADC_HSYNC_CH1:
1058*53ee8cc1Swenshuai.xi             u8HSyncCh = _SAR2_HSYNC_CH1;
1059*53ee8cc1Swenshuai.xi             break;
1060*53ee8cc1Swenshuai.xi         case HAL_SAR_ADC_HSYNC_CH2:
1061*53ee8cc1Swenshuai.xi             u8HSyncCh = _SAR2_HSYNC_CH2;
1062*53ee8cc1Swenshuai.xi             break;
1063*53ee8cc1Swenshuai.xi         case HAL_SAR_ADC_HSYNC_CH3:
1064*53ee8cc1Swenshuai.xi             u8HSyncCh = _SAR2_HSYNC_CH3;
1065*53ee8cc1Swenshuai.xi             break;
1066*53ee8cc1Swenshuai.xi         default: return FALSE;
1067*53ee8cc1Swenshuai.xi     }
1068*53ee8cc1Swenshuai.xi     return HAL_SAR_WriteByteMask_NPM(REG_ADC_ATOP_SAR2, u8HSyncCh, _SAR2_HSYNC_MSK);
1069*53ee8cc1Swenshuai.xi 
1070*53ee8cc1Swenshuai.xi }
1071*53ee8cc1Swenshuai.xi 
1072*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1073*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_Interrupt_EN
1074*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Switch SAR Interrupt Enable/Disable
1075*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8Channel : ADC HSync channel (0~3)
1076*53ee8cc1Swenshuai.xi /// @param <IN>         \b bEnablel : True: enable interrupt; False: disable interrupt
1077*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
1078*53ee8cc1Swenshuai.xi /// @param <RET>        \b TRUE: Success FALSE: Fail
1079*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
1080*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_Interrupt_EN(MS_U8 u8Channel,MS_BOOL bEnable)1081*53ee8cc1Swenshuai.xi MS_BOOL HAL_SAR_Interrupt_EN(MS_U8 u8Channel, MS_BOOL bEnable)
1082*53ee8cc1Swenshuai.xi {
1083*53ee8cc1Swenshuai.xi     return HAL_SAR_WriteByteMask(REG_SAR_INT, ((bEnable)? 1<<u8Channel : 0), 1<<u8Channel);
1084*53ee8cc1Swenshuai.xi }
1085*53ee8cc1Swenshuai.xi 
1086*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1087*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_Wakeup_EN
1088*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Switch SAR Interrupt  Wakeup Enable/Disable
1089*53ee8cc1Swenshuai.xi /// @param <IN>         \b bEnablel : True: enable interrrupt wakeup; False: disable interrupt wakeup
1090*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
1091*53ee8cc1Swenshuai.xi /// @param <RET>        \b TRUE: Success FALSE: Fail
1092*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
1093*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_Wakeup_EN(MS_BOOL bEnable)1094*53ee8cc1Swenshuai.xi MS_BOOL HAL_SAR_Wakeup_EN(MS_BOOL bEnable)
1095*53ee8cc1Swenshuai.xi {
1096*53ee8cc1Swenshuai.xi     return HAL_SAR_WriteByteMask(REG_WK_IRQ, ((bEnable)? _W_SAR : 0), _W_SAR);
1097*53ee8cc1Swenshuai.xi }
1098*53ee8cc1Swenshuai.xi 
1099*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1100*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_CLR_INT
1101*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Switch SAR Clear Interrupt Status
1102*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8Channel : ADC HSync channel (0~3)
1103*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
1104*53ee8cc1Swenshuai.xi /// @param <RET>        \b  None
1105*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
1106*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_CLR_INT(MS_U8 u8Channel)1107*53ee8cc1Swenshuai.xi void HAL_SAR_CLR_INT(MS_U8 u8Channel)
1108*53ee8cc1Swenshuai.xi {
1109*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_CLR_INT, 1<<u8Channel, 1<<u8Channel);
1110*53ee8cc1Swenshuai.xi     HAL_SAR_WriteByteMask(REG_SAR_CLR_INT, 0, 1<<u8Channel);
1111*53ee8cc1Swenshuai.xi }
1112*53ee8cc1Swenshuai.xi 
1113*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1114*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_INT_Status
1115*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: get sar interrupt status
1116*53ee8cc1Swenshuai.xi /// @param <IN>         \b u8Channel : ADC HSync channel (0~3)
1117*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
1118*53ee8cc1Swenshuai.xi /// @param <RET>        \b TRUE: interrupt comes, FALSE: no interrupt
1119*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
1120*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_INT_Status(MS_U8 u8Channel)1121*53ee8cc1Swenshuai.xi MS_BOOL HAL_SAR_INT_Status(MS_U8 u8Channel)
1122*53ee8cc1Swenshuai.xi {
1123*53ee8cc1Swenshuai.xi     return (HAL_SAR_ReadByte(REG_SAR_INT_STATUS) & (1<<u8Channel)) > 0? TRUE : FALSE;
1124*53ee8cc1Swenshuai.xi }
1125*53ee8cc1Swenshuai.xi 
1126*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1127*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_SET_LEVEL
1128*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: set sar level is 2.0V or 3.3V
1129*53ee8cc1Swenshuai.xi /// @param <IN>         \b bLevel : 1:3.3V , 0:2.0V
1130*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None :
1131*53ee8cc1Swenshuai.xi /// @param <RET>        \b Nonw:
1132*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None :
1133*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_SET_LEVEL(MS_BOOL bLevel)1134*53ee8cc1Swenshuai.xi void HAL_SAR_SET_LEVEL(MS_BOOL bLevel)
1135*53ee8cc1Swenshuai.xi {
1136*53ee8cc1Swenshuai.xi     //HAL_SAR_WriteByteMask(REG_SAR_TEST0, (bLevel? 1<<6:0) , 1<<6);
1137*53ee8cc1Swenshuai.xi 	HAL_SAR_WriteByteMask(REG_SAR__REF_V_SEL, (bLevel?0xFF:0x00), 0xFF);
1138*53ee8cc1Swenshuai.xi }
1139*53ee8cc1Swenshuai.xi 
1140*53ee8cc1Swenshuai.xi #ifdef CONFIG_MSTAR_DVFS_ENABLE
1141*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1142*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Name: HAL_SAR_TSENSOR_OP
1143*53ee8cc1Swenshuai.xi /// @brief \b Function  \b Description: Read T-Sensor to Handle DVFS Flow
1144*53ee8cc1Swenshuai.xi /// @param <IN>         \b None:
1145*53ee8cc1Swenshuai.xi /// @param <OUT>        \b None:
1146*53ee8cc1Swenshuai.xi /// @param <RET>        \b None:
1147*53ee8cc1Swenshuai.xi /// @param <GLOBAL>     \b None:
1148*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_SAR_TSENSOR_OP(void)1149*53ee8cc1Swenshuai.xi void HAL_SAR_TSENSOR_OP(void)
1150*53ee8cc1Swenshuai.xi {
1151*53ee8cc1Swenshuai.xi     unsigned int    dwRegisterValue = 0;
1152*53ee8cc1Swenshuai.xi     static MSTAR_DVFS_INFO hMstarDvfsInfo =
1153*53ee8cc1Swenshuai.xi     {
1154*53ee8cc1Swenshuai.xi         .bDvfsInitOk = 0,
1155*53ee8cc1Swenshuai.xi         .bCpuClockLevel = CONFIG_DVFS_STATE_INIT,
1156*53ee8cc1Swenshuai.xi         .dwOverCounter = 0,
1157*53ee8cc1Swenshuai.xi         .dwEfuseSiddValue = 0,
1158*53ee8cc1Swenshuai.xi 
1159*53ee8cc1Swenshuai.xi         .dwFinalCpuTemperature = 0,
1160*53ee8cc1Swenshuai.xi         .dwAvgTempCounterCpu = 0,
1161*53ee8cc1Swenshuai.xi         .dwCode25CValueCpu = 0,
1162*53ee8cc1Swenshuai.xi 
1163*53ee8cc1Swenshuai.xi #if CONFIG_DVFS_FULL_TEST_ENABLE
1164*53ee8cc1Swenshuai.xi         .dwFinalPmTemperature = 0,
1165*53ee8cc1Swenshuai.xi         .dwAvgTempCounterPm = 0,
1166*53ee8cc1Swenshuai.xi         .dwCode25CValuePm = 0,
1167*53ee8cc1Swenshuai.xi #endif
1168*53ee8cc1Swenshuai.xi     };
1169*53ee8cc1Swenshuai.xi 
1170*53ee8cc1Swenshuai.xi     dwRegisterValue = *(volatile unsigned short *)(_gMIO_MapBase + (0x100500 << 1));
1171*53ee8cc1Swenshuai.xi     if(dwRegisterValue == CONFIG_DVFS_ENABLE_PATTERN)
1172*53ee8cc1Swenshuai.xi     {
1173*53ee8cc1Swenshuai.xi         int     dwCoreChipValue = 0;
1174*53ee8cc1Swenshuai.xi         int     dwChipTempValue = 0;
1175*53ee8cc1Swenshuai.xi         int     dwUpperTemperature = 0;
1176*53ee8cc1Swenshuai.xi         int     dwLowerTemperature = 0;
1177*53ee8cc1Swenshuai.xi         int     dwResetTemperature = 0;
1178*53ee8cc1Swenshuai.xi 
1179*53ee8cc1Swenshuai.xi         if(hMstarDvfsInfo.bDvfsInitOk == 0)
1180*53ee8cc1Swenshuai.xi         {
1181*53ee8cc1Swenshuai.xi             _s32SAR_Dvfs_Mutex = MsOS_CreateMutex(E_MSOS_FIFO, "Mutex SAR_DVFS", MSOS_PROCESS_SHARED);
1182*53ee8cc1Swenshuai.xi             MS_ASSERT(_s32SAR_Dvfs_Mutex >= 0);
1183*53ee8cc1Swenshuai.xi         }
1184*53ee8cc1Swenshuai.xi 
1185*53ee8cc1Swenshuai.xi         if (FALSE == MsOS_ObtainMutex(_s32SAR_Dvfs_Mutex, CONFIG_DVFS_MUTEX_WAIT_TIME))
1186*53ee8cc1Swenshuai.xi         {
1187*53ee8cc1Swenshuai.xi             HAL_DVFS_INFO("[DVFS] Mutex Lock Fail\n");
1188*53ee8cc1Swenshuai.xi             return;
1189*53ee8cc1Swenshuai.xi         }
1190*53ee8cc1Swenshuai.xi 
1191*53ee8cc1Swenshuai.xi         if(hMstarDvfsInfo.bDvfsInitOk == 0)
1192*53ee8cc1Swenshuai.xi         {
1193*53ee8cc1Swenshuai.xi             //Init Basic Register Settings
1194*53ee8cc1Swenshuai.xi //            *(volatile unsigned short *)(_gMIO_MapBase + (0x100500 << 1)) = 0;      //Enable
1195*53ee8cc1Swenshuai.xi //            *(volatile unsigned short *)(_gMIO_MapBase + (0x100502 << 1)) = 900;    //Current CPU Clock
1196*53ee8cc1Swenshuai.xi //            *(volatile unsigned short *)(_gMIO_MapBase + (0x100504 << 1)) = 25;     //Current Temperature (CPU)
1197*53ee8cc1Swenshuai.xi //            *(volatile unsigned short *)(_gMIO_MapBase + (0x100506 << 1)) = 25;     //Current Temperature (PM)
1198*53ee8cc1Swenshuai.xi //            *(volatile unsigned short *)(_gMIO_MapBase + (0x100508 << 1)) = CONFIG_DVFS_UPPER_BOUND;    //Upper Bound of T-sensor
1199*53ee8cc1Swenshuai.xi //            *(volatile unsigned short *)(_gMIO_MapBase + (0x10050a << 1)) = CONFIG_DVFS_LOWER_BOUND;    //Lower Bound of T-sensor
1200*53ee8cc1Swenshuai.xi //            *(volatile unsigned short *)(_gMIO_MapBase + (0x10050c << 1)) = 0;        //SIDD
1201*53ee8cc1Swenshuai.xi //            *(volatile unsigned short *)(_gMIO_MapBase + (0x10050e << 1)) = CONFIG_DVFS_THRESHOLD;  //Upper Bound of Global Reset
1202*53ee8cc1Swenshuai.xi 
1203*53ee8cc1Swenshuai.xi             //=========================================================
1204*53ee8cc1Swenshuai.xi             //SIDD = Bank1[21:12] = 0x00200E[5:0] + 0x00200C[15:12]
1205*53ee8cc1Swenshuai.xi             hMstarDvfsInfo.dwEfuseSiddValue = *(volatile unsigned short *)(_gMIO_MapBase + (0x00200e << 1));
1206*53ee8cc1Swenshuai.xi             hMstarDvfsInfo.dwEfuseSiddValue &= 0x3F;
1207*53ee8cc1Swenshuai.xi             hMstarDvfsInfo.dwEfuseSiddValue <<= 4;
1208*53ee8cc1Swenshuai.xi             dwRegisterValue = *(volatile unsigned short *)(_gMIO_MapBase + (0x00200c << 1));
1209*53ee8cc1Swenshuai.xi             dwRegisterValue >>= 12;
1210*53ee8cc1Swenshuai.xi             dwRegisterValue &= 0x0F;
1211*53ee8cc1Swenshuai.xi             hMstarDvfsInfo.dwEfuseSiddValue |= hMstarDvfsInfo.dwEfuseSiddValue;
1212*53ee8cc1Swenshuai.xi 
1213*53ee8cc1Swenshuai.xi             hMstarDvfsInfo.dwEfuseSiddThreshold = *(volatile unsigned short *)(_gMIO_MapBase + (0x10050c << 1));
1214*53ee8cc1Swenshuai.xi 
1215*53ee8cc1Swenshuai.xi             if(hMstarDvfsInfo.dwEfuseSiddValue < hMstarDvfsInfo.dwEfuseSiddThreshold)
1216*53ee8cc1Swenshuai.xi             {
1217*53ee8cc1Swenshuai.xi                 //Set VID = 2'b03 to change to 1.28V
1218*53ee8cc1Swenshuai.xi                 *(volatile unsigned short *)(_gMIO_MapBase + (0x110cb2 << 1)) = 0x1330;
1219*53ee8cc1Swenshuai.xi             }
1220*53ee8cc1Swenshuai.xi             else
1221*53ee8cc1Swenshuai.xi             {
1222*53ee8cc1Swenshuai.xi                 //Set VID = 2'b01 to change to 1.20V
1223*53ee8cc1Swenshuai.xi                 *(volatile unsigned short *)(_gMIO_MapBase + (0x110cb2 << 1)) = 0x1130;
1224*53ee8cc1Swenshuai.xi             }
1225*53ee8cc1Swenshuai.xi 
1226*53ee8cc1Swenshuai.xi             //Enable VID
1227*53ee8cc1Swenshuai.xi             dwRegisterValue = *(volatile unsigned short *)(_gMIO_MapBase + (0x000efa << 1));
1228*53ee8cc1Swenshuai.xi             dwRegisterValue &= ~(0x01 << 8);
1229*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x000efa << 1)) = dwRegisterValue;
1230*53ee8cc1Swenshuai.xi 
1231*53ee8cc1Swenshuai.xi #if CONFIG_DVFS_FULL_TEST_ENABLE
1232*53ee8cc1Swenshuai.xi             //=========================================================
1233*53ee8cc1Swenshuai.xi             //Read 25 degree in PM side
1234*53ee8cc1Swenshuai.xi             *(volatile unsigned char *)(_gMIO_MapBase + (0x000e50 << 1)) = 0x06;
1235*53ee8cc1Swenshuai.xi 
1236*53ee8cc1Swenshuai.xi             dwRegisterValue = *(volatile unsigned short *)(_gMIO_MapBase + (0x000ec4 << 1));
1237*53ee8cc1Swenshuai.xi             dwRegisterValue &= ~(0x01 << 13);
1238*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x000ec4 << 1)) = dwRegisterValue;
1239*53ee8cc1Swenshuai.xi 
1240*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x001400 << 1)) = 0x0ab5;
1241*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x001426 << 1)) &= ~(0x01 << 6);  //Set PM SAR full scale = 2.0V
1242*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(CONFIG_DVFS_DELAY_US);
1243*53ee8cc1Swenshuai.xi 
1244*53ee8cc1Swenshuai.xi             hMstarDvfsInfo.dwCode25CValuePm = *(volatile unsigned short *)(_gMIO_MapBase + (0x00148a << 1));     //CH6
1245*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x001426 << 1)) |= (0x01 << 6);  //Set PM SAR full scale = 3.3V
1246*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x001400 << 1)) = 0x0a25;
1247*53ee8cc1Swenshuai.xi #endif
1248*53ee8cc1Swenshuai.xi 
1249*53ee8cc1Swenshuai.xi             //=========================================================
1250*53ee8cc1Swenshuai.xi             //Read 25 degree in CPU side
1251*53ee8cc1Swenshuai.xi             *(volatile unsigned char *)(_gMIO_MapBase + (0x000e50 << 1)) = 0x07;
1252*53ee8cc1Swenshuai.xi 
1253*53ee8cc1Swenshuai.xi             dwRegisterValue = *(volatile unsigned short *)(_gMIO_MapBase + (0x000ec4 << 1));
1254*53ee8cc1Swenshuai.xi             dwRegisterValue &= ~(0x01 << 13);
1255*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x000ec4 << 1)) = dwRegisterValue;
1256*53ee8cc1Swenshuai.xi 
1257*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x001400 << 1)) = 0x0ab5;
1258*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x001426 << 1)) &= ~(0x01 << 6);  //Set PM SAR full scale = 2.0V
1259*53ee8cc1Swenshuai.xi             MsOS_DelayTaskUs(CONFIG_DVFS_DELAY_US);
1260*53ee8cc1Swenshuai.xi 
1261*53ee8cc1Swenshuai.xi             hMstarDvfsInfo.dwCode25CValueCpu = *(volatile unsigned short *)(_gMIO_MapBase + (0x00148a << 1));     //CH6
1262*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x001426 << 1)) |= (0x01 << 6);  //Set PM SAR full scale = 3.3V
1263*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x001400 << 1)) = 0x0a25;
1264*53ee8cc1Swenshuai.xi 
1265*53ee8cc1Swenshuai.xi #if CONFIG_DVFS_CPU_CLOCK_DISPLAY_ENABLE
1266*53ee8cc1Swenshuai.xi             //=========================================================
1267*53ee8cc1Swenshuai.xi             //Init Test Bus for CPU Clock
1268*53ee8cc1Swenshuai.xi             dwRegisterValue = *(volatile unsigned short *)(_gMIO_MapBase + (0x101896 << 1));
1269*53ee8cc1Swenshuai.xi             dwRegisterValue &= ~(0x07);
1270*53ee8cc1Swenshuai.xi             dwRegisterValue |= 0x01;
1271*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x101896 << 1)) = dwRegisterValue;
1272*53ee8cc1Swenshuai.xi 
1273*53ee8cc1Swenshuai.xi             dwRegisterValue = *(volatile unsigned short *)(_gMIO_MapBase + (0x101eec << 1));
1274*53ee8cc1Swenshuai.xi             dwRegisterValue |= 0x0100;
1275*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x101eec << 1)) = dwRegisterValue;
1276*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x101eea << 1)) = 0;
1277*53ee8cc1Swenshuai.xi 
1278*53ee8cc1Swenshuai.xi             dwRegisterValue = *(volatile unsigned short *)(_gMIO_MapBase + (0x101eea << 1));
1279*53ee8cc1Swenshuai.xi             dwRegisterValue &= ~(0x07);
1280*53ee8cc1Swenshuai.xi             dwRegisterValue |= 0x04;
1281*53ee8cc1Swenshuai.xi             dwRegisterValue &= ~(0x01 << 4);
1282*53ee8cc1Swenshuai.xi             dwRegisterValue &= ~(0x01 << 5);
1283*53ee8cc1Swenshuai.xi             dwRegisterValue &= ~(0x01 << 6);
1284*53ee8cc1Swenshuai.xi             dwRegisterValue |= (0x01 << 14);
1285*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x101eea << 1)) = dwRegisterValue;
1286*53ee8cc1Swenshuai.xi 
1287*53ee8cc1Swenshuai.xi             dwRegisterValue = *(volatile unsigned short *)(_gMIO_MapBase + (0x101eee << 1));
1288*53ee8cc1Swenshuai.xi             dwRegisterValue &= ~(0x7F);
1289*53ee8cc1Swenshuai.xi             dwRegisterValue |= 0x1F;
1290*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x101eee << 1)) = dwRegisterValue;
1291*53ee8cc1Swenshuai.xi #endif
1292*53ee8cc1Swenshuai.xi 
1293*53ee8cc1Swenshuai.xi             hMstarDvfsInfo.bCpuClockLevel = CONFIG_DVFS_STATE_INIT;
1294*53ee8cc1Swenshuai.xi             hMstarDvfsInfo.bDvfsInitOk = 1;
1295*53ee8cc1Swenshuai.xi         }
1296*53ee8cc1Swenshuai.xi 
1297*53ee8cc1Swenshuai.xi #if CONFIG_DVFS_FULL_TEST_ENABLE
1298*53ee8cc1Swenshuai.xi         //=========================================================
1299*53ee8cc1Swenshuai.xi         //Read Chip degree in PM side
1300*53ee8cc1Swenshuai.xi         *(volatile unsigned char *)(_gMIO_MapBase + (0x000e50 << 1)) = 0x06;
1301*53ee8cc1Swenshuai.xi 
1302*53ee8cc1Swenshuai.xi         dwRegisterValue = *(volatile unsigned short *)(_gMIO_MapBase + (0x000ec4 << 1));
1303*53ee8cc1Swenshuai.xi         dwRegisterValue &= ~(0x01 << 13);
1304*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x000ec4 << 1)) = dwRegisterValue;
1305*53ee8cc1Swenshuai.xi         dwRegisterValue |= (0x01 << 13);
1306*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x000ec4 << 1)) = dwRegisterValue;
1307*53ee8cc1Swenshuai.xi 
1308*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x001400 << 1)) = 0x0ab5;
1309*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x001426 << 1)) &= ~(0x01 << 6);  //Set PM SAR full scale = 2.0V
1310*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(CONFIG_DVFS_DELAY_US);
1311*53ee8cc1Swenshuai.xi 
1312*53ee8cc1Swenshuai.xi         dwCoreChipValue = *(volatile unsigned short *)(_gMIO_MapBase + (0x00148a << 1));    //CH6
1313*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x001426 << 1)) |= (0x01 << 6);  //Set PM SAR full scale = 3.3V
1314*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x001400 << 1)) = 0x0a25;
1315*53ee8cc1Swenshuai.xi 
1316*53ee8cc1Swenshuai.xi         hMstarDvfsInfo.dwAvgTempBufferPm[hMstarDvfsInfo.dwAvgTempCounterPm] = dwCoreChipValue;
1317*53ee8cc1Swenshuai.xi         hMstarDvfsInfo.dwAvgTempCounterPm ++;
1318*53ee8cc1Swenshuai.xi         if(hMstarDvfsInfo.dwAvgTempCounterPm >= CONFIG_DVFS_AVERAGE_COUNT)
1319*53ee8cc1Swenshuai.xi         {
1320*53ee8cc1Swenshuai.xi             unsigned int    dwTempCounter = 0;
1321*53ee8cc1Swenshuai.xi             unsigned int    dwTempValue = 0;
1322*53ee8cc1Swenshuai.xi 
1323*53ee8cc1Swenshuai.xi             HAL_DVFS_DEBUG("[DVFS] .................. Start\n");
1324*53ee8cc1Swenshuai.xi 
1325*53ee8cc1Swenshuai.xi             HAL_DVFS_DEBUG("[DVFS] 25-degree (PM): 0x%04x\n", (unsigned int) hMstarDvfsInfo.dwCode25CValuePm);
1326*53ee8cc1Swenshuai.xi             HAL_DVFS_DEBUG("[DVFS] Chip-degree (PM): ");
1327*53ee8cc1Swenshuai.xi             for(dwTempCounter = 0; dwTempCounter < CONFIG_DVFS_AVERAGE_COUNT; dwTempCounter ++)
1328*53ee8cc1Swenshuai.xi             {
1329*53ee8cc1Swenshuai.xi                 //HAL_DVFS_DEBUG(" - %d: 0x%04x\n", dwTempCounter, dwAvgTempBufferPm[dwTempCounter]);
1330*53ee8cc1Swenshuai.xi                 dwTempValue += hMstarDvfsInfo.dwAvgTempBufferPm[dwTempCounter];
1331*53ee8cc1Swenshuai.xi             }
1332*53ee8cc1Swenshuai.xi             dwTempValue /= CONFIG_DVFS_AVERAGE_COUNT;
1333*53ee8cc1Swenshuai.xi 
1334*53ee8cc1Swenshuai.xi             HAL_DVFS_DEBUG("0x%04x\n", dwTempValue);
1335*53ee8cc1Swenshuai.xi 
1336*53ee8cc1Swenshuai.xi             //dwChipTempValue = ((((((dwCode25CValuePm - dwTempValue) * 1000) * 2000) / 1024) / 1.545) + 25000);
1337*53ee8cc1Swenshuai.xi             if(hMstarDvfsInfo.dwCode25CValuePm >= dwCoreChipValue)
1338*53ee8cc1Swenshuai.xi             {
1339*53ee8cc1Swenshuai.xi                 dwChipTempValue = (((hMstarDvfsInfo.dwCode25CValuePm - dwTempValue) * 1264) + 29000);
1340*53ee8cc1Swenshuai.xi             }
1341*53ee8cc1Swenshuai.xi             else
1342*53ee8cc1Swenshuai.xi             {
1343*53ee8cc1Swenshuai.xi                 dwChipTempValue = ((dwTempValue - hMstarDvfsInfo.dwCode25CValuePm) * 1264);
1344*53ee8cc1Swenshuai.xi                 dwChipTempValue = (29000 - dwChipTempValue);
1345*53ee8cc1Swenshuai.xi             }
1346*53ee8cc1Swenshuai.xi 
1347*53ee8cc1Swenshuai.xi             hMstarDvfsInfo.dwFinalPmTemperature = (dwChipTempValue / 1000);
1348*53ee8cc1Swenshuai.xi             HAL_DVFS_DEBUG("[DVFS] Average Temperature (PM): %d\n", (unsigned int) hMstarDvfsInfo.dwFinalPmTemperature);
1349*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x100506 << 1)) = hMstarDvfsInfo.dwFinalPmTemperature;
1350*53ee8cc1Swenshuai.xi 
1351*53ee8cc1Swenshuai.xi             hMstarDvfsInfo.dwAvgTempCounterPm = 0;
1352*53ee8cc1Swenshuai.xi 
1353*53ee8cc1Swenshuai.xi             HAL_DVFS_DEBUG("[DVFS] .................. End\n");
1354*53ee8cc1Swenshuai.xi         }
1355*53ee8cc1Swenshuai.xi #endif
1356*53ee8cc1Swenshuai.xi 
1357*53ee8cc1Swenshuai.xi         //=========================================================
1358*53ee8cc1Swenshuai.xi         //Read Chip degree in CPU side
1359*53ee8cc1Swenshuai.xi         *(volatile unsigned char *)(_gMIO_MapBase + (0x000e50 << 1)) = 0x07;
1360*53ee8cc1Swenshuai.xi 
1361*53ee8cc1Swenshuai.xi         dwRegisterValue = *(volatile unsigned short *)(_gMIO_MapBase + (0x000ec4 << 1));
1362*53ee8cc1Swenshuai.xi         dwRegisterValue &= ~(0x01 << 13);
1363*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x000ec4 << 1)) = dwRegisterValue;
1364*53ee8cc1Swenshuai.xi 
1365*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x001400 << 1)) = 0x0ab6;
1366*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x001426 << 1)) &= ~(0x01 << 6);  //Set PM SAR full scale = 2.0V
1367*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(CONFIG_DVFS_DELAY_US);
1368*53ee8cc1Swenshuai.xi 
1369*53ee8cc1Swenshuai.xi         dwCoreChipValue = *(volatile unsigned short *)(_gMIO_MapBase + (0x00148c << 1));    //CH7
1370*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x001426 << 1)) |= (0x01 << 6);  //Set PM SAR full scale = 3.3V
1371*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x001400 << 1)) = 0x0a26;
1372*53ee8cc1Swenshuai.xi 
1373*53ee8cc1Swenshuai.xi         hMstarDvfsInfo.dwAvgTempBufferCpu[hMstarDvfsInfo.dwAvgTempCounterCpu] = dwCoreChipValue;
1374*53ee8cc1Swenshuai.xi         hMstarDvfsInfo.dwAvgTempCounterCpu ++;
1375*53ee8cc1Swenshuai.xi         if(hMstarDvfsInfo.dwAvgTempCounterCpu >= CONFIG_DVFS_AVERAGE_COUNT)
1376*53ee8cc1Swenshuai.xi         {
1377*53ee8cc1Swenshuai.xi             unsigned int    dwTempCounter = 0;
1378*53ee8cc1Swenshuai.xi             unsigned int    dwTempValue = 0;
1379*53ee8cc1Swenshuai.xi 
1380*53ee8cc1Swenshuai.xi             HAL_DVFS_DEBUG("[DVFS] .................. Start\n");
1381*53ee8cc1Swenshuai.xi 
1382*53ee8cc1Swenshuai.xi             HAL_DVFS_DEBUG("[DVFS] 25-degree (CPU): 0x%04x\n", (unsigned int) hMstarDvfsInfo.dwCode25CValueCpu);
1383*53ee8cc1Swenshuai.xi             HAL_DVFS_DEBUG("[DVFS] Chip-degree (CPU):");
1384*53ee8cc1Swenshuai.xi             for(dwTempCounter = 0; dwTempCounter < CONFIG_DVFS_AVERAGE_COUNT; dwTempCounter ++)
1385*53ee8cc1Swenshuai.xi             {
1386*53ee8cc1Swenshuai.xi                 //HAL_DVFS_DEBUG(" - %d: 0x%04x\n", dwTempCounter, dwAvgTempBufferCpu[dwTempCounter]);
1387*53ee8cc1Swenshuai.xi                 dwTempValue += hMstarDvfsInfo.dwAvgTempBufferCpu[dwTempCounter];
1388*53ee8cc1Swenshuai.xi             }
1389*53ee8cc1Swenshuai.xi             dwTempValue /= CONFIG_DVFS_AVERAGE_COUNT;
1390*53ee8cc1Swenshuai.xi 
1391*53ee8cc1Swenshuai.xi             HAL_DVFS_DEBUG("0x%04x\n", dwTempValue);
1392*53ee8cc1Swenshuai.xi 
1393*53ee8cc1Swenshuai.xi             //dwChipTempValue = ((((((dwCode25CValueCpu - dwTempValue) * 1000) * 2000) / 1024) / 1.545) + 25000);
1394*53ee8cc1Swenshuai.xi             if(hMstarDvfsInfo.dwCode25CValueCpu >= dwTempValue)
1395*53ee8cc1Swenshuai.xi             {
1396*53ee8cc1Swenshuai.xi                 dwChipTempValue = (((hMstarDvfsInfo.dwCode25CValueCpu - dwTempValue) * 1264) + 29000);
1397*53ee8cc1Swenshuai.xi             }
1398*53ee8cc1Swenshuai.xi             else
1399*53ee8cc1Swenshuai.xi             {
1400*53ee8cc1Swenshuai.xi                 dwChipTempValue = ((dwTempValue - hMstarDvfsInfo.dwCode25CValueCpu) * 1264);
1401*53ee8cc1Swenshuai.xi                 dwChipTempValue = (29000 - dwChipTempValue);
1402*53ee8cc1Swenshuai.xi             }
1403*53ee8cc1Swenshuai.xi 
1404*53ee8cc1Swenshuai.xi             hMstarDvfsInfo.dwFinalCpuTemperature = (dwChipTempValue / 1000);
1405*53ee8cc1Swenshuai.xi             HAL_DVFS_DEBUG("[DVFS] Average Temperature (CPU): %d\n", (unsigned int) hMstarDvfsInfo.dwFinalCpuTemperature);
1406*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x100504 << 1)) = hMstarDvfsInfo.dwFinalCpuTemperature;
1407*53ee8cc1Swenshuai.xi 
1408*53ee8cc1Swenshuai.xi             hMstarDvfsInfo.dwAvgTempCounterCpu = 0;
1409*53ee8cc1Swenshuai.xi 
1410*53ee8cc1Swenshuai.xi #if CONFIG_DVFS_CPU_CLOCK_DISPLAY_ENABLE
1411*53ee8cc1Swenshuai.xi             dwRegisterValue = *(volatile unsigned short *)(_gMIO_MapBase + (0x101efc << 1));
1412*53ee8cc1Swenshuai.xi             dwRegisterValue *= 12;
1413*53ee8cc1Swenshuai.xi             dwRegisterValue /= 1000;
1414*53ee8cc1Swenshuai.xi             dwRegisterValue *= 4;
1415*53ee8cc1Swenshuai.xi             *(volatile unsigned short *)(_gMIO_MapBase + (0x100502 << 1)) = dwRegisterValue;
1416*53ee8cc1Swenshuai.xi 
1417*53ee8cc1Swenshuai.xi             HAL_DVFS_DEBUG("[DVFS] Current CPU Clock: %dMHz\n", dwRegisterValue);
1418*53ee8cc1Swenshuai.xi #endif
1419*53ee8cc1Swenshuai.xi 
1420*53ee8cc1Swenshuai.xi             HAL_DVFS_DEBUG("[DVFS] .................. End\n");
1421*53ee8cc1Swenshuai.xi         }
1422*53ee8cc1Swenshuai.xi 
1423*53ee8cc1Swenshuai.xi         //=========================================================
1424*53ee8cc1Swenshuai.xi         dwUpperTemperature = *(volatile unsigned short *)(_gMIO_MapBase + (0x100508 << 1));
1425*53ee8cc1Swenshuai.xi         if(dwUpperTemperature == 0)
1426*53ee8cc1Swenshuai.xi         {
1427*53ee8cc1Swenshuai.xi             dwUpperTemperature = *(volatile unsigned short *)(_gMIO_MapBase + (0x00144c << 1));
1428*53ee8cc1Swenshuai.xi         }
1429*53ee8cc1Swenshuai.xi 
1430*53ee8cc1Swenshuai.xi         dwLowerTemperature = *(volatile unsigned short *)(_gMIO_MapBase + (0x10050a << 1));
1431*53ee8cc1Swenshuai.xi         if(dwLowerTemperature == 0)
1432*53ee8cc1Swenshuai.xi         {
1433*53ee8cc1Swenshuai.xi             dwLowerTemperature = *(volatile unsigned short *)(_gMIO_MapBase + (0x00146c << 1));
1434*53ee8cc1Swenshuai.xi         }
1435*53ee8cc1Swenshuai.xi 
1436*53ee8cc1Swenshuai.xi         dwResetTemperature = *(volatile unsigned short *)(_gMIO_MapBase + (0x10050e << 1));
1437*53ee8cc1Swenshuai.xi         if(dwResetTemperature == 0)
1438*53ee8cc1Swenshuai.xi         {
1439*53ee8cc1Swenshuai.xi             dwResetTemperature = 150;
1440*53ee8cc1Swenshuai.xi         }
1441*53ee8cc1Swenshuai.xi 
1442*53ee8cc1Swenshuai.xi         if((hMstarDvfsInfo.dwFinalCpuTemperature > dwResetTemperature) && (hMstarDvfsInfo.bCpuClockLevel != CONFIG_DVFS_STATE_INIT))
1443*53ee8cc1Swenshuai.xi         {
1444*53ee8cc1Swenshuai.xi             if(hMstarDvfsInfo.dwOverCounter < CONFIG_DVFS_AVERAGE_COUNT)
1445*53ee8cc1Swenshuai.xi             {
1446*53ee8cc1Swenshuai.xi                 HAL_DVFS_DEBUG("[DVFS] Over Temperature Protection: %d\n", (unsigned int) hMstarDvfsInfo.dwOverCounter);
1447*53ee8cc1Swenshuai.xi                 hMstarDvfsInfo.dwOverCounter ++;
1448*53ee8cc1Swenshuai.xi             }
1449*53ee8cc1Swenshuai.xi             else
1450*53ee8cc1Swenshuai.xi             {
1451*53ee8cc1Swenshuai.xi                 //Trigger a WDT Reset
1452*53ee8cc1Swenshuai.xi                 HAL_DVFS_INFO("[DVFS] Over Temperature Protection\n");
1453*53ee8cc1Swenshuai.xi                 *(volatile unsigned short *)(_gMIO_MapBase + (0x00300a << 1)) = 0;
1454*53ee8cc1Swenshuai.xi                 *(volatile unsigned short *)(_gMIO_MapBase + (0x003008 << 1)) = 0;
1455*53ee8cc1Swenshuai.xi                 *(volatile unsigned short *)(_gMIO_MapBase + (0x00300a << 1)) = 5;
1456*53ee8cc1Swenshuai.xi                 *(volatile unsigned short *)(_gMIO_MapBase + (0x003000 << 1)) = 1;
1457*53ee8cc1Swenshuai.xi 
1458*53ee8cc1Swenshuai.xi                 HAL_DVFS_INFO("[DVFS] Edit while(1) to return for Coverity Warning;\n");
1459*53ee8cc1Swenshuai.xi                 return;
1460*53ee8cc1Swenshuai.xi             }
1461*53ee8cc1Swenshuai.xi         }
1462*53ee8cc1Swenshuai.xi         else if((hMstarDvfsInfo.dwFinalCpuTemperature > dwUpperTemperature) && (hMstarDvfsInfo.bCpuClockLevel == CONFIG_DVFS_STATE_HIGH_SPEED))
1463*53ee8cc1Swenshuai.xi         {
1464*53ee8cc1Swenshuai.xi             if(hMstarDvfsInfo.dwOverCounter < CONFIG_DVFS_AVERAGE_COUNT)
1465*53ee8cc1Swenshuai.xi             {
1466*53ee8cc1Swenshuai.xi                 hMstarDvfsInfo.dwOverCounter ++;
1467*53ee8cc1Swenshuai.xi             }
1468*53ee8cc1Swenshuai.xi             else
1469*53ee8cc1Swenshuai.xi             {
1470*53ee8cc1Swenshuai.xi                 HAL_DVFS_INFO("[DVFS] Current Temperature: %d\n", (unsigned int) hMstarDvfsInfo.dwFinalCpuTemperature);
1471*53ee8cc1Swenshuai.xi                 HAL_DVFS_INFO("[DVFS] Change to Lower CPU Clock Setting\n");
1472*53ee8cc1Swenshuai.xi 
1473*53ee8cc1Swenshuai.xi                 //high to low
1474*53ee8cc1Swenshuai.xi                 *(volatile unsigned short *)(_gMIO_MapBase + (0x110cb0 << 1)) = 1;   //switch to LPF control
1475*53ee8cc1Swenshuai.xi                 *(volatile unsigned short *)(_gMIO_MapBase + (0x110caa << 1)) = 6;   //mu[2:0]
1476*53ee8cc1Swenshuai.xi                 *(volatile unsigned short *)(_gMIO_MapBase + (0x110cae << 1)) = 8;   //lpf_update_cnt[7:0]
1477*53ee8cc1Swenshuai.xi 
1478*53ee8cc1Swenshuai.xi                 if(hMstarDvfsInfo.dwEfuseSiddValue < hMstarDvfsInfo.dwEfuseSiddThreshold)
1479*53ee8cc1Swenshuai.xi                 {
1480*53ee8cc1Swenshuai.xi                     //Set VID = 2'b03 to change to 1.28V
1481*53ee8cc1Swenshuai.xi                     *(volatile unsigned short *)(_gMIO_MapBase + (0x110cb2 << 1)) = 0x0330;
1482*53ee8cc1Swenshuai.xi                 }
1483*53ee8cc1Swenshuai.xi                 else
1484*53ee8cc1Swenshuai.xi                 {
1485*53ee8cc1Swenshuai.xi                     //Set VID = 2'b01 to change to 1.20V
1486*53ee8cc1Swenshuai.xi                     *(volatile unsigned short *)(_gMIO_MapBase + (0x110cb2 << 1)) = 0x0130;
1487*53ee8cc1Swenshuai.xi                 }
1488*53ee8cc1Swenshuai.xi 
1489*53ee8cc1Swenshuai.xi                 *(volatile unsigned short *)(_gMIO_MapBase + (0x110ca8 << 1)) = 0;
1490*53ee8cc1Swenshuai.xi                 *(volatile unsigned short *)(_gMIO_MapBase + (0x110ca8 << 1)) = 1;
1491*53ee8cc1Swenshuai.xi 
1492*53ee8cc1Swenshuai.xi                 if(hMstarDvfsInfo.dwEfuseSiddValue < hMstarDvfsInfo.dwEfuseSiddThreshold)
1493*53ee8cc1Swenshuai.xi                 {
1494*53ee8cc1Swenshuai.xi                     HAL_DVFS_DEBUG("[DVFS] Change CPU Power to 1.20V\n");
1495*53ee8cc1Swenshuai.xi                     *(volatile unsigned short *)(_gMIO_MapBase + (0x110cb2 << 1)) = 0x0130;
1496*53ee8cc1Swenshuai.xi                 }
1497*53ee8cc1Swenshuai.xi                 else
1498*53ee8cc1Swenshuai.xi                 {
1499*53ee8cc1Swenshuai.xi                     HAL_DVFS_DEBUG("[DVFS] Change CPU Power to 1.15V\n");
1500*53ee8cc1Swenshuai.xi                     *(volatile unsigned short *)(_gMIO_MapBase + (0x110cb2 << 1)) = 0x0030;
1501*53ee8cc1Swenshuai.xi                 }
1502*53ee8cc1Swenshuai.xi 
1503*53ee8cc1Swenshuai.xi                 hMstarDvfsInfo.bCpuClockLevel = CONFIG_DVFS_STATE_LOW_SPEED;
1504*53ee8cc1Swenshuai.xi                 hMstarDvfsInfo.dwOverCounter = 0;
1505*53ee8cc1Swenshuai.xi             }
1506*53ee8cc1Swenshuai.xi 
1507*53ee8cc1Swenshuai.xi         }
1508*53ee8cc1Swenshuai.xi         else if((hMstarDvfsInfo.dwFinalCpuTemperature < dwLowerTemperature) && (hMstarDvfsInfo.bCpuClockLevel == CONFIG_DVFS_STATE_LOW_SPEED))
1509*53ee8cc1Swenshuai.xi         {
1510*53ee8cc1Swenshuai.xi             if(hMstarDvfsInfo.dwOverCounter < CONFIG_DVFS_AVERAGE_COUNT)
1511*53ee8cc1Swenshuai.xi             {
1512*53ee8cc1Swenshuai.xi                 hMstarDvfsInfo.dwOverCounter ++;
1513*53ee8cc1Swenshuai.xi             }
1514*53ee8cc1Swenshuai.xi             else
1515*53ee8cc1Swenshuai.xi             {
1516*53ee8cc1Swenshuai.xi                 HAL_DVFS_INFO("[DVFS] Current Temperature: %d\n", (unsigned int) hMstarDvfsInfo.dwFinalCpuTemperature);
1517*53ee8cc1Swenshuai.xi 
1518*53ee8cc1Swenshuai.xi                 if(hMstarDvfsInfo.dwEfuseSiddValue < hMstarDvfsInfo.dwEfuseSiddThreshold)
1519*53ee8cc1Swenshuai.xi                 {
1520*53ee8cc1Swenshuai.xi                     //Set VID = 2'b03 to change to 1.28V
1521*53ee8cc1Swenshuai.xi                     HAL_DVFS_DEBUG("[DVFS] Change CPU Power to 1.28V\n");
1522*53ee8cc1Swenshuai.xi                     *(volatile unsigned short *)(_gMIO_MapBase + (0x110cb2 << 1)) = 0x1330;
1523*53ee8cc1Swenshuai.xi                 }
1524*53ee8cc1Swenshuai.xi                 else
1525*53ee8cc1Swenshuai.xi                 {
1526*53ee8cc1Swenshuai.xi                     //Set VID = 2'b01 to change to 1.20V
1527*53ee8cc1Swenshuai.xi                     HAL_DVFS_DEBUG("[DVFS] Change CPU Power to 1.20V\n");
1528*53ee8cc1Swenshuai.xi                     *(volatile unsigned short *)(_gMIO_MapBase + (0x110cb2 << 1)) = 0x1130;
1529*53ee8cc1Swenshuai.xi                 }
1530*53ee8cc1Swenshuai.xi 
1531*53ee8cc1Swenshuai.xi                 //low to high
1532*53ee8cc1Swenshuai.xi                 HAL_DVFS_INFO("[DVFS] Change to Higher CPU Clock Setting\n");
1533*53ee8cc1Swenshuai.xi                 *(volatile unsigned short *)(_gMIO_MapBase + (0x110cb0 << 1)) = 1;   //switch to LPF control
1534*53ee8cc1Swenshuai.xi                 *(volatile unsigned short *)(_gMIO_MapBase + (0x110caa << 1)) = 6;   //mu[2:0]
1535*53ee8cc1Swenshuai.xi                 *(volatile unsigned short *)(_gMIO_MapBase + (0x110cae << 1)) = 8;   //lpf_update_cnt[7:0]
1536*53ee8cc1Swenshuai.xi                 if(hMstarDvfsInfo.dwEfuseSiddValue < hMstarDvfsInfo.dwEfuseSiddThreshold)
1537*53ee8cc1Swenshuai.xi                 {
1538*53ee8cc1Swenshuai.xi                     *(volatile unsigned short *)(_gMIO_MapBase + (0x110cb2 << 1)) = 0x1330;
1539*53ee8cc1Swenshuai.xi                 }
1540*53ee8cc1Swenshuai.xi                 else
1541*53ee8cc1Swenshuai.xi                 {
1542*53ee8cc1Swenshuai.xi                     *(volatile unsigned short *)(_gMIO_MapBase + (0x110cb2 << 1)) = 0x1130;
1543*53ee8cc1Swenshuai.xi                 }
1544*53ee8cc1Swenshuai.xi 
1545*53ee8cc1Swenshuai.xi                 *(volatile unsigned short *)(_gMIO_MapBase + (0x110ca8 << 1)) = 0;
1546*53ee8cc1Swenshuai.xi                 *(volatile unsigned short *)(_gMIO_MapBase + (0x110ca8 << 1)) = 1;
1547*53ee8cc1Swenshuai.xi 
1548*53ee8cc1Swenshuai.xi                 hMstarDvfsInfo.bCpuClockLevel = CONFIG_DVFS_STATE_HIGH_SPEED;
1549*53ee8cc1Swenshuai.xi                 hMstarDvfsInfo.dwOverCounter = 0;
1550*53ee8cc1Swenshuai.xi             }
1551*53ee8cc1Swenshuai.xi 
1552*53ee8cc1Swenshuai.xi         }
1553*53ee8cc1Swenshuai.xi         else
1554*53ee8cc1Swenshuai.xi         {
1555*53ee8cc1Swenshuai.xi             if(hMstarDvfsInfo.bCpuClockLevel == CONFIG_DVFS_STATE_INIT)
1556*53ee8cc1Swenshuai.xi             {
1557*53ee8cc1Swenshuai.xi 
1558*53ee8cc1Swenshuai.xi                 dwRegisterValue = *(volatile unsigned short *)(_gMIO_MapBase + (0x11088a << 1));
1559*53ee8cc1Swenshuai.xi 
1560*53ee8cc1Swenshuai.xi                 if((dwRegisterValue & 0x0002) == 0)
1561*53ee8cc1Swenshuai.xi                 {
1562*53ee8cc1Swenshuai.xi                     hMstarDvfsInfo.dwOverCounter ++;
1563*53ee8cc1Swenshuai.xi                     HAL_DVFS_DEBUG("[DVFS] Wait for GPU Ready (%d)\n", (unsigned int) hMstarDvfsInfo.dwOverCounter);
1564*53ee8cc1Swenshuai.xi                     if(hMstarDvfsInfo.dwOverCounter >= 100)
1565*53ee8cc1Swenshuai.xi                     {
1566*53ee8cc1Swenshuai.xi 
1567*53ee8cc1Swenshuai.xi                         if(hMstarDvfsInfo.dwEfuseSiddValue < hMstarDvfsInfo.dwEfuseSiddThreshold)
1568*53ee8cc1Swenshuai.xi                         {
1569*53ee8cc1Swenshuai.xi                             //Set VID = 2'b03 to change to 1.28V
1570*53ee8cc1Swenshuai.xi                             HAL_DVFS_DEBUG("[DVFS] Change CPU Power to 1.28V\n");
1571*53ee8cc1Swenshuai.xi                             *(volatile unsigned short *)(_gMIO_MapBase + (0x110cb2 << 1)) = 0x1330;
1572*53ee8cc1Swenshuai.xi                         }
1573*53ee8cc1Swenshuai.xi                         else
1574*53ee8cc1Swenshuai.xi                         {
1575*53ee8cc1Swenshuai.xi                             //Set VID = 2'b01 to change to 1.20V
1576*53ee8cc1Swenshuai.xi                             HAL_DVFS_DEBUG("[DVFS] Change CPU Power to 1.20V\n");
1577*53ee8cc1Swenshuai.xi                             *(volatile unsigned short *)(_gMIO_MapBase + (0x110cb2 << 1)) = 0x1130;
1578*53ee8cc1Swenshuai.xi                         }
1579*53ee8cc1Swenshuai.xi 
1580*53ee8cc1Swenshuai.xi                         //low to high
1581*53ee8cc1Swenshuai.xi                         *(volatile unsigned short *)(_gMIO_MapBase + (0x110cb0 << 1)) = 1;   //switch to LPF control
1582*53ee8cc1Swenshuai.xi                         *(volatile unsigned short *)(_gMIO_MapBase + (0x110caa << 1)) = 6;   //mu[2:0]
1583*53ee8cc1Swenshuai.xi                         *(volatile unsigned short *)(_gMIO_MapBase + (0x110cae << 1)) = 8;   //lpf_update_cnt[7:0]
1584*53ee8cc1Swenshuai.xi                         if(hMstarDvfsInfo.dwEfuseSiddValue < hMstarDvfsInfo.dwEfuseSiddThreshold)
1585*53ee8cc1Swenshuai.xi                         {
1586*53ee8cc1Swenshuai.xi                             *(volatile unsigned short *)(_gMIO_MapBase + (0x110cb2 << 1)) = 0x1330;
1587*53ee8cc1Swenshuai.xi                         }
1588*53ee8cc1Swenshuai.xi                         else
1589*53ee8cc1Swenshuai.xi                         {
1590*53ee8cc1Swenshuai.xi                             *(volatile unsigned short *)(_gMIO_MapBase + (0x110cb2 << 1)) = 0x1130;
1591*53ee8cc1Swenshuai.xi                         }
1592*53ee8cc1Swenshuai.xi 
1593*53ee8cc1Swenshuai.xi                         *(volatile unsigned short *)(_gMIO_MapBase + (0x110ca8 << 1)) = 0;
1594*53ee8cc1Swenshuai.xi                         *(volatile unsigned short *)(_gMIO_MapBase + (0x110ca8 << 1)) = 1;
1595*53ee8cc1Swenshuai.xi 
1596*53ee8cc1Swenshuai.xi                         hMstarDvfsInfo.bCpuClockLevel = CONFIG_DVFS_STATE_HIGH_SPEED;
1597*53ee8cc1Swenshuai.xi                         hMstarDvfsInfo.dwOverCounter = 0;
1598*53ee8cc1Swenshuai.xi                     }
1599*53ee8cc1Swenshuai.xi                 }
1600*53ee8cc1Swenshuai.xi                 else
1601*53ee8cc1Swenshuai.xi                 {
1602*53ee8cc1Swenshuai.xi                     hMstarDvfsInfo.dwOverCounter = 0;
1603*53ee8cc1Swenshuai.xi                 }
1604*53ee8cc1Swenshuai.xi             }
1605*53ee8cc1Swenshuai.xi             else
1606*53ee8cc1Swenshuai.xi             {
1607*53ee8cc1Swenshuai.xi                 hMstarDvfsInfo.dwOverCounter = 0;
1608*53ee8cc1Swenshuai.xi             }
1609*53ee8cc1Swenshuai.xi         }
1610*53ee8cc1Swenshuai.xi 
1611*53ee8cc1Swenshuai.xi #if CONFIG_DVFS_FULL_TEST_ENABLE
1612*53ee8cc1Swenshuai.xi         //=========================================================
1613*53ee8cc1Swenshuai.xi         //Read 25 degree in PM side
1614*53ee8cc1Swenshuai.xi         *(volatile unsigned char *)(_gMIO_MapBase + (0x000e50 << 1)) = 0x06;
1615*53ee8cc1Swenshuai.xi 
1616*53ee8cc1Swenshuai.xi         dwRegisterValue = *(volatile unsigned short *)(_gMIO_MapBase + (0x000ec4 << 1));
1617*53ee8cc1Swenshuai.xi         dwRegisterValue &= ~(0x01 << 13);
1618*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x000ec4 << 1)) = dwRegisterValue;
1619*53ee8cc1Swenshuai.xi 
1620*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x001400 << 1)) = 0x0ab5;
1621*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x001426 << 1)) &= ~(0x01 << 6);  //Set PM SAR full scale = 2.0V
1622*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(CONFIG_DVFS_DELAY_US);
1623*53ee8cc1Swenshuai.xi 
1624*53ee8cc1Swenshuai.xi         hMstarDvfsInfo.dwCode25CValuePm = *(volatile unsigned short *)(_gMIO_MapBase + (0x00148a << 1));     //CH6
1625*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x001426 << 1)) |= (0x01 << 6);  //Set PM SAR full scale = 3.3V
1626*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x001400 << 1)) = 0x0a25;
1627*53ee8cc1Swenshuai.xi #endif
1628*53ee8cc1Swenshuai.xi 
1629*53ee8cc1Swenshuai.xi         //=========================================================
1630*53ee8cc1Swenshuai.xi         //Read 25 degree in CPU side
1631*53ee8cc1Swenshuai.xi         *(volatile unsigned char *)(_gMIO_MapBase + (0x000e50 << 1)) = 0x07;
1632*53ee8cc1Swenshuai.xi 
1633*53ee8cc1Swenshuai.xi         dwRegisterValue = *(volatile unsigned short *)(_gMIO_MapBase + (0x000ec4 << 1));
1634*53ee8cc1Swenshuai.xi         dwRegisterValue &= ~(0x01 << 13);
1635*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x000ec4 << 1)) = dwRegisterValue;
1636*53ee8cc1Swenshuai.xi 
1637*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x001400 << 1)) = 0x0ab5;
1638*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x001426 << 1)) &= ~(0x01 << 6);  //Set PM SAR full scale = 2.0V
1639*53ee8cc1Swenshuai.xi         MsOS_DelayTaskUs(CONFIG_DVFS_DELAY_US);
1640*53ee8cc1Swenshuai.xi 
1641*53ee8cc1Swenshuai.xi         hMstarDvfsInfo.dwCode25CValueCpu = *(volatile unsigned short *)(_gMIO_MapBase + (0x00148a << 1));     //CH6
1642*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x001426 << 1)) |= (0x01 << 6);  //Set PM SAR full scale = 3.3V
1643*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x001400 << 1)) = 0x0a25;
1644*53ee8cc1Swenshuai.xi 
1645*53ee8cc1Swenshuai.xi         MsOS_ReleaseMutex(_s32SAR_Dvfs_Mutex);
1646*53ee8cc1Swenshuai.xi     }
1647*53ee8cc1Swenshuai.xi     else
1648*53ee8cc1Swenshuai.xi     {
1649*53ee8cc1Swenshuai.xi         //Disable DVFS
1650*53ee8cc1Swenshuai.xi         *(volatile unsigned short *)(_gMIO_MapBase + (0x110cb0 << 1)) = 0;
1651*53ee8cc1Swenshuai.xi     }
1652*53ee8cc1Swenshuai.xi 
1653*53ee8cc1Swenshuai.xi }
1654*53ee8cc1Swenshuai.xi #endif
1655*53ee8cc1Swenshuai.xi 
1656*53ee8cc1Swenshuai.xi #undef HAL_SAR_C
1657*53ee8cc1Swenshuai.xi 
1658