Compare commits
9 Commits
main
...
众宸宇科技AC695
| Author | SHA1 | Date | |
|---|---|---|---|
| a94bdd6943 | |||
| 9add3e7437 | |||
| b3a97e0a7e | |||
| ee5fcf0ad2 | |||
| 5c1f5d9971 | |||
| ee2760c7a5 | |||
| 57968a0eac | |||
| a06450e6e4 | |||
| ba9fd97c80 |
3
.vscode/c_cpp_properties.json
vendored
3
.vscode/c_cpp_properties.json
vendored
@ -128,7 +128,8 @@
|
||||
"${workspaceFolder}/apps/soundbox/smartbox/file_transfer",
|
||||
"${workspaceFolder}/apps/soundbox/smartbox/tuya",
|
||||
"${workspaceFolder}/apps/soundbox/include/ui/color_led",
|
||||
"C:/JL/pi32/pi32v2-include"
|
||||
"C:/JL/pi32/pi32v2-include",
|
||||
"${workspaceFolder}/apps/kaotings"
|
||||
],
|
||||
"intelliSenseMode": "clang-x86",
|
||||
"name": "AC695N_soundbox"
|
||||
|
||||
8
.vscode/settings.json
vendored
Normal file
8
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"files.associations": {
|
||||
"tuya_le_multi_common.h": "c",
|
||||
"mcpwm.h": "c",
|
||||
"kt_fan_ac.h": "c",
|
||||
"kt_led7.h": "c"
|
||||
}
|
||||
}
|
||||
6
Makefile
6
Makefile
@ -206,6 +206,7 @@ INCLUDES := \
|
||||
-Iapps/soundbox/smartbox/file_transfer \
|
||||
-Iapps/soundbox/smartbox/tuya \
|
||||
-Iapps/soundbox/include/ui/color_led \
|
||||
-Iapps/kaotings \
|
||||
-I$(SYS_INC_DIR) \
|
||||
|
||||
|
||||
@ -376,6 +377,11 @@ c_SRC_FILES := \
|
||||
apps/common/usb/usb_host_config.c \
|
||||
apps/soundbox/aec/br23/audio_aec.c \
|
||||
apps/soundbox/aec/br23/audio_aec_demo.c \
|
||||
apps/kaotings/kt.c \
|
||||
apps/kaotings/kt_led7.c \
|
||||
apps/kaotings/kt_fan_ac.c \
|
||||
apps/kaotings/kt_light_led.c \
|
||||
apps/kaotings/kt_battery.c \
|
||||
apps/soundbox/app_main.c \
|
||||
apps/soundbox/board/br23/board_ac6083a/board_ac6083a.c \
|
||||
apps/soundbox/board/br23/board_ac6083a/key_table/adkey_table.c \
|
||||
|
||||
@ -4,7 +4,8 @@
|
||||
#define USB_MALLOC_ENABLE 0
|
||||
#define USB_HOST_ASYNC 1
|
||||
#define USB_H_MALLOC_ENABLE 1
|
||||
#define USB_DEVICE_CLASS_CONFIG (SPEAKER_CLASS|MIC_CLASS|HID_CLASS|MASSSTORAGE_CLASS)
|
||||
//#define USB_DEVICE_CLASS_CONFIG (SPEAKER_CLASS|MIC_CLASS|HID_CLASS|MASSSTORAGE_CLASS)
|
||||
#define USB_DEVICE_CLASS_CONFIG (MASSSTORAGE_CLASS)
|
||||
|
||||
///////////MassStorage Class
|
||||
|
||||
|
||||
174
apps/kaotings/kt.c
Normal file
174
apps/kaotings/kt.c
Normal file
@ -0,0 +1,174 @@
|
||||
#include "kt.h"
|
||||
#include "key_event_deal.h"
|
||||
#include "asm/mcpwm.h"
|
||||
#include "system/timer.h"
|
||||
#include "kt_fan_ac.h"
|
||||
#include "kt_led7.h"
|
||||
#include "kt_light_led.h"
|
||||
#include "kt_battery.h"
|
||||
|
||||
#define KT_VBUS_DEBOUNCE_CNT 3
|
||||
#define KT_VBUS_POLL_MS 200
|
||||
|
||||
/* 在 cpu/br23/setup.c 里早期已经调用过一次,这里在所有 PWM/IO 映射完成后再调一次,
|
||||
* 避免 IO_PORT_DP 被 MCPWM output_channel 复用抢占后导致打印异常 */
|
||||
extern void debug_uart_init(const struct uart_platform_data *data);
|
||||
|
||||
void kt_boot_init(void)
|
||||
{
|
||||
printf("kt_boot_init\n");
|
||||
// 初始化GPIO PA Mute
|
||||
gpio_set_pull_down(KT_CFG_PA_MUTE_PIN, 0);
|
||||
gpio_set_pull_up(KT_CFG_PA_MUTE_PIN, 0);
|
||||
gpio_set_direction(KT_CFG_PA_MUTE_PIN, 0);
|
||||
PA_MUTE();
|
||||
|
||||
// 初始化GPIO Vbat Detect
|
||||
gpio_set_pull_down(KT_CFG_VBAT_DET_PIN, 0);
|
||||
gpio_set_pull_up(KT_CFG_VBAT_DET_PIN, 0);
|
||||
gpio_set_direction(KT_CFG_VBAT_DET_PIN, 1);
|
||||
gpio_set_die(KT_CFG_VBAT_DET_PIN, 0);
|
||||
adc_add_sample_ch(AD_CH_PA12);
|
||||
|
||||
// 初始化GPIO USB Plug Detect
|
||||
gpio_set_pull_down(KT_CFG_USB_PLUG_DET_PIN, 0);
|
||||
gpio_set_pull_up(KT_CFG_USB_PLUG_DET_PIN, 0);
|
||||
gpio_set_die(KT_CFG_USB_PLUG_DET_PIN, 1);
|
||||
gpio_set_direction(KT_CFG_USB_PLUG_DET_PIN, 1);
|
||||
|
||||
// 初始化GPIO Vibration Switch
|
||||
gpio_set_pull_down(KT_CFG_VIBRATION_SW_PIN, 0);
|
||||
gpio_set_pull_up(KT_CFG_VIBRATION_SW_PIN, 0);
|
||||
gpio_set_die(KT_CFG_VIBRATION_SW_PIN, 1);
|
||||
gpio_set_direction(KT_CFG_VIBRATION_SW_PIN, 1);
|
||||
|
||||
// 初始化GPIO Front Fan
|
||||
gpio_set_pull_down(KT_CFG_FRONT_FAN_PIN, 0);
|
||||
gpio_set_pull_up(KT_CFG_FRONT_FAN_PIN, 0);
|
||||
gpio_set_direction(KT_CFG_FRONT_FAN_PIN, 0);
|
||||
gpio_set_output_value(KT_CFG_FRONT_FAN_PIN, 0);
|
||||
|
||||
// 初始化GPIO Rear Fan
|
||||
gpio_set_pull_down(KT_CFG_REAR_FAN_PIN, 0);
|
||||
gpio_set_pull_up(KT_CFG_REAR_FAN_PIN, 0);
|
||||
gpio_set_direction(KT_CFG_REAR_FAN_PIN, 0);
|
||||
gpio_set_output_value(KT_CFG_REAR_FAN_PIN, 0);
|
||||
|
||||
// 初始化GPIO LR Fan
|
||||
gpio_set_pull_down(KT_CFG_LR_FAN_PIN, 0);
|
||||
gpio_set_pull_up(KT_CFG_LR_FAN_PIN, 0);
|
||||
gpio_set_die(KT_CFG_LR_FAN_PIN, 1);
|
||||
gpio_set_direction(KT_CFG_LR_FAN_PIN, 0);
|
||||
gpio_set_output_value(KT_CFG_LR_FAN_PIN, 0);
|
||||
|
||||
// 初始化GPIO Air Cond
|
||||
gpio_set_pull_down(KT_CFG_AIR_COND_PIN, 0);
|
||||
gpio_set_pull_up(KT_CFG_AIR_COND_PIN, 0);
|
||||
gpio_set_die(KT_CFG_AIR_COND_PIN, 1);
|
||||
gpio_set_direction(KT_CFG_AIR_COND_PIN, 0);
|
||||
gpio_set_output_value(KT_CFG_AIR_COND_PIN, 0);
|
||||
}
|
||||
static u16 vbus_timer = 0;
|
||||
static u8 vbus_high_cnt = 0;
|
||||
static u8 vbus_low_cnt = 0;
|
||||
static u8 vbus_inserted = 0;
|
||||
|
||||
static void vbus_detect(void *priv)
|
||||
{
|
||||
(void)priv;
|
||||
if (gpio_read(KT_CFG_USB_PLUG_DET_PIN)) {
|
||||
vbus_low_cnt = 0;
|
||||
if (!vbus_inserted) {
|
||||
vbus_high_cnt++;
|
||||
if (vbus_high_cnt >= KT_VBUS_DEBOUNCE_CNT) {
|
||||
vbus_inserted = 1;
|
||||
kt_set_charging(1);
|
||||
kt_led7_usb_charge_set(1);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
vbus_high_cnt = 0;
|
||||
if (vbus_inserted) {
|
||||
vbus_low_cnt++;
|
||||
if (vbus_low_cnt >= KT_VBUS_DEBOUNCE_CNT) {
|
||||
vbus_inserted = 0;
|
||||
kt_set_charging(0);
|
||||
kt_led7_usb_charge_set(0);
|
||||
}
|
||||
} else {
|
||||
vbus_low_cnt = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void start_chk_det_start(void)
|
||||
{
|
||||
if (vbus_timer) {
|
||||
sys_timer_del(vbus_timer);
|
||||
vbus_timer = 0;
|
||||
}
|
||||
/* 启动周期检测前先做一次"零去抖"判断,避免开机时若 USB 已插入,
|
||||
* 要等 200ms × KT_VBUS_DEBOUNCE_CNT 才能识别到充电状态,
|
||||
* 这段空窗会让 kt_battery 误以为在放电、又用充电中虚高电压初始化 % */
|
||||
if (gpio_read(KT_CFG_USB_PLUG_DET_PIN)) {
|
||||
vbus_inserted = 1;
|
||||
vbus_high_cnt = KT_VBUS_DEBOUNCE_CNT;
|
||||
vbus_low_cnt = 0;
|
||||
kt_set_charging(1);
|
||||
kt_led7_usb_charge_set(1);
|
||||
}
|
||||
vbus_timer = sys_timer_add(NULL, vbus_detect, KT_VBUS_POLL_MS);
|
||||
}
|
||||
|
||||
void kt_init(void)
|
||||
{
|
||||
printf("kt_init\n");
|
||||
kt_light_led_init();
|
||||
kt_fan_ac_init();
|
||||
kt_led7_init();
|
||||
/* kt_battery_init 必须在 start_chk_det_start 之前:
|
||||
* 充电插入时 vbus_detect 会立即调 kt_set_charging(1),
|
||||
* 这里先把电池模块准备好,种子电压填好,免得首次回调时缓冲为空 */
|
||||
kt_battery_init();
|
||||
start_chk_det_start();
|
||||
|
||||
/* 所有 PWM/IO 映射完成后,重新初始化调试串口,
|
||||
* 防止 TCFG_UART0_TX_PORT(IO_PORT_DP) 被 MCPWM 复用导致打印异常 */
|
||||
debug_uart_init(NULL);
|
||||
printf("kt_init: debug uart re-init done\n");
|
||||
}
|
||||
|
||||
u8 kt_key_event_filter_after(int key_event, int key_value)
|
||||
{
|
||||
u8 ret = true;
|
||||
switch (key_event)
|
||||
{
|
||||
case KEY_KT_FRONT_FAN:
|
||||
printf("KEY_KT_FRONT_FAN = %d\n", key_value);
|
||||
kt_fan_level_change(fan_type_front);
|
||||
break;
|
||||
case KEY_KT_REAR_FAN:
|
||||
printf("KEY_KT_REAR_FAN = %d\n", key_value);
|
||||
kt_fan_level_change(fan_type_rear);
|
||||
break;
|
||||
case KEY_KT_LR_FAN:
|
||||
printf("KEY_KT_LR_FAN = %d\n", key_value);
|
||||
kt_fan_level_change(fan_type_lr);
|
||||
break;
|
||||
case KEY_KT_LED:
|
||||
printf("KEY_KT_LED = %d\n", key_value);
|
||||
kt_light_led_level_change();
|
||||
break;
|
||||
case KEY_KT_AIR_COND:
|
||||
printf("KEY_KT_AIR_COND = %d\n", key_value);
|
||||
kt_fan_level_change(fan_type_ac);
|
||||
break;
|
||||
default:
|
||||
printf("KEY_KT_DEFAULT = %d\n", key_value);
|
||||
ret = false;
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
|
||||
// return false;
|
||||
}
|
||||
59
apps/kaotings/kt.h
Normal file
59
apps/kaotings/kt.h
Normal file
@ -0,0 +1,59 @@
|
||||
#ifndef __KT_H__
|
||||
#define __KT_H__
|
||||
|
||||
#include "system/includes.h"
|
||||
|
||||
#define KT_CFG_USB_PLUG_DET_PIN IO_PORTB_03 //USB插拔检测引脚 检测到插入后,闪烁显示电量
|
||||
#define KT_CFG_VIBRATION_SW_PIN IO_PORTB_04 //振动开关反馈引脚,一直摇动这里会有反应
|
||||
|
||||
#define KT_CFG_PA_MUTE_PIN IO_PORTB_00 //PA静音引脚,低开高关,默认硬件上拉
|
||||
#define PA_MUTE() gpio_set_output_value(KT_CFG_PA_MUTE_PIN, 1)
|
||||
#define PA_UNMUTE() gpio_set_output_value(KT_CFG_PA_MUTE_PIN, 0)
|
||||
|
||||
|
||||
|
||||
#define KT_CFG_VBAT_DET_PIN IO_PORTA_12 //电池电压ADC检测引脚
|
||||
|
||||
/* 前风扇 档位循环以及数码管显示
|
||||
L-0 L-1 L-2 L-3 L-4 L-5 L-6
|
||||
语音
|
||||
前风扇关闭 前风扇1档 前风扇2档 前风扇3档 前风扇4档 前风扇5档 前风扇6档
|
||||
*/
|
||||
#define KT_CFG_FRONT_FAN_PIN IO_PORTB_05 //前风扇控制引脚
|
||||
|
||||
/* 后风扇 档位循环以及数码管显示
|
||||
F-0 F-1 F-2 F-3 F-4 F-5 F-6
|
||||
语音
|
||||
后风扇关闭 后风扇1档 后风扇2档 后风扇3档 后风扇4档 后风扇5档 后风扇6档
|
||||
*/
|
||||
#define KT_CFG_REAR_FAN_PIN IO_PORTB_06 //后风扇控制引脚
|
||||
|
||||
/* 左右风扇 档位循环以及数码管显示
|
||||
C-0 C-1 C-2 C-3 C-4 C-5 C-6
|
||||
语音
|
||||
左右风扇关闭 左右风扇1档 左右风扇2档 左右风扇3档 左右风扇4档 左右风扇5档 左右风扇6档
|
||||
*/
|
||||
#define KT_CFG_LR_FAN_PIN IO_PORTA_10 //左右风扇控制引脚
|
||||
|
||||
/* 空调 档位循环以及数码管显示
|
||||
AC0 AC1 AC2
|
||||
空调已打开断续模式(AC1)->连续模式(AC2)->空调已关闭(AC0)
|
||||
语音
|
||||
空调已打开断续模式 空调已打开连续模式 空调已关闭
|
||||
*/
|
||||
#define KT_CFG_AIR_COND_PIN IO_PORTB_09 //空调控制
|
||||
|
||||
/* LED 语音 数码管不显示,但是激活电量显示
|
||||
灯光已打开->爆闪模式->灯光已关闭
|
||||
*/
|
||||
#define KT_CFG_LED_PIN IO_PORTB_02 //LED控制引脚
|
||||
|
||||
|
||||
void kt_boot_init(void);
|
||||
void kt_init(void);
|
||||
u8 kt_key_event_filter_after(int key_event,int key_value);
|
||||
|
||||
/** VBUS 200ms 轮询(需在 kt_init 之后调用一次) */
|
||||
void start_chk_det_start(void);
|
||||
|
||||
#endif
|
||||
322
apps/kaotings/kt_battery.c
Normal file
322
apps/kaotings/kt_battery.c
Normal file
@ -0,0 +1,322 @@
|
||||
/*
|
||||
* kt_battery.c — 自采集电池电量
|
||||
*
|
||||
* SDK 的 get_vbat_percent() 在本项目实测不准,改用 KT_CFG_VBAT_DET_PIN(PA12)
|
||||
* 经 100K/100K 分压采集 → ADC → 平均 → 线性映射 4.2V/3.2V → 滞回输出百分比。
|
||||
*
|
||||
* 锂电池物理特性带来的算法约束:
|
||||
* 1) 充电中,充电 IC 在 CV 阶段会把电池端电压强制维持在 4.2V,无论电池真实 SOC 多少
|
||||
* 电压计都会读到 ~4.2V,因此充电时**电压完全无法用于估算 SOC**;
|
||||
* 2) 充电刚结束的瞬间,电池存在"极化电压"(电极内离子不平衡导致端电压比 OCV 高
|
||||
* 0.1~0.3V),需要几秒~几十秒通过自身内阻消退到真实 OCV;
|
||||
* 3) 正常放电时,负载突变(如 PA 工作)瞬时拉低端电压并不代表 SOC 真的下降,
|
||||
* 松开负载后电压会回升,因此需要平均 + 单向滞回避免百分比抖动。
|
||||
*
|
||||
* 对应的算法处理:
|
||||
* 1) 充电中(vbat_charging=1):锁住电压不参与 SOC 计算,改用"时间法"模拟爬升
|
||||
* (每 KT_BAT_CHARGE_BUMP_SEC 秒 +1%,封顶 100%),给用户充电进度反馈;
|
||||
* 2) 拔下充电器瞬间:启动 KT_BAT_RECOVERY_MS 的极化消退期,期间继续冻结 %,
|
||||
* 让端电压自然回落到 OCV;
|
||||
* 3) 消退期结束:用此刻电压一次性吸附 %,清空缓冲重新种子化,进入正常滑窗采样;
|
||||
* 4) 正常放电期:16 点滑动平均 + 单向"只许降"滞回 + 1% 门槛,防抖。
|
||||
*
|
||||
* 串口仍然每次打印瞬时电压,便于观察电压回落情况。
|
||||
*/
|
||||
|
||||
#include "kt_battery.h"
|
||||
#include "asm/adc_api.h"
|
||||
#include "system/timer.h"
|
||||
#include "user_cfg_id.h"
|
||||
|
||||
/* 采样周期 ms;周期 × 缓冲长度 = 平滑窗口 */
|
||||
#define KT_BAT_SAMPLE_MS 200u
|
||||
/* 滑动平均缓冲长度,值越大越稳越慢 */
|
||||
#define KT_BAT_FILTER_N 16u
|
||||
/* 滞回门槛(百分点),新值与旧值差值需 ≥ 该门槛才采纳 */
|
||||
#define KT_BAT_HYSTERESIS 1u
|
||||
/* 拔下充电器后的极化消退期(ms):锂电池端电压从充电"极化高电压"回落到真实 OCV
|
||||
* 所需时间,典型几秒~几十秒。实测拔出 8s 左右从 4217 → 3924,用 12s 留余量。 */
|
||||
#define KT_BAT_RECOVERY_MS 12000u
|
||||
#define KT_BAT_RECOVERY_TICKS ((u8)(KT_BAT_RECOVERY_MS / KT_BAT_SAMPLE_MS))
|
||||
/* 充电模拟爬升:分两段,贴合锂电池 CC/CV 真实充电速率。
|
||||
* CC 阶段(电池端电压 < 4.2V,SOC 大致 < 80%):充电 IC 维持设定电流,充得快;
|
||||
* CV 阶段(端电压 = 4.2V,SOC 大致 80~100%):电流随 SOC 上升而下降,充得慢。
|
||||
*
|
||||
* 本项目 4000mAh / IP5306 默认 0.8A:
|
||||
* CC: (40 mAh/1%) / 800 mA × 3600 ≈ 180 秒/1% → 0~80% 约 4 小时
|
||||
* CV: 平均电流跌到 ~0.4A,(40 mAh/1%) / 400 mA × 3600 ≈ 360 秒/1% → 80~100% 约 2 小时
|
||||
* 全程约 6 小时充满
|
||||
*
|
||||
* 切换阈值取 80%(锂电池典型 CC→CV 切换点)。换电池/换电流时改这三个宏。 */
|
||||
#define KT_BAT_CC_BUMP_SEC 180u
|
||||
#define KT_BAT_CV_BUMP_SEC 360u
|
||||
#define KT_BAT_CC_CV_THRESHOLD 80u
|
||||
#define KT_BAT_CC_BUMP_TICKS ((u16)(KT_BAT_CC_BUMP_SEC * 1000u / KT_BAT_SAMPLE_MS))
|
||||
#define KT_BAT_CV_BUMP_TICKS ((u16)(KT_BAT_CV_BUMP_SEC * 1000u / KT_BAT_SAMPLE_MS))
|
||||
/* VM 写入策略: 百分比变化至少 2%,且间隔至少 10 分钟 */
|
||||
#define KT_BAT_VM_SAVE_DELTA_PERCENT 2u
|
||||
#define KT_BAT_VM_SAVE_MIN_SEC 600u
|
||||
#define KT_BAT_VM_SAVE_MIN_TICKS ((u16)(KT_BAT_VM_SAVE_MIN_SEC * 1000u / KT_BAT_SAMPLE_MS))
|
||||
/* 首次无历史记录时,插电开机随机起点 65~75% */
|
||||
#define KT_BAT_BOOT_FALLBACK_MIN 65u
|
||||
#define KT_BAT_BOOT_FALLBACK_MAX 75u
|
||||
/* VM 数据校验 */
|
||||
#define KT_BAT_VM_TAG 0xA5u
|
||||
|
||||
static u16 vbat_buf[KT_BAT_FILTER_N];
|
||||
static u8 vbat_buf_idx;
|
||||
static u8 vbat_buf_filled;
|
||||
static u16 vbat_avg_mv;
|
||||
static u8 vbat_percent_cached = 100u;
|
||||
static u8 vbat_charging;
|
||||
static u8 vbat_recovery_ticks; /* > 0 表示处于"极化消退期",期间不更新 % */
|
||||
static u16 vbat_charge_bump_cnt; /* 充电中累计的 200ms tick 数,达到阈值就 +1% */
|
||||
static u16 vbat_vm_save_ticks;
|
||||
static u8 vbat_vm_last_saved_percent = 0xFFu;
|
||||
static u16 vbat_timer_id;
|
||||
|
||||
struct kt_bat_vm_record {
|
||||
u8 tag;
|
||||
u8 percent;
|
||||
u8 checksum;
|
||||
};
|
||||
|
||||
static u8 kt_battery_vm_checksum(u8 tag, u8 percent)
|
||||
{
|
||||
return (u8)(tag ^ percent ^ 0x5Au);
|
||||
}
|
||||
|
||||
static u8 kt_battery_random_percent_fallback(void)
|
||||
{
|
||||
u8 rnd = 0;
|
||||
get_random_number(&rnd, 1);
|
||||
return (u8)(KT_BAT_BOOT_FALLBACK_MIN
|
||||
+ (rnd % (KT_BAT_BOOT_FALLBACK_MAX - KT_BAT_BOOT_FALLBACK_MIN + 1u)));
|
||||
}
|
||||
|
||||
static u8 kt_battery_vm_load_percent(u8 *percent)
|
||||
{
|
||||
struct kt_bat_vm_record rec;
|
||||
if (!percent) {
|
||||
return 0u;
|
||||
}
|
||||
|
||||
if (syscfg_read(VM_KT_BAT_LAST_PERCENT, &rec, sizeof(rec)) != sizeof(rec)) {
|
||||
return 0u;
|
||||
}
|
||||
if (rec.tag != KT_BAT_VM_TAG) {
|
||||
return 0u;
|
||||
}
|
||||
if (rec.checksum != kt_battery_vm_checksum(rec.tag, rec.percent)) {
|
||||
return 0u;
|
||||
}
|
||||
if ((rec.percent == 0u) || (rec.percent >= 100u)) {
|
||||
return 0u;
|
||||
}
|
||||
|
||||
*percent = rec.percent;
|
||||
return 1u;
|
||||
}
|
||||
|
||||
static void kt_battery_vm_save_percent(u8 percent)
|
||||
{
|
||||
struct kt_bat_vm_record rec;
|
||||
|
||||
if ((percent == 0u) || (percent >= 100u)) {
|
||||
return;
|
||||
}
|
||||
|
||||
rec.tag = KT_BAT_VM_TAG;
|
||||
rec.percent = percent;
|
||||
rec.checksum = kt_battery_vm_checksum(rec.tag, rec.percent);
|
||||
if (syscfg_write(VM_KT_BAT_LAST_PERCENT, &rec, sizeof(rec)) == sizeof(rec)) {
|
||||
vbat_vm_last_saved_percent = percent;
|
||||
vbat_vm_save_ticks = 0;
|
||||
printf("kt_battery: vm save percent=%d\n", percent);
|
||||
}
|
||||
}
|
||||
|
||||
static u16 kt_battery_read_raw_mv(void)
|
||||
{
|
||||
/* SDK adc_get_voltage 返回引脚电压 (mV),× 分压系数 = 电池电压 (mV) */
|
||||
u32 pin_mv = adc_get_voltage(AD_CH_PA12);
|
||||
u32 bat_mv = pin_mv * KT_BAT_DIVIDER_NUM;
|
||||
if (bat_mv > 0xFFFFu) {
|
||||
bat_mv = 0xFFFFu;
|
||||
}
|
||||
return (u16)bat_mv;
|
||||
}
|
||||
|
||||
static u8 kt_battery_mv_to_percent(u16 mv)
|
||||
{
|
||||
if (mv >= KT_BAT_FULL_MV) {
|
||||
return 100u;
|
||||
}
|
||||
if (mv <= KT_BAT_EMPTY_MV) {
|
||||
return 0u;
|
||||
}
|
||||
return (u8)(((u32)(mv - KT_BAT_EMPTY_MV) * 100u)
|
||||
/ (KT_BAT_FULL_MV - KT_BAT_EMPTY_MV));
|
||||
}
|
||||
|
||||
/* 用即时电压重新种子化整个滑窗缓冲,后续采样从这个值开始平滑 */
|
||||
static void kt_battery_reseed(u16 mv)
|
||||
{
|
||||
for (u8 i = 0; i < KT_BAT_FILTER_N; i++) {
|
||||
vbat_buf[i] = mv;
|
||||
}
|
||||
vbat_buf_idx = 0;
|
||||
vbat_buf_filled = 1;
|
||||
vbat_avg_mv = mv;
|
||||
}
|
||||
|
||||
static void kt_battery_sample_cb(void *priv)
|
||||
{
|
||||
(void)priv;
|
||||
|
||||
u16 raw = kt_battery_read_raw_mv();
|
||||
|
||||
/* 1) 充电中:充电 IC CV 阶段把端电压维持在 4.2V,与真实 SOC 无关。
|
||||
* 电压不参与计算,改用"时间法"模拟爬升给用户充电进度反馈。
|
||||
* CC/CV 两段不同速率,贴合锂电池真实充电曲线。 */
|
||||
if (vbat_charging) {
|
||||
vbat_avg_mv = raw;
|
||||
if (vbat_percent_cached < 100u) {
|
||||
u16 bump_ticks = (vbat_percent_cached < KT_BAT_CC_CV_THRESHOLD)
|
||||
? KT_BAT_CC_BUMP_TICKS /* CC 阶段:快 */
|
||||
: KT_BAT_CV_BUMP_TICKS; /* CV 阶段:慢 */
|
||||
vbat_charge_bump_cnt++;
|
||||
if (vbat_charge_bump_cnt >= bump_ticks) {
|
||||
vbat_charge_bump_cnt = 0;
|
||||
vbat_percent_cached++;
|
||||
printf("kt_battery: charge bump -> %d%% (%s)\n",
|
||||
vbat_percent_cached,
|
||||
(vbat_percent_cached <= KT_BAT_CC_CV_THRESHOLD) ? "CC" : "CV");
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* 2) 刚拔下充电器:端电压还在"极化电压"阶段(高于真实 OCV),继续锁住 %,
|
||||
* 等极化消退期结束再用此刻电压一次性吸附到真实 OCV 对应的 SOC */
|
||||
if (vbat_recovery_ticks > 0) {
|
||||
vbat_recovery_ticks--;
|
||||
vbat_avg_mv = raw;
|
||||
if (vbat_recovery_ticks == 0) {
|
||||
kt_battery_reseed(raw);
|
||||
vbat_percent_cached = kt_battery_mv_to_percent(raw);
|
||||
/* 恢复期结束后从 0 重新计时,避免立刻写 VM */
|
||||
vbat_vm_save_ticks = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* 3) 正常放电:滑窗平均 + 单向下降滞回 */
|
||||
vbat_buf[vbat_buf_idx++] = raw;
|
||||
if (vbat_buf_idx >= KT_BAT_FILTER_N) {
|
||||
vbat_buf_idx = 0;
|
||||
vbat_buf_filled = 1;
|
||||
}
|
||||
|
||||
u8 n = vbat_buf_filled ? (u8)KT_BAT_FILTER_N : vbat_buf_idx;
|
||||
if (n == 0) {
|
||||
return;
|
||||
}
|
||||
u32 sum = 0;
|
||||
for (u8 i = 0; i < n; i++) {
|
||||
sum += vbat_buf[i];
|
||||
}
|
||||
vbat_avg_mv = (u16)(sum / n);
|
||||
|
||||
u8 new_p = kt_battery_mv_to_percent(vbat_avg_mv);
|
||||
|
||||
/* 放电只允许 % 下降:负载突变(如 PA 工作)瞬时电压回弹不会让 % 反弹,
|
||||
* 边界 0% 允许直接吸附,避免卡在 1% */
|
||||
if (new_p == 0u) {
|
||||
vbat_percent_cached = 0u;
|
||||
} else if ((u16)new_p + KT_BAT_HYSTERESIS <= vbat_percent_cached) {
|
||||
vbat_percent_cached = new_p;
|
||||
}
|
||||
|
||||
if (vbat_vm_save_ticks < 0xFFFFu) {
|
||||
vbat_vm_save_ticks++;
|
||||
}
|
||||
if ((vbat_percent_cached > 0u)
|
||||
&& (vbat_percent_cached < 100u)
|
||||
&& (vbat_vm_last_saved_percent != 0xFFu)
|
||||
&& ((u8)((vbat_vm_last_saved_percent > vbat_percent_cached)
|
||||
? (vbat_vm_last_saved_percent - vbat_percent_cached)
|
||||
: (vbat_percent_cached - vbat_vm_last_saved_percent)) >= KT_BAT_VM_SAVE_DELTA_PERCENT)
|
||||
&& (vbat_vm_save_ticks >= KT_BAT_VM_SAVE_MIN_TICKS)) {
|
||||
kt_battery_vm_save_percent(vbat_percent_cached);
|
||||
}
|
||||
}
|
||||
|
||||
u8 kt_get_vbat_percent(void)
|
||||
{
|
||||
return vbat_percent_cached;
|
||||
}
|
||||
|
||||
u16 kt_get_vbat_mv(void)
|
||||
{
|
||||
return vbat_avg_mv;
|
||||
}
|
||||
|
||||
void kt_set_charging(u8 charging)
|
||||
{
|
||||
u8 was_charging = vbat_charging;
|
||||
vbat_charging = charging ? 1u : 0u;
|
||||
|
||||
/* 充电 → 不充电 的下降沿:启动极化消退期 */
|
||||
if (was_charging && !vbat_charging) {
|
||||
vbat_recovery_ticks = KT_BAT_RECOVERY_TICKS;
|
||||
/* 消退期内不参与平均,先把缓冲清掉,消退期结束时重新种子化 */
|
||||
vbat_buf_idx = 0;
|
||||
vbat_buf_filled = 0;
|
||||
printf("kt_battery: charging->discharging, polarization recovery %dms\n",
|
||||
KT_BAT_RECOVERY_MS);
|
||||
} else if (!was_charging && vbat_charging) {
|
||||
/* 从插上充电那一刻重新计时,而非累计上一次充电的剩余 tick */
|
||||
vbat_charge_bump_cnt = 0;
|
||||
printf("kt_battery: discharging->charging, freeze at %d%%, bump CC=%ds CV=%ds\n",
|
||||
vbat_percent_cached, KT_BAT_CC_BUMP_SEC, KT_BAT_CV_BUMP_SEC);
|
||||
}
|
||||
}
|
||||
|
||||
void kt_battery_init(void)
|
||||
{
|
||||
u8 vm_percent = 0;
|
||||
u8 have_vm_percent = kt_battery_vm_load_percent(&vm_percent);
|
||||
|
||||
/* 用一次即时采样把环形缓冲全部种子化,避免开机瞬间百分比从 100% 跳到真实值 */
|
||||
u16 seed = kt_battery_read_raw_mv();
|
||||
kt_battery_reseed(seed);
|
||||
vbat_recovery_ticks = 0;
|
||||
vbat_charge_bump_cnt = 0;
|
||||
vbat_vm_save_ticks = 0;
|
||||
|
||||
if (gpio_read(KT_CFG_USB_PLUG_DET_PIN)) {
|
||||
vbat_charging = 1u;
|
||||
if (have_vm_percent) {
|
||||
vbat_percent_cached = vm_percent;
|
||||
printf("kt_battery_init: USB inserted, use vm percent=%d%%, seed_mv=%d\n",
|
||||
vbat_percent_cached, vbat_avg_mv);
|
||||
} else {
|
||||
vbat_percent_cached = kt_battery_random_percent_fallback();
|
||||
printf("kt_battery_init: USB inserted, vm empty, random percent=%d%%, seed_mv=%d\n",
|
||||
vbat_percent_cached, vbat_avg_mv);
|
||||
}
|
||||
vbat_vm_last_saved_percent = vbat_percent_cached;
|
||||
printf("kt_battery_init: charging from %d%%\n", vbat_percent_cached);
|
||||
} else {
|
||||
vbat_charging = 0u;
|
||||
vbat_percent_cached = kt_battery_mv_to_percent(seed);
|
||||
vbat_vm_last_saved_percent = vbat_percent_cached;
|
||||
printf("kt_battery_init: seed_mv=%d init_percent=%d\n",
|
||||
vbat_avg_mv, vbat_percent_cached);
|
||||
}
|
||||
|
||||
if (!vbat_timer_id) {
|
||||
vbat_timer_id = sys_timer_add(NULL, kt_battery_sample_cb, KT_BAT_SAMPLE_MS);
|
||||
}
|
||||
}
|
||||
29
apps/kaotings/kt_battery.h
Normal file
29
apps/kaotings/kt_battery.h
Normal file
@ -0,0 +1,29 @@
|
||||
#ifndef __KT_BATTERY_H__
|
||||
#define __KT_BATTERY_H__
|
||||
|
||||
#include "kt.h"
|
||||
|
||||
/*
|
||||
* KT_CFG_VBAT_DET_PIN(IO_PORTA_12 / AD_CH_PA12) 经 100K/100K 分压采集电池电压。
|
||||
* 采样路径: ADC(mV) × KT_BAT_DIVIDER_NUM = 电池真实电压(mV)
|
||||
*
|
||||
* 锂电池满电 4.2V,SDK 的 get_vbat_percent() 测试不准,这里独立做百分比换算 + 滤波 + 滞回。
|
||||
*/
|
||||
|
||||
#define KT_BAT_FULL_MV 4200u /* 100% 对应电压 (mV) */
|
||||
#define KT_BAT_EMPTY_MV 3200u /* 0% 对应电压 (mV);留 0.2V 余量避免低电关机抖 */
|
||||
#define KT_BAT_DIVIDER_NUM 2u /* 100K/100K 分压,实际电压 = ADC 读数 × 2 */
|
||||
|
||||
void kt_battery_init(void);
|
||||
|
||||
/* 当前电池百分比(0~100),已经过滑动平均 + 单向滞回平滑,可以直接喂 UI */
|
||||
u8 kt_get_vbat_percent(void);
|
||||
|
||||
/* 当前平滑后的电池电压(mV),调试/上报用 */
|
||||
u16 kt_get_vbat_mv(void);
|
||||
|
||||
/* 由 USB 插拔检测路径调用(kt.c::vbus_detect),用来切换滞回方向: */
|
||||
/* charging=1 → 只允许百分比上升; charging=0 → 只允许百分比下降 */
|
||||
void kt_set_charging(u8 charging);
|
||||
|
||||
#endif
|
||||
239
apps/kaotings/kt_fan_ac.c
Normal file
239
apps/kaotings/kt_fan_ac.c
Normal file
@ -0,0 +1,239 @@
|
||||
#include "kt_fan_ac.h"
|
||||
#include "asm/mcpwm.h"
|
||||
#include "system/timer.h"
|
||||
#include "tone_player.h"
|
||||
#include "kt_led7.h"
|
||||
|
||||
typedef struct _kt_fan_ac_var_
|
||||
{
|
||||
kt_fan_level_type front_fan_level; // 前风扇档位
|
||||
kt_fan_level_type rear_fan_level; // 后风扇档位
|
||||
kt_fan_level_type lr_fan_level; // 左右风扇档位
|
||||
kt_ac_level_type ac_level; // 空调档位
|
||||
} _kt_fan_ac_var;
|
||||
|
||||
static _kt_fan_ac_var kt_fan_ac_var;
|
||||
#define __this (&kt_fan_ac_var)
|
||||
|
||||
#define KT_FAN_PWM_FREQ 50000
|
||||
#define KT_AC_PWM_FREQ 100000
|
||||
#define KT_AC_RUN_DUTY 4000 /* 空调运行占空比 40% */
|
||||
#define KT_AC_BURST_MS 1000 /* AC1 断续:1s 开 / 1s 关 */
|
||||
|
||||
/* 1: 上电即输出不同占空比,便于示波器/万用表区分各路;量产改 0 */
|
||||
#define KT_PWM_BOOT_TEST_EN 0
|
||||
|
||||
const u32 fan_level_duty[7] = {0, 1500, 4000, 6000, 7000, 8000, 9500};
|
||||
|
||||
static u16 ac_burst_timer;
|
||||
static u8 ac_burst_pwm_on;
|
||||
|
||||
const char *front_fan_level_tone[7] = {TONE_FFAN_L0, TONE_FFAN_L1, TONE_FFAN_L2, TONE_FFAN_L3, TONE_FFAN_L4, TONE_FFAN_L5, TONE_FFAN_L6};
|
||||
const char *rear_fan_level_tone[7] = {TONE_BFAN_L0, TONE_BFAN_L1, TONE_BFAN_L2, TONE_BFAN_L3, TONE_BFAN_L4, TONE_BFAN_L5, TONE_BFAN_L6};
|
||||
const char *lr_fan_level_tone[7] = {TONE_CFAN_L0, TONE_CFAN_L1, TONE_CFAN_L2, TONE_CFAN_L3, TONE_CFAN_L4, TONE_CFAN_L5, TONE_CFAN_L6};
|
||||
const char *ac_level_tone[3] = {TONE_AC_L0, TONE_AC_L1, TONE_AC_L2};
|
||||
|
||||
extern void mcpwm_init(struct pwm_platform_data *arg);
|
||||
extern void mcpwm_set_duty(pwm_ch_num_type pwm_ch, pwm_timer_num_type timer_ch, u16 duty);
|
||||
|
||||
static void kt_ac_burst_stop(void)
|
||||
{
|
||||
if (ac_burst_timer) {
|
||||
sys_timer_del(ac_burst_timer);
|
||||
ac_burst_timer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void kt_ac_pwm_output(u16 duty)
|
||||
{
|
||||
mcpwm_set_duty(pwm_ch3, pwm_timer3, duty);
|
||||
}
|
||||
|
||||
static void kt_ac_burst_cb(void *priv)
|
||||
{
|
||||
(void)priv;
|
||||
if (__this->ac_level != ac_level_1) {
|
||||
return;
|
||||
}
|
||||
ac_burst_pwm_on = !ac_burst_pwm_on;
|
||||
kt_ac_pwm_output(ac_burst_pwm_on ? KT_AC_RUN_DUTY : 0);
|
||||
}
|
||||
|
||||
static void kt_ac_apply_mode(void)
|
||||
{
|
||||
kt_ac_burst_stop();
|
||||
|
||||
switch (__this->ac_level) {
|
||||
case ac_level_0:
|
||||
ac_burst_pwm_on = 0;
|
||||
kt_ac_pwm_output(0);
|
||||
break;
|
||||
case ac_level_1:
|
||||
ac_burst_pwm_on = 1;
|
||||
kt_ac_pwm_output(KT_AC_RUN_DUTY);
|
||||
ac_burst_timer = sys_timer_add(NULL, kt_ac_burst_cb, KT_AC_BURST_MS);
|
||||
break;
|
||||
case ac_level_2:
|
||||
ac_burst_pwm_on = 1;
|
||||
kt_ac_pwm_output(KT_AC_RUN_DUTY);
|
||||
break;
|
||||
default:
|
||||
ac_burst_pwm_on = 0;
|
||||
kt_ac_pwm_output(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void kt_fan_ac_init(void)
|
||||
{
|
||||
/*
|
||||
* 前风扇 PB5 : MCPWM CH0 + output_channel 0(非硬件脚)
|
||||
* 后风扇 PB6 : MCPWM CH2 L 硬件脚
|
||||
* 左右风扇 PA10: MCPWM CH4 L 硬件脚
|
||||
* 空调 PB9 : MCPWM CH3 H 硬件脚(100kHz)
|
||||
*/
|
||||
#if KT_PWM_BOOT_TEST_EN
|
||||
/* 前15% / 后40% / 左右60% / 空调80%,上电即可区分四路 */
|
||||
__this->front_fan_level = fan_level_1;
|
||||
__this->rear_fan_level = fan_level_2;
|
||||
__this->lr_fan_level = fan_level_3;
|
||||
__this->ac_level = ac_level_2;
|
||||
#else
|
||||
__this->front_fan_level = fan_level_0;
|
||||
__this->rear_fan_level = fan_level_0;
|
||||
__this->lr_fan_level = fan_level_0;
|
||||
__this->ac_level = ac_level_0;
|
||||
#endif
|
||||
|
||||
struct pwm_platform_data pwm_p_data;
|
||||
|
||||
/* 前风扇 PB5 */
|
||||
pwm_p_data.pwm_aligned_mode = pwm_edge_aligned;
|
||||
pwm_p_data.frequency = KT_FAN_PWM_FREQ;
|
||||
pwm_p_data.pwm_ch_num = pwm_ch0;
|
||||
pwm_p_data.pwm_timer_num = pwm_timer0;
|
||||
pwm_p_data.duty = fan_level_duty[__this->front_fan_level];
|
||||
pwm_p_data.h_pin = KT_CFG_FRONT_FAN_PIN;
|
||||
pwm_p_data.l_pin = -1;
|
||||
pwm_p_data.h_pin_output_ch_num = 0;
|
||||
pwm_p_data.complementary_en = 0;
|
||||
mcpwm_init(&pwm_p_data);
|
||||
|
||||
/* 后风扇 PB6 */
|
||||
pwm_p_data.pwm_aligned_mode = pwm_edge_aligned;
|
||||
pwm_p_data.frequency = KT_FAN_PWM_FREQ;
|
||||
pwm_p_data.pwm_ch_num = pwm_ch2;
|
||||
pwm_p_data.pwm_timer_num = pwm_timer2;
|
||||
pwm_p_data.duty = fan_level_duty[__this->rear_fan_level];
|
||||
pwm_p_data.h_pin = -1;
|
||||
pwm_p_data.l_pin = KT_CFG_REAR_FAN_PIN;
|
||||
pwm_p_data.complementary_en = 0;
|
||||
mcpwm_init(&pwm_p_data);
|
||||
|
||||
/* 左右风扇 PA10 */
|
||||
pwm_p_data.pwm_aligned_mode = pwm_edge_aligned;
|
||||
pwm_p_data.frequency = KT_FAN_PWM_FREQ;
|
||||
pwm_p_data.pwm_ch_num = pwm_ch4;
|
||||
pwm_p_data.pwm_timer_num = pwm_timer4;
|
||||
pwm_p_data.duty = fan_level_duty[__this->lr_fan_level];
|
||||
pwm_p_data.h_pin = -1;
|
||||
pwm_p_data.l_pin = KT_CFG_LR_FAN_PIN;
|
||||
pwm_p_data.complementary_en = 0;
|
||||
mcpwm_init(&pwm_p_data);
|
||||
|
||||
/* 空调 PB9 */
|
||||
pwm_p_data.pwm_aligned_mode = pwm_edge_aligned;
|
||||
pwm_p_data.frequency = KT_AC_PWM_FREQ;
|
||||
pwm_p_data.pwm_ch_num = pwm_ch3;
|
||||
pwm_p_data.pwm_timer_num = pwm_timer3;
|
||||
pwm_p_data.duty = 0;
|
||||
pwm_p_data.h_pin = KT_CFG_AIR_COND_PIN;
|
||||
pwm_p_data.l_pin = -1;
|
||||
pwm_p_data.complementary_en = 0;
|
||||
mcpwm_init(&pwm_p_data);
|
||||
kt_ac_apply_mode();
|
||||
|
||||
#if KT_PWM_BOOT_TEST_EN
|
||||
printf("PWM boot test: PB5=%u%% PB6=%u%% PA10=%u%% PB9=AC%d\n",
|
||||
fan_level_duty[__this->front_fan_level] / 100,
|
||||
fan_level_duty[__this->rear_fan_level] / 100,
|
||||
fan_level_duty[__this->lr_fan_level] / 100,
|
||||
__this->ac_level);
|
||||
#endif
|
||||
}
|
||||
|
||||
void kt_fan_level_tone_play(kt_fan_type fan)
|
||||
{
|
||||
if (fan == fan_type_front)
|
||||
{
|
||||
char str[6] = {0};
|
||||
sprintf(str, "L-%d", __this->front_fan_level);
|
||||
kt_led7_show_string(3, 0, (const u8 *)str, 0, 0);
|
||||
tone_play(front_fan_level_tone[__this->front_fan_level], 0);
|
||||
}
|
||||
else if (fan == fan_type_rear)
|
||||
{
|
||||
char str[6] = {0};
|
||||
sprintf(str, "F-%d", __this->rear_fan_level);
|
||||
kt_led7_show_string(3, 0, (const u8 *)str, 0, 0);
|
||||
tone_play(rear_fan_level_tone[__this->rear_fan_level], 0);
|
||||
}
|
||||
else if (fan == fan_type_lr)
|
||||
{
|
||||
char str[6] = {0};
|
||||
sprintf(str, "C-%d", __this->lr_fan_level);
|
||||
kt_led7_show_string(3, 0, (const u8 *)str, 0, 0);
|
||||
tone_play(lr_fan_level_tone[__this->lr_fan_level], 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
char str[6] = {0};
|
||||
sprintf(str, "AC%d", __this->ac_level);
|
||||
kt_led7_show_string(3, 0, (const u8 *)str, 0, 0);
|
||||
tone_play(ac_level_tone[__this->ac_level], 0);
|
||||
}
|
||||
}
|
||||
|
||||
void kt_fan_level_change(kt_fan_type fan)
|
||||
{
|
||||
if (fan == fan_type_front)
|
||||
{
|
||||
__this->front_fan_level++;
|
||||
if (__this->front_fan_level > fan_level_6)
|
||||
{
|
||||
__this->front_fan_level = fan_level_0;
|
||||
}
|
||||
kt_fan_level_tone_play(fan_type_front);
|
||||
mcpwm_set_duty(pwm_ch0, pwm_timer0, fan_level_duty[__this->front_fan_level]);
|
||||
}
|
||||
else if (fan == fan_type_rear)
|
||||
{
|
||||
__this->rear_fan_level++;
|
||||
if (__this->rear_fan_level > fan_level_6)
|
||||
{
|
||||
__this->rear_fan_level = fan_level_0;
|
||||
}
|
||||
kt_fan_level_tone_play(fan_type_rear);
|
||||
mcpwm_set_duty(pwm_ch2, pwm_timer2, fan_level_duty[__this->rear_fan_level]);
|
||||
}
|
||||
else if (fan == fan_type_lr)
|
||||
{
|
||||
__this->lr_fan_level++;
|
||||
if (__this->lr_fan_level > fan_level_6)
|
||||
{
|
||||
__this->lr_fan_level = fan_level_0;
|
||||
}
|
||||
kt_fan_level_tone_play(fan_type_lr);
|
||||
mcpwm_set_duty(pwm_ch4, pwm_timer4, fan_level_duty[__this->lr_fan_level]);
|
||||
}
|
||||
else
|
||||
{
|
||||
__this->ac_level++;
|
||||
if (__this->ac_level > ac_level_2)
|
||||
{
|
||||
__this->ac_level = ac_level_0;
|
||||
}
|
||||
kt_fan_level_tone_play(fan_type_ac);
|
||||
kt_ac_apply_mode();
|
||||
}
|
||||
}
|
||||
37
apps/kaotings/kt_fan_ac.h
Normal file
37
apps/kaotings/kt_fan_ac.h
Normal file
@ -0,0 +1,37 @@
|
||||
#ifndef __KT_FAN_AC_H__
|
||||
#define __KT_FAN_AC_H__
|
||||
|
||||
#include "system/includes.h"
|
||||
#include "kt.h"
|
||||
|
||||
|
||||
|
||||
typedef enum {
|
||||
ac_level_0 = 0, //空调已关闭(AC0) 低电平
|
||||
ac_level_1 = 1, //空调已打开断续模式(AC1) 1秒开(100KHz 40%占空比) 1秒关(低电平)
|
||||
ac_level_2 = 2, //空调已打开连续模式(AC2) 100KHz 40%占空比
|
||||
} kt_ac_level_type;
|
||||
|
||||
typedef enum {
|
||||
fan_level_0 = 0, //风扇关闭 0%占空比,低电平
|
||||
fan_level_1 = 1, //风扇1档 15%占空比
|
||||
fan_level_2 = 2, //风扇2档 40%占空比
|
||||
fan_level_3 = 3, //风扇3档 60%占空比
|
||||
fan_level_4 = 4, //风扇4档 70%占空比
|
||||
fan_level_5 = 5, //风扇5档 80%占空比
|
||||
fan_level_6 = 6, //风扇6档 100%占空比
|
||||
} kt_fan_level_type;
|
||||
|
||||
typedef enum {
|
||||
fan_type_front = 0, //前风扇
|
||||
fan_type_rear = 1, //后风扇
|
||||
fan_type_lr = 2, //左右风扇
|
||||
fan_type_ac = 3, //空调
|
||||
} kt_fan_type;
|
||||
|
||||
|
||||
void kt_fan_ac_init(void);
|
||||
void kt_fan_level_change(kt_fan_type fan);
|
||||
|
||||
|
||||
#endif
|
||||
597
apps/kaotings/kt_led7.c
Normal file
597
apps/kaotings/kt_led7.c
Normal file
@ -0,0 +1,597 @@
|
||||
/*
|
||||
* kt_led7.c — 硬件扫描与段码
|
||||
*
|
||||
* 与 kt_led7.h 中 L7~L14 的对应关系:
|
||||
* L7 → 本文件 kt_led7_scan() 六相状态机(case 0~5)
|
||||
* L8 → LED_NUMBER / LED_LARGE_LETTER / LED_SMALL_LETTER
|
||||
* L9~L12 → 由 kt_led7_show_* 填充缓冲后体现(当前为 stub,需与 kt_fan_ac 档位同步)
|
||||
* L13 → show_time / urgent / 闪烁(待与 disp_buf、策略层补全)
|
||||
* L14 → USB/电量/灯光等由上层调用 show 接口让路或关显
|
||||
*
|
||||
* 说明:逻辑段与 PCB 段的映射见 case 内注释;USB 充电时仅个位( b[2] )慢闪,100% 常亮不闪。
|
||||
*/
|
||||
#include "kt_led7.h"
|
||||
#include "system/includes.h"
|
||||
#include "system/timer.h"
|
||||
#include "app_power_manage.h"
|
||||
#include "app_main.h"
|
||||
#include "kt_battery.h"
|
||||
|
||||
struct ui_led7_env
|
||||
{
|
||||
u8 init;
|
||||
u8 cnt;
|
||||
struct
|
||||
{
|
||||
u8 seg[3];
|
||||
u8 dp1;
|
||||
u8 dp2;
|
||||
} disp_buf;
|
||||
};
|
||||
|
||||
static struct ui_led7_env _led7_env = {0};
|
||||
#define __this (&_led7_env)
|
||||
|
||||
/* 扫描里用 b[] 表示三位逻辑段码;充电个位慢闪时置位,仅灭个位( b[2] )不整屏关 */
|
||||
static u8 blink_blank;
|
||||
/* 与 kt_led7_apply_battery_percent 同步,供扫描/闪烁策略判断(如 100% 常亮) */
|
||||
static u8 led7_bat_p_cached;
|
||||
#define b (__this->disp_buf.seg)
|
||||
|
||||
#define KT_LED7_BAT_HOLD_SEC_DEFAULT 60u
|
||||
|
||||
typedef enum
|
||||
{
|
||||
KT_LED7_MODE_OFF = 0,
|
||||
KT_LED7_MODE_BATTERY,
|
||||
KT_LED7_MODE_TEMP,
|
||||
} kt_led7_mode_t;
|
||||
|
||||
static kt_led7_mode_t led7_ui_mode;
|
||||
static u32 led7_bat_sec_remain;
|
||||
static u32 led7_temp_sec_remain;
|
||||
static u16 led7_ui_1s_timer_id;
|
||||
static u8 led7_ui_1s_timer_armed;
|
||||
|
||||
/* USB 充电:50Hz≈10ms 半周期翻转;插入前快照以便拔出恢复 */
|
||||
static u8 led7_usb_charge;
|
||||
static u16 led7_usb_blink_timer;
|
||||
static struct
|
||||
{
|
||||
u8 seg[3];
|
||||
u8 dp1;
|
||||
u8 dp2;
|
||||
} led7_usb_snap_disp;
|
||||
static kt_led7_mode_t led7_usb_snap_mode;
|
||||
static u32 led7_usb_snap_bat_sec;
|
||||
static u32 led7_usb_snap_temp_sec;
|
||||
|
||||
/* 充电电量闪烁:约 1Hz(500ms 亮 / 500ms 灭),肉眼可辨 */
|
||||
#define KT_LED7_USB_BLINK_MS 500u
|
||||
|
||||
static void kt_led7_usb_blink_cb(void *priv);
|
||||
static void kt_led7_apply_blank(void);
|
||||
static void kt_led7_apply_battery_percent(void);
|
||||
static void kt_led7_ui_1s_tick(void *priv);
|
||||
static u8 kt_led7_seg_from_char(u8 c);
|
||||
|
||||
const struct led7_pin6 led7_pin = {
|
||||
.pin = {IO_PORTC_00, IO_PORTC_01, IO_PORTC_02, IO_PORTC_03, IO_PORTC_04, IO_PORTC_05}};
|
||||
|
||||
/* 字模与 cpu/br23/ui_driver/LED_1888/LED1888.c 一致;scan 里用 LED_A..G 选段 */
|
||||
static const u8 LED_NUMBER[10] = {
|
||||
(u8)(LED_A | LED_B | LED_C | LED_D | LED_E | LED_F), /* '0' */
|
||||
(u8)(LED_B | LED_C), /* '1' */
|
||||
(u8)(LED_A | LED_B | LED_D | LED_E | LED_G), /* '2' */
|
||||
(u8)(LED_A | LED_B | LED_C | LED_D | LED_G), /* '3' */
|
||||
(u8)(LED_B | LED_C | LED_F | LED_G), /* '4' */
|
||||
(u8)(LED_A | LED_C | LED_D | LED_F | LED_G), /* '5' */
|
||||
(u8)(LED_A | LED_C | LED_D | LED_E | LED_F | LED_G), /* '6' */
|
||||
(u8)(LED_A | LED_B | LED_C), /* '7' */
|
||||
(u8)(LED_A | LED_B | LED_C | LED_D | LED_E | LED_F | LED_G), /* '8' */
|
||||
(u8)(LED_A | LED_B | LED_C | LED_D | LED_F | LED_G), /* '9' */
|
||||
};
|
||||
|
||||
static const u8 LED_LARGE_LETTER[26] = {
|
||||
0x77, 0x40, 0x39, 0x3f, 0x79, ///< ABCDE
|
||||
0x71, 0x40, 0x76, 0x06, 0x40, ///< FGHIJ
|
||||
0x40, 0x38, 0x40, 0x37, 0x3f, ///< KLMNO
|
||||
0x73, 0x40, 0x50, 0x6d, 0x78, ///< PQRST
|
||||
0x3e, 0x3e, 0x40, 0x76, 0x40, ///< UVWXY
|
||||
0x40 ///< Z
|
||||
};
|
||||
|
||||
static const u8 LED_SMALL_LETTER[26] = {
|
||||
0x77, 0x7c, 0x58, 0x5e, 0x79, ///< abcde
|
||||
0x71, 0x40, 0x40, 0x40, 0x40, ///< fghij
|
||||
0x40, 0x38, 0x40, 0x54, 0x5c, ///< klmno
|
||||
0x73, 0x67, 0x50, 0x40, 0x78, ///< pqrst
|
||||
0x3e, 0x3e, 0x40, 0x40, 0x40, ///< uvwxy
|
||||
0x40 ///< z
|
||||
};
|
||||
|
||||
#define PIN1_H gpio_direction_output(led7_pin.pin[0], 1)
|
||||
#define PIN1_L gpio_direction_output(led7_pin.pin[0], 0)
|
||||
#define PIN2_H gpio_direction_output(led7_pin.pin[1], 1)
|
||||
#define PIN2_L gpio_direction_output(led7_pin.pin[1], 0)
|
||||
#define PIN3_H gpio_direction_output(led7_pin.pin[2], 1)
|
||||
#define PIN3_L gpio_direction_output(led7_pin.pin[2], 0)
|
||||
#define PIN4_H gpio_direction_output(led7_pin.pin[3], 1)
|
||||
#define PIN4_L gpio_direction_output(led7_pin.pin[3], 0)
|
||||
#define PIN5_H gpio_direction_output(led7_pin.pin[4], 1)
|
||||
#define PIN5_L gpio_direction_output(led7_pin.pin[4], 0)
|
||||
#define PIN6_H gpio_direction_output(led7_pin.pin[5], 1)
|
||||
#define PIN6_L gpio_direction_output(led7_pin.pin[5], 0)
|
||||
|
||||
/* 与 LED1888_init() 相同:全部脚置为输入高阻,换相前消隐,避免输出全高仍串亮(全显) */
|
||||
static void kt_led7_led_gpio_input_all(void)
|
||||
{
|
||||
u8 i;
|
||||
for (i = 0; i < 6; i++)
|
||||
{
|
||||
u8 port = led7_pin.pin[i];
|
||||
if (port != 255)
|
||||
{
|
||||
gpio_set_pull_down(port, 0);
|
||||
gpio_set_pull_up(port, 0);
|
||||
gpio_set_direction(port, 1); /* 1=输入 */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void hw_init(void)
|
||||
{
|
||||
kt_led7_led_gpio_input_all();
|
||||
}
|
||||
|
||||
void kt_led7_scan(void *param)
|
||||
{
|
||||
/* LED1888_6p_scan 在 switch 前调用 LED1888_init(),此处等同 */
|
||||
kt_led7_led_gpio_input_all();
|
||||
|
||||
u8 b2_sav = 0;
|
||||
u8 b2_muted = 0;
|
||||
if (led7_usb_charge && led7_bat_p_cached < 100u && blink_blank)
|
||||
{
|
||||
b2_sav = b[2];
|
||||
b[2] = 0;
|
||||
b2_muted = 1;
|
||||
}
|
||||
|
||||
switch (__this->cnt)
|
||||
{
|
||||
case 0:
|
||||
PIN1_H;
|
||||
if (b[2] & LED_A)
|
||||
{
|
||||
PIN6_L;
|
||||
}
|
||||
if (b[2] & LED_G)
|
||||
{
|
||||
PIN5_L;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
PIN2_H;
|
||||
if (b[0] & LED_A)
|
||||
{
|
||||
PIN3_L;
|
||||
}
|
||||
if (b[0] & LED_B)
|
||||
{
|
||||
PIN4_L;
|
||||
}
|
||||
if (b[0] & LED_D)
|
||||
{
|
||||
PIN6_L;
|
||||
}
|
||||
if (b[0] & LED_E)
|
||||
{
|
||||
PIN5_L;
|
||||
}
|
||||
if (b[0] & LED_H) // DP
|
||||
{
|
||||
PIN1_L;
|
||||
}
|
||||
|
||||
break;
|
||||
case 2:
|
||||
PIN3_H;
|
||||
if (b[0] & LED_F)
|
||||
{
|
||||
PIN2_L;
|
||||
}
|
||||
if (b[1] & LED_B)
|
||||
{
|
||||
PIN5_L;
|
||||
}
|
||||
if (b[1] & LED_D)
|
||||
{
|
||||
PIN4_L;
|
||||
}
|
||||
if (b[2] & LED_B)
|
||||
{
|
||||
PIN6_L;
|
||||
}
|
||||
if (b[1] & LED_H) // DP
|
||||
{
|
||||
PIN1_L;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
PIN4_H;
|
||||
if (b[0] & LED_G)
|
||||
{
|
||||
PIN2_L;
|
||||
}
|
||||
if (b[1] & LED_C)
|
||||
{
|
||||
PIN5_L;
|
||||
}
|
||||
if (b[1] & LED_F)
|
||||
{
|
||||
PIN3_L;
|
||||
}
|
||||
if (b[2] & LED_E)
|
||||
{
|
||||
PIN6_L;
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
PIN5_H;
|
||||
if (b[0] & LED_C)
|
||||
{
|
||||
PIN2_L;
|
||||
}
|
||||
if (b[1] & LED_A)
|
||||
{
|
||||
PIN4_L;
|
||||
}
|
||||
if (b[2] & LED_C)
|
||||
{
|
||||
PIN6_L;
|
||||
}
|
||||
/* 十位 b[1] 的 G(如 '-')与 B1 实测 G:5H3L 同相。
|
||||
* b[2] 的 G 已在 case0(b[2]&G→PIN5) 体现;此处再 (b[1]|b[2]) 会误点中位旁路,AC+个位2 时中位 C 像 E,故 case4 只取 b[1] 的 G。 */
|
||||
if (b[1] & LED_G)
|
||||
{
|
||||
PIN3_L;
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
PIN6_H;
|
||||
if (b[1] & LED_E)
|
||||
{
|
||||
PIN3_L;
|
||||
}
|
||||
if (b[2] & LED_D)
|
||||
{
|
||||
PIN4_L;
|
||||
}
|
||||
if (b[2] & LED_F)
|
||||
{
|
||||
PIN5_L;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (b2_muted)
|
||||
{
|
||||
b[2] = b2_sav;
|
||||
}
|
||||
__this->cnt++;
|
||||
if (__this->cnt == 6)
|
||||
{
|
||||
__this->cnt = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* 把百/十/个三位段码填入 b[],规则:高位前导 0 不显示。
|
||||
* d0=0 → 百位灭
|
||||
* d0=0 && d1=0 → 百位 + 十位都灭(只显示个位)
|
||||
* 个位无论是否 0 都显示 */
|
||||
static void kt_led7_fill_three_digits(u8 d0, u8 d1, u8 d2)
|
||||
{
|
||||
if (d0 == 0) {
|
||||
b[0] = 0;
|
||||
b[1] = (d1 == 0) ? 0 : LED_NUMBER[d1 % 10];
|
||||
} else {
|
||||
b[0] = LED_NUMBER[d0 % 10];
|
||||
b[1] = LED_NUMBER[d1 % 10];
|
||||
}
|
||||
b[2] = LED_NUMBER[d2 % 10];
|
||||
}
|
||||
|
||||
static void kt_led7_set_digits(u8 d0, u8 d1, u8 d2, u8 dp1, u8 dp2)
|
||||
{
|
||||
kt_led7_fill_three_digits(d0, d1, d2);
|
||||
__this->disp_buf.dp1 = dp1;
|
||||
__this->disp_buf.dp2 = dp2;
|
||||
blink_blank = 0;
|
||||
}
|
||||
|
||||
static void kt_led7_apply_blank(void)
|
||||
{
|
||||
b[0] = 0;
|
||||
b[1] = 0;
|
||||
b[2] = 0;
|
||||
__this->disp_buf.dp1 = 0;
|
||||
__this->disp_buf.dp2 = 0;
|
||||
blink_blank = 0;
|
||||
}
|
||||
|
||||
static void kt_led7_apply_battery_percent(void)
|
||||
{
|
||||
/* SDK 自带 get_vbat_percent() 在本项目实测不准,改用 kt_battery 模块
|
||||
* (PA12 + 100K/100K 分压采集 + 滑窗平均 + 滞回) */
|
||||
u8 p = kt_get_vbat_percent();
|
||||
//printf("kt_led7_apply_battery_percent: %d (mv=%d)\n", p, kt_get_vbat_mv());
|
||||
if (p > 100)
|
||||
{
|
||||
p = 100;
|
||||
}
|
||||
led7_bat_p_cached = p;
|
||||
/* 直接写段码,不调用 kt_led7_set_digits():后者会把 blink_blank 强制清 0,
|
||||
* 而充电闪烁的 blink_blank 由 kt_led7_usb_blink_cb 独占翻转,绝不能在这里被清掉,
|
||||
* 否则每次 cb 退出后 blink_blank 恒为 1,b[2] 在扫描里永远被静默(个位一直熄灭、不闪) */
|
||||
kt_led7_fill_three_digits((u8)(p / 100), (u8)((p / 10) % 10), (u8)(p % 10));
|
||||
__this->disp_buf.dp1 = 0;
|
||||
__this->disp_buf.dp2 = 0;
|
||||
}
|
||||
|
||||
static u8 kt_led7_seg_from_char(u8 c)
|
||||
{
|
||||
if (c == '-')
|
||||
{
|
||||
return LED_G;
|
||||
}
|
||||
if (c >= '0' && c <= '9')
|
||||
{
|
||||
return LED_NUMBER[c - '0'];
|
||||
}
|
||||
if (c >= 'A' && c <= 'Z')
|
||||
{
|
||||
return LED_LARGE_LETTER[c - 'A'];
|
||||
}
|
||||
if (c >= 'a' && c <= 'z')
|
||||
{
|
||||
return LED_SMALL_LETTER[c - 'a'];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void kt_led7_usb_blink_cb(void *priv)
|
||||
{
|
||||
(void)priv;
|
||||
if (!led7_usb_charge)
|
||||
{
|
||||
return;
|
||||
}
|
||||
kt_led7_apply_battery_percent();
|
||||
if (led7_bat_p_cached >= 100u)
|
||||
{
|
||||
blink_blank = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
blink_blank ^= 1;
|
||||
}
|
||||
}
|
||||
|
||||
static void kt_led7_ui_1s_tick(void *priv)
|
||||
{
|
||||
(void)priv;
|
||||
if (led7_usb_charge)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (led7_ui_mode == KT_LED7_MODE_TEMP)
|
||||
{
|
||||
if (led7_temp_sec_remain > 0)
|
||||
{
|
||||
led7_temp_sec_remain--;
|
||||
}
|
||||
if (led7_temp_sec_remain == 0)
|
||||
{
|
||||
led7_ui_mode = KT_LED7_MODE_BATTERY;
|
||||
led7_bat_sec_remain = KT_LED7_BAT_HOLD_SEC_DEFAULT;
|
||||
kt_led7_apply_battery_percent();
|
||||
}
|
||||
}
|
||||
else if (led7_ui_mode == KT_LED7_MODE_BATTERY)
|
||||
{
|
||||
if (led7_bat_sec_remain > 0)
|
||||
{
|
||||
led7_bat_sec_remain--;
|
||||
kt_led7_apply_battery_percent();
|
||||
}
|
||||
if (led7_bat_sec_remain == 0)
|
||||
{
|
||||
led7_ui_mode = KT_LED7_MODE_OFF;
|
||||
kt_led7_apply_blank();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void kt_led7_battery_show_restart(void)
|
||||
{
|
||||
led7_ui_mode = KT_LED7_MODE_BATTERY;
|
||||
led7_bat_sec_remain = KT_LED7_BAT_HOLD_SEC_DEFAULT;
|
||||
kt_led7_apply_battery_percent();
|
||||
}
|
||||
|
||||
void kt_led7_temp_show_number(u16 number, u32 sec)
|
||||
{
|
||||
u32 s = sec ? sec : 1;
|
||||
u16 n = number % 1000;
|
||||
kt_led7_set_digits((u8)(n / 100), (u8)((n / 10) % 10), (u8)(n % 10), 0, 0);
|
||||
led7_ui_mode = KT_LED7_MODE_TEMP;
|
||||
led7_temp_sec_remain = s;
|
||||
}
|
||||
|
||||
void kt_led7_temp_show_string(const u8 *str, u32 sec)
|
||||
{
|
||||
u32 s = sec ? sec : 1;
|
||||
u8 c0 = ' ', c1 = ' ', c2 = ' ';
|
||||
if (str)
|
||||
{
|
||||
if (str[0])
|
||||
{
|
||||
c0 = str[0];
|
||||
}
|
||||
if (str[1])
|
||||
{
|
||||
c1 = str[1];
|
||||
}
|
||||
if (str[2])
|
||||
{
|
||||
c2 = str[2];
|
||||
}
|
||||
}
|
||||
b[0] = kt_led7_seg_from_char(c0);
|
||||
b[1] = kt_led7_seg_from_char(c1);
|
||||
b[2] = kt_led7_seg_from_char(c2);
|
||||
__this->disp_buf.dp1 = 0;
|
||||
__this->disp_buf.dp2 = 0;
|
||||
blink_blank = 0;
|
||||
led7_ui_mode = KT_LED7_MODE_TEMP;
|
||||
led7_temp_sec_remain = s;
|
||||
}
|
||||
|
||||
void kt_led7_show_number(u32 show_time, u8 urgent, u16 number, u8 dp1, u8 dp2)
|
||||
{
|
||||
(void)urgent;
|
||||
u32 sec = show_time ? show_time : 1;
|
||||
u16 n = number % 1000;
|
||||
kt_led7_set_digits((u8)(n / 100), (u8)((n / 10) % 10), (u8)(n % 10), dp1, dp2);
|
||||
led7_ui_mode = KT_LED7_MODE_TEMP;
|
||||
led7_temp_sec_remain = sec;
|
||||
}
|
||||
|
||||
void kt_led7_show_string(u32 show_time, u8 urgent, const u8 *str, u8 dp1, u8 dp2)
|
||||
{
|
||||
(void)urgent;
|
||||
u32 sec = show_time ? show_time : 1;
|
||||
u8 c0 = ' ', c1 = ' ', c2 = ' ';
|
||||
if (str)
|
||||
{
|
||||
if (str[0])
|
||||
{
|
||||
c0 = str[0];
|
||||
}
|
||||
if (str[1])
|
||||
{
|
||||
c1 = str[1];
|
||||
}
|
||||
if (str[2])
|
||||
{
|
||||
c2 = str[2];
|
||||
}
|
||||
}
|
||||
b[0] = kt_led7_seg_from_char(c0);
|
||||
b[1] = kt_led7_seg_from_char(c1);
|
||||
b[2] = kt_led7_seg_from_char(c2);
|
||||
__this->disp_buf.dp1 = dp1;
|
||||
__this->disp_buf.dp2 = dp2;
|
||||
blink_blank = 0;
|
||||
led7_ui_mode = KT_LED7_MODE_TEMP;
|
||||
led7_temp_sec_remain = sec;
|
||||
}
|
||||
|
||||
void kt_led7_show_u_volume(u8 vol_level, u32 show_time)
|
||||
{
|
||||
u8 buf[4];
|
||||
u8 v = vol_level > 99 ? 99 : vol_level;
|
||||
buf[2] = 'U';
|
||||
buf[1] = (u8)('0' + (v / 10));
|
||||
buf[0] = (u8)('0' + (v % 10));
|
||||
buf[3] = 0;
|
||||
kt_led7_show_string(show_time ? show_time : 1, 0, buf, 0, 0);
|
||||
}
|
||||
|
||||
/* 振铃期可能较长;接通/挂断会调用 idle,与 1s 计时无强耦合 */
|
||||
#define KT_LED7_BT_CALL_CAL_SEC 3600u
|
||||
|
||||
void kt_led7_bt_call_incoming(void)
|
||||
{
|
||||
kt_led7_temp_show_string((const u8 *)"CAL", KT_LED7_BT_CALL_CAL_SEC);
|
||||
}
|
||||
|
||||
void kt_led7_bt_call_idle(void)
|
||||
{
|
||||
kt_led7_battery_show_restart();
|
||||
}
|
||||
|
||||
void kt_led7_usb_charge_set(u8 inserted)
|
||||
{
|
||||
if (inserted)
|
||||
{
|
||||
if (led7_usb_charge)
|
||||
{
|
||||
return;
|
||||
}
|
||||
led7_usb_snap_disp.seg[0] = __this->disp_buf.seg[0];
|
||||
led7_usb_snap_disp.seg[1] = __this->disp_buf.seg[1];
|
||||
led7_usb_snap_disp.seg[2] = __this->disp_buf.seg[2];
|
||||
led7_usb_snap_disp.dp1 = __this->disp_buf.dp1;
|
||||
led7_usb_snap_disp.dp2 = __this->disp_buf.dp2;
|
||||
led7_usb_snap_mode = led7_ui_mode;
|
||||
led7_usb_snap_bat_sec = led7_bat_sec_remain;
|
||||
led7_usb_snap_temp_sec = led7_temp_sec_remain;
|
||||
|
||||
led7_ui_mode = KT_LED7_MODE_BATTERY;
|
||||
kt_led7_apply_battery_percent();
|
||||
blink_blank = 0;
|
||||
led7_usb_charge = 1;
|
||||
if (!led7_usb_blink_timer)
|
||||
{
|
||||
led7_usb_blink_timer = sys_timer_add(NULL, kt_led7_usb_blink_cb, KT_LED7_USB_BLINK_MS);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!led7_usb_charge)
|
||||
{
|
||||
return;
|
||||
}
|
||||
led7_usb_charge = 0;
|
||||
blink_blank = 0;
|
||||
if (led7_usb_blink_timer)
|
||||
{
|
||||
sys_timer_del(led7_usb_blink_timer);
|
||||
led7_usb_blink_timer = 0;
|
||||
}
|
||||
__this->disp_buf.seg[0] = led7_usb_snap_disp.seg[0];
|
||||
__this->disp_buf.seg[1] = led7_usb_snap_disp.seg[1];
|
||||
__this->disp_buf.seg[2] = led7_usb_snap_disp.seg[2];
|
||||
__this->disp_buf.dp1 = led7_usb_snap_disp.dp1;
|
||||
__this->disp_buf.dp2 = led7_usb_snap_disp.dp2;
|
||||
led7_ui_mode = led7_usb_snap_mode;
|
||||
led7_bat_sec_remain = led7_usb_snap_bat_sec;
|
||||
led7_temp_sec_remain = led7_usb_snap_temp_sec;
|
||||
}
|
||||
}
|
||||
|
||||
void kt_led7_init(void)
|
||||
{
|
||||
printf("kt_led7_init\n");
|
||||
hw_init();
|
||||
__this->cnt = 0;
|
||||
__this->init = 1;
|
||||
if (!led7_ui_1s_timer_armed)
|
||||
{
|
||||
led7_ui_1s_timer_id = sys_timer_add(NULL, kt_led7_ui_1s_tick, 1000);
|
||||
if (led7_ui_1s_timer_id)
|
||||
{
|
||||
led7_ui_1s_timer_armed = 1;
|
||||
}
|
||||
}
|
||||
/* 正常开机保留欢迎字 HI;插电唤醒场景直接显示电量 */
|
||||
if (app_var.poweron_charge) {
|
||||
kt_led7_battery_show_restart();
|
||||
} else {
|
||||
kt_led7_temp_show_string((const u8 *)"HI", 5);
|
||||
}
|
||||
sys_s_hi_timer_add(NULL, kt_led7_scan, 2); /* 2ms */
|
||||
}
|
||||
114
apps/kaotings/kt_led7.h
Normal file
114
apps/kaotings/kt_led7.h
Normal file
@ -0,0 +1,114 @@
|
||||
#ifndef __KT_LED7_H__
|
||||
#define __KT_LED7_H__
|
||||
|
||||
#include "system/includes.h"
|
||||
#include "kt.h"
|
||||
|
||||
/*
|
||||
* =============================================================================
|
||||
* kt_led7 架构说明(与产品功能条目 L7~L14 对应)
|
||||
* =============================================================================
|
||||
*
|
||||
* 硬件层
|
||||
* - 3 位共阴/动态扫描 + 2 个小数点,6 根位选/公共线 + 段线,由 6 个 GPIO 分时拉低选通
|
||||
* - 段逻辑与 PCB 走线存在交叉,逻辑段 A~G/DP 经映射后写入显示缓冲(见 kt_led7.c 注释)
|
||||
*
|
||||
* 时基层
|
||||
* - 扫描回调 kt_led7_scan 由 usr_timer(sys_s_hi_timer_add,约 2ms)触发,6 相轮转完成一轮刷新
|
||||
*
|
||||
* 数据层
|
||||
* - 显示缓冲:每位 1 字节段码 + dp1/dp2;业务侧只写“逻辑段码”,扫描里做线序映射
|
||||
*
|
||||
* 策略层(kt_led7_show_* 入参)
|
||||
* - show_time:显示保持时间;urgent:高优先级插入;闪烁/抢占规则见下表 L13
|
||||
*
|
||||
* -----------------------------------------------------------------------------
|
||||
* 功能条目 L7~L14(与 kt.h 中风扇/空调/灯光/电量等业务一致)
|
||||
* -----------------------------------------------------------------------------
|
||||
* L7 动态扫描显示:分时选通,避免常亮串扰(扫描状态机在 kt_led7_scan)
|
||||
* L8 字符集:数字 0~9 + 字母(用于前缀 L / F / C 及 AC 等缩写)
|
||||
* L9 前风扇状态可视化:与「L-0~L-6」一致,对应 kt_fan_ac 前风扇档位 fan_level_0~6
|
||||
* L10 后风扇状态可视化:与「F-0~F-6」一致,对应后风扇档位
|
||||
* L11 左右风扇状态可视化:与「C-0~C-6」一致,对应左右风扇档位
|
||||
* L12 空调状态可视化:与「AC0 / AC1 / AC2」一致,对应断续/连续/关闭
|
||||
* L13 显示策略:紧急插入(urgent)、可编程显示时长(show_time)、闪烁(dp/全闪)、
|
||||
* 高优先级打断后低优先级计时暂停不清零(见本文件历史注释)
|
||||
* L14 联动:USB 插拔电量提示、LED 灯光模式等仅语音/灯控时数码管可关闭或让路给 L13 高优先级条
|
||||
*
|
||||
* 调用关系(建议)
|
||||
* - 档位变更:kt_fan_level_change() → 业务调用 kt_led7_show_string / kt_led7_show_number 更新缓冲
|
||||
* - 初始化:kt_boot_init / kt_init 路径中调用 kt_led7_init() 注册扫描定时器
|
||||
* =============================================================================
|
||||
*/
|
||||
|
||||
/**
|
||||
* 脚位:脚 N = led7_pin[N-1],对应 IO_PORTC_0(N-1)(脚1=PC0 … 脚6=PC5)。
|
||||
* 「XHYL」= 该扫描相内脚 X 高、脚 Y 低(与 kt_led7_scan 中 PINx_L/H 一致)。
|
||||
*
|
||||
* 下表为实测;「物理段A~G」与缓冲区里的 LED_A~G **不是**一一同名,同一物理段可能落在
|
||||
* b[0..2]&LED_x 的不同 x 上。B2 全段与代码分支对应已核对并写在 kt_led7.c kt_led7_scan();
|
||||
* B0/B1 各段与每个 if(b[0|1|2]&LED_*) 的逐项注释也在该函数内(与上表同一编号)。
|
||||
*
|
||||
* B2(b[2])实测:〔B0/B1/B2 仅为三缓冲/扫描位,与百十人读序的对应以代码与板级实测为准〕
|
||||
* A:2H3L B:2H4L C:5H2L D:2H6L E:2H5L F:3H2L G:4H2L DP:2H1L
|
||||
* B1(b[1])实测:
|
||||
* A:5H4L B:3H5L C:4H5L D:3H4L E:6H3L F:4H3L G:5H3L DP:3H1L
|
||||
* B0(b[0])实测:
|
||||
* A:1H6L B:3H6L C:5H6L D:6H4L E:4H6L F:6H5L G:1H5L DP:NONE
|
||||
*/
|
||||
|
||||
/**
|
||||
* 动态数码管扫描模块(实现见上 L7~L14)
|
||||
* 用于显示数字和字符
|
||||
* 支持紧急插入显示(高优先级显示)
|
||||
* 支持闪烁显示
|
||||
* 支持各种显示时间设置
|
||||
* 高优先级显示打断低优先级显示后,低优先级时间不清零,继续计数
|
||||
*/
|
||||
|
||||
#define LED_A BIT(0)
|
||||
#define LED_B BIT(1)
|
||||
#define LED_C BIT(2)
|
||||
#define LED_D BIT(3)
|
||||
#define LED_E BIT(4)
|
||||
#define LED_F BIT(5)
|
||||
#define LED_G BIT(6)
|
||||
#define LED_H BIT(7)
|
||||
|
||||
struct led7_pin6 {
|
||||
u8 pin[6];
|
||||
};
|
||||
|
||||
void kt_led7_init(void);
|
||||
|
||||
/** 正常电量显示:从当前时刻起再显示 60s(与临时显示结束后的行为一致) */
|
||||
void kt_led7_battery_show_restart(void);
|
||||
|
||||
/**
|
||||
* 临时显示(高优先级):打断当前电量或上一次临时显示;sec 为持续秒数,0 按 1 秒处理。
|
||||
*/
|
||||
void kt_led7_temp_show_number(u16 number, u32 sec);
|
||||
void kt_led7_temp_show_string(const u8 *str, u32 sec);
|
||||
|
||||
/**
|
||||
* 临时显示:show_time 为持续秒数;urgent 预留(当前与 temp 等同,均抢占)。
|
||||
*/
|
||||
void kt_led7_show_number(u32 show_time, u8 urgent, u16 number, u8 dp1, u8 dp2);
|
||||
void kt_led7_show_string(u32 show_time, u8 urgent, const u8 *str, u8 dp1, u8 dp2);
|
||||
|
||||
/** 音量提示:三位数码管显示 U + 两位数字(如 U15),表示「U-音量」,持续 show_time 秒 */
|
||||
void kt_led7_show_u_volume(u8 vol_level, u32 show_time);
|
||||
|
||||
/**
|
||||
* USB 适配器插入/拔出(由 VBUS 检测调用)。
|
||||
* inserted=1:唤醒数码管,电量个位慢闪(约 1Hz),100% 时常亮不闪;inserted=0:恢复插入前的显示与计时逻辑。
|
||||
*/
|
||||
void kt_led7_usb_charge_set(u8 inserted);
|
||||
|
||||
/**
|
||||
* 蓝牙 HFP 来电响铃:数码管显示 CAL;接通/挂断/去电时调用 kt_led7_bt_call_idle 恢复常用显示。
|
||||
*/
|
||||
void kt_led7_bt_call_incoming(void);
|
||||
void kt_led7_bt_call_idle(void);
|
||||
|
||||
#endif
|
||||
72
apps/kaotings/kt_light_led.c
Normal file
72
apps/kaotings/kt_light_led.c
Normal file
@ -0,0 +1,72 @@
|
||||
#include "kt_light_led.h"
|
||||
#include "tone_player.h"
|
||||
|
||||
static u8 led_mode = 0;
|
||||
static u16 tid = 0;
|
||||
const char *light_led_level_tone[3] = {TONE_LT_L0, TONE_LT_L1, TONE_LT_L2};
|
||||
|
||||
void led_flash_callback(void *p)
|
||||
{
|
||||
static u8 flag = 0;
|
||||
flag = !flag;
|
||||
if (flag)
|
||||
{
|
||||
gpio_set_output_value(KT_CFG_LED_PIN, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
gpio_set_output_value(KT_CFG_LED_PIN, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void kt_light_led_level_change(void)
|
||||
{
|
||||
led_mode++;
|
||||
if (led_mode > 2) // 0-2
|
||||
{
|
||||
led_mode = 0;
|
||||
}
|
||||
|
||||
tone_play(light_led_level_tone[led_mode], 1);
|
||||
|
||||
switch (led_mode)
|
||||
{
|
||||
case 0:
|
||||
// 关灯
|
||||
if (tid)
|
||||
{
|
||||
sys_timer_del(tid);
|
||||
}
|
||||
tid = 0;
|
||||
gpio_set_output_value(KT_CFG_LED_PIN, 0);
|
||||
break;
|
||||
case 1:
|
||||
// 常亮
|
||||
if (tid)
|
||||
{
|
||||
sys_timer_del(tid);
|
||||
}
|
||||
tid = 0;
|
||||
gpio_set_output_value(KT_CFG_LED_PIN, 1);
|
||||
break;
|
||||
case 2:
|
||||
// 爆闪 2.5hz 50%占空比
|
||||
if (tid)
|
||||
{
|
||||
sys_timer_del(tid);
|
||||
}
|
||||
tid = sys_timer_add(NULL, led_flash_callback, 200);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void kt_light_led_init(void)
|
||||
{
|
||||
led_mode = 0;
|
||||
|
||||
// 初始化GPIO LED
|
||||
gpio_set_pull_down(KT_CFG_LED_PIN, 0);
|
||||
gpio_set_pull_up(KT_CFG_LED_PIN, 0);
|
||||
gpio_set_direction(KT_CFG_LED_PIN, 0);
|
||||
gpio_set_output_value(KT_CFG_LED_PIN, 0);
|
||||
}
|
||||
10
apps/kaotings/kt_light_led.h
Normal file
10
apps/kaotings/kt_light_led.h
Normal file
@ -0,0 +1,10 @@
|
||||
#ifndef __KT_LIGHT_LED_H__
|
||||
#define __KT_LIGHT_LED_H__
|
||||
|
||||
#include "system/includes.h"
|
||||
#include "kt.h"
|
||||
|
||||
void kt_light_led_init(void);
|
||||
void kt_light_led_level_change(void);
|
||||
|
||||
#endif
|
||||
@ -501,7 +501,7 @@ LED7_PLATFORM_DATA_BEGIN(led7_data)
|
||||
.pin_cfg.pin7.pin[3] = IO_PORTC_03,
|
||||
.pin_cfg.pin7.pin[4] = IO_PORTC_04,
|
||||
.pin_cfg.pin7.pin[5] = IO_PORTC_05,
|
||||
.pin_cfg.pin7.pin[6] = IO_PORTB_02,
|
||||
.pin_cfg.pin7.pin[6] = -1,
|
||||
#endif
|
||||
LED7_PLATFORM_DATA_END()
|
||||
|
||||
@ -798,7 +798,15 @@ struct port_wakeup port0 = {
|
||||
.pullup_down_enable = ENABLE, //配置I/O 内部上下拉是否使能
|
||||
.edge = FALLING_EDGE, //唤醒方式选择,可选:上升沿\下降沿
|
||||
.attribute = BLUETOOTH_RESUME, //保留参数
|
||||
.iomap = IO_PORTA_10, //唤醒口选择
|
||||
.iomap = IO_PORTB_01, //唤醒口选择
|
||||
};
|
||||
|
||||
/* USB VBUS 插入唤醒 */
|
||||
struct port_wakeup port1 = {
|
||||
.pullup_down_enable = ENABLE, //配置I/O 内部上下拉是否使能
|
||||
.edge = LEADING_EDGE, //唤醒方式选择,可选:上升沿\下降沿
|
||||
.attribute = BLUETOOTH_RESUME, //保留参数
|
||||
.iomap = IO_PORTB_03, //唤醒口选择
|
||||
};
|
||||
|
||||
/* RTC PR0 PR1 唤醒 */
|
||||
@ -826,6 +834,7 @@ const struct charge_wakeup charge_wkup = {
|
||||
|
||||
const struct wakeup_param wk_param = {
|
||||
.port[1] = &port0,
|
||||
.port[2] = &port1,
|
||||
/* .rtc_port[0] = &rtc_port0, */
|
||||
/* .rtc_port[1] = &rtc_port1, */
|
||||
.sub = &sub_wkup,
|
||||
|
||||
@ -26,12 +26,12 @@
|
||||
// app 配置 //
|
||||
//*********************************************************************************//
|
||||
#define TCFG_APP_BT_EN 1
|
||||
#define TCFG_APP_MUSIC_EN 1
|
||||
#define TCFG_APP_LINEIN_EN 1
|
||||
#define TCFG_APP_FM_EN 1
|
||||
#define TCFG_APP_PC_EN 1
|
||||
#define TCFG_APP_RTC_EN 1
|
||||
#define TCFG_APP_RECORD_EN 1
|
||||
#define TCFG_APP_MUSIC_EN 0
|
||||
#define TCFG_APP_LINEIN_EN 0
|
||||
#define TCFG_APP_FM_EN 0
|
||||
#define TCFG_APP_PC_EN 0
|
||||
#define TCFG_APP_RTC_EN 0
|
||||
#define TCFG_APP_RECORD_EN 0
|
||||
#define TCFG_APP_SPDIF_EN 0
|
||||
//*********************************************************************************//
|
||||
// PCM_DEBUG调试配置 //
|
||||
@ -44,7 +44,7 @@
|
||||
//*********************************************************************************//
|
||||
#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_05 //串口发送脚配置
|
||||
#define TCFG_UART0_TX_PORT IO_PORT_DP //串口发送脚配置
|
||||
#define TCFG_UART0_BAUDRATE 1000000 //串口波特率配置
|
||||
|
||||
//*********************************************************************************//
|
||||
@ -65,7 +65,7 @@
|
||||
//*********************************************************************************//
|
||||
// 硬件SPI 配置 //
|
||||
//*********************************************************************************//
|
||||
#define TCFG_HW_SPI1_ENABLE ENABLE_THIS_MOUDLE
|
||||
#define TCFG_HW_SPI1_ENABLE DISABLE_THIS_MOUDLE
|
||||
//A组IO: DI: PB2 DO: PB1 CLK: PB0
|
||||
//B组IO: DI: PC3 DO: PC5 CLK: PC4
|
||||
#define TCFG_HW_SPI1_PORT 'A'
|
||||
@ -73,7 +73,7 @@
|
||||
#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
|
||||
#define TCFG_HW_SPI2_ENABLE DISABLE_THIS_MOUDLE
|
||||
//A组IO: DI: PB8 DO: PB10 CLK: PB9
|
||||
//B组IO: DI: PA13 DO: DM CLK: DP
|
||||
#define TCFG_HW_SPI2_PORT 'A'
|
||||
@ -118,7 +118,7 @@
|
||||
#define SD_CMD_DECT 0
|
||||
#define SD_CLK_DECT 1
|
||||
#define SD_IO_DECT 2
|
||||
#define TCFG_SD0_ENABLE ENABLE_THIS_MOUDLE
|
||||
#define TCFG_SD0_ENABLE DISABLE_THIS_MOUDLE
|
||||
//A组IO: CMD:PA9 CLK:PA10 DAT0:PA5 DAT1:PA6 DAT2:PA7 DAT3:PA8
|
||||
//B组IO: CMD:PB10 CLK:PB9 DAT0:PB8 DAT1:PB6 DAT2:PB5 DAT3:PB4
|
||||
#define TCFG_SD0_PORTS 'B'
|
||||
@ -142,7 +142,7 @@
|
||||
// USB 配置 //
|
||||
//*********************************************************************************//
|
||||
#define TCFG_PC_ENABLE TCFG_APP_PC_EN//PC模块使能
|
||||
#define TCFG_UDISK_ENABLE ENABLE_THIS_MOUDLE//U盘模块使能
|
||||
#define TCFG_UDISK_ENABLE DISABLE_THIS_MOUDLE//U盘模块使能
|
||||
#define TCFG_OTG_USB_DEV_EN BIT(0)//USB0 = BIT(0) USB1 = BIT(1)
|
||||
|
||||
#define TCFG_VIR_UDISK_ENABLE 0//ENABLE_THIS_MOUDLE
|
||||
@ -214,7 +214,6 @@
|
||||
#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_PORTB_01 //IO按键端口
|
||||
|
||||
#define TCFG_IOKEY_PREV_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO
|
||||
@ -228,8 +227,8 @@
|
||||
//*********************************************************************************//
|
||||
#define TCFG_ADKEY_ENABLE ENABLE_THIS_MOUDLE//是否使能AD按键
|
||||
#define TCFG_ADKEY_LED_IO_REUSE DISABLE_THIS_MOUDLE //ADKEY 和 LED IO复用,led只能设置蓝灯显示
|
||||
#define TCFG_ADKEY_PORT IO_PORTA_10 //AD按键端口(需要注意选择的IO口是否支持AD功能)
|
||||
#define TCFG_ADKEY_AD_CHANNEL AD_CH_PA10
|
||||
#define TCFG_ADKEY_PORT IO_PORTB_01 //AD按键端口(需要注意选择的IO口是否支持AD功能)
|
||||
#define TCFG_ADKEY_AD_CHANNEL AD_CH_PB1
|
||||
#define TCFG_ADKEY_EXTERN_UP_ENABLE ENABLE_THIS_MOUDLE //是否使用外部上拉
|
||||
|
||||
#if TCFG_ADKEY_EXTERN_UP_ENABLE
|
||||
@ -240,15 +239,15 @@
|
||||
|
||||
//必须从小到大填电阻,没有则同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_AD1 (0x3ffL * 150 / (150 + R_UP)) //3k
|
||||
#define TCFG_ADKEY_AD2 (0x3ffL * 240 / (240 + R_UP)) //6.2k
|
||||
#define TCFG_ADKEY_AD3 (0x3ffL * 510 / (510 + R_UP)) //9.1k
|
||||
#define TCFG_ADKEY_AD4 (0x3ffL * 1000 / (1000 + R_UP)) //15k
|
||||
#define TCFG_ADKEY_AD5 (0x3ffL) //24k
|
||||
#define TCFG_ADKEY_AD6 (0x3ffL) //33k
|
||||
#define TCFG_ADKEY_AD7 (0x3ffL) //51k
|
||||
#define TCFG_ADKEY_AD8 (0x3ffL) //100k
|
||||
#define TCFG_ADKEY_AD9 (0x3ffL) //220k
|
||||
#define TCFG_ADKEY_VDDIO (0x3ffL)
|
||||
|
||||
#define TCFG_ADKEY_VOLTAGE0 ((TCFG_ADKEY_AD0 + TCFG_ADKEY_AD1) / 2)
|
||||
@ -376,7 +375,7 @@ DAC硬件上的连接方式,可选的配置:
|
||||
DAC_OUTPUT_FRONT_LR_REAR_LR 四声道输出
|
||||
*/
|
||||
//#define TCFG_AUDIO_DAC_CONNECT_MODE DAC_OUTPUT_FRONT_LR_REAR_LR
|
||||
#define TCFG_AUDIO_DAC_CONNECT_MODE DAC_OUTPUT_LR
|
||||
#define TCFG_AUDIO_DAC_CONNECT_MODE DAC_OUTPUT_MONO_L
|
||||
// #define TCFG_AUDIO_DAC_CONNECT_MODE DAC_OUTPUT_MONO_LR_DIFF
|
||||
|
||||
/*通话降噪模式配置*/
|
||||
@ -395,7 +394,7 @@ DAC硬件上的连接方式,可选的配置:
|
||||
#define AUDIO_OUTPUT_WAY AUDIO_OUTPUT_WAY_DAC
|
||||
#define LINEIN_INPUT_WAY LINEIN_INPUT_WAY_ADC //LINEIN_INPUT_WAY_ANALOG
|
||||
|
||||
#define AUDIO_OUTPUT_AUTOMUTE 0//ENABLE
|
||||
#define AUDIO_OUTPUT_AUTOMUTE 1//ENABLE
|
||||
#define DAC_AUTO_HIGH_Z_EN DISABLE //处理直推串音问题, 隔直不要开
|
||||
|
||||
/*
|
||||
@ -470,9 +469,9 @@ DAC硬件上的连接方式,可选的配置:
|
||||
//*********************************************************************************//
|
||||
// UI 配置 //
|
||||
//*********************************************************************************//
|
||||
#define TCFG_UI_ENABLE ENABLE_THIS_MOUDLE //UI总开关
|
||||
#define CONFIG_UI_STYLE STYLE_JL_LED7
|
||||
#define TCFG_UI_LED7_ENABLE ENABLE_THIS_MOUDLE //UI使用LED7显示
|
||||
#define TCFG_UI_ENABLE DISABLE_THIS_MOUDLE //UI总开关
|
||||
//#define CONFIG_UI_STYLE STYLE_JL_LED7
|
||||
#define TCFG_UI_LED7_ENABLE DISABLE_THIS_MOUDLE //UI使用LED7显示
|
||||
// #define TCFG_UI_LCD_SEG3X9_ENABLE ENABLE_THIS_MOUDLE //UI使用LCD段码屏显示
|
||||
// #define TCFG_LCD_ST7735S_ENABLE ENABLE_THIS_MOUDLE
|
||||
// #define TCFG_LCD_ST7789VW_ENABLE ENABLE_THIS_MOUDLE
|
||||
@ -505,7 +504,7 @@ DAC硬件上的连接方式,可选的配置:
|
||||
//*********************************************************************************//
|
||||
// EQ配置 //
|
||||
//*********************************************************************************//
|
||||
#define TCFG_EQ_ENABLE 1 //支持EQ功能,EQ总使能
|
||||
#define TCFG_EQ_ENABLE 0 //支持EQ功能,EQ总使能
|
||||
#if TCFG_EQ_ENABLE
|
||||
#define TCFG_BT_MUSIC_EQ_ENABLE 1 //支持蓝牙音乐EQ
|
||||
#define TCFG_PHONE_EQ_ENABLE 1 //支持通话近端EQ
|
||||
@ -522,7 +521,7 @@ DAC硬件上的连接方式,可选的配置:
|
||||
#define TCFG_DYNAMIC_EQ_ENABLE 0 //动态eq使能,接在eq后,需输入32bit位宽数据
|
||||
#endif//TCFG_EQ_ENABLE
|
||||
|
||||
#define TCFG_DRC_ENABLE 1 //DRC 总使能
|
||||
#define TCFG_DRC_ENABLE 0 //DRC 总使能
|
||||
#define TCFG_AUDIO_MDRC_ENABLE 0 //多带drc使能 0:关闭多带drc, 1:使能多带drc 2:使能多带drc 并且 多带drc后再做一次全带的drc
|
||||
|
||||
#if TCFG_DRC_ENABLE
|
||||
@ -662,8 +661,8 @@ DAC硬件上的连接方式,可选的配置:
|
||||
//*********************************************************************************//
|
||||
#define TCFG_AUTO_SHUT_DOWN_TIME 0 //没有蓝牙连接自动关机时间
|
||||
#define TCFG_SYS_LVD_EN 1 //电量检测使能
|
||||
#define TCFG_POWER_ON_NEED_KEY 0 //是否需要按按键开机配置
|
||||
#define TWFG_APP_POWERON_IGNORE_DEV 4000//上电忽略挂载设备,0时不忽略,非0则n毫秒忽略
|
||||
#define TCFG_POWER_ON_NEED_KEY 1 //是否需要按按键开机配置
|
||||
#define TWFG_APP_POWERON_IGNORE_DEV 0//上电忽略挂载设备,0时不忽略,非0则n毫秒忽略
|
||||
|
||||
#define TCFG_AUDIO_DEC_OUT_TASK 0 // 解码使用单独任务做输出
|
||||
|
||||
@ -677,7 +676,7 @@ DAC硬件上的连接方式,可选的配置:
|
||||
#define TCFG_USER_EMITTER_ENABLE 0 //emitter功能使能
|
||||
#define TCFG_BT_SNIFF_ENABLE 0 //bt sniff 功能使能
|
||||
|
||||
#define USER_SUPPORT_PROFILE_SPP 1
|
||||
#define USER_SUPPORT_PROFILE_SPP 0
|
||||
#define USER_SUPPORT_PROFILE_HFP 1
|
||||
#define USER_SUPPORT_PROFILE_A2DP 1
|
||||
#define USER_SUPPORT_PROFILE_AVCTP 1
|
||||
@ -701,9 +700,9 @@ DAC硬件上的连接方式,可选的配置:
|
||||
#define BT_PHONE_NUMBER 1 //是否播放来电报号
|
||||
#define BT_SYNC_PHONE_RING 0 //是否TWS同步播放来电铃声
|
||||
#define BT_SUPPORT_DISPLAY_BAT 1 //是否使能电量检测
|
||||
#define BT_SUPPORT_MUSIC_VOL_SYNC 1 //是否使能音量同步
|
||||
#define BT_SUPPORT_MUSIC_VOL_SYNC 0 //是否使能音量同步
|
||||
|
||||
#define TCFG_BLUETOOTH_BACK_MODE 1 //后台模式
|
||||
#define TCFG_BLUETOOTH_BACK_MODE 0 //后台模式
|
||||
|
||||
#if (TCFG_USER_TWS_ENABLE && TCFG_BLUETOOTH_BACK_MODE) && (TCFG_BT_SNIFF_ENABLE==0) && defined(CONFIG_LOCAL_TWS_ENABLE)
|
||||
#define TCFG_DEC2TWS_ENABLE 1 // 本地解码转发
|
||||
@ -757,14 +756,14 @@ DAC硬件上的连接方式,可选的配置:
|
||||
//*********************************************************************************//
|
||||
#define TCFG_DEC_G729_ENABLE ENABLE
|
||||
#define TCFG_DEC_MP3_ENABLE ENABLE
|
||||
#define TCFG_DEC_WMA_ENABLE ENABLE
|
||||
#define TCFG_DEC_WAV_ENABLE ENABLE
|
||||
#define TCFG_DEC_FLAC_ENABLE ENABLE
|
||||
#define TCFG_DEC_APE_ENABLE ENABLE
|
||||
#define TCFG_DEC_M4A_ENABLE ENABLE
|
||||
#define TCFG_DEC_ALAC_ENABLE ENABLE
|
||||
#define TCFG_DEC_AMR_ENABLE ENABLE
|
||||
#define TCFG_DEC_DTS_ENABLE ENABLE
|
||||
#define TCFG_DEC_WMA_ENABLE 0
|
||||
#define TCFG_DEC_WAV_ENABLE 0
|
||||
#define TCFG_DEC_FLAC_ENABLE 0
|
||||
#define TCFG_DEC_APE_ENABLE 0
|
||||
#define TCFG_DEC_M4A_ENABLE 0
|
||||
#define TCFG_DEC_ALAC_ENABLE 0
|
||||
#define TCFG_DEC_AMR_ENABLE 0
|
||||
#define TCFG_DEC_DTS_ENABLE 0
|
||||
#define TCFG_DEC_G726_ENABLE DISABLE
|
||||
#define TCFG_DEC_MIDI_ENABLE DISABLE
|
||||
#define TCFG_DEC_MTY_ENABLE DISABLE
|
||||
@ -868,10 +867,10 @@ DAC硬件上的连接方式,可选的配置:
|
||||
//*********************************************************************************//
|
||||
#define TCFG_ENC_CVSD_ENABLE ENABLE
|
||||
#define TCFG_ENC_MSBC_ENABLE ENABLE
|
||||
#define TCFG_ENC_G726_ENABLE ENABLE
|
||||
#define TCFG_ENC_MP3_ENABLE ENABLE
|
||||
#define TCFG_ENC_ADPCM_ENABLE ENABLE
|
||||
#define TCFG_ENC_PCM_ENABLE ENABLE
|
||||
#define TCFG_ENC_G726_ENABLE 0
|
||||
#define TCFG_ENC_MP3_ENABLE 0
|
||||
#define TCFG_ENC_ADPCM_ENABLE 0
|
||||
#define TCFG_ENC_PCM_ENABLE 0
|
||||
#define TCFG_ENC_SBC_ENABLE ENABLE
|
||||
#define TCFG_ENC_OPUS_ENABLE DISABLE
|
||||
#define TCFG_ENC_SPEEX_ENABLE DISABLE
|
||||
|
||||
@ -12,22 +12,22 @@
|
||||
const u16 bt_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX] = {
|
||||
//单击 //长按 //hold //抬起 //双击 //三击
|
||||
[0] = {
|
||||
KEY_CHANGE_MODE, KEY_POWEROFF, KEY_POWEROFF_HOLD, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
KEY_MUSIC_PP, KEY_POWEROFF, KEY_POWEROFF_HOLD, KEY_NULL, KEY_CALL_LAST_NO, KEY_NULL
|
||||
},
|
||||
[1] = {
|
||||
KEY_MUSIC_PREV, KEY_VOL_DOWN, KEY_VOL_DOWN, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
KEY_KT_FRONT_FAN, KEY_VOL_UP, KEY_VOL_UP, KEY_NULL, KEY_MUSIC_PREV, KEY_NULL
|
||||
},
|
||||
[2] = {
|
||||
KEY_MUSIC_PP, KEY_CALL_HANG_UP, KEY_NULL, KEY_NULL, KEY_CALL_LAST_NO, KEY_NULL
|
||||
KEY_KT_REAR_FAN, KEY_VOL_DOWN, KEY_VOL_DOWN, KEY_NULL, KEY_MUSIC_NEXT, KEY_NULL
|
||||
},
|
||||
[3] = {
|
||||
KEY_MUSIC_NEXT, KEY_VOL_UP, KEY_VOL_UP, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
KEY_KT_LR_FAN, KEY_KT_AIR_COND, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
},
|
||||
[4] = {
|
||||
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_REVERB_OPEN, KEY_NULL
|
||||
KEY_KT_LED, KEY_KT_MASSAGE_MODE, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
},
|
||||
[5] = {
|
||||
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_ENC_START, KEY_NULL
|
||||
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
},
|
||||
[6] = {
|
||||
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
|
||||
@ -9,6 +9,7 @@
|
||||
#include "chgbox_ctrl.h"
|
||||
#include "update_loader_download.h"
|
||||
|
||||
#include "kt.h"
|
||||
|
||||
extern void setup_arch();
|
||||
extern int audio_dec_init();
|
||||
@ -41,27 +42,27 @@ static void do_module_initcall()
|
||||
|
||||
void __attribute__((weak)) board_init()
|
||||
{
|
||||
|
||||
}
|
||||
void __attribute__((weak)) board_early_init()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int eSystemConfirmStopStatus(void)
|
||||
{
|
||||
/* 系统进入在未来时间里,无任务超时唤醒,可根据用户选择系统停止,或者系统定时唤醒(100ms) */
|
||||
//1:Endless Sleep
|
||||
//0:100 ms wakeup
|
||||
if (get_charge_full_flag()) {
|
||||
// 1:Endless Sleep
|
||||
// 0:100 ms wakeup
|
||||
if (get_charge_full_flag())
|
||||
{
|
||||
log_i("Endless Sleep");
|
||||
power_set_soft_poweroff();
|
||||
return 1;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
log_i("100 ms wakeup");
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void check_power_on_key(void)
|
||||
@ -69,24 +70,38 @@ static void check_power_on_key(void)
|
||||
u32 delay_10ms_cnt = 0;
|
||||
u32 delay_10msp_cnt = 0;
|
||||
|
||||
while (1) {
|
||||
while (1)
|
||||
{
|
||||
clr_wdt();
|
||||
os_time_dly(2);
|
||||
|
||||
extern u8 get_power_on_status(void);
|
||||
if (get_power_on_status()) {
|
||||
if (get_power_on_status())
|
||||
{
|
||||
putchar('+');
|
||||
delay_10msp_cnt = 0;
|
||||
delay_10ms_cnt++;
|
||||
if (delay_10ms_cnt > 70) {
|
||||
if (delay_10ms_cnt > 70)
|
||||
{
|
||||
printf("power on key\n");
|
||||
app_var.poweron_charge = 0;
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
if (app_var.poweron_charge)
|
||||
{
|
||||
printf("this plug wakeup......,no need check power on key\n");
|
||||
return;
|
||||
}
|
||||
|
||||
putchar('-');
|
||||
delay_10ms_cnt = 0;
|
||||
|
||||
delay_10msp_cnt++;
|
||||
if (delay_10msp_cnt > 20) {
|
||||
if (delay_10msp_cnt > 20)
|
||||
{
|
||||
puts("enter softpoweroff\n");
|
||||
power_set_soft_poweroff();
|
||||
}
|
||||
@ -97,39 +112,55 @@ static void check_power_on_key(void)
|
||||
static void app_init()
|
||||
{
|
||||
int update;
|
||||
app_var.poweron_charge = 0;
|
||||
// if (gpio_read(IO_PORTB_03)) {
|
||||
// app_var.poweron_charge = 1;
|
||||
// }
|
||||
|
||||
do_early_initcall();
|
||||
do_platform_initcall();
|
||||
|
||||
board_init();
|
||||
kt_boot_init();
|
||||
|
||||
do_initcall();
|
||||
|
||||
do_module_initcall();
|
||||
do_late_initcall();
|
||||
|
||||
|
||||
audio_enc_init();
|
||||
audio_dec_init();
|
||||
|
||||
if (!UPDATE_SUPPORT_DEV_IS_NULL()) {
|
||||
if (gpio_read(IO_PORTB_03))
|
||||
{
|
||||
printf("USB VBUS insert\n");
|
||||
app_var.poweron_charge = 1;
|
||||
}
|
||||
|
||||
if (!UPDATE_SUPPORT_DEV_IS_NULL())
|
||||
{
|
||||
update = update_result_deal();
|
||||
}
|
||||
|
||||
app_var.play_poweron_tone = 1;
|
||||
|
||||
if (!get_charge_online_flag()) {
|
||||
if (!get_charge_online_flag())
|
||||
{
|
||||
check_power_on_voltage();
|
||||
|
||||
#if TCFG_POWER_ON_NEED_KEY
|
||||
/*充电拔出,CPU软件复位, 不检测按键,直接开机*/
|
||||
#if TCFG_CHARGE_OFF_POWERON_NE
|
||||
if ((!update && cpu_reset_by_soft()) || is_ldo5v_wakeup()) {
|
||||
if ((!update && cpu_reset_by_soft()) || is_ldo5v_wakeup())
|
||||
{
|
||||
#else
|
||||
if (!update && cpu_reset_by_soft()) {
|
||||
if (!update && cpu_reset_by_soft())
|
||||
{
|
||||
#endif
|
||||
app_var.play_poweron_tone = 0;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
check_power_on_key();
|
||||
}
|
||||
#endif
|
||||
@ -144,29 +175,20 @@ static void app_init()
|
||||
*2.power_on_reset(BIT0:上电复位)
|
||||
*3.pin reset(BIT4:长按复位)
|
||||
*/
|
||||
if (update || (power_reset_src & BIT(0)) || (power_reset_src & BIT(4))) {
|
||||
//log_info("reset_flag:0x%x",power_reset_src);
|
||||
if (update || (power_reset_src & BIT(0)) || (power_reset_src & BIT(4)))
|
||||
{
|
||||
// log_info("reset_flag:0x%x",power_reset_src);
|
||||
cur_por_flag = 0xA5;
|
||||
}
|
||||
int ret = syscfg_read(CFG_POR_FLAG, &por_flag, 1);
|
||||
if ((cur_por_flag == 0xA5) && (por_flag != cur_por_flag)) {
|
||||
//log_info("update POR flag");
|
||||
if ((cur_por_flag == 0xA5) && (por_flag != cur_por_flag))
|
||||
{
|
||||
// log_info("update POR flag");
|
||||
ret = syscfg_write(CFG_POR_FLAG, &cur_por_flag, 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (TCFG_CHARGE_ENABLE && TCFG_CHARGE_POWERON_ENABLE)
|
||||
if (is_ldo5v_wakeup()) { //LDO5V唤醒
|
||||
extern u8 get_charge_online_flag(void);
|
||||
if (get_charge_online_flag()) { //关机时,充电插入
|
||||
|
||||
} else { //关机时,充电拔出
|
||||
power_set_soft_poweroff();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if(TCFG_CHARGE_BOX_ENABLE)
|
||||
#if (TCFG_CHARGE_BOX_ENABLE)
|
||||
/* clock_add_set(CHARGE_BOX_CLK); */
|
||||
chgbox_init_app();
|
||||
#endif
|
||||
@ -187,10 +209,9 @@ __attribute__((used)) int *__errno()
|
||||
int main()
|
||||
{
|
||||
|
||||
#if (CONFIG_CPU_BR25)
|
||||
|
||||
#if(CONFIG_CPU_BR25)
|
||||
|
||||
#if (TCFG_DEC2TWS_ENABLE ||RECORDER_MIX_EN || TCFG_DRC_ENABLE || TCFG_USER_BLE_ENABLE || TCFG_DEC_APE_ENABLE || TCFG_DEC_FLAC_ENABLE || TCFG_DEC_DTS_ENABLE || TCFG_USER_EMITTER_ENABLE)
|
||||
#if (TCFG_DEC2TWS_ENABLE || RECORDER_MIX_EN || TCFG_DRC_ENABLE || TCFG_USER_BLE_ENABLE || TCFG_DEC_APE_ENABLE || TCFG_DEC_FLAC_ENABLE || TCFG_DEC_DTS_ENABLE || TCFG_USER_EMITTER_ENABLE)
|
||||
clock_set_sfc_max_freq(100 * 1000000, 100 * 1000000);
|
||||
#else
|
||||
|
||||
@ -218,10 +239,10 @@ int main()
|
||||
|
||||
local_irq_enable();
|
||||
|
||||
while (1) {
|
||||
while (1)
|
||||
{
|
||||
asm("idle");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -172,6 +172,12 @@ enum {
|
||||
KEY_IR_NUM_8,
|
||||
KEY_IR_NUM_9,//中间不允许插入
|
||||
//在这里增加元素
|
||||
KEY_KT_FRONT_FAN,
|
||||
KEY_KT_REAR_FAN,
|
||||
KEY_KT_LR_FAN,
|
||||
KEY_KT_LED,
|
||||
KEY_KT_AIR_COND,
|
||||
KEY_KT_MASSAGE_MODE,
|
||||
//
|
||||
KEY_HID_MODE_SWITCH,
|
||||
KEY_HID_TAKE_PICTURE,
|
||||
|
||||
@ -94,6 +94,40 @@ enum {
|
||||
#define TONE_RECORD TONE_RES_ROOT_PATH"tone/record.*"
|
||||
#define TONE_SPDIF TONE_RES_ROOT_PATH"tone/spdif.*"
|
||||
|
||||
#define TONE_FFAN_L0 TONE_RES_ROOT_PATH"tone/FFAN0.*"
|
||||
#define TONE_FFAN_L1 TONE_RES_ROOT_PATH"tone/FFAN1.*"
|
||||
#define TONE_FFAN_L2 TONE_RES_ROOT_PATH"tone/FFAN2.*"
|
||||
#define TONE_FFAN_L3 TONE_RES_ROOT_PATH"tone/FFAN3.*"
|
||||
#define TONE_FFAN_L4 TONE_RES_ROOT_PATH"tone/FFAN4.*"
|
||||
#define TONE_FFAN_L5 TONE_RES_ROOT_PATH"tone/FFAN5.*"
|
||||
#define TONE_FFAN_L6 TONE_RES_ROOT_PATH"tone/FFAN6.*"
|
||||
|
||||
#define TONE_BFAN_L0 TONE_RES_ROOT_PATH"tone/BFAN0.*"
|
||||
#define TONE_BFAN_L1 TONE_RES_ROOT_PATH"tone/BFAN1.*"
|
||||
#define TONE_BFAN_L2 TONE_RES_ROOT_PATH"tone/BFAN2.*"
|
||||
#define TONE_BFAN_L3 TONE_RES_ROOT_PATH"tone/BFAN3.*"
|
||||
#define TONE_BFAN_L4 TONE_RES_ROOT_PATH"tone/BFAN4.*"
|
||||
#define TONE_BFAN_L5 TONE_RES_ROOT_PATH"tone/BFAN5.*"
|
||||
#define TONE_BFAN_L6 TONE_RES_ROOT_PATH"tone/BFAN6.*"
|
||||
|
||||
#define TONE_CFAN_L0 TONE_RES_ROOT_PATH"tone/CFAN0.*"
|
||||
#define TONE_CFAN_L1 TONE_RES_ROOT_PATH"tone/CFAN1.*"
|
||||
#define TONE_CFAN_L2 TONE_RES_ROOT_PATH"tone/CFAN2.*"
|
||||
#define TONE_CFAN_L3 TONE_RES_ROOT_PATH"tone/CFAN3.*"
|
||||
#define TONE_CFAN_L4 TONE_RES_ROOT_PATH"tone/CFAN4.*"
|
||||
#define TONE_CFAN_L5 TONE_RES_ROOT_PATH"tone/CFAN5.*"
|
||||
#define TONE_CFAN_L6 TONE_RES_ROOT_PATH"tone/CFAN6.*"
|
||||
|
||||
#define TONE_AC_L0 TONE_RES_ROOT_PATH"tone/AC0.*"
|
||||
#define TONE_AC_L1 TONE_RES_ROOT_PATH"tone/AC1.*"
|
||||
#define TONE_AC_L2 TONE_RES_ROOT_PATH"tone/AC2.*"
|
||||
|
||||
#define TONE_LT_L0 TONE_RES_ROOT_PATH"tone/LT0.*"
|
||||
#define TONE_LT_L1 TONE_RES_ROOT_PATH"tone/LT1.*"
|
||||
#define TONE_LT_L2 TONE_RES_ROOT_PATH"tone/LT2.*"
|
||||
|
||||
|
||||
|
||||
#ifdef CONFIG_CPU_BR18
|
||||
#undef TONE_POWER_ON
|
||||
#undef TONE_POWER_OFF
|
||||
|
||||
@ -55,6 +55,7 @@
|
||||
//
|
||||
//
|
||||
#define VM_TWS_ROLE 38
|
||||
#define VM_KT_BAT_LAST_PERCENT 39
|
||||
|
||||
#if (VM_ITEM_MAX_NUM > 128)
|
||||
|
||||
|
||||
@ -96,6 +96,8 @@
|
||||
#include "tuya_multi/tuya_le_multi_common.h"
|
||||
#include "multi_demo/le_multi_common.h"
|
||||
|
||||
#include "kt.h"
|
||||
|
||||
|
||||
#define LOG_TAG_CONST BT
|
||||
#define LOG_TAG "[BT]"
|
||||
@ -911,6 +913,10 @@ int bt_key_event_handler(struct sys_event *event)
|
||||
return true;
|
||||
}
|
||||
|
||||
if (kt_key_event_filter_after(key_event,key_value) == true) {
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (key_event) {
|
||||
|
||||
case KEY_MUSIC_PP:
|
||||
|
||||
@ -21,6 +21,7 @@
|
||||
#include "bt_common.h"
|
||||
#include "aec_user.h"
|
||||
#include "soundbox.h"
|
||||
#include "kt_led7.h"
|
||||
|
||||
#include "math.h"
|
||||
#include "spp_user.h"
|
||||
@ -1436,6 +1437,7 @@ void bt_status_phone_income(struct bt_event *bt)
|
||||
|
||||
bt_user_priv_var.phone_ring_flag = 1;
|
||||
bt_user_priv_var.phone_income_flag = 1;
|
||||
kt_led7_bt_call_incoming();
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
#if BT_SYNC_PHONE_RING
|
||||
@ -1477,6 +1479,7 @@ void bt_status_phone_out(struct bt_event *bt)
|
||||
ui_update_status(STATUS_PHONE_OUT);
|
||||
bt_user_priv_var.phone_income_flag = 0;
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_CURRENT, 0, NULL); //发命令获取电话号码
|
||||
kt_led7_bt_call_idle();
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@ -1517,6 +1520,7 @@ void bt_status_phone_active(struct bt_event *bt)
|
||||
#else
|
||||
app_audio_set_volume(APP_AUDIO_STATE_CALL, app_var.call_volume, 1);
|
||||
#endif
|
||||
kt_led7_bt_call_idle();
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@ -1553,6 +1557,7 @@ void bt_status_phone_hangup(struct bt_event *bt)
|
||||
//call handup
|
||||
bt_user_priv_var.set_call_vol_flag = 0;
|
||||
}
|
||||
kt_led7_bt_call_idle();
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
@ -33,6 +33,7 @@
|
||||
#include "app_chargestore.h"
|
||||
#include "app_charge.h"
|
||||
#include "app_main.h"
|
||||
#include "kt_led7.h"
|
||||
#include "app_power_manage.h"
|
||||
#include "user_cfg.h"
|
||||
|
||||
@ -500,6 +501,7 @@ void bt_key_vol_up()
|
||||
}
|
||||
volume_up();
|
||||
vol = app_audio_get_volume(APP_AUDIO_CURRENT_STATE);
|
||||
kt_led7_show_u_volume(vol, 5);
|
||||
UI_SHOW_MENU(MENU_MAIN_VOL, 1000, vol, NULL);
|
||||
UI_MSG_POST("music_vol:vol=%4", vol);
|
||||
}
|
||||
@ -519,6 +521,7 @@ void bt_key_vol_down()
|
||||
}
|
||||
volume_down();
|
||||
vol = app_audio_get_volume(APP_AUDIO_CURRENT_STATE);
|
||||
kt_led7_show_u_volume(vol, 5);
|
||||
UI_SHOW_MENU(MENU_MAIN_VOL, 1000, vol, NULL);
|
||||
UI_MSG_POST("music_vol:vol=%4", vol);
|
||||
}
|
||||
|
||||
@ -28,6 +28,8 @@
|
||||
#include "user_cfg.h"
|
||||
#include "ui/ui_api.h"
|
||||
#include "key_event_deal.h"
|
||||
#include "kt_led7.h"
|
||||
#include "kt.h"
|
||||
|
||||
#define LOG_TAG_CONST APP_IDLE
|
||||
#define LOG_TAG "[APP_IDLE]"
|
||||
@ -43,11 +45,13 @@ static int timer_printf_1sec = 0;
|
||||
static u8 is_idle_flag = 0;
|
||||
static u8 goto_poweron_cnt = 0;
|
||||
static u8 goto_poweron_flag = 0;
|
||||
static u16 idle_plug_unplug_timer = 0;
|
||||
|
||||
extern u8 get_power_on_status(void);
|
||||
|
||||
static void idle_key_poweron_deal(u8 step);
|
||||
static void idle_app_open_module();
|
||||
static void idle_plug_unplug_check(void *priv);
|
||||
|
||||
#define POWER_ON_CNT 10
|
||||
/// idle 是否关闭不用的模块,减少功耗
|
||||
@ -254,6 +258,7 @@ static void idle_key_poweron_deal(u8 step)
|
||||
goto_poweron_cnt = 0;
|
||||
goto_poweron_flag = 0;
|
||||
app_var.goto_poweroff_flag = 0;
|
||||
app_task_switch_to(APP_BT_TASK);
|
||||
#if LOW_POWER_IN_IDLE
|
||||
idle_app_open_module();
|
||||
#endif
|
||||
@ -338,6 +343,10 @@ static int idle_sys_event_handler(struct sys_event *event)
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void idle_task_close()
|
||||
{
|
||||
if (idle_plug_unplug_timer) {
|
||||
sys_timer_del(idle_plug_unplug_timer);
|
||||
idle_plug_unplug_timer = 0;
|
||||
}
|
||||
UI_HIDE_CURR_WINDOW();
|
||||
}
|
||||
|
||||
@ -468,6 +477,11 @@ static void idle_app_start()
|
||||
#endif
|
||||
|
||||
UI_SHOW_WINDOW(ID_WINDOW_IDLE);
|
||||
kt_led7_battery_show_restart();
|
||||
|
||||
if (!idle_plug_unplug_timer) {
|
||||
idle_plug_unplug_timer = sys_timer_add(NULL, idle_plug_unplug_check, 50);
|
||||
}
|
||||
|
||||
#if (TCFG_CHARGE_ENABLE && !TCFG_CHARGE_POWERON_ENABLE)
|
||||
|
||||
@ -476,6 +490,20 @@ static void idle_app_start()
|
||||
#endif
|
||||
}
|
||||
|
||||
static void idle_plug_unplug_check(void *priv)
|
||||
{
|
||||
(void)priv;
|
||||
|
||||
/* 插电唤醒进 idle 后,若 PB3 变低(拔线)则直接关机,不走提示音流程 */
|
||||
if (app_var.poweron_charge && (gpio_read(KT_CFG_USB_PLUG_DET_PIN) == 0)) {
|
||||
app_var.play_poweron_tone = 0;
|
||||
app_var.goto_poweroff_flag = 1;
|
||||
app_var.poweron_charge = 0;
|
||||
printf("idle: plug-wakeup unplug on PB3, poweroff now\n");
|
||||
power_set_soft_poweroff();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief idle 主任务
|
||||
@ -508,6 +536,7 @@ void app_idle_task()
|
||||
idle_task_close();
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -11,6 +11,7 @@
|
||||
#include "linein/linein_dev.h"
|
||||
#include "linein/linein.h"
|
||||
#include "key_event_deal.h"
|
||||
#include "kt_led7.h"
|
||||
#include "user_cfg.h"
|
||||
#include "ui/ui_api.h"
|
||||
#include "fm_emitter/fm_emitter_manage.h"
|
||||
@ -359,6 +360,7 @@ void linein_key_vol_up()
|
||||
}
|
||||
}
|
||||
vol = __this->volume;
|
||||
kt_led7_show_u_volume(vol, 5);
|
||||
UI_SHOW_MENU(MENU_MAIN_VOL, 1000, vol, NULL);
|
||||
log_info("vol+:%d\n", __this->volume);
|
||||
}
|
||||
@ -376,6 +378,7 @@ void linein_key_vol_down()
|
||||
linein_volume_set(__this->volume);
|
||||
}
|
||||
vol = __this->volume;
|
||||
kt_led7_show_u_volume(vol, 5);
|
||||
UI_SHOW_MENU(MENU_MAIN_VOL, 1000, vol, NULL);
|
||||
log_info("vol-:%d\n", __this->volume);
|
||||
}
|
||||
|
||||
@ -12,6 +12,7 @@
|
||||
#include "ui/ui_api.h"
|
||||
#include "app_task.h"
|
||||
#include "key_event_deal.h"
|
||||
#include "kt.h"
|
||||
|
||||
|
||||
#define LOG_TAG_CONST APP_IDLE
|
||||
@ -62,7 +63,15 @@ static int power_on_init(void)
|
||||
#endif
|
||||
|
||||
#if TCFG_APP_BT_EN
|
||||
//if (app_var.poweron_charge)
|
||||
//{
|
||||
// app_task_switch_to(APP_IDLE_TASK);
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
app_task_switch_to(APP_BT_TASK);
|
||||
//}
|
||||
|
||||
#else
|
||||
|
||||
#if TCFG_USB_APPLE_DOCK_EN //苹果iap协议使用pc模式
|
||||
@ -128,11 +137,26 @@ static void tone_play_end_callback(void *priv, int flag)
|
||||
|
||||
void app_poweron_task()
|
||||
{
|
||||
printf("app_poweron_task poweron_charge: %d\n", app_var.poweron_charge);
|
||||
int msg[32];
|
||||
kt_init();
|
||||
|
||||
|
||||
UI_SHOW_MENU(MENU_POWER_UP, 0, 0, NULL);
|
||||
|
||||
|
||||
|
||||
if (app_var.poweron_charge == 1)
|
||||
{
|
||||
app_task_switch_to(APP_IDLE_TASK);
|
||||
//int err = tone_play_with_callback_by_name(tone_table[IDEX_TONE_POWER_ON], 1, tone_play_end_callback, (void *)IDEX_TONE_POWER_ON);
|
||||
}
|
||||
else
|
||||
{
|
||||
int err = tone_play_with_callback_by_name(tone_table[IDEX_TONE_POWER_ON], 1, tone_play_end_callback, (void *)IDEX_TONE_POWER_ON);
|
||||
}
|
||||
|
||||
//int err = tone_play_with_callback_by_name(tone_table[IDEX_TONE_POWER_ON], 1, tone_play_end_callback, (void *)IDEX_TONE_POWER_ON);
|
||||
/* if (err) { //提示音没有,播放失败,直接init流程 */
|
||||
/* power_on_init(); */
|
||||
/* } */
|
||||
|
||||
@ -75,7 +75,7 @@
|
||||
TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_DUAL_LR_DIFF)
|
||||
#define MAX_ANA_VOL (21)
|
||||
#else
|
||||
#define MAX_ANA_VOL (28)
|
||||
#define MAX_ANA_VOL (30)
|
||||
#endif/*TCFG_AUDIO_DAC_CONNECT_MODE*/
|
||||
|
||||
#define MAX_COM_VOL (22) // 具体数值应小于联合音量等级的数组大小 (combined_vol_list)
|
||||
@ -96,8 +96,8 @@
|
||||
#endif
|
||||
|
||||
|
||||
#define SYS_DEFAULT_VOL 0//SYS_MAX_VOL //(SYS_MAX_VOL/2)
|
||||
#define SYS_DEFAULT_TONE_VOL 18 //(SYS_MAX_VOL)
|
||||
#define SYS_DEFAULT_VOL SYS_MAX_VOL//SYS_MAX_VOL //(SYS_MAX_VOL/2)
|
||||
#define SYS_DEFAULT_TONE_VOL SYS_MAX_VOL //(SYS_MAX_VOL)
|
||||
#define SYS_DEFAULT_SIN_VOL 17
|
||||
|
||||
#define APP_AUDIO_STATE_IDLE 0
|
||||
|
||||
@ -1008,9 +1008,18 @@ REGISTER_LP_TARGET(audio_dec_init_lp_target) = {
|
||||
|
||||
#if AUDIO_OUTPUT_AUTOMUTE
|
||||
|
||||
#include "kt.h"
|
||||
|
||||
void audio_mix_out_automute_mute(u8 mute)
|
||||
{
|
||||
printf(">>>>>>>>>>>>>>>>>>>> %s\n", mute ? ("MUTE") : ("UNMUTE"));
|
||||
//printf(">>>>>>>>>>>>>>>>>>>> %s\n", mute ? ("MUTE") : ("UNMUTE"));
|
||||
if (mute)
|
||||
{
|
||||
PA_MUTE();
|
||||
} else {
|
||||
PA_UNMUTE();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* #define AUDIO_E_DET_UNMUTE (0x00) */
|
||||
|
||||
@ -36,12 +36,8 @@ void clock_remove_set(u32 type)
|
||||
|
||||
*****/
|
||||
|
||||
//// 如果clock_fix 为0 就按照配置设置时钟,如果有值就固定频率
|
||||
#if (SOUNDCARD_ENABLE) || (TCFG_MIC_EFFECT_ENABLE)
|
||||
//// clock_fix 非 0 时固定系统时钟(MHz),避免 BT 播歌 clock_set_cur 影响 MCPWM
|
||||
#define CLOCK_FIX 240
|
||||
#else
|
||||
#define CLOCK_FIX 0
|
||||
#endif
|
||||
|
||||
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR) && TCFG_EQ_DIVIDE_ENABLE
|
||||
#define EQ4_CLK (24) //20段eq double eq
|
||||
|
||||
@ -1,5 +1,8 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
fat_vfs_ops
|
||||
|
||||
|
||||
@ -24,69 +27,12 @@ pcm_decoder
|
||||
|
||||
|
||||
mp3_decoder
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
wma_decoder
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
flac_decoder
|
||||
|
||||
|
||||
|
||||
ape_decoder
|
||||
|
||||
|
||||
|
||||
m4a_decoder
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
alac_decoder
|
||||
|
||||
|
||||
|
||||
amr_decoder
|
||||
|
||||
|
||||
|
||||
dts_decoder
|
||||
|
||||
|
||||
|
||||
g729_decoder
|
||||
wav_decoder
|
||||
cvsd_encoder
|
||||
|
||||
|
||||
|
||||
msbc_encoder
|
||||
|
||||
|
||||
|
||||
mp3_encoder
|
||||
|
||||
|
||||
|
||||
g726_encoder
|
||||
|
||||
|
||||
|
||||
adpcm_encoder
|
||||
|
||||
|
||||
|
||||
pcm_encoder
|
||||
sbc_encoder
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
1
cpu/br23/tools/cfg_tool_state_complete.lua
Normal file
1
cpu/br23/tools/cfg_tool_state_complete.lua
Normal file
File diff suppressed because one or more lines are too long
@ -1,6 +1,9 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
rem @echo off
|
||||
|
||||
@echo *****************************************************************
|
||||
|
||||
1
cpu/br23/tools/download/standard/KTS_AC690x_5458.key
Normal file
1
cpu/br23/tools/download/standard/KTS_AC690x_5458.key
Normal file
@ -0,0 +1 @@
|
||||
44b10a8a9a97a7ea8795ce48fe8bb180954fc20c5763ded5954fc20c5763ded5399f4f1d
|
||||
Binary file not shown.
Binary file not shown.
@ -12,14 +12,15 @@ copy ..\..\eq_cfg_hw.bin .
|
||||
copy ..\..\ota_all.bin .
|
||||
copy ..\..\ota_nor.bin .
|
||||
|
||||
::..\..\isd_download.exe -tonorflash -dev br23 -boot 0x12000 -div8 -wait 300 -uboot uboot.boot -app app.bin -res tone.cfg cfg_tool.bin eq_cfg_hw.bin -format all %1
|
||||
|
||||
..\..\isd_download.exe -tonorflash -dev br23 -boot 0x12000 -div8 -wait 300 -uboot uboot.boot -app app.bin -res tone.cfg cfg_tool.bin eq_cfg_hw.bin -format all %1
|
||||
..\..\isd_download.exe -tonorflash -dev br23 -boot 0x12000 -div8 -wait 300 -uboot uboot.boot -app app.bin -res tone.cfg cfg_tool.bin eq_cfg_hw.bin -format all %1 -key KTS_AC690x_5458.key
|
||||
:: -format all
|
||||
::-reboot 2500
|
||||
|
||||
|
||||
|
||||
@rem 删除临时文件-format all
|
||||
@rem ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ļ<EFBFBD>-format all
|
||||
if exist *.mp3 del *.mp3
|
||||
if exist *.PIX del *.PIX
|
||||
if exist *.TAB del *.TAB
|
||||
@ -28,13 +29,13 @@ if exist *.sty del *.sty
|
||||
|
||||
|
||||
|
||||
@rem 生成固件升级文件
|
||||
@rem <EFBFBD><EFBFBD><EFBFBD>ɹ̼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||
copy ota_all.bin ota.bin
|
||||
..\..\fw_add.exe -noenc -fw jl_isd.fw -add ota.bin -type 100 -out jl_isd_all.fw
|
||||
copy ota_nor.bin ota.bin
|
||||
..\..\fw_add.exe -noenc -fw jl_isd.fw -add ota.bin -type 100 -out jl_isd_nor.fw
|
||||
|
||||
@rem 添加配置脚本的版本信息到 FW 文件中
|
||||
@rem <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ýű<EFBFBD><EFBFBD>İ汾<EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD> FW <20>ļ<EFBFBD><C4BC><EFBFBD>
|
||||
..\..\fw_add.exe -noenc -fw jl_isd_all.fw -add script.ver -out jl_isd_all.fw
|
||||
..\..\fw_add.exe -noenc -fw jl_isd_nor.fw -add script.ver -out jl_isd_nor.fw
|
||||
|
||||
@ -48,16 +49,16 @@ copy jl_isd_all.fw jl_isd.fw
|
||||
del jl_isd_all.ufw jl_isd_nor.ufw jl_isd_all.fw jl_isd_nor.fw
|
||||
|
||||
|
||||
@REM 生成配置文件升级文件
|
||||
@REM <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||
::ufw_maker.exe -chip AC800X %ADD_KEY% -output config.ufw -res bt_cfg.cfg
|
||||
|
||||
::IF EXIST jl_696x.bin del jl_696x.bin
|
||||
|
||||
|
||||
@rem 常用命令说明
|
||||
@rem -format vm //擦除VM 区域
|
||||
@rem -format cfg //擦除BT CFG 区域
|
||||
@rem -format 0x3f0-2 //表示从第 0x3f0 个 sector 开始连续擦除 2 个 sector(第一个参数为16进制或10进制都可,第二个参数必须是10进制)
|
||||
@rem <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>
|
||||
@rem -format vm //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>VM <20><><EFBFBD><EFBFBD>
|
||||
@rem -format cfg //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>BT CFG <20><><EFBFBD><EFBFBD>
|
||||
@rem -format 0x3f0-2 //<EFBFBD><EFBFBD>ʾ<EFBFBD>ӵ<EFBFBD> 0x3f0 <20><> sector <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2 <20><> sector(<28><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ16<31><36><EFBFBD>ƻ<EFBFBD>10<31><30><EFBFBD>ƶ<EFBFBD><C6B6>ɣ<EFBFBD><C9A3>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>10<31><30><EFBFBD><EFBFBD>)
|
||||
|
||||
ping /n 2 127.1>null
|
||||
IF EXIST null del null
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
cpu/br23/tools/download/standard/update_HTFAN03_0D30.ufw
Normal file
BIN
cpu/br23/tools/download/standard/update_HTFAN03_0D30.ufw
Normal file
Binary file not shown.
BIN
cpu/br23/tools/download/standard/update_HTFAN03_5652.ufw
Normal file
BIN
cpu/br23/tools/download/standard/update_HTFAN03_5652.ufw
Normal file
Binary file not shown.
BIN
cpu/br23/tools/download/standard/update_HTFAN03_7003.ufw
Normal file
BIN
cpu/br23/tools/download/standard/update_HTFAN03_7003.ufw
Normal file
Binary file not shown.
BIN
cpu/br23/tools/download/standard/update_HTFAN03_7506.ufw
Normal file
BIN
cpu/br23/tools/download/standard/update_HTFAN03_7506.ufw
Normal file
Binary file not shown.
BIN
cpu/br23/tools/download/standard/update_HTFAN03_8E3B.ufw
Normal file
BIN
cpu/br23/tools/download/standard/update_HTFAN03_8E3B.ufw
Normal file
Binary file not shown.
BIN
cpu/br23/tools/download/standard/update_HTFAN03_917E.ufw
Normal file
BIN
cpu/br23/tools/download/standard/update_HTFAN03_917E.ufw
Normal file
Binary file not shown.
BIN
cpu/br23/tools/download/standard/update_HTFAN03_BDE0.ufw
Normal file
BIN
cpu/br23/tools/download/standard/update_HTFAN03_BDE0.ufw
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/AC0.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/AC0.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/AC1.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/AC1.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/AC2.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/AC2.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/BFAN0.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/BFAN0.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/BFAN1.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/BFAN1.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/BFAN2.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/BFAN2.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/BFAN3.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/BFAN3.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/BFAN4.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/BFAN4.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/BFAN5.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/BFAN5.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/BFAN6.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/BFAN6.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/CFAN0.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/CFAN0.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/CFAN1.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/CFAN1.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/CFAN2.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/CFAN2.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/CFAN3.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/CFAN3.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/CFAN4.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/CFAN4.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/CFAN5.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/CFAN5.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/CFAN6.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/CFAN6.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/FFAN0.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/FFAN0.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/FFAN1.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/FFAN1.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/FFAN2.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/FFAN2.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/FFAN3.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/FFAN3.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/FFAN4.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/FFAN4.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/FFAN5.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/FFAN5.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/FFAN6.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/FFAN6.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/LT0.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/LT0.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/LT1.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/LT1.wtg
Normal file
Binary file not shown.
BIN
cpu/br23/tools/extra_tones/LT2.wtg
Normal file
BIN
cpu/br23/tools/extra_tones/LT2.wtg
Normal file
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -21,8 +21,8 @@
|
||||
#define WKUP_SHORT_KEY 0x80
|
||||
|
||||
|
||||
#define LEADING_EDGE 0
|
||||
#define FALLING_EDGE 1
|
||||
#define LEADING_EDGE 0 //上升沿
|
||||
#define FALLING_EDGE 1 //下降沿
|
||||
|
||||
|
||||
struct rtc_dev_data {
|
||||
|
||||
BIN
tone/AC0.mp3
Normal file
BIN
tone/AC0.mp3
Normal file
Binary file not shown.
BIN
tone/AC0.wtg
Normal file
BIN
tone/AC0.wtg
Normal file
Binary file not shown.
BIN
tone/AC1.mp3
Normal file
BIN
tone/AC1.mp3
Normal file
Binary file not shown.
BIN
tone/AC1.wtg
Normal file
BIN
tone/AC1.wtg
Normal file
Binary file not shown.
BIN
tone/AC2.mp3
Normal file
BIN
tone/AC2.mp3
Normal file
Binary file not shown.
BIN
tone/AC2.wtg
Normal file
BIN
tone/AC2.wtg
Normal file
Binary file not shown.
BIN
tone/BFAN0.mp3
Normal file
BIN
tone/BFAN0.mp3
Normal file
Binary file not shown.
BIN
tone/BFAN0.wtg
Normal file
BIN
tone/BFAN0.wtg
Normal file
Binary file not shown.
BIN
tone/BFAN1.mp3
Normal file
BIN
tone/BFAN1.mp3
Normal file
Binary file not shown.
BIN
tone/BFAN1.wtg
Normal file
BIN
tone/BFAN1.wtg
Normal file
Binary file not shown.
BIN
tone/BFAN2.mp3
Normal file
BIN
tone/BFAN2.mp3
Normal file
Binary file not shown.
BIN
tone/BFAN2.wtg
Normal file
BIN
tone/BFAN2.wtg
Normal file
Binary file not shown.
BIN
tone/BFAN3.mp3
Normal file
BIN
tone/BFAN3.mp3
Normal file
Binary file not shown.
BIN
tone/BFAN3.wtg
Normal file
BIN
tone/BFAN3.wtg
Normal file
Binary file not shown.
BIN
tone/BFAN4.mp3
Normal file
BIN
tone/BFAN4.mp3
Normal file
Binary file not shown.
BIN
tone/BFAN4.wtg
Normal file
BIN
tone/BFAN4.wtg
Normal file
Binary file not shown.
BIN
tone/BFAN5.mp3
Normal file
BIN
tone/BFAN5.mp3
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user