diff options
-rw-r--r-- | common/usb_pd_protocol.c | 30 | ||||
-rw-r--r-- | include/ec_commands.h | 17 | ||||
-rw-r--r-- | include/usb_pd.h | 4 | ||||
-rw-r--r-- | util/ectool.c | 34 |
4 files changed, 67 insertions, 18 deletions
diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c index 3350d689b7..23aae650c0 100644 --- a/common/usb_pd_protocol.c +++ b/common/usb_pd_protocol.c @@ -678,6 +678,11 @@ static void pd_update_pdo_flags(int port, uint32_t pdo) pd[port].flags |= PD_FLAGS_PARTNER_EXTPOWER; else pd[port].flags &= ~PD_FLAGS_PARTNER_EXTPOWER; + + if (pdo & PDO_FIXED_COMM_CAP) + pd[port].flags |= PD_FLAGS_PARTNER_USB_COMM; + else + pd[port].flags &= ~PD_FLAGS_PARTNER_USB_COMM; #endif if (pdo & PDO_FIXED_DATA_SWAP) @@ -3065,12 +3070,25 @@ static int hc_usb_pd_control(struct host_cmd_handler_args *args) r->state = pd[p->port].task_state; args->response_size = sizeof(*r); } else { - r_v1->enabled = pd_comm_enabled | - (pd_is_connected(p->port) << 1); - r_v1->role = pd[p->port].power_role | - (pd[p->port].data_role << 1) | - ((pd[p->port].flags & PD_FLAGS_VCONN_ON) ? - 1 << 2 : 0); + r_v1->enabled = + (pd_comm_enabled ? PD_CTRL_RESP_ENABLED_COMMS : 0) | + (pd_is_connected(p->port) ? + PD_CTRL_RESP_ENABLED_CONNECTED : 0) | + ((pd[p->port].flags & PD_FLAGS_PREVIOUS_PD_CONN) ? + PD_CTRL_RESP_ENABLED_PD_CAPABLE : 0); + r_v1->role = + (pd[p->port].power_role ? PD_CTRL_RESP_ROLE_POWER : 0) | + (pd[p->port].data_role ? PD_CTRL_RESP_ROLE_DATA : 0) | + ((pd[p->port].flags & PD_FLAGS_VCONN_ON) ? + PD_CTRL_RESP_ROLE_VCONN : 0) | + ((pd[p->port].flags & PD_FLAGS_PARTNER_DR_POWER) ? + PD_CTRL_RESP_ROLE_DR_POWER : 0) | + ((pd[p->port].flags & PD_FLAGS_PARTNER_DR_DATA) ? + PD_CTRL_RESP_ROLE_DR_DATA : 0) | + ((pd[p->port].flags & PD_FLAGS_PARTNER_USB_COMM) ? + PD_CTRL_RESP_ROLE_USB_COMM : 0) | + ((pd[p->port].flags & PD_FLAGS_PARTNER_EXTPOWER) ? + PD_CTRL_RESP_ROLE_EXT_POWERED : 0); r_v1->polarity = pd[p->port].polarity; strzcpy(r_v1->state, pd_state_names[pd[p->port].task_state], diff --git a/include/ec_commands.h b/include/ec_commands.h index 796f09eaea..3dd3e7c93a 100644 --- a/include/ec_commands.h +++ b/include/ec_commands.h @@ -3210,6 +3210,18 @@ struct ec_params_usb_pd_control { uint8_t swap; } __packed; +#define PD_CTRL_RESP_ENABLED_COMMS (1 << 0) /* Communication enabled */ +#define PD_CTRL_RESP_ENABLED_CONNECTED (1 << 1) /* Device connected */ +#define PD_CTRL_RESP_ENABLED_PD_CAPABLE (1 << 2) /* Partner is PD capable */ + +#define PD_CTRL_RESP_ROLE_POWER (1 << 0) /* 0=SNK/1=SRC */ +#define PD_CTRL_RESP_ROLE_DATA (1 << 1) /* 0=UFP/1=DFP */ +#define PD_CTRL_RESP_ROLE_VCONN (1 << 2) /* Vconn status */ +#define PD_CTRL_RESP_ROLE_DR_POWER (1 << 3) /* Partner is dualrole power */ +#define PD_CTRL_RESP_ROLE_DR_DATA (1 << 4) /* Partner is dualrole data */ +#define PD_CTRL_RESP_ROLE_USB_COMM (1 << 5) /* Partner USB comm capable */ +#define PD_CTRL_RESP_ROLE_EXT_POWERED (1 << 6) /* Partner externally powerd */ + struct ec_response_usb_pd_control { uint8_t enabled; uint8_t role; @@ -3218,9 +3230,8 @@ struct ec_response_usb_pd_control { } __packed; struct ec_response_usb_pd_control_v1 { - uint8_t enabled; /* [0] comm enabled [1] connected */ - uint8_t role; /* [0] power: 0=SNK/1=SRC [1] data: 0=UFP/1=DFP - [2] vconn 0=off/1=on */ + uint8_t enabled; + uint8_t role; uint8_t polarity; char state[32]; } __packed; diff --git a/include/usb_pd.h b/include/usb_pd.h index 5a67965853..ae11f8bc09 100644 --- a/include/usb_pd.h +++ b/include/usb_pd.h @@ -704,6 +704,7 @@ enum pd_states { #define PD_FLAGS_PARTNER_EXTPOWER (1 << 11)/* port partner has external pwr */ #define PD_FLAGS_VCONN_ON (1 << 12)/* vconn is being sourced */ #define PD_FLAGS_TRY_SRC (1 << 13)/* Try.SRC states are active */ +#define PD_FLAGS_PARTNER_USB_COMM (1 << 14)/* port partner is USB comms */ /* Flags to clear on a disconnect */ #define PD_FLAGS_RESET_ON_DISCONNECT_MASK (PD_FLAGS_PARTNER_DR_POWER | \ PD_FLAGS_PARTNER_DR_DATA | \ @@ -715,7 +716,8 @@ enum pd_states { PD_FLAGS_CHECK_DR_ROLE | \ PD_FLAGS_PARTNER_EXTPOWER | \ PD_FLAGS_VCONN_ON | \ - PD_FLAGS_TRY_SRC) + PD_FLAGS_TRY_SRC | \ + PD_FLAGS_PARTNER_USB_COMM) enum pd_cc_states { diff --git a/util/ectool.c b/util/ectool.c index 606fe3355e..dd419ceb3b 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -3992,14 +3992,32 @@ int cmd_usb_pd(int argc, char *argv[]) r->role == PD_ROLE_SOURCE ? "SRC" : "SNK", r->polarity + 1, r->state); } else { - printf("Port C%d is %s,%s, Role:%s %s%s Polarity:CC%d " - "State:%s\n", - p.port, (r_v1->enabled & 1) ? "enabled" : "disabled", - (r_v1->enabled & 2) ? "connected" : "disconnected", - r_v1->role & PD_ROLE_SOURCE ? "SRC" : "SNK", - r_v1->role & (PD_ROLE_DFP << 1) ? "DFP" : "UFP", - r_v1->role & (1 << 2) ? " VCONN" : "", - r_v1->polarity + 1, r_v1->state); + printf("Port C%d: %s, %s State:%s\n" + "Role:%s %s%s, Polarity:CC%d\n", + p.port, + (r_v1->enabled & PD_CTRL_RESP_ENABLED_COMMS) ? + "enabled" : "disabled", + (r_v1->enabled & PD_CTRL_RESP_ENABLED_CONNECTED) ? + "connected" : "disconnected", + r_v1->state, + + (r_v1->role & PD_CTRL_RESP_ROLE_POWER) ? "SRC" : "SNK", + (r_v1->role & PD_CTRL_RESP_ROLE_DATA) ? "DFP" : "UFP", + (r_v1->role & PD_CTRL_RESP_ROLE_VCONN) ? " VCONN" : "", + r_v1->polarity + 1); + + /* If connected to a PD device, then print port partner info */ + if ((r_v1->enabled & PD_CTRL_RESP_ENABLED_CONNECTED) && + (r_v1->enabled & PD_CTRL_RESP_ENABLED_PD_CAPABLE)) + printf("PD Partner Capabilities:\n%s%s%s%s", + (r_v1->role & PD_CTRL_RESP_ROLE_DR_POWER) ? + " DR power\n" : "", + (r_v1->role & PD_CTRL_RESP_ROLE_DR_DATA) ? + " DR data\n" : "", + (r_v1->role & PD_CTRL_RESP_ROLE_USB_COMM) ? + " USB capable\n" : "", + (r_v1->role & PD_CTRL_RESP_ROLE_EXT_POWERED) ? + " Externally powered\n" : ""); } return (rv < 0 ? rv : 0); } |