#include "yc11xx_pwm.h"
#include "yc11xx_gpio.h"
#include "yc_drv_common.h"

#define     __IO    volatile 

void PWM_ClockSwitch(PWM_ClkSwitchDef PWM_ClkSwitch)
{
	_ASSERT(IS_PWM_ClkSwitchDef(PWM_ClkSwitch));
	switch(PWM_ClkSwitch)
	{
		case PWMCLK_ENABLE:
			HWRITE(CORE_CLKOFF+1,HREAD(CORE_CLKOFF+1) & ~(PWMCLK_DISABLE));
			break;
		case PWMCLK_DISABLE:
			HWRITE(CORE_CLKOFF+1,HREAD(CORE_CLKOFF+1) | PWMCLK_DISABLE);
			break;
		default:
			break;

	}

}

void PWM_setcnt(PWM_ChxTypeDef pwm_channel,uint16_t pcnt,uint16_t ncnt)
{
	_ASSERT(IS_PWM_ChxTypeDef(pwm_channel));
	_ASSERT(IS_PERIOD_VALUE(pcnt));
	_ASSERT(IS_PERIOD_VALUE(ncnt));
	HW_REG_16BIT(reg_map(CORE_PWM_PCNT(pwm_channel)),pcnt);
	HW_REG_16BIT(reg_map(CORE_PWM_NCNT(pwm_channel)),ncnt);	
}


void PWM_SWITCH(PWM_ChxTypeDef pwm_channel,PWM_SwitchDef SWITCH)
{
	_ASSERT(IS_PWM_ChxTypeDef(pwm_channel));
	_ASSERT(IS_PWM_SWITCH(SWITCH));
	switch(SWITCH)
	{
		case PWM_ENABLE:
			HWRITE(CORE_PWM_CTRL(pwm_channel),HREAD(CORE_PWM_CTRL(pwm_channel))|PWM_ENABLE);
			break;
		case PWM_DISENABLE:
			HWRITE(CORE_PWM_CTRL(pwm_channel),HREAD(CORE_PWM_CTRL(pwm_channel)) & ~(PWM_ENABLE));
			break;
		default:
			break;
	}
}

void PWM_Init(PWM_InitTypeDef* PWM_InitStruct)
{
	uint8_t CtrValue = 0;

	_ASSERT(IS_PWM_GPIO(PWM_InitStruct->pwm_gpio));
	_ASSERT(IS_PWM_ChxTypeDef(PWM_InitStruct->PWM_Channel));
	_ASSERT(IS_PERIOD_VALUE(PWM_InitStruct->HighLevelPeriod));
	_ASSERT(IS_PERIOD_VALUE(PWM_InitStruct->LowLevelPeriod));
	_ASSERT(IS_CLK_DIVISION(PWM_InitStruct->pwm_ctrl.clk_div));	
	_ASSERT(IS_PWM_START(PWM_InitStruct->pwm_ctrl.StartLevel));	
	_ASSERT(IS_PWM_SWITCH(PWM_InitStruct->pwm_ctrl.pwm_switch));

	GPIO_SetGpioMultFunction(PWM_InitStruct->pwm_gpio,GPCFG_PWM_OUT0 |(PWM_InitStruct->PWM_Channel));
	
	HWCOR(CORE_CLKOFF+1, 0x20);

	CtrValue |= PWM_InitStruct -> pwm_ctrl.clk_div;
	CtrValue |= PWM_InitStruct -> pwm_ctrl.StartLevel;
	CtrValue |= PWM_InitStruct -> pwm_ctrl.pwm_switch;

	HW_REG_16BIT(reg_map(CORE_PWM_PCNT(PWM_InitStruct->PWM_Channel)),PWM_InitStruct->HighLevelPeriod);
	HW_REG_16BIT(reg_map(CORE_PWM_NCNT(PWM_InitStruct->PWM_Channel)),PWM_InitStruct->LowLevelPeriod);
	HW_REG_8BIT(reg_map(CORE_PWM_CTRL(PWM_InitStruct->PWM_Channel)),CtrValue);
}