mcu_hi3321_watch/tjd/system/sys_restart.c
2025-05-26 20:15:20 +08:00

264 lines
7.6 KiB
C
Raw Permalink 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.

/*----------------------------------------------------------------------------
* Copyright (c) Fenda Technologies Co., Ltd. 2021. All rights reserved.
*
* Description: sys_restart.c
*
* Author: saimen
*
* Create: 2024-06-08
*--------------------------------------------------------------------------*/
#include "sys_config.h"
#include "sys_restart.h"
#include "sys_typedef.h"
#include "sql_all.h"
#include "fs_user_common.h"
#include "hal_reboot.h"
#include "exception.h"
#include "service_ancillary.h"
#define ENABLE_STATIC_PRINT 0
#define static_print_error(...) sys_log_e(__VA_ARGS__) //错误信息打印一般常开
#define static_print_warn(...) sys_log_w(__VA_ARGS__) //警告信息打印一般常开
#if ENABLE_STATIC_PRINT
#define static_print_debug(...) sys_log_d(__VA_ARGS__)
#else
#define static_print_debug(...)
#endif
uint32_t g_sys_restart_reason = 0;
void tjd_sys_anomaly_data_save ( void )
{
#if 0
uint8_t *p_save_data;
uint32_t len;
uint32_t len_conut;
char* path;
len_conut = 0;
p_save_data = sql_setting_get_info(&len,&path);
rom_api_smart_write(HARDFAULT_INFO_BASE_ADDR+len_conut,p_save_data,len);
len_conut += len;
p_save_data = sql_weather_get_info(&len,&path);
rom_api_smart_write(HARDFAULT_INFO_BASE_ADDR+len_conut,p_save_data,len);
len_conut += len;
p_save_data = sql_fit_get_info(&len, &path);
rom_api_smart_write(HARDFAULT_INFO_BASE_ADDR+len_conut,p_save_data,len);
len_conut += len;
p_save_data = log_api_get_info(&len,&path);
rom_api_smart_write(HARDFAULT_INFO_BASE_ADDR+len_conut,p_save_data,len);
if(len_conut>(HARDFAULT_INFO_DATA_SIZE/2))
{
static_print_warn("error: len_conut>HARDFAULT_INFO_DATA_SIZE.\r\n");
}
#endif
}
void tjd_sys_restart_data_save ( void )
{
static_print_warn("tjd_sys_restart_data_save()");
tjd_service_ancillary_data_save_process(0xffffffff);
}
// 对保存在MCU ROM的某些数据进行开机启动时的处量数据检查、检验、读取等.
void tjd_sys_start_data_recover ( void )
{
int ret;
uint8_t *p_save_data;
uint32_t len;
char* path;
uint32_t len_conut;
static_print_warn("tjd_sys_start_data_recover()");
// 开机读取flash里面保存的校验值
// factory_read_all_calibration_data();
// xfile_sys_init();
if(tjd_sys_check_restart_reason()&0x40)//restart_reason = watchdog
{
#if 0
len_conut = 0;
p_save_data = sql_setting_get_info(&len,&path);
memcpy(p_save_data,(uint8_t*)(HARDFAULT_INFO_BASE_ADDR+len_conut),len);
len_conut += len;
p_save_data = sql_weather_get_info(&len,&path);
memcpy(p_save_data,(uint8_t*)(HARDFAULT_INFO_BASE_ADDR+len_conut),len);
len_conut += len;
p_save_data = sql_fit_get_info(&len, &path);
memcpy(p_save_data,(uint8_t*)(HARDFAULT_INFO_BASE_ADDR+len_conut),len);
len_conut += len;
p_save_data = log_api_get_info(&len,&path);
memcpy(p_save_data,(uint8_t*)(HARDFAULT_INFO_BASE_ADDR+len_conut),len);
// esase current data
for(uint8_t i = 0; i < HARDFAULT_INFO_DATA_SIZE / MCU_ROM_PAGE_SIZE; i++)
{
rom_api_erase(HARDFAULT_INFO_BASE_ADDR + i * MCU_ROM_PAGE_SIZE);
tjd_sys_smart_delay_ms(10);
static_print_warn("attention : i = %d , fun: %s ease current back data !!! \n",i,__FUNCTION__);
}
#endif
}
else
{
#if 1
p_save_data = sql_setting_get_info(&len,&path);
ret = tjd_fs_api_file_load(path, 0, p_save_data, len);
static_print_warn("[%s] ret=%d len=%d",path,ret,len);
p_save_data = sql_fit_get_info(&len, &path);
ret = tjd_fs_api_file_load(path, 0, p_save_data, len);
static_print_warn("[%s] ret=%d len=%d",path,ret,len);
p_save_data = sql_weather_get_info(&len,&path);
ret = tjd_fs_api_file_load(path, 0, p_save_data, len);
static_print_warn("[%s] ret=%d len=%d",path,ret,len);
p_save_data = sql_bt_get_info(&len, &path);
ret = tjd_fs_api_file_load(path, 0, p_save_data, len);
static_print_warn("[%s] ret=%d len=%d",path,ret,len);
p_save_data = sql_alarm_get_info(&len, &path);
ret = tjd_fs_api_file_load(path, 0, p_save_data, len);
static_print_warn("[%s] ret=%d len=%d",path,ret,len);
#endif
}
sql_setting_init();
sql_fit_init();
sql_weather_init();
sql_bt_init();
sql_alarm_init();
sql_message_init();
//log_api_init();
//tjd_sys_restart_data_save();//test
tjd_fs_api_print_dir_list("/system");
}
void tjd_sys_restart_no_save ( void )
{
//am_hal_reset_control(AM_HAL_RESET_CONTROL_SWPOI, 0);
hal_reboot_chip();
while(1);
}
void tjd_sys_restart (void* restart_reason)
{
#if 1
int ret;
uint8_t *p_save_data;
uint32_t len;
char* path;
tjd_sys_restart_data_save();
reset_deal_with_fs();
//set_cpu_utils_reset_cause(REBOOT_CAUSE_APPLICATION_SYSRESETREQ);
//tjd_sys_smart_delay_ms(50);
tjd_sys_restart_no_save();
#endif
}
void tjd_sys_restore_factory ( void ) //恢复出厂设置
{
#if 0
//将息屏提到前面运行,解决恢复出厂按钮按下长时间无反应问题
//rom_api_erase(USER_SYS_PAIR_INFO_BASE_ADDR); //擦除IOS设备配对绑定信息
fs_user_factory_reset();
//重置时间为出厂时间
rtc_api_set_by_utc_timestamp(VALID_UTC_TIMESTAMP_START);
tjd_sys_restart_data_save();
tjd_sys_smart_delay_ms(50);
tjd_sys_restart_no_save();
#endif
}
void tjd_sys_shipping_mode ( void )
{
#if 0
int ret;
uint8_t *p_save_data;
uint32_t len;
char* path;
// SaveSysCache();
tjd_sys_restart_data_save();
tjd_sys_smart_delay_ms(50);
charge_api_enable_ship_mode();
#endif
}
void tjd_sys_enter_sleep_mode_no_save ( void )
{
#if 0
//不能挂起ancillary任务,需要ancillary任务处理timer任务产生的打点数据
debug_api_deinit();
motor_api_stop();
charge_enter_sleep_mode();
task_alg_sleep();
task_fit_sleep();
task_ui_enter_sleep_mode();
sys_smart_delay_ms(50);
BleSleepMode();
factory_ate_sleep_mode();
#endif
}
static void set_system_restart_reg_status ( uint8_t status )
{
*((volatile uint32_t *)0x40000010) = status;
}
static void clear_system_restart_reg_status ( void )
{
*((volatile uint32_t *)0x40000010) = 0x01;
}
uint32_t tjd_sys_check_restart_reason ( void )
{
g_sys_restart_reason = 0X00;
static_print_warn("check_system_reset_reason:0x%04x, sizeof:%d \r\n", g_sys_restart_reason, sizeof(g_sys_restart_reason));
return g_sys_restart_reason;
}
uint32_t tjd_sys_restart_get_reason(void)
{
return g_sys_restart_reason;
}
void tjd_sys_rtc_por_recover(void)
{
#if 0
if ( tjd_sys_restart_get_reason() & 0x02 ) //bPORStat 硬上电复位标志
{
pm_save_t* p_pm_data = sql_setting_get_bat_saved_info();
if (p_pm_data != NULL)
{
rtc_api_set_by_utc_timestamp(p_pm_data->utc_timestamp + 3); //保存的时间与真正断电的时间存在大约3秒的时间差
// static_print_warn("system power on reset, exist rtc cache: %d \r\n", p_pm_data->utc_timestamp);
}
}
#endif
}
uint8_t tjd_sys_save_data_before_restart ( uint8_t type, void *pdata )
{
return RET_SUCCESS;
}