222 lines
4.3 KiB
C
222 lines
4.3 KiB
C
|
|
#include "app_config.h"
|
|
#include "system/includes.h"
|
|
#include "asm/charge.h"
|
|
#include "app_power_manage.h"
|
|
#include "update.h"
|
|
#include "app_main.h"
|
|
#include "app_charge.h"
|
|
#include "chgbox_ctrl.h"
|
|
#include "update_loader_download.h"
|
|
|
|
|
|
extern void setup_arch();
|
|
extern int audio_dec_init();
|
|
extern int audio_enc_init();
|
|
|
|
static void do_initcall()
|
|
{
|
|
__do_initcall(initcall);
|
|
}
|
|
|
|
static void do_early_initcall()
|
|
{
|
|
__do_initcall(early_initcall);
|
|
}
|
|
|
|
static void do_late_initcall()
|
|
{
|
|
__do_initcall(late_initcall);
|
|
}
|
|
|
|
static void do_platform_initcall()
|
|
{
|
|
__do_initcall(platform_initcall);
|
|
}
|
|
|
|
static void do_module_initcall()
|
|
{
|
|
__do_initcall(module_initcall);
|
|
}
|
|
|
|
void __attribute__((weak)) board_init()
|
|
{
|
|
|
|
}
|
|
void __attribute__((weak)) board_early_init()
|
|
{
|
|
|
|
}
|
|
|
|
int eSystemConfirmStopStatus(void)
|
|
{
|
|
/* 系统进入在未来时间里,无任务超时唤醒,可根据用户选择系统停止,或者系统定时唤醒(100ms) */
|
|
//1:Endless Sleep
|
|
//0:100 ms wakeup
|
|
if (get_charge_full_flag()) {
|
|
log_i("Endless Sleep");
|
|
power_set_soft_poweroff();
|
|
return 1;
|
|
} else {
|
|
log_i("100 ms wakeup");
|
|
return 0;
|
|
}
|
|
|
|
}
|
|
|
|
static void check_power_on_key(void)
|
|
{
|
|
u32 delay_10ms_cnt = 0;
|
|
|
|
while (1) {
|
|
clr_wdt();
|
|
os_time_dly(1);
|
|
|
|
extern u8 get_power_on_status(void);
|
|
if (get_power_on_status()) {
|
|
putchar('+');
|
|
delay_10ms_cnt++;
|
|
if (delay_10ms_cnt > 70) {
|
|
return;
|
|
}
|
|
} else {
|
|
putchar('-');
|
|
delay_10ms_cnt = 0;
|
|
puts("enter softpoweroff\n");
|
|
power_set_soft_poweroff();
|
|
}
|
|
}
|
|
}
|
|
|
|
static void app_init()
|
|
{
|
|
int update;
|
|
|
|
do_early_initcall();
|
|
do_platform_initcall();
|
|
|
|
board_init();
|
|
|
|
do_initcall();
|
|
|
|
do_module_initcall();
|
|
do_late_initcall();
|
|
|
|
|
|
audio_enc_init();
|
|
audio_dec_init();
|
|
|
|
if (!UPDATE_SUPPORT_DEV_IS_NULL()) {
|
|
update = update_result_deal();
|
|
}
|
|
|
|
app_var.play_poweron_tone = 1;
|
|
|
|
if (!get_charge_online_flag()) {
|
|
check_power_on_voltage();
|
|
|
|
#if TCFG_POWER_ON_NEED_KEY
|
|
/*充电拔出,CPU软件复位, 不检测按键,直接开机*/
|
|
#if TCFG_CHARGE_OFF_POWERON_NE
|
|
if ((!update && cpu_reset_by_soft()) || is_ldo5v_wakeup()) {
|
|
#else
|
|
if (!update && cpu_reset_by_soft()) {
|
|
#endif
|
|
app_var.play_poweron_tone = 0;
|
|
} else {
|
|
check_power_on_key();
|
|
}
|
|
#endif
|
|
}
|
|
|
|
#if (TCFG_MC_BIAS_AUTO_ADJUST == MC_BIAS_ADJUST_POWER_ON)
|
|
extern u8 power_reset_src;
|
|
u8 por_flag = 0;
|
|
u8 cur_por_flag = 0;
|
|
/*
|
|
*1.update
|
|
*2.power_on_reset(BIT0:上电复位)
|
|
*3.pin reset(BIT4:长按复位)
|
|
*/
|
|
if (update || (power_reset_src & BIT(0)) || (power_reset_src & BIT(4))) {
|
|
//log_info("reset_flag:0x%x",power_reset_src);
|
|
cur_por_flag = 0xA5;
|
|
}
|
|
int ret = syscfg_read(CFG_POR_FLAG, &por_flag, 1);
|
|
if ((cur_por_flag == 0xA5) && (por_flag != cur_por_flag)) {
|
|
//log_info("update POR flag");
|
|
ret = syscfg_write(CFG_POR_FLAG, &cur_por_flag, 1);
|
|
}
|
|
#endif
|
|
|
|
#if (TCFG_CHARGE_ENABLE && TCFG_CHARGE_POWERON_ENABLE)
|
|
if (is_ldo5v_wakeup()) { //LDO5V唤醒
|
|
extern u8 get_charge_online_flag(void);
|
|
if (get_charge_online_flag()) { //关机时,充电插入
|
|
|
|
} else { //关机时,充电拔出
|
|
power_set_soft_poweroff();
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if(TCFG_CHARGE_BOX_ENABLE)
|
|
/* clock_add_set(CHARGE_BOX_CLK); */
|
|
chgbox_init_app();
|
|
#endif
|
|
}
|
|
|
|
static void app_task_handler(void *p)
|
|
{
|
|
app_init();
|
|
app_main();
|
|
}
|
|
|
|
__attribute__((used)) int *__errno()
|
|
{
|
|
static int err;
|
|
return &err;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
|
|
|
|
#if(CONFIG_CPU_BR25)
|
|
|
|
#if (TCFG_DEC2TWS_ENABLE ||RECORDER_MIX_EN || TCFG_DRC_ENABLE || TCFG_USER_BLE_ENABLE || TCFG_DEC_APE_ENABLE || TCFG_DEC_FLAC_ENABLE || TCFG_DEC_DTS_ENABLE || TCFG_USER_EMITTER_ENABLE)
|
|
clock_set_sfc_max_freq(100 * 1000000, 100 * 1000000);
|
|
#else
|
|
|
|
#if ((TCFG_AEC_ENABLE) && (TCFG_USER_TWS_ENABLE))
|
|
clock_set_sfc_max_freq(100 * 1000000, 100 * 1000000);
|
|
#else
|
|
clock_set_sfc_max_freq(64 * 1000000, 64 * 1000000);
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
wdt_close();
|
|
|
|
os_init();
|
|
|
|
setup_arch();
|
|
|
|
board_early_init();
|
|
|
|
task_create(app_task_handler, NULL, "app_core");
|
|
|
|
os_start();
|
|
|
|
local_irq_enable();
|
|
|
|
while (1) {
|
|
asm("idle");
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|