Browse Source

1. 新增AFC功能

2. 新增哪个口先插哪个口先分配45W功率的功能
3. SCPB增加0.2A的offset, SCPA新增12V档位
4. 新增发送src_cap时, 判断如果不是PD协议就不发src_cap
master
Jipeng.tang 1 month ago
parent
commit
e5caf14cb0
  1. 4
      PD_CPS8860_A1_CPS_Common_Demo/ac_project/code/inc/config.h
  2. 7
      PD_CPS8860_A1_CPS_Common_Demo/ac_project/code/inc/customized.h
  3. 86
      PD_CPS8860_A1_CPS_Common_Demo/ac_project/code/src/customized.c
  4. 20
      PD_CPS8860_A1_CPS_Common_Demo/ac_project/code/src/port0_customized.c
  5. 20
      PD_CPS8860_A1_CPS_Common_Demo/ac_project/code/src/port1_customized.c
  6. 28
      PD_CPS8860_A1_CPS_Common_Demo/common/app/src/cps8860_it.c
  7. 6
      PD_CPS8860_A1_CPS_Common_Demo/common/comp/protocol/pd_protocol/src/pd_protocol.c
  8. 10
      PD_CPS8860_A1_CPS_Common_Demo/common/comp/protocol/qc_scp_protocol/src/qc_scp_protocol.c

4
PD_CPS8860_A1_CPS_Common_Demo/ac_project/code/inc/config.h

@ -72,7 +72,7 @@ extern uint16_t system_1s_cnt;
/****************project inforamtion MTP ADDR:0x100000C0*******************/
#define SOFT_WARE_VERISION_H 0x00
#define SOFT_WARE_VERISION_L 0x03
#define SOFT_WARE_VERISION_L 0x04
#define CUSTOM_ID 0xA1
#define PROJECT_ID 0x60
/**********************���칦�ܺ궨��************************************/
@ -137,7 +137,7 @@ extern uint16_t system_1s_cnt;
#define APPLE_MODE_SUPPORT 1
#define TFCP_SUPPORT 0
#define AFC_SUPPORT 0
#define AFC_SUPPORT 1
#define PROTECTION_SUPPORT 1

7
PD_CPS8860_A1_CPS_Common_Demo/ac_project/code/inc/customized.h

@ -108,11 +108,7 @@ typedef struct
uint16_t usba_low_current_cnt;
bool usba_is_low_power; // A口有负载, 且负载十分钟内都处在低功率状态
uint16_t test_cable_vol; // 仅测试用
bool test_flag_1;
bool test_flag_2;
bool test_flag_3;
bool test_flag_4;
bool c1_priority_inser; // C1口优先C2口接进来 = 1 代表是
} user_app_s;
extern user_app_s user_app;
@ -335,6 +331,7 @@ void app_double_dynamic_power_check(void);
void usba_detection(void);
void insertion_equipment_judgment(void);
void port_inser_priority_judgment(void);
#if USER_NTC_ENABLE
void ntc_judgment(void);

86
PD_CPS8860_A1_CPS_Common_Demo/ac_project/code/src/customized.c

