| /***************************************************************************** |
| * Copyright Statement: |
| * -------------------- |
| * This software is protected by Copyright and the information contained |
| * herein is confidential. The software may not be copied and the information |
| * contained herein may not be used or disclosed except with the written |
| * permission of MediaTek Inc. (C) 2012 |
| * |
| * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES |
| * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") |
| * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON |
| * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, |
| * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. |
| * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE |
| * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR |
| * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH |
| * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO |
| * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S |
| * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. |
| * |
| * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE |
| * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, |
| * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, |
| * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO |
| * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. |
| * |
| * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE |
| * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF |
| * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND |
| * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER |
| * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). |
| * |
| *****************************************************************************/ |
| |
| /******************************************************************************* |
| * Filename: |
| * --------- |
| * drv_gpt.c |
| * |
| * Project: |
| * -------- |
| * TATAKA |
| * |
| * Description: |
| * ------------ |
| * Low level GPT driver |
| * |
| * Author: |
| * ------- |
| * ------- |
| * |
| * ========================================================================== |
| * $Log$ |
| * |
| * 07 02 2019 yaoyong.ju |
| * [MOLY00418290] [VMOLY]Remove IRQ_Register_LISR() and IRQSensitivity() From IRQ Initialization Source Code |
| * .Remove IRQ_Restier_LISR and IRQSensitivity API in GPT |
| * |
| * 04 26 2019 yaoyong.ju |
| * [MOLY00399544] [MT6297][Apollo][PreSQC][MP0.5][HQ][MTBF][Lab][Ericsson][ErrorTimes:1][1][core2,vpe1,tc2(vpe7)]Assert fail: drv_gpt.c 287 - (LISR)GPT_DSCC0_Lisr for |
| * . |
| * 1.Remove the debug info |
| * 2.Remove unused code |
| * |
| * 03 25 2019 yaoyong.ju |
| * [MOLY00390408] [MT6297][Apollo][PreSQC][MP0.5][NVIOT][Nokia][Oulu][4G][Overnight]: Assert fail: nicc_ctrl.c 317 - USBCORE |
| * .Add the debug info for the MOLY |
| * |
| * 05 04 2017 way.chen |
| * [MOLY00246761] [UMOLYA] Replace PDN API with OF API, Request by PDN owner(Devin ) |
| * Remove 26M on/off API. |
| * |
| * 07 06 2016 way.chen |
| * [MOLY00185478] [UMOLYA] Check in 93 serial GPT driver |
| * Add 26M clock operation. |
| * |
| * 06 20 2016 way.chen |
| * [MOLY00185478] [UMOLYA] Check in 93 serial GPT driver |
| * Check in 93 GPT driver. |
| * |
| * 01 06 2016 way.chen |
| * [MOLY00156138] [UMOLY] Patch GPT driver for U4G FPGA |
| * Patch GPT Driver for U4G FPGA, the FPGA Start Version is 20151231_u4g_ltel2_elbrus_vivado_2015. |
| * |
| * 12 10 2013 chin-chieh.hung |
| * [MOLY00049464] [Driver][GPT] Add debug GPT, request by MS Lin |
| * Add Debug GPT APIs |
| * |
| * 08 26 2013 chin-chieh.hung |
| * [MOLY00011352] [Driver] Update for common devdrv driver |
| * remove compiling warning |
| * |
| * 07 03 2013 chin-chieh.hung |
| * [MOLY00027330] [ARM7toMOLY] ARM7 Build/SYSGEN/Functions Update to TRUNK |
| * . |
| * |
| * 05 13 2013 chin-chieh.hung |
| * [MOLY00013348] [MT6290 Bring-up] Basic Platform Support |
| * MT6290E1_FristCall Branch sync back to MOLY Trunk |
| * |
| * 04 28 2013 chin-chieh.hung |
| * [MOLY00013021] [MT6290 PO admit] Move the LISR context to HISR context |
| * LISR 2 HISR support, driver part |
| * |
| * 04 23 2013 chin-chieh.hung |
| * [MOLY00013021] [MT6290 PO admit] Move the LISR context to HISR context |
| * MOLY LISR2HISR, Driver part |
| ****************************************************************************/ |
| |
| #include "drv_features_gpt.h" |
| #include "drv_comm.h" |
| |
| #include "drv_gpt.h" |
| #include "intrCtrl.h" |
| |
| #include "dcl.h" |
| #include "kal_general_types.h" |
| #include "kal_public_api.h" |
| #include "sync_data.h" |
| #if !defined(DRV_GPT_OFF) |
| |
| /***************************************************************************** |
| * SYMBOL Definition * |
| *****************************************************************************/ |
| |
| |
| /***************************************************************************** |
| * Global/External Variable * |
| *****************************************************************************/ |
| static PFN_DCL_CALLBACK pfHGPTCallback[DRV_GPT_TOTAL_COUNTER]; |
| static DCL_EVENT eHGPTEvent[DRV_GPT_TOTAL_COUNTER]; |
| |
| /***************************************************************************** |
| * function declaration * |
| *****************************************************************************/ |
| //function declaration. |
| |
| |
| |
| /***************************************************************************** |
| * LISR/HISR/Callback Functions * |
| *****************************************************************************/ |
| static void drv_default_callback(DCL_EVENT event) |
| { |
| kal_uint32 ASSERT_IN_GPT_DEFAULT_CALLBACK = 0; |
| ASSERT(ASSERT_IN_GPT_DEFAULT_CALLBACK); |
| return; |
| } |
| |
| /***************************************************************************** |
| * Basic Driver Implementation * |
| *****************************************************************************/ |
| |
| /*-----------------------------------------------------------------------* |
| * FUNCTION |
| * drv_gpt_lisr |
| * |
| * DESCRIPTION |
| * GPT interrupt handler (LISR) |
| * |
| * CALLS |
| * It is called when GPT interrupt is coming |
| * |
| * PARAMETERS |
| * None |
| * |
| * RETURNS |
| * None |
| * |
| * GLOBALS AFFECTED |
| * external_global |
| *------------------------------------------------------------------------*/ |
| void drv_gpt_lisr(kal_uint32 v) |
| { |
| ASSERT(MDGPT_INTR_ID(DRV_GPT_BASE_COUNTER_NUM) <= v && v <= MDGPT_INTR_ID(DRV_GPT_TOTAL_COUNTER)); |
| pfHGPTCallback[MDGPT_INTR_ID2TIMER(v)-1](eHGPTEvent[MDGPT_INTR_ID2TIMER(v)-1]); |
| } |
| |
| /*-----------------------------------------------------------------------* |
| * FUNCTION |
| * drv_gpt_reset |
| * |
| * DESCRIPTION |
| * This function is to reset the hardware GPT module. |
| * |
| * PARAMETERS |
| * None |
| * |
| * RETURNS |
| * DCL_STATUS_OK |
| * |
| *------------------------------------------------------------------------*/ |
| void drv_gpt_reset(void) |
| { |
| kal_uint32 i; |
| for(i = DRV_GPT_BASE_COUNTER_NUM; i <= DRV_GPT_TOTAL_COUNTER; i++) |
| { |
| DRV_WriteReg32(MDGPT_CTRL_REG(i), 0); |
| DRV_WriteReg32(MDGPT_CNT_REG(i), 0xFFFFF); |
| DRV_WriteReg32(MDGPT_PSR_REG(i), 0); |
| IRQClearInt(MDGPT_INTR_ID(i)); |
| |
| pfHGPTCallback[i-1] = drv_default_callback; |
| //IRQUnmask(MDGPT_INTR_ID(i)); |
| } |
| } |
| |
| /*-----------------------------------------------------------------------* |
| * FUNCTION |
| * drv_gpt_set_timer |
| * |
| * DESCRIPTION |
| * This function is to configure the gpt timer. |
| * |
| * PARAMETERS |
| * None |
| * |
| * RETURNS |
| * None |
| * |
| *------------------------------------------------------------------------*/ |
| void drv_gpt_set_timer(kal_uint32 num, kal_uint32 time, kal_uint32 mode) |
| { |
| ASSERT( (DRV_GPT_BASE_COUNTER_NUM <= num) && (num <= DRV_GPT_TOTAL_COUNTER) && (time <= 0xFFFFFFFUL) ); |
| DRV_WriteReg32(MDGPT_CNT_REG(num), time); |
| |
| mode &= MDGPT_CTRL_MODE_REPEAT | MDGPT_CTRL_MODE_ONESHOT; |
| |
| DRV_WriteReg32_NPW(MDGPT_CTRL_REG(num), mode); //1<<1 enable timer |
| } |
| |
| /*-----------------------------------------------------------------------* |
| * FUNCTION |
| * drv_gpt_get_data |
| * |
| * DESCRIPTION |
| * This function is to get the current data value. |
| * |
| * PARAMETERS |
| * None |
| * |
| * RETURNS |
| * None |
| * |
| *------------------------------------------------------------------------*/ |
| kal_uint32 drv_gpt_get_data(kal_uint32 num) |
| { |
| ASSERT( (DRV_GPT_BASE_COUNTER_NUM <= num) && (num <= DRV_GPT_TOTAL_COUNTER)); |
| return DRV_Reg32(MDGPT_DATA_REG(num)); |
| } |
| |
| void drv_gpt_set_data(kal_uint32 num, kal_uint32 time) |
| { |
| ASSERT( (DRV_GPT_BASE_COUNTER_NUM <= num) && (num <= DRV_GPT_TOTAL_COUNTER) && (time <= 0xFFFFFFFUL) ); |
| DRV_WriteReg32(MDGPT_CNT_REG(num), time); |
| } |
| |
| /*-----------------------------------------------------------------------* |
| * FUNCTION |
| * drv_gpt_start_timer |
| * |
| * DESCRIPTION |
| * This function is to start the gpt timer. |
| * |
| * PARAMETERS |
| * None |
| * |
| * RETURNS |
| * None |
| * |
| *------------------------------------------------------------------------*/ |
| void drv_gpt_start_timer(kal_uint32 num) |
| { |
| unsigned int timer_status; |
| |
| ASSERT( (num >= DRV_GPT_BASE_COUNTER_NUM) && (DRV_GPT_TOTAL_COUNTER >= num) ); |
| |
| timer_status = DRV_Reg32(MDGPT_CTRL_REG(num)); |
| |
| if( timer_status & MDGPT_CTRL_MODE_ENABLE ){ |
| //ASSERT(0); |
| return; |
| } |
| DRV_WriteReg32_NPW(MDGPT_CTRL_REG(num), timer_status | MDGPT_CTRL_MODE_ENABLE); |
| Data_Sync_Barrier(); |
| } |
| |
| /*-----------------------------------------------------------------------* |
| * FUNCTION |
| * drv_gpt_stop_timer |
| * |
| * DESCRIPTION |
| * This function is to start the gpt timer. |
| * |
| * PARAMETERS |
| * None |
| * |
| * RETURNS |
| * None |
| * |
| *------------------------------------------------------------------------*/ |
| void drv_gpt_stop_timer(kal_uint32 num) |
| { |
| unsigned int timer_status; |
| |
| ASSERT( (num >= DRV_GPT_BASE_COUNTER_NUM) && (DRV_GPT_TOTAL_COUNTER >= num) ); |
| |
| timer_status = DRV_Reg32(MDGPT_CTRL_REG(num)); |
| |
| DRV_WriteReg32_NPW(MDGPT_CTRL_REG(num), timer_status & (~MDGPT_CTRL_MODE_ENABLE)); |
| Data_Sync_Barrier(); |
| } |
| |
| kal_uint32 drv_gpt_get_version(void) |
| { |
| return DRV_Reg32(MDGPT_BASE); |
| } |
| |
| #if 0 |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| /* under construction !*/ |
| #endif |
| |
| #else /*!defined(DRV_GPT_OFF)*/ |
| |
| #endif /*!defined(DRV_GPT_OFF)*/ |
| |
| void startSystemTimer(void){ |
| IRQUnmask(MDGPT_INTR_ID(DRV_GPT_SYSTEM_TIMER)); |
| drv_gpt_start_timer(DRV_GPT_SYSTEM_TIMER); |
| } |
| |