// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// File name    : ccm_drv.h
// Version      : V0.1
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#ifndef CCM_DRV_H_
#define CCM_DRV_H_

#include "ccm_reg.h"
#include "memmap.h"


#define CCM      ((CCM_TypeDef *)(CCM_BASE_ADDR))

#define SYS_CLK_INTERNAL_OSC   do{CCM->CCR |= (1<<11);}while(0)
#define SYS_CLK_EXTERNAL_OSC   do{CCM->CCR &= ~(1<<11);}while(0)
#define PERIPH_BRIDGE_PAE_DIS  do{CCM->CCR &= ~(1<<6);}while(0)
#define PERIPH_BRIDGE_PAE_EN   do{CCM->CCR |= (1<<6);}while(0)
#define PERIPH_BRIDGE_RAE_DIS  do{CCM->CCR &= ~(1<<5);}while(0)
#define PERIPH_BRIDGE_RAE_EN   do{CCM->CCR |= (1<<5);}while(0)
#define BME_DIS                do{CCM->CCR &= ~(1<<3);}while(0)
#define BME_EN                 do{CCM->CCR |= (1<<3);}while(0)
#define BMD_DIS                do{CCM->CCR &= ~(1<<2);}while(0)
#define BMD_EN                 do{CCM->CCR |= (1<<2);}while(0)


#define USBPHY_POWER_OFF       do{CCM->PHYPA |= (1<<6);}while(0)//USBPHY power on
#define USBPHY_POWER_ON        do{CCM->PHYPA &= ~(1<<6);}while(0)//USBPHY power off
#define USBPHY_CLK_SEL_60M     do{CCM->PHYPA |= (1<<4);}while(0)//usbphy clk sel 60M
#define USBPHY_CLK_SEL_48M     do{CCM->PHYPA &= ~(1<<4);}while(0)//usbphy clk sel 48M
#define ADC_TEST_MODE_DIS      do{CCM->PHYPA &= ~(1<<0);}while(0)//ADC test mode enable
#define ADC_TEST_MODE_EN       do{CCM->PHYPA |= (1<<0);}while(0)//ADC test mode disable

#define PIN_TDO_PULLUP_DIS     do{CCM->PCFG3 &= ~(1<<10);}while(0)
#define PIN_TDO_PULLUP_EN      do{CCM->PCFG3 |= (1<<10);}while(0)

#define PWM_INPUT_OUTPUT_EN    do{CCM->PCFG3 |= (7<<0);}while(0)
#define PWM_INPUT_OUTPUT_DIS   do{CCM->PCFG3 &= ~(7<<0);}while(0)

#define RTC_INTERFACE_DIS      do{CCM->RTCCFG12 &= ~(1<<15);}while(0)
#define RTC_INTERFACE_EN       do{CCM->RTCCFG12 |= (1<<15);}while(0)


typedef enum
{
    CLOCK_OUT = 0,
    RESET_OUT,

}CCM_PINx;

/*******************************************************************************
* Function Name  : read_chip_cid
* Description    : read  the chip’s ID and Revision number
* Input          : None
*
* Output         : - cid:  cid[15~8]：a unique version identification number for the chip
*                          cid[15~8]：the full-layer mask revision number;
*                          The revision numbers are assigned in chronological order.
* Return         : None
******************************************************************************/
extern void read_chip_cid(UINT16 *cid);

/*******************************************************************************
* Function Name  : config_freq_detect_point
* Description    : Configuration the frequency detect point
* Input          :  - fd_hi:  Configure the high frequency detect point
*                   - fd_low: Configure the low frequency detect point
*
* Output         : None
*
* Return         : None
******************************************************************************/
//extern void config_freq_detect_point(UINT8 fd_hi, UINT8 fd_low);


/*******************************************************************************
* Function Name  : config_osc_bias_trim_value
* Description    : config osc bias trim value
* Input          :  - trim_val:  osc bias trim value
*
*
* Output         : None
*
* Return         : None
******************************************************************************/
extern void config_osc_bias_trim_value(UINT8 trim_val);

/*******************************************************************************
* Function Name  : CCM_ConfigGpio
* Description    : 将芯片clock out、POR(reset out)管脚配置成GPIO用途
* Input          : - CCM_name: 芯片对应的PIN脚，取值CLOCK_OUT或者RESET_OUT
*                  - CCM_Dir：设置GPIO方向   GPIO_OUTPUT：输出  GPIO_INPUT：输入
*
* Output         : None
* Return         : None
******************************************************************************/
extern void CCM_ConfigGpio(UINT8 CCM_Name, UINT8 CCM_Dir);

/*******************************************************************************
* Function Name  : CCM_Gpio_Diable
* Description    : 将芯片clock out、POR(reset out)管脚的GPIO功能关掉，恢复成之前的功能
* Input          : - CCM_name: 芯片对应的PIN脚，取值CLOCK_OUT或者RESET_OUT
*
* Output         : None
* Return         : None
******************************************************************************/
extern void CCM_Gpio_Diable(UINT8 CCM_Name);

/*******************************************************************************
* Function Name  : CCM_ReadGpioData
* Description    : 获取芯片GPIO对应引脚的电平
* Input          : - CCM_name: 芯片对应的PIN脚，取值CLOCK_OUT或者RESET_OUT
*
* Output         : None
* Return         : Bit_SET:高电平  Bit_RESET：低电平
******************************************************************************/
extern UINT8 CCM_ReadGpioData(UINT8 CCM_Name);

/*******************************************************************************
* Function Name  : CCM_WriteGpioData
* Description    : 设置芯片GPIO管脚对应管脚的电平
* Input          : - CCM_name: 芯片对应的PIN脚，取值CLOCK_OUT或者RESET_OUT
*                  - bitVal：设置的电平，Bit_SET：设置为高电平  Bit_RESET：设置为低电平
*
* Output         : None
* Return         : None
******************************************************************************/
extern void CCM_WriteGpioData(UINT8 CCM_Name, UINT8 bitVal);



#endif /* CCM_DRV_H_ */
