SY8835_For_Demo_Ourself/UsrSrc/sleep/sleep.c

272 lines
6.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
******************************************************************************
*
* @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