174 lines
5.4 KiB
C
174 lines
5.4 KiB
C
#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;
|
||
} |