diff options
author | Tomasz Michalec <tm@semihalf.com> | 2021-11-04 14:25:26 +0100 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-11-08 10:22:43 +0000 |
commit | 3ee694aa783d991937612260bab461da89606c37 (patch) | |
tree | 5c81e7f428dfb718e3059adfd8f0bfebe48658d0 | |
parent | de15f2561387db545e056f8b2329b81753a08c90 (diff) | |
download | chrome-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.c | 30 | ||||
-rw-r--r-- | zephyr/test/drivers/src/smart.c | 92 |
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); } |