summaryrefslogtreecommitdiff
path: root/zephyr/test/drivers/i2c_controller/src/i2c_controller.c
diff options
context:
space:
mode:
authorYH Lin <yueherngl@google.com>2022-11-30 21:44:08 +0000
committerYH Lin <yueherngl@google.com>2022-11-30 21:44:08 +0000
commitaf25602b15b22b9ef5821dcba9934311f2157c48 (patch)
treed0c89ae8814c2ba35c238c6c0644ec6b1602c63a /zephyr/test/drivers/i2c_controller/src/i2c_controller.c
parent54462f034b635260dd09173b3d082e47fc960ef3 (diff)
parentaa40b859b3a73e5a205bc561c1a29eff38485461 (diff)
downloadchrome-ec-af25602b15b22b9ef5821dcba9934311f2157c48.tar.gz
Merge remote-tracking branch cros/main into factory-brya-14517.B-main
Generated by: util/update_release_branch.py --baseboard brya --relevant_paths_file baseboard/brya/relevant-paths.txt factory-brya-14517.B-main Relevant changes: git log --oneline 54462f034b..aa40b859b3 -- baseboard/brya board/agah board/anahera board/banshee board/brya board/crota board/felwinter board/gimble board/kano board/mithrax board/osiris board/primus board/redrix board/taeko board/taniks board/vell board/volmar driver/bc12/pi3usb9201_public.* driver/charger/bq25710.* driver/ppc/nx20p348x.* driver/ppc/syv682x_public.* driver/retimer/bb_retimer_public.* driver/tcpm/nct38xx.* driver/tcpm/ps8xxx_public.* driver/tcpm/tcpci.* include/power/alderlake* include/intel_x86.h power/alderlake* power/intel_x86.c util/getversion.sh e6da633c38 driver: Sort header files 234a87ae2d tcpci: Add FRS enable to driver structure a56be59ccd tcpm_header: add test for tcpm_dump_registers 57b3256963 Rename CONFIG_CHARGER_INPUT_CURRENT to _CHARGER_DEFAULT_CURRENT_LIMIT e420c8ff9a marasov: Modify TypeC and TypeA configuration. 43b53e0045 Add default implementation of board_set_charge_limit b75dc90677 Add CONFIG_CHARGER_MIN_INPUT_CURRENT_LIMIT f1b563c350 baseboard: Sort header files 7d01b1e58d driver/retimer/ps8818.h: Add I2C ADDR FLAGS 0x30, 0x58, 0x70 ec31407993 Add CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 8f89f69a5b crota: disable lid angle sensor for clamshell BRANCH=None BUG=b:259002141 b:255184961 b:247100970 b:259354679 b:260630630 BUG=b:163093572 b:254328661 TEST=`emerge-brya chromeos-ec` Force-Relevant-Builds: all Change-Id: Ia85a701fbf6b8e67ec214b9e25e0e55e980a6f47 Signed-off-by: YH Lin <yueherngl@google.com>
Diffstat (limited to 'zephyr/test/drivers/i2c_controller/src/i2c_controller.c')
-rw-r--r--zephyr/test/drivers/i2c_controller/src/i2c_controller.c122
1 files changed, 118 insertions, 4 deletions
diff --git a/zephyr/test/drivers/i2c_controller/src/i2c_controller.c b/zephyr/test/drivers/i2c_controller/src/i2c_controller.c
index 0beb773297..594c3e6888 100644
--- a/zephyr/test/drivers/i2c_controller/src/i2c_controller.c
+++ b/zephyr/test/drivers/i2c_controller/src/i2c_controller.c
@@ -2,15 +2,15 @@
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
+#include "basic_i2c_device_emul.h"
+#include "i2c.h"
+#include "test/drivers/test_state.h"
+
#include <zephyr/device.h>
#include <zephyr/fff.h>
#include <zephyr/sys/byteorder.h>
#include <zephyr/ztest.h>
-#include "basic_i2c_device_emul.h"
-#include "i2c.h"
-#include "test/drivers/test_state.h"
-
struct i2c_controller_fixture {
int port;
int addr;
@@ -61,6 +61,29 @@ ZTEST_F(i2c_controller, write_read32_be)
expected);
}
+ZTEST_F(i2c_controller, write_read16_be)
+{
+ uint16_t expected = 0x1122;
+ int actual;
+
+ zassert_ok(i2c_write16(fixture->port,
+ fixture->addr | I2C_FLAG_BIG_ENDIAN, 0,
+ expected));
+
+ /* Get the first two bytes of the register space as a uint16_t */
+ actual = __bswap_16(*((uint16_t *)&fixture->emul_data->regs[0]));
+
+ zassert_equal(expected, actual, "got %04x, expected %08x", actual,
+ expected);
+
+ /* Now read back through I2C API */
+ zassert_ok(i2c_read16(fixture->port,
+ fixture->addr | I2C_FLAG_BIG_ENDIAN, 0, &actual));
+
+ zassert_equal(expected, actual, "got %04x, expected %04x",
+ (uint16_t)actual, expected);
+}
+
ZTEST_F(i2c_controller, read32_fail)
{
int ret;
@@ -98,6 +121,14 @@ ZTEST_F(i2c_controller, field_update16)
zassert_equal(set_value, actual, "got %04x, expected %04x", actual,
set_value);
+
+ /* Force a failure */
+ set_value = 0x0001;
+ mask = 0x0001;
+ i2c_common_emul_set_read_fail_reg(&fixture->emul_data->common, 0);
+ zassert_equal(i2c_field_update16(fixture->port, fixture->addr, 0, mask,
+ set_value),
+ EC_ERROR_INVAL);
}
ZTEST_F(i2c_controller, read_offset16__one_byte)
@@ -273,6 +304,89 @@ ZTEST_F(i2c_controller, write_offset16_block)
expected);
}
+ZTEST_F(i2c_controller, pec_disabled)
+{
+ uint16_t addr_flags;
+ uint8_t write_data[] = {
+ 0xAA,
+ 0xBB,
+ 0xCC,
+ 0xDD,
+ };
+ int write_data32 = 0x11223344;
+ uint8_t read_data[4];
+ int actual_read_len;
+ uint16_t reg = 0x01;
+
+ /*
+ * Verify I2C reads and writes through the various APIs fail when
+ * CONFIG_PLATFORM_EC_SMBUS_PEC=n
+ */
+ if (IS_ENABLED(CONFIG_PLATFORM_EC_SMBUS_PEC)) {
+ ztest_test_skip();
+ return;
+ }
+
+ addr_flags = fixture->addr | I2C_FLAG_PEC;
+
+ zassert_equal(i2c_read32(fixture->port, addr_flags, reg,
+ (int *)read_data),
+ EC_ERROR_UNIMPLEMENTED);
+ zassert_equal(i2c_write32(fixture->port, addr_flags, reg, write_data32),
+ EC_ERROR_UNIMPLEMENTED);
+ zassert_equal(i2c_read_sized_block(fixture->port, addr_flags, reg,
+ read_data, sizeof(read_data),
+ &actual_read_len),
+ EC_ERROR_UNIMPLEMENTED);
+ zassert_equal(i2c_read_sized_block(fixture->port, addr_flags, reg,
+ read_data, 0, &actual_read_len),
+ EC_ERROR_INVAL);
+ zassert_equal(i2c_write_block(fixture->port, addr_flags, reg,
+ write_data, sizeof(write_data)),
+ EC_ERROR_UNIMPLEMENTED);
+}
+
+ZTEST_F(i2c_controller, i2c_xfer_unlocked__error_paths)
+{
+ uint8_t out_buffer[1];
+ int out_size;
+ uint8_t in_buffer[1];
+ int in_size;
+ int flags;
+
+ /* First confirm i2c_xfer_unlocked() works with a lock. */
+ out_buffer[0] = 0;
+ out_size = 1;
+ in_size = 1;
+ flags = I2C_XFER_STOP;
+
+ i2c_lock(fixture->port, 1);
+ zassert_equal(i2c_port_is_locked(fixture->port), 1,
+ "Port %d not locked", fixture->port);
+ zassert_ok(i2c_xfer_unlocked(fixture->port, fixture->addr, out_buffer,
+ out_size, in_buffer, in_size, flags));
+ i2c_lock(fixture->port, 0);
+ zassert_equal(i2c_port_is_locked(fixture->port), 0, "Port %d is locked",
+ fixture->port);
+
+ /* Try the transfer without a lock. */
+ zassert_equal(i2c_xfer_unlocked(fixture->port, fixture->addr,
+ out_buffer, out_size, in_buffer,
+ in_size, flags),
+ EC_ERROR_INVAL);
+
+ /* Set an invalid flag on the transfer, expected to still pass */
+ i2c_lock(fixture->port, 1);
+ zassert_equal(i2c_port_is_locked(fixture->port), 1,
+ "Port %d not locked", fixture->port);
+ zassert_ok(i2c_xfer_unlocked(
+ fixture->port, fixture->addr | I2C_FLAG_ADDR_IS_SPI, out_buffer,
+ out_size, in_buffer, in_size, flags));
+ i2c_lock(fixture->port, 0);
+ zassert_equal(i2c_port_is_locked(fixture->port), 0, "Port %d is locked",
+ fixture->port);
+}
+
static struct i2c_controller_fixture i2c_controller_fixture;
static void *setup(void)