272 lines
6.2 KiB
C
272 lines
6.2 KiB
C
/*
|
||
******************************************************************************
|
||
*
|
||
* @file sleep.c
|
||
* @brief sleep module
|
||
* @ic sy8835
|
||
*
|
||
* @version 1.0
|
||
* @date 2024/11/01 17:35:40
|
||
* @author Alex Xu
|
||
*
|
||
* Copyright (c) 2013-2099,Tkplusemi Technology Co.,Ltd.
|
||
* All Rights Reserved
|
||
*
|
||
* History:
|
||
* Revision Date Author Desc
|
||
* 1.0.0 2024/11/01 Alex build this file
|
||
******************************************************************************
|
||
*/
|
||
#include "sleep.h"
|
||
#include "system.h"
|
||
#include "vox_module.h"
|
||
#include "sys_tim.h"
|
||
|
||
#if SLEEP_ENABLE
|
||
|
||
/******************************************************************************\
|
||
Macro definitions
|
||
\******************************************************************************/
|
||
|
||
/******************************************************************************\
|
||
Variables definitions
|
||
\******************************************************************************/
|
||
bit Enter_Ship_Mode_Flag = 0; //进shipmode标志
|
||
|
||
uint8_t Boot_ShipMode_Flg = 0; //Wake Up From ShipMode
|
||
|
||
uint16_t gAwake_Source = 0; //唤醒源标志位
|
||
|
||
uint8_t Decnt_SleepDelay = ENTER_STANDBYMODE_CNT;
|
||
|
||
uint8_t Enter_ShipMode_Debounce = 0;
|
||
|
||
bit Enter_Sleep_Cnt_Restart_Flag = 0;
|
||
|
||
/******************************************************************************\
|
||
Functions definitions
|
||
\******************************************************************************/
|
||
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* void WakeUp_Init_Set(void)
|
||
*
|
||
* Description : 系统唤醒源使能设置,系统初始化调用。
|
||
*
|
||
*
|
||
* Arguments : NONE
|
||
|
||
* Returns : NONE
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
#if 0
|
||
void WakeUp_Init_Set(void)
|
||
{
|
||
//set wakeup
|
||
}
|
||
#endif
|
||
/*
|
||
*******************************************************************************
|
||
* void OutSleep_Handler(void)
|
||
*
|
||
* Description : 出Standby模式后开启中断和部分接口使能。
|
||
*
|
||
* Arguments : NONE
|
||
|
||
* Returns : NONE
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
void OutSleep_Handler(void)
|
||
{
|
||
ES0 = 1; //UART0 IRQ
|
||
|
||
IEN2 = 3; //UART1、UART2 IRQ
|
||
|
||
EX5 = 1;
|
||
EX6 = 1;
|
||
|
||
ET0 = 1; //timer0 IRQ
|
||
ET1 = 1; //timer1 IRQ
|
||
|
||
SFRADDR = ADC_CTL2; //ADC 2.5V Enable b[7];ADC1 Pullup 100K Enable b[0].
|
||
SFRDATA = 0x81;
|
||
|
||
SFRADDR = ADC_CTL0;
|
||
SFRDATA |= 0x80; //ADC enable.
|
||
|
||
}
|
||
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* void InSleep_Handler(void)
|
||
*
|
||
* Description : 进Standby模式前的准备工作;关闭中断、关闭部分接口的使能
|
||
*
|
||
* Arguments : NONE
|
||
|
||
* Returns : NONE
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
void InSleep_Handler(void)
|
||
{
|
||
ES0 = 0; //UART0 IRQ Disable
|
||
|
||
IEN2 = 0; //UART1、UART2 IRQ Disable
|
||
|
||
EX5 = 0;
|
||
EX6 = 0;
|
||
|
||
ET0 = 0; //timer0 IRQ Disable
|
||
ET1 = 0; //timer1 IRQ Disable
|
||
|
||
SFRADDR = ADC_CTL2; //ADC 2.5V Enable b[7];ADC1 Pullup 100K Enable b[0].
|
||
SFRDATA &= ~0x81;
|
||
|
||
SFRADDR = ADC_CTL0;
|
||
SFRDATA &= ~0x80; //ADC Disable.
|
||
|
||
I2cSfr_Write( XSEN_CTRL , 0x00 ); //Xsen Disable
|
||
}
|
||
#if 0
|
||
/*
|
||
*******************************************************************************
|
||
* bool Check_Shipmode_Wkup(void)
|
||
*
|
||
* Description : 查询shipmode唤醒源标志位函数。
|
||
*
|
||
* Arguments : None
|
||
|
||
* Returns : None
|
||
|
||
* Notes : bool Flag
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
bool Check_Shipmode_Wkup(void)
|
||
{
|
||
uint8_t Reg_Read_Value = 0;
|
||
|
||
Boot_ShipMode_Flg = 0;
|
||
|
||
// SFRADDR = SHIPWKUP_EN;
|
||
// Reg_Read_Value = SFRDATA;
|
||
|
||
if(Reg_Read_Value & 0xF0) //Wakeup From ShipMode. --- VBUS、Key、Hall.
|
||
{
|
||
if(Reg_Read_Value & 0x40) //VBUS
|
||
{
|
||
Boot_ShipMode_Flg |= 0x40;
|
||
}
|
||
|
||
if(Reg_Read_Value & 0x20) //Key
|
||
{
|
||
Boot_ShipMode_Flg |= 0x20;
|
||
}
|
||
|
||
if(Reg_Read_Value & 0x10) //Hall 问题:此标志位在shipmode reset后,如果将P06(HALL)切成gpio模式后,会清零,待查。
|
||
{
|
||
Boot_ShipMode_Flg |= 0x10;
|
||
}
|
||
|
||
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
#endif
|
||
/*
|
||
*******************************************************************************
|
||
* void Enter_Sleep(void)
|
||
*
|
||
* Description : 进入休眠函数。
|
||
*
|
||
* Arguments : None
|
||
|
||
* Returns : None
|
||
|
||
* Notes : None
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
void Enter_Sleep(void)
|
||
{
|
||
if(Enter_Ship_Mode_Flag)
|
||
{
|
||
if(F_sys_tim_1s)
|
||
{
|
||
F_sys_tim_1s = 0;
|
||
|
||
Enter_ShipMode_Debounce++;
|
||
|
||
if(Enter_ShipMode_Debounce >= ENTER_SHIPMODE_CNT)
|
||
{
|
||
Boot_ShipMode_Flg = 0;
|
||
|
||
I2cSfr_Write(POWER_CTRL_CMD, POWER_CTRL_CMD_ENTER_SHIPMODE); //Enter ShipMode
|
||
|
||
Enter_ShipMode_Debounce = 0;
|
||
}
|
||
#ifdef _DEBUG_SLEEP
|
||
else
|
||
if(Enter_ShipMode_Debounce == ENTER_SHIPMODE_CNT - 1)
|
||
{
|
||
printf("Enter ShipMode!(line:%d)\r\n",__LINE__);
|
||
}
|
||
#endif
|
||
}
|
||
}
|
||
else
|
||
{
|
||
InSleep_Handler(); //Disable All IRQ
|
||
|
||
PCON |= 0x02; //Enter StandbyMode, Only int0 or int1 can wake up system
|
||
|
||
OutSleep_Handler(); //Enable IRQ
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* bool Check_Require_Sleep(void )
|
||
*
|
||
* Description : 查询休眠唤醒源标志位函数。
|
||
*
|
||
* Arguments : None
|
||
|
||
* Returns : None
|
||
|
||
* Notes : bool Flag
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
bit Check_Require_Sleep(void )
|
||
{
|
||
if( ( ChgStatus > CHG_PROTECT ) || ( ON == Vox_Vout_Enable ) || Enter_Sleep_Cnt_Restart_Flag ) /*充电中、有中断、耳机处于充电状态情况下,Boost重载输出,系统不进休眠模式。 */
|
||
{
|
||
#ifdef _DEBUG_SLEEP
|
||
printf("Not Get Into Sleep(ChgStatus:%d,Vox_Vout:%d,Restart_Flag:%d).\r\n",(uint16_t)ChgStatus,(uint16_t)Vox_Vout_Enable,(uint16_t)Enter_Sleep_Cnt_Restart_Flag);
|
||
#endif
|
||
Enter_Sleep_Cnt_Restart_Flag = 0;
|
||
/*处理对应的保护和中断唤醒事件。*/
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
#endif
|
||
|