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