@ -660,16 +660,6 @@ void adapter_state_check(void)
type_c2_state = (g_app_protocol_param[1].pd_param.typec_status.typec_status == AttachedSRC);
usba_state = usba_online_state;
// gate3 控制功率合并。 只要C1口没接东西,都打开gate3
// if(type_c1_state)
// {
// comp_dac_close_vbus(TYPEC_PORT_MAX);
// }
// else
// {
// comp_dac_open_vbus(TYPEC_PORT_MAX);
// }
if(type_c1_state && !type_c2_state && !usba_state)
{
user_app.adapter_state = C1_INSER;
@ -741,13 +731,30 @@ void adapter_state_check(void)
break;
case C1_C2_INSER:
need_send_cap_flag[TYPEC_PORT0] = PD_PWR_45W;
need_send_cap_flag[TYPEC_PORT1] = PD_PWR_25W;
// 客户要求: 双口时先看接入优先级
need_send_cap_flag[TYPEC_PORT0] = PD_PWR_35W;
need_send_cap_flag[TYPEC_PORT1] = PD_PWR_35W;
// 从2C1A状态跳回来, 需要重新把协议都打开, 判断是小功率设备时, 会在下面把协议全关了
g_powerout_info[TYPEC_PORT0].support_protocol.byte = PROTOCOL_ALL_ENABLE;
g_powerout_info[TYPEC_PORT1].support_protocol.byte = PROTOCOL_ALL_ENABLE;
// 1. 接入优先级
if(user_app.c1_priority_inser)
{
need_send_cap_flag[TYPEC_PORT0] = PD_PWR_45W;
need_send_cap_flag[TYPEC_PORT1] = PD_PWR_25W;
}
else
{
need_send_cap_flag[TYPEC_PORT0] = PD_PWR_25W;
need_send_cap_flag[TYPEC_PORT1] = PD_PWR_45W;
}
log_info("c1_type:%d c2_type:%d\n", user_app.c1_equipment_type,
user_app.c2_equipment_type);
// 优先级1. C1 C2都是电脑
// 2. 设备优先级1. C1 C2都是电脑
if(user_app.c1_equipment_type == EQUIMENT_IS_COMPUTER)
{
// 电脑 + 手机
@ -829,6 +836,9 @@ void adapter_state_check(void)
charge_protocol_reset(TYPEC_PORT1, &g_app_protocol_param[TYPEC_PORT1].dpdn_param,
SCP_TYPEC_RESET);
g_powerout_info[TYPEC_PORT1].support_protocol.byte = PROTOCOL_DISABLE_ALL;
// 如果C2原本就升到了5V以上电压, 要降回5V
comp_powerout_default_set(TYPEC_PORT1, &g_powerout_info[TYPEC_PORT1]);
break;
default:
@ -1391,6 +1401,51 @@ void comp_port_connect_state_check(uint8_t port)
}
void port_inser_priority_judgment(void)
{
// 只有 C1 + C2 同在时才需要判接入优先级, 所以单口时不需要清零
// C1
if(g_app_protocol_param[TYPEC_PORT0].pd_param.typec_status.typec_status == AttachedSRC
&& g_app_protocol_param[TYPEC_PORT0].pd_param.typec_status.typec_process_status == typec_enter_status
)
{
// C1 + C2 同时接入
if(g_app_protocol_param[TYPEC_PORT1].pd_param.typec_status.typec_status == AttachedSRC
&& g_app_protocol_param[TYPEC_PORT1].pd_param.typec_status.typec_process_status == typec_enter_status
)
{
user_app.c1_priority_inser = true;
} // C1接入前 C2已接入
else if(g_app_protocol_param[TYPEC_PORT1].pd_param.typec_status.typec_status == AttachedSRC
&& g_app_protocol_param[TYPEC_PORT1].pd_param.typec_status.typec_process_status == typec_exit_status
)
{
user_app.c1_priority_inser = false;
}
else // C2口没设备接入
{
user_app.c1_priority_inser = true;
}
}
// C2
if(g_app_protocol_param[TYPEC_PORT1].pd_param.typec_status.typec_status == AttachedSRC
&& g_app_protocol_param[TYPEC_PORT1].pd_param.typec_status.typec_process_status == typec_enter_status
)
{
// C1 + C2 同时接入, 优先 C1
if(g_app_protocol_param[TYPEC_PORT0].pd_param.typec_status.typec_status == AttachedSRC)
{
user_app.c1_priority_inser = true;
}
else // C2口没设备接入
{
user_app.c1_priority_inser = false;
}
}
}
/*
* @brief app_protocol_run
* @param null
@ -1428,9 +1483,8 @@ void app_protocol_run(uint8_t port)
}
*/
// #if PD_DOUBLE_PORT_DERAT_SUPPORT
// adapter_state_check();
// #endif
// 端口接入优先级判断
port_inser_priority_judgment();
#if USER_DERAT_ENABLE
adapter_state_check();

20
PD_CPS8860_A1_CPS_Common_Demo/ac_project/code/src/port0_customized.c

@ -15,7 +15,7 @@
#if SCP_SUPPORT
/***********************SCP PARAM INFO*********************************/
#define SCP_DEFAULT_VSET_BOUNDARY 10000 /* in unit of mV */
#define SCP_DEFAULT_ISET_BOUNDARY 2000 /* in unit of mA */
#define SCP_DEFAULT_ISET_BOUNDARY 2250 /* in unit of mA */
#define SCP_VOLTAGE_MAX 12000 /* in unit of mV */
#define SCP_VOLTAGE_MIN 5500 /* in unit of mV */
#define SCP_CURRENT_MAX 2700 /* in unit of mA */
@ -64,8 +64,8 @@ const uint8_t port0_scp_register_value[256] =
DECL_REG(0x1e, 0),
DECL_REG(0x1f, 0),
DECL_REG(FCP_CAPABILITIES, FCP_CAPABILITIES_DISCRETE_VOLTAGE_MASK),
DECL_REG(FCP_DISCRETE_CAPABILITIES0, FCP_DISCRETE_CAPABILITIES0_5V_9V),
DECL_REG(FCP_MAX_PWR, FCP_MAX_PWR_VAL(18)),
DECL_REG(FCP_DISCRETE_CAPABILITIES0, FCP_DISCRETE_CAPABILITIES0_5V_9V_12V),
DECL_REG(FCP_MAX_PWR, FCP_MAX_PWR_VAL(22)),
DECL_REG(0x23, 0),
DECL_REG(0x24, 0),
DECL_REG(0x25, 0),
@ -78,10 +78,10 @@ const uint8_t port0_scp_register_value[256] =
DECL_REG(FCP_VOUT_CONFIG, FCP_VOUT_CONFIG_VAL(5200)),
DECL_REG(FCP_IOUT_CONFIG, FCP_IOUT_CONFIG_VAL(2000)),
DECL_REG(0x2e, 0),
DECL_REG(FCP_DISCRETE_CAPABILITIES, FCP_DISCRETE_CAPABILITIES_VAL(2)),
DECL_REG(FCP_DISCRETE_CAPABILITIES, FCP_DISCRETE_CAPABILITIES_VAL(3)),
DECL_REG(FCP_OUTPUT_V(0), FCP_OUTPUT_V_VAL(5200)),
DECL_REG(FCP_OUTPUT_V(1), FCP_OUTPUT_V_VAL(9000)),
DECL_REG(FCP_OUTPUT_V(2), 0),
DECL_REG(FCP_OUTPUT_V(2), FCP_OUTPUT_V_VAL(12000)),
DECL_REG(FCP_OUTPUT_V(3), 0),
DECL_REG(FCP_OUTPUT_V(4), 0),
DECL_REG(FCP_OUTPUT_V(5), 0),
@ -113,7 +113,7 @@ const uint8_t port0_scp_register_value[256] =
DECL_REG(FCP_OUTPUT_UVP(15), 0),
DECL_REG(FCP_OUTPUT_I(0), FCP_OUTPUT_I_VAL(2000)),
DECL_REG(FCP_OUTPUT_I(1), FCP_OUTPUT_I_VAL(2000)),
DECL_REG(FCP_OUTPUT_I(2), 0),
DECL_REG(FCP_OUTPUT_I(2), FCP_OUTPUT_I_VAL(1875)),
DECL_REG(FCP_OUTPUT_I(3), 0),
DECL_REG(FCP_OUTPUT_I(4), 0),
DECL_REG(FCP_OUTPUT_I(5), 0),
@ -178,9 +178,9 @@ const uint8_t port0_scp_register_value[256] =
DECL_REG(SCP_MAX_PWR, SCP_MAX_PWR_VAL(1, 20)),
DECL_REG(SCP_CNT_PWR, SCP_MAX_PWR_VAL(1, 20)),
DECL_REG(SCP_MIN_VOUT, SCP_VI_RANGE_VAL(2, 55)),
DECL_REG(SCP_MAX_VOUT, SCP_VI_RANGE_VAL(3, 12)),
DECL_REG(SCP_MAX_VOUT, SCP_VI_RANGE_VAL(3, 10)),
DECL_REG(SCP_MIN_IOUT, SCP_VI_RANGE_VAL(1, 30)),
DECL_REG(SCP_MAX_IOUT, SCP_VI_RANGE_VAL(2, 20)),
DECL_REG(SCP_MAX_IOUT, SCP_VI_RANGE_VAL(2, 22)),
DECL_REG(SCP_VSTEP, 0x14),
DECL_REG(SCP_ISTEP, 0x32),
DECL_REG(SCP_MAX_VERR, SCP_MAX_ERR_VAL(1, 30)),
@ -327,8 +327,8 @@ const scp_power_curve_s PORT0_SCP_POWER_CURVE_BUF[] =
{
{VOLTAGE_9V, CURRENT_2P7A},
{VOLTAGE_10V, CURRENT_2P4A},
{VOLTAGE_10P5V, CURRENT_2P2A},
{VOLTAGE_12V, CURRENT_1P7A},
// {VOLTAGE_10P5V, CURRENT_2P2A},
// {VOLTAGE_12V, CURRENT_1P7A},
};

20
PD_CPS8860_A1_CPS_Common_Demo/ac_project/code/src/port1_customized.c

@ -17,7 +17,7 @@
#if SCP_SUPPORT
/***********************SCP PARAM INFO*********************************/
#define SCP_DEFAULT_VSET_BOUNDARY 10000 /* in unit of mV */
#define SCP_DEFAULT_ISET_BOUNDARY 2000 /* in unit of mA */
#define SCP_DEFAULT_ISET_BOUNDARY 2250 /* in unit of mA */
#define SCP_VOLTAGE_MAX 12000 /* in unit of mV */
#define SCP_VOLTAGE_MIN 5500 /* in unit of mV */
#define SCP_CURRENT_MAX 2700 /* in unit of mA */
@ -64,8 +64,8 @@ const uint8_t port1_scp_register_value[256] =
DECL_REG(0x1e, 0),
DECL_REG(0x1f, 0),
DECL_REG(FCP_CAPABILITIES, FCP_CAPABILITIES_DISCRETE_VOLTAGE_MASK),
DECL_REG(FCP_DISCRETE_CAPABILITIES0, FCP_DISCRETE_CAPABILITIES0_5V_9V),
DECL_REG(FCP_MAX_PWR, FCP_MAX_PWR_VAL(18)),
DECL_REG(FCP_DISCRETE_CAPABILITIES0, FCP_DISCRETE_CAPABILITIES0_5V_9V_12V),
DECL_REG(FCP_MAX_PWR, FCP_MAX_PWR_VAL(22)),
DECL_REG(0x23, 0),
DECL_REG(0x24, 0),
DECL_REG(0x25, 0),
@ -78,10 +78,10 @@ const uint8_t port1_scp_register_value[256] =
DECL_REG(FCP_VOUT_CONFIG, FCP_VOUT_CONFIG_VAL(5200)),
DECL_REG(FCP_IOUT_CONFIG, FCP_IOUT_CONFIG_VAL(2000)),
DECL_REG(0x2e, 0),
DECL_REG(FCP_DISCRETE_CAPABILITIES, FCP_DISCRETE_CAPABILITIES_VAL(2)),
DECL_REG(FCP_DISCRETE_CAPABILITIES, FCP_DISCRETE_CAPABILITIES_VAL(3)),
DECL_REG(FCP_OUTPUT_V(0), FCP_OUTPUT_V_VAL(5200)),
DECL_REG(FCP_OUTPUT_V(1), FCP_OUTPUT_V_VAL(9000)),
DECL_REG(FCP_OUTPUT_V(2), 0),
DECL_REG(FCP_OUTPUT_V(2), FCP_OUTPUT_V_VAL(12000)),
DECL_REG(FCP_OUTPUT_V(3), 0),
DECL_REG(FCP_OUTPUT_V(4), 0),
DECL_REG(FCP_OUTPUT_V(5), 0),
@ -113,7 +113,7 @@ const uint8_t port1_scp_register_value[256] =
DECL_REG(FCP_OUTPUT_UVP(15), 0),
DECL_REG(FCP_OUTPUT_I(0), FCP_OUTPUT_I_VAL(2000)),
DECL_REG(FCP_OUTPUT_I(1), FCP_OUTPUT_I_VAL(2000)),
DECL_REG(FCP_OUTPUT_I(2), 0),
DECL_REG(FCP_OUTPUT_I(2), FCP_OUTPUT_I_VAL(1875)),
DECL_REG(FCP_OUTPUT_I(3), 0),
DECL_REG(FCP_OUTPUT_I(4), 0),
DECL_REG(FCP_OUTPUT_I(5), 0),
@ -178,9 +178,9 @@ const uint8_t port1_scp_register_value[256] =
DECL_REG(SCP_MAX_PWR, SCP_MAX_PWR_VAL(1, 20)),
DECL_REG(SCP_CNT_PWR, SCP_MAX_PWR_VAL(1, 20)),
DECL_REG(SCP_MIN_VOUT, SCP_VI_RANGE_VAL(2, 55)),
DECL_REG(SCP_MAX_VOUT, SCP_VI_RANGE_VAL(3, 12)),
DECL_REG(SCP_MAX_VOUT, SCP_VI_RANGE_VAL(3, 10)),
DECL_REG(SCP_MIN_IOUT, SCP_VI_RANGE_VAL(1, 30)),
DECL_REG(SCP_MAX_IOUT, SCP_VI_RANGE_VAL(2, 20)),
DECL_REG(SCP_MAX_IOUT, SCP_VI_RANGE_VAL(2, 22)),
DECL_REG(SCP_VSTEP, 0x14),
DECL_REG(SCP_ISTEP, 0x32),
DECL_REG(SCP_MAX_VERR, SCP_MAX_ERR_VAL(1, 30)),
@ -327,8 +327,8 @@ const scp_power_curve_s PORT1_SCP_POWER_CURVE_BUF[] =
{
{VOLTAGE_9V, CURRENT_2P7A},
{VOLTAGE_10V, CURRENT_2P4A},
{VOLTAGE_10P5V, CURRENT_2P2A},
{VOLTAGE_12V, CURRENT_1P7A},
// {VOLTAGE_10P5V, CURRENT_2P2A},
// {VOLTAGE_12V, CURRENT_1P7A},
};

28
PD_CPS8860_A1_CPS_Common_Demo/common/app/src/cps8860_it.c

@ -78,26 +78,16 @@ void SysTick_Handler(void)
// usba_online_state,
// REG_ANALOG_GATE3->bf.driver_en);
log_info("gate1:%d 2:%d 3:%d vin1:%d 2:%d\n", REG_ANALOG_GATE1->bf.driver_en,
REG_ANALOG_GATE2->bf.driver_en,
REG_ANALOG_GATE3->bf.driver_en,
comp_adc_get_vin12(0),
comp_adc_get_vin12(1));
// log_info("gate1:%d 2:%d 3:%d vin1:%d 2:%d\n", REG_ANALOG_GATE1->bf.driver_en,
// REG_ANALOG_GATE2->bf.driver_en,
// REG_ANALOG_GATE3->bf.driver_en,
// comp_adc_get_vin12(0),
// comp_adc_get_vin12(1));
log_info("iout1:%d iout2:%d set_cur:%d\n", comp_adc_get_cur12(0),
comp_adc_get_cur12(1), test_current);
// log_info("VIN0:%d,VIN1:%d,VIN2:%d\n",COMP_ADC_GET_VIN0_VOL(),comp_adc_get_vin12(0),comp_adc_get_vin12(1));
// log_info("vin_code:%d,%d,%d\n",g_adc_value_st.value[ADC_VIN0],g_adc_value_st.value[ADC_VIN1],g_adc_value_st.value[ADC_VIN2]);
// log_info("vin_dis:%d,%d\n",REG_ANALOG_VIN_DIS->bf.en1,REG_ANALOG_VIN_DIS->bf.en2);
// log_info("VIN:%d,VIN1:%d,VIN2:%d\n",COMP_ADC_GET_VIN0_VOL(),comp_adc_get_vin12(0),comp_adc_get_vin12(1));
// log_info("VIN0:%d,VIN1:%d,CUR1:%d,CU2:%d\n",comp_adc_get_vin12(0),comp_adc_get_vin12(1),comp_adc_get_cur12(0),comp_adc_get_cur12(1));
// log_info("VBUS1:%d,VBUS2:%d\n",COMP_ADC_GET_VBUS1_VOL(),COMP_ADC_GET_VBUS2_VOL());
// for(i = 0;i <= 20;i++)
// {
// log_info("adc[%d]:%d\n",i,g_adc_value_st.value[i]*2300/4095);
// }
// log_info("iout1:%d iout2:%d set_cur:%d\n", comp_adc_get_cur12(0),
// comp_adc_get_cur12(1), test_current);
// log_info("port1_protocol:0x%x\n", g_powerout_info[TYPEC_PORT1].support_protocol.byte);
// log_info("dpdn:0x%x,0x%x\n",drv_dpdn_short_staus_get(0),drv_dpdn_short_staus_get(1));
#if VD_ENABLE
comp_primary_freq_get();

6
PD_CPS8860_A1_CPS_Common_Demo/common/comp/protocol/pd_protocol/src/pd_protocol.c

@ -373,6 +373,12 @@ void send_new_capability(uint8_t port, pd_param_s*pd_param)
pd_src_cap_init(port, pd_param, need_send_cap_flag[port]);
last_send_cap_flag[port] = need_send_cap_flag[port];
// 如果当前走其他协议, 则更新完src_cap后不进行发送
if( g_powerout_info[port].protocol_type != PROTOCOL_PD )
{
return;
}
if(pd_param->pd_pe_status.pe_status != PE_SRC_Startup)
{
log_info("send_cap[%d]:%d\n",port, need_send_cap_flag[port]);

10
PD_CPS8860_A1_CPS_Common_Demo/common/comp/protocol/qc_scp_protocol/src/qc_scp_protocol.c

@ -175,7 +175,11 @@ void scp_derating_config(uint8_t port,scp_param_s *scp_param, uint8_t reg_a5)
#define AFC 0
uint8_t afc_cnt = 0;
uint8_t last_afc_val = 0;
const uint8_t AFC_PWR_CURVE[] = {0x0F, 0x46};
// 0x0f: 5V3A 0x49: 9V2A 0x79: 12V2A
// const uint8_t AFC_PWR_CURVE[] = {0x0F, 0x46};
const uint8_t AFC_PWR_CURVE[] = {0x0F, 0x49, 0x79};
/*
* @brief scp_afc_identify
* @param port
@ -309,7 +313,9 @@ void scp_power_switch(uint8_t port,scp_param_s *scp_param)
cur = scp_param->scp_app_passist.b_cur;
max_cur = get_scp_powe_curve_cur(port,scp_param->scp_app_passist.b_vol);
log_info("max_cur:%d\n", max_cur);
// 客户要求 scpb 也要加 200mA的偏置, 加在max_cur前, 防止最后过大
cur += CURRENT_0P2A;
log_info("scpb max_cur:%d\n", max_cur);
if(cur > max_cur)
{

Loading…
Cancel
Save