summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/usb_pd_protocol.c30
-rw-r--r--include/ec_commands.h17
-rw-r--r--include/usb_pd.h4
-rw-r--r--util/ectool.c34
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);
}