/*
 ******************************************************************************
 *
 * @file     system.c
 * @brief    system module
 *                 
 *
 * @version  1.0
 * @date     2022/08/04   15:00:40
 * @author   Alex Xu
 *
 * Copyright (c) 2013-2099,Tkplusemi Technology Co.,Ltd.
 * All Rights Reserved
 *
 * History:
 * Revision          Date           Author            Desc
 * 1.0.0            2022/08/15      Alex          build this file
 * Attention:1、由于同一个Byte的中断标志位，会分配在不同的中断中，对于清中断标志位（写1清），不能用 |= ，需要用 = ；
 			例如：IRQ_FLAG10 = 0x02;	//Clear bit0,bit1 interrupt flag
 			 2、外部中断0，主要是用于系统唤醒功能，中断处理函数中无需作逻辑功能处理，必需预留接口！
 ******************************************************************************/
 /*_____ I N C L U D E S ____________________________________________________*/

#include "system.h"
#include "gpio.h"
#include "adc.h"
#include "hall.h"
#include "key.h"
#include "sleep.h"
#include "uart.h"
#include "bat.h"
#include "sys_tim.h"
#include "charger_module.h"
#include "discharge_module.h"
#include "led.h"
#include "vox_module.h"
#include "watchdog.h"
#include "userapp.h"

/******************************************************************************\
                          Macro definitions
\******************************************************************************/

/******************************************************************************\
                             Variables definitions
\******************************************************************************/

/******************************************************************************\
                             Functions definitions
\******************************************************************************/


/*
 *******************************************************************************
 *             void System_Init(void)
 *
 * Description : System Initialization
 *
 * Arguments   : NONE

 * Returns     : NONE

 * Notes       : NONE
 *
 *******************************************************************************
 */
