summaryrefslogtreecommitdiff
path: root/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h
diff options
context:
space:
mode:
Diffstat (limited to 'zephyr/include/emul/tcpc/emul_tcpci_partner_common.h')
-rw-r--r--zephyr/include/emul/tcpc/emul_tcpci_partner_common.h161
1 files changed, 161 insertions, 0 deletions
diff --git a/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h b/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h
new file mode 100644
index 0000000000..0275161d73
--- /dev/null
+++ b/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h
@@ -0,0 +1,161 @@
+/* Copyright 2021 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/**
+ * @file
+ *
+ * @brief Common code used by TCPCI partner device emulators
+ */
+
+#ifndef __EMUL_TCPCI_PARTNER_COMMON_H
+#define __EMUL_TCPCI_PARTNER_COMMON_H
+
+#include <emul.h>
+#include "emul/tcpc/emul_tcpci.h"
+
+#include "ec_commands.h"
+#include "usb_pd.h"
+
+/**
+ * @brief Common code used by TCPCI partner device emulators
+ * @defgroup tcpci_partner Common code for TCPCI partner device emulators
+ * @{
+ *
+ * Common code for TCPCI partner device emulators allows to send SOP messages
+ * in generic way using optional delay.
+ */
+
+/** Common data for TCPCI partner device emulators */
+struct tcpci_partner_data {
+ /** Work used to send message with delay */
+ struct k_work_delayable delayed_send;
+ /** Pointer to connected TCPCI emulator */
+ const struct emul *tcpci_emul;
+ /** Queue for delayed messages */
+ sys_slist_t to_send;
+ /** Mutex for to_send queue */
+ struct k_mutex to_send_mutex;
+ /** Next SOP message id */
+ int msg_id;
+ /** Power role (used in message header) */
+ enum pd_power_role power_role;
+ /** Data role (used in message header) */
+ enum pd_data_role data_role;
+ /** Revision (used in message header) */
+ enum pd_rev_type rev;
+};
+
+/** Structure of message used by TCPCI partner emulator */
+struct tcpci_partner_msg {
+ /** Reserved for sys_slist_* usage */
+ sys_snode_t node;
+ /** TCPCI emulator message */
+ struct tcpci_emul_msg msg;
+ /** Time when message should be sent if message is delayed */
+ uint64_t time;
+ /** Type of the message */
+ int type;
+ /** Number of data objects */
+ int data_objects;
+};
+
+/**
+ * @brief Initialise common TCPCI partner emulator. Need to be called before
+ * any other function.
+ *
+ * @param data Pointer to USB-C charger emulator
+ */
+void tcpci_partner_init(struct tcpci_partner_data *data);
+
+/**
+ * @brief Allocate message with space for header and given number of data
+ * objects. Type of message is set to TCPCI_MSG_SOP by default.
+ *
+ * @param data_objects Number of data objects in message
+ *
+ * @return Pointer to new message on success
+ * @return NULL on error
+ */
+struct tcpci_partner_msg *tcpci_partner_alloc_msg(int data_objects);
+
+/**
+ * @brief Free message's memory
+ *
+ * @param msg Pointer to message
+ */
+void tcpci_partner_free_msg(struct tcpci_partner_msg *msg);
+
+/**
+ * @brief Set header of the message
+ *
+ * @param data Pointer to TCPCI partner emulator
+ * @param msg Pointer to message
+ */
+void tcpci_partner_set_header(struct tcpci_partner_data *data,
+ struct tcpci_partner_msg *msg);
+
+/**
+ * @brief Send message to TCPCI emulator or schedule message. On error message
+ * is freed.
+ *
+ * @param data Pointer to TCPCI partner emulator
+ * @param msg Pointer to message to send
+ * @param delay Optional delay
+ *
+ * @return 0 on success
+ * @return negative on failure
+ */
+int tcpci_partner_send_msg(struct tcpci_partner_data *data,
+ struct tcpci_partner_msg *msg, uint64_t delay);
+
+/**
+ * @brief Send control message with optional delay
+ *
+ * @param data Pointer to TCPCI partner emulator
+ * @param type Type of message
+ * @param delay Optional delay
+ *
+ * @return 0 on success
+ * @return -ENOMEM when there is no free memory for message
+ * @return negative on failure
+ */
+int tcpci_partner_send_control_msg(struct tcpci_partner_data *data,
+ enum pd_ctrl_msg_type type,
+ uint64_t delay);
+
+/**
+ * @brief Send data message with optional delay. Data objects are copied to
+ * message.
+ *
+ * @param data Pointer to TCPCI partner emulator
+ * @param type Type of message
+ * @param data_obj Pointer to array of data objects
+ * @param data_obj_num Number of data objects
+ * @param delay Optional delay
+ *
+ * @return 0 on success
+ * @return -ENOMEM when there is no free memory for message
+ * @return negative on failure
+ */
+int tcpci_partner_send_data_msg(struct tcpci_partner_data *data,
+ enum pd_data_msg_type type,
+ uint32_t *data_obj, int data_obj_num,
+ uint64_t delay);
+
+/**
+ * @brief Remove all messages that are in delayed message queue
+ *
+ * @param data Pointer to TCPCI partner emulator
+ *
+ * @return 0 on success
+ * @return negative on failure
+ */
+int tcpci_partner_clear_msg_queue(struct tcpci_partner_data *data);
+
+/**
+ * @}
+ */
+
+#endif /* __EMUL_TCPCI_PARTNER_COMMON_H */