/*
 ******************************************************************************
 *
 * @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)
{
	CLKPRE = 0x00;  //frequency division: 2^0, 12M  后续根据系统功耗情况调整。
	
	/* test，开启IO LDO bias和增加100uA负载。*/
	SFRADDR = 0x89;	
	SFRDATA |= 0x80;
	
	SFRADDR = PMU_CTL0;				//bit3-bit4芯片硬件需求，固定;Disable HALL And KEY;VCC IO 3.1v
	SFRDATA = 0x30;
	
	/*test*/
	SFRADDR = P0_PD;	
	SFRDATA &= ~0x03;
	
#if UART0_ENABLE	

	SFRADDR = P0_PU;
	SFRDATA = 0x03;

    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 = 0xD0;        //SCON: MODE 3, 9-bit UART, RI enable, EVEN Parity
	 
    TI0 = 1;  
    RI0 = 1;
	ES0 = 1;            //Enable UART0 IRQ  
	
#endif	

#if VOX_ENABLE		
	//Vox_init();			//上电后，尽快初始化VOX为自动识别模式，为后续识别VOX是否有LOADON做好准备。
	VOX_CTL0 = 0xC3;	   //VOX 负载接入、存在识别功能使能，负载自动识别。打开Vox vds钳压环使能（主要用于VOX 5V输出）。
/*
	SFRADDR = VOX_CON0;    //设置VOX输出500mA，负载识别电流2.5uA。
	SFRDATA &= 0xE0;
	SFRDATA |= (VOX_IOUT_500MA << 3) | VOX_ADT_Cur_2_5UA;
*/	
#endif

	//Sys_Tim0_Init();
	//TMOD &= 0xF0;
	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	

	//Sys_Tim1_Init();	
	
	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

#ifdef LED_DISPLAY

	LED_R_FLASH(25,6);
	LED_G_FLASH(25,6);
	LED_Y_FLASH(25,6);
#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 NTC_ENABLE

	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;	
	
#if	KEY_ENABLE
	SFRADDR = IRQ_EN7;		//INT4 --- Key Interrupt Flag
	SFRDATA = 0xF8;
#else
	//SFRADDR = PMU_CTL0;
	//SFRDATA &= ~0x0A;		//Key Detect Disable	
#endif	

#if	HALL_ENABLE
	SFRADDR = IRQ_EN10;		//INT4 --- Hall interrupr enable.
	SFRDATA = 0x0C;
#else
	//SFRADDR = PMU_CTL0;
	//SFRDATA &= ~0x08;		//Hall Detect Disable		
#endif	
	/* 开外部中断使能 */
	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

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

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

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

#endif

#if SLEEP_ENABLE	
	//Decnt_SleepDelay = ENTER_STANDBYMODE_CNT;
	
#endif	

#if DISPLAY_6PIN_188

	//LED_188_Init();	
	
	SFRADDR = MFP_CTL1;
	SFRDATA &= ~0x0C;	

//	P0 &= ~0xC0;		//P00、P01、P02、P03、P04、P05

//	SFRADDR = P0_OE;
//	SFRDATA |= 0x3f;

//	SFRADDR = P1_OE;
//	SFRDATA = 0x01;
	
	/*初始化显示*/
//	g_188_Num = 188;
	Display_Show_Num(g_188_Num);
	Display_Show_Vor(4); 
	Display_Show_Vol(4); 
	
#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
 *
 *******************************************************************************
 */
 void EX4_isr(void) interrupt Interrupt_Vector_IE4
{	

#if KEY_ENABLE
	
	if( IRQ_FLAG7 & 0x10 )			//Key short press for 16ms-1s interrupt flag 
	{
		Key_Press_short_irq = 1;
	}
	
	if( IRQ_FLAG7 & 0x20 )			//Key long press for 2s interrupt flag and Key release interrupt flag
	{
		Key_Press_l_irq = 1;
	}
	
	if( IRQ_FLAG7 & 0x40 )			//Key super long press for 8s interrupt flag 
	{
		Key_Press_ll_irq = 1;	
		Key_Press_l_irq = 0;
	}

	if( IRQ_FLAG7 & 0x08 ) 
	{
		if( Key_Press_l_irq )
		{
			Key_Press_l_irq = 0;
			Key_l_Flag = 1;
		}
	}
	
	IRQ_FLAG7 = 0xF8;		//Clean Key interrupt flag
		
#endif

	IRQ_FLAG10 = 0x0C;     //Clean Hall edge interrupt flag

#if SLEEP_ENABLE	

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

