更新提交 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
* Description :
* Copyright:(c)JIELI 2011-2019 @ , All Rights Reserved.
*********************************************************************************************/
#include "system/includes.h"
#include "app_config.h"
#include "app_action.h"
#include "app_main.h"
#include "update.h"
#include "update_loader_download.h"
#include "app_charge.h"
#include "app_power_manage.h"
#include "asm/charge.h"
#include "app_temperature.h"
#if TCFG_KWS_VOICE_RECOGNITION_ENABLE
#include "jl_kws/jl_kws_api.h"
#endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */
#define LOG_TAG_CONST APP
#define LOG_TAG "[APP]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
/*任务列表 */
const struct task_info task_info_table[] = {
#if CONFIG_APP_FINDMY
{"app_core", 1, 0, 640 * 2, 128 },
#else
{"app_core", 1, 0, 640, 128 },
#endif
{"sys_event", 7, 0, 256, 0 },
{"btctrler", 4, 0, 512, 256 },
{"btencry", 1, 0, 512, 128 },
{"btstack", 3, 0, 768, 256 },
{"systimer", 7, 0, 128, 0 },
{"update", 1, 0, 512, 0 },
{"dw_update", 2, 0, 256, 128 },
#if (RCSP_BTMATE_EN)
{"rcsp_task", 2, 0, 640, 0},
#endif
#if(USER_UART_UPDATE_ENABLE)
{"uart_update", 1, 0, 256, 128 },
#endif
#if (XM_MMA_EN)
{"xm_mma", 2, 0, 640, 256 },
#endif
{"usb_msd", 1, 0, 512, 128 },
#if TCFG_AUDIO_ENABLE
{"audio_dec", 3, 0, 768, 128 },
{"audio_enc", 4, 0, 512, 128 },
#endif/*TCFG_AUDIO_ENABLE*/
#if TCFG_KWS_VOICE_RECOGNITION_ENABLE
{"kws", 2, 0, 256, 64 },
#endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */
#if (TUYA_DEMO_EN)
{"user_deal", 2, 0, 512, 512 },//定义线程 tuya任务调度
#endif
#if (CONFIG_APP_HILINK)
{"hilink_task", 2, 0, 1024, 0},//定义线程 hilink任务调度
#endif
{0, 0},
};
APP_VAR app_var;
void app_var_init(void)
{
app_var.play_poweron_tone = 1;
app_var.auto_off_time = TCFG_AUTO_SHUT_DOWN_TIME;
app_var.warning_tone_v = 340;
app_var.poweroff_tone_v = 330;
}
__attribute__((weak))
u8 get_charge_online_flag(void)
{
return 0;
}
void clr_wdt(void);
void check_power_on_key(void)
{
#if TCFG_POWER_ON_NEED_KEY
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()) {
log_info("+");
delay_10ms_cnt++;
if (delay_10ms_cnt > 70) {
/* extern void set_key_poweron_flag(u8 flag); */
/* set_key_poweron_flag(1); */
return;
}
} else {
log_info("-");
delay_10ms_cnt = 0;
log_info("enter softpoweroff\n");
power_set_soft_poweroff();
}
}
#endif
}
void enter_sleep(){
printf(">>>>>>>>>>>>>>>>>enter_sleep...\n");
sys_s_hi_timer_del(enter_sleep);
extern void user_alarm_test(void);
extern void alarm_rtc_start(void);
alarm_rtc_start();
user_alarm_test();
//power_set_soft_poweroff();
}
void alarm_isr_user_cbfun(u8 index)
{
printf("**** alarm %d : hello world ****\n", index);
}
void user_main(){
printf(">>>>>>>>>>>>>>>>>user_main...\n");
temperature_init();
//sys_s_hi_timer_add(NULL,enter_sleep,5000);
// user_alarm_test();
// extern void alarm_rtc_start(void);
// alarm_rtc_start();
// rtc_alarm_set_timer(30);
//extern void rtc_alarm_set_timer(u32 seconds);
//rtc_alarm_set_timer(30);
//power_set_soft_poweroff();
//user_alarm_test();
}
void app_main()
{
struct intent it;
if (!UPDATE_SUPPORT_DEV_IS_NULL()) {
int update = 0;
update = update_result_deal();
}
printf(">>>>>>>>>>>>>>>>>app_main...\n");
printf(">>> v220,2022-11-23 >>>\n");
if (get_charge_online_flag()) {
#if(TCFG_SYS_LVD_EN == 1)
vbat_check_init();
#endif
} else {
check_power_on_voltage();
}
temperature_ble_init();
#if TCFG_POWER_ON_NEED_KEY
check_power_on_key();
#endif
#if TCFG_AUDIO_ENABLE
extern int audio_dec_init();
extern int audio_enc_init();
audio_dec_init();
audio_enc_init();
#endif/*TCFG_AUDIO_ENABLE*/
#if TCFG_KWS_VOICE_RECOGNITION_ENABLE
jl_kws_main_user_demo();
#endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */
init_intent(&it);
#if CONFIG_APP_SPP_LE
it.name = "spp_le";
it.action = ACTION_SPPLE_MAIN;
#elif CONFIG_APP_AT_COM || CONFIG_APP_AT_CHAR_COM
it.name = "at_com";
it.action = ACTION_AT_COM;
#elif CONFIG_APP_DONGLE
it.name = "dongle";
it.action = ACTION_DONGLE_MAIN;
#elif CONFIG_APP_MULTI
it.name = "multi_conn";
it.action = ACTION_MULTI_MAIN;
#elif CONFIG_APP_NONCONN_24G
it.name = "nonconn_24g";
it.action = ACTION_NOCONN_24G_MAIN;
#elif CONFIG_APP_HILINK
it.name = "hilink";
it.action = ACTION_HILINK_MAIN;
#elif CONFIG_APP_LL_SYNC
it.name = "ll_sync";
it.action = ACTION_LL_SYNC;
#elif CONFIG_APP_TUYA
it.name = "tuya";
it.action = ACTION_TUYA;
#elif CONFIG_APP_CENTRAL
it.name = "central";
it.action = ACTION_CENTRAL_MAIN;
#elif CONFIG_APP_DONGLE
it.name = "dongle";
it.action = ACTION_DONGLE_MAIN;
#elif CONFIG_APP_BEACON
it.name = "beacon";
it.action = ACTION_BEACON_MAIN;
#elif CONFIG_APP_IDLE
it.name = "idle";
it.action = ACTION_IDLE_MAIN;
#elif CONFIG_APP_CONN_24G
it.name = "conn_24g";
it.action = ACTION_CONN_24G_MAIN;
#elif CONFIG_APP_FINDMY
it.name = "findmy";
it.action = ACTION_FINDMY;
#elif CONFIG_APP_FTMS
it.name = "ftms";
it.action = ACTION_FTMS;
#else
while (1) {
printf("no app!!!");
}
#endif
log_info("run app>>> %s", it.name);
log_info("%s,%s", __DATE__, __TIME__);
start_app(&it);
user_main();
#if TCFG_CHARGE_ENABLE
set_charge_event_flag(1);
#endif
}
/*
* app模式切换
*/
void app_switch(const char *name, int action)
{
struct intent it;
struct application *app;
log_info("app_exit\n");
init_intent(&it);
app = get_current_app();
if (app) {
/*
* 退app, state_machine()APP_STA_STOP APP_STA_DESTORY
*/
it.name = app->name;
it.action = ACTION_BACK;
start_app(&it);
}
/*
* app (name)action分支
*/
it.name = name;
it.action = action;
start_app(&it);
}
int eSystemConfirmStopStatus(void)
{
/* 系统进入在未来时间里,无任务超时唤醒,可根据用户选择系统停止,或者系统定时唤醒(100ms) */
//1:Endless Sleep
//0:100 ms wakeup
/* log_info("100ms wakeup"); */
return 1;
}
__attribute__((used)) int *__errno()
{
static int err;
return &err;
}
/*********************************************************************************************
* Filename : app_main.c
* Description :
* Copyright:(c)JIELI 2011-2019 @ , All Rights Reserved.
*********************************************************************************************/
#include "system/includes.h"
#include "app_config.h"
#include "app_action.h"
#include "app_main.h"
#include "update.h"
#include "update_loader_download.h"
#include "app_charge.h"
#include "app_power_manage.h"
#include "asm/charge.h"
#include "app_temperature.h"
#if TCFG_KWS_VOICE_RECOGNITION_ENABLE
#include "jl_kws/jl_kws_api.h"
#endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */
#define LOG_TAG_CONST APP
#define LOG_TAG "[APP]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
/*任务列表 */
const struct task_info task_info_table[] = {
#if CONFIG_APP_FINDMY
{"app_core", 1, 0, 640 * 2, 128 },
#else
{"app_core", 1, 0, 640, 128 },
#endif
{"sys_event", 7, 0, 256, 0 },
{"btctrler", 4, 0, 512, 256 },
{"btencry", 1, 0, 512, 128 },
{"btstack", 3, 0, 768, 256 },
{"systimer", 7, 0, 128, 0 },
{"update", 1, 0, 512, 0 },
{"dw_update", 2, 0, 256, 128 },
#if (RCSP_BTMATE_EN)
{"rcsp_task", 2, 0, 640, 0},
#endif
#if(USER_UART_UPDATE_ENABLE)
{"uart_update", 1, 0, 256, 128 },
#endif
#if (XM_MMA_EN)
{"xm_mma", 2, 0, 640, 256 },
#endif
{"usb_msd", 1, 0, 512, 128 },
#if TCFG_AUDIO_ENABLE
{"audio_dec", 3, 0, 768, 128 },
{"audio_enc", 4, 0, 512, 128 },
#endif/*TCFG_AUDIO_ENABLE*/
#if TCFG_KWS_VOICE_RECOGNITION_ENABLE
{"kws", 2, 0, 256, 64 },
#endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */
#if (TUYA_DEMO_EN)
{"user_deal", 2, 0, 512, 512 },//定义线程 tuya任务调度
#endif
#if (CONFIG_APP_HILINK)
{"hilink_task", 2, 0, 1024, 0},//定义线程 hilink任务调度
#endif
{0, 0},
};
APP_VAR app_var;
void app_var_init(void)
{
app_var.play_poweron_tone = 1;
app_var.auto_off_time = TCFG_AUTO_SHUT_DOWN_TIME;
app_var.warning_tone_v = 340;
app_var.poweroff_tone_v = 330;
}
__attribute__((weak))
u8 get_charge_online_flag(void)
{
return 0;
}
void clr_wdt(void);
void check_power_on_key(void)
{
#if TCFG_POWER_ON_NEED_KEY
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()) {
log_info("+");
delay_10ms_cnt++;
if (delay_10ms_cnt > 70) {
/* extern void set_key_poweron_flag(u8 flag); */
/* set_key_poweron_flag(1); */
return;
}
} else {
log_info("-");
delay_10ms_cnt = 0;
log_info("enter softpoweroff\n");
power_set_soft_poweroff();
}
}
#endif
}
void enter_sleep(){
printf(">>>>>>>>>>>>>>>>>enter_sleep...\n");
sys_s_hi_timer_del(enter_sleep);
extern void user_alarm_test(void);
extern void alarm_rtc_start(void);
alarm_rtc_start();
user_alarm_test();
//power_set_soft_poweroff();
}
void user_main(){
printf(">>>>>>>>>>>>>>>>>user_main...\n");
temperature_init();
//sys_s_hi_timer_add(NULL,enter_sleep,5000);
// user_alarm_test();
// extern void alarm_rtc_start(void);
// alarm_rtc_start();
// rtc_alarm_set_timer(30);
//extern void rtc_alarm_set_timer(u32 seconds);
//rtc_alarm_set_timer(30);
//power_set_soft_poweroff();
//user_alarm_test();
}
void app_main()
{
struct intent it;
if (!UPDATE_SUPPORT_DEV_IS_NULL()) {
int update = 0;
update = update_result_deal();
}
printf(">>>>>>>>>>>>>>>>>app_main...\n");
printf(">>> v220,2022-11-23 >>>\n");
if (get_charge_online_flag()) {
#if(TCFG_SYS_LVD_EN == 1)
vbat_check_init();
#endif
} else {
check_power_on_voltage();
}
temperature_ble_init();
#if TCFG_POWER_ON_NEED_KEY
check_power_on_key();
#endif
#if TCFG_AUDIO_ENABLE
extern int audio_dec_init();
extern int audio_enc_init();
audio_dec_init();
audio_enc_init();
#endif/*TCFG_AUDIO_ENABLE*/
#if TCFG_KWS_VOICE_RECOGNITION_ENABLE
jl_kws_main_user_demo();
#endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */
init_intent(&it);
#if CONFIG_APP_SPP_LE
it.name = "spp_le";
it.action = ACTION_SPPLE_MAIN;
#elif CONFIG_APP_AT_COM || CONFIG_APP_AT_CHAR_COM
it.name = "at_com";
it.action = ACTION_AT_COM;
#elif CONFIG_APP_DONGLE
it.name = "dongle";
it.action = ACTION_DONGLE_MAIN;
#elif CONFIG_APP_MULTI
it.name = "multi_conn";
it.action = ACTION_MULTI_MAIN;
#elif CONFIG_APP_NONCONN_24G
it.name = "nonconn_24g";
it.action = ACTION_NOCONN_24G_MAIN;
#elif CONFIG_APP_HILINK
it.name = "hilink";
it.action = ACTION_HILINK_MAIN;
#elif CONFIG_APP_LL_SYNC
it.name = "ll_sync";
it.action = ACTION_LL_SYNC;
#elif CONFIG_APP_TUYA
it.name = "tuya";
it.action = ACTION_TUYA;
#elif CONFIG_APP_CENTRAL
it.name = "central";
it.action = ACTION_CENTRAL_MAIN;
#elif CONFIG_APP_DONGLE
it.name = "dongle";
it.action = ACTION_DONGLE_MAIN;
#elif CONFIG_APP_BEACON
it.name = "beacon";
it.action = ACTION_BEACON_MAIN;
#elif CONFIG_APP_IDLE
it.name = "idle";
it.action = ACTION_IDLE_MAIN;
#elif CONFIG_APP_CONN_24G
it.name = "conn_24g";
it.action = ACTION_CONN_24G_MAIN;
#elif CONFIG_APP_FINDMY
it.name = "findmy";
it.action = ACTION_FINDMY;
#elif CONFIG_APP_FTMS
it.name = "ftms";
it.action = ACTION_FTMS;
#else
while (1) {
printf("no app!!!");
}
#endif
log_info("run app>>> %s", it.name);
log_info("%s,%s", __DATE__, __TIME__);
start_app(&it);
user_main();
#if TCFG_CHARGE_ENABLE
set_charge_event_flag(1);
#endif
}
/*
* app模式切换
*/
void app_switch(const char *name, int action)
{
struct intent it;
struct application *app;
log_info("app_exit\n");
init_intent(&it);
app = get_current_app();
if (app) {
/*
* 退app, state_machine()APP_STA_STOP APP_STA_DESTORY
*/
it.name = app->name;
it.action = ACTION_BACK;
start_app(&it);
}
/*
* app (name)action分支
*/
it.name = name;
it.action = action;
start_app(&it);
}
int eSystemConfirmStopStatus(void)
{
/* 系统进入在未来时间里,无任务超时唤醒,可根据用户选择系统停止,或者系统定时唤醒(100ms) */
//1:Endless Sleep
//0:100 ms wakeup
/* log_info("100ms wakeup"); */
return 1;
}
__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
#define CONFIG_BOARD_AC6323A_DEMO_H
#include "board_ac6323a_demo_global_build_cfg.h"
#ifdef CONFIG_BOARD_AC6323A_DEMO
#define CONFIG_SDFILE_ENABLE
//*********************************************************************************//
// 配置开始 //
//*********************************************************************************//
#define ENABLE_THIS_MOUDLE 1
#define DISABLE_THIS_MOUDLE 0
#define ENABLE 1
#define DISABLE 0
#define NO_CONFIG_PORT (-1)
//*********************************************************************************//
// UART配置 //
//*********************************************************************************//
#define TCFG_UART0_ENABLE ENABLE_THIS_MOUDLE //串口打印模块使能
#define TCFG_UART0_RX_PORT NO_CONFIG_PORT //串口接收脚配置用于打印可以选择NO_CONFIG_PORT
#define TCFG_UART0_TX_PORT IO_PORTA_01 //串口发送脚配置
#define TCFG_UART0_BAUDRATE 1000000 //串口波特率配置
//*********************************************************************************//
// USB 配置 //
//*********************************************************************************//
#define TCFG_PC_ENABLE DISABLE_THIS_MOUDLE //PC模块使能
#define TCFG_UDISK_ENABLE DISABLE_THIS_MOUDLE //U盘模块使能
#define TCFG_HID_HOST_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_OTG_USB_DEV_EN (BIT(0) | BIT(1))//USB0 = BIT(0) USB1 = BIT(1)
//*********************************************************************************//
// IIC配置 //
//*********************************************************************************//
/*软件IIC设置*/
#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_DELAY_CNT 50 //IIC延时参数影响通讯时钟频率
/*硬件IIC端口选择
SCL SDA
'A': IO_PORT_DP IO_PORT_DM
'B': IO_PORTA_09 IO_PORTA_10
'C': IO_PORTA_07 IO_PORTA_08
'D': IO_PORTA_05 IO_PORTA_06
*/
#define TCFG_HW_I2C0_PORTS 'B'
#define TCFG_HW_I2C0_CLK 100000 //硬件IIC波特率
//*********************************************************************************//
// 硬件SPI 配置 //
//*********************************************************************************//
#define TCFG_HW_SPI1_ENABLE ENABLE_THIS_MOUDLE
//A组IO: DI: PB2 DO: PB1 CLK: PB0
//B组IO: DI: PC3 DO: PC5 CLK: PC4
#define TCFG_HW_SPI1_PORT 'A'
#define TCFG_HW_SPI1_BAUD 2000000L
#define TCFG_HW_SPI1_MODE SPI_MODE_BIDIR_1BIT
#define TCFG_HW_SPI1_ROLE SPI_ROLE_MASTER
#define TCFG_HW_SPI2_ENABLE ENABLE_THIS_MOUDLE
//A组IO: DI: PB8 DO: PB10 CLK: PB9
//B组IO: DI: PA13 DO: DM CLK: DP
#define TCFG_HW_SPI2_PORT 'A'
#define TCFG_HW_SPI2_BAUD 2000000L
#define TCFG_HW_SPI2_MODE SPI_MODE_BIDIR_1BIT
#define TCFG_HW_SPI2_ROLE SPI_ROLE_MASTER
//*********************************************************************************//
// FLASH 配置 //
//*********************************************************************************//
#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_CS_PORT IO_PORTB_06
#define TCFG_NORFLASH_DEV_ENABLE DISABLE_THIS_MOUDLE
//*********************************************************************************//
// key 配置 //
//*********************************************************************************//
#define KEY_NUM_MAX 10
#define KEY_NUM 3
#define MULT_KEY_ENABLE DISABLE //是否使能组合按键消息, 使能后需要配置组合按键映射表
//*********************************************************************************//
// iokey 配置 //
//*********************************************************************************//
#define TCFG_IOKEY_ENABLE DISABLE_THIS_MOUDLE //是否使能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_PREV_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO
#define TCFG_IOKEY_PREV_ONE_PORT IO_PORTB_04
#define TCFG_IOKEY_NEXT_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO
#define TCFG_IOKEY_NEXT_ONE_PORT IO_PORTB_05
//*********************************************************************************//
// adkey 配置 //
//*********************************************************************************//
#define TCFG_ADKEY_ENABLE DISABLE_THIS_MOUDLE //是否使能AD按键
#define TCFG_ADKEY_PORT IO_PORTA_01 //AD按键端口(需要注意选择的IO口是否支持AD功能)
/*AD通道选择需要和AD按键的端口相对应:
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_PB6 AD_CH_PB7 AD_CH_DP AD_CH_DM
AD_CH_PB2
*/
#define TCFG_ADKEY_AD_CHANNEL AD_CH_PA1
#define TCFG_ADKEY_EXTERN_UP_ENABLE ENABLE_THIS_MOUDLE //是否使用外部上拉
#if TCFG_ADKEY_EXTERN_UP_ENABLE
#define R_UP 220 //22K外部上拉阻值在此自行设置
#else
#define R_UP 100 //10K内部上拉默认10K
#endif
//必须从小到大填电阻没有则同VDDIO,填0x3ffL
#define TCFG_ADKEY_AD0 (0) //0R
#define TCFG_ADKEY_AD1 (0x3ffL * 30 / (30 + R_UP)) //3k
#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_AD4 (0x3ffL * 150 / (150 + R_UP)) //15k
#define TCFG_ADKEY_AD5 (0x3ffL * 240 / (240 + R_UP)) //24k
#define TCFG_ADKEY_AD6 (0x3ffL * 330 / (330 + R_UP)) //33k
#define TCFG_ADKEY_AD7 (0x3ffL * 510 / (510 + R_UP)) //51k
#define TCFG_ADKEY_AD8 (0x3ffL * 1000 / (1000 + R_UP)) //100k
#define TCFG_ADKEY_AD9 (0x3ffL * 2200 / (2200 + R_UP)) //220k
#define TCFG_ADKEY_VDDIO (0x3ffL)
#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_VOLTAGE2 ((TCFG_ADKEY_AD2 + TCFG_ADKEY_AD3) / 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_VOLTAGE5 ((TCFG_ADKEY_AD5 + TCFG_ADKEY_AD6) / 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_VOLTAGE8 ((TCFG_ADKEY_AD8 + TCFG_ADKEY_AD9) / 2)
#define TCFG_ADKEY_VOLTAGE9 ((TCFG_ADKEY_AD9 + TCFG_ADKEY_VDDIO) / 2)
#define TCFG_ADKEY_VALUE0 0
#define TCFG_ADKEY_VALUE1 1
#define TCFG_ADKEY_VALUE2 2
#define TCFG_ADKEY_VALUE3 3
#define TCFG_ADKEY_VALUE4 4
#define TCFG_ADKEY_VALUE5 5
#define TCFG_ADKEY_VALUE6 6
#define TCFG_ADKEY_VALUE7 7
#define TCFG_ADKEY_VALUE8 8
#define TCFG_ADKEY_VALUE9 9
//*********************************************************************************//
// Audio配置 //
//*********************************************************************************//
#ifdef CONFIG_LITE_AUDIO
#define TCFG_AUDIO_ENABLE DISABLE
#if TCFG_AUDIO_ENABLE
#define TCFG_DEC_USBC_ENABLE DISABLE
#define TCFG_ENC_USBC_ENABLE DISABLE
#define TCFG_DEC_LC3_ENABLE DISABLE
#define TCFG_ENC_LC3_ENABLE DISABLE
//lc3 参数配置
#if (TCFG_ENC_LC3_ENABLE || TCFG_DEC_LC3_ENABLE)
#define LC3_CODING_SAMPLERATE 16000 //lc3 编码的采样率
#define LC3_CODING_FRAME_LEN 50 //帧长度只支持2550100
#define LC3_CODING_CHANNEL 1 //lc3 的通道数
#endif
#endif
#endif
//*********************************************************************************//
// irkey 配置 //
//*********************************************************************************//
#define TCFG_IRKEY_ENABLE DISABLE_THIS_MOUDLE//是否使能AD按键
#define TCFG_IRKEY_PORT IO_PORTA_08 //IR按键端口
//*********************************************************************************//
// tocuh key 配置 //
//*********************************************************************************//
#define TCFG_LP_TOUCH_KEY_ENABLE DISABLE_THIS_MOUDLE //是否使能触摸按键
//*********************************************************************************//
// RTC_ALARM配置 //
//*********************************************************************************//
#define TCFG_RTC_ALARM_ENABLE ENABLE_THIS_MOUDLE
//*********************************************************************************//
// 充电仓配置(不支持) //
//*********************************************************************************//
#define TCFG_TEST_BOX_ENABLE DISABLE_THIS_MOUDLE
#define TCFG_CHARGESTORE_PORT IO_PORTP_00
#define TCFG_CHARGESTORE_UART_ID IRQ_UART1_IDX
//*********************************************************************************//
// 充电参数配置 //
//*********************************************************************************//
//是否支持芯片内置充电
#define TCFG_CHARGE_ENABLE ENABLE
//是否支持开机充电
#define TCFG_CHARGE_POWERON_ENABLE 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_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_4472 CHARGE_FULL_V_4517 CHARGE_FULL_V_4564 CHARGE_FULL_V_4611
*/
#define TCFG_CHARGE_FULL_V CHARGE_FULL_V_4222
/*
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
*/
#define TCFG_CHARGE_FULL_MA CHARGE_FULL_mA_5
/*
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_100 CHARGE_mA_110 CHARGE_mA_120 CHARGE_mA_140
CHARGE_mA_160 CHARGE_mA_180 CHARGE_mA_200 CHARGE_mA_220
*/
#define TCFG_CHARGE_MA CHARGE_mA_20
//*********************************************************************************//
// LED 配置 //
//*********************************************************************************//
#define TCFG_PWMLED_ENABLE DISABLE_THIS_MOUDLE //是否支持PMW LED推灯模块
#define TCFG_PWMLED_IOMODE LED_ONE_IO_MODE //LED模式单IO还是两个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_HZ 24000000 //系统时钟设置
#define TCFG_CLOCK_OSC_HZ 24000000 //外界晶振频率设置
/* #define TCFG_CLOCK_MODE CLOCK_MODE_USR//CLOCK_MODE_ADAPTIVE */
#define TCFG_CLOCK_MODE CLOCK_MODE_ADAPTIVE
//*********************************************************************************//
// 低功耗配置 //
//*********************************************************************************//
#define TCFG_LOWPOWER_POWER_SEL PWR_LDO15
// #define TCFG_LOWPOWER_POWER_SEL PWR_LDO15 PWR_DCDC15 //电源模式设置可选DCDC和LDO
#define TCFG_LOWPOWER_BTOSC_DISABLE 0 //低功耗模式下BTOSC是否保持
#define TCFG_LOWPOWER_LOWPOWER_SEL 0 //SLEEP_EN //SNIFF状态下芯片是否进入powerdown
/*强VDDIO等级配置,可选:
VDDIOM_VOL_20V VDDIOM_VOL_22V VDDIOM_VOL_24V VDDIOM_VOL_26V
VDDIOM_VOL_30V VDDIOM_VOL_30V VDDIOM_VOL_32V VDDIOM_VOL_36V*/
#define TCFG_LOWPOWER_VDDIOM_LEVEL VDDIOM_VOL_30V
/*弱VDDIO等级配置可选
VDDIOW_VOL_21V VDDIOW_VOL_24V VDDIOW_VOL_28V VDDIOW_VOL_32V*/
#define TCFG_LOWPOWER_VDDIOW_LEVEL VDDIOW_VOL_28V //弱VDDIO等级配置
#define TCFG_LOWPOWER_OSC_TYPE OSC_TYPE_LRC
#define TCFG_VD13_CAP_EN 1
//*********************************************************************************//
// g-sensor配置 //
//*********************************************************************************//
#define TCFG_GSENSOR_ENABLE 0 //gSensor使能
#define TCFG_DA230_EN 0
#define TCFG_SC7A20_EN 0
#define TCFG_STK8321_EN 0
#define TCFG_GSENOR_USER_IIC_TYPE 0 //0:软件IIC 1:硬件IIC
//*********************************************************************************//
// 系统配置 //
//*********************************************************************************//
#define TCFG_AUTO_SHUT_DOWN_TIME 0 //没有蓝牙连接自动关机时间
#if (TCFG_LOWPOWER_POWER_SEL == PWR_DCDC15)
#define TCFG_SYS_LVD_EN 1 //dcdc模式电压低于2.4v的时候切为LDO模式需要开启电量检测
#else
#define TCFG_SYS_LVD_EN 1 //电量检测使能
#endif
#define TCFG_POWER_ON_NEED_KEY 0 //是否需要按按键开机配置
#define TCFG_HID_AUTO_SHUTDOWN_TIME (0 * 60) //HID无操作自动关机(单位:秒)
//*********************************************************************************//
// 蓝牙配置 //
//*********************************************************************************//
#define TCFG_USER_TWS_ENABLE 0 //tws功能使能
#define TCFG_USER_BLE_ENABLE 1 //BLE功能使能,---使能后,请配置TCFG_BLE_DEMO_SELECT选择DEMO例子
#define TCFG_USER_EDR_ENABLE 0 //EDR功能使能
#define USER_SUPPORT_PROFILE_SPP 0
#define USER_SUPPORT_PROFILE_HFP 0
#define USER_SUPPORT_PROFILE_A2DP 0
#define USER_SUPPORT_PROFILE_AVCTP 0
#define USER_SUPPORT_PROFILE_HID 0
#define USER_SUPPORT_PROFILE_PNP 0
#define USER_SUPPORT_PROFILE_PBAP 0
#if(TCFG_USER_TWS_ENABLE || TCFG_USER_BLE_ENABLE)
#define TCFG_BD_NUM 1 //连接设备个数配置
#define TCFG_AUTO_STOP_PAGE_SCAN_TIME 0 //配置一拖二第一台连接后自动关闭PAGE SCAN的时间(单位分钟)
#else
#define TCFG_BD_NUM 1 //连接设备个数配置
#define TCFG_AUTO_STOP_PAGE_SCAN_TIME 0 //配置一拖二第一台连接后自动关闭PAGE SCAN的时间(单位分钟)
#endif
#define BT_INBAND_RINGTONE 0 //是否播放手机自带来电铃声
#define BT_PHONE_NUMBER 0 //是否播放来电报号
#define BT_SUPPORT_DISPLAY_BAT 0 //是否使能电量检测
#define BT_SUPPORT_MUSIC_VOL_SYNC 0 //是否使能音量同步
//*********************************************************************************//
// 电源切换配置 //
//*********************************************************************************//
#define CONFIG_PHONE_CALL_USE_LDO15 1
//*********************************************************************************//
// 时钟配置 //
//*********************************************************************************//
#define CONFIG_BT_NORMAL_HZ (48 * 1000000L)
//#define CONFIG_BT_CONNECT_HZ (48 * 1000000L)
//*********************************************************************************//
// 配置结束 //
//*********************************************************************************//
#endif
#endif
#ifndef CONFIG_BOARD_AC6323A_DEMO_H
#define CONFIG_BOARD_AC6323A_DEMO_H
#include "board_ac6323a_demo_global_build_cfg.h"
#ifdef CONFIG_BOARD_AC6323A_DEMO
#define CONFIG_SDFILE_ENABLE
//*********************************************************************************//
// 配置开始 //
//*********************************************************************************//
#define ENABLE_THIS_MOUDLE 1
#define DISABLE_THIS_MOUDLE 0
#define ENABLE 1
#define DISABLE 0
#define NO_CONFIG_PORT (-1)
//*********************************************************************************//
// UART配置 //
//*********************************************************************************//
#define TCFG_UART0_ENABLE ENABLE_THIS_MOUDLE //串口打印模块使能
#define TCFG_UART0_RX_PORT NO_CONFIG_PORT //串口接收脚配置用于打印可以选择NO_CONFIG_PORT
#define TCFG_UART0_TX_PORT IO_PORTA_01 //串口发送脚配置
#define TCFG_UART0_BAUDRATE 1000000 //串口波特率配置
//*********************************************************************************//
// USB 配置 //
//*********************************************************************************//
#define TCFG_PC_ENABLE DISABLE_THIS_MOUDLE //PC模块使能
#define TCFG_UDISK_ENABLE DISABLE_THIS_MOUDLE //U盘模块使能
#define TCFG_HID_HOST_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_OTG_USB_DEV_EN (BIT(0) | BIT(1))//USB0 = BIT(0) USB1 = BIT(1)
//*********************************************************************************//
// IIC配置 //
//*********************************************************************************//
/*软件IIC设置*/
#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_DELAY_CNT 50 //IIC延时参数影响通讯时钟频率
/*硬件IIC端口选择
SCL SDA
'A': IO_PORT_DP IO_PORT_DM
'B': IO_PORTA_09 IO_PORTA_10
'C': IO_PORTA_07 IO_PORTA_08
'D': IO_PORTA_05 IO_PORTA_06
*/
#define TCFG_HW_I2C0_PORTS 'B'
#define TCFG_HW_I2C0_CLK 100000 //硬件IIC波特率
//*********************************************************************************//
// 硬件SPI 配置 //
//*********************************************************************************//
#define TCFG_HW_SPI1_ENABLE ENABLE_THIS_MOUDLE
//A组IO: DI: PB2 DO: PB1 CLK: PB0
//B组IO: DI: PC3 DO: PC5 CLK: PC4
#define TCFG_HW_SPI1_PORT 'A'
#define TCFG_HW_SPI1_BAUD 2000000L
#define TCFG_HW_SPI1_MODE SPI_MODE_BIDIR_1BIT
#define TCFG_HW_SPI1_ROLE SPI_ROLE_MASTER
#define TCFG_HW_SPI2_ENABLE ENABLE_THIS_MOUDLE
//A组IO: DI: PB8 DO: PB10 CLK: PB9
//B组IO: DI: PA13 DO: DM CLK: DP
#define TCFG_HW_SPI2_PORT 'A'
#define TCFG_HW_SPI2_BAUD 2000000L
#define TCFG_HW_SPI2_MODE SPI_MODE_BIDIR_1BIT
#define TCFG_HW_SPI2_ROLE SPI_ROLE_MASTER
//*********************************************************************************//
// FLASH 配置 //
//*********************************************************************************//
#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_CS_PORT IO_PORTB_06
#define TCFG_NORFLASH_DEV_ENABLE DISABLE_THIS_MOUDLE
//*********************************************************************************//
// key 配置 //
//*********************************************************************************//
#define KEY_NUM_MAX 10
#define KEY_NUM 3
#define MULT_KEY_ENABLE DISABLE //是否使能组合按键消息, 使能后需要配置组合按键映射表
//*********************************************************************************//
// iokey 配置 //
//*********************************************************************************//
#define TCFG_IOKEY_ENABLE DISABLE_THIS_MOUDLE //是否使能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_PREV_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO
#define TCFG_IOKEY_PREV_ONE_PORT IO_PORTB_04
#define TCFG_IOKEY_NEXT_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO
#define TCFG_IOKEY_NEXT_ONE_PORT IO_PORTB_05
//*********************************************************************************//
// adkey 配置 //
//*********************************************************************************//
#define TCFG_ADKEY_ENABLE DISABLE_THIS_MOUDLE //是否使能AD按键
#define TCFG_ADKEY_PORT IO_PORTA_01 //AD按键端口(需要注意选择的IO口是否支持AD功能)
/*AD通道选择需要和AD按键的端口相对应:
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_PB6 AD_CH_PB7 AD_CH_DP AD_CH_DM
AD_CH_PB2
*/
#define TCFG_ADKEY_AD_CHANNEL AD_CH_PA1
#define TCFG_ADKEY_EXTERN_UP_ENABLE ENABLE_THIS_MOUDLE //是否使用外部上拉
#if TCFG_ADKEY_EXTERN_UP_ENABLE
#define R_UP 220 //22K外部上拉阻值在此自行设置
#else
#define R_UP 100 //10K内部上拉默认10K
#endif
//必须从小到大填电阻没有则同VDDIO,填0x3ffL
#define TCFG_ADKEY_AD0 (0) //0R
#define TCFG_ADKEY_AD1 (0x3ffL * 30 / (30 + R_UP)) //3k
#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_AD4 (0x3ffL * 150 / (150 + R_UP)) //15k
#define TCFG_ADKEY_AD5 (0x3ffL * 240 / (240 + R_UP)) //24k
#define TCFG_ADKEY_AD6 (0x3ffL * 330 / (330 + R_UP)) //33k
#define TCFG_ADKEY_AD7 (0x3ffL * 510 / (510 + R_UP)) //51k
#define TCFG_ADKEY_AD8 (0x3ffL * 1000 / (1000 + R_UP)) //100k
#define TCFG_ADKEY_AD9 (0x3ffL * 2200 / (2200 + R_UP)) //220k
#define TCFG_ADKEY_VDDIO (0x3ffL)
#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_VOLTAGE2 ((TCFG_ADKEY_AD2 + TCFG_ADKEY_AD3) / 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_VOLTAGE5 ((TCFG_ADKEY_AD5 + TCFG_ADKEY_AD6) / 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_VOLTAGE8 ((TCFG_ADKEY_AD8 + TCFG_ADKEY_AD9) / 2)
#define TCFG_ADKEY_VOLTAGE9 ((TCFG_ADKEY_AD9 + TCFG_ADKEY_VDDIO) / 2)
#define TCFG_ADKEY_VALUE0 0
#define TCFG_ADKEY_VALUE1 1
#define TCFG_ADKEY_VALUE2 2
#define TCFG_ADKEY_VALUE3 3
#define TCFG_ADKEY_VALUE4 4
#define TCFG_ADKEY_VALUE5 5
#define TCFG_ADKEY_VALUE6 6
#define TCFG_ADKEY_VALUE7 7
#define TCFG_ADKEY_VALUE8 8
#define TCFG_ADKEY_VALUE9 9
//*********************************************************************************//
// Audio配置 //
//*********************************************************************************//
#ifdef CONFIG_LITE_AUDIO
#define TCFG_AUDIO_ENABLE DISABLE
#if TCFG_AUDIO_ENABLE
#define TCFG_DEC_USBC_ENABLE DISABLE
#define TCFG_ENC_USBC_ENABLE DISABLE
#define TCFG_DEC_LC3_ENABLE DISABLE
#define TCFG_ENC_LC3_ENABLE DISABLE
//lc3 参数配置
#if (TCFG_ENC_LC3_ENABLE || TCFG_DEC_LC3_ENABLE)
#define LC3_CODING_SAMPLERATE 16000 //lc3 编码的采样率
#define LC3_CODING_FRAME_LEN 50 //帧长度只支持2550100
#define LC3_CODING_CHANNEL 1 //lc3 的通道数
#endif
#endif
#endif
//*********************************************************************************//
// irkey 配置 //
//*********************************************************************************//
#define TCFG_IRKEY_ENABLE DISABLE_THIS_MOUDLE//是否使能AD按键
#define TCFG_IRKEY_PORT IO_PORTA_08 //IR按键端口
//*********************************************************************************//
// tocuh key 配置 //
//*********************************************************************************//
#define TCFG_LP_TOUCH_KEY_ENABLE DISABLE_THIS_MOUDLE //是否使能触摸按键
//*********************************************************************************//
// RTC_ALARM配置 //
//*********************************************************************************//
#define TCFG_RTC_ALARM_ENABLE ENABLE_THIS_MOUDLE
//*********************************************************************************//
// 充电仓配置(不支持) //
//*********************************************************************************//
#define TCFG_TEST_BOX_ENABLE DISABLE_THIS_MOUDLE
#define TCFG_CHARGESTORE_PORT IO_PORTP_00
#define TCFG_CHARGESTORE_UART_ID IRQ_UART1_IDX
//*********************************************************************************//
// 充电参数配置 //
//*********************************************************************************//
//是否支持芯片内置充电
#define TCFG_CHARGE_ENABLE ENABLE
//是否支持开机充电
#define TCFG_CHARGE_POWERON_ENABLE 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_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_4472 CHARGE_FULL_V_4517 CHARGE_FULL_V_4564 CHARGE_FULL_V_4611
*/
#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_15 CHARGE_FULL_mA_20 CHARGE_FULL_mA_25 CHARGE_FULL_mA_30
*/
#define TCFG_CHARGE_FULL_MA CHARGE_FULL_mA_7
/*
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_100 CHARGE_mA_110 CHARGE_mA_120 CHARGE_mA_140
CHARGE_mA_160 CHARGE_mA_180 CHARGE_mA_200 CHARGE_mA_220
*/
#define TCFG_CHARGE_MA CHARGE_mA_30
//*********************************************************************************//
// LED 配置 //
//*********************************************************************************//
#define TCFG_PWMLED_ENABLE DISABLE_THIS_MOUDLE //是否支持PMW LED推灯模块
#define TCFG_PWMLED_IOMODE LED_ONE_IO_MODE //LED模式单IO还是两个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_HZ 24000000 //系统时钟设置
#define TCFG_CLOCK_OSC_HZ 24000000 //外界晶振频率设置
/* #define TCFG_CLOCK_MODE CLOCK_MODE_USR//CLOCK_MODE_ADAPTIVE */
#define TCFG_CLOCK_MODE CLOCK_MODE_ADAPTIVE
//*********************************************************************************//
// 低功耗配置 //
//*********************************************************************************//
#define TCFG_LOWPOWER_POWER_SEL PWR_LDO15
// #define TCFG_LOWPOWER_POWER_SEL PWR_LDO15 PWR_DCDC15 //电源模式设置可选DCDC和LDO
#define TCFG_LOWPOWER_BTOSC_DISABLE 0 //低功耗模式下BTOSC是否保持
#define TCFG_LOWPOWER_LOWPOWER_SEL 0 //SLEEP_EN //SNIFF状态下芯片是否进入powerdown
/*强VDDIO等级配置,可选:
VDDIOM_VOL_20V VDDIOM_VOL_22V VDDIOM_VOL_24V VDDIOM_VOL_26V
VDDIOM_VOL_30V VDDIOM_VOL_30V VDDIOM_VOL_32V VDDIOM_VOL_36V*/
#define TCFG_LOWPOWER_VDDIOM_LEVEL VDDIOM_VOL_30V
/*弱VDDIO等级配置可选
VDDIOW_VOL_21V VDDIOW_VOL_24V VDDIOW_VOL_28V VDDIOW_VOL_32V*/
#define TCFG_LOWPOWER_VDDIOW_LEVEL VDDIOW_VOL_28V //弱VDDIO等级配置
#define TCFG_LOWPOWER_OSC_TYPE OSC_TYPE_LRC
#define TCFG_VD13_CAP_EN 1
//*********************************************************************************//
// g-sensor配置 //
//*********************************************************************************//
#define TCFG_GSENSOR_ENABLE 0 //gSensor使能
#define TCFG_DA230_EN 0
#define TCFG_SC7A20_EN 0
#define TCFG_STK8321_EN 0
#define TCFG_GSENOR_USER_IIC_TYPE 0 //0:软件IIC 1:硬件IIC
//*********************************************************************************//
// 系统配置 //
//*********************************************************************************//
#define TCFG_AUTO_SHUT_DOWN_TIME 0 //没有蓝牙连接自动关机时间
#if (TCFG_LOWPOWER_POWER_SEL == PWR_DCDC15)
#define TCFG_SYS_LVD_EN 1 //dcdc模式电压低于2.4v的时候切为LDO模式需要开启电量检测
#else
#define TCFG_SYS_LVD_EN 1 //电量检测使能
#endif
#define TCFG_POWER_ON_NEED_KEY 0 //是否需要按按键开机配置
#define TCFG_HID_AUTO_SHUTDOWN_TIME (0 * 60) //HID无操作自动关机(单位:秒)
//*********************************************************************************//
// 蓝牙配置 //
//*********************************************************************************//
#define TCFG_USER_TWS_ENABLE 0 //tws功能使能
#define TCFG_USER_BLE_ENABLE 1 //BLE功能使能,---使能后,请配置TCFG_BLE_DEMO_SELECT选择DEMO例子
#define TCFG_USER_EDR_ENABLE 0 //EDR功能使能
#define USER_SUPPORT_PROFILE_SPP 0
#define USER_SUPPORT_PROFILE_HFP 0
#define USER_SUPPORT_PROFILE_A2DP 0
#define USER_SUPPORT_PROFILE_AVCTP 0
#define USER_SUPPORT_PROFILE_HID 0
#define USER_SUPPORT_PROFILE_PNP 0
#define USER_SUPPORT_PROFILE_PBAP 0
#if(TCFG_USER_TWS_ENABLE || TCFG_USER_BLE_ENABLE)
#define TCFG_BD_NUM 1 //连接设备个数配置
#define TCFG_AUTO_STOP_PAGE_SCAN_TIME 0 //配置一拖二第一台连接后自动关闭PAGE SCAN的时间(单位分钟)
#else
#define TCFG_BD_NUM 1 //连接设备个数配置
#define TCFG_AUTO_STOP_PAGE_SCAN_TIME 0 //配置一拖二第一台连接后自动关闭PAGE SCAN的时间(单位分钟)
#endif
#define BT_INBAND_RINGTONE 0 //是否播放手机自带来电铃声
#define BT_PHONE_NUMBER 0 //是否播放来电报号
#define BT_SUPPORT_DISPLAY_BAT 0 //是否使能电量检测
#define BT_SUPPORT_MUSIC_VOL_SYNC 0 //是否使能音量同步
//*********************************************************************************//
// 电源切换配置 //
//*********************************************************************************//
#define CONFIG_PHONE_CALL_USE_LDO15 1
//*********************************************************************************//
// 时钟配置 //
//*********************************************************************************//
#define CONFIG_BT_NORMAL_HZ (48 * 1000000L)
//#define CONFIG_BT_CONNECT_HZ (48 * 1000000L)
//*********************************************************************************//
// 配置结束 //
//*********************************************************************************//
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,54 +1,62 @@
#ifndef _APP_TEMPERATURE_H_
#define _APP_TEMPERATURE_H_
#include "typedef.h"
#include "system/event.h"
#define BLE_TEMPERATURE_DETECT_INTERVAL 250
#define BLE_TEMPERATURE_WORK_TIMEOUT 10*1000
#define BLE_TEMPERATURE_SLEEP_TIMEOUT 3*1000
#define BLE_TEMPERATURE_DEVICE_NAME "IT12"
#define BLE_TEMPERATURE_LOWPOWER_OFFSIZE 3000 //mV
#define BLE_TEMPERATURE_DEVICE_NST1002 1002
#define BLE_TEMPERATURE_DEVICE_NTC 0
#define BLE_TEMPERATURE_WORK_LED IO_PORTA_07
#define BLE_TEMPERATURE_CHARGE_STATE_CHARGING 1
#define BLE_TEMPERATURE_CHARGE_STATE_FULL 2
#define BLE_TEMPERATURE_CHARGE_STATE_IDLE 3
#define BLE_TEMPERATURE_CHARGE_STATE_LOWPOWER 4
//VM用户自定义配置项[1 ~ 49]
#define BLE_TEMPERATURE_VM_DEVICE_CONFIG 2
typedef struct
{
u16 temperature_sensor;
u32 temperature_ntc;
u8 batt_percent;
u16 batt_vat;
u8 is_bat_charge;
u8 is_bat_full;
}app_dev_info_t;
typedef struct
{
/* 测温检测间隔 ms 1000ms*/
int16_t detect_interval;
/* 温度校准 0.1C *1000 = 100 或者 -100*/
int16_t temperature_offset;
}app_dev_config_t;
//extern struct app_dev_info_t dev_info;
//extern struct app_dev_config_t dev_config;
void temperature_ble_init();
void temperature_init(void);
void ble_receive_callback(u8* data,u16 len);
void temperature_work_led(u8 on);
void temperature_charge_led(u8 on);
void temperature_charge_state(int state);
#endif //_APP_TEMPERATURE_H_
#ifndef _APP_TEMPERATURE_H_
#define _APP_TEMPERATURE_H_
#include "typedef.h"
#include "system/event.h"
/**
* 1.0.1 2025.05.16
*/
#define BLE_TEMPERATURE_DEVICE_SOFT_VER "1.0.1"
#define BLE_TEMPERATURE_DETECT_INTERVAL 250
#define BLE_TEMPERATURE_WORK_TIMEOUT 10*1000
#define BLE_TEMPERATURE_SLEEP_TIMEOUT 3*1000
#define BLE_TEMPERATURE_DEVICE_NAME "IT12"
#define BLE_TEMPERATURE_LOWPOWER_OFFSIZE 3000 //mV
#define BLE_TEMPERATURE_DEVICE_NST1002 1002
#define BLE_TEMPERATURE_DEVICE_NTC 0
#define BLE_TEMPERATURE_WORK_LED IO_PORTA_07
#define BLE_TEMPERATURE_CHARGE_STATE_CHARGING 1
#define BLE_TEMPERATURE_CHARGE_STATE_FULL 2
#define BLE_TEMPERATURE_CHARGE_STATE_IDLE 3
#define BLE_TEMPERATURE_CHARGE_STATE_LOWPOWER 4
//VM用户自定义配置项[1 ~ 49]
#define BLE_TEMPERATURE_VM_DEVICE_CONFIG 2
typedef struct
{
u16 temperature_sensor;
u16 temperature_ntc;
u8 batt_percent;
u16 batt_val;
u8 is_bat_charge;
u8 is_bat_full;
}app_dev_info_t;
typedef struct
{
/* 测温检测间隔 ms 1000ms*/
int16_t detect_interval;
/* 温度校准 0.1C *1000 = 100 或者 -100*/
int16_t temperature_offset;
}app_dev_config_t;
//extern struct app_dev_info_t dev_info;
//extern struct app_dev_config_t dev_config;
void temperature_ble_init();
void temperature_init(void);
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 "asm/charge.h"
#include "asm/pwm_led.h"
#include "system/event.h"
#include "system/app_core.h"
#include "system/includes.h"
#include "app_action.h"
#include "asm/wdt.h"
#include "app_main.h"
#include "app_power_manage.h"
#include "app_handshake.h"
#include "app_temperature.h"
#define LOG_TAG_CONST APP_CHARGE
#define LOG_TAG "[APP_CHARGE]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
#if TCFG_CHARGE_ENABLE
#if TCFG_HANDSHAKE_ENABLE
static void handshake_complete(void)
{
handshake_app_stop();
if (get_lvcmp_det()) {
charge_start();
}
}
#endif
void charge_start_deal(void)
{
log_info("%s\n", __func__);
power_set_mode(PWR_LDO15);
}
void ldo5v_keep_deal(void)
{
log_info("%s\n", __func__);
#if TCFG_HANDSHAKE_ENABLE
handshake_app_start(2, handshake_complete);
#endif
temperature_charge_state(BLE_TEMPERATURE_CHARGE_STATE_CHARGING);
}
void charge_full_deal(void)
{
log_info("%s\n", __func__);
charge_close();
//power_set_soft_poweroff();
//extern spple_set_soft_poweroff();
//spple_set_soft_poweroff();
temperature_charge_state(BLE_TEMPERATURE_CHARGE_STATE_FULL);
}
void charge_close_deal(void)
{
log_info("%s\n", __FUNCTION__);
}
void charge_ldo5v_in_deal(void)
{
log_info("%s\n", __FUNCTION__);
#if TCFG_HANDSHAKE_ENABLE
handshake_app_start(2, handshake_complete);
#else
charge_start();
#endif
temperature_charge_state(BLE_TEMPERATURE_CHARGE_STATE_CHARGING);
}
void charge_ldo5v_off_deal(void)
{
log_info("%s\n", __FUNCTION__);
#if TCFG_HANDSHAKE_ENABLE
handshake_app_stop();
#endif
charge_close();
power_set_mode(TCFG_LOWPOWER_POWER_SEL);
#if TCFG_SYS_LVD_EN
vbat_check_init();
#endif
temperature_charge_state(BLE_TEMPERATURE_CHARGE_STATE_IDLE);
}
int app_charge_event_handler(struct device_event *dev)
{
switch (dev->event) {
case CHARGE_EVENT_CHARGE_START:
charge_start_deal();
break;
case CHARGE_EVENT_CHARGE_CLOSE:
charge_close_deal();
break;
case CHARGE_EVENT_CHARGE_FULL:
charge_full_deal();
break;
case CHARGE_EVENT_LDO5V_KEEP:
ldo5v_keep_deal();
break;
case CHARGE_EVENT_LDO5V_IN:
charge_ldo5v_in_deal();
break;
case CHARGE_EVENT_LDO5V_OFF:
charge_ldo5v_off_deal();
break;
default:
break;
}
return 0;
}
#endif
#include "app_config.h"
#include "asm/charge.h"
#include "asm/pwm_led.h"
#include "system/event.h"
#include "system/app_core.h"
#include "system/includes.h"
#include "app_action.h"
#include "asm/wdt.h"
#include "app_main.h"
#include "app_power_manage.h"
#include "app_handshake.h"
#include "app_temperature.h"
#define LOG_TAG_CONST APP_CHARGE
#define LOG_TAG "[APP_CHARGE]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
#if TCFG_CHARGE_ENABLE
#if TCFG_HANDSHAKE_ENABLE
static void handshake_complete(void)
{
handshake_app_stop();
if (get_lvcmp_det()) {
charge_start();
}
}
#endif
void charge_start_deal(void)
{
log_info("%s\n", __func__);
power_set_mode(PWR_LDO15);
}
void ldo5v_keep_deal(void)
{
log_info("%s\n", __func__);
#if TCFG_HANDSHAKE_ENABLE
handshake_app_start(2, handshake_complete);
#endif
temperature_charge_state(BLE_TEMPERATURE_CHARGE_STATE_CHARGING);
}
void charge_full_deal(void)
{
log_info("%s\n", __func__);
charge_close();
//power_set_soft_poweroff();
//extern spple_set_soft_poweroff();
//spple_set_soft_poweroff();
temperature_charge_state(BLE_TEMPERATURE_CHARGE_STATE_FULL);
}
void charge_close_deal(void)
{
log_info("%s\n", __FUNCTION__);
}
void charge_ldo5v_in_deal(void)
{
log_info("%s\n", __FUNCTION__);
#if TCFG_HANDSHAKE_ENABLE
handshake_app_start(2, handshake_complete);
#else
charge_start();
#endif
temperature_charge_state(BLE_TEMPERATURE_CHARGE_STATE_CHARGING);
}
void charge_ldo5v_off_deal(void)
{
log_info("%s\n", __FUNCTION__);
#if TCFG_HANDSHAKE_ENABLE
handshake_app_stop();
#endif
charge_close();
power_set_mode(TCFG_LOWPOWER_POWER_SEL);
#if TCFG_SYS_LVD_EN
vbat_check_init();
#endif
temperature_charge_state(BLE_TEMPERATURE_CHARGE_STATE_IDLE);
}
int app_charge_event_handler(struct device_event *dev)
{
log_info("%s\n %d", __FUNCTION__,dev->event);
switch (dev->event) {
case CHARGE_EVENT_CHARGE_START:
charge_start_deal();
break;
case CHARGE_EVENT_CHARGE_CLOSE:
charge_close_deal();
break;
case CHARGE_EVENT_CHARGE_FULL:
charge_full_deal();
break;
case CHARGE_EVENT_LDO5V_KEEP:
ldo5v_keep_deal();
break;
case CHARGE_EVENT_LDO5V_IN:
charge_ldo5v_in_deal();
break;
case CHARGE_EVENT_LDO5V_OFF:
charge_ldo5v_off_deal();
break;
default:
break;
}
return 0;
}
#endif

View File

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