/**
 * Copyright 2016, yichip Semiconductor(shenzhen office)
 * All Rights Reserved.
 *
 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Yichip Semiconductor;
 * the contents of this file may not be disclosed to third parties, copied
 * or duplicated in any form, in whole or in part, without the prior
 * written permission of Yichip Semiconductor.
 */
  
/** 
  *@file adc.h
  *@brief adc support for application.
  */
#ifndef _DRV_ADC_H_
#define _DRV_ADC_H_
#include <stdio.h>
#include "ycdef.h"
#include "yc_otp.h"
#include <stdint.h>



//adc参考电压
#define GPIO_LOW_VOLTAGE_REF		500   //GPIO 的参考低电压为0.5V
#define GPIO_HIGH_VOLTAGE_REF		1000  //GPIO 的参考高电压为 1 V
#define HVIN_LOW_VOLTAGE_REF		3000   //hvin 的参考低电压为0.5V
#define HVIN_HIGH_VOLTAGE_REF		5000  //hvin 的参考高电压为 1 V
#define VINLPM_LOW_VOLTAGE_REF  3000  //vinlpm的参考低电压3 V
#define VINLPM_HIGH_VOLTAGE_REF  3300 //vinlpm的参考高电压 3.3V

//adc参考值
//#define  GPIO_LOW_REF_REG     mem_0_5_adc_io_data       
//#define  GPIO_HIGH_REF_REG    mem_1v_adc_io_data
//#define  HVIN_LOW_REF_REG     mem_3v_adc_hvin_data
//#define  HVIN_HIGH_REF_REG    mem_5v_adc_hvin_data
//#define  VINLPM_LOW_REF_REG   mem_3v_adc_vinlpm_data
//#define  VINLPM_HIGH_REF_REG  mem_3v3_adc_vinlpm_data
//#define  OTP_ADC_FLAG_REG     mem_otp_adc_flag

//adc参考值存放位置
#define OTP_ADC_IO_0_5V_ADDR		0x1fe2
#define OTP_ADC_HVIN_3V_ADDR		0x1fe4
#define OTP_ADC_VINLPM_2V_ADDR	0x1fe6
#define OTP_ADC_IO_1V_ADDR			0x1fe8
#define OTP_ADC_HVIN_5V_ADDR		0x1fea
#define OTP_ADC_VINLPM_3V3_ADDR	0x1fec
#define OTP_ADC_FLAG_ADDR				0x1fee

#define OTP_ADC_FLAG						0xaa55

#define WAIT_TIME 5000

/**
  *@brief ADC gpio.
  */


/**
  *@brief ADC channel.
  */
typedef enum
{
	ADC_CHANNEL_0 = 0,
	ADC_CHANNEL_1,
	ADC_CHANNEL_2,
	ADC_CHANNEL_3,
	ADC_CHANNEL_4,
	ADC_CHANNEL_5,
	ADC_CHANNEL_6,
	ADC_CHANNEL_7,
}ADC_ChxTypeDef;

#define IS_ADC_CHANNEL(CHANNEL_NUM) (((CHANNEL_NUM) == ADC_CHANNEL_0) || \
                                     ((CHANNEL_NUM) == ADC_CHANNEL_1) || \
                                     ((CHANNEL_NUM) == ADC_CHANNEL_2) || \
                                     ((CHANNEL_NUM) == ADC_CHANNEL_3) || \
                                     ((CHANNEL_NUM) == ADC_CHANNEL_4) || \
                                     ((CHANNEL_NUM) == ADC_CHANNEL_5) || \
                                     ((CHANNEL_NUM) == ADC_CHANNEL_6)||\
                                     ((CHANNEL_NUM) == ADC_CHANNEL_7))


typedef enum
{
	ADC_GPIO = 0,
	ADC_DIFF,
	ADC_HVIN,
	ADC_VINLPM,
}ADC_ModeTypeDef;


#define IS_ADC_MODE(MODE)  ((MODE == ADC_GPIO)||\
                            (MODE == ADC_DIFF)||\
                            (MODE == ADC_HVIN)||\
                            (MODE == ADC_VINLPM))

/* ADC Struct Define*/  
typedef struct _ADC_InitTypeDef
{
	ADC_ChxTypeDef  ADC_Channel;            /* ADC Channel select */
	ADC_ModeTypeDef ADC_Mode;
} ADC_InitTypeDef;  


/**
  *@brief ADC initialization.
  *@param ADC_InitStruct : piont to ADC_InitTypeDef struct
  *@return None.
  */
void ADC_Init(ADC_InitTypeDef *ADC_InitStruct);

/**
 * @brief  Get ADC result
 *
 * @param  ADC_Channel : In gpio mode ,the para can be every value of ADC_ChxTypeDef,
 *                       in gpio diff mode, the param can be ADC_CHANNEL_0 to ADC_CHANNEL_3,and in other mode,
 *                       the param can be 0.
 * @retval 0:fail other:adc value
 */
uint16_t ADC_GetResult(ADC_ChxTypeDef ADC_Channel);


/**
 * @brief  Get voltage
 * @param  ADC_Channel: ADC_Channel Select channel,
 * @retval -1:fail;  other:adc voltage (mV);
 */
int ADC_GetVoltage(ADC_ChxTypeDef ADC_Channel);

#endif