void System_Init(void)
{
	SFRADDR = PMU_CTL0; 			//芯片硬件需求，固定 
	SFRDATA |= 0x30;	

	/*test*/
	SFRADDR = P0_PD;	
	SFRDATA &= ~0x03;
	
#if UART0_ENABLE	

//	SFRADDR = P0_PU;
//	SFRDATA = 0x02;

//    SFRADDR = MFP_CTL0;
//    SFRDATA = 0x05;    		//P01 as UART's TX,P00 as UART's RX
    
    BD = 1;              //Select additional Baudrate generator
    PCON |= 0x80;        //Baudrate double enable
    
    //baudrate set
    S0RELH = HIBYTE(S0REL_VALUE);
    S0RELL = LOBYTE(S0REL_VALUE);//s0rel=1023, baudrate = fclk/32 = 187.5k

	S0CON = 0x40;		//SCON: MODE 1, 8-bit UART, REN disable
	 
    TI0 = 1;  
    RI0 = 1;
	ES0 = 1;            //Enable UART0 IRQ  
	
#endif	

#if VOX_ENABLE		

	VOX_CTL0 = 0xC3;	   //VOX 负载接入、存在识别功能使能，负载自动识别。打开Vox vds钳压环使能（主要用于VOX 5V输出）。

	SFRADDR = VOX_CON0;    //设置VOX输出过流200mA。
	SFRDATA &= ~0x1F;	
	SFRDATA |= (VOX_IOUT_200MA << 3) | VOX_ADT_Cur_4_5UA;

#endif

	TMOD = 0x01;	  //mode 1, 16bit timer

	TH0 = C_TIM0_Reload >> 8;
	TL0 = C_TIM0_Reload & 0xFF; 

	ET0 = 1;		//enable time0 interrupt
	TR0 = 1;		//time0 run

#if TIMER1_ENABLE	
	
	TMOD |= 0x10;     //mode 1, 16bit timer
	
    TH1 = C_TIM1_Reload >> 8;
    TL1 = C_TIM1_Reload & 0xFF; 
 	
    ET1 = 1;        //enable time1 interrupt
    TR1 = 1;        //time1 run	
    
#endif

	/*GPIO Set*/
	SFRADDR = P0_OE;
	SFRDATA = 0x1C; 		//COM_CTRL(P02)、LED1(P03)、LED2(P04)配置为GPIO输出

#ifdef LED_DISPLAY
	
	SFRADDR = P0_DRV;		//P03、P04限流开，限流电阻为400Ω
	SFRDATA = 0x3C; 

	pin_LED_1 = 0;
	pin_LED_2 = 0;
	
#endif

#if WTG_ENABLE  
	/* 65ms */
	WDTREL = 0x00;      //WDTPS = 0,wdt_f = wdt_f1/2;WDTPS = 1,wdt_f = wdt_f1/32;
	/* 1s */
//	WDTREL = 0x80;      //WDTPS = 0,wdt_f = wdt_f1/2;WDTPS = 1,wdt_f = wdt_f1/32;
#endif

#if ADC_ENABLE

	SFRADDR = MFP_CTL1;		//Set P07 Pinmux As AD4 Function
	SFRDATA |= 0x80;
	
	SFRADDR = ADCCS_CTL0;				//AD0~AD4 GPIO constant 20uA current source enable.
	SFRDATA = 0x10;
	
#endif	

	/* Interrupt Enable 根据应用选择必要的中断 */	
	SFRADDR = IRQ_EN3;		//INT2 --- VOX EDGE LOADON
	SFRDATA = 0x3C;	

	//SFRADDR = IRQ_EN10;		//INT4 --- Hall interrupt enable.
	//SFRDATA = 0x0C;
	
	/* 开外部中断使能 */
	EX0 = 1;
	EX2 = 1;	
	//EX4 = 1;	
	
	EAL = 1;	//开总中断。		

	IRQ_FLAG9 = 0x1C;   	//清 Charge complete Int、Tricle/Fast Charge Time expire Int	
	IRQ_FLAG10 = 0xC0;		//清 VBUS Plugin\Plugout Int
	IRQ_FLAG0 = 0x0C;		//Vox短路保护

#if CHARGER_ENABLE

#ifdef SY8836					//合封芯片关闭VBUS OV检测使能
	SFRADDR = PMU_CTL7;				
	SFRDATA &= ~0x20;

	SFRADDR = REG_CHG0;
	SFRDATA |= 0x04;		//关VDPM环 
#endif	

	CHG_CTL |= 0x10;				//开启充电超时使能

//	REG_CHG1 = CHG_CURRENT_400MA;		//充电电流400mA。

	//REG_CHG2 = 0x01;		//CV电压4.35V

#endif
	
}

/*
 *******************************************************************************
 *             void EX0_isr(void ) interrupt Interrupt_Vector_IE0
 *
 * Description : System External Intterupt 0
 *
 * Arguments   : NONE

 * Returns     : NONE

 * Notes       : NONE
 *
 *******************************************************************************
 */
void EX0_isr(void) interrupt Interrupt_Vector_IE0
{

}

/*
 *******************************************************************************
 *             void EX2_isr(void) interrupt Interrupt_Vector_IE2
 *
 * Description : System External Intterupt 2 
 *
 * Arguments   : NONE

 * Returns     : NONE

 * Notes       : NONE
 *
 *******************************************************************************
 */

void EX2_isr(void) interrupt Interrupt_Vector_IE2
{
	IRQ_FLAG3 = 0x3C;
	
#if SLEEP_ENABLE		
//	if( !Enter_Sleep_Cnt_Restart_Flag )
	{
		Enter_Sleep_Cnt_Restart_Flag = 1;
	}
#endif
}

/*
 *******************************************************************************
 *              void EX4_isr(void) interrupt Interrupt_Vector_IE4
 *
 * Description : System External Intterupt 4 
 *
 * Arguments   : NONE

 * Returns     : NONE

 * Notes       : NONE
 *
 *******************************************************************************
 */
 #if 0
 void EX4_isr(void) interrupt Interrupt_Vector_IE4
{	

	IRQ_FLAG10 = 0x0C;

#if SLEEP_ENABLE	

	//if( !Enter_Sleep_Cnt_Restart_Flag )
	{
		Enter_Sleep_Cnt_Restart_Flag = 1;
	}
	
#endif
}
#endif
