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>
59 lines
1.3 KiB
C
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;
|
|
}
|