/*---------------------------------------------------------------------------- * 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; }