更新提交 1.验证了RTC 唤醒 2.添加蓝牙直连

This commit is contained in:
helloyifa 2025-05-16 17:31:05 +08:00
parent 1c6f199f37
commit f0a8f13cd6
8 changed files with 3722 additions and 3561 deletions

View File

@ -1,311 +1,307 @@
/********************************************************************************************* /*********************************************************************************************
* Filename : app_main.c * Filename : app_main.c
* Description : * Description :
* Copyright:(c)JIELI 2011-2019 @ , All Rights Reserved. * Copyright:(c)JIELI 2011-2019 @ , All Rights Reserved.
*********************************************************************************************/ *********************************************************************************************/
#include "system/includes.h" #include "system/includes.h"
#include "app_config.h" #include "app_config.h"
#include "app_action.h" #include "app_action.h"
#include "app_main.h" #include "app_main.h"
#include "update.h" #include "update.h"
#include "update_loader_download.h" #include "update_loader_download.h"
#include "app_charge.h" #include "app_charge.h"
#include "app_power_manage.h" #include "app_power_manage.h"
#include "asm/charge.h" #include "asm/charge.h"
#include "app_temperature.h" #include "app_temperature.h"
#if TCFG_KWS_VOICE_RECOGNITION_ENABLE #if TCFG_KWS_VOICE_RECOGNITION_ENABLE
#include "jl_kws/jl_kws_api.h" #include "jl_kws/jl_kws_api.h"
#endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */ #endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */
#define LOG_TAG_CONST APP #define LOG_TAG_CONST APP
#define LOG_TAG "[APP]" #define LOG_TAG "[APP]"
#define LOG_ERROR_ENABLE #define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE #define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE #define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */ /* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE #define LOG_CLI_ENABLE
#include "debug.h" #include "debug.h"
/*任务列表 */ /*任务列表 */
const struct task_info task_info_table[] = { const struct task_info task_info_table[] = {
#if CONFIG_APP_FINDMY #if CONFIG_APP_FINDMY
{"app_core", 1, 0, 640 * 2, 128 }, {"app_core", 1, 0, 640 * 2, 128 },
#else #else
{"app_core", 1, 0, 640, 128 }, {"app_core", 1, 0, 640, 128 },
#endif #endif
{"sys_event", 7, 0, 256, 0 }, {"sys_event", 7, 0, 256, 0 },
{"btctrler", 4, 0, 512, 256 }, {"btctrler", 4, 0, 512, 256 },
{"btencry", 1, 0, 512, 128 }, {"btencry", 1, 0, 512, 128 },
{"btstack", 3, 0, 768, 256 }, {"btstack", 3, 0, 768, 256 },
{"systimer", 7, 0, 128, 0 }, {"systimer", 7, 0, 128, 0 },
{"update", 1, 0, 512, 0 }, {"update", 1, 0, 512, 0 },
{"dw_update", 2, 0, 256, 128 }, {"dw_update", 2, 0, 256, 128 },
#if (RCSP_BTMATE_EN) #if (RCSP_BTMATE_EN)
{"rcsp_task", 2, 0, 640, 0}, {"rcsp_task", 2, 0, 640, 0},
#endif #endif
#if(USER_UART_UPDATE_ENABLE) #if(USER_UART_UPDATE_ENABLE)
{"uart_update", 1, 0, 256, 128 }, {"uart_update", 1, 0, 256, 128 },
#endif #endif
#if (XM_MMA_EN) #if (XM_MMA_EN)
{"xm_mma", 2, 0, 640, 256 }, {"xm_mma", 2, 0, 640, 256 },
#endif #endif
{"usb_msd", 1, 0, 512, 128 }, {"usb_msd", 1, 0, 512, 128 },
#if TCFG_AUDIO_ENABLE #if TCFG_AUDIO_ENABLE
{"audio_dec", 3, 0, 768, 128 }, {"audio_dec", 3, 0, 768, 128 },
{"audio_enc", 4, 0, 512, 128 }, {"audio_enc", 4, 0, 512, 128 },
#endif/*TCFG_AUDIO_ENABLE*/ #endif/*TCFG_AUDIO_ENABLE*/
#if TCFG_KWS_VOICE_RECOGNITION_ENABLE #if TCFG_KWS_VOICE_RECOGNITION_ENABLE
{"kws", 2, 0, 256, 64 }, {"kws", 2, 0, 256, 64 },
#endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */ #endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */
#if (TUYA_DEMO_EN) #if (TUYA_DEMO_EN)
{"user_deal", 2, 0, 512, 512 },//定义线程 tuya任务调度 {"user_deal", 2, 0, 512, 512 },//定义线程 tuya任务调度
#endif #endif
#if (CONFIG_APP_HILINK) #if (CONFIG_APP_HILINK)
{"hilink_task", 2, 0, 1024, 0},//定义线程 hilink任务调度 {"hilink_task", 2, 0, 1024, 0},//定义线程 hilink任务调度
#endif #endif
{0, 0}, {0, 0},
}; };
APP_VAR app_var; APP_VAR app_var;
void app_var_init(void) void app_var_init(void)
{ {
app_var.play_poweron_tone = 1; app_var.play_poweron_tone = 1;
app_var.auto_off_time = TCFG_AUTO_SHUT_DOWN_TIME; app_var.auto_off_time = TCFG_AUTO_SHUT_DOWN_TIME;
app_var.warning_tone_v = 340; app_var.warning_tone_v = 340;
app_var.poweroff_tone_v = 330; app_var.poweroff_tone_v = 330;
} }
__attribute__((weak)) __attribute__((weak))
u8 get_charge_online_flag(void) u8 get_charge_online_flag(void)
{ {
return 0; return 0;
} }
void clr_wdt(void); void clr_wdt(void);
void check_power_on_key(void) void check_power_on_key(void)
{ {
#if TCFG_POWER_ON_NEED_KEY #if TCFG_POWER_ON_NEED_KEY
u32 delay_10ms_cnt = 0; u32 delay_10ms_cnt = 0;
while (1) { while (1) {
clr_wdt(); clr_wdt();
os_time_dly(1); os_time_dly(1);
extern u8 get_power_on_status(void); extern u8 get_power_on_status(void);
if (get_power_on_status()) { if (get_power_on_status()) {
log_info("+"); log_info("+");
delay_10ms_cnt++; delay_10ms_cnt++;
if (delay_10ms_cnt > 70) { if (delay_10ms_cnt > 70) {
/* extern void set_key_poweron_flag(u8 flag); */ /* extern void set_key_poweron_flag(u8 flag); */
/* set_key_poweron_flag(1); */ /* set_key_poweron_flag(1); */
return; return;
} }
} else { } else {
log_info("-"); log_info("-");
delay_10ms_cnt = 0; delay_10ms_cnt = 0;
log_info("enter softpoweroff\n"); log_info("enter softpoweroff\n");
power_set_soft_poweroff(); power_set_soft_poweroff();
} }
} }
#endif #endif
} }
void enter_sleep(){ void enter_sleep(){
printf(">>>>>>>>>>>>>>>>>enter_sleep...\n"); printf(">>>>>>>>>>>>>>>>>enter_sleep...\n");
sys_s_hi_timer_del(enter_sleep); sys_s_hi_timer_del(enter_sleep);
extern void user_alarm_test(void); extern void user_alarm_test(void);
extern void alarm_rtc_start(void); extern void alarm_rtc_start(void);
alarm_rtc_start(); alarm_rtc_start();
user_alarm_test(); user_alarm_test();
//power_set_soft_poweroff(); //power_set_soft_poweroff();
} }
void alarm_isr_user_cbfun(u8 index)
{ void user_main(){
printf("**** alarm %d : hello world ****\n", index); printf(">>>>>>>>>>>>>>>>>user_main...\n");
} temperature_init();
void user_main(){
printf(">>>>>>>>>>>>>>>>>user_main...\n"); //sys_s_hi_timer_add(NULL,enter_sleep,5000);
temperature_init();
// user_alarm_test();
// extern void alarm_rtc_start(void);
//sys_s_hi_timer_add(NULL,enter_sleep,5000); // alarm_rtc_start();
// rtc_alarm_set_timer(30);
// user_alarm_test();
// extern void alarm_rtc_start(void); //extern void rtc_alarm_set_timer(u32 seconds);
// alarm_rtc_start(); //rtc_alarm_set_timer(30);
// rtc_alarm_set_timer(30); //power_set_soft_poweroff();
//user_alarm_test();
//extern void rtc_alarm_set_timer(u32 seconds); }
//rtc_alarm_set_timer(30); void app_main()
//power_set_soft_poweroff(); {
//user_alarm_test(); struct intent it;
}
void app_main() if (!UPDATE_SUPPORT_DEV_IS_NULL()) {
{ int update = 0;
struct intent it; update = update_result_deal();
}
if (!UPDATE_SUPPORT_DEV_IS_NULL()) {
int update = 0; printf(">>>>>>>>>>>>>>>>>app_main...\n");
update = update_result_deal(); printf(">>> v220,2022-11-23 >>>\n");
}
if (get_charge_online_flag()) {
printf(">>>>>>>>>>>>>>>>>app_main...\n"); #if(TCFG_SYS_LVD_EN == 1)
printf(">>> v220,2022-11-23 >>>\n"); vbat_check_init();
#endif
if (get_charge_online_flag()) { } else {
#if(TCFG_SYS_LVD_EN == 1) check_power_on_voltage();
vbat_check_init(); }
#endif temperature_ble_init();
} else { #if TCFG_POWER_ON_NEED_KEY
check_power_on_voltage(); check_power_on_key();
} #endif
temperature_ble_init();
#if TCFG_POWER_ON_NEED_KEY #if TCFG_AUDIO_ENABLE
check_power_on_key(); extern int audio_dec_init();
#endif extern int audio_enc_init();
audio_dec_init();
#if TCFG_AUDIO_ENABLE audio_enc_init();
extern int audio_dec_init(); #endif/*TCFG_AUDIO_ENABLE*/
extern int audio_enc_init();
audio_dec_init(); #if TCFG_KWS_VOICE_RECOGNITION_ENABLE
audio_enc_init(); jl_kws_main_user_demo();
#endif/*TCFG_AUDIO_ENABLE*/ #endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */
#if TCFG_KWS_VOICE_RECOGNITION_ENABLE init_intent(&it);
jl_kws_main_user_demo();
#endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */ #if CONFIG_APP_SPP_LE
it.name = "spp_le";
init_intent(&it); it.action = ACTION_SPPLE_MAIN;
#if CONFIG_APP_SPP_LE #elif CONFIG_APP_AT_COM || CONFIG_APP_AT_CHAR_COM
it.name = "spp_le"; it.name = "at_com";
it.action = ACTION_SPPLE_MAIN; it.action = ACTION_AT_COM;
#elif CONFIG_APP_AT_COM || CONFIG_APP_AT_CHAR_COM #elif CONFIG_APP_DONGLE
it.name = "at_com"; it.name = "dongle";
it.action = ACTION_AT_COM; it.action = ACTION_DONGLE_MAIN;
#elif CONFIG_APP_DONGLE #elif CONFIG_APP_MULTI
it.name = "dongle"; it.name = "multi_conn";
it.action = ACTION_DONGLE_MAIN; it.action = ACTION_MULTI_MAIN;
#elif CONFIG_APP_MULTI #elif CONFIG_APP_NONCONN_24G
it.name = "multi_conn"; it.name = "nonconn_24g";
it.action = ACTION_MULTI_MAIN; it.action = ACTION_NOCONN_24G_MAIN;
#elif CONFIG_APP_NONCONN_24G #elif CONFIG_APP_HILINK
it.name = "nonconn_24g"; it.name = "hilink";
it.action = ACTION_NOCONN_24G_MAIN; it.action = ACTION_HILINK_MAIN;
#elif CONFIG_APP_HILINK #elif CONFIG_APP_LL_SYNC
it.name = "hilink"; it.name = "ll_sync";
it.action = ACTION_HILINK_MAIN; it.action = ACTION_LL_SYNC;
#elif CONFIG_APP_LL_SYNC #elif CONFIG_APP_TUYA
it.name = "ll_sync"; it.name = "tuya";
it.action = ACTION_LL_SYNC; it.action = ACTION_TUYA;
#elif CONFIG_APP_TUYA #elif CONFIG_APP_CENTRAL
it.name = "tuya"; it.name = "central";
it.action = ACTION_TUYA; it.action = ACTION_CENTRAL_MAIN;
#elif CONFIG_APP_CENTRAL #elif CONFIG_APP_DONGLE
it.name = "central"; it.name = "dongle";
it.action = ACTION_CENTRAL_MAIN; it.action = ACTION_DONGLE_MAIN;
#elif CONFIG_APP_DONGLE #elif CONFIG_APP_BEACON
it.name = "dongle"; it.name = "beacon";
it.action = ACTION_DONGLE_MAIN; it.action = ACTION_BEACON_MAIN;
#elif CONFIG_APP_BEACON #elif CONFIG_APP_IDLE
it.name = "beacon"; it.name = "idle";
it.action = ACTION_BEACON_MAIN; it.action = ACTION_IDLE_MAIN;
#elif CONFIG_APP_IDLE #elif CONFIG_APP_CONN_24G
it.name = "idle"; it.name = "conn_24g";
it.action = ACTION_IDLE_MAIN; it.action = ACTION_CONN_24G_MAIN;
#elif CONFIG_APP_CONN_24G #elif CONFIG_APP_FINDMY
it.name = "conn_24g"; it.name = "findmy";
it.action = ACTION_CONN_24G_MAIN; it.action = ACTION_FINDMY;
#elif CONFIG_APP_FINDMY #elif CONFIG_APP_FTMS
it.name = "findmy"; it.name = "ftms";
it.action = ACTION_FINDMY; it.action = ACTION_FTMS;
#elif CONFIG_APP_FTMS #else
it.name = "ftms"; while (1) {
it.action = ACTION_FTMS; printf("no app!!!");
}
#else #endif
while (1) {
printf("no app!!!");
} log_info("run app>>> %s", it.name);
#endif log_info("%s,%s", __DATE__, __TIME__);
start_app(&it);
log_info("run app>>> %s", it.name); user_main();
log_info("%s,%s", __DATE__, __TIME__); #if TCFG_CHARGE_ENABLE
set_charge_event_flag(1);
start_app(&it); #endif
user_main(); }
#if TCFG_CHARGE_ENABLE
set_charge_event_flag(1); /*
#endif * app模式切换
} */
void app_switch(const char *name, int action)
/* {
* app模式切换 struct intent it;
*/ struct application *app;
void app_switch(const char *name, int action)
{ log_info("app_exit\n");
struct intent it;
struct application *app; init_intent(&it);
app = get_current_app();
log_info("app_exit\n"); if (app) {
/*
init_intent(&it); * 退app, state_machine()APP_STA_STOP APP_STA_DESTORY
app = get_current_app(); */
if (app) { it.name = app->name;
/* it.action = ACTION_BACK;
* 退app, state_machine()APP_STA_STOP APP_STA_DESTORY start_app(&it);
*/ }
it.name = app->name;
it.action = ACTION_BACK; /*
start_app(&it); * app (name)action分支
} */
it.name = name;
/* it.action = action;
* app (name)action分支 start_app(&it);
*/ }
it.name = name;
it.action = action; int eSystemConfirmStopStatus(void)
start_app(&it); {
} /* 系统进入在未来时间里,无任务超时唤醒,可根据用户选择系统停止,或者系统定时唤醒(100ms) */
//1:Endless Sleep
int eSystemConfirmStopStatus(void) //0:100 ms wakeup
{ /* log_info("100ms wakeup"); */
/* 系统进入在未来时间里,无任务超时唤醒,可根据用户选择系统停止,或者系统定时唤醒(100ms) */ return 1;
//1:Endless Sleep }
//0:100 ms wakeup
/* log_info("100ms wakeup"); */ __attribute__((used)) int *__errno()
return 1; {
} static int err;
return &err;
__attribute__((used)) int *__errno() }
{
static int err;
return &err;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,344 +1,344 @@
#ifndef CONFIG_BOARD_AC6323A_DEMO_H #ifndef CONFIG_BOARD_AC6323A_DEMO_H
#define CONFIG_BOARD_AC6323A_DEMO_H #define CONFIG_BOARD_AC6323A_DEMO_H
#include "board_ac6323a_demo_global_build_cfg.h" #include "board_ac6323a_demo_global_build_cfg.h"
#ifdef CONFIG_BOARD_AC6323A_DEMO #ifdef CONFIG_BOARD_AC6323A_DEMO
#define CONFIG_SDFILE_ENABLE #define CONFIG_SDFILE_ENABLE
//*********************************************************************************// //*********************************************************************************//
// 配置开始 // // 配置开始 //
//*********************************************************************************// //*********************************************************************************//
#define ENABLE_THIS_MOUDLE 1 #define ENABLE_THIS_MOUDLE 1
#define DISABLE_THIS_MOUDLE 0 #define DISABLE_THIS_MOUDLE 0
#define ENABLE 1 #define ENABLE 1
#define DISABLE 0 #define DISABLE 0
#define NO_CONFIG_PORT (-1) #define NO_CONFIG_PORT (-1)
//*********************************************************************************// //*********************************************************************************//
// UART配置 // // UART配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_UART0_ENABLE ENABLE_THIS_MOUDLE //串口打印模块使能 #define TCFG_UART0_ENABLE ENABLE_THIS_MOUDLE //串口打印模块使能
#define TCFG_UART0_RX_PORT NO_CONFIG_PORT //串口接收脚配置用于打印可以选择NO_CONFIG_PORT #define TCFG_UART0_RX_PORT NO_CONFIG_PORT //串口接收脚配置用于打印可以选择NO_CONFIG_PORT
#define TCFG_UART0_TX_PORT IO_PORTA_01 //串口发送脚配置 #define TCFG_UART0_TX_PORT IO_PORTA_01 //串口发送脚配置
#define TCFG_UART0_BAUDRATE 1000000 //串口波特率配置 #define TCFG_UART0_BAUDRATE 1000000 //串口波特率配置
//*********************************************************************************// //*********************************************************************************//
// USB 配置 // // USB 配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_PC_ENABLE DISABLE_THIS_MOUDLE //PC模块使能 #define TCFG_PC_ENABLE DISABLE_THIS_MOUDLE //PC模块使能
#define TCFG_UDISK_ENABLE DISABLE_THIS_MOUDLE //U盘模块使能 #define TCFG_UDISK_ENABLE DISABLE_THIS_MOUDLE //U盘模块使能
#define TCFG_HID_HOST_ENABLE DISABLE_THIS_MOUDLE//ENABLE_THIS_MOUDLE //游戏盒子模式 #define TCFG_HID_HOST_ENABLE DISABLE_THIS_MOUDLE//ENABLE_THIS_MOUDLE //游戏盒子模式
#define TCFG_ADB_ENABLE DISABLE_THIS_MOUDLE//ENABLE_THIS_MOUDLE #define TCFG_ADB_ENABLE DISABLE_THIS_MOUDLE//ENABLE_THIS_MOUDLE
#define TCFG_AOA_ENABLE DISABLE_THIS_MOUDLE//ENABLE_THIS_MOUDLE #define TCFG_AOA_ENABLE DISABLE_THIS_MOUDLE//ENABLE_THIS_MOUDLE
#define TCFG_OTG_USB_DEV_EN (BIT(0) | BIT(1))//USB0 = BIT(0) USB1 = BIT(1) #define TCFG_OTG_USB_DEV_EN (BIT(0) | BIT(1))//USB0 = BIT(0) USB1 = BIT(1)
//*********************************************************************************// //*********************************************************************************//
// IIC配置 // // IIC配置 //
//*********************************************************************************// //*********************************************************************************//
/*软件IIC设置*/ /*软件IIC设置*/
#define TCFG_SW_I2C0_CLK_PORT IO_PORTA_09 //软件IIC CLK脚选择 #define TCFG_SW_I2C0_CLK_PORT IO_PORTA_09 //软件IIC CLK脚选择
#define TCFG_SW_I2C0_DAT_PORT IO_PORTA_10 //软件IIC DAT脚选择 #define TCFG_SW_I2C0_DAT_PORT IO_PORTA_10 //软件IIC DAT脚选择
#define TCFG_SW_I2C0_DELAY_CNT 50 //IIC延时参数影响通讯时钟频率 #define TCFG_SW_I2C0_DELAY_CNT 50 //IIC延时参数影响通讯时钟频率
/*硬件IIC端口选择 /*硬件IIC端口选择
SCL SDA SCL SDA
'A': IO_PORT_DP IO_PORT_DM 'A': IO_PORT_DP IO_PORT_DM
'B': IO_PORTA_09 IO_PORTA_10 'B': IO_PORTA_09 IO_PORTA_10
'C': IO_PORTA_07 IO_PORTA_08 'C': IO_PORTA_07 IO_PORTA_08
'D': IO_PORTA_05 IO_PORTA_06 'D': IO_PORTA_05 IO_PORTA_06
*/ */
#define TCFG_HW_I2C0_PORTS 'B' #define TCFG_HW_I2C0_PORTS 'B'
#define TCFG_HW_I2C0_CLK 100000 //硬件IIC波特率 #define TCFG_HW_I2C0_CLK 100000 //硬件IIC波特率
//*********************************************************************************// //*********************************************************************************//
// 硬件SPI 配置 // // 硬件SPI 配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_HW_SPI1_ENABLE ENABLE_THIS_MOUDLE #define TCFG_HW_SPI1_ENABLE ENABLE_THIS_MOUDLE
//A组IO: DI: PB2 DO: PB1 CLK: PB0 //A组IO: DI: PB2 DO: PB1 CLK: PB0
//B组IO: DI: PC3 DO: PC5 CLK: PC4 //B组IO: DI: PC3 DO: PC5 CLK: PC4
#define TCFG_HW_SPI1_PORT 'A' #define TCFG_HW_SPI1_PORT 'A'
#define TCFG_HW_SPI1_BAUD 2000000L #define TCFG_HW_SPI1_BAUD 2000000L
#define TCFG_HW_SPI1_MODE SPI_MODE_BIDIR_1BIT #define TCFG_HW_SPI1_MODE SPI_MODE_BIDIR_1BIT
#define TCFG_HW_SPI1_ROLE SPI_ROLE_MASTER #define TCFG_HW_SPI1_ROLE SPI_ROLE_MASTER
#define TCFG_HW_SPI2_ENABLE ENABLE_THIS_MOUDLE #define TCFG_HW_SPI2_ENABLE ENABLE_THIS_MOUDLE
//A组IO: DI: PB8 DO: PB10 CLK: PB9 //A组IO: DI: PB8 DO: PB10 CLK: PB9
//B组IO: DI: PA13 DO: DM CLK: DP //B组IO: DI: PA13 DO: DM CLK: DP
#define TCFG_HW_SPI2_PORT 'A' #define TCFG_HW_SPI2_PORT 'A'
#define TCFG_HW_SPI2_BAUD 2000000L #define TCFG_HW_SPI2_BAUD 2000000L
#define TCFG_HW_SPI2_MODE SPI_MODE_BIDIR_1BIT #define TCFG_HW_SPI2_MODE SPI_MODE_BIDIR_1BIT
#define TCFG_HW_SPI2_ROLE SPI_ROLE_MASTER #define TCFG_HW_SPI2_ROLE SPI_ROLE_MASTER
//*********************************************************************************// //*********************************************************************************//
// FLASH 配置 // // FLASH 配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_CODE_FLASH_ENABLE DISABLE_THIS_MOUDLE #define TCFG_CODE_FLASH_ENABLE DISABLE_THIS_MOUDLE
#define TCFG_FLASH_DEV_SPI_HW_NUM 1// 1: SPI1 2: SPI2 #define TCFG_FLASH_DEV_SPI_HW_NUM 1// 1: SPI1 2: SPI2
#define TCFG_FLASH_DEV_SPI_CS_PORT IO_PORTB_06 #define TCFG_FLASH_DEV_SPI_CS_PORT IO_PORTB_06
#define TCFG_NORFLASH_DEV_ENABLE DISABLE_THIS_MOUDLE #define TCFG_NORFLASH_DEV_ENABLE DISABLE_THIS_MOUDLE
//*********************************************************************************// //*********************************************************************************//
// key 配置 // // key 配置 //
//*********************************************************************************// //*********************************************************************************//
#define KEY_NUM_MAX 10 #define KEY_NUM_MAX 10
#define KEY_NUM 3 #define KEY_NUM 3
#define MULT_KEY_ENABLE DISABLE //是否使能组合按键消息, 使能后需要配置组合按键映射表 #define MULT_KEY_ENABLE DISABLE //是否使能组合按键消息, 使能后需要配置组合按键映射表
//*********************************************************************************// //*********************************************************************************//
// iokey 配置 // // iokey 配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_IOKEY_ENABLE DISABLE_THIS_MOUDLE //是否使能IO按键 #define TCFG_IOKEY_ENABLE DISABLE_THIS_MOUDLE //是否使能IO按键
#define TCFG_IOKEY_POWER_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO #define TCFG_IOKEY_POWER_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO
#define TCFG_IOKEY_POWER_ONE_PORT IO_PORTA_01 //IO按键端口 #define TCFG_IOKEY_POWER_ONE_PORT IO_PORTA_01 //IO按键端口
#define TCFG_IOKEY_PREV_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO #define TCFG_IOKEY_PREV_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO
#define TCFG_IOKEY_PREV_ONE_PORT IO_PORTB_04 #define TCFG_IOKEY_PREV_ONE_PORT IO_PORTB_04
#define TCFG_IOKEY_NEXT_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO #define TCFG_IOKEY_NEXT_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO
#define TCFG_IOKEY_NEXT_ONE_PORT IO_PORTB_05 #define TCFG_IOKEY_NEXT_ONE_PORT IO_PORTB_05
//*********************************************************************************// //*********************************************************************************//
// adkey 配置 // // adkey 配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_ADKEY_ENABLE DISABLE_THIS_MOUDLE //是否使能AD按键 #define TCFG_ADKEY_ENABLE DISABLE_THIS_MOUDLE //是否使能AD按键
#define TCFG_ADKEY_PORT IO_PORTA_01 //AD按键端口(需要注意选择的IO口是否支持AD功能) #define TCFG_ADKEY_PORT IO_PORTA_01 //AD按键端口(需要注意选择的IO口是否支持AD功能)
/*AD通道选择需要和AD按键的端口相对应: /*AD通道选择需要和AD按键的端口相对应:
AD_CH_PA1 AD_CH_PA3 AD_CH_PA4 AD_CH_PA5 AD_CH_PA1 AD_CH_PA3 AD_CH_PA4 AD_CH_PA5
AD_CH_PA9 AD_CH_PA1 AD_CH_PB1 AD_CH_PB4 AD_CH_PA9 AD_CH_PA1 AD_CH_PB1 AD_CH_PB4
AD_CH_PB6 AD_CH_PB7 AD_CH_DP AD_CH_DM AD_CH_PB6 AD_CH_PB7 AD_CH_DP AD_CH_DM
AD_CH_PB2 AD_CH_PB2
*/ */
#define TCFG_ADKEY_AD_CHANNEL AD_CH_PA1 #define TCFG_ADKEY_AD_CHANNEL AD_CH_PA1
#define TCFG_ADKEY_EXTERN_UP_ENABLE ENABLE_THIS_MOUDLE //是否使用外部上拉 #define TCFG_ADKEY_EXTERN_UP_ENABLE ENABLE_THIS_MOUDLE //是否使用外部上拉
#if TCFG_ADKEY_EXTERN_UP_ENABLE #if TCFG_ADKEY_EXTERN_UP_ENABLE
#define R_UP 220 //22K外部上拉阻值在此自行设置 #define R_UP 220 //22K外部上拉阻值在此自行设置
#else #else
#define R_UP 100 //10K内部上拉默认10K #define R_UP 100 //10K内部上拉默认10K
#endif #endif
//必须从小到大填电阻没有则同VDDIO,填0x3ffL //必须从小到大填电阻没有则同VDDIO,填0x3ffL
#define TCFG_ADKEY_AD0 (0) //0R #define TCFG_ADKEY_AD0 (0) //0R
#define TCFG_ADKEY_AD1 (0x3ffL * 30 / (30 + R_UP)) //3k #define TCFG_ADKEY_AD1 (0x3ffL * 30 / (30 + R_UP)) //3k
#define TCFG_ADKEY_AD2 (0x3ffL * 62 / (62 + R_UP)) //6.2k #define TCFG_ADKEY_AD2 (0x3ffL * 62 / (62 + R_UP)) //6.2k
#define TCFG_ADKEY_AD3 (0x3ffL * 91 / (91 + R_UP)) //9.1k #define TCFG_ADKEY_AD3 (0x3ffL * 91 / (91 + R_UP)) //9.1k
#define TCFG_ADKEY_AD4 (0x3ffL * 150 / (150 + R_UP)) //15k #define TCFG_ADKEY_AD4 (0x3ffL * 150 / (150 + R_UP)) //15k
#define TCFG_ADKEY_AD5 (0x3ffL * 240 / (240 + R_UP)) //24k #define TCFG_ADKEY_AD5 (0x3ffL * 240 / (240 + R_UP)) //24k
#define TCFG_ADKEY_AD6 (0x3ffL * 330 / (330 + R_UP)) //33k #define TCFG_ADKEY_AD6 (0x3ffL * 330 / (330 + R_UP)) //33k
#define TCFG_ADKEY_AD7 (0x3ffL * 510 / (510 + R_UP)) //51k #define TCFG_ADKEY_AD7 (0x3ffL * 510 / (510 + R_UP)) //51k
#define TCFG_ADKEY_AD8 (0x3ffL * 1000 / (1000 + R_UP)) //100k #define TCFG_ADKEY_AD8 (0x3ffL * 1000 / (1000 + R_UP)) //100k
#define TCFG_ADKEY_AD9 (0x3ffL * 2200 / (2200 + R_UP)) //220k #define TCFG_ADKEY_AD9 (0x3ffL * 2200 / (2200 + R_UP)) //220k
#define TCFG_ADKEY_VDDIO (0x3ffL) #define TCFG_ADKEY_VDDIO (0x3ffL)
#define TCFG_ADKEY_VOLTAGE0 ((TCFG_ADKEY_AD0 + TCFG_ADKEY_AD1) / 2) #define TCFG_ADKEY_VOLTAGE0 ((TCFG_ADKEY_AD0 + TCFG_ADKEY_AD1) / 2)
#define TCFG_ADKEY_VOLTAGE1 ((TCFG_ADKEY_AD1 + TCFG_ADKEY_AD2) / 2) #define TCFG_ADKEY_VOLTAGE1 ((TCFG_ADKEY_AD1 + TCFG_ADKEY_AD2) / 2)
#define TCFG_ADKEY_VOLTAGE2 ((TCFG_ADKEY_AD2 + TCFG_ADKEY_AD3) / 2) #define TCFG_ADKEY_VOLTAGE2 ((TCFG_ADKEY_AD2 + TCFG_ADKEY_AD3) / 2)
#define TCFG_ADKEY_VOLTAGE3 ((TCFG_ADKEY_AD3 + TCFG_ADKEY_AD4) / 2) #define TCFG_ADKEY_VOLTAGE3 ((TCFG_ADKEY_AD3 + TCFG_ADKEY_AD4) / 2)
#define TCFG_ADKEY_VOLTAGE4 ((TCFG_ADKEY_AD4 + TCFG_ADKEY_AD5) / 2) #define TCFG_ADKEY_VOLTAGE4 ((TCFG_ADKEY_AD4 + TCFG_ADKEY_AD5) / 2)
#define TCFG_ADKEY_VOLTAGE5 ((TCFG_ADKEY_AD5 + TCFG_ADKEY_AD6) / 2) #define TCFG_ADKEY_VOLTAGE5 ((TCFG_ADKEY_AD5 + TCFG_ADKEY_AD6) / 2)
#define TCFG_ADKEY_VOLTAGE6 ((TCFG_ADKEY_AD6 + TCFG_ADKEY_AD7) / 2) #define TCFG_ADKEY_VOLTAGE6 ((TCFG_ADKEY_AD6 + TCFG_ADKEY_AD7) / 2)
#define TCFG_ADKEY_VOLTAGE7 ((TCFG_ADKEY_AD7 + TCFG_ADKEY_AD8) / 2) #define TCFG_ADKEY_VOLTAGE7 ((TCFG_ADKEY_AD7 + TCFG_ADKEY_AD8) / 2)
#define TCFG_ADKEY_VOLTAGE8 ((TCFG_ADKEY_AD8 + TCFG_ADKEY_AD9) / 2) #define TCFG_ADKEY_VOLTAGE8 ((TCFG_ADKEY_AD8 + TCFG_ADKEY_AD9) / 2)
#define TCFG_ADKEY_VOLTAGE9 ((TCFG_ADKEY_AD9 + TCFG_ADKEY_VDDIO) / 2) #define TCFG_ADKEY_VOLTAGE9 ((TCFG_ADKEY_AD9 + TCFG_ADKEY_VDDIO) / 2)
#define TCFG_ADKEY_VALUE0 0 #define TCFG_ADKEY_VALUE0 0
#define TCFG_ADKEY_VALUE1 1 #define TCFG_ADKEY_VALUE1 1
#define TCFG_ADKEY_VALUE2 2 #define TCFG_ADKEY_VALUE2 2
#define TCFG_ADKEY_VALUE3 3 #define TCFG_ADKEY_VALUE3 3
#define TCFG_ADKEY_VALUE4 4 #define TCFG_ADKEY_VALUE4 4
#define TCFG_ADKEY_VALUE5 5 #define TCFG_ADKEY_VALUE5 5
#define TCFG_ADKEY_VALUE6 6 #define TCFG_ADKEY_VALUE6 6
#define TCFG_ADKEY_VALUE7 7 #define TCFG_ADKEY_VALUE7 7
#define TCFG_ADKEY_VALUE8 8 #define TCFG_ADKEY_VALUE8 8
#define TCFG_ADKEY_VALUE9 9 #define TCFG_ADKEY_VALUE9 9
//*********************************************************************************// //*********************************************************************************//
// Audio配置 // // Audio配置 //
//*********************************************************************************// //*********************************************************************************//
#ifdef CONFIG_LITE_AUDIO #ifdef CONFIG_LITE_AUDIO
#define TCFG_AUDIO_ENABLE DISABLE #define TCFG_AUDIO_ENABLE DISABLE
#if TCFG_AUDIO_ENABLE #if TCFG_AUDIO_ENABLE
#define TCFG_DEC_USBC_ENABLE DISABLE #define TCFG_DEC_USBC_ENABLE DISABLE
#define TCFG_ENC_USBC_ENABLE DISABLE #define TCFG_ENC_USBC_ENABLE DISABLE
#define TCFG_DEC_LC3_ENABLE DISABLE #define TCFG_DEC_LC3_ENABLE DISABLE
#define TCFG_ENC_LC3_ENABLE DISABLE #define TCFG_ENC_LC3_ENABLE DISABLE
//lc3 参数配置 //lc3 参数配置
#if (TCFG_ENC_LC3_ENABLE || TCFG_DEC_LC3_ENABLE) #if (TCFG_ENC_LC3_ENABLE || TCFG_DEC_LC3_ENABLE)
#define LC3_CODING_SAMPLERATE 16000 //lc3 编码的采样率 #define LC3_CODING_SAMPLERATE 16000 //lc3 编码的采样率
#define LC3_CODING_FRAME_LEN 50 //帧长度只支持2550100 #define LC3_CODING_FRAME_LEN 50 //帧长度只支持2550100
#define LC3_CODING_CHANNEL 1 //lc3 的通道数 #define LC3_CODING_CHANNEL 1 //lc3 的通道数
#endif #endif
#endif #endif
#endif #endif
//*********************************************************************************// //*********************************************************************************//
// irkey 配置 // // irkey 配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_IRKEY_ENABLE DISABLE_THIS_MOUDLE//是否使能AD按键 #define TCFG_IRKEY_ENABLE DISABLE_THIS_MOUDLE//是否使能AD按键
#define TCFG_IRKEY_PORT IO_PORTA_08 //IR按键端口 #define TCFG_IRKEY_PORT IO_PORTA_08 //IR按键端口
//*********************************************************************************// //*********************************************************************************//
// tocuh key 配置 // // tocuh key 配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_LP_TOUCH_KEY_ENABLE DISABLE_THIS_MOUDLE //是否使能触摸按键 #define TCFG_LP_TOUCH_KEY_ENABLE DISABLE_THIS_MOUDLE //是否使能触摸按键
//*********************************************************************************// //*********************************************************************************//
// RTC_ALARM配置 // // RTC_ALARM配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_RTC_ALARM_ENABLE ENABLE_THIS_MOUDLE #define TCFG_RTC_ALARM_ENABLE ENABLE_THIS_MOUDLE
//*********************************************************************************// //*********************************************************************************//
// 充电仓配置(不支持) // // 充电仓配置(不支持) //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_TEST_BOX_ENABLE DISABLE_THIS_MOUDLE #define TCFG_TEST_BOX_ENABLE DISABLE_THIS_MOUDLE
#define TCFG_CHARGESTORE_PORT IO_PORTP_00 #define TCFG_CHARGESTORE_PORT IO_PORTP_00
#define TCFG_CHARGESTORE_UART_ID IRQ_UART1_IDX #define TCFG_CHARGESTORE_UART_ID IRQ_UART1_IDX
//*********************************************************************************// //*********************************************************************************//
// 充电参数配置 // // 充电参数配置 //
//*********************************************************************************// //*********************************************************************************//
//是否支持芯片内置充电 //是否支持芯片内置充电
#define TCFG_CHARGE_ENABLE ENABLE #define TCFG_CHARGE_ENABLE ENABLE
//是否支持开机充电 //是否支持开机充电
#define TCFG_CHARGE_POWERON_ENABLE ENABLE #define TCFG_CHARGE_POWERON_ENABLE ENABLE
//是否支持拔出充电自动开机功能 //是否支持拔出充电自动开机功能
#define TCFG_CHARGE_OFF_POWERON_NE ENABLE #define TCFG_CHARGE_OFF_POWERON_NE ENABLE
/* /*
CHARGE_FULL_V_3962 CHARGE_FULL_V_4002 CHARGE_FULL_V_4044 CHARGE_FULL_V_4086 CHARGE_FULL_V_3962 CHARGE_FULL_V_4002 CHARGE_FULL_V_4044 CHARGE_FULL_V_4086
CHARGE_FULL_V_4130 CHARGE_FULL_V_4175 CHARGE_FULL_V_4222 CHARGE_FULL_V_4270 CHARGE_FULL_V_4130 CHARGE_FULL_V_4175 CHARGE_FULL_V_4222 CHARGE_FULL_V_4270
CHARGE_FULL_V_4308 CHARGE_FULL_V_4349 CHARGE_FULL_V_4391 CHARGE_FULL_V_4434 CHARGE_FULL_V_4308 CHARGE_FULL_V_4349 CHARGE_FULL_V_4391 CHARGE_FULL_V_4434
CHARGE_FULL_V_4472 CHARGE_FULL_V_4517 CHARGE_FULL_V_4564 CHARGE_FULL_V_4611 CHARGE_FULL_V_4472 CHARGE_FULL_V_4517 CHARGE_FULL_V_4564 CHARGE_FULL_V_4611
*/ */
#define TCFG_CHARGE_FULL_V CHARGE_FULL_V_4222 #define TCFG_CHARGE_FULL_V CHARGE_FULL_V_4175
/* /*
CHARGE_FULL_mA_2 CHARGE_FULL_mA_5 CHARGE_FULL_mA_7 CHARGE_FULL_mA_10 CHARGE_FULL_mA_2 CHARGE_FULL_mA_5 CHARGE_FULL_mA_7 CHARGE_FULL_mA_10
CHARGE_FULL_mA_15 CHARGE_FULL_mA_20 CHARGE_FULL_mA_25 CHARGE_FULL_mA_30 CHARGE_FULL_mA_15 CHARGE_FULL_mA_20 CHARGE_FULL_mA_25 CHARGE_FULL_mA_30
*/ */
#define TCFG_CHARGE_FULL_MA CHARGE_FULL_mA_5 #define TCFG_CHARGE_FULL_MA CHARGE_FULL_mA_7
/* /*
CHARGE_mA_20 CHARGE_mA_30 CHARGE_mA_40 CHARGE_mA_50 CHARGE_mA_20 CHARGE_mA_30 CHARGE_mA_40 CHARGE_mA_50
CHARGE_mA_60 CHARGE_mA_70 CHARGE_mA_80 CHARGE_mA_90 CHARGE_mA_60 CHARGE_mA_70 CHARGE_mA_80 CHARGE_mA_90
CHARGE_mA_100 CHARGE_mA_110 CHARGE_mA_120 CHARGE_mA_140 CHARGE_mA_100 CHARGE_mA_110 CHARGE_mA_120 CHARGE_mA_140
CHARGE_mA_160 CHARGE_mA_180 CHARGE_mA_200 CHARGE_mA_220 CHARGE_mA_160 CHARGE_mA_180 CHARGE_mA_200 CHARGE_mA_220
*/ */
#define TCFG_CHARGE_MA CHARGE_mA_20 #define TCFG_CHARGE_MA CHARGE_mA_30
//*********************************************************************************// //*********************************************************************************//
// LED 配置 // // LED 配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_PWMLED_ENABLE DISABLE_THIS_MOUDLE //是否支持PMW LED推灯模块 #define TCFG_PWMLED_ENABLE DISABLE_THIS_MOUDLE //是否支持PMW LED推灯模块
#define TCFG_PWMLED_IOMODE LED_ONE_IO_MODE //LED模式单IO还是两个IO推灯 #define TCFG_PWMLED_IOMODE LED_ONE_IO_MODE //LED模式单IO还是两个IO推灯
#define TCFG_PWMLED_PIN IO_PORTB_06 //LED使用的IO口 #define TCFG_PWMLED_PIN IO_PORTB_06 //LED使用的IO口
//*********************************************************************************// //*********************************************************************************//
// 时钟配置 // // 时钟配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_CLOCK_SYS_SRC SYS_CLOCK_INPUT_PLL_BT_OSC //系统时钟源选择 #define TCFG_CLOCK_SYS_SRC SYS_CLOCK_INPUT_PLL_BT_OSC //系统时钟源选择
#define TCFG_CLOCK_SYS_HZ 24000000 //系统时钟设置 #define TCFG_CLOCK_SYS_HZ 24000000 //系统时钟设置
#define TCFG_CLOCK_OSC_HZ 24000000 //外界晶振频率设置 #define TCFG_CLOCK_OSC_HZ 24000000 //外界晶振频率设置
/* #define TCFG_CLOCK_MODE CLOCK_MODE_USR//CLOCK_MODE_ADAPTIVE */ /* #define TCFG_CLOCK_MODE CLOCK_MODE_USR//CLOCK_MODE_ADAPTIVE */
#define TCFG_CLOCK_MODE CLOCK_MODE_ADAPTIVE #define TCFG_CLOCK_MODE CLOCK_MODE_ADAPTIVE
//*********************************************************************************// //*********************************************************************************//
// 低功耗配置 // // 低功耗配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_LOWPOWER_POWER_SEL PWR_LDO15 #define TCFG_LOWPOWER_POWER_SEL PWR_LDO15
// #define TCFG_LOWPOWER_POWER_SEL PWR_LDO15 PWR_DCDC15 //电源模式设置可选DCDC和LDO // #define TCFG_LOWPOWER_POWER_SEL PWR_LDO15 PWR_DCDC15 //电源模式设置可选DCDC和LDO
#define TCFG_LOWPOWER_BTOSC_DISABLE 0 //低功耗模式下BTOSC是否保持 #define TCFG_LOWPOWER_BTOSC_DISABLE 0 //低功耗模式下BTOSC是否保持
#define TCFG_LOWPOWER_LOWPOWER_SEL 0 //SLEEP_EN //SNIFF状态下芯片是否进入powerdown #define TCFG_LOWPOWER_LOWPOWER_SEL 0 //SLEEP_EN //SNIFF状态下芯片是否进入powerdown
/*强VDDIO等级配置,可选: /*强VDDIO等级配置,可选:
VDDIOM_VOL_20V VDDIOM_VOL_22V VDDIOM_VOL_24V VDDIOM_VOL_26V VDDIOM_VOL_20V VDDIOM_VOL_22V VDDIOM_VOL_24V VDDIOM_VOL_26V
VDDIOM_VOL_30V VDDIOM_VOL_30V VDDIOM_VOL_32V VDDIOM_VOL_36V*/ VDDIOM_VOL_30V VDDIOM_VOL_30V VDDIOM_VOL_32V VDDIOM_VOL_36V*/
#define TCFG_LOWPOWER_VDDIOM_LEVEL VDDIOM_VOL_30V #define TCFG_LOWPOWER_VDDIOM_LEVEL VDDIOM_VOL_30V
/*弱VDDIO等级配置可选 /*弱VDDIO等级配置可选
VDDIOW_VOL_21V VDDIOW_VOL_24V VDDIOW_VOL_28V VDDIOW_VOL_32V*/ VDDIOW_VOL_21V VDDIOW_VOL_24V VDDIOW_VOL_28V VDDIOW_VOL_32V*/
#define TCFG_LOWPOWER_VDDIOW_LEVEL VDDIOW_VOL_28V //弱VDDIO等级配置 #define TCFG_LOWPOWER_VDDIOW_LEVEL VDDIOW_VOL_28V //弱VDDIO等级配置
#define TCFG_LOWPOWER_OSC_TYPE OSC_TYPE_LRC #define TCFG_LOWPOWER_OSC_TYPE OSC_TYPE_LRC
#define TCFG_VD13_CAP_EN 1 #define TCFG_VD13_CAP_EN 1
//*********************************************************************************// //*********************************************************************************//
// g-sensor配置 // // g-sensor配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_GSENSOR_ENABLE 0 //gSensor使能 #define TCFG_GSENSOR_ENABLE 0 //gSensor使能
#define TCFG_DA230_EN 0 #define TCFG_DA230_EN 0
#define TCFG_SC7A20_EN 0 #define TCFG_SC7A20_EN 0
#define TCFG_STK8321_EN 0 #define TCFG_STK8321_EN 0
#define TCFG_GSENOR_USER_IIC_TYPE 0 //0:软件IIC 1:硬件IIC #define TCFG_GSENOR_USER_IIC_TYPE 0 //0:软件IIC 1:硬件IIC
//*********************************************************************************// //*********************************************************************************//
// 系统配置 // // 系统配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_AUTO_SHUT_DOWN_TIME 0 //没有蓝牙连接自动关机时间 #define TCFG_AUTO_SHUT_DOWN_TIME 0 //没有蓝牙连接自动关机时间
#if (TCFG_LOWPOWER_POWER_SEL == PWR_DCDC15) #if (TCFG_LOWPOWER_POWER_SEL == PWR_DCDC15)
#define TCFG_SYS_LVD_EN 1 //dcdc模式电压低于2.4v的时候切为LDO模式需要开启电量检测 #define TCFG_SYS_LVD_EN 1 //dcdc模式电压低于2.4v的时候切为LDO模式需要开启电量检测
#else #else
#define TCFG_SYS_LVD_EN 1 //电量检测使能 #define TCFG_SYS_LVD_EN 1 //电量检测使能
#endif #endif
#define TCFG_POWER_ON_NEED_KEY 0 //是否需要按按键开机配置 #define TCFG_POWER_ON_NEED_KEY 0 //是否需要按按键开机配置
#define TCFG_HID_AUTO_SHUTDOWN_TIME (0 * 60) //HID无操作自动关机(单位:秒) #define TCFG_HID_AUTO_SHUTDOWN_TIME (0 * 60) //HID无操作自动关机(单位:秒)
//*********************************************************************************// //*********************************************************************************//
// 蓝牙配置 // // 蓝牙配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_USER_TWS_ENABLE 0 //tws功能使能 #define TCFG_USER_TWS_ENABLE 0 //tws功能使能
#define TCFG_USER_BLE_ENABLE 1 //BLE功能使能,---使能后,请配置TCFG_BLE_DEMO_SELECT选择DEMO例子 #define TCFG_USER_BLE_ENABLE 1 //BLE功能使能,---使能后,请配置TCFG_BLE_DEMO_SELECT选择DEMO例子
#define TCFG_USER_EDR_ENABLE 0 //EDR功能使能 #define TCFG_USER_EDR_ENABLE 0 //EDR功能使能
#define USER_SUPPORT_PROFILE_SPP 0 #define USER_SUPPORT_PROFILE_SPP 0
#define USER_SUPPORT_PROFILE_HFP 0 #define USER_SUPPORT_PROFILE_HFP 0
#define USER_SUPPORT_PROFILE_A2DP 0 #define USER_SUPPORT_PROFILE_A2DP 0
#define USER_SUPPORT_PROFILE_AVCTP 0 #define USER_SUPPORT_PROFILE_AVCTP 0
#define USER_SUPPORT_PROFILE_HID 0 #define USER_SUPPORT_PROFILE_HID 0
#define USER_SUPPORT_PROFILE_PNP 0 #define USER_SUPPORT_PROFILE_PNP 0
#define USER_SUPPORT_PROFILE_PBAP 0 #define USER_SUPPORT_PROFILE_PBAP 0
#if(TCFG_USER_TWS_ENABLE || TCFG_USER_BLE_ENABLE) #if(TCFG_USER_TWS_ENABLE || TCFG_USER_BLE_ENABLE)
#define TCFG_BD_NUM 1 //连接设备个数配置 #define TCFG_BD_NUM 1 //连接设备个数配置
#define TCFG_AUTO_STOP_PAGE_SCAN_TIME 0 //配置一拖二第一台连接后自动关闭PAGE SCAN的时间(单位分钟) #define TCFG_AUTO_STOP_PAGE_SCAN_TIME 0 //配置一拖二第一台连接后自动关闭PAGE SCAN的时间(单位分钟)
#else #else
#define TCFG_BD_NUM 1 //连接设备个数配置 #define TCFG_BD_NUM 1 //连接设备个数配置
#define TCFG_AUTO_STOP_PAGE_SCAN_TIME 0 //配置一拖二第一台连接后自动关闭PAGE SCAN的时间(单位分钟) #define TCFG_AUTO_STOP_PAGE_SCAN_TIME 0 //配置一拖二第一台连接后自动关闭PAGE SCAN的时间(单位分钟)
#endif #endif
#define BT_INBAND_RINGTONE 0 //是否播放手机自带来电铃声 #define BT_INBAND_RINGTONE 0 //是否播放手机自带来电铃声
#define BT_PHONE_NUMBER 0 //是否播放来电报号 #define BT_PHONE_NUMBER 0 //是否播放来电报号
#define BT_SUPPORT_DISPLAY_BAT 0 //是否使能电量检测 #define BT_SUPPORT_DISPLAY_BAT 0 //是否使能电量检测
#define BT_SUPPORT_MUSIC_VOL_SYNC 0 //是否使能音量同步 #define BT_SUPPORT_MUSIC_VOL_SYNC 0 //是否使能音量同步
//*********************************************************************************// //*********************************************************************************//
// 电源切换配置 // // 电源切换配置 //
//*********************************************************************************// //*********************************************************************************//
#define CONFIG_PHONE_CALL_USE_LDO15 1 #define CONFIG_PHONE_CALL_USE_LDO15 1
//*********************************************************************************// //*********************************************************************************//
// 时钟配置 // // 时钟配置 //
//*********************************************************************************// //*********************************************************************************//
#define CONFIG_BT_NORMAL_HZ (48 * 1000000L) #define CONFIG_BT_NORMAL_HZ (48 * 1000000L)
//#define CONFIG_BT_CONNECT_HZ (48 * 1000000L) //#define CONFIG_BT_CONNECT_HZ (48 * 1000000L)
//*********************************************************************************// //*********************************************************************************//
// 配置结束 // // 配置结束 //
//*********************************************************************************// //*********************************************************************************//
#endif #endif
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -1,54 +1,62 @@
#ifndef _APP_TEMPERATURE_H_ #ifndef _APP_TEMPERATURE_H_
#define _APP_TEMPERATURE_H_ #define _APP_TEMPERATURE_H_
#include "typedef.h" #include "typedef.h"
#include "system/event.h" #include "system/event.h"
#define BLE_TEMPERATURE_DETECT_INTERVAL 250 /**
#define BLE_TEMPERATURE_WORK_TIMEOUT 10*1000 * 1.0.1 2025.05.16
#define BLE_TEMPERATURE_SLEEP_TIMEOUT 3*1000 */
#define BLE_TEMPERATURE_DEVICE_NAME "IT12" #define BLE_TEMPERATURE_DEVICE_SOFT_VER "1.0.1"
#define BLE_TEMPERATURE_LOWPOWER_OFFSIZE 3000 //mV
#define BLE_TEMPERATURE_DETECT_INTERVAL 250
#define BLE_TEMPERATURE_DEVICE_NST1002 1002 #define BLE_TEMPERATURE_WORK_TIMEOUT 10*1000
#define BLE_TEMPERATURE_DEVICE_NTC 0 #define BLE_TEMPERATURE_SLEEP_TIMEOUT 3*1000
#define BLE_TEMPERATURE_DEVICE_NAME "IT12"
#define BLE_TEMPERATURE_WORK_LED IO_PORTA_07 #define BLE_TEMPERATURE_LOWPOWER_OFFSIZE 3000 //mV
#define BLE_TEMPERATURE_CHARGE_STATE_CHARGING 1 #define BLE_TEMPERATURE_DEVICE_NST1002 1002
#define BLE_TEMPERATURE_CHARGE_STATE_FULL 2 #define BLE_TEMPERATURE_DEVICE_NTC 0
#define BLE_TEMPERATURE_CHARGE_STATE_IDLE 3
#define BLE_TEMPERATURE_CHARGE_STATE_LOWPOWER 4 #define BLE_TEMPERATURE_WORK_LED IO_PORTA_07
//VM用户自定义配置项[1 ~ 49] #define BLE_TEMPERATURE_CHARGE_STATE_CHARGING 1
#define BLE_TEMPERATURE_VM_DEVICE_CONFIG 2 #define BLE_TEMPERATURE_CHARGE_STATE_FULL 2
#define BLE_TEMPERATURE_CHARGE_STATE_IDLE 3
typedef struct #define BLE_TEMPERATURE_CHARGE_STATE_LOWPOWER 4
{
u16 temperature_sensor; //VM用户自定义配置项[1 ~ 49]
u32 temperature_ntc; #define BLE_TEMPERATURE_VM_DEVICE_CONFIG 2
u8 batt_percent;
u16 batt_vat; typedef struct
u8 is_bat_charge; {
u8 is_bat_full; u16 temperature_sensor;
}app_dev_info_t; u16 temperature_ntc;
u8 batt_percent;
typedef struct u16 batt_val;
{ u8 is_bat_charge;
/* 测温检测间隔 ms 1000ms*/ u8 is_bat_full;
int16_t detect_interval; }app_dev_info_t;
/* 温度校准 0.1C *1000 = 100 或者 -100*/
int16_t temperature_offset; typedef struct
}app_dev_config_t; {
/* 测温检测间隔 ms 1000ms*/
//extern struct app_dev_info_t dev_info; int16_t detect_interval;
//extern struct app_dev_config_t dev_config; /* 温度校准 0.1C *1000 = 100 或者 -100*/
int16_t temperature_offset;
void temperature_ble_init(); }app_dev_config_t;
void temperature_init(void);
void ble_receive_callback(u8* data,u16 len); //extern struct app_dev_info_t dev_info;
//extern struct app_dev_config_t dev_config;
void temperature_work_led(u8 on);
void temperature_charge_led(u8 on); void temperature_ble_init();
void temperature_charge_state(int state); void temperature_init(void);
#endif //_APP_TEMPERATURE_H_
void ble_receive_callback(u8* data,u16 len);
void ble_on_connect_change(u8 is_connect);
void temperature_work_led(u8 on);
void temperature_charge_led(u8 on);
void temperature_charge_state(int state);
void temperature_deinit(void);
#endif //_APP_TEMPERATURE_H_

View File

@ -1,118 +1,119 @@
#include "app_config.h" #include "app_config.h"
#include "asm/charge.h" #include "asm/charge.h"
#include "asm/pwm_led.h" #include "asm/pwm_led.h"
#include "system/event.h" #include "system/event.h"
#include "system/app_core.h" #include "system/app_core.h"
#include "system/includes.h" #include "system/includes.h"
#include "app_action.h" #include "app_action.h"
#include "asm/wdt.h" #include "asm/wdt.h"
#include "app_main.h" #include "app_main.h"
#include "app_power_manage.h" #include "app_power_manage.h"
#include "app_handshake.h" #include "app_handshake.h"
#include "app_temperature.h" #include "app_temperature.h"
#define LOG_TAG_CONST APP_CHARGE #define LOG_TAG_CONST APP_CHARGE
#define LOG_TAG "[APP_CHARGE]" #define LOG_TAG "[APP_CHARGE]"
#define LOG_ERROR_ENABLE #define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE #define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE #define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */ /* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE #define LOG_CLI_ENABLE
#include "debug.h" #include "debug.h"
#if TCFG_CHARGE_ENABLE #if TCFG_CHARGE_ENABLE
#if TCFG_HANDSHAKE_ENABLE #if TCFG_HANDSHAKE_ENABLE
static void handshake_complete(void) static void handshake_complete(void)
{ {
handshake_app_stop(); handshake_app_stop();
if (get_lvcmp_det()) { if (get_lvcmp_det()) {
charge_start(); charge_start();
} }
} }
#endif #endif
void charge_start_deal(void) void charge_start_deal(void)
{ {
log_info("%s\n", __func__); log_info("%s\n", __func__);
power_set_mode(PWR_LDO15); power_set_mode(PWR_LDO15);
} }
void ldo5v_keep_deal(void) void ldo5v_keep_deal(void)
{ {
log_info("%s\n", __func__); log_info("%s\n", __func__);
#if TCFG_HANDSHAKE_ENABLE #if TCFG_HANDSHAKE_ENABLE
handshake_app_start(2, handshake_complete); handshake_app_start(2, handshake_complete);
#endif #endif
temperature_charge_state(BLE_TEMPERATURE_CHARGE_STATE_CHARGING); temperature_charge_state(BLE_TEMPERATURE_CHARGE_STATE_CHARGING);
} }
void charge_full_deal(void) void charge_full_deal(void)
{ {
log_info("%s\n", __func__); log_info("%s\n", __func__);
charge_close(); charge_close();
//power_set_soft_poweroff(); //power_set_soft_poweroff();
//extern spple_set_soft_poweroff(); //extern spple_set_soft_poweroff();
//spple_set_soft_poweroff(); //spple_set_soft_poweroff();
temperature_charge_state(BLE_TEMPERATURE_CHARGE_STATE_FULL); temperature_charge_state(BLE_TEMPERATURE_CHARGE_STATE_FULL);
} }
void charge_close_deal(void) void charge_close_deal(void)
{ {
log_info("%s\n", __FUNCTION__); log_info("%s\n", __FUNCTION__);
} }
void charge_ldo5v_in_deal(void) void charge_ldo5v_in_deal(void)
{ {
log_info("%s\n", __FUNCTION__); log_info("%s\n", __FUNCTION__);
#if TCFG_HANDSHAKE_ENABLE #if TCFG_HANDSHAKE_ENABLE
handshake_app_start(2, handshake_complete); handshake_app_start(2, handshake_complete);
#else #else
charge_start(); charge_start();
#endif #endif
temperature_charge_state(BLE_TEMPERATURE_CHARGE_STATE_CHARGING); temperature_charge_state(BLE_TEMPERATURE_CHARGE_STATE_CHARGING);
} }
void charge_ldo5v_off_deal(void) void charge_ldo5v_off_deal(void)
{ {
log_info("%s\n", __FUNCTION__); log_info("%s\n", __FUNCTION__);
#if TCFG_HANDSHAKE_ENABLE #if TCFG_HANDSHAKE_ENABLE
handshake_app_stop(); handshake_app_stop();
#endif #endif
charge_close(); charge_close();
power_set_mode(TCFG_LOWPOWER_POWER_SEL); power_set_mode(TCFG_LOWPOWER_POWER_SEL);
#if TCFG_SYS_LVD_EN #if TCFG_SYS_LVD_EN
vbat_check_init(); vbat_check_init();
#endif #endif
temperature_charge_state(BLE_TEMPERATURE_CHARGE_STATE_IDLE); temperature_charge_state(BLE_TEMPERATURE_CHARGE_STATE_IDLE);
} }
int app_charge_event_handler(struct device_event *dev) int app_charge_event_handler(struct device_event *dev)
{ {
switch (dev->event) { log_info("%s\n %d", __FUNCTION__,dev->event);
case CHARGE_EVENT_CHARGE_START: switch (dev->event) {
charge_start_deal(); case CHARGE_EVENT_CHARGE_START:
break; charge_start_deal();
case CHARGE_EVENT_CHARGE_CLOSE: break;
charge_close_deal(); case CHARGE_EVENT_CHARGE_CLOSE:
break; charge_close_deal();
case CHARGE_EVENT_CHARGE_FULL: break;
charge_full_deal(); case CHARGE_EVENT_CHARGE_FULL:
break; charge_full_deal();
case CHARGE_EVENT_LDO5V_KEEP: break;
ldo5v_keep_deal(); case CHARGE_EVENT_LDO5V_KEEP:
break; ldo5v_keep_deal();
case CHARGE_EVENT_LDO5V_IN: break;
charge_ldo5v_in_deal(); case CHARGE_EVENT_LDO5V_IN:
break; charge_ldo5v_in_deal();
case CHARGE_EVENT_LDO5V_OFF: break;
charge_ldo5v_off_deal(); case CHARGE_EVENT_LDO5V_OFF:
break; charge_ldo5v_off_deal();
default: break;
break; default:
} break;
return 0; }
} return 0;
}
#endif
#endif

View File

@ -1,432 +1,434 @@
#include "rtc_alarm.h" #include "rtc_alarm.h"
#include "system/timer.h" #include "system/timer.h"
#include "app_config.h" #include "app_config.h"
#include "asm/rtc.h" #include "asm/rtc.h"
#if TCFG_RTC_ALARM_ENABLE #if TCFG_RTC_ALARM_ENABLE
#define ALARM_DEBUG_EN 1 #define ALARM_DEBUG_EN 1
#if ALARM_DEBUG_EN #if ALARM_DEBUG_EN
#define alarm_printf(x, ...) printf("[RTC_ALARM]" x " ", ## __VA_ARGS__) #define alarm_printf(x, ...) printf("[RTC_ALARM]" x " ", ## __VA_ARGS__)
#define alarm_printf_buf put_buf #define alarm_printf_buf put_buf
#define alarm_putchar putchar #define alarm_putchar putchar
#else #else
#define alarm_printf(...) #define alarm_printf(...)
#define alarm_printf_buf(...) #define alarm_printf_buf(...)
#define alarm_putchar(...) #define alarm_putchar(...)
#endif #endif
#define RTC_MASK (0xaa55) #define RTC_MASK (0xaa55)
static T_ALARM alarm_tab[M_MAX_ALARM_NUMS]; static T_ALARM alarm_tab[M_MAX_ALARM_NUMS];
static T_ALARM_VM_MASK alarm_mask; static T_ALARM_VM_MASK alarm_mask;
static u8 alarm_pnd_flag = 0; static u8 alarm_pnd_flag = 0;
static void (*_user_isr_cbfun)(u8) = NULL; static void (*_user_isr_cbfun)(u8) = NULL;
void alarm_send_event(u8 index); void alarm_send_event(u8 index);
#if TCFG_RTC_ALARM_ENABLE #if TCFG_RTC_ALARM_ENABLE
struct sys_time rtc_read_test; struct sys_time rtc_read_test;
struct sys_time alm_read_test; struct sys_time alm_read_test;
struct sys_time alm_write_test = { struct sys_time alm_write_test = {
.year = 2024, .year = 2024,
.month  =  1, .month  =  1,
.day = 1, .day = 1,
.hour = 0, .hour = 0,
.min = 0, .min = 0,
.sec = 20, .sec = 20,
}; };
#endif #endif
static u8 alarm_vm_write_mask(u8 alarm_active_index) static u8 alarm_vm_write_mask(u8 alarm_active_index)
{ {
alarm_mask.head = RTC_MASK; alarm_mask.head = RTC_MASK;
alarm_mask.alarm_active_index = alarm_active_index; alarm_mask.alarm_active_index = alarm_active_index;
int ret = syscfg_write(VM_ALARM_MASK, (u8 *)&alarm_mask, sizeof(T_ALARM_VM_MASK)); int ret = syscfg_write(VM_ALARM_MASK, (u8 *)&alarm_mask, sizeof(T_ALARM_VM_MASK));
if (ret <= 0) { if (ret <= 0) {
alarm_printf("alarm mask write vm err!\n"); alarm_printf("alarm mask write vm err!\n");
return 1; return 1;
} }
return 0; return 0;
} }
static u8 alarm_vm_read_mask(void) static u8 alarm_vm_read_mask(void)
{ {
memset((u8 *)&alarm_mask, 0, sizeof(T_ALARM_VM_MASK)); memset((u8 *)&alarm_mask, 0, sizeof(T_ALARM_VM_MASK));
int ret = syscfg_read(VM_ALARM_MASK, (u8 *)&alarm_mask, sizeof(T_ALARM_VM_MASK)); int ret = syscfg_read(VM_ALARM_MASK, (u8 *)&alarm_mask, sizeof(T_ALARM_VM_MASK));
if ((ret <= 0) || (alarm_mask.head != RTC_MASK)) { //第一次读的时候 if ((ret <= 0) || (alarm_mask.head != RTC_MASK)) { //第一次读的时候
alarm_printf("alarm mask read vm err!\n"); alarm_printf("alarm mask read vm err!\n");
return 1; return 1;
} }
return 0; return 0;
} }
static u8 alarm_vm_write_time_tab(T_ALARM_VM *pAlarm_tab, u8 index) static u8 alarm_vm_write_time_tab(T_ALARM_VM *pAlarm_tab, u8 index)
{ {
int ret; int ret;
T_ALARM_VM tmp = {0}; T_ALARM_VM tmp = {0};
tmp.head = RTC_MASK; tmp.head = RTC_MASK;
memcpy((u8 *)&tmp.alarm, (u8 *)pAlarm_tab, sizeof(T_ALARM)); memcpy((u8 *)&tmp.alarm, (u8 *)pAlarm_tab, sizeof(T_ALARM));
ret = syscfg_write(VM_ALARM_0 + index, (u8 *)&tmp, sizeof(T_ALARM_VM)); ret = syscfg_write(VM_ALARM_0 + index, (u8 *)&tmp, sizeof(T_ALARM_VM));
if (ret <= 0) { if (ret <= 0) {
alarm_printf("alarm write vm err!\n"); alarm_printf("alarm write vm err!\n");
return 1; return 1;
} }
return 0; return 0;
} }
static u8 alarm_vm_read_time_tab(T_ALARM_VM *pAlarm_tab, u8 index) static u8 alarm_vm_read_time_tab(T_ALARM_VM *pAlarm_tab, u8 index)
{ {
T_ALARM_VM tmp = {0}; T_ALARM_VM tmp = {0};
int ret = syscfg_read(VM_ALARM_0 + index, (u8 *)&tmp, sizeof(T_ALARM_VM)); int ret = syscfg_read(VM_ALARM_0 + index, (u8 *)&tmp, sizeof(T_ALARM_VM));
if ((ret <= 0) || (tmp.head != RTC_MASK)) { if ((ret <= 0) || (tmp.head != RTC_MASK)) {
alarm_printf("alarm read vm err!\n"); alarm_printf("alarm read vm err!\n");
return 1; return 1;
} }
memcpy((u8 *)pAlarm_tab, (u8 *)&tmp.alarm, sizeof(T_ALARM)); memcpy((u8 *)pAlarm_tab, (u8 *)&tmp.alarm, sizeof(T_ALARM));
return 0; return 0;
} }
static void alarm_calculate_next_few_time(struct sys_time *time, u16 days) static void alarm_calculate_next_few_time(struct sys_time *time, u16 days)
{ {
if (!days) { if (!days) {
return; return;
} }
u16 tmp_day = ymd_to_day(time); u16 tmp_day = ymd_to_day(time);
tmp_day += days; tmp_day += days;
day_to_ymd(tmp_day, time); day_to_ymd(tmp_day, time);
} }
static void alarm_calculate_time_by_week_mode(struct sys_time *pTime, u8 mode) static void alarm_calculate_time_by_week_mode(struct sys_time *pTime, u8 mode)
{ {
if (0 == mode) { if (0 == mode) {
return; return;
} }
if ((BIT(0)) == mode) { if ((BIT(0)) == mode) {
return; return;
} }
u16 tmp_mode = ((mode & 0xfe) << 7) | mode ; u16 tmp_mode = ((mode & 0xfe) << 7) | mode ;
u8 alarm_week = caculate_weekday_by_time(pTime); //获取闹钟是周几1~7 u8 alarm_week = caculate_weekday_by_time(pTime); //获取闹钟是周几1~7
u8 i; u8 i;
for (i = 1; i < 15; i++) { for (i = 1; i < 15; i++) {
if (tmp_mode & BIT(i)) { if (tmp_mode & BIT(i)) {
if (i >= alarm_week) { if (i >= alarm_week) {
break; break;
} }
} }
} }
alarm_calculate_next_few_time(pTime, i - alarm_week); alarm_calculate_next_few_time(pTime, i - alarm_week);
} }
static u8 alarm_update_a_time_tab(struct sys_time *cTime, T_ALARM *pAlarm_tab, u32 *diff) static u8 alarm_update_a_time_tab(struct sys_time *cTime, T_ALARM *pAlarm_tab, u32 *diff)
{ {
struct sys_time *pTime = &(pAlarm_tab->time); struct sys_time *pTime = &(pAlarm_tab->time);
u32 c_tmp = (ymd_to_day(cTime) << 17) | ((cTime->hour & 0x1f) << 12) | ((cTime->min & 0x3f) << 6) | (cTime->sec & 0x3f); u32 c_tmp = (ymd_to_day(cTime) << 17) | ((cTime->hour & 0x1f) << 12) | ((cTime->min & 0x3f) << 6) | (cTime->sec & 0x3f);
u32 p_tmp = (ymd_to_day(pTime) << 17) | ((pTime->hour & 0x1f) << 12) | ((pTime->min & 0x3f) << 6) | (pTime->sec & 0x3f); u32 p_tmp = (ymd_to_day(pTime) << 17) | ((pTime->hour & 0x1f) << 12) | ((pTime->min & 0x3f) << 6) | (pTime->sec & 0x3f);
if (c_tmp >= p_tmp) { if (c_tmp >= p_tmp) {
pTime->year = cTime->year; pTime->year = cTime->year;
pTime->month = cTime->month; pTime->month = cTime->month;
pTime->day = cTime->day; pTime->day = cTime->day;
alarm_calculate_next_few_time(pTime, 1); alarm_calculate_next_few_time(pTime, 1);
alarm_calculate_time_by_week_mode(pTime, pAlarm_tab->mode); alarm_calculate_time_by_week_mode(pTime, pAlarm_tab->mode);
p_tmp = (ymd_to_day(pTime) << 17) | ((pTime->hour & 0x1f) << 12) | ((pTime->min & 0x3f) << 6) | (pTime->sec & 0x3f); p_tmp = (ymd_to_day(pTime) << 17) | ((pTime->hour & 0x1f) << 12) | ((pTime->min & 0x3f) << 6) | (pTime->sec & 0x3f);
*diff = p_tmp - c_tmp; *diff = p_tmp - c_tmp;
return 1; return 1;
} else if (pAlarm_tab->mode & 0xfe) { } else if (pAlarm_tab->mode & 0xfe) {
alarm_calculate_time_by_week_mode(pTime, pAlarm_tab->mode); alarm_calculate_time_by_week_mode(pTime, pAlarm_tab->mode);
p_tmp = (ymd_to_day(pTime) << 17) | ((pTime->hour & 0x1f) << 12) | ((pTime->min & 0x3f) << 6) | (pTime->sec & 0x3f); p_tmp = (ymd_to_day(pTime) << 17) | ((pTime->hour & 0x1f) << 12) | ((pTime->min & 0x3f) << 6) | (pTime->sec & 0x3f);
*diff = p_tmp - c_tmp; *diff = p_tmp - c_tmp;
return 1; return 1;
} }
*diff = p_tmp - c_tmp; *diff = p_tmp - c_tmp;
return 0; return 0;
} }
static u8 alarm_update_all_time(void) static u8 alarm_update_all_time(void)
{ {
u8 err = 0; u8 err = 0;
u32 diff = 0; u32 diff = 0;
u32 diff_min = -1; u32 diff_min = -1;
u8 closest = -1; u8 closest = -1;
struct sys_time current_time = {0}; struct sys_time current_time = {0};
rtc_ioctl(IOCTL_GET_SYS_TIME, (u32)&current_time); rtc_ioctl(IOCTL_GET_SYS_TIME, (u32)&current_time);
for (u8 i = 0; i < M_MAX_ALARM_NUMS; i ++) { for (u8 i = 0; i < M_MAX_ALARM_NUMS; i ++) {
if (alarm_tab[i].en) { if (alarm_tab[i].en) {
err = alarm_update_a_time_tab(&current_time, &alarm_tab[i], (u32 *)&diff); err = alarm_update_a_time_tab(&current_time, &alarm_tab[i], (u32 *)&diff);
if (err) { //时间有更新 if (err) { //时间有更新
err = alarm_vm_write_time_tab(&alarm_tab[i], i); err = alarm_vm_write_time_tab(&alarm_tab[i], i);
if (err) { if (err) {
return 1; return 1;
} }
} }
if (diff < diff_min) { if (diff < diff_min) {
diff_min = diff; diff_min = diff;
closest = i; closest = i;
} }
} }
} }
if (closest > M_MAX_ALARM_NUMS) { if (closest > M_MAX_ALARM_NUMS) {
set_alarm_ctrl(0); set_alarm_ctrl(0);
} }
if ((alarm_tab[closest].en)) { //最接近闹钟号跟记录的不一样,则要重设硬件寄存器,更新记录 if ((alarm_tab[closest].en)) { //最接近闹钟号跟记录的不一样,则要重设硬件寄存器,更新记录
rtc_ioctl(IOCTL_SET_ALARM, (u32)&alarm_tab[closest].time); rtc_ioctl(IOCTL_SET_ALARM, (u32)&alarm_tab[closest].time);
if (closest != alarm_mask.alarm_active_index) { //最接近闹钟号跟记录不一样更新VM if (closest != alarm_mask.alarm_active_index) { //最接近闹钟号跟记录不一样更新VM
err = alarm_vm_write_mask(closest); err = alarm_vm_write_mask(closest);
if (err) { if (err) {
return 1; return 1;
} }
} }
} }
return 0; return 0;
} }
void alarm_init(const struct rtc_dev_platform_data *arg) void alarm_init(const struct rtc_dev_platform_data *arg)
{ {
rtc_init(arg); rtc_init(arg);
_user_isr_cbfun = arg->cbfun; _user_isr_cbfun = arg->cbfun;
u8 err = alarm_vm_read_mask(); u8 err = alarm_vm_read_mask();
if (err) { if (err) {
err = alarm_vm_write_mask(0xff); err = alarm_vm_write_mask(0xff);
if (err) { if (err) {
alarm_printf("init : alarm mask read & write vm err!\n"); alarm_printf("init : alarm mask read & write vm err!\n");
return; return;
} }
} }
for (u8 i = 0; i < M_MAX_ALARM_NUMS; i ++) { for (u8 i = 0; i < M_MAX_ALARM_NUMS; i ++) {
memset(&(alarm_tab[i]), 0, sizeof(T_ALARM)); memset(&(alarm_tab[i]), 0, sizeof(T_ALARM));
alarm_vm_read_time_tab(&(alarm_tab[i]), i); //读出数组 alarm_vm_read_time_tab(&(alarm_tab[i]), i); //读出数组
} }
if (alarm_pnd_flag) { //防止初始化前,就已经起闹钟中断了 if (alarm_pnd_flag) { //防止初始化前,就已经起闹钟中断了
alarm_send_event(alarm_mask.alarm_active_index); alarm_send_event(alarm_mask.alarm_active_index);
} else { } else {
err = alarm_update_all_time(); //更新数组 err = alarm_update_all_time(); //更新数组
if (err) { if (err) {
alarm_printf("init : update alarm write vm err!\n"); alarm_printf("init : update alarm write vm err!\n");
return; return;
} }
} }
alarm_pnd_flag = 1; alarm_pnd_flag = 1;
rtc_ioctl(IOCTL_GET_SYS_TIME,  &rtc_read_test); //读时钟 rtc_ioctl(IOCTL_GET_SYS_TIME,  &rtc_read_test); //读时钟
alarm_printf("rtc_read_sys_time: %d-%d-%d %d:%d:%d\n", alarm_printf("rtc_read_sys_time: %d-%d-%d %d:%d:%d\n",
rtc_read_test.year, rtc_read_test.year,
rtc_read_test.month, rtc_read_test.month,
rtc_read_test.day, rtc_read_test.day,
rtc_read_test.hour, rtc_read_test.hour,
rtc_read_test.min, rtc_read_test.min,
rtc_read_test.sec); rtc_read_test.sec);
rtc_ioctl(IOCTL_GET_ALARM, &alm_read_test); //读闹钟 rtc_ioctl(IOCTL_GET_ALARM, &alm_read_test); //读闹钟
alarm_printf("rtc_read_alarm: %d-%d-%d %d:%d:%d\n", alarm_printf("rtc_read_alarm: %d-%d-%d %d:%d:%d\n",
alm_read_test.year,                         alm_read_test.year,                        
alm_read_test.month, alm_read_test.month,
alm_read_test.day, alm_read_test.day,
alm_read_test.hour, alm_read_test.hour,
alm_read_test.min, alm_read_test.min,
alm_read_test.sec); alm_read_test.sec);
} }
void alarm_rtc_stop(void) void alarm_rtc_stop(void)
{ {
set_alarm_ctrl(0); set_alarm_ctrl(0);
} }
void alarm_rtc_start(void) void alarm_rtc_start(void)
{ {
set_alarm_ctrl(1); set_alarm_ctrl(1);
} }
u8 alarm_get_active_index(void) u8 alarm_get_active_index(void)
{ {
return alarm_mask.alarm_active_index; return alarm_mask.alarm_active_index;
} }
u8 alarm_get_en_info(void) u8 alarm_get_en_info(void)
{ {
u8 en = 0; u8 en = 0;
for (u8 i = 0; i < M_MAX_ALARM_NUMS; i ++) { for (u8 i = 0; i < M_MAX_ALARM_NUMS; i ++) {
en |= BIT(!!(alarm_tab[i].en)); en |= BIT(!!(alarm_tab[i].en));
} }
return en; return en;
} }
void alarm_get_time_info(T_ALARM *p, u8 index) void alarm_get_time_info(T_ALARM *p, u8 index)
{ {
memcpy((u8 *)p, (u8 *)&alarm_tab[index], sizeof(T_ALARM)); memcpy((u8 *)p, (u8 *)&alarm_tab[index], sizeof(T_ALARM));
} }
u8 alarm_add(T_ALARM *p, u8 index) u8 alarm_add(T_ALARM *p, u8 index)
{ {
if (index > M_MAX_ALARM_INDEX) { if (index > M_MAX_ALARM_INDEX) {
return 1; return 1;
} }
if (p->mode > M_MAX_ALARM_MODE) { if (p->mode > M_MAX_ALARM_MODE) {
return 1; return 1;
} }
memcpy((u8 *)&alarm_tab[index], (u8 *)p, sizeof(T_ALARM)); memcpy((u8 *)&alarm_tab[index], (u8 *)p, sizeof(T_ALARM));
u8 err = alarm_vm_write_time_tab(&alarm_tab[index], index); u8 err = alarm_vm_write_time_tab(&alarm_tab[index], index);
if (err) { if (err) {
return 1; return 1;
} }
err = alarm_update_all_time(); //更新数组 err = alarm_update_all_time(); //更新数组
if (err) { if (err) {
return 1; return 1;
} }
return 0; return 0;
} }
u8 alarm_en(u8 index, u8 en) u8 alarm_en(u8 index, u8 en)
{ {
if (index > M_MAX_ALARM_INDEX) { if (index > M_MAX_ALARM_INDEX) {
return 1; return 1;
} }
if ((!!en) == alarm_tab[index].en) { if ((!!en) == alarm_tab[index].en) {
return 0; return 0;
} }
alarm_tab[index].en = !!en; alarm_tab[index].en = !!en;
u8 err = alarm_vm_write_time_tab(&alarm_tab[index], index); u8 err = alarm_vm_write_time_tab(&alarm_tab[index], index);
if (err) { if (err) {
return 1; return 1;
} }
err = alarm_update_all_time(); //更新数组 err = alarm_update_all_time(); //更新数组
if (err) { if (err) {
return 1; return 1;
} }
return 0; return 0;
} }
//设备事件响应demo //设备事件响应demo
static void alarm_event_handler(struct sys_event *e) static void alarm_event_handler(struct sys_event *e)
{ {
u8 index; u8 index;
u8 err; u8 err;
if ((u32)e->arg == DEVICE_EVENT_FROM_ALM) { if ((u32)e->arg == DEVICE_EVENT_FROM_ALM) {
if (e->u.dev.event == DEVICE_EVENT_IN) { if (e->u.dev.event == DEVICE_EVENT_IN) {
index = (u8)(e->u.dev.value); index = (u8)(e->u.dev.value);
if (alarm_tab[index].mode == E_ALARM_MODE_ONCE) { if (alarm_tab[index].mode == E_ALARM_MODE_ONCE) {
err = alarm_en(index, 0); err = alarm_en(index, 0);
} else { } else {
err = alarm_update_all_time(); //更新数组 err = alarm_update_all_time(); //更新数组
} }
if (err) { if (err) {
alarm_printf("isr : update alarm %d err!\n", index); alarm_printf("isr : update alarm %d err!\n", index);
return; return;
} }
if (_user_isr_cbfun) { if (_user_isr_cbfun) {
_user_isr_cbfun(index); _user_isr_cbfun(index);
} }
} }
} }
} }
SYS_EVENT_HANDLER(SYS_DEVICE_EVENT, alarm_event_handler, 0); SYS_EVENT_HANDLER(SYS_DEVICE_EVENT, alarm_event_handler, 0);
void alarm_send_event(u8 index) void alarm_send_event(u8 index)
{ {
struct sys_event e; printf("**** rtc alarm_send_event ****\n");
e.type = SYS_DEVICE_EVENT; struct sys_event e;
e.arg = (void *)DEVICE_EVENT_FROM_ALM; e.type = SYS_DEVICE_EVENT;
e.u.dev.event = DEVICE_EVENT_IN; e.arg = (void *)DEVICE_EVENT_FROM_ALM;
e.u.dev.value = index; e.u.dev.event = DEVICE_EVENT_IN;
sys_event_notify(&e); e.u.dev.value = index;
} sys_event_notify(&e);
}
void alm_wakeup_isr(void)
{ void alm_wakeup_isr(void)
if (alarm_pnd_flag) { {
alarm_send_event(alarm_mask.alarm_active_index); printf("**** rtc alm_wakeup_isr ****\n");
} else { if (alarm_pnd_flag) {
alarm_pnd_flag = 1; alarm_send_event(alarm_mask.alarm_active_index);
} } else {
} alarm_pnd_flag = 1;
}
}
void __attribute__((weak)) alarm_isr_user_cbfun(u8 index)
{
printf("**** alarm %d : hello world ****\n", index); void __attribute__((weak)) alarm_isr_user_cbfun(u8 index)
} {
printf("**** alarm %d : hello world ****\n", index);
//参考的测试代码 }
void user_alarm_test(void)
{ //参考的测试代码
T_ALARM tmp_alarm = {0}; void user_alarm_test(void)
rtc_ioctl(IOCTL_GET_SYS_TIME, (u32)&tmp_alarm.time); {
tmp_alarm.en = 1; //初始化默认打开 T_ALARM tmp_alarm = {0};
#if 1 rtc_ioctl(IOCTL_GET_SYS_TIME, (u32)&tmp_alarm.time);
tmp_alarm.mode = E_ALARM_MODE_ONCE; //此闹钟只起作用一次 tmp_alarm.en = 1; //初始化默认打开
tmp_alarm.time.hour = 0; #if 1
tmp_alarm.time.min = 1; tmp_alarm.mode = E_ALARM_MODE_ONCE; //此闹钟只起作用一次
alarm_add(&tmp_alarm, 0); tmp_alarm.time.hour = 0;
#endif tmp_alarm.time.min = 1;
alarm_add(&tmp_alarm, 0);
#if 1 #endif
tmp_alarm.mode = E_ALARM_MODE_EVERY_DAY; //此闹钟每天都起作用
tmp_alarm.time.hour = 0; #if 1
tmp_alarm.time.min = 2; tmp_alarm.mode = E_ALARM_MODE_EVERY_DAY; //此闹钟每天都起作用
alarm_add(&tmp_alarm, 1); tmp_alarm.time.hour = 0;
#endif tmp_alarm.time.min = 2;
alarm_add(&tmp_alarm, 1);
#if 1 #endif
tmp_alarm.mode = E_ALARM_MODE_EVERY_MONDAY | E_ALARM_MODE_EVERY_WEDNESDAY | E_ALARM_MODE_EVERY_SATURDAY; //此闹钟周1周3周6起作用
tmp_alarm.time.hour = 0; #if 1
tmp_alarm.time.min = 3; tmp_alarm.mode = E_ALARM_MODE_EVERY_MONDAY | E_ALARM_MODE_EVERY_WEDNESDAY | E_ALARM_MODE_EVERY_SATURDAY; //此闹钟周1周3周6起作用
alarm_add(&tmp_alarm, 2); tmp_alarm.time.hour = 0;
#endif tmp_alarm.time.min = 3;
alarm_add(&tmp_alarm, 2);
} #endif
#if TCFG_RTC_ALARM_ENABLE }
//24小时内定时起来
void rtc_alarm_set_timer(u32 seconds) #if TCFG_RTC_ALARM_ENABLE
{ //24小时内定时起来
alarm_printf("rtc_alarm_set_timer"); void rtc_alarm_set_timer(u32 seconds)
{
u8 add_hour = seconds / 3600; alarm_printf("rtc_alarm_set_timer");
u8 add_min = (seconds % 3600) / 60;
u8 add_sec = seconds % 60; u8 add_hour = seconds / 3600;
u8 add_min = (seconds % 3600) / 60;
rtc_ioctl(IOCTL_GET_SYS_TIME,  &rtc_read_test); //读时钟 u8 add_sec = seconds % 60;
alarm_printf("rtc_read_sys_time: %d-%d-%d %d:%d:%d\n",
rtc_read_test.year, rtc_ioctl(IOCTL_GET_SYS_TIME,  &rtc_read_test); //读时钟
rtc_read_test.month, alarm_printf("rtc_read_sys_time: %d-%d-%d %d:%d:%d\n",
rtc_read_test.day, rtc_read_test.year,
rtc_read_test.hour, rtc_read_test.month,
rtc_read_test.min, rtc_read_test.day,
rtc_read_test.sec); rtc_read_test.hour,
rtc_ioctl(IOCTL_GET_ALARM, &alm_read_test); //读闹钟 rtc_read_test.min,
rtc_read_test.sec);
u16 tmp = rtc_read_test.sec + add_sec; rtc_ioctl(IOCTL_GET_ALARM, &alm_read_test); //读闹钟
rtc_read_test.sec = tmp % 60;
u16 tmp = rtc_read_test.sec + add_sec;
tmp = rtc_read_test.min + add_min + tmp / 60; rtc_read_test.sec = tmp % 60;
rtc_read_test.min = tmp % 60;
tmp = rtc_read_test.min + add_min + tmp / 60;
tmp = rtc_read_test.hour + add_hour + tmp / 60; rtc_read_test.min = tmp % 60;
rtc_read_test.hour = tmp % 24;
tmp = rtc_read_test.hour + add_hour + tmp / 60;
rtc_read_test.day += (tmp / 24); rtc_read_test.hour = tmp % 24;
T_ALARM tmp_alarm = {0}; rtc_read_test.day += (tmp / 24);
tmp_alarm.en = 1; //初始化默认打开
tmp_alarm.mode = E_ALARM_MODE_ONCE; //此闹钟只起作用一次 T_ALARM tmp_alarm = {0};
tmp_alarm.en = 1; //初始化默认打开
memcpy(&tmp_alarm.time, &rtc_read_test, sizeof(struct sys_time)); tmp_alarm.mode = E_ALARM_MODE_ONCE; //此闹钟只起作用一次
alarm_add(&tmp_alarm, 0);
memset(&rtc_read_test, 0, sizeof(struct sys_time)); memcpy(&tmp_alarm.time, &rtc_read_test, sizeof(struct sys_time));
rtc_ioctl(IOCTL_GET_ALARM,  &alm_read_test); //读闹钟,校验是否写成功 alarm_add(&tmp_alarm, 0);
alarm_printf("rtc_read_alarm: %d-%d-%d %d:%d:%d\n", memset(&rtc_read_test, 0, sizeof(struct sys_time));
alm_read_test.year,                         rtc_ioctl(IOCTL_GET_ALARM,  &alm_read_test); //读闹钟,校验是否写成功
alm_read_test.month, alarm_printf("rtc_read_alarm: %d-%d-%d %d:%d:%d\n",
alm_read_test.day, alm_read_test.year,                        
alm_read_test.hour, alm_read_test.month,
alm_read_test.min, alm_read_test.day,
alm_read_test.sec); alm_read_test.hour,
} alm_read_test.min,
alm_read_test.sec);
}
#endif
#endif #endif
#endif