You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
2.6 KiB
112 lines
2.6 KiB
/* |
|
* Copyright 2020 Google LLC |
|
* Copyright (c) 2020 Nordic Semiconductor ASA |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
*/ |
|
|
|
#define LOG_LEVEL CONFIG_EMUL_LOG_LEVEL |
|
#include <zephyr/logging/log.h> |
|
LOG_MODULE_REGISTER(emul); |
|
|
|
#include <zephyr/device.h> |
|
#include <zephyr/drivers/emul.h> |
|
#include <zephyr/sys/iterable_sections.h> |
|
#include <string.h> |
|
|
|
const struct emul *emul_get_binding(const char *name) |
|
{ |
|
STRUCT_SECTION_FOREACH(emul, emul_it) { |
|
if (strcmp(emul_it->dev->name, name) == 0) { |
|
return emul_it; |
|
} |
|
} |
|
|
|
return NULL; |
|
} |
|
|
|
int emul_init_for_bus(const struct device *dev) |
|
{ |
|
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->dev->name); |
|
|
|
if (!emul) { |
|
LOG_WRN("Cannot find emulator for '%s'", elp->dev->name); |
|
continue; |
|
} |
|
|
|
switch (emul->bus_type) { |
|
case EMUL_BUS_TYPE_I2C: |
|
emul->bus.i2c->target = emul; |
|
break; |
|
case EMUL_BUS_TYPE_ESPI: |
|
emul->bus.espi->target = emul; |
|
break; |
|
case EMUL_BUS_TYPE_SPI: |
|
emul->bus.spi->target = emul; |
|
break; |
|
case EMUL_BUS_TYPE_MSPI: |
|
emul->bus.mspi->target = emul; |
|
break; |
|
case EMUL_BUS_TYPE_UART: |
|
emul->bus.uart->target = emul; |
|
break; |
|
case EMUL_BUS_TYPE_NONE: |
|
break; |
|
} |
|
int rc = emul->init(emul, dev); |
|
|
|
if (rc != 0) { |
|
LOG_WRN("Init %s emulator failed: %d", |
|
elp->dev->name, rc); |
|
} |
|
|
|
switch (emul->bus_type) { |
|
#ifdef CONFIG_I2C_EMUL |
|
case EMUL_BUS_TYPE_I2C: |
|
rc = i2c_emul_register(dev, emul->bus.i2c); |
|
break; |
|
#endif /* CONFIG_I2C_EMUL */ |
|
#ifdef CONFIG_ESPI_EMUL |
|
case EMUL_BUS_TYPE_ESPI: |
|
rc = espi_emul_register(dev, emul->bus.espi); |
|
break; |
|
#endif /* CONFIG_ESPI_EMUL */ |
|
#ifdef CONFIG_SPI_EMUL |
|
case EMUL_BUS_TYPE_SPI: |
|
rc = spi_emul_register(dev, emul->bus.spi); |
|
break; |
|
#endif /* CONFIG_SPI_EMUL */ |
|
#ifdef CONFIG_MSPI_EMUL |
|
case EMUL_BUS_TYPE_MSPI: |
|
rc = mspi_emul_register(dev, emul->bus.mspi); |
|
break; |
|
#endif /* CONFIG_MSPI_EMUL */ |
|
#ifdef CONFIG_UART_EMUL |
|
case EMUL_BUS_TYPE_UART: |
|
rc = uart_emul_register(dev, emul->bus.uart); |
|
break; |
|
#endif /* CONFIG_UART_EMUL */ |
|
default: |
|
rc = -EINVAL; |
|
LOG_WRN("Found no emulated bus enabled to register emulator %s", |
|
elp->dev->name); |
|
} |
|
|
|
if (rc != 0) { |
|
LOG_WRN("Failed to register emulator for %s: %d", elp->dev->name, rc); |
|
} |
|
} |
|
|
|
return 0; |
|
}
|
|
|