blob: faf6e13abaa791b9c1946382fb6fb45ed0d10c3d [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001/*****************************************************************************
2* Copyright Statement:
3* --------------------
4* This software is protected by Copyright and the information contained
5* herein is confidential. The software may not be copied and the information
6* contained herein may not be used or disclosed except with the written
7* permission of MediaTek Inc. (C) 2012
8*
9* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
10* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
11* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
12* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
13* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
15* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
16* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
17* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
18* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
19* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
20* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
21*
22* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
23* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
24* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
25* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
26* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
27*
28* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
29* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
30* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
31* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
32* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
33*
34*****************************************************************************/
35
36
37/*****************************************************************************
38 *
39 * Filename:
40 * ---------
41 * dcl_gpt.c
42 *
43 * Project:
44 * --------
45 * TATAKA
46 *
47 * Description:
48 * ------------
49 * This Module defines DCL (Driver Common Layer) of the GPT driver.
50 *
51 * Author:
52 * -------
53 * -------
54 *
55 *============================================================================
56 * HISTORY
57 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
58 *------------------------------------------------------------------------------
59 *
60 *
61 *------------------------------------------------------------------------------
62 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
63 *============================================================================
64 ****************************************************************************/
65
66#include "drv_features_gpt.h"
67#include "drv_comm.h"
68#include "drv_gpt.h"
69#include "intrCtrl.h"
70#include "us_timer.h"
71
72
73#include "dcl_gpt.h"
74#include "dcl_gpt_hw.h"
75#include "dcl.h"
76#include "devdrv_ls.h"
77#include "kal_general_types.h"
78#include "kal_public_api.h"
79#include "drvpdn.h"
80#include "init_comm.h"
81#include "kal_hrt_api.h"
82
83#if defined(__LP_SCHEDULE_HMU_RESCHEDULE__)
84#include "tg_hisr.h"
85#endif /* __LP_SCHEDULE_HMU_RESCHEDULE__ */
86
87
88//#define DCL_GPT_INTERFACE
89//#ifdef DCL_GPT_INTERFACE
90
91#if !defined(DRV_GPT_OFF)
92
93/*****************************************************************************
94 * Symbol/Type Definition *
95 *****************************************************************************/
96//DCL_GPT_CB this software gpt provide register callback function.
97#if !defined(__MD93__)
98#define DCL_GPT_9_MAGIC_NUM (0x01000000)
99#endif
100#define DCL_GPT_CB_MAGIC_NUM (0x02000000)
101
102#if defined(__MD93__) || defined(__MD95__)
103#define DCL_GPT_C2KOS_MAGIC_NUM (0x04000000)
104#else
105#define DCL_GPT_6_MAGIC_NUM (0x04000000)
106#endif
107
108#define DCL_GPT_C2KAR_MAGIC_NUM (0x08000000)
109
110#define DCL_GPT_CBUS_MAGIC_NUM (0x10000000)
111
112#define DCL_GPT_3_MAGIC_NUM (0x20000000)
113
114#define DCL_GPT_DSP_MAGIC_NUM (0x40000000)
115
116#define DCL_GPT_LOGGING_MAGIC_NUM (0x80000000)
117
118#define DCL_GPT_CB_TICK2US (10000U)
119#define DCL_GPT_CBUS_TICK2US (1U)
120#define DCL_GPT_LOGGING_TICK2US (1000U)
121#define DCL_GPT_C2K_TICK2US (1000U)
122
123#define MDGPTM_PDN_SET() PDN_SET(PDN_GPT);
124#define MDGPTM_PDN_CLR() PDN_CLR(PDN_GPT);
125
126/*****************************************************************************
127 * Macro Function Definition *
128 *****************************************************************************/
129
130#define DCL_GPT_CB_IS_HANDLE_MAGIC(handl_) ((handl_)& DCL_GPT_CB_MAGIC_NUM)
131#define DCL_GPT_CB_GET_DEV(handle_) ((handle_) & (~DCL_GPT_CB_MAGIC_NUM))
132#define DCL_GPT_CBUS_IS_HANDLE_MAGIC(handl_) ((handl_)& DCL_GPT_CBUS_MAGIC_NUM)
133#define DCL_GPT_3_IS_HANDLE_MAGIC(handl_) ((handl_)& DCL_GPT_3_MAGIC_NUM)
134#define DCL_GPT_3_GET_DEV(handle_) ((handle_) & (~DCL_GPT_3_MAGIC_NUM))
135#if !defined(__MD93__)
136#define DCL_GPT_9_IS_HANDLE_MAGIC(handl_) ((handl_)& DCL_GPT_9_MAGIC_NUM)
137#endif
138#if defined(__MD93__) || defined(__MD95__)
139#define DCL_GPT_C2KOS_IS_HANDLE_MAGIC(handl_) ((handl_)& DCL_GPT_C2KOS_MAGIC_NUM)
140#else
141#define DCL_GPT_6_IS_HANDLE_MAGIC(handl_) ((handl_)& DCL_GPT_6_MAGIC_NUM)
142#endif
143#define DCL_GPT_LOGGING_IS_HANDLE_MAGIC(handl_) ((handl_)& DCL_GPT_LOGGING_MAGIC_NUM)
144#define DCL_GPT_DSP_IS_HANDLE_MAGIC(handl_) ((handl_)& DCL_GPT_DSP_MAGIC_NUM)
145#define DCL_GPT_C2KAR_IS_HANDLE_MAGIC(handl_) ((handl_)& DCL_GPT_C2KAR_MAGIC_NUM)
146
147
148/*****************************************************************************
149 * Structure/Type Definition *
150 *****************************************************************************/
151typedef struct gptimer_instance{
152 kal_uint32 ticks;
153 void (*gptimer_func)(void *parameter);
154 void *param;
155 struct gptimer_instance *next;
156}gpt_inst;
157
158/*****************************************************************************
159 * Global/External Variable *
160 *****************************************************************************/
161kal_uint32 gpt_clock_status = 0;
162
163/* For mini-second Callback Function */
164static kal_uint32 gptCB_status; /* 1,activated ,0:de-activated */
165static kal_uint32 gptCB_ticks; /* CB gpt current ticks number */
166static kal_uint32 gptCB_users; /* Indicate the current registered GPT users */
167static kal_uint8 gptCB_used[MAX_GPT_ITEMS]; /* 0: Not registered by user, 1: Registerd by used */
168static gptimer_item gptCB_items[MAX_GPT_ITEMS]; /* gpt callback function instance */
169
170
171/* For micro-second Callback Function */
172static kal_bool gptCBUS_used = KAL_FALSE;
173static kal_bool gptCBUS_running = KAL_FALSE;
174#if !defined(__LP_SCHEDULE_HMU_RESCHEDULE__)
175static gptimer_item gptCBUS_instance;
176static kal_uint32 gptCBUS_usr_trig = 0;
177#endif /* __LP_SCHEDULE_HMU_RESCHEDULE__ */
178static kal_uint32 gptCBUS_lisr_trig = 0;
179
180#if defined(__LP_SCHEDULE_HMU_RESCHEDULE__)
181static DCL_UINT32 gpt_cbus_on = 0;
182#endif
183
184#if defined(__MD93__) || defined(__MD95__)
185/* For micro-second Callback Function */
186static kal_bool gptC2KOS_used = KAL_FALSE;
187static kal_bool gptC2KOS_running = KAL_FALSE;
188static gptimer_item gptC2KOS_instance;
189#endif
190
191/* For mini-second Callback Function */
192static kal_bool gptC2KAR_used = KAL_FALSE;
193static kal_bool gptC2KAR_running = KAL_FALSE;
194static gptimer_item gptC2KAR_instance;
195
196/* For micro-second Callback Function */
197static kal_bool gptLogging_used = KAL_FALSE;
198static kal_bool gptLogging_running = KAL_FALSE;
199static gptimer_item gptLogging_instance;
200
201#if defined(__MD93__)
202/* For micro-second Callback Function */
203static kal_bool gptDSP_used = KAL_FALSE;
204static kal_bool gptDSP_running = KAL_FALSE;
205static gptimer_multiple gptDSP_instance[DSP_USER_NUM];
206#else
207static kal_bool gptDSCC0_used = KAL_FALSE;
208static kal_bool gptDSCC0_running = KAL_FALSE;
209static gptimer_item gptDSCC0_instance;
210
211static kal_bool gptDSCC1_used = KAL_FALSE;
212static kal_bool gptDSCC1_running = KAL_FALSE;
213static gptimer_item gptDSCC1_instance;
214
215#endif
216
217#if defined(__MD93__) || defined(__MD95__)
218/* For micro-second Debug Callback Function */
219static kal_uint32 gpt_DEBUG_users; /* Indicate the current registered GPT users */
220static gpt_inst gpt_DEBUG_head; /* BSS section, default field value == 0 */
221static kal_uint8 gpt_DEBUG_used[MAX_GPT_ITEMS]; /* 0: Not registered by user, 1: Registerd by used */
222static gpt_inst gpt_DEBUG_items[MAX_GPT_ITEMS]; /* gpt callback function instance */
223#endif
224
225#if defined(__MD97__)
226static kal_bool gptDPCOPRO_used = KAL_FALSE;
227static kal_bool gptDPCOPRO_running = KAL_FALSE;
228static gptimer_item gptDPCOPRO_instance;
229#endif
230
231static kal_spinlockid gpt_10ms_spinlock;
232static kal_spinlockid gpt_us_spinlock;
233
234#if defined(__MD93__) || defined(__MD95__)
235static kal_spinlockid gpt_3_spinlock;
236static kal_spinlockid gpt_6_spinlock;
237#endif
238static kal_spinlockid gpt_logging_spinlock;
239
240#if defined(__FPGA__)
241#define gpt_get_current_time() (DRV_Reg32((kal_uint32) USCNTI_VAL))
242#else
243#define gpt_get_current_time() ust_get_current_time()
244#endif
245
246#define UT_GPT_GET_32BIT_COUNTER_DURATION(start, end) \
247 (((end) >= (start))? ((end) - (start)): ((0xFFFFFFFF - (start) + (end) + 1)))
248
249
250/*****************************************************************************
251 * function declaration *
252 *****************************************************************************/
253void GPTCB_10MS_HISR(void);
254#if !defined(__LP_SCHEDULE_HMU_RESCHEDULE__)
255void GPTCB_US_HISR(void);
256#endif
257void GPTCB_LOGGING_HISR(void);
258
259#if defined(__MD93__) || defined(__MD95__)
260void GPTCB_C2KOS_HISR(void);
261void GPTCB_DEBUG_HISR(void);
262static void GPT_DEBUG_Insert(kal_uint32 indx, kal_uint32 tick,void (*gptimer_func)(void *),void *parameter);
263static void GPT_DEBUG_Stop(kal_uint32 indx);
264#endif
265
266static kal_bool GPTCB_StartItem(DCL_HANDLE module,kal_uint16 tick,void (*gptimer_func)(void *),void *parameter);
267static void GPTCB_StopItem(DCL_HANDLE module);
268
269
270static void gpt_clk_operation(kal_bool op, kal_uint32 num);
271void gpt_clk_operation_wo_itc(kal_bool op, kal_uint32 num);
272
273
274void GPT_ERROR_CB(void *p)
275{
276 kal_uint32 CANNOT_FIND_GPT_CB_HANDLER = 0;
277 ASSERT(CANNOT_FIND_GPT_CB_HANDLER);
278}
279
280/*-----------------------------------------------------------------------*
281*
282* GPT 10ms LISR function,
283* pass to gpt_hw layer as a function pointer
284*
285*------------------------------------------------------------------------*/
286void GPTCB_Lisr(kal_uint32 vector)
287{
288 /*ASSERT( (MDGPT_INTR_ID(DRV_GPT_CALLBACK_TIMER) == vector) || \
289 (MDGPT_INTR_ID(DRV_GPT_CBUS_TIMER) == vector) );*/
290#ifndef __MD93__
291 DRV_WriteReg32(GPT_INT_STATUS_REG(0),GPT_INT_STATUS_MASK_BIT(DRV_GPT_CALLBACK_TIMER));
292#endif
293
294 kal_activate_hisr_index(GPT1_HISR);
295}
296
297/*-----------------------------------------------------------------------*
298*
299* GPT 1us LISR function,
300* pass to gpt_hw layer as a function pointer
301*
302*------------------------------------------------------------------------*/
303DEVDRV_LS_INTSRAM_ROCODE void GPTCB_US_Lisr(kal_uint32 vector)
304{
305 /*ASSERT( (MDGPT_INTR_ID(DRV_GPT_CALLBACK_TIMER) == vector) || \
306 (MDGPT_INTR_ID(DRV_GPT_CBUS_TIMER) == vector) );*/
307#if !defined(__MD93__)
308 DRV_WriteReg32(GPT_INT_STATUS_REG(0),GPT_INT_STATUS_MASK_BIT(DRV_GPT_CBUS_TIMER));
309#endif
310
311
312 gptCBUS_lisr_trig++;
313#if defined(__LP_SCHEDULE_HMU_RESCHEDULE__)
314 tg_group2_trigger(TG_TRIGGER_GPT);
315#else /* __LP_SCHEDULE_HMU_RESCHEDULE__ */
316 kal_activate_hisr_index(GPT2_HISR);
317#endif /* __LP_SCHEDULE_HMU_RESCHEDULE__ */
318}
319
320#if defined(__MD93__) || defined(__MD95__)
321/*-----------------------------------------------------------------------*
322*
323* C2K GPT 1us LISR function,
324* pass to gpt_hw layer as a function pointer
325*
326*------------------------------------------------------------------------*/
327DEVDRV_LS_INTSRAM_ROCODE void GPTCB_C2KOS_Lisr(kal_uint32 vector)
328{
329#if !defined(__MD93__)
330 DRV_WriteReg32(GPT_INT_STATUS_REG(0),GPT_INT_STATUS_MASK_BIT(DRV_GPT_6_TIMER));
331#endif
332
333 kal_hrt_activate_hisr_index(GPT6_HISR);
334
335 gptC2KOS_instance.gptimer_func(gptC2KOS_instance.parameter);
336
337}
338#endif
339
340/*-----------------------------------------------------------------------*
341*
342* C2K GPT 1ms LISR function,
343* pass to gpt_hw layer as a function pointer
344*
345*------------------------------------------------------------------------*/
346DEVDRV_LS_INTSRAM_ROCODE void GPTCB_C2KAR_Lisr(kal_uint32 vector)
347{
348
349#if !defined(__MD93__)
350 DRV_WriteReg32(GPT_INT_STATUS_REG(0),GPT_INT_STATUS_MASK_BIT(DRV_GPT_C2KAR_TIMER));
351#endif
352 gptC2KAR_instance.gptimer_func(gptC2KAR_instance.parameter);
353}
354
355#if defined(__MD93__)
356
357/*-----------------------------------------------------------------------*
358*
359* GPT DSP 1us LISR function,
360* pass to gpt_hw layer as a function pointer
361*
362*------------------------------------------------------------------------*/
363DEVDRV_LS_INTSRAM_ROCODE void GPTCB_DSP_Lisr(kal_uint32 vector)
364{
365 kal_uint32 items = 0;
366#if !defined(__MD93__)
367 DRV_WriteReg32(GPT_INT_STATUS_REG(0),GPT_INT_STATUS_MASK_BIT(DRV_GPT_DSP_TIMER));
368#endif
369
370/*Todo, add HW ITC to sync*/
371 kal_hrt_take_itc_lock(KAL_ITC_GPT_DRIVER, KAL_INFINITE_WAIT);
372
373 ASSERT(KAL_TRUE == gptDSP_running);
374
375/*Todo, add HW ITC to sync clock*/
376 gpt_clk_operation_wo_itc(KAL_TRUE, DRV_GPT_DSP_TIMER);
377
378 kal_hrt_give_itc_lock(KAL_ITC_GPT_DRIVER);
379
380 for(items = 0; items < DSP_USER_NUM; items++)
381 {
382 if(KAL_TRUE == gptDSP_instance[items].execute)
383 {
384 gptDSP_instance[items].gptimer_func(gptDSP_instance[items].parameter);
385
386 gptDSP_instance[items].execute = KAL_FALSE;
387 }
388 }
389
390 kal_hrt_take_itc_lock(KAL_ITC_GPT_DRIVER, KAL_INFINITE_WAIT);
391 gptDSP_running = KAL_FALSE;
392 kal_hrt_give_itc_lock(KAL_ITC_GPT_DRIVER);
393/*Todo, add HW ITC to sync*/
394}
395#endif
396
397/*-----------------------------------------------------------------------*
398*
399* GPT 1ms LISR function,
400* pass to gpt_hw layer as a function pointer
401*
402*------------------------------------------------------------------------*/
403DEVDRV_LS_INTSRAM_ROCODE void GPTCB_LOGGING_Lisr(kal_uint32 vector)
404{
405 /*ASSERT( (MDGPT_INTR_ID(DRV_GPT_CALLBACK_TIMER) == vector) || \
406 (MDGPT_INTR_ID(DRV_GPT_CBUS_TIMER) == vector) );*/
407#if !defined(__MD93__)
408 DRV_WriteReg32(GPT_INT_STATUS_REG(0),GPT_INT_STATUS_MASK_BIT(DRV_GPT_LOGGING_TIMER));
409#endif
410
411 kal_activate_hisr_index(GPT5_HISR);
412}
413
414/*-----------------------------------------------------------------------*
415*
416* GPT 1us LISR function,
417* pass to gpt_hw layer as a function pointer
418*
419*------------------------------------------------------------------------*/
420#if defined(__MD93__) || defined(__MD95__)
421void GPT_Debug_Lisr(kal_uint32 vector)
422{
423 /*ASSERT( (MDGPT_INTR_ID(DRV_GPT_CALLBACK_TIMER) == vector) || \
424 (MDGPT_INTR_ID(DRV_GPT_CBUS_TIMER) == vector) );*/
425 kal_activate_hisr_index(GPT_DEBUG_HISR);
426}
427
428#endif
429
430#if !defined(__MD93__)
431
432void GPT_DSCC0_Lisr(kal_uint32 vector)
433{
434 DRV_WriteReg32(GPT_INT_STATUS_REG(0),GPT_INT_STATUS_MASK_BIT(DRV_GPT_DSP_TIMER));
435 kal_hrt_take_itc_lock(KAL_ITC_GPT_DSCC1, KAL_INFINITE_WAIT);
436 if(KAL_TRUE == gptDSCC0_running)
437 {
438 gptDSCC0_running = KAL_FALSE;
439 gpt_clk_operation(KAL_TRUE, DRV_GPT_DSP_TIMER);
440 }
441 kal_hrt_give_itc_lock(KAL_ITC_GPT_DSCC1);
442
443 gptDSCC0_instance.gptimer_func(gptDSCC0_instance.parameter);
444
445}
446
447void GPT_DSCC1_Lisr(kal_uint32 vector)
448{
449 DRV_WriteReg32(GPT_INT_STATUS_REG(0),GPT_INT_STATUS_MASK_BIT(DRV_GPT_9_TIMER));
450 kal_hrt_take_itc_lock(KAL_ITC_GPT_DSCC2, KAL_INFINITE_WAIT);
451 if(KAL_TRUE == gptDSCC1_running)
452 {
453 gptDSCC1_running = KAL_FALSE;
454 gpt_clk_operation(KAL_TRUE, DRV_GPT_9_TIMER);
455 }
456 kal_hrt_give_itc_lock(KAL_ITC_GPT_DSCC2);
457 gptDSCC1_instance.gptimer_func(gptDSCC1_instance.parameter);
458
459}
460
461#endif
462
463#if defined(__MD97__)
464void GPT_DPCOPRO_Lisr(kal_uint32 vector)
465{
466 DRV_WriteReg32(GPT_INT_STATUS_REG(0),GPT_INT_STATUS_MASK_BIT(DRV_GPT_6_TIMER));
467 if(DRV_Reg32(MDGPT_CTRL_REG(DRV_GPT_6_TIMER)) & MDGPT_CTRL_MODE_ENABLE) //[MOLY00455727]
468 gptDPCOPRO_instance.gptimer_func(gptDPCOPRO_instance.parameter);
469}
470#endif
471
472
473/*-----------------------------------------------------------------------
474
475* FUNCTION
476* DclSGPT_Initialize
477*
478* DESCRIPTION
479* This function is to initialize SW GPT module.
480*
481* PARAMETERS
482* DCL_STATUS_OK
483*
484* RETURNS
485* none
486*
487*------------------------------------------------------------------------*/
488DCL_STATUS DclSGPT_Initialize(void)
489{
490//#ifndef GPT_LP_TEST
491 kal_uint8 index;
492
493 /*Create spinlock for every timer*/
494 gpt_10ms_spinlock = kal_create_spinlock("GPT 10ms Timer");
495 gpt_us_spinlock = kal_create_spinlock("GPT 1ms HMU Timer");
496 gpt_logging_spinlock = kal_create_spinlock("GPT 1ms Logging Timer");
497 #if defined(__MD93__) || defined(__MD95__)
498 gpt_3_spinlock = kal_create_spinlock("GPT3 Timer");
499 gpt_6_spinlock = kal_create_spinlock("GPT6 Timer");
500 #endif
501
502 PDN_CLR(PDN_MDGPTM_26M);
503 MDGPTM_PDN_CLR();
504
505 /* GPT hardware reset */
506 drv_gpt_reset();
507
508 /* set gpt CB timer(GPT1) */
509 drv_gpt_set_timer(DRV_GPT_CALLBACK_TIMER, DCL_GPT_CB_TICK2US, MDGPT_CTRL_MODE_REPEAT);
510
511#if defined(__FPGA__)
512 if(0x20160617 == drv_gpt_get_version())//Check GPT version is 0x20160617
513 {
514 drv_gpt_set_timer(DRV_GPT_CALLBACK_TIMER, DCL_GPT_CB_TICK2US/10, MDGPT_CTRL_MODE_REPEAT);
515 }
516#endif
517
518 /* set gpt CBUS timer (GPT2)*/
519 drv_gpt_set_timer(DRV_GPT_CBUS_TIMER, DCL_GPT_CBUS_TICK2US, MDGPT_CTRL_MODE_REPEAT);
520 #if defined(__MD93__) || defined(__MD95__)
521 /* set gpt C2KOS timer */
522 drv_gpt_set_timer(DRV_GPT_6_TIMER, DCL_GPT_C2K_TICK2US, MDGPT_CTRL_MODE_ONESHOT);
523 #else
524 drv_gpt_set_timer(DRV_GPT_6_TIMER, DCL_GPT_CBUS_TICK2US, MDGPT_CTRL_MODE_REPEAT);
525 #endif
526 /* set gpt C2KAR timer (GPT7)*/
527 drv_gpt_set_timer(DRV_GPT_C2KAR_TIMER, DCL_GPT_C2K_TICK2US, MDGPT_CTRL_MODE_REPEAT);
528
529 /* set gpt CBMS timer (GPT5)*/
530 drv_gpt_set_timer(DRV_GPT_LOGGING_TIMER, DCL_GPT_LOGGING_TICK2US, MDGPT_CTRL_MODE_REPEAT);
531
532 /* set gpt Debug timer, tick unit = us */
533 drv_gpt_set_timer(DRV_GPT_3_TIMER, DCL_GPT_CBUS_TICK2US, MDGPT_CTRL_MODE_ONESHOT);
534
535 /* set OS timer (GPT4)*/
536 drv_gpt_set_timer(DRV_GPT_SYSTEM_TIMER, KAL_MICROSECS_PER_TICK, MDGPT_CTRL_MODE_REPEAT);
537 #if defined(__MD93__)
538 /* set gpt DSP timer (GPT8)*/
539 drv_gpt_set_timer(DRV_GPT_DSP_TIMER, DCL_GPT_CBUS_TICK2US, MDGPT_CTRL_MODE_ONESHOT);
540 #else
541 drv_gpt_set_timer(DRV_GPT_DSP_TIMER, DCL_GPT_CBUS_TICK2US, MDGPT_CTRL_MODE_REPEAT);
542 drv_gpt_set_timer(DRV_GPT_9_TIMER, DCL_GPT_CBUS_TICK2US, MDGPT_CTRL_MODE_ONESHOT);
543 #endif
544
545 /* gptCB variables are initialized in BSS reset procedure */
546
547 for (index = 0; index < MAX_GPT_ITEMS; index++)
548 {
549 gptCB_items[index].gptimer_func = GPT_ERROR_CB;
550#ifdef __MD93__
551 gpt_DEBUG_items[index].gptimer_func = GPT_ERROR_CB;
552#endif
553 }
554
555 IRQUnmask(MDGPT_INTR_ID(DRV_GPT_CALLBACK_TIMER));
556 IRQUnmask(MDGPT_INTR_ID(DRV_GPT_CBUS_TIMER));
557 IRQUnmask(MDGPT_INTR_ID(DRV_GPT_LOGGING_TIMER));
558 IRQUnmask(MDGPT_INTR_ID(DRV_GPT_3_TIMER));
559#if !defined(__MD93__)
560 IRQUnmask(MDGPT_INTR_ID(DRV_GPT_9_TIMER));
561#endif
562 IRQUnmask(MDGPT_INTR_ID(DRV_GPT_6_TIMER));
563 IRQUnmask(MDGPT_INTR_ID(DRV_GPT_C2KAR_TIMER));
564 IRQUnmask(MDGPT_INTR_ID(DRV_GPT_SYSTEM_TIMER));
565 IRQUnmask(MDGPT_INTR_ID(DRV_GPT_DSP_TIMER));
566
567 PDN_SET(PDN_MDGPTM_26M);
568 MDGPTM_PDN_SET();
569//#endif
570 return STATUS_OK;
571}
572
573/*-----------------------------------------------------------------------
574* FUNCTION
575* DclSGPT_Open
576*
577* DESCRIPTION
578* This function is to open the SW GPT module and get a handle. Note that
579* multiple opens are allowed.
580*
581* PARAMETERS
582* eDev - only valid for DCL_GPT1
583* flags - no sepcial flags is needed. Please use FLAGS_NONE
584*
585* RETURNS
586* DCL_HANDLE_INVALID - Open failed.
587* other value - a valid handle
588*
589*------------------------------------------------------------------------*/
590DCL_HANDLE DclSGPT_Open(DCL_DEV eDev, DCL_FLAGS flags)
591{
592 kal_int32 i;
593 if (DCL_GPT_CB==eDev)
594 {
595 kal_take_spinlock(gpt_10ms_spinlock, KAL_INFINITE_WAIT);
596 for (i=0; i < MAX_GPT_ITEMS; i++)
597 {
598 if (gptCB_used[i] == 0)
599 {
600 gptCB_used[i] = 1;
601 gptCB_users++;
602
603 kal_give_spinlock(gpt_10ms_spinlock);
604
605 return DCL_GPT_CB_MAGIC_NUM|i;
606 }
607 }
608 kal_give_spinlock(gpt_10ms_spinlock);
609 // The case that we do NOT return in the loop:
610 // Indicate there is NO GPT handle!!!!!
611 ASSERT(i < MAX_GPT_ITEMS);
612 // return invalid handle
613 return DCL_HANDLE_OCCUPIED;
614 }
615 #if defined(__MD93__)
616 else if (DCL_GPT_DSP==eDev)
617 {
618 kal_hrt_take_itc_lock(KAL_ITC_GPT_DRIVER, KAL_INFINITE_WAIT);
619
620 ASSERT(KAL_FALSE == gptDSP_used);
621 gptDSP_used = KAL_TRUE;
622
623 kal_hrt_give_itc_lock(KAL_ITC_GPT_DRIVER);
624
625 return DCL_GPT_DSP_MAGIC_NUM;
626
627 }
628 #endif
629#if defined(__MD93__) || defined(__MD95__)
630 else if (DCL_GPT_C2K_OS==eDev)
631 {
632 kal_take_spinlock(gpt_6_spinlock, KAL_INFINITE_WAIT);
633 if( KAL_FALSE == gptC2KOS_used )
634 {
635 gptC2KOS_used = KAL_TRUE;
636
637 kal_give_spinlock(gpt_6_spinlock);
638
639 return DCL_GPT_C2KOS_MAGIC_NUM;
640 }
641 kal_give_spinlock(gpt_6_spinlock);
642
643 return DCL_HANDLE_OCCUPIED;
644 }
645#endif
646#if defined(__MD97__)
647 else if (DCL_GPT_DPCOPRO==eDev)
648 {
649 kal_hrt_take_itc_lock(KAL_ITC_GPT_DPCOPRO, KAL_INFINITE_WAIT);
650 if( KAL_FALSE == gptDPCOPRO_used )
651 {
652 gptDPCOPRO_used = KAL_TRUE;
653 kal_hrt_give_itc_lock(KAL_ITC_GPT_DPCOPRO);
654 return DCL_GPT_6_MAGIC_NUM;
655 }
656 kal_hrt_give_itc_lock(KAL_ITC_GPT_DPCOPRO);
657 return DCL_HANDLE_OCCUPIED;
658 }
659#endif
660 else if (DCL_GPT_C2K_AR==eDev)
661 {
662 if( KAL_FALSE == gptC2KAR_used )
663 {
664 gptC2KAR_used = KAL_TRUE;
665
666 return DCL_GPT_C2KAR_MAGIC_NUM;
667 }
668 return DCL_HANDLE_OCCUPIED;
669 }
670 else if (DCL_GPT_CB_MS==eDev)
671 {
672 kal_take_spinlock(gpt_us_spinlock, KAL_INFINITE_WAIT);
673 if( KAL_FALSE == gptCBUS_used )
674 {
675 gptCBUS_used = KAL_TRUE;
676
677 kal_give_spinlock(gpt_us_spinlock);
678
679 return DCL_GPT_CBUS_MAGIC_NUM;
680 }
681 kal_give_spinlock(gpt_us_spinlock);
682
683 return DCL_HANDLE_OCCUPIED;
684 }
685
686 else if (DCL_GPT_CB_LOGGING==eDev)
687 {
688 kal_take_spinlock(gpt_logging_spinlock, KAL_INFINITE_WAIT);
689 if( KAL_FALSE == gptLogging_used )
690 {
691 gptLogging_used = KAL_TRUE;
692 kal_give_spinlock(gpt_logging_spinlock);
693 return DCL_GPT_LOGGING_MAGIC_NUM;
694 }
695 kal_give_spinlock(gpt_logging_spinlock);
696
697 return DCL_HANDLE_OCCUPIED;
698 }
699#if defined(__MD93__) || defined(__MD95__)
700 else if (DCL_GPT_DEBUG==eDev)
701 {
702 kal_take_spinlock(gpt_3_spinlock, KAL_INFINITE_WAIT);
703 for (i=0; i < MAX_GPT_ITEMS; i++)
704 {
705 if (gpt_DEBUG_used[i] == 0)
706 {
707 gpt_DEBUG_used[i] = 1;
708 gpt_DEBUG_users++;
709 kal_give_spinlock(gpt_3_spinlock);
710 return DCL_GPT_3_MAGIC_NUM|i;
711 }
712 }
713 kal_give_spinlock(gpt_3_spinlock);
714 ASSERT( gpt_DEBUG_users < MAX_GPT_ITEMS );
715 // return invalid handle
716 return DCL_HANDLE_OCCUPIED;
717 }
718 #endif
719 #if !defined(__MD93__)
720 else if (DCL_GPT_DSCC_0==eDev)
721 {
722 kal_hrt_take_itc_lock(KAL_ITC_GPT_DSCC1, KAL_INFINITE_WAIT);
723 if( KAL_FALSE == gptDSCC0_used )
724 {
725 gptDSCC0_used = KAL_TRUE;
726 kal_hrt_give_itc_lock(KAL_ITC_GPT_DSCC1);
727 return DCL_GPT_DSP_MAGIC_NUM;
728 }
729 kal_hrt_give_itc_lock(KAL_ITC_GPT_DSCC1);
730 return DCL_HANDLE_OCCUPIED;
731 }
732 else if (DCL_GPT_DSCC_1==eDev)
733 {
734 kal_hrt_take_itc_lock(KAL_ITC_GPT_DSCC2, KAL_INFINITE_WAIT);
735 if( KAL_FALSE == gptDSCC1_used )
736 {
737 gptDSCC1_used = KAL_TRUE;
738 kal_hrt_give_itc_lock(KAL_ITC_GPT_DSCC2);
739 return DCL_GPT_9_MAGIC_NUM;
740 }
741 kal_hrt_give_itc_lock(KAL_ITC_GPT_DSCC2);
742
743 return DCL_HANDLE_OCCUPIED;
744 }
745 #endif
746 else
747 {
748 kal_uint32 Invaild_GPT_DEV_Type = 0;
749
750 ASSERT(Invaild_GPT_DEV_Type);
751 return DCL_HANDLE_INVALID;
752 }
753}
754
755/*-----------------------------------------------------------------------
756
757* FUNCTION
758* DclSGPT_ReadData
759*
760* DESCRIPTION
761* This function is not supported for the SW GPT module now.
762*
763* PARAMETERS
764* N/A
765*
766* RETURNS
767* STATUS_UNSUPPORTED
768*
769*------------------------------------------------------------------------*/
770
771DCL_STATUS DclSGPT_ReadData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN *buf_len, DCL_OPTIONS options)
772{
773 return STATUS_UNSUPPORTED;
774}
775
776/*-----------------------------------------------------------------------
777
778* FUNCTION
779* DclSGPT_WriteData
780*
781* DESCRIPTION
782* This function is not supported for the SW GPT module now.
783*
784* PARAMETERS
785* N/A
786*
787* RETURNS
788* STATUS_UNSUPPORTED
789*
790*------------------------------------------------------------------------*/
791
792DCL_STATUS DclSGPT_WriteData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN *buf_len, DCL_OPTIONS options)
793{
794 return STATUS_UNSUPPORTED;
795}
796
797/*-----------------------------------------------------------------------
798
799* FUNCTION
800* DclSGPT_Configure
801*
802* DESCRIPTION
803* This function is not supported for the SW GPT module now.
804*
805* PARAMETERS
806* N/A
807*
808* RETURNS
809* STATUS_UNSUPPORTED
810*
811*------------------------------------------------------------------------*/
812
813DCL_STATUS DclSGPT_Configure(DCL_HANDLE handle, DCL_CONFIGURE_T *configure)
814{
815 return STATUS_UNSUPPORTED;
816}
817
818
819/*-----------------------------------------------------------------------
820
821* FUNCTION
822* DclSGPT_RegisterCallback
823*
824* DESCRIPTION
825* This function is not supported for the SW GPT module now.
826*
827* PARAMETERS
828* N/A
829*
830* RETURNS
831* STATUS_UNSUPPORTED
832*
833*------------------------------------------------------------------------*/
834
835DCL_STATUS DclSGPT_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, PFN_DCL_CALLBACK callback)
836{
837 return STATUS_UNSUPPORTED;
838}
839
840
841/*-----------------------------------------------------------------------
842
843* FUNCTION
844* DclSGPT_Control
845*
846* DESCRIPTION
847* This function is to send command to control the SW GPT module.
848*
849* PARAMETERS
850* handle - a valid handle return by DclSGPT_Open()
851* cmd - a control command for GPT module
852* 1. SGPT_CMD_START: to start a GPT timer
853* 2. SGPT_CMD_STOP: to stop a GPT timer
854* data - for 1. SGPT_CMD_START: pointer to a SGPT_CTRL_START_T structure
855* 2. SGPT_CMD_STOP: a NULL pointer
856*
857* RETURNS
858* STATUS_OK - command is executed successfully.
859* STATUS_FAIL - command is failed.
860* STATUS_INVALID_CMD - It's a invalid command.
861*
862*------------------------------------------------------------------------*/
863
864DCL_STATUS DclSGPT_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
865{
866 DCL_UINT32 gpt_unknown_command = 0;
867 DCL_UINT8 gpt_handle = 0;
868 gpt_handle = DCL_GPT_CB_GET_DEV(handle) & 0x1F;
869
870 if(DCL_GPT_CB_IS_HANDLE_MAGIC(handle))
871 {
872 switch(cmd)
873 {
874 case SGPT_CMD_START:
875 {
876 kal_bool ret_b;
877 SGPT_CTRL_START_T *prStart;
878
879 prStart = &(data->rSGPTStart);
880
881 //test if callback function is null.
882 ASSERT( NULL!=prStart->pfCallback );
883
884 kal_take_spinlock(gpt_10ms_spinlock, KAL_INFINITE_WAIT);
885
886 gpt_clk_operation(KAL_FALSE, DRV_GPT_CALLBACK_TIMER);
887
888
889 ret_b = GPTCB_StartItem(gpt_handle, prStart->u2Tick, prStart->pfCallback, prStart->vPara);
890
891 kal_give_spinlock(gpt_10ms_spinlock);
892
893 if (ret_b == KAL_TRUE)
894 {
895 return STATUS_OK;
896 }
897 else
898 {
899 return STATUS_FAIL;
900 }
901 }
902 //break; we can return in any case.
903 case SGPT_CMD_STOP:
904
905 kal_take_spinlock(gpt_10ms_spinlock, KAL_INFINITE_WAIT);
906 GPTCB_StopItem(gpt_handle);
907 kal_give_spinlock(gpt_10ms_spinlock);
908
909 return STATUS_OK;
910 default:
911 ASSERT(gpt_unknown_command);
912 return STATUS_INVALID_CMD;
913 }
914 }
915 #if defined(__MD93__)
916 else if(DCL_GPT_DSP_IS_HANDLE_MAGIC(handle))
917 {
918 kal_uint32 items =0;
919 ASSERT( KAL_TRUE == gptDSP_used );
920 switch(cmd)
921 {
922 case SGPT_CMD_START:
923 {
924 SGPT_CTRL_START_T *prStart;
925 prStart = &(data->rSGPTStart);
926
927 //test if callback function is null.
928 ASSERT( NULL!=prStart->pfCallback );
929
930 kal_hrt_take_itc_lock(KAL_ITC_GPT_DRIVER, KAL_INFINITE_WAIT);
931
932 //ASSERT( KAL_FALSE == gptDSP_running );//dsp user may multiple
933
934 for(items = 0; items < DSP_USER_NUM; items++)
935 {
936 if(KAL_FALSE == gptDSP_instance[items].execute)
937 {
938 gptDSP_instance[items].execute = KAL_TRUE;
939 gptDSP_instance[items].tick = prStart->u4Tick;
940
941 #if defined(__FPGA__)
942 if(0x20160617 == drv_gpt_get_version())//Check GPT version is 0x20160617
943 {
944 gptDSP_instance[items].tick = gptDSP_instance[items].tick/10;
945 }
946 #endif
947
948 gptDSP_instance[items].gptimer_func = prStart->pfCallback;
949 gptDSP_instance[items].parameter = prStart->vPara;
950 break;
951 }
952 }
953#if defined(ATEST_DRV_GPT)
954 if(items == DSP_USER_NUM)
955 {
956 kal_hrt_give_itc_lock(KAL_ITC_GPT_DRIVER);
957 return STATUS_FAIL;
958 }
959#else
960 ASSERT( items < DSP_USER_NUM );
961#endif
962
963 if(KAL_FALSE == gptDSP_running)
964 {
965 gpt_clk_operation_wo_itc(KAL_FALSE, DRV_GPT_DSP_TIMER);
966 drv_gpt_set_timer(DRV_GPT_DSP_TIMER, gptDSP_instance[items].tick, MDGPT_CTRL_MODE_ONESHOT);
967 drv_gpt_start_timer(DRV_GPT_DSP_TIMER);
968
969 gptDSP_running = KAL_TRUE;
970 }
971 kal_hrt_give_itc_lock(KAL_ITC_GPT_DRIVER);
972
973 return STATUS_OK;
974 }
975 //break; we can return in any case.
976 case SGPT_CMD_STOP:
977
978 kal_hrt_take_itc_lock(KAL_ITC_GPT_DRIVER, KAL_INFINITE_WAIT);
979
980 drv_gpt_stop_timer(DRV_GPT_DSP_TIMER);
981 for(items = 0; items < DSP_USER_NUM; items++)
982 {
983 gptDSP_instance[items].execute = KAL_FALSE;
984 }
985 gptDSP_running = KAL_FALSE;
986 gpt_clk_operation_wo_itc(KAL_TRUE, DRV_GPT_DSP_TIMER);
987
988 kal_hrt_give_itc_lock(KAL_ITC_GPT_DRIVER);
989
990 return STATUS_OK;
991 default:
992 ASSERT(gpt_unknown_command);
993 return STATUS_INVALID_CMD;
994 }
995 }
996 #endif
997 else if(DCL_GPT_CBUS_IS_HANDLE_MAGIC(handle))
998 {
999 ASSERT( KAL_TRUE == gptCBUS_used );
1000 switch(cmd)
1001 {
1002 case SGPT_CMD_START:
1003 {
1004 SGPT_CTRL_START_T *prStart;
1005 prStart = &(data->rSGPTStart);
1006
1007#if !defined(__LP_SCHEDULE_HMU_RESCHEDULE__)
1008 //test if callback function is null.
1009 ASSERT( NULL!=prStart->pfCallback );
1010
1011 kal_take_spinlock(gpt_us_spinlock, KAL_INFINITE_WAIT);
1012
1013 if( KAL_TRUE == gptCBUS_running )
1014 {
1015 kal_give_spinlock(gpt_us_spinlock);
1016 return STATUS_FAIL;
1017 }
1018 gptCBUS_instance.tick = prStart->u2Tick*1000; // 1 ms duration
1019 gptCBUS_instance.gptimer_func = prStart->pfCallback;
1020 gptCBUS_instance.parameter = prStart->vPara;
1021 gptCBUS_running = KAL_TRUE;
1022
1023 gptCBUS_usr_trig++;
1024
1025#if defined(__FPGA__)
1026 if(0x20160617 == drv_gpt_get_version())//Check GPT version is 0x20160617
1027 {
1028 gptCBUS_instance.tick = gptCBUS_instance.tick/10;
1029 }
1030#endif
1031
1032 gpt_clk_operation(KAL_FALSE, DRV_GPT_CBUS_TIMER);
1033 drv_gpt_set_timer(DRV_GPT_CBUS_TIMER, gptCBUS_instance.tick, MDGPT_CTRL_MODE_ONESHOT);
1034 drv_gpt_start_timer(DRV_GPT_CBUS_TIMER);
1035
1036 kal_give_spinlock(gpt_us_spinlock);
1037#else /* !__LP_SCHEDULE_HMU_RESCHEDULE__ */
1038 //only tg_hisr control this gpt
1039 if(0 == gpt_cbus_on)
1040 {
1041// kal_take_spinlock(gpt_us_spinlock, KAL_INFINITE_WAIT);
1042 gpt_clk_operation(KAL_FALSE, DRV_GPT_CBUS_TIMER);
1043 gpt_cbus_on = 1;
1044// kal_give_spinlock(gpt_us_spinlock);
1045 }
1046 /* drv_gpt_set/start_timer are thread-save functions */
1047 drv_gpt_set_timer(DRV_GPT_CBUS_TIMER, prStart->u2Tick*1000, MDGPT_CTRL_MODE_ONESHOT);
1048 drv_gpt_start_timer(DRV_GPT_CBUS_TIMER);
1049#endif /* !__LP_SCHEDULE_HMU_RESCHEDULE__ */
1050
1051 return STATUS_OK;
1052 }
1053 //break; we can return in any case.
1054 case SGPT_CMD_STOP:
1055
1056#if !defined(__LP_SCHEDULE_HMU_RESCHEDULE__)
1057 kal_take_spinlock(gpt_us_spinlock, KAL_INFINITE_WAIT);
1058
1059 drv_gpt_stop_timer(DRV_GPT_CBUS_TIMER);
1060 gptCBUS_running = KAL_FALSE;
1061 gpt_clk_operation(KAL_TRUE, DRV_GPT_CBUS_TIMER);
1062
1063 kal_give_spinlock(gpt_us_spinlock);
1064#else /* !__LP_SCHEDULE_HMU_RESCHEDULE__ */
1065 //only tg_hisr control this gpt
1066 /* drv_gpt_stop_timer is thread-save function */
1067 drv_gpt_stop_timer(DRV_GPT_CBUS_TIMER);
1068 if(1 == gpt_cbus_on)
1069 {
1070// kal_take_spinlock(gpt_us_spinlock, KAL_INFINITE_WAIT);
1071 gpt_clk_operation(KAL_TRUE, DRV_GPT_CBUS_TIMER);
1072 gpt_cbus_on = 0;
1073// kal_give_spinlock(gpt_us_spinlock);
1074 }
1075#endif /* !__LP_SCHEDULE_HMU_RESCHEDULE__ */
1076
1077 return STATUS_OK;
1078 default:
1079 ASSERT(gpt_unknown_command);
1080 return STATUS_INVALID_CMD;
1081 }
1082 }
1083#if defined(__MD93__) || defined(__MD95__)
1084 else if(DCL_GPT_C2KOS_IS_HANDLE_MAGIC(handle))
1085 {
1086 ASSERT( KAL_TRUE == gptC2KOS_used );
1087 switch(cmd)
1088 {
1089 case SGPT_CMD_START:
1090 {
1091 SGPT_CTRL_START_T *prStart;
1092 prStart = &(data->rSGPTStart);
1093
1094 //test if callback function is null.
1095 ASSERT( NULL!=prStart->pfCallback );
1096
1097 kal_take_spinlock(gpt_6_spinlock, KAL_INFINITE_WAIT);
1098
1099 if( KAL_TRUE == gptC2KOS_running )
1100 {
1101 kal_give_spinlock(gpt_6_spinlock);
1102 return STATUS_FAIL;
1103 }
1104 gptC2KOS_instance.tick = prStart->u4Tick; // 1 us duration
1105 gptC2KOS_instance.gptimer_func = prStart->pfCallback;
1106 gptC2KOS_instance.parameter = prStart->vPara;
1107 gptC2KOS_running = KAL_TRUE;
1108
1109#if defined(__FPGA__)
1110 if(0x20160617 == drv_gpt_get_version())//Check GPT version is 0x20160617
1111 {
1112 gptC2KOS_instance.tick = gptC2KOS_instance.tick/10;
1113 }
1114#endif
1115 gpt_clk_operation(KAL_FALSE, DRV_GPT_6_TIMER);
1116 drv_gpt_set_timer(DRV_GPT_6_TIMER, gptC2KOS_instance.tick, MDGPT_CTRL_MODE_ONESHOT);
1117 drv_gpt_start_timer(DRV_GPT_6_TIMER);
1118
1119 kal_give_spinlock(gpt_6_spinlock);
1120
1121 return STATUS_OK;
1122 }
1123 //break; we can return in any case.
1124 case SGPT_CMD_STOP:
1125
1126 kal_take_spinlock(gpt_6_spinlock, KAL_INFINITE_WAIT);
1127
1128 drv_gpt_stop_timer(DRV_GPT_6_TIMER);
1129 gptC2KOS_running = KAL_FALSE;
1130 gpt_clk_operation(KAL_TRUE, DRV_GPT_6_TIMER);
1131
1132 kal_give_spinlock(gpt_6_spinlock);
1133
1134 return STATUS_OK;
1135
1136 case SGPT_CMD_RUNNING_TICK:
1137 {
1138 SGPT_CTRL_START_T *prStart;
1139 prStart = &(data->rSGPTStart);
1140
1141 prStart->u4Tick = drv_gpt_get_data(DRV_GPT_6_TIMER);
1142
1143 return STATUS_OK;
1144 }
1145 default:
1146 ASSERT(gpt_unknown_command);
1147 return STATUS_INVALID_CMD;
1148 }
1149 }
1150#elif defined(__MD97__)
1151 else if(DCL_GPT_6_IS_HANDLE_MAGIC(handle))
1152 {
1153 ASSERT( KAL_TRUE == gptDPCOPRO_used );
1154 switch(cmd)
1155 {
1156 case SGPT_CMD_START:
1157 {
1158 SGPT_CTRL_START_T *prStart;
1159 prStart = &(data->rSGPTStart);
1160
1161 //test if callback function is null.
1162 ASSERT( NULL!=prStart->pfCallback );
1163
1164 kal_hrt_take_itc_lock(KAL_ITC_GPT_DPCOPRO, KAL_INFINITE_WAIT);
1165 if( KAL_TRUE == gptDPCOPRO_running )
1166 {
1167 kal_hrt_give_itc_lock(KAL_ITC_GPT_DPCOPRO);
1168 return STATUS_FAIL;
1169 }
1170 gptDPCOPRO_instance.tick = prStart->u4Tick; // 1 us duration
1171 gptDPCOPRO_instance.gptimer_func = prStart->pfCallback;
1172 gptDPCOPRO_instance.parameter = prStart->vPara;
1173 gptDPCOPRO_running = KAL_TRUE;
1174
1175#if defined(__FPGA__)
1176 if(0x20160617 == drv_gpt_get_version())//Check GPT version is 0x20160617
1177 {
1178 gptDPCOPRO_instance.tick = gptDPCOPRO_instance.tick/10;
1179 }
1180#endif
1181
1182 gpt_clk_operation(KAL_FALSE, DRV_GPT_6_TIMER);
1183 Data_Sync_Barrier();
1184 //drv_gpt_set_timer(DRV_GPT_6_TIMER, gptDPCOPRO_instance.tick, MDGPT_CTRL_MODE_REPEAT);
1185 DRV_WriteReg32(MDGPT_CNT_REG(DRV_GPT_6_TIMER), gptDPCOPRO_instance.tick);
1186 DRV_WriteReg32(MDGPT_CTRL_REG(DRV_GPT_6_TIMER), MDGPT_CTRL_MODE_REPEAT); //1<<1 enable timer
1187 //drv_gpt_start_timer(DRV_GPT_6_TIMER);
1188 DRV_WriteReg32(MDGPT_CTRL_REG(DRV_GPT_6_TIMER), DRV_Reg32(MDGPT_CTRL_REG(DRV_GPT_6_TIMER))| MDGPT_CTRL_MODE_ENABLE);
1189 Data_Sync_Barrier();
1190 kal_hrt_give_itc_lock(KAL_ITC_GPT_DPCOPRO);
1191 return STATUS_OK;
1192 }
1193 //break; we can return in any case.
1194 case SGPT_CMD_STOP:
1195 kal_hrt_take_itc_lock(KAL_ITC_GPT_DPCOPRO, KAL_INFINITE_WAIT);
1196 //drv_gpt_stop_timer(DRV_GPT_6_TIMER);
1197 DRV_WriteReg32(MDGPT_CTRL_REG(DRV_GPT_6_TIMER), DRV_Reg32(MDGPT_CTRL_REG(DRV_GPT_6_TIMER)) & (~MDGPT_CTRL_MODE_ENABLE));
1198 gptDPCOPRO_running = KAL_FALSE;
1199 Data_Sync_Barrier();
1200 //IRQClearInt(MDGPT_INTR_ID(DRV_GPT_6_TIMER)); [MOLY00455727]
1201 gpt_clk_operation(KAL_TRUE, DRV_GPT_6_TIMER);
1202 kal_hrt_give_itc_lock(KAL_ITC_GPT_DPCOPRO);
1203 return STATUS_OK;
1204
1205 case SGPT_CMD_RUNNING_TICK:
1206 {
1207 SGPT_CTRL_START_T *prStart;
1208 prStart = &(data->rSGPTStart);
1209
1210 prStart->u4Tick = drv_gpt_get_data(DRV_GPT_6_TIMER);
1211
1212 return STATUS_OK;
1213 }
1214 default:
1215 ASSERT(gpt_unknown_command);
1216 return STATUS_INVALID_CMD;
1217 }
1218 }
1219#endif
1220 else if(DCL_GPT_C2KAR_IS_HANDLE_MAGIC(handle))
1221 {
1222 ASSERT( KAL_TRUE == gptC2KAR_used );
1223 switch(cmd)
1224 {
1225 case SGPT_CMD_START:
1226 {
1227 SGPT_CTRL_START_T *prStart;
1228 prStart = &(data->rSGPTStart);
1229
1230 //test if callback function is null.
1231 ASSERT( NULL!=prStart->pfCallback );
1232
1233 //savedMask = SaveAndSetIRQMask();
1234
1235 if( KAL_TRUE == gptC2KAR_running )
1236 {
1237 //RestoreIRQMask(savedMask);
1238 return STATUS_FAIL;
1239 }
1240 gptC2KAR_instance.tick = prStart->u4Tick; // 1 us duration
1241 gptC2KAR_instance.gptimer_func = prStart->pfCallback;
1242 gptC2KAR_instance.parameter = prStart->vPara;
1243 gptC2KAR_running = KAL_TRUE;
1244
1245#if defined(__FPGA__)
1246 if(0x20160617 == drv_gpt_get_version())//Check GPT version is 0x20160617
1247 {
1248 gptC2KAR_instance.tick = gptC2KAR_instance.tick/10;
1249 }
1250#endif
1251
1252 gpt_clk_operation(KAL_FALSE, DRV_GPT_C2KAR_TIMER);
1253 drv_gpt_set_timer(DRV_GPT_C2KAR_TIMER, gptC2KAR_instance.tick, MDGPT_CTRL_MODE_REPEAT);
1254 drv_gpt_start_timer(DRV_GPT_C2KAR_TIMER);
1255
1256 return STATUS_OK;
1257 }
1258 //break; we can return in any case.
1259 case SGPT_CMD_STOP:
1260
1261 drv_gpt_stop_timer(DRV_GPT_C2KAR_TIMER);
1262 gptC2KAR_running = KAL_FALSE;
1263 gpt_clk_operation(KAL_TRUE, DRV_GPT_C2KAR_TIMER);
1264
1265 return STATUS_OK;
1266
1267 case SGPT_CMD_RUNNING_TICK:
1268 {
1269 SGPT_CTRL_START_T *prStart;
1270 prStart = &(data->rSGPTStart);
1271
1272 prStart->u4Tick = drv_gpt_get_data(DRV_GPT_C2KAR_TIMER);
1273
1274 return STATUS_OK;
1275 }
1276
1277 case SGPT_CMD_MODIFY_CNT:
1278 {
1279 SGPT_CTRL_START_T *prStart;
1280 prStart = &(data->rSGPTStart);
1281
1282 //test if callback function is null.
1283 ASSERT( NULL!=prStart->pfCallback );
1284
1285 if( KAL_FALSE == gptC2KAR_running ) //Only Running case to modify GPT count
1286 {
1287 ASSERT(0);
1288 }
1289 gptC2KAR_instance.tick = prStart->u4Tick; // 1 us duration
1290 //gptC2KAR_instance.gptimer_func = prStart->pfCallback;
1291 //gptC2KAR_instance.parameter = prStart->vPara;
1292
1293#if defined(__FPGA__)
1294 if(0x20160617 == drv_gpt_get_version())//Check GPT version is 0x20160617
1295 {
1296 gptC2KAR_instance.tick = gptC2KAR_instance.tick/10;
1297 }
1298#endif
1299
1300 gpt_clk_operation(KAL_FALSE, DRV_GPT_C2KAR_TIMER);
1301 drv_gpt_set_data(DRV_GPT_C2KAR_TIMER, gptC2KAR_instance.tick);
1302
1303 return STATUS_OK;
1304 }
1305 default:
1306 ASSERT(gpt_unknown_command);
1307 return STATUS_INVALID_CMD;
1308 }
1309 }
1310
1311 else if(DCL_GPT_LOGGING_IS_HANDLE_MAGIC(handle))
1312 {
1313 ASSERT( KAL_TRUE == gptLogging_used );
1314 switch(cmd)
1315 {
1316 case SGPT_CMD_START:
1317 {
1318 SGPT_CTRL_START_T *prStart;
1319 prStart = &(data->rSGPTStart);
1320
1321 //test if callback function is null.
1322 ASSERT( NULL!=prStart->pfCallback );
1323
1324 kal_take_spinlock(gpt_logging_spinlock, KAL_INFINITE_WAIT);
1325
1326 if( KAL_TRUE == gptLogging_running )
1327 {
1328 kal_give_spinlock(gpt_logging_spinlock);
1329 return STATUS_FAIL;
1330 }
1331 gptLogging_instance.tick = prStart->u2Tick*1000; // 1 ms duration
1332 gptLogging_instance.gptimer_func = prStart->pfCallback;
1333 gptLogging_instance.parameter = prStart->vPara;
1334 gptLogging_running = KAL_TRUE;
1335
1336#if defined(__FPGA__)
1337 if(0x20160617 == drv_gpt_get_version())//Check GPT version is 0x20160617
1338 {
1339 gptLogging_instance.tick = gptLogging_instance.tick/10;
1340 }
1341#endif
1342
1343 gpt_clk_operation(KAL_FALSE, DRV_GPT_LOGGING_TIMER);
1344 drv_gpt_set_timer(DRV_GPT_LOGGING_TIMER, gptLogging_instance.tick, MDGPT_CTRL_MODE_ONESHOT);
1345 drv_gpt_start_timer(DRV_GPT_LOGGING_TIMER);
1346
1347 kal_give_spinlock(gpt_logging_spinlock);
1348
1349 return STATUS_OK;
1350 }
1351 //break; we can return in any case.
1352 case SGPT_CMD_STOP:
1353
1354 kal_take_spinlock(gpt_logging_spinlock, KAL_INFINITE_WAIT);
1355
1356 drv_gpt_stop_timer(DRV_GPT_LOGGING_TIMER);
1357 gptLogging_running = KAL_FALSE;
1358 gpt_clk_operation(KAL_TRUE, DRV_GPT_LOGGING_TIMER);
1359
1360 kal_give_spinlock(gpt_logging_spinlock);
1361
1362 return STATUS_OK;
1363 default:
1364 ASSERT(gpt_unknown_command);
1365 return STATUS_INVALID_CMD;
1366 }
1367 }
1368#if defined(__MD93__) || defined(__MD95__)
1369 else if(DCL_GPT_3_IS_HANDLE_MAGIC(handle))
1370 {
1371 switch(cmd)
1372 {
1373 case SGPT_CMD_START:
1374 {
1375 SGPT_CTRL_START_T *prStart;
1376 prStart = &(data->rSGPTStart);
1377
1378 kal_take_spinlock(gpt_3_spinlock, KAL_INFINITE_WAIT);
1379
1380 GPT_DEBUG_Insert(DCL_GPT_3_GET_DEV(handle), prStart->u4Tick, prStart->pfCallback, prStart->vPara);
1381
1382 kal_give_spinlock(gpt_3_spinlock);
1383
1384 return STATUS_OK;
1385 }
1386 //break; we can return in any case.
1387 case SGPT_CMD_STOP:
1388
1389 kal_take_spinlock(gpt_3_spinlock, KAL_INFINITE_WAIT);
1390
1391 GPT_DEBUG_Stop(DCL_GPT_3_GET_DEV(handle));
1392
1393 kal_give_spinlock(gpt_3_spinlock);
1394
1395 return STATUS_OK;
1396 default:
1397 ASSERT(gpt_unknown_command);
1398 return STATUS_INVALID_CMD;
1399 }
1400 }
1401 #endif
1402 #if !defined(__MD93__)
1403 else if(DCL_GPT_DSP_IS_HANDLE_MAGIC(handle))
1404 {
1405 ASSERT( KAL_TRUE == gptDSCC0_used );
1406 switch(cmd)
1407 {
1408 case SGPT_CMD_START:
1409 {
1410 SGPT_CTRL_START_T *prStart;
1411 prStart = &(data->rSGPTStart);
1412
1413 //test if callback function is null.
1414 ASSERT( NULL!=prStart->pfCallback );
1415
1416 kal_hrt_take_itc_lock(KAL_ITC_GPT_DSCC1, KAL_INFINITE_WAIT);
1417
1418 if( KAL_TRUE == gptDSCC0_running )
1419 {
1420 drv_gpt_stop_timer(DRV_GPT_DSP_TIMER);
1421 }
1422 else
1423 {
1424 gpt_clk_operation(KAL_FALSE, DRV_GPT_DSP_TIMER);
1425 }
1426 gptDSCC0_instance.tick = prStart->u4Tick; // 1 us duration
1427 gptDSCC0_instance.gptimer_func = prStart->pfCallback;
1428 gptDSCC0_instance.parameter = prStart->vPara;
1429 gptDSCC0_running = KAL_TRUE;
1430
1431#if defined(__FPGA__)
1432 if(0x20160617 == drv_gpt_get_version())//Check GPT version is 0x20160617
1433 {
1434 gptDSCC0_instance.tick = gptDSCC0_instance.tick/10;
1435 }
1436#endif
1437 drv_gpt_set_timer(DRV_GPT_DSP_TIMER, gptDSCC0_instance.tick, MDGPT_CTRL_MODE_ONESHOT);
1438 drv_gpt_start_timer(DRV_GPT_DSP_TIMER);
1439 kal_hrt_give_itc_lock(KAL_ITC_GPT_DSCC1);
1440 return STATUS_OK;
1441 }
1442 //break; we can return in any case.
1443 case SGPT_CMD_STOP:
1444
1445 kal_hrt_take_itc_lock(KAL_ITC_GPT_DSCC1, KAL_INFINITE_WAIT);
1446
1447 drv_gpt_stop_timer(DRV_GPT_DSP_TIMER);
1448 gptDSCC0_running = KAL_FALSE;
1449 gpt_clk_operation(KAL_TRUE, DRV_GPT_DSP_TIMER);
1450
1451 kal_hrt_give_itc_lock(KAL_ITC_GPT_DSCC1);
1452
1453 return STATUS_OK;
1454
1455 case SGPT_CMD_RUNNING_TICK:
1456 {
1457 SGPT_CTRL_START_T *prStart;
1458 prStart = &(data->rSGPTStart);
1459
1460 prStart->u4Tick = drv_gpt_get_data(DRV_GPT_DSP_TIMER);
1461
1462 return STATUS_OK;
1463 }
1464 default:
1465 ASSERT(gpt_unknown_command);
1466 return STATUS_INVALID_CMD;
1467 }
1468 }
1469
1470 else if(DCL_GPT_9_IS_HANDLE_MAGIC(handle))
1471 {
1472 ASSERT( KAL_TRUE == gptDSCC1_used );
1473 switch(cmd)
1474 {
1475 case SGPT_CMD_START:
1476 {
1477 SGPT_CTRL_START_T *prStart;
1478 prStart = &(data->rSGPTStart);
1479
1480 //test if callback function is null.
1481 ASSERT( NULL!=prStart->pfCallback );
1482
1483 kal_hrt_take_itc_lock(KAL_ITC_GPT_DSCC2, KAL_INFINITE_WAIT);
1484
1485 if( KAL_TRUE == gptDSCC1_running )
1486 {
1487 drv_gpt_stop_timer(DRV_GPT_9_TIMER);
1488 }
1489 else
1490 {
1491 gpt_clk_operation(KAL_FALSE, DRV_GPT_9_TIMER);
1492 }
1493
1494 gptDSCC1_instance.tick = prStart->u4Tick; // 1 us duration
1495 gptDSCC1_instance.gptimer_func = prStart->pfCallback;
1496 gptDSCC1_instance.parameter = prStart->vPara;
1497 gptDSCC1_running = KAL_TRUE;
1498
1499#if defined(__FPGA__)
1500 if(0x20160617 == drv_gpt_get_version())//Check GPT version is 0x20160617
1501 {
1502 gptDSCC1_instance.tick = gptDSCC1_instance.tick/10;
1503 }
1504#endif
1505 drv_gpt_set_timer(DRV_GPT_9_TIMER, gptDSCC1_instance.tick, MDGPT_CTRL_MODE_ONESHOT);
1506 drv_gpt_start_timer(DRV_GPT_9_TIMER);
1507 kal_hrt_give_itc_lock(KAL_ITC_GPT_DSCC2);
1508
1509 return STATUS_OK;
1510 }
1511 //break; we can return in any case.
1512 case SGPT_CMD_STOP:
1513
1514 kal_hrt_take_itc_lock(KAL_ITC_GPT_DSCC2, KAL_INFINITE_WAIT);
1515
1516 drv_gpt_stop_timer(DRV_GPT_9_TIMER);
1517 gptDSCC1_running = KAL_FALSE;
1518 gpt_clk_operation(KAL_TRUE, DRV_GPT_9_TIMER);
1519 kal_hrt_give_itc_lock(KAL_ITC_GPT_DSCC2);
1520 return STATUS_OK;
1521
1522 case SGPT_CMD_RUNNING_TICK:
1523 {
1524 SGPT_CTRL_START_T *prStart;
1525 prStart = &(data->rSGPTStart);
1526
1527 prStart->u4Tick = drv_gpt_get_data(DRV_GPT_9_TIMER);
1528
1529 return STATUS_OK;
1530 }
1531 default:
1532 ASSERT(gpt_unknown_command);
1533 return STATUS_INVALID_CMD;
1534 }
1535 }
1536
1537#endif
1538 else
1539 {
1540 kal_uint32 Error_DCL_HANDLE = 0;
1541 //if assert happen here, that means DCL_HANDLE pass in is wrong!
1542 ASSERT(Error_DCL_HANDLE);
1543 return DCL_HANDLE_INVALID;
1544 }
1545}
1546
1547/*-----------------------------------------------------------------------
1548
1549* FUNCTION
1550* DclSGPT_Close
1551*
1552* DESCRIPTION
1553* This function is to close the SW GPT module.
1554*
1555* PARAMETERS
1556* handle - hanlde previous got from DclSGPT_Open()
1557*
1558* RETURNS
1559* DCL_STATUS_OK - successfully close the SW GPT module.
1560* DCL_STATUS_fail - fails to close the SW GPT module.
1561*
1562*------------------------------------------------------------------------*/
1563
1564DCL_STATUS DclSGPT_Close(DCL_HANDLE *handle)
1565{
1566 DCL_UINT8 gpt_handle;
1567 gpt_handle=DCL_GPT_CB_GET_DEV(*handle) & 0x1F;
1568
1569 if(DCL_GPT_CB_IS_HANDLE_MAGIC(*handle))
1570 {
1571 // Make sure the GPT handle is activated
1572 ASSERT(gptCB_used[gpt_handle]);
1573
1574 kal_take_spinlock(gpt_10ms_spinlock, KAL_INFINITE_WAIT);
1575
1576 if( gptCB_status & (1<<gpt_handle) )
1577 {
1578 GPTCB_StopItem(gpt_handle);
1579 }
1580
1581 gptCB_used[gpt_handle] = 0;
1582 gptCB_users--;
1583
1584 gpt_clk_operation(KAL_TRUE, DRV_GPT_CALLBACK_TIMER);
1585
1586 kal_give_spinlock(gpt_10ms_spinlock);
1587
1588 *handle = EMPTY_GPT_CB_HANDLER;
1589 return STATUS_OK;
1590 }
1591 #if defined(__MD93__)
1592 if(DCL_GPT_DSP_IS_HANDLE_MAGIC(*handle))
1593 {
1594 kal_uint32 items = 0;
1595 kal_hrt_take_itc_lock(KAL_ITC_GPT_DRIVER, KAL_INFINITE_WAIT);
1596
1597 drv_gpt_stop_timer(DRV_GPT_DSP_TIMER);
1598
1599 if( KAL_TRUE == gptDSP_running )
1600 {
1601 for(items = 0; items < DSP_USER_NUM; items++)
1602 {
1603 gptDSP_instance[items].execute = KAL_FALSE;
1604 }
1605 gptDSP_running = KAL_FALSE;
1606 }
1607 gptDSP_used = KAL_FALSE;
1608 *handle = EMPTY_GPT_CB_HANDLER;
1609 gpt_clk_operation_wo_itc(KAL_TRUE, DRV_GPT_DSP_TIMER);
1610
1611 kal_hrt_give_itc_lock(KAL_ITC_GPT_DRIVER);
1612
1613 return STATUS_OK;
1614 }
1615 #endif
1616 else if(DCL_GPT_CBUS_IS_HANDLE_MAGIC(*handle))
1617 {
1618 kal_take_spinlock(gpt_us_spinlock, KAL_INFINITE_WAIT);
1619
1620 if( KAL_TRUE == gptCBUS_running )
1621 {
1622 drv_gpt_stop_timer(DRV_GPT_CBUS_TIMER);
1623 gptCBUS_running = KAL_FALSE;
1624 }
1625 gptCBUS_used = KAL_FALSE;
1626 *handle = EMPTY_GPT_CB_HANDLER;
1627 gpt_clk_operation(KAL_TRUE, DRV_GPT_CBUS_TIMER);
1628
1629 kal_give_spinlock(gpt_us_spinlock);
1630
1631 return STATUS_OK;
1632 }
1633#if defined(__MD93__) || defined(__MD95__)
1634 else if(DCL_GPT_C2KOS_IS_HANDLE_MAGIC(*handle))
1635 {
1636 kal_take_spinlock(gpt_6_spinlock, KAL_INFINITE_WAIT);
1637
1638 if( KAL_TRUE == gptC2KOS_running )
1639 {
1640 drv_gpt_stop_timer(DRV_GPT_6_TIMER);
1641 gptC2KOS_running = KAL_FALSE;
1642 }
1643 gptC2KOS_used = KAL_FALSE;
1644 *handle = EMPTY_GPT_CB_HANDLER;
1645 gpt_clk_operation(KAL_TRUE, DRV_GPT_6_TIMER);
1646
1647 kal_give_spinlock(gpt_6_spinlock);
1648
1649 return STATUS_OK;
1650 }
1651#elif defined(__MD97__)
1652 else if(DCL_GPT_6_IS_HANDLE_MAGIC(*handle))
1653 {
1654 kal_hrt_take_itc_lock(KAL_ITC_GPT_DPCOPRO, KAL_INFINITE_WAIT);
1655 if( KAL_TRUE == gptDPCOPRO_running )
1656 {
1657 drv_gpt_stop_timer(DRV_GPT_6_TIMER);
1658 gptDPCOPRO_running = KAL_FALSE;
1659 }
1660 gptDPCOPRO_used = KAL_FALSE;
1661 *handle = EMPTY_GPT_CB_HANDLER;
1662 gpt_clk_operation(KAL_TRUE, DRV_GPT_6_TIMER);
1663 kal_hrt_give_itc_lock(KAL_ITC_GPT_DPCOPRO);
1664 return STATUS_OK;
1665 }
1666#endif
1667 else if(DCL_GPT_C2KAR_IS_HANDLE_MAGIC(*handle))
1668 {
1669 if( KAL_TRUE == gptC2KAR_running )
1670 {
1671 drv_gpt_stop_timer(DRV_GPT_C2KAR_TIMER);
1672 gptC2KAR_running = KAL_FALSE;
1673 }
1674 gptC2KAR_used = KAL_FALSE;
1675 *handle = EMPTY_GPT_CB_HANDLER;
1676 gpt_clk_operation(KAL_TRUE, DRV_GPT_C2KAR_TIMER);
1677
1678 return STATUS_OK;
1679 }
1680 else if(DCL_GPT_LOGGING_IS_HANDLE_MAGIC(*handle))
1681 {
1682 kal_take_spinlock(gpt_logging_spinlock, KAL_INFINITE_WAIT);
1683
1684 if( KAL_TRUE == gptLogging_running )
1685 {
1686 drv_gpt_stop_timer(DRV_GPT_LOGGING_TIMER);
1687 gptLogging_running = KAL_FALSE;
1688 }
1689 gptLogging_used = KAL_FALSE;
1690 *handle = EMPTY_GPT_CB_HANDLER;
1691 gpt_clk_operation(KAL_TRUE, DRV_GPT_LOGGING_TIMER);
1692
1693 kal_give_spinlock(gpt_logging_spinlock);
1694
1695 return STATUS_OK;
1696 }
1697#if defined(__MD93__) || defined(__MD95__)
1698 else if(DCL_GPT_3_IS_HANDLE_MAGIC(*handle))
1699 {
1700 gpt_inst *iter;
1701
1702 kal_take_spinlock(gpt_3_spinlock, KAL_INFINITE_WAIT);
1703
1704 iter = gpt_DEBUG_head.next;
1705 while(NULL!=iter)
1706 {
1707 if(iter == &gpt_DEBUG_items[gpt_handle])
1708 {
1709 GPT_DEBUG_Stop(gpt_handle);
1710 break;
1711 }
1712 }
1713 gpt_DEBUG_used[gpt_handle] = 0;
1714 gpt_DEBUG_users--;
1715 *handle = EMPTY_GPT_CB_HANDLER;
1716 gpt_clk_operation(KAL_TRUE, DRV_GPT_3_TIMER);
1717
1718 kal_give_spinlock(gpt_3_spinlock);
1719
1720 return STATUS_OK;
1721 }
1722#endif
1723 #if !defined(__MD93__)
1724 else if(DCL_GPT_DSP_IS_HANDLE_MAGIC(*handle))
1725 {
1726 kal_hrt_take_itc_lock(KAL_ITC_GPT_DSCC1, KAL_INFINITE_WAIT);
1727 if( KAL_TRUE == gptDSCC0_running )
1728 {
1729 drv_gpt_stop_timer(DRV_GPT_DSP_TIMER);
1730 gptDSCC0_running = KAL_FALSE;
1731 }
1732 gptDSCC0_used = KAL_FALSE;
1733 *handle = EMPTY_GPT_CB_HANDLER;
1734 gpt_clk_operation(KAL_TRUE, DRV_GPT_DSP_TIMER);
1735 kal_hrt_give_itc_lock(KAL_ITC_GPT_DSCC1);
1736 return STATUS_OK;
1737 }
1738 else if(DCL_GPT_9_IS_HANDLE_MAGIC(*handle))
1739 {
1740 kal_hrt_take_itc_lock(KAL_ITC_GPT_DSCC2, KAL_INFINITE_WAIT);
1741 if( KAL_TRUE == gptDSCC1_running )
1742 {
1743 drv_gpt_stop_timer(DRV_GPT_9_TIMER);
1744 gptDSCC1_running = KAL_FALSE;
1745 }
1746 gptDSCC1_used = KAL_FALSE;
1747 *handle = EMPTY_GPT_CB_HANDLER;
1748 gpt_clk_operation(KAL_TRUE, DRV_GPT_9_TIMER);
1749 kal_hrt_give_itc_lock(KAL_ITC_GPT_DSCC2);
1750 return STATUS_OK;
1751 }
1752
1753#endif
1754 else
1755 {
1756 kal_uint32 Invalid_DCL_GPT_HANDLE = 0;
1757 ASSERT(Invalid_DCL_GPT_HANDLE);
1758 return STATUS_INVALID_DCL_HANDLE;
1759 }
1760}
1761
1762
1763void gpt_clk_operation(kal_bool op, kal_uint32 num)
1764{
1765 kal_hrt_take_itc_lock(KAL_ITC_GPT_DRIVER, KAL_INFINITE_WAIT);
1766 if (KAL_TRUE == op) //clock off
1767 {
1768 gpt_clock_status &= ~(1<<num);
1769 if(0 == gpt_clock_status)
1770 {
1771 PDN_SET(PDN_MDGPTM_26M);
1772 MDGPTM_PDN_SET();
1773 }
1774 }
1775 else //clock on
1776 {
1777 if(0 == gpt_clock_status)
1778 {
1779 PDN_CLR(PDN_MDGPTM_26M);
1780 MDGPTM_PDN_CLR();
1781 }
1782 gpt_clock_status |= (1<<num);
1783 }
1784 kal_hrt_give_itc_lock(KAL_ITC_GPT_DRIVER);
1785}
1786
1787void gpt_clk_operation_wo_itc(kal_bool op, kal_uint32 num)
1788{
1789 if (KAL_TRUE == op) //clock off
1790 {
1791 gpt_clock_status &= ~(1<<num);
1792 if(0 == gpt_clock_status)
1793 {
1794 PDN_SET(PDN_MDGPTM_26M);
1795 MDGPTM_PDN_SET();
1796 }
1797 }
1798 else //clock on
1799 {
1800 if(0 == gpt_clock_status)
1801 {
1802 PDN_CLR(PDN_MDGPTM_26M);
1803 MDGPTM_PDN_CLR();
1804 }
1805 gpt_clock_status |= (1<<num);
1806 }
1807}
1808
1809/*-----------------------------------------------------------------------
1810
1811* FUNCTION
1812* GPTCB_StartItem
1813*
1814* DESCRIPTION
1815* GPT CB start a item.
1816*
1817* CALLS
1818*
1819* PARAMETERS
1820* handler = instance number
1821* tick = the delay(the unit is 10ms)
1822* gptimer_func = the callback function when the tick is reached.
1823* parameter = the parameter inputed into gptimer_func
1824*
1825* RETURNS
1826* KAL_TRUE, start item successfully
1827* KAL_FALSE, start item fail
1828*
1829* GLOBALS AFFECTED
1830* external_global
1831*------------------------------------------------------------------------*/
1832static kal_bool GPTCB_StartItem(DCL_HANDLE handler,kal_uint16 tick,void (*gptimer_func)(void *),void *parameter)
1833{
1834
1835 if (gptCB_status & (1<<handler))
1836 {
1837 return KAL_FALSE;
1838 }
1839
1840 //savedMask = SaveAndSetIRQMask();
1841
1842 gptCB_items[handler].tick = gptCB_ticks + tick;
1843 gptCB_items[handler].gptimer_func = gptimer_func;
1844 gptCB_items[handler].parameter = parameter;
1845
1846 if(0 == gptCB_status)
1847 {
1848 drv_gpt_start_timer(DRV_GPT_CALLBACK_TIMER);
1849 }
1850 gptCB_status |= (1<<handler);
1851
1852 //RestoreIRQMask(savedMask);
1853
1854 return KAL_TRUE;
1855}
1856
1857/*-----------------------------------------------------------------------
1858
1859* FUNCTION
1860* GPTCB_StopItem
1861*
1862* DESCRIPTION
1863* GPT CB stop a item.
1864*
1865* CALLS
1866*
1867* PARAMETERS
1868* handler = instance number
1869*
1870* RETURNS
1871* None
1872*
1873* GLOBALS AFFECTED
1874* external_global
1875*------------------------------------------------------------------------*/
1876static void GPTCB_StopItem(DCL_HANDLE handler)
1877{
1878 ASSERT(gptCB_used[handler]);
1879
1880 gptCB_status &= ~(1<<handler);
1881
1882 if(0==gptCB_status)
1883 {
1884 gptCB_ticks = 0;
1885 drv_gpt_stop_timer(DRV_GPT_CALLBACK_TIMER);
1886 gpt_clk_operation(KAL_TRUE, DRV_GPT_CALLBACK_TIMER);
1887 }
1888}
1889#if defined(__MD93__) || defined(__MD95__)
1890static void GPT_DEBUG_Insert(kal_uint32 indx, kal_uint32 tick, void (*fp)(void *) ,void *parameter)
1891{
1892 kal_uint32 elapsed, time; /* elapsed: current - start time; time: eariest time-out setting */
1893 gpt_inst *iter = gpt_DEBUG_head.next;
1894
1895 ASSERT( NULL!=fp );
1896 gpt_DEBUG_items[indx].gptimer_func = fp;
1897 gpt_DEBUG_items[indx].param = parameter;
1898
1899 //savedMask = SaveAndSetIRQMask();
1900
1901 elapsed = drv_gpt_get_data(DRV_GPT_3_TIMER);
1902 drv_gpt_stop_timer(DRV_GPT_3_TIMER);
1903
1904 if( (NULL == gpt_DEBUG_head.next))
1905 {
1906 gpt_DEBUG_head.next = &gpt_DEBUG_items[indx];
1907 time = tick;
1908 gpt_clk_operation(KAL_FALSE, DRV_GPT_3_TIMER);
1909 }
1910 else if((iter->ticks-elapsed) > tick)
1911 {
1912 gpt_DEBUG_items[indx].next = iter;
1913 gpt_DEBUG_head.next = &gpt_DEBUG_items[indx];
1914 iter->ticks -= elapsed + tick;
1915 time = tick;
1916 }
1917 else
1918 {
1919 time = iter->ticks - elapsed;
1920 tick -= time;
1921 iter->ticks = time;
1922 while( NULL != iter->next )
1923 {
1924 if(iter->next->ticks > tick)
1925 {
1926 gpt_DEBUG_items[indx].next = iter->next;
1927 gpt_DEBUG_items[indx].next->ticks -= tick;
1928 iter->next = &gpt_DEBUG_items[indx];
1929 break;
1930 }
1931 iter = iter->next;
1932 tick -= iter->ticks;
1933 }
1934 if(NULL == iter->next)
1935 {
1936 gpt_DEBUG_items[indx].next = NULL;
1937 iter->next = &gpt_DEBUG_items[indx];
1938 }
1939 }
1940 gpt_DEBUG_items[indx].ticks = tick;
1941
1942 //test if callback function is null.
1943 drv_gpt_set_timer(DRV_GPT_3_TIMER, time, MDGPT_CTRL_MODE_ONESHOT);
1944 drv_gpt_start_timer(DRV_GPT_3_TIMER);
1945
1946 //RestoreIRQMask(savedMask);
1947}
1948
1949/*-----------------------------------------------------------------------
1950* FUNCTION
1951* GPT_DEBUG_Stop
1952*
1953* DESCRIPTION
1954* Remove Debug Timer Instance from queue
1955*
1956* CALLS
1957*
1958* PARAMETERS
1959* indx = instance number
1960*
1961* RETURNS
1962* None
1963*
1964*------------------------------------------------------------------------*/
1965static void GPT_DEBUG_Stop(kal_uint32 indx)
1966{
1967 gpt_inst *iter = &gpt_DEBUG_head;
1968
1969 //savedMask = SaveAndSetIRQMask();
1970
1971 while( (iter->next!=&gpt_DEBUG_items[indx]) && (NULL!=iter->next) )
1972 {
1973 iter = iter->next;
1974 }
1975 ASSERT(NULL!=iter->next);
1976
1977 if(iter == &gpt_DEBUG_head)
1978 {
1979 kal_uint32 elapsed;
1980 elapsed = drv_gpt_get_data(DRV_GPT_3_TIMER);
1981 drv_gpt_stop_timer(DRV_GPT_3_TIMER);
1982 IRQClearInt(MDGPT_INTR_ID(DRV_GPT_3_TIMER));
1983
1984 gpt_DEBUG_head.next = gpt_DEBUG_items[indx].next;
1985 if(NULL != gpt_DEBUG_head.next)
1986 {
1987 gpt_DEBUG_head.next->ticks = gpt_DEBUG_head.next->ticks - elapsed + gpt_DEBUG_items[indx].ticks ;
1988 drv_gpt_set_timer(DRV_GPT_3_TIMER, gpt_DEBUG_head.next->ticks, MDGPT_CTRL_MODE_ONESHOT);
1989 drv_gpt_start_timer(DRV_GPT_3_TIMER);
1990 }
1991 else
1992 {
1993 gpt_clk_operation(KAL_TRUE, DRV_GPT_3_TIMER);
1994 }
1995 }
1996 else
1997 {
1998 if(NULL != gpt_DEBUG_items[indx].next)
1999 {
2000 gpt_DEBUG_items[indx].next->ticks += gpt_DEBUG_items[indx].ticks;
2001 }
2002 iter->next = iter->next->next;
2003 }
2004 gpt_DEBUG_items[indx].next = NULL;
2005 //RestoreIRQMask(savedMask);
2006}
2007#endif
2008/*-----------------------------------------------------------------------
2009* FUNCTION
2010* GPTCB_10MS_HISR
2011*
2012* DESCRIPTION
2013* GPT Callback HISR : 10ms
2014*
2015* CALLS
2016*
2017* PARAMETERS
2018* void
2019*
2020* RETURNS
2021* None
2022*
2023* GLOBALS AFFECTED
2024* external_global
2025*------------------------------------------------------------------------*/
2026DEVDRV_LS_INTSRAM_ROCODE void GPTCB_10MS_HISR(void)
2027{
2028 kal_uint8 index;
2029 kal_uint32 checkMask = 0xFFFFFFFF;
2030
2031 kal_take_spinlock(gpt_10ms_spinlock, KAL_INFINITE_WAIT);
2032
2033 gptCB_ticks++;
2034
2035 kal_give_spinlock(gpt_10ms_spinlock);
2036
2037 // Bit matched method to check if a GPT items is activated
2038 // Search whole GPT items
2039 for (index = 0; (index < MAX_GPT_ITEMS)&&(gptCB_status&checkMask); index++)
2040 {
2041 kal_take_spinlock(gpt_10ms_spinlock, KAL_INFINITE_WAIT);
2042 if( (gptCB_status & (1 << index)) && (gptCB_ticks >= gptCB_items[index].tick) )
2043 {
2044 gptCB_status &= ~(1<<index);
2045 kal_give_spinlock(gpt_10ms_spinlock);
2046 gptCB_items[index].gptimer_func(gptCB_items[index].parameter);
2047
2048 }
2049 else
2050 {
2051 kal_give_spinlock(gpt_10ms_spinlock);
2052 }
2053 checkMask ^= (1 << index);
2054 }
2055
2056
2057 kal_take_spinlock(gpt_10ms_spinlock, KAL_INFINITE_WAIT);
2058
2059 if (gptCB_status == 0)
2060 {
2061 // UT Test road test.
2062 gptCB_ticks = 0;
2063 drv_gpt_stop_timer(DRV_GPT_CALLBACK_TIMER);
2064 gpt_clk_operation(KAL_TRUE, DRV_GPT_CALLBACK_TIMER);
2065 }
2066 kal_give_spinlock(gpt_10ms_spinlock);
2067}
2068
2069
2070/*-----------------------------------------------------------------------
2071* FUNCTION
2072* GPTCB_Debug_HISR
2073*
2074* DESCRIPTION
2075* GPT Callback HISR : 1us
2076*
2077* CALLS
2078*
2079* PARAMETERS
2080* void
2081*
2082* RETURNS
2083* None
2084*
2085* GLOBALS AFFECTED
2086* external_global
2087*------------------------------------------------------------------------*/
2088#if defined(__MD93__) || defined(__MD95__)
2089void GPTCB_DEBUG_HISR(void)
2090{
2091// if(NULL != gpt_DEBUG_head.next->gptimer_func)
2092 {
2093 gpt_DEBUG_head.next->gptimer_func(gpt_DEBUG_head.next->param);
2094 }
2095#if !defined(ATEST_DRV_ENABLE) && !defined(DSPFNC_DSP_SWTRACER)
2096 ASSERT(0);
2097#endif /* !ATEST_DRV_ENABLE */
2098}
2099#else
2100void GPTCB_DEBUG_HISR(void)
2101{
2102 return;
2103}
2104#endif
2105/*-----------------------------------------------------------------------
2106* FUNCTION
2107* GPTCB_US_HISR
2108*
2109* DESCRIPTION
2110* GPT Callback HISR : 10ms
2111*
2112* CALLS
2113*
2114* PARAMETERS
2115* void
2116*
2117* RETURNS
2118* None
2119*
2120* GLOBALS AFFECTED
2121* external_global
2122*------------------------------------------------------------------------*/
2123#if !defined(__LP_SCHEDULE_HMU_RESCHEDULE__)
2124DEVDRV_LS_INTSRAM_ROCODE void GPTCB_US_HISR(void)
2125{
2126 kal_take_spinlock(gpt_us_spinlock, KAL_INFINITE_WAIT);
2127
2128 if( KAL_TRUE == gptCBUS_running )
2129 {
2130 gptCBUS_running = KAL_FALSE;
2131 gpt_clk_operation(KAL_TRUE, DRV_GPT_CBUS_TIMER);
2132
2133 kal_give_spinlock(gpt_us_spinlock);
2134 gptCBUS_instance.gptimer_func(gptCBUS_instance.parameter);
2135 }
2136 else
2137 {
2138 kal_give_spinlock(gpt_us_spinlock);
2139 }
2140
2141}
2142#endif
2143
2144#if defined(__MD93__) || defined(__MD95__)
2145
2146/*-----------------------------------------------------------------------
2147* FUNCTION
2148* GPTCB_C2KOS_HISR
2149*
2150* DESCRIPTION
2151* C2K GPT Callback HISR : 1us
2152*
2153* CALLS
2154*
2155* PARAMETERS
2156* void
2157*
2158* RETURNS
2159* None
2160*
2161* GLOBALS AFFECTED
2162* external_global
2163*------------------------------------------------------------------------*/
2164DEVDRV_LS_INTSRAM_ROCODE void GPTCB_C2KOS_HISR(void)
2165{
2166 kal_take_spinlock(gpt_6_spinlock, KAL_INFINITE_WAIT);
2167
2168 if( KAL_TRUE == gptC2KOS_running )
2169 {
2170 gptC2KOS_running = KAL_FALSE;
2171 gpt_clk_operation(KAL_TRUE, DRV_GPT_6_TIMER);
2172
2173 kal_give_spinlock(gpt_6_spinlock);
2174 }
2175 else
2176 {
2177 kal_give_spinlock(gpt_6_spinlock);
2178 ASSERT(0);
2179 }
2180}
2181#else
2182DEVDRV_LS_INTSRAM_ROCODE void GPTCB_C2KOS_HISR(void)
2183{
2184 return;
2185}
2186#endif
2187
2188/*-----------------------------------------------------------------------
2189* FUNCTION
2190* GPTCB_US_HISR
2191*
2192* DESCRIPTION
2193* GPT Callback HISR : 10ms
2194*
2195* CALLS
2196*
2197* PARAMETERS
2198* void
2199*
2200* RETURNS
2201* None
2202*
2203* GLOBALS AFFECTED
2204* external_global
2205*------------------------------------------------------------------------*/
2206DEVDRV_LS_INTSRAM_ROCODE void GPTCB_LOGGING_HISR(void)
2207{
2208 kal_take_spinlock(gpt_logging_spinlock, KAL_INFINITE_WAIT);
2209
2210 if( KAL_TRUE == gptLogging_running )
2211 {
2212 gptLogging_running = KAL_FALSE;
2213 gpt_clk_operation(KAL_TRUE, DRV_GPT_LOGGING_TIMER);
2214
2215 kal_give_spinlock(gpt_logging_spinlock);
2216 gptLogging_instance.gptimer_func(gptLogging_instance.parameter);
2217 }
2218 else
2219 {
2220 kal_give_spinlock(gpt_logging_spinlock);
2221 }
2222}
2223
2224#else /* else of !defined(DRV_GPT_OFF) */
2225
2226DCL_STATUS DclSGPT_Initialize(void)
2227{
2228 return STATUS_UNSUPPORTED;
2229}
2230
2231DCL_HANDLE DclSGPT_Open(DCL_DEV dev, DCL_FLAGS flags)
2232{
2233 return STATUS_UNSUPPORTED;
2234}
2235
2236DCL_STATUS DclSGPT_ReadData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN *buf_len, DCL_OPTIONS options)
2237{
2238 return STATUS_UNSUPPORTED;
2239}
2240
2241DCL_STATUS DclSGPT_WriteData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN *buf_len, DCL_OPTIONS options)
2242{
2243 return STATUS_UNSUPPORTED;
2244}
2245
2246DCL_STATUS DclSGPT_Configure(DCL_HANDLE handle, DCL_CONFIGURE_T *configure)
2247{
2248 return STATUS_UNSUPPORTED;
2249}
2250
2251DCL_STATUS DclSGPT_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, PFN_DCL_CALLBACK callback)
2252{
2253 return STATUS_UNSUPPORTED;
2254}
2255
2256DCL_STATUS DclSGPT_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
2257{
2258 return STATUS_UNSUPPORTED;
2259}
2260
2261DCL_STATUS DclSGPT_Close(DCL_HANDLE *handle)
2262{
2263 return STATUS_UNSUPPORTED;
2264}
2265
2266DCL_STATUS DclFGPT_Initialize(void)
2267{
2268 return STATUS_UNSUPPORTED;
2269}
2270
2271DCL_HANDLE DclFGPT_Open(DCL_DEV dev, DCL_FLAGS flags)
2272{
2273 return STATUS_UNSUPPORTED;
2274}
2275
2276DCL_STATUS DclFGPT_ReadData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN *buf_len, DCL_OPTIONS options)
2277{
2278 return STATUS_UNSUPPORTED;
2279}
2280
2281DCL_STATUS DclFGPT_WriteData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN *buf_len, DCL_OPTIONS options)
2282{
2283 return STATUS_UNSUPPORTED;
2284}
2285
2286DCL_STATUS DclFGPT_Configure(DCL_HANDLE handle, DCL_CONFIGURE_T *configure)
2287{
2288 return STATUS_UNSUPPORTED;
2289}
2290
2291DCL_STATUS DclFGPT_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, PFN_DCL_CALLBACK callback)
2292{
2293 return STATUS_UNSUPPORTED;
2294}
2295
2296DCL_STATUS DclFGPT_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
2297{
2298 return STATUS_UNSUPPORTED;
2299}
2300
2301DCL_STATUS DclFGPT_Close(DCL_HANDLE handle)
2302{
2303 return STATUS_UNSUPPORTED;
2304}
2305#if defined (__ESL_COSIM_LTE__) || defined(__MASE__)
2306#if defined(__MD93__) || defined(__MD95__)
2307void GPTCB_DEBUG_HISR(void)
2308{
2309}
2310#endif
2311
2312void GPTCB_10MS_HISR(void)
2313{
2314}
2315
2316void GPTCB_US_HISR(void)
2317{
2318}
2319
2320void GPTCB_LOGGING_HISR(void)
2321{
2322}
2323
2324void LITEGPT_ETMR_HISR(void)
2325{
2326}
2327
2328void GPTCB_C2KOS_HISR(void)
2329{
2330}
2331
2332#endif /* __ESL_COSIM_LTE__ */
2333#endif /* end of else of !defined(DRV_GPT_OFF) */
2334
2335DCL_HANDLE DclHGPT_Open(DCL_DEV dev, DCL_FLAGS flags){return STATUS_UNSUPPORTED;}
2336DCL_STATUS DclHGPT_Control(DCL_HANDLE handle, HGPT_CMD cmd, HGPT_CTRL *data){return STATUS_UNSUPPORTED;}
2337DCL_STATUS DclHGPT_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, PFN_DCL_CALLBACK callback){return STATUS_UNSUPPORTED;}
2338DCL_STATUS DclHGPT_Close(DCL_HANDLE handle){return STATUS_UNSUPPORTED;}
2339
2340//#endif
2341