Skip to content

Commit 371d539

Browse files
authored
Merge pull request #473 from FrameworkComputer/hx30_PD_port_current
[modify] add port current 3A/1.5A switch setting
2 parents 9b3007e + 52bd426 commit 371d539

4 files changed

Lines changed: 144 additions & 6 deletions

File tree

.vscode/settings.json

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,2 @@
11
{
2-
"files.associations": {
3-
"*.inc": "c",
4-
"battery_smart.h": "c"
5-
}
62
}

board/hx30/cypress5525.c

Lines changed: 132 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ struct extended_msg tx_emsg[CONFIG_USB_PD_PORT_MAX_COUNT];
8686

8787
bool verbose_msg_logging;
8888
static bool firmware_update;
89+
static int pd_3a_flag;
90+
static int pd_3a_controller;
91+
static int pd_3a_port;
92+
8993

9094
void set_pd_fw_update(bool update)
9195
{
@@ -478,13 +482,15 @@ int cyp5525_setup(int controller)
478482
*/
479483

480484
int rv, data, i;
481-
#define CYPD_SETUP_CMDS_LEN 5
485+
#define CYPD_SETUP_CMDS_LEN 7
482486
struct {
483487
int reg;
484488
int value;
485489
int length;
486490
int status_reg;
487491
} const cypd_setup_cmds[] = {
492+
{ CYP5525_PD_CONTROL_REG(0), CYPD_PD_CMD_SET_TYPEC_1_5A, CYP5525_PORT0_INTR}, /* Set the port 0 PDO 1.5A */
493+
{ CYP5525_PD_CONTROL_REG(1), CYPD_PD_CMD_SET_TYPEC_1_5A, CYP5525_PORT1_INTR}, /* Set the port 1 PDO 1.5A */
488494
{ CYP5525_EVENT_MASK_REG(0), 0x7ffff, 4, CYP5525_PORT0_INTR}, /* Set the port 0 event mask */
489495
{ CYP5525_EVENT_MASK_REG(1), 0x7ffff, 4, CYP5525_PORT1_INTR }, /* Set the port 1 event mask */
490496
{ CYP5525_VDM_EC_CONTROL_REG(0), CYP5525_EXTEND_MSG_CTRL_EN, 1, CYP5525_PORT0_INTR}, /* Set the port 0 event mask */
@@ -971,6 +977,8 @@ void cyp5525_port_int(int controller, int port)
971977
pd_port_states[port_idx].current = 0;
972978
pd_port_states[port_idx].voltage = 0;
973979
pd_set_input_current_limit(port_idx, 0, 0);
980+
cypd_port_3a_release(controller, port);
981+
cypd_set_typec_profile(controller, port);
974982
cypd_update_port_state(controller, port);
975983

976984
if (IS_ENABLED(CONFIG_CHARGE_MANAGER))
@@ -979,10 +987,12 @@ void cyp5525_port_int(int controller, int port)
979987
case CYPD_RESPONSE_PD_CONTRACT_NEGOTIATION_COMPLETE:
980988
CPRINTS("CYPD_RESPONSE_PD_CONTRACT_NEGOTIATION_COMPLETE %d", port_idx);
981989
/*todo we can probably clean this up to remove some of this*/
990+
cypd_set_typec_profile(controller, port);
982991
cypd_update_port_state(controller, port);
983992
break;
984993
case CYPD_RESPONSE_PORT_CONNECT:
985994
CPRINTS("CYPD_RESPONSE_PORT_CONNECT %d", port_idx);
995+
cypd_set_typec_profile(controller, port);
986996
cypd_update_port_state(controller, port);
987997
break;
988998
case CYPD_RESPONSE_EXT_MSG_SOP_RX:
@@ -1300,6 +1310,14 @@ void cypd_interrupt_handler_task(void *p)
13001310
cypd_reconnect_port_enable(1);
13011311
}
13021312

1313+
/*
1314+
* USCI PPM RESET will make PD current setting to default
1315+
* need setting port current again
1316+
*/
1317+
if (evt & CYPD_EVT_UCSI_PPM_RESET) {
1318+
cypd_port_current_setting();
1319+
}
1320+
13031321
if (evt & CYPD_EVT_S_CHANGE) {
13041322
update_system_power_state();
13051323
}
@@ -1404,6 +1422,119 @@ void cypd_aconly_reconnect(void)
14041422
}
14051423
}
14061424

