KT25-1015_AC695x_SDK310/apps/kaotings/kt.c

174 lines
5.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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