summaryrefslogtreecommitdiff
path: root/zephyr/emul/tcpc/emul_tcpci_partner_snk.c
diff options
context:
space:
mode:
Diffstat (limited to 'zephyr/emul/tcpc/emul_tcpci_partner_snk.c')
-rw-r--r--zephyr/emul/tcpc/emul_tcpci_partner_snk.c88
1 files changed, 48 insertions, 40 deletions
diff --git a/zephyr/emul/tcpc/emul_tcpci_partner_snk.c b/zephyr/emul/tcpc/emul_tcpci_partner_snk.c
index 7ae3662170..8d0fe1fa1e 100644
--- a/zephyr/emul/tcpc/emul_tcpci_partner_snk.c
+++ b/zephyr/emul/tcpc/emul_tcpci_partner_snk.c
@@ -1,4 +1,4 @@
-/* Copyright 2021 The Chromium OS Authors. All rights reserved.
+/* Copyright 2021 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
@@ -7,7 +7,7 @@
LOG_MODULE_REGISTER(tcpci_snk_emul, CONFIG_TCPCI_EMUL_LOG_LEVEL);
#include <zephyr/sys/byteorder.h>
-#include <zephyr/zephyr.h>
+#include <zephyr/kernel.h>
#include "common.h"
#include "emul/tcpc/emul_tcpci.h"
@@ -16,9 +16,9 @@ LOG_MODULE_REGISTER(tcpci_snk_emul, CONFIG_TCPCI_EMUL_LOG_LEVEL);
#include "usb_pd.h"
/** Length of PDO, RDO and BIST request object in SOP message in bytes */
-#define TCPCI_MSG_DO_LEN 4
+#define TCPCI_MSG_DO_LEN 4
/** Length of header in SOP message in bytes */
-#define TCPCI_MSG_HEADER_LEN 2
+#define TCPCI_MSG_HEADER_LEN 2
/**
* @brief Get number of PDOs that will be present in sink capability message
@@ -51,18 +51,17 @@ static int tcpci_snk_emul_num_of_pdos(struct tcpci_snk_emul_data *data)
* @return -ENOMEM when there is no free memory for message
* @return -EINVAL on TCPCI emulator add RX message error
*/
-static int tcpci_snk_emul_send_capability_msg(
- struct tcpci_snk_emul_data *data,
- struct tcpci_partner_data *common_data,
- uint64_t delay)
+static int
+tcpci_snk_emul_send_capability_msg(struct tcpci_snk_emul_data *data,
+ struct tcpci_partner_data *common_data,
+ uint64_t delay)
{
int pdos;
/* Find number of PDOs */
pdos = tcpci_snk_emul_num_of_pdos(data);
- return tcpci_partner_send_data_msg(common_data,
- PD_DATA_SINK_CAP,
+ return tcpci_partner_send_data_msg(common_data, PD_DATA_SINK_CAP,
data->pdo, pdos, delay);
}
@@ -95,8 +94,8 @@ static int tcpci_snk_emul_are_pdos_complementary(uint32_t src_pdo,
/* Voltage doesn't match */
return -1;
}
- missing_current = PDO_FIXED_CURRENT(snk_pdo) -
- PDO_FIXED_CURRENT(src_pdo);
+ missing_current =
+ PDO_FIXED_CURRENT(snk_pdo) - PDO_FIXED_CURRENT(src_pdo);
break;
case PDO_TYPE_BATTERY:
if ((PDO_BATT_MIN_VOLTAGE(snk_pdo) <
@@ -111,8 +110,8 @@ static int tcpci_snk_emul_are_pdos_complementary(uint32_t src_pdo,
* = P / V * 5 [A] = P / V * 500 * 10[mA]
*/
missing_current = (PDO_BATT_MAX_POWER(snk_pdo) -
- PDO_BATT_MAX_POWER(src_pdo)) * 500 /
- PDO_BATT_MAX_VOLTAGE(src_pdo);
+ PDO_BATT_MAX_POWER(src_pdo)) *
+ 500 / PDO_BATT_MAX_VOLTAGE(src_pdo);
break;
case PDO_TYPE_VARIABLE:
if ((PDO_VAR_MIN_VOLTAGE(snk_pdo) <
@@ -147,8 +146,8 @@ static int tcpci_snk_emul_are_pdos_complementary(uint32_t src_pdo,
* @return PDO on success
* @return 0 when there is no PDO of given index in message
*/
-static uint32_t tcpci_snk_emul_get_pdo_from_cap(
- const struct tcpci_emul_msg *msg, int pdo_num)
+static uint32_t
+tcpci_snk_emul_get_pdo_from_cap(const struct tcpci_emul_msg *msg, int pdo_num)
{
int addr;
@@ -240,10 +239,10 @@ static uint32_t tcpci_snk_emul_create_rdo(uint32_t src_pdo, uint32_t snk_pdo,
* @param common_data Pointer to common TCPCI partner data
* @param msg Source capability message
*/
-static void tcpci_snk_emul_handle_source_cap(
- struct tcpci_snk_emul_data *data,
- struct tcpci_partner_data *common_data,
- const struct tcpci_emul_msg *msg)
+static void
+tcpci_snk_emul_handle_source_cap(struct tcpci_snk_emul_data *data,
+ struct tcpci_partner_data *common_data,
+ const struct tcpci_emul_msg *msg)
{
uint32_t rdo = 0;
uint32_t pdo;
@@ -263,17 +262,22 @@ static void tcpci_snk_emul_handle_source_cap(
snk_pdos = tcpci_snk_emul_num_of_pdos(data);
src_pdos = (msg->cnt - TCPCI_MSG_HEADER_LEN) / TCPCI_MSG_DO_LEN;
+ /*
+ * Store the 5V fixed PDO for future reference (required to be index 0
+ * by spec)
+ */
+ data->last_5v_source_cap = tcpci_snk_emul_get_pdo_from_cap(msg, 0);
+
/* Find if any source PDO satisfy any sink PDO */
for (int pdo_num = 0; pdo_num < src_pdos; pdo_num++) {
pdo = tcpci_snk_emul_get_pdo_from_cap(msg, pdo_num);
for (int i = skip_first_pdo; i < snk_pdos; i++) {
missing_current = tcpci_snk_emul_are_pdos_complementary(
- pdo, data->pdo[i]);
+ pdo, data->pdo[i]);
if (missing_current == 0) {
- rdo = tcpci_snk_emul_create_rdo(pdo,
- data->pdo[i],
- pdo_num + 1);
+ rdo = tcpci_snk_emul_create_rdo(
+ pdo, data->pdo[i], pdo_num + 1);
break;
}
}
@@ -350,6 +354,11 @@ void tcpci_snk_emul_clear_alert_received(struct tcpci_snk_emul_data *data)
data->alert_received = false;
}
+void tcpci_snk_emul_clear_last_5v_cap(struct tcpci_snk_emul_data *data)
+{
+ data->last_5v_source_cap = 0;
+}
+
/**
* @brief Handle SOP messages as TCPCI sink device. It handles source cap,
* get sink cap and ping messages. Accept, Reject and PS_RDY are handled
@@ -363,10 +372,10 @@ void tcpci_snk_emul_clear_alert_received(struct tcpci_snk_emul_data *data)
* @param TCPCI_PARTNER_COMMON_MSG_HANDLED Message was handled
* @param TCPCI_PARTNER_COMMON_MSG_NOT_HANDLED Message wasn't handled
*/
-static enum tcpci_partner_handler_res tcpci_snk_emul_handle_sop_msg(
- struct tcpci_partner_extension *ext,
- struct tcpci_partner_data *common_data,
- const struct tcpci_emul_msg *msg)
+static enum tcpci_partner_handler_res
+tcpci_snk_emul_handle_sop_msg(struct tcpci_partner_extension *ext,
+ struct tcpci_partner_data *common_data,
+ const struct tcpci_emul_msg *msg)
{
struct tcpci_snk_emul_data *data =
CONTAINER_OF(ext, struct tcpci_snk_emul_data, ext);
@@ -404,20 +413,19 @@ static enum tcpci_partner_handler_res tcpci_snk_emul_handle_sop_msg(
__ASSERT(data->wait_for_ps_rdy,
"Unexpected PS RDY message");
tcpci_snk_emul_stop_partner_transition_timer(
- data, common_data);
+ data, common_data);
data->pd_completed = true;
return TCPCI_PARTNER_COMMON_MSG_HANDLED;
case PD_CTRL_REJECT:
tcpci_partner_stop_sender_response_timer(common_data);
/* Request rejected. Ask for capabilities again. */
- tcpci_partner_send_control_msg(common_data,
- PD_CTRL_GET_SOURCE_CAP,
- 0);
+ tcpci_partner_send_control_msg(
+ common_data, PD_CTRL_GET_SOURCE_CAP, 0);
return TCPCI_PARTNER_COMMON_MSG_HANDLED;
case PD_CTRL_ACCEPT:
tcpci_partner_stop_sender_response_timer(common_data);
tcpci_snk_emul_start_partner_transition_timer(
- data, common_data);
+ data, common_data);
return TCPCI_PARTNER_COMMON_MSG_HANDLED;
default:
return TCPCI_PARTNER_COMMON_MSG_NOT_HANDLED;
@@ -459,9 +467,9 @@ static void tcpci_snk_emul_hard_reset(struct tcpci_partner_extension *ext,
* @return 0 on success
* @return negative on TCPCI connect error
*/
-static int tcpci_snk_emul_connect_to_tcpci(
- struct tcpci_partner_extension *ext,
- struct tcpci_partner_data *common_data)
+static int
+tcpci_snk_emul_connect_to_tcpci(struct tcpci_partner_extension *ext,
+ struct tcpci_partner_data *common_data)
{
struct tcpci_snk_emul_data *data =
CONTAINER_OF(ext, struct tcpci_snk_emul_data, ext);
@@ -489,10 +497,10 @@ struct tcpci_partner_extension_ops tcpci_snk_emul_ops = {
.connect = tcpci_snk_emul_connect_to_tcpci,
};
-struct tcpci_partner_extension *tcpci_snk_emul_init(
- struct tcpci_snk_emul_data *data,
- struct tcpci_partner_data *common_data,
- struct tcpci_partner_extension *ext)
+struct tcpci_partner_extension *
+tcpci_snk_emul_init(struct tcpci_snk_emul_data *data,
+ struct tcpci_partner_data *common_data,
+ struct tcpci_partner_extension *ext)
{
struct tcpci_partner_extension *snk_ext = &data->ext;