AC63_BT_SDK/apps/hid/modules/power/app_handshake.c

142 lines
4.0 KiB
C
Raw Normal View History

2025-02-18 15:40:42 +08:00
#include "asm/includes.h"
#include "system/includes.h"
#include "app_config.h"
#include "chargebox.h"
#if (TCFG_CHARGE_ENABLE && TCFG_HANDSHAKE_ENABLE)
static int hs_timer;
static u8 hs_repeat_times;
void (*handshake_complete_cb)(void);
extern void handshake_timer_delay_us(u8 us);
extern void handshake_timer_delay_ms(u8 ms);
static struct _hs_hdl hs_ctrl = {
.port0 = TCFG_HANDSHAKE_IO_DATA1, //初始化IO
.port1 = TCFG_HANDSHAKE_IO_DATA2, //初始化IO
.send_delay_us = handshake_timer_delay_us,//注册延时函数
};
static void handshake_app_init(void)
{
static u8 hs_init_flag = 0;
if (hs_init_flag == 0) {
hs_init_flag = 1;
handshake_ctrl_init(&hs_ctrl);
}
}
/*------------------------------------------------------------------------------------*/
/**@brief lighting检测是否为快充线
@param
@return
@note
*/
/*------------------------------------------------------------------------------------*/
static void handshake_app_check_fast_charge(void)
{
u8 ret;
local_irq_disable();
ret = handshake_check_fast_charge(10);//检测10ms
local_irq_enable();
}
/*------------------------------------------------------------------------------------*/
/**@brief lighting握手
@param
@return
@note
*/
/*------------------------------------------------------------------------------------*/
static void handshake_app_run(void)
{
u32 cur_clock = 0;
cur_clock = clk_get("sys");
//转成48m
if (cur_clock != 48000000) {
clk_set("sys", 48 * 1000000L);
}
local_irq_disable();
handshake_timer_delay_ms(2);
/* handshake_send_app(HS_CMD0); */
/* handshake_timer_delay_ms(2); */
/* handshake_send_app(HS_CMD1); */
/* handshake_timer_delay_ms(2); */
/* handshake_send_app(HS_CMD2); */
/* handshake_timer_delay_ms(2); */
handshake_send_app(HS_CMD3);
local_irq_enable();
//恢复时钟
if (cur_clock != 48000000) {
clk_set("sys", cur_clock);
}
}
/*------------------------------------------------------------------------------------*/
/**@brief lighting重复握手
@param null
@return
@note
*/
/*------------------------------------------------------------------------------------*/
static void handshake_app_deal(void *priv)
{
handshake_app_run();
hs_repeat_times--;
if (hs_repeat_times == 0) {
sys_timer_del(hs_timer);
hs_timer = 0;
if (handshake_complete_cb) {
handshake_complete_cb();
handshake_complete_cb = NULL;
}
}
}
/*------------------------------------------------------------------------------------*/
/**@brief lighting握手开始
@param times:
@return
@note
*/
/*------------------------------------------------------------------------------------*/
void handshake_app_start(u8 times, void (*complete_cb)(void))
{
handshake_app_init();
if (hs_repeat_times == 0) {
handshake_app_check_fast_charge();
handshake_app_run();
hs_repeat_times = times;
handshake_complete_cb = complete_cb;
if (hs_repeat_times) {
if (hs_timer == 0) {
hs_timer = sys_timer_add(NULL, handshake_app_deal, 200);
}
} else {
if (complete_cb) {
complete_cb();
}
}
}
}
/*------------------------------------------------------------------------------------*/
/**@brief lighting握手停止
@param
@return
@note
*/
/*------------------------------------------------------------------------------------*/
void handshake_app_stop(void)
{
if (hs_timer) {
sys_timer_del(hs_timer);
hs_timer = 0;
}
handshake_complete_cb = NULL;
hs_repeat_times = 0;
}
#endif