#ifndef __CLOCK_CFG_C__
#define __CLOCK_CFG_C__
#include "sdk_include.h"
#include "Cpu.h"
#include "system_clock_config.h"
#include "cpu_sysctrl.h"
#include "app_trace.h"

/*****************************************************************************
 功能描述  : 外设时钟列表


*****************************************************************************/
const uint32_t ws_clock[18][3]=
{
//蓝牙时钟
	{ws_bt,			CRM_PeriphClock_BT,			CRM_PeriphReset_BT			},
//ADC时钟
	{ws_adc,		CRM_PeriphClock_QPADC,		CRM_PeriphReset_GPADC 		},
//QDEC时钟
	{ws_qdec,		CRM_PeriphClock_QDEC,		CRM_PeriphReset_QDEC 		},
//GPIO时钟
	{ws_gpio,		CRM_PeriphClock_GPIO,		CRM_PeriphReset_GPIO 		},
//RTC时钟
	{ws_rtc, 		CRM_PeriphClock_RTC,		CRM_PeriphReset_RTC  		},
//WDT时钟
	{ws_wdt, 		CRM_PeriphClock_WDT,		CRM_PeriphReset_WDT   		},
//定时器3时钟
	{ws_timer3, 	CRM_PeriphClock_TIMER23,	CRM_PeriphReset_TIMER23 	},
//定时器2时钟
	{ws_timer2,		CRM_PeriphClock_TIMER23,	CRM_PeriphReset_TIMER23 	},
//定时器1时钟
	{ws_timer1,		CRM_PeriphClock_TIMER01,	CRM_PeriphReset_TIMER01 	},
//定时器0时钟
	{ws_timer0, 	CRM_PeriphClock_TIMER01,	CRM_PeriphReset_TIMER01 	},
//硬件随机数时钟
	{ws_rng, 		CRM_PeriphClock_RNG,		CRM_PeriphReset_RNG     	},
//系统配置时钟，暂时不要使用
	{ws_syscfg,		CRM_PeriphClock_SYSCFG,		CRM_PeriphReset_SYSCFG 		},
//键盘矩阵时钟
	{ws_kpc, 		CRM_PeriphClock_KPC,		CRM_PeriphReset_KPC       	},
//SPI1 时钟
	{ws_spi1,		CRM_PeriphClock_SPI1,		CRM_PeriphReset_SPI1      	},
//SPI0 时钟
	{ws_spi0,		CRM_PeriphClock_SPI0,		CRM_PeriphReset_SPI0      	},
//串口1 时钟
	{ws_uart1,		CRM_PeriphClock_UART1,		CRM_PeriphReset_UART1      	},
//串口0 时钟
	{ws_uart0,		CRM_PeriphClock_UART0,		CRM_PeriphReset_UART0     	},
//i2c时钟
	{ws_i2c, 		CRM_PeriphClock_I2C,		CRM_PeriphReset_I2C        	},
};

/*****************************************************************************
 功能描述  : 管理单元复位


*****************************************************************************/
const uint32_t reset[]=
{
//片内复位，重启
	CRM_PeriphReset_GLB,
//CPU内核复位	
	CRM_PeriphReset_CM3,
//时钟复位管理单元复位	
	CRM_PeriphReset_CRM,
};

uint32_t CRM_PeriphClock = 0;
uint32_t CRM_PeriphReset = 0;

/*****************************************************************************
 函 数 名  : system_clock_config
 功能描述  : 外设时钟配置
 输入参数  : ws_dev 			device              
             functional_state_t enable  
 输出参数  : 无
*****************************************************************************/
void system_clock_config(ws_dev device,functional_state_t enable)
{
	uint8_t i;
	uint8_t found = 0;
	uint32_t crm_periph_clock = 0;
	uint32_t crm_periph_reset = 0;
	for(i=0;i<18;i++){
//【1】查找外设
		if(device == ws_clock[i][0]){
			found = 1;	
			crm_periph_clock = ws_clock[i][1];
			crm_periph_reset = ws_clock[i][2];
			if(enable){
//【2】开启外设时钟				
				crm_cmd_periphclock(crm_periph_clock,ENABLE); 
//【3】复位外设
				crm_reset_periph(crm_periph_reset);

			}else{
				crm_cmd_periphclock(crm_periph_clock,DISABLE); 
			}
			break;
		}
	}
	
	if(found == 0){
		dbg_block_printf("err config clock arg invaild\n");
	}
}

/*****************************************************************************
 函 数 名  : system_rest
 功能描述  : 系统复位
 输入参数  : WS8100_RST rst  
 输出参数  : 无
*****************************************************************************/
void system_rest(WS8100_RST rst)
{
//	rtc_clear_div();
	crm_reset_periph(reset[rst]);
}

#endif

