summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlschyi <lschyi@google.com>2022-09-15 16:04:59 +0800
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-10-05 11:02:19 +0000
commit0f0c4f11a35dbf26d0b230bf1bf52c1301378f14 (patch)
treea381f93df9ac6fd788609f819556dffdc927a0af
parent284362b55afed23932d3d55a09d7b39ac1e322a8 (diff)
downloadchrome-ec-0f0c4f11a35dbf26d0b230bf1bf52c1301378f14.tar.gz
zephyr: add anx7447 emulator
Add basic ANX7447 TCPC emulator, along with KConfig option, dts binding, and can be found in the TCPC shim code. BUG=b:244232583 TEST=none BRANCH=none Signed-off-by: lschyi <lschyi@google.com> Change-Id: Idac771d92de526abf0796015fab6d473dae5502e Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3905448 Reviewed-by: Jeremy Bettis <jbettis@chromium.org> Commit-Queue: Sung-Chi Li <lschyi@chromium.org> Code-Coverage: Zoss <zoss-cl-coverage@prod.google.com> Tested-by: Sung-Chi Li <lschyi@chromium.org>
-rw-r--r--zephyr/dts/bindings/emul/cros,anx7447-tcpc.yaml16
-rw-r--r--zephyr/emul/tcpc/CMakeLists.txt1
-rw-r--r--zephyr/emul/tcpc/Kconfig7
-rw-r--r--zephyr/emul/tcpc/emul_anx7447.c167
-rw-r--r--zephyr/shim/include/usbc/tcpc_anx7447_emul.h19
-rw-r--r--zephyr/shim/src/tcpc.c13
6 files changed, 218 insertions, 5 deletions
diff --git a/zephyr/dts/bindings/emul/cros,anx7447-tcpc.yaml b/zephyr/dts/bindings/emul/cros,anx7447-tcpc.yaml
new file mode 100644
index 0000000000..562485d03d
--- /dev/null
+++ b/zephyr/dts/bindings/emul/cros,anx7447-tcpc.yaml
@@ -0,0 +1,16 @@
+# Copyright 2022 The ChromiumOS Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+description: Zephyr ANX7447 emulator
+
+compatible: "cros,anx7447-emul"
+
+include: i2c-device.yaml
+
+properties:
+ tcpc-flags:
+ type: int
+ default: 0
+ description: |
+ TCPC configuration flags
diff --git a/zephyr/emul/tcpc/CMakeLists.txt b/zephyr/emul/tcpc/CMakeLists.txt
index b43d73ead3..8c011229f2 100644
--- a/zephyr/emul/tcpc/CMakeLists.txt
+++ b/zephyr/emul/tcpc/CMakeLists.txt
@@ -10,3 +10,4 @@ zephyr_library_sources_ifdef(CONFIG_EMUL_TCPCI_PARTNER_DRP emul_tcpci_partner_dr
zephyr_library_sources_ifdef(CONFIG_EMUL_TCPCI_PARTNER_SNK emul_tcpci_partner_snk.c)
zephyr_library_sources_ifdef(CONFIG_EMUL_TCPCI_PARTNER_SRC emul_tcpci_partner_src.c)
zephyr_library_sources_ifdef(CONFIG_EMUL_TCPCI_PARTNER_FAULTY_EXT emul_tcpci_partner_faulty_ext.c)
+zephyr_library_sources_ifdef(CONFIG_EMUL_ANX7447 emul_anx7447.c)
diff --git a/zephyr/emul/tcpc/Kconfig b/zephyr/emul/tcpc/Kconfig
index 6866e7bab5..521d2d83b1 100644
--- a/zephyr/emul/tcpc/Kconfig
+++ b/zephyr/emul/tcpc/Kconfig
@@ -19,6 +19,13 @@ module = TCPCI_EMUL
module-str = tcpci_emul
source "subsys/logging/Kconfig.template.log_config"
+config EMUL_ANX7447
+ bool "Anologix ANX7447 emulator"
+ help
+ Enable emulator for ANX7447 of TCPM. This emulator is extension for
+ TCPCI emulator. ANX7447 specific API is available in
+ zephyr/include/emul/tpcp/emul_anx7447.h
+
config EMUL_TCPCI_PARTNER_COMMON
bool
help
diff --git a/zephyr/emul/tcpc/emul_anx7447.c b/zephyr/emul/tcpc/emul_anx7447.c
new file mode 100644
index 0000000000..6a351a4182
--- /dev/null
+++ b/zephyr/emul/tcpc/emul_anx7447.c
@@ -0,0 +1,167 @@
+/* Copyright 2022 The ChromiumOS Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#define DT_DRV_COMPAT cros_anx7447_emul
+
+#include <zephyr/logging/log.h>
+LOG_MODULE_REGISTER(anx7447_emul, CONFIG_TCPCI_EMUL_LOG_LEVEL);
+
+#include <zephyr/device.h>
+#include <zephyr/drivers/emul.h>
+#include <zephyr/drivers/i2c.h>
+#include <zephyr/drivers/i2c_emul.h>
+#include <zephyr/ztest.h>
+
+#include "tcpm/tcpci.h"
+#include "emul/emul_stub_device.h"
+
+#include "emul/emul_common_i2c.h"
+#include "emul/tcpc/emul_tcpci.h"
+
+/**
+ * @brief Function called for each byte of read message from anx7447 emulator
+ *
+ * @param emul Pointer to I2C anx7447 emulator
+ * @param reg First byte of last write message
+ * @param val Pointer where byte to read should be stored
+ * @param bytes Number of bytes already read
+ *
+ * @return 0 on success
+ * @return -EIO on invalid read request
+ */
+static int anx7447_emul_read_byte(const struct emul *emul, int reg,
+ uint8_t *val, int bytes)
+{
+ return tcpci_emul_read_byte(emul, reg, val, bytes);
+}
+
+/**
+ * @brief Function called for each byte of write message to anx7447 emulator
+ *
+ * @param emul Pointer to I2C anx7447 emulator
+ * @param reg First byte of write message
+ * @param val Received byte of write message
+ * @param bytes Number of bytes already received
+ *
+ * @return 0 on success
+ * @return -EIO on invalid write request
+ */
+static int anx7447_emul_write_byte(const struct emul *emul, int reg,
+ uint8_t val, int bytes)
+{
+ return tcpci_emul_write_byte(emul, reg, val, bytes);
+}
+
+/**
+ * @brief Function called on the end of write message to anx7447 emulator
+ *
+ * @param emul Pointer to I2C anx7447 emulator
+ * @param reg Register which is written
+ * @param msg_len Length of handled I2C message
+ *
+ * @return 0 on success
+ * @return -EIO on error
+ */
+static int anx7447_emul_finish_write(const struct emul *emul, int reg,
+ int msg_len)
+{
+ return tcpci_emul_handle_write(emul, reg, msg_len);
+}
+
+/**
+ * @brief Get currently accessed register, which always equals to selected
+ * register from anx7447 emulator.
+ *
+ * @param emul Pointer to I2C anx7447 emulator
+ * @param reg First byte of last write message
+ * @param bytes Number of bytes already handled from current message
+ * @param read If currently handled is read message
+ *
+ * @return Currently accessed register
+ */
+static int anx7447_emul_access_reg(const struct emul *emul, int reg, int bytes,
+ bool read)
+{
+ return reg;
+}
+
+/**
+ * @brief Function called on reset
+ *
+ * @param emul Pointer to anx7447 emulator
+ */
+static void anx7447_emul_reset(const struct emul *emul)
+{
+ tcpci_emul_reset(emul);
+}
+
+/**
+ * @brief Set up a new anx7447 emulator
+ *
+ * This should be called for each anx7447 device that needs to be
+ * emulated.
+ *
+ * @param emul Emulation information
+ * @param parent Device to emulate
+ *
+ * @return 0 indicating success (always)
+ */
+static int anx7447_emul_init(const struct emul *emul,
+ const struct device *parent)
+{
+ struct tcpc_emul_data *tcpc_data = emul->data;
+ struct tcpci_ctx *tcpci_ctx = tcpc_data->tcpci_ctx;
+ const struct device *i2c_dev;
+
+ i2c_dev = parent;
+
+ tcpci_ctx->common.write_byte = anx7447_emul_write_byte;
+ tcpci_ctx->common.finish_write = anx7447_emul_finish_write;
+ tcpci_ctx->common.read_byte = anx7447_emul_read_byte;
+ tcpci_ctx->common.access_reg = anx7447_emul_access_reg;
+
+ tcpci_emul_i2c_init(emul, i2c_dev);
+
+ anx7447_emul_reset(emul);
+
+ return 0;
+}
+
+static int i2c_anx7447_emul_transfer(const struct emul *target,
+ struct i2c_msg *msgs, int num_msgs,
+ int addr)
+{
+ struct tcpc_emul_data *tcpc_data = target->data;
+ struct tcpci_ctx *tcpci_ctx = tcpc_data->tcpci_ctx;
+
+ return i2c_common_emul_transfer_workhorse(target, &tcpci_ctx->common,
+ &tcpc_data->i2c_cfg, msgs,
+ num_msgs, addr);
+}
+
+struct i2c_emul_api i2c_anx7447_emul_api = {
+ .transfer = i2c_anx7447_emul_transfer,
+};
+
+#define ANX7447_EMUL(n) \
+ TCPCI_EMUL_DEFINE(n, anx7447_emul_init, NULL, NULL, \
+ &i2c_anx7447_emul_api)
+
+DT_INST_FOREACH_STATUS_OKAY(ANX7447_EMUL)
+
+#ifdef CONFIG_ZTEST_NEW_API
+#define ANX7447_EMUL_RESET_RULE_BEFORE(n) \
+ anx7447_emul_reset(EMUL_DT_GET(DT_DRV_INST(n)))
+static void anx7447_emul_reset_rule_before(const struct ztest_unit_test *test,
+ void *data)
+{
+ ARG_UNUSED(test);
+ ARG_UNUSED(data);
+ DT_INST_FOREACH_STATUS_OKAY(ANX7447_EMUL_RESET_RULE_BEFORE);
+}
+ZTEST_RULE(ANX7447_emul_reset, anx7447_emul_reset_rule_before, NULL);
+#endif /* CONFIG_ZTEST_NEW_API */
+
+DT_INST_FOREACH_STATUS_OKAY(EMUL_STUB_DEVICE);
diff --git a/zephyr/shim/include/usbc/tcpc_anx7447_emul.h b/zephyr/shim/include/usbc/tcpc_anx7447_emul.h
new file mode 100644
index 0000000000..78322a7329
--- /dev/null
+++ b/zephyr/shim/include/usbc/tcpc_anx7447_emul.h
@@ -0,0 +1,19 @@
+/* Copyright 2022 The ChromiumOS Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include <zephyr/devicetree.h>
+#include "driver/tcpm/anx7447_public.h"
+
+#define ANX7447_EMUL_COMPAT cros_anx7447_emul
+
+#define TCPC_CONFIG_ANX7447_EMUL(id) \
+ { \
+ .bus_type = EC_BUS_TYPE_I2C, \
+ .i2c_info = { \
+ .port = I2C_PORT_BY_DEV(id), \
+ .addr_flags = DT_REG_ADDR(id), \
+ }, \
+ .drv = &anx7447_tcpm_drv, \
+ },
diff --git a/zephyr/shim/src/tcpc.c b/zephyr/shim/src/tcpc.c
index cdeeb4771b..ba251a196b 100644
--- a/zephyr/shim/src/tcpc.c
+++ b/zephyr/shim/src/tcpc.c
@@ -8,6 +8,7 @@
#include "usb_pd_tcpm.h"
#include "usb_pd.h"
#include "usbc/tcpc_anx7447.h"
+#include "usbc/tcpc_anx7447_emul.h"
#include "usbc/tcpc_ccgxxf.h"
#include "usbc/tcpc_fusb302.h"
#include "usbc/tcpc_generic_emul.h"
@@ -34,11 +35,13 @@
(TCPC_CHIP_ENTRY(usbc_id, tcpc_id, config_fn)), ())
#ifdef TEST_BUILD
-#define TCPC_CHIP_FIND_EMUL(usbc_id, tcpc_id) \
- CHECK_COMPAT(TCPCI_EMUL_COMPAT, usbc_id, tcpc_id, \
- TCPC_CONFIG_TCPCI_EMUL) \
- CHECK_COMPAT(PS8XXX_EMUL_COMPAT, usbc_id, tcpc_id, \
- TCPC_CONFIG_PS8XXX_EMUL)
+#define TCPC_CHIP_FIND_EMUL(usbc_id, tcpc_id) \
+ CHECK_COMPAT(TCPCI_EMUL_COMPAT, usbc_id, tcpc_id, \
+ TCPC_CONFIG_TCPCI_EMUL) \
+ CHECK_COMPAT(PS8XXX_EMUL_COMPAT, usbc_id, tcpc_id, \
+ TCPC_CONFIG_PS8XXX_EMUL) \
+ CHECK_COMPAT(ANX7447_EMUL_COMPAT, usbc_id, tcpc_id, \
+ TCPC_CONFIG_ANX7447_EMUL)
#else
#define TCPC_CHIP_FIND_EMUL(...)
#endif /* TEST_BUILD */