1425+
void cypd_usci_ppm_reset(void)
1426+
{
1427+
int events;
1428+
1429+
events = task_wait_event_mask(TASK_EVENT_TIMER, 50*MSEC);
1430+
if (events & TASK_EVENT_TIMER)
1431+
cypd_enque_evt(CYPD_EVT_UCSI_PPM_RESET, 0);
1432+
}
1433+
1434+
void cypd_port_current_setting(void)
1435+
{
1436+
for (int i = 0; i < PD_CHIP_COUNT; i++) {
1437+
cypd_set_typec_profile(i, 0);
1438+
cypd_set_typec_profile(i, 1);
1439+
}
1440+
}
1441+
1442+
int cypd_port_3a_status(int controller, int port)
1443+
{
1444+
int port_idx = (controller << 1) + port;
1445+
1446+
if (pd_3a_flag &&
1447+
controller == pd_3a_controller &&
1448+
port_idx == pd_3a_port)
1449+
return true;
1450+
return false;
1451+
}
1452+
1453+
void cypd_port_3a_release(int controller, int port)
1454+
{
1455+
if (cypd_port_3a_status(controller, port)) {
1456+
pd_3a_flag = 0;
1457+
CPRINTS("CYPD release 3A");
1458+
}
1459+
}
1460+
1461+
void cypd_set_port_3a(int controller, int port)
1462+
{
1463+
int port_idx = (controller << 1) + port;
1464+
1465+
pd_3a_flag = 1;
1466+
pd_3a_controller = controller;
1467+
pd_3a_port = port_idx;
1468+
}
1469+
1470+
void cypd_set_typec_profile(int controller, int port)
1471+
{
1472+
int rv;
1473+
uint8_t pd_status_reg[4];
1474+
uint8_t rdo_reg[4];
1475+
1476+
int typec_status_reg;
1477+
int rdo_max_current = 0;
1478+
int port_idx = (controller << 1) + port;
1479+
1480+
rv = cypd_read_reg8(controller, CYP5525_TYPE_C_STATUS_REG(port), &typec_status_reg);
1481+
if (rv != EC_SUCCESS)
1482+
CPRINTS("CYP5525_TYPE_C_STATUS_REG failed");
1483+
pd_port_states[port_idx].c_state = (typec_status_reg >> 2) & 0x7;
1484+
1485+
/* if port no device connect set type c profile to 1.5A */
1486+
if (pd_port_states[port_idx].c_state == CYPD_STATUS_NOTHING) {
1487+
cypd_write_reg8(controller, CYP5525_PD_CONTROL_REG(port), CYPD_PD_CMD_SET_TYPEC_1_5A);
1488+
return;
1489+
}
1490+
1491+
rv = cypd_read_reg_block(controller, CYP5525_PD_STATUS_REG(port), pd_status_reg, 4);
1492+
if (rv != EC_SUCCESS)
1493+
CPRINTS("CYP5525_PD_STATUS_REG failed");
1494+
pd_port_states[port_idx].pd_state = pd_status_reg[1] & BIT(2) ? 1 : 0; /*do we have a valid PD contract*/
1495+
pd_port_states[port_idx].power_role = pd_status_reg[1] & BIT(0) ? PD_ROLE_SOURCE : PD_ROLE_SINK;
1496+
pd_port_states[port_idx].data_role = pd_status_reg[0] & BIT(6) ? PD_ROLE_DFP : PD_ROLE_UFP;
1497+
pd_port_states[port_idx].vconn = pd_status_reg[1] & BIT(5) ? PD_ROLE_VCONN_SRC : PD_ROLE_VCONN_OFF;
1498+
1499+
if (pd_port_states[port_idx].power_role == PD_ROLE_SINK)
1500+
return;
1501+
1502+
if (pd_port_states[port_idx].power_role == PD_ROLE_SOURCE) {
1503+
if (pd_port_states[port_idx].pd_state) {
1504+
/*
1505+
* first time set 3A PDO to device
1506+
* when device request RDO <= 1.5A
1507+
* resend 1.5A pdo to device
1508+
*/
1509+
if (!pd_3a_flag)
1510+
cypd_write_reg8(controller, CYP5525_SELECT_SOURCE_PDO_REG(port), CYPD_PD_CMD_SET_TYPEC_3A);
1511+
else
1512+
cypd_write_reg8(controller, CYP5525_SELECT_SOURCE_PDO_REG(port), CYPD_PD_CMD_SET_TYPEC_1_5A);
1513+
1514+
cypd_read_reg_block(controller, CYP5525_CURRENT_RDO_REG(port), rdo_reg, 4);
1515+
rdo_max_current = (((rdo_reg[1]>>2) + (rdo_reg[2]<<6)) & 0x3FF)*10;
1516+
1517+
if (rdo_max_current <= 1500) {
1518+
cypd_write_reg8(controller, CYP5525_PD_CONTROL_REG(port), CYPD_PD_CMD_SET_TYPEC_1_5A);
1519+
cypd_write_reg8(controller, CYP5525_SELECT_SOURCE_PDO_REG(port), CYPD_PD_CMD_SET_TYPEC_1_5A);
1520+
} else if (!pd_3a_flag) {
1521+
cypd_set_port_3a(controller, port);
1522+
cypd_write_reg8(controller, CYP5525_PD_CONTROL_REG(port), CYPD_PD_CMD_SET_TYPEC_3A);
1523+
cypd_write_reg8(controller, CYP5525_SELECT_SOURCE_PDO_REG(port), CYPD_PD_CMD_SET_TYPEC_3A);
1524+
} else if (cypd_port_3a_status(controller, port)) {
1525+
cypd_write_reg8(controller, CYP5525_PD_CONTROL_REG(port), CYPD_PD_CMD_SET_TYPEC_3A);
1526+
cypd_write_reg8(controller, CYP5525_SELECT_SOURCE_PDO_REG(port), CYPD_PD_CMD_SET_TYPEC_3A);
1527+
} else {
1528+
cypd_write_reg8(controller, CYP5525_PD_CONTROL_REG(port), CYPD_PD_CMD_SET_TYPEC_1_5A);
1529+
cypd_write_reg8(controller, CYP5525_SELECT_SOURCE_PDO_REG(port), CYPD_PD_CMD_SET_TYPEC_1_5A);
1530+
}
1531+
} else {
1532+
cypd_write_reg8(controller, CYP5525_PD_CONTROL_REG(port), CYPD_PD_CMD_SET_TYPEC_1_5A);
1533+
}
1534+
}
1535+
}
1536+
1537+
14071538
int cypd_get_pps_power_budget(void)
14081539
{
14091540
/* TODO:

board/hx30/cypress5525.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,8 @@ enum pd_task_evt {
406406
CYPD_EVT_RETIMER_PWR = BIT(9),
407407
CYPD_EVT_UPDATE_PWRSTAT = BIT(10),
408408
CYPD_EVT_PORT_ENABLE = BIT(11),
409-
CYPD_EVT_PORT_DISABLE = BIT(12)
409+
CYPD_EVT_PORT_DISABLE = BIT(12),
410+
CYPD_EVT_UCSI_PPM_RESET = BIT(13),
410411
};
411412

412413
/* PD CHIP */
@@ -465,4 +466,13 @@ void cypd_aconly_reconnect(void);
465466
int cypd_reconnect_port_enable(int controller);
466467

467468
int cypd_reconnect_port_disable(int controller);
469+
470+
void cypd_set_typec_profile(int controller, int port);
471+
472+
void cypd_usci_ppm_reset(void);
473+
474+
void cypd_port_current_setting(void);
475+
476+
void cypd_port_3a_release(int controller, int port);
477+
468478
#endif /* __CROS_EC_CYPRESS5525_H */

board/hx30/ucsi.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ int ucsi_write_tunnel(void)
9494
cypd_print_buff("UCSI Msg Out: ", message_out, 6);
9595
}
9696
if (*command == UCSI_CMD_PPM_RESET) {
97+
cypd_usci_ppm_reset();
9798
CPRINTS("UCSI PPM_RESET");
9899
}
99100

0 commit comments

Comments
 (0)