/* ****************************************************************************** * * @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; //进shipmode标志 uint8_t Boot_ShipMode_Flg; //Wake Up From ShipMode uint16_t gAwake_Source; //唤醒源标志位 uint8_t Decnt_SleepDelay; uint8_t Enter_ShipMode_Debounce; bit Enter_Sleep_Cnt_Restart_Flag; /******************************************************************************\ 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 ) { #ifdef VOX_ADT_ENABLE if( ( ChgStatus > CHG_PROTECT ) || ( ON == Vol_Vout_Enable ) || ( ON == Vor_Vout_Enable ) || Enter_Sleep_Cnt_Restart_Flag ) /*充电中、有中断、耳机处于充电状态情况下,Boost重载输出,系统不进休眠模式。 */ #else if( ( ChgStatus > CHG_PROTECT ) || ( ON == Vox_Vout_Enable ) || Enter_Sleep_Cnt_Restart_Flag ) /*充电中、有中断、耳机处于充电状态情况下,Boost重载输出,系统不进休眠模式。 */ #endif { #ifdef VOX_ADT_ENABLE #ifdef _DEBUG_SLEEP printf("Not Get Into Sleep(ChgStatus:%d,Vol_Vout:%d,Vor_Vout:%d,Restart_Flag:%d).\r\n",(uint16_t)ChgStatus,(uint16_t)Vol_Vout_Enable,(uint16_t)Vor_Vout_Enable,(uint16_t)Enter_Sleep_Cnt_Restart_Flag); #endif #else #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 #endif Enter_Sleep_Cnt_Restart_Flag = FALSE; /*处理对应的保护和中断唤醒事件。*/ return false; } return true; } #endif