📄 pwm.c
字号:
/*****************************************************************************
* 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) 2005
*
* 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:
* ---------
* pwm.c
*
* Project:
* --------
* Maui_Software
*
* Description:
* ------------
* This Module defines the PWM driver.
*
* Author:
* -------
* -------
*
*============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
*
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*============================================================================
****************************************************************************/
#include "drv_comm.h"
#include "reg_base.h"
#include "pwm_hw.h"
#include "pwm_sw.h"
#include "drvpdn.h"
#include "custom_hw_default.h"
#include "uart_sw.h"
#include "swdbg_sw.h"
static kal_uint8 PWM1_LEVEL_SAVE; /*for MMI usage*/
static kal_uint8 PWM2_LEVEL_SAVE; /*for MMI usage*/
static kal_uint32 PWM1_FRE_SAVE; /*for MMI usage*/
static kal_uint32 PWM2_FRE_SAVE; /*for MMI usage*/
static kal_uint8 PWM1_DUTY_SAVE; /*for MMI usage*/
static kal_uint8 PWM2_DUTY_SAVE; /*for MMI usage*/
#ifdef MTK_SLEEP_ENABLE
static kal_uint8 PWM1_PDNhandle, PWM2_PDNhandle;
#endif
/*
* FUNCTION
* PWM_Init
*
* DESCRIPTION
* PWM initial function
*
* CALLS
* It is called before access the PWM.
*
* PARAMETERS
* Clock: pwmclk_1MHZ,
* pwmclk_2MHZ,
* pwmclk_4MHZ,
* pwmclk_8MHZ
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* external_global
*/
void PWM_Init(PWMClock_SEL clk_sel,PWMClock_DIV Clock_div)
{
/*clk_sel only actived in MT6205B or later*/
kal_uint16 tmp;
#ifdef MTK_SLEEP_ENABLE
PWM1_PDNhandle = L1SM_GetHandle();
#endif
tmp = DRV_Reg(PWM1_CTRL);
switch(Clock_div)
{
case pwmclk_1MHZ:
tmp |= PWM_CTRL_CLK_1;
break;
case pwmclk_2MHZ:
tmp |= PWM_CTRL_CLK_2;
break;
case pwmclk_4MHZ:
tmp |= PWM_CTRL_CLK_4;
break;
case pwmclk_8MHZ:
tmp |= PWM_CTRL_CLK_8;
break;
}
#if ( (defined(MT6205B))||defined(MT6226M) || (defined(MT6218)) || (defined(MT6218B))|| (defined(MT6219))||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227)) )
switch(clk_sel)
{
case pwmclk_13M:
tmp &= ~PWM_CTRL_CLKSEL;
break;
case pwmclk_32k:
tmp |= PWM_CTRL_CLKSEL;
break;
default:
break;
}
#endif /*MT6218,MT6205B, MT6218B, MT6219, MT6217, MT6228, MT6229 */
DRV_WriteReg(PWM1_CTRL,tmp);
}
/*level = 1~5, level = 0, close PWM*/
void PWM_level(kal_uint8 level)
{
if (level > 5)
ASSERT(0);
PWM1_LEVEL_SAVE = level;
if (level)
{
PWM1_Configure(PWM1_Level_Info[level-1][0],PWM1_Level_Info[level-1][1]);
PWM1_Start();
}
else
{
PWM1_Stop();
}
}
#if ( (defined(MT6205B))||defined(MT6226M) || (defined(MT6218))|| (defined(MT6218B)) || (defined(MT6219))||(defined(MT6217)))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))
void PWM2_Init(PWMClock_SEL clk_sel,PWMClock_DIV Clock_div)
{
/*clk_sel only actived in MT6205B or later*/
kal_uint16 tmp;
#ifdef MTK_SLEEP_ENABLE
PWM2_PDNhandle = L1SM_GetHandle();
#endif
tmp = DRV_Reg(PWM2_CTRL);
switch(Clock_div)
{
case pwmclk_1MHZ:
tmp |= PWM_CTRL_CLK_1;
break;
case pwmclk_2MHZ:
tmp |= PWM_CTRL_CLK_2;
break;
case pwmclk_4MHZ:
tmp |= PWM_CTRL_CLK_4;
break;
case pwmclk_8MHZ:
tmp |= PWM_CTRL_CLK_8;
break;
}
switch(clk_sel)
{
case pwmclk_13M:
tmp &= ~PWM_CTRL_CLKSEL;
break;
case pwmclk_32k:
tmp |= PWM_CTRL_CLKSEL;
break;
default:
break;
}
DRV_WriteReg(PWM2_CTRL,tmp);
}
void PWM2_level(kal_uint8 level)
{
if (level > 5)
ASSERT(0);
PWM2_LEVEL_SAVE = level;
if (level)
{
PWM2_Configure(PWM2_Level_Info[level-1][0],PWM2_Level_Info[level-1][1]);
PWM2_Start();
}
else
{
PWM2_Stop();
}
}
#endif /*(MT6205B,MT6218, MT6218B, MT6219, MT6217, MT6228, MT6229)*/
void PWM1_Configure(kal_uint32 freq, kal_uint8 duty)
{
kal_uint32 clock;
kal_uint32 tmp;
kal_uint16 clkdiv;
kal_uint16 reg;
ASSERT(duty <= 100);
PWM1_FRE_SAVE=freq;
PWM1_DUTY_SAVE=duty;
reg = DRV_Reg(PWM1_CTRL);
clkdiv = (1 << (reg & 0x0003));
if (reg & 0x0004)
clock = 32000;
else
clock = 13000000;
clock = clock/clkdiv;
if(0==freq)
tmp = clock/(freq+1);
else
tmp = clock/(freq);
tmp--;
DRV_WriteReg(PWM1_COUNT,(kal_uint16)tmp);
tmp = ((tmp+1)*duty)/100;
DRV_WriteReg(PWM1_THRESHOLD,(kal_uint16)tmp);
}
/*duty=50 ==> 50%*/
void PWM1_Start(void)
{
#if ( (defined(MT6205B))||defined(MT6226M) || (defined(MT6218)) || (defined(MT6218B))|| (defined(MT6219))||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227)) )
kal_uint16 reg;
kal_uint32 clock;
reg = DRV_Reg(PWM1_CTRL);
if (reg & 0x0004)
clock = 32000;
else
clock = 13000000;
#ifdef MTK_SLEEP_ENABLE
if(clock == 13000000)
L1SM_SleepDisable(PWM1_PDNhandle);
#endif
DRV_WriteReg(DRVPDN_CON1_CLR,DRVPDN_CON1_PWM);
#else /*!(MT6205B,MT6218, MT6218B, MT6219, MT6217, MT6228,MT6229)*/
kal_uint32 savedMask;
savedMask = SaveAndSetIRQMask();
DRV_Reg(DRVPDN_CON1) &= ~DRVPDN_CON1_PWM;
RestoreIRQMask(savedMask);
#endif /*(MT6205B,MT6218, M6218B, MT6219, MT6217, MT6228, MT6229)*/
}
void PWM1_Stop(void)
{
#if ( (defined(MT6205B))||defined(MT6226M) || (defined(MT6218))|| (defined(MT6218B))|| (defined(MT6219)) ||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227)) )
kal_uint16 reg;
kal_uint32 clock;
reg = DRV_Reg(PWM1_CTRL);
if (reg & 0x0004)
clock = 32000;
else
clock = 13000000;
DRV_WriteReg(DRVPDN_CON1_SET,DRVPDN_CON1_PWM);
#ifdef MTK_SLEEP_ENABLE
if(clock == 13000000)
L1SM_SleepEnable(PWM1_PDNhandle);
#endif
#else /*!(MT6205B,MT6218)*/
kal_uint32 savedMask;
savedMask = SaveAndSetIRQMask();
DRV_Reg(DRVPDN_CON1) |= DRVPDN_CON1_PWM;
RestoreIRQMask(savedMask);
#endif /*(MT6205B,MT6218, MT6218B, MT6219, MT6217, MT6228,MT6229)*/
}
kal_uint8 PWM1_GetCurrentLevel(void)
{
return PWM1_LEVEL_SAVE;
}
kal_uint32 PMW1_GetCurrentFreq(void)
{
return PWM1_FRE_SAVE;
}
kal_uint8 PMW1_GetCurrentDuty(void)
{
return PWM1_DUTY_SAVE;
}
#if ( (defined(MT6205B))||defined(MT6226M) || (defined(MT6218)) || (defined(MT6218B))|| (defined(MT6219))||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227)) )
void PWM2_Configure(kal_uint32 freq, kal_uint8 duty)
{
kal_uint32 clock;
kal_uint32 tmp;
kal_uint16 clkdiv;
kal_uint16 reg;
ASSERT(duty <= 100);
PWM2_FRE_SAVE=freq;
PWM2_DUTY_SAVE=duty;
reg = DRV_Reg(PWM2_CTRL);
clkdiv = (1 << (reg & 0x0003));
if (reg & 0x0004)
clock = 32000;
else
clock = 13000000;
clock = clock/clkdiv;
if(0==freq)
tmp = clock/(freq+1);
else
tmp = clock/(freq);
tmp--;
DRV_WriteReg(PWM2_COUNT,(kal_uint16)tmp);
tmp = ((tmp+1)*duty)/100;
DRV_WriteReg(PWM2_THRESHOLD,(kal_uint16)tmp);
}
/*duty=50 ==> 50%*/
void PWM2_Start(void)
{
kal_uint16 reg;
kal_uint32 clock;
reg = DRV_Reg(PWM2_CTRL);
if (reg & 0x0004)
clock = 32000;
else
clock = 13000000;
#ifdef MTK_SLEEP_ENABLE
if(clock == 13000000)
L1SM_SleepDisable(PWM2_PDNhandle);
#endif
DRV_WriteReg(DRVPDN_CON1_CLR,DRVPDN_CON1_PWM2);
/*to cover HW issue*/
#if defined(MT6228)|| defined(MT6229) || defined(MT6230)
swdbg_pwr_up();
#endif
}
void PWM2_Stop(void)
{
kal_uint16 reg;
kal_uint32 clock;
reg = DRV_Reg(PWM2_CTRL);
if (reg & 0x0004)
clock = 32000;
else
clock = 13000000;
#ifdef MTK_SLEEP_ENABLE
if(clock == 13000000)
L1SM_SleepEnable(PWM2_PDNhandle);
#endif
DRV_WriteReg(DRVPDN_CON1_SET,DRVPDN_CON1_PWM2);
#if defined(MT6228)|| defined(MT6229) || defined(MT6230)
swdbg_pwr_down();
#endif
}
kal_uint8 PWM2_GetCurrentLevel(void)
{
return PWM2_LEVEL_SAVE;
}
kal_uint32 PMW2_GetCurrentFreq(void)
{
return PWM2_FRE_SAVE;
}
kal_uint8 PMW2_GetCurrentDuty(void)
{
return PWM2_DUTY_SAVE;
}
#endif /*(MT6205B,MT6218, MT6218B, MT6219, MT6217, MT6228, MT6229)*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -