Compare commits

..

9 Commits

137 changed files with 63988 additions and 92053 deletions

View File

@ -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
View 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"
}
}

View File

@ -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 \

View File

@ -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
View 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
View 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
View 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%( CCCV )/ */
#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);
}
}

View 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
View 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
View 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
View File

@ -0,0 +1,597 @@
/*
* kt_led7.c
*
* kt_led7.h L7L14
* L7 kt_led7_scan() case 05
* L8 LED_NUMBER / LED_LARGE_LETTER / LED_SMALL_LETTER
* L9L12 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;
/* 充电电量闪烁:约 1Hz500ms 亮 / 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]&GPIN5) (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
View File

@ -0,0 +1,114 @@
#ifndef __KT_LED7_H__
#define __KT_LED7_H__
#include "system/includes.h"
#include "kt.h"
/*
* =============================================================================
* kt_led7 L7L14
* =============================================================================
*
*
* - 3 / + 2 6 /线 + 线 6 GPIO
* - PCB 线 AG/DP kt_led7.c
*
*
* - kt_led7_scan usr_timersys_s_hi_timer_add 2ms6
*
*
* - 1 + dp1/dp2线
*
* kt_led7_show_*
* - show_timeurgent/ L13
*
* -----------------------------------------------------------------------------
* L7L14 kt.h ///
* -----------------------------------------------------------------------------
* L7 kt_led7_scan
* L8 09 + L / F / C AC
* L9 L-0L-6 kt_fan_ac fan_level_06
* L10 F-0F-6
* L11 C-0C-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
*
* AG LED_AG ****
* b[0..2]&LED_x x B2 kt_led7.c kt_led7_scan()
* B0/B1 if(b[0|1|2]&LED_*)
*
* B2b[2]B0/B1/B2 /
* A:2H3L B:2H4L C:5H2L D:2H6L E:2H5L F:3H2L G:4H2L DP:2H1L
* B1b[1]
* A:5H4L B:3H5L C:4H5L D:3H4L E:6H3L F:4H3L G:5H3L DP:3H1L
* B0b[0]
* A:1H6L B:3H6L C:5H6L D:6H4L E:4H6L F:6H5L G:1H5L DP:NONE
*/
/**
* L7L14
*
* ()
*
*
* ,,
*/
#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 1Hz100% 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

View 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);
}

View 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

View File

@ -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,

View File

@ -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

View File

@ -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

View File

@ -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,11 +42,9 @@ static void do_module_initcall()
void __attribute__((weak)) board_init()
{
}
void __attribute__((weak)) board_early_init()
{
}
int eSystemConfirmStopStatus(void)
@ -53,15 +52,17 @@ int eSystemConfirmStopStatus(void)
/* 系统进入在未来时间里,无任务超时唤醒,可根据用户选择系统停止,或者系统定时唤醒(100ms) */
// 1:Endless Sleep
// 0:100 ms wakeup
if (get_charge_full_flag()) {
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,28 +175,19 @@ 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))) {
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)) {
if ((cur_por_flag == 0xA5) && (por_flag != cur_por_flag))
{
// log_info("update POR flag");
ret = syscfg_write(CFG_POR_FLAG, &cur_por_flag, 1);
}
#endif
#if (TCFG_CHARGE_ENABLE && TCFG_CHARGE_POWERON_ENABLE)
if (is_ldo5v_wakeup()) { //LDO5V唤醒
extern u8 get_charge_online_flag(void);
if (get_charge_online_flag()) { //关机时,充电插入
} else { //关机时,充电拔出
power_set_soft_poweroff();
}
}
#endif
#if (TCFG_CHARGE_BOX_ENABLE)
/* clock_add_set(CHARGE_BOX_CLK); */
chgbox_init_app();
@ -187,7 +209,6 @@ __attribute__((used)) int *__errno()
int main()
{
#if (CONFIG_CPU_BR25)
#if (TCFG_DEC2TWS_ENABLE || RECORDER_MIX_EN || TCFG_DRC_ENABLE || TCFG_USER_BLE_ENABLE || TCFG_DEC_APE_ENABLE || TCFG_DEC_FLAC_ENABLE || TCFG_DEC_DTS_ENABLE || TCFG_USER_EMITTER_ENABLE)
@ -218,10 +239,10 @@ int main()
local_irq_enable();
while (1) {
while (1)
{
asm("idle");
}
return 0;
}

View File

@ -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,

View File

@ -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

View File

@ -55,6 +55,7 @@
//
//
#define VM_TWS_ROLE 38
#define VM_KT_BAT_LAST_PERCENT 39
#if (VM_ITEM_MAX_NUM > 128)

View File

@ -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:

View File

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

View File

@ -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);
}

View File

@ -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;
}
}
}

View File

@ -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);
}

View File

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

View File

@ -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

View File

@ -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) */

View File

@ -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

View File

@ -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.

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,9 @@
rem @echo off
@echo *****************************************************************

View File

@ -0,0 +1 @@
44b10a8a9a97a7ea8795ce48fe8bb180954fc20c5763ded5954fc20c5763ded5399f4f1d

View File

@ -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.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

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.

View File

@ -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

Binary file not shown.

BIN
tone/AC0.wtg Normal file

Binary file not shown.

BIN
tone/AC1.mp3 Normal file

Binary file not shown.

BIN
tone/AC1.wtg Normal file

Binary file not shown.

BIN
tone/AC2.mp3 Normal file

Binary file not shown.

BIN
tone/AC2.wtg Normal file

Binary file not shown.

BIN
tone/BFAN0.mp3 Normal file

Binary file not shown.

BIN
tone/BFAN0.wtg Normal file

Binary file not shown.

BIN
tone/BFAN1.mp3 Normal file

Binary file not shown.

BIN
tone/BFAN1.wtg Normal file

Binary file not shown.

BIN
tone/BFAN2.mp3 Normal file

Binary file not shown.

BIN
tone/BFAN2.wtg Normal file

Binary file not shown.

BIN
tone/BFAN3.mp3 Normal file

Binary file not shown.

BIN
tone/BFAN3.wtg Normal file

Binary file not shown.

BIN
tone/BFAN4.mp3 Normal file

Binary file not shown.

BIN
tone/BFAN4.wtg Normal file

Binary file not shown.

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