summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomasz Michalec <tm@semihalf.com>2021-11-04 14:25:26 +0100
committerCommit Bot <commit-bot@chromium.org>2021-11-08 10:22:43 +0000
commit3ee694aa783d991937612260bab461da89606c37 (patch)
tree5c81e7f428dfb718e3059adfd8f0bfebe48658d0
parentde15f2561387db545e056f8b2329b81753a08c90 (diff)
downloadchrome-ec-3ee694aa783d991937612260bab461da89606c37.tar.gz
zephyr: drivers: add smart battery mf access test
Add test for sb_read_mfgacc() function. Smart Battery emulator is updated to handle custom read handler for unknown registers. BUG=b:184855975 BRANCH=none TEST=make configure --test zephyr/test/drivers Signed-off-by: Tomasz Michalec <tm@semihalf.com> Change-Id: Ie214fe39c3de3f9dd619f6556d8fd36b660725f1 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3259938 Tested-by: Tomasz Michalec <tmichalec@google.com> Reviewed-by: Yuval Peress <peress@google.com> Commit-Queue: Tomasz Michalec <tmichalec@google.com>
-rw-r--r--zephyr/emul/emul_smart_battery.c30
-rw-r--r--zephyr/test/drivers/src/smart.c92
2 files changed, 110 insertions, 12 deletions
diff --git a/zephyr/emul/emul_smart_battery.c b/zephyr/emul/emul_smart_battery.c
index 279e08719d..136d81cc35 100644
--- a/zephyr/emul/emul_smart_battery.c
+++ b/zephyr/emul/emul_smart_battery.c
@@ -586,20 +586,21 @@ static int sbat_emul_handle_read_msg(struct i2c_emul *emul, int reg)
/* Handle commands which return block */
ret = sbat_emul_get_block_data(emul, reg, &blk, &len);
- if (ret != 0) {
- if (ret == 1) {
- data->bat.error_code = STATUS_CODE_UNSUPPORTED;
- LOG_ERR("Unknown read command (0x%x)", reg);
- }
-
+ if (ret < 0) {
return -EIO;
}
+ if (ret == 0) {
+ data->num_to_read = len + 1;
+ data->msg_buf[0] = len;
+ memcpy(&data->msg_buf[1], blk, len);
+ data->bat.error_code = STATUS_CODE_OK;
+ sbat_emul_append_pec(data, reg);
- data->num_to_read = len + 1;
- data->msg_buf[0] = len;
- memcpy(&data->msg_buf[1], blk, len);
- data->bat.error_code = STATUS_CODE_OK;
- sbat_emul_append_pec(data, reg);
+ return 0;
+ }
+
+ /* Command is unknown. Wait for custom handler before failing. */
+ data->num_to_read = 0;
return 0;
}
@@ -740,6 +741,13 @@ static int sbat_emul_read_byte(struct i2c_emul *emul, int reg, uint8_t *val,
data = SBAT_DATA_FROM_I2C_EMUL(emul);
+ if (data->num_to_read == 0) {
+ data->bat.error_code = STATUS_CODE_UNSUPPORTED;
+ LOG_ERR("Unknown read command (0x%x)", reg);
+
+ return -EIO;
+ }
+
if (bytes < data->num_to_read) {
*val = data->msg_buf[bytes];
}
diff --git a/zephyr/test/drivers/src/smart.c b/zephyr/test/drivers/src/smart.c
index 7c053f1c23..a47de2f7d8 100644
--- a/zephyr/test/drivers/src/smart.c
+++ b/zephyr/test/drivers/src/smart.c
@@ -268,6 +268,95 @@ static void test_battery_get_params(void)
zassert_equal(flags, batt.flags, "0x%x != 0x%x", flags, batt.flags);
}
+struct mfgacc_data {
+ int reg;
+ uint8_t *buf;
+ int len;
+};
+
+static int mfgacc_read_func(struct i2c_emul *emul, int reg, uint8_t *val,
+ int bytes, void *data)
+{
+ struct mfgacc_data *conf = data;
+
+ if (bytes == 0 && conf->reg == reg) {
+ sbat_emul_set_response(emul, reg, conf->buf, conf->len, false);
+ }
+
+ return 1;
+}
+
+/** Test battery manufacturer access */
+static void test_battery_mfacc(void)
+{
+ struct sbat_emul_bat_data *bat;
+ struct mfgacc_data mfacc_conf;
+ struct i2c_emul *emul;
+ uint8_t recv_buf[10];
+ uint8_t mf_data[10];
+ uint16_t cmd;
+ int len;
+
+ emul = sbat_emul_get_ptr(BATTERY_ORD);
+ bat = sbat_emul_get_bat_data(emul);
+
+ /* Select arbitrary command number for the test */
+ cmd = 0x1234;
+
+ /* Test fail on to short receive buffer */
+ len = 2;
+ zassert_equal(EC_ERROR_INVAL,
+ sb_read_mfgacc(cmd, SB_ALT_MANUFACTURER_ACCESS, recv_buf,
+ len), NULL);
+
+ /* Set correct length for rest of the test */
+ len = 10;
+
+ /* Test fail on writing SB_MANUFACTURER_ACCESS register */
+ i2c_common_emul_set_write_fail_reg(emul, SB_MANUFACTURER_ACCESS);
+ zassert_equal(EC_ERROR_INVAL,
+ sb_read_mfgacc(cmd, SB_ALT_MANUFACTURER_ACCESS, recv_buf,
+ len), NULL);
+ i2c_common_emul_set_write_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
+
+ /* Test fail on reading manufacturer data (custom handler is not set) */
+ zassert_equal(EC_ERROR_INVAL,
+ sb_read_mfgacc(cmd, SB_ALT_MANUFACTURER_ACCESS, recv_buf,
+ len), NULL);
+
+ /* Set arbitrary manufacturer data */
+ for (int i = 1; i < len; i++) {
+ mf_data[i] = i;
+ }
+ /* Set first byte of message as length */
+ mf_data[0] = len;
+
+ /* Setup custom handler */
+ mfacc_conf.reg = SB_ALT_MANUFACTURER_ACCESS;
+ mfacc_conf.len = len;
+ mfacc_conf.buf = mf_data;
+ i2c_common_emul_set_read_func(emul, mfgacc_read_func, &mfacc_conf);
+
+ /* Test error when mf_data doesn't start with command */
+ zassert_equal(EC_ERROR_UNKNOWN,
+ sb_read_mfgacc(cmd, SB_ALT_MANUFACTURER_ACCESS, recv_buf,
+ len), NULL);
+
+ /* Set beginning of the manufacturer data */
+ mf_data[1] = cmd & 0xff;
+ mf_data[2] = (cmd >> 8) & 0xff;
+
+ /* Test successful manufacturer data read */
+ zassert_equal(EC_SUCCESS,
+ sb_read_mfgacc(cmd, SB_ALT_MANUFACTURER_ACCESS, recv_buf,
+ len), NULL);
+ /* Compare received data ignoring length byte */
+ zassert_mem_equal(mf_data + 1, recv_buf, len - 1, NULL);
+
+ /* Disable custom read function */
+ i2c_common_emul_set_read_func(emul, NULL, NULL);
+}
+
void test_suite_smart_battery(void)
{
ztest_test_suite(smart_battery,
@@ -276,6 +365,7 @@ void test_suite_smart_battery(void)
ztest_user_unit_test(test_battery_wait_for_stable),
ztest_user_unit_test(test_battery_manufacture_date),
ztest_user_unit_test(test_battery_time_at_rate),
- ztest_user_unit_test(test_battery_get_params));
+ ztest_user_unit_test(test_battery_get_params),
+ ztest_user_unit_test(test_battery_mfacc));
ztest_run_test_suite(smart_battery);
}