zephyr/subsys/emul/emul.c
Yuval Peress 03bcf8276a emul: Support getting an emulator by name
Issue #38271

Implement a getter for emulators similar to device_get_binding. This
function can be used to get the emulator instance during tests to call
emulator specific functions.

Example: The current BMI160 emulator pre-defines a finite set of data
samples that will be returned. If a test was to be written for logic
that uses that data, then the emulator would become completely useless
without the ability for the test to define what data should be returned.

This will also help in exercising error conditions in tests.

Signed-off-by: Yuval Peress <peress@chromium.org>
2021-09-28 20:12:37 -04:00

59 lines
1.3 KiB
C

/*
* Copyright 2020 Google LLC
* Copyright (c) 2020 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#define LOG_LEVEL CONFIG_EMUL_LOG_LEVEL
#include <logging/log.h>
LOG_MODULE_REGISTER(emul);
#include <device.h>
#include <drivers/emul.h>
#include <string.h>
const struct emul *emul_get_binding(const char *name)
{
const struct emul *emul_it;
for (emul_it = __emul_list_start; emul_it < __emul_list_end; emul_it++) {
if (strcmp(emul_it->dev_label, name) == 0) {
return emul_it;
}
}
return NULL;
}
int emul_init_for_bus_from_list(const struct device *dev,
const struct emul_list_for_bus *list)
{
const struct emul_list_for_bus *cfg = dev->config;
/*
* Walk the list of children, find the corresponding emulator and
* initialise it.
*/
const struct emul_link_for_bus *elp;
const struct emul_link_for_bus *const end =
cfg->children + cfg->num_children;
LOG_INF("Registering %d emulator(s) for %s", cfg->num_children,
dev->name);
for (elp = cfg->children; elp < end; elp++) {
const struct emul *emul = emul_get_binding(elp->label);
__ASSERT(emul, "Cannot find emulator for '%s'", elp->label);
int rc = emul->init(emul, dev);
if (rc != 0) {
LOG_WRN("Init %s emulator failed: %d\n",
elp->label, rc);
}
}
return 0;
}