1 /******************************************************************************
2 *Copyright(C)2017, Huada Semiconductor Co.,Ltd All rights reserved.
3 *
4 * This software is owned and published by:
5 * Huada Semiconductor Co.,Ltd("HDSC").
6 *
7 * BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
8 * BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
9 *
10 * This software contains source code for use with HDSC
11 * components. This software is licensed by HDSC to be adapted only
12 * for use in systems utilizing HDSC components. HDSC shall not be
13 * responsible for misuse or illegal use of this software for devices not
14 * supported herein. HDSC is providing this software "AS IS" and will
15 * not be responsible for issues arising from incorrect user implementation
16 * of the software.
17 *
18 * Disclaimer:
19 * HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
20 * REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
21 * ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
22 * WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
23 * WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
24 * WARRANTY OF NONINFRINGEMENT.
25 * HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
26 * NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
27 * LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
28 * LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
29 * INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
30 * INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
31 * SAVINGS OR PROFITS,
32 * EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
33 * YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
34 * INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
35 * FROM, THE SOFTWARE.
36 *
37 * This software may be replicated in part or whole for the licensed use,
38 * with the restriction that this Disclaimer and Copyright notice must be
39 * included with each copy of this software, whether used in part or whole,
40 * at all times.
41 */
42 
43 /** \file trim.c
44  **
45  ** Common API of trim.
46  ** @link trimGroup Some description @endlink
47  **
48  **   - 2017-05-16
49  **
50  ******************************************************************************/
51 
52 /*******************************************************************************
53  * Include files
54  ******************************************************************************/
55 #include "trim.h"
56 /**
57  *******************************************************************************
58  ** \addtogroup TrimGroup
59  ******************************************************************************/
60 //@{
61 
62 /*******************************************************************************
63  * Local pre-processor symbols/macros ('#define')
64  ******************************************************************************/
65 
66 /*******************************************************************************
67  * Global variable definitions (declared in header file with 'extern')
68  ******************************************************************************/
69 #define IS_VALID_TRIMINT(x)             (TrimStop     == (x) ||\
70                                          TrimCalCntOf == (x) ||\
71                                          TrimXTLFault == (x) ||\
72                                          TrimXTHFault == (x) ||\
73                                          TrimPLLFault == (x))
74 
75 
76 /*******************************************************************************
77  * Local type definitions ('typedef')
78  ******************************************************************************/
79 
80 /*******************************************************************************
81  * Local variable definitions ('static')
82  ******************************************************************************/
83 
84 /*******************************************************************************
85  * Local function prototypes ('static')
86  ******************************************************************************/
87 static func_ptr_t pfnTrimCallback = NULL;
88 
89 /*******************************************************************************
90  * Function implementation - global ('extern') and local ('static')
91  ******************************************************************************/
92 /**
93  *****************************************************************************
94  ** \brief Trim中断标志获取
95  **
96  **
97  ** \param [in]  enIntType           中断类型(RefStop、CalCntOf、XTAL32KFault、XTAL32MFault)
98  **
99  ** \retval TRUE or FALSE
100  *****************************************************************************/
Trim_GetIntFlag(en_trim_inttype_t enIntType)101 boolean_t Trim_GetIntFlag(en_trim_inttype_t enIntType)
102 {
103     boolean_t bRetVal = FALSE;
104 
105     ASSERT(IS_VALID_TRIMINT(enIntType));
106 
107     switch (enIntType)
108     {
109         case TrimStop:
110             bRetVal = M0P_CLK_TRIM->IFR_f.STOP ? TRUE : FALSE;
111             break;
112         case TrimCalCntOf:
113             bRetVal = M0P_CLK_TRIM->IFR_f.CALCNT_OF ? TRUE : FALSE;
114             break;
115         case TrimXTLFault:
116             bRetVal = M0P_CLK_TRIM->IFR_f.XTL_FAULT ? TRUE : FALSE;
117             break;
118         case TrimXTHFault:
119             bRetVal = M0P_CLK_TRIM->IFR_f.XTH_FAULT ? TRUE : FALSE;
120             break;
121         case TrimPLLFault:
122             bRetVal = M0P_CLK_TRIM->IFR_f.PLL_FAULT ? TRUE : FALSE;
123             break;
124         default:
125             bRetVal = FALSE;
126             break;
127     }
128 
129     return bRetVal;
130 }
131 
132 /**
133  *****************************************************************************
134  ** \brief Trim中断标志清除
135  **
136  **
137  ** \param [in]  enIntType           中断类型(RefStop、CalCntOf、XTAL32KFault、XTAL32MFault)
138  **
139  ** \retval Ok or Error
140  *****************************************************************************/
Trim_ClearIntFlag(en_trim_inttype_t enIntType)141 en_result_t Trim_ClearIntFlag(en_trim_inttype_t enIntType)
142 {
143     en_result_t enResult = Error;
144 
145     ASSERT(IS_VALID_TRIMINT(enIntType));
146 
147     switch (enIntType)
148     {
149         case TrimStop:
150             M0P_CLK_TRIM->CR_f.TRIM_START = FALSE;
151             enResult = Ok;
152             break;
153         case TrimCalCntOf:
154             M0P_CLK_TRIM->CR_f.TRIM_START = FALSE;
155             enResult = Ok;
156             break;
157         case TrimXTLFault:
158             M0P_CLK_TRIM->ICLR_f.XTL_FAULT_CLR = FALSE;
159             enResult = Ok;
160             break;
161         case TrimXTHFault:
162             M0P_CLK_TRIM->ICLR_f.XTH_FAULT_CLR = FALSE;
163             enResult = Ok;
164             break;
165         case TrimPLLFault:
166             M0P_CLK_TRIM->ICLR_f.PLL_FAULT_CLR = FALSE;
167             enResult = Ok;
168             break;
169         default:
170             enResult = Error;
171             break;
172     }
173 
174     return enResult;
175 }
176 
177 /**
178  *****************************************************************************
179  ** \brief Trim中断服务函数
180  **
181  **
182  ** \param [in]  u8Param           == 0
183  **
184  ** \retval NULL
185  *****************************************************************************/
ClkTrim_IRQHandler(uint8_t u8Param)186 void ClkTrim_IRQHandler(uint8_t u8Param)
187 {
188 	if(NULL != pfnTrimCallback)
189 	{
190 		pfnTrimCallback();
191 	}
192 }
193 
194 /**
195  *****************************************************************************
196  ** \brief Trim中断使能
197  **
198  **
199  **
200  ** \retval Ok or Error
201  *****************************************************************************/
Trim_EnableIrq(void)202 en_result_t Trim_EnableIrq (void)
203 {
204     en_result_t enResult = Error;
205 
206     M0P_CLK_TRIM->CR_f.IE = TRUE;
207     enResult = Ok;
208 
209     return enResult;
210 }
211 
212 /**
213  *****************************************************************************
214  ** \brief Trim中断禁止
215  **
216  **
217  **
218  **
219  ** \retval Ok or Error
220  *****************************************************************************/
Trim_DisableIrq(void)221 en_result_t Trim_DisableIrq(void)
222 {
223     en_result_t enResult = Error;
224 
225     M0P_CLK_TRIM->CR_f.IE = FALSE;
226     enResult = Ok;
227 
228     return enResult;
229 }
230 
231 /**
232  *****************************************************************************
233  ** \brief Trim初始化配置
234  **
235  **
236  ** \param [in]  pstcConfig           Trim配置结构体指针
237  **
238  ** \retval Ok or Error
239  *****************************************************************************/
Trim_Init(stc_trim_config_t * pstcConfig)240 en_result_t Trim_Init(stc_trim_config_t* pstcConfig)
241 {
242     en_result_t enResult = Error;
243 
244     M0P_CLK_TRIM->CR_f.MON_EN = pstcConfig->enMON;
245 
246     if (TrimCalPLL == pstcConfig->enCALCLK)
247     {
248         M0P_CLK_TRIM->CR_f.CALCLK_SEL2 = TRUE;
249         M0P_CLK_TRIM->CR_f.CALCLK_SEL  = pstcConfig->enCALCLK;
250     }
251     else
252     {
253         M0P_CLK_TRIM->CR_f.CALCLK_SEL2 = FALSE;
254         M0P_CLK_TRIM->CR_f.CALCLK_SEL  = pstcConfig->enCALCLK;
255     }
256 
257     M0P_CLK_TRIM->CR_f.REFCLK_SEL = pstcConfig->enREFCLK;
258 
259     M0P_CLK_TRIM->REFCON_f.RCNTVAL = pstcConfig->u32RefCon;
260     if(TrimMonEnable == pstcConfig->enMON)
261     {
262         M0P_CLK_TRIM->CALCON_f.CCNTVAL = pstcConfig->u32CalCon;
263     }
264 
265 
266     pfnTrimCallback = pstcConfig->pfnTrimCb;
267 
268     enResult = Ok;
269 
270     return enResult;
271 }
272 
273 /**
274  *****************************************************************************
275  ** \brief Trim校准/监测启动运行
276  **
277  **
278  **
279  ** \retval Ok or Error
280  *****************************************************************************/
Trim_Run(void)281 en_result_t Trim_Run(void)
282 {
283     en_result_t enResult = Error;
284 
285     M0P_CLK_TRIM->CR_f.TRIM_START = TRUE;
286     enResult = Ok;
287 
288     return enResult;
289 }
290 
291 /**
292  *****************************************************************************
293  ** \brief Trim校准/监测停止
294  **
295  **
296  **
297  **
298  ** \retval Ok or Error
299  *****************************************************************************/
Trim_Stop(void)300 en_result_t Trim_Stop(void)
301 {
302     en_result_t enResult = Error;
303 
304     M0P_CLK_TRIM->CR_f.TRIM_START = FALSE;
305     enResult = Ok;
306 
307     return enResult;
308 }
309 
310 /**
311  *****************************************************************************
312  ** \brief Trim参考计数器计数值获取
313  **
314  **
315  ** \retval u32Data                参考计数器计数值
316  *****************************************************************************/
Trim_RefCntGet(void)317 uint32_t Trim_RefCntGet(void)
318 {
319     uint32_t u32Data = 0;
320 
321     u32Data = M0P_CLK_TRIM->REFCNT_f.REFCNT;
322 
323     return u32Data;
324 }
325 
326 /**
327  *****************************************************************************
328  ** \brief Trim校准计数器计数值获取
329  **
330  **
331  **
332  **
333  ** \retval u32Data                校准计数器计数值
334  *****************************************************************************/
Trim_CalCntGet(void)335 uint32_t Trim_CalCntGet(void)
336 {
337     uint32_t u32Data = 0;
338 
339     u32Data = M0P_CLK_TRIM->CALCNT_f.CALCNT;
340 
341     return u32Data;
342 }
343 
344 //@} // TrimGroup
345 
346 /*******************************************************************************
347  * EOF (not truncated)
348  ******************************************************************************/
349