emul: Add support for non-bus emulators
Adds a stub API for a non bus emulators. The stub is used to keep the rest of the emulation consistent. Signed-off-by: Yuval Peress <peress@google.com>
This commit is contained in:
parent
56de0a347e
commit
a9afc5a7b8
|
@ -36,6 +36,7 @@ enum emul_bus_type {
|
||||||
EMUL_BUS_TYPE_I2C,
|
EMUL_BUS_TYPE_I2C,
|
||||||
EMUL_BUS_TYPE_ESPI,
|
EMUL_BUS_TYPE_ESPI,
|
||||||
EMUL_BUS_TYPE_SPI,
|
EMUL_BUS_TYPE_SPI,
|
||||||
|
EMUL_BUS_TYPE_NONE,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -62,6 +63,14 @@ struct emul_list_for_bus {
|
||||||
*/
|
*/
|
||||||
typedef int (*emul_init_t)(const struct emul *emul, const struct device *parent);
|
typedef int (*emul_init_t)(const struct emul *emul, const struct device *parent);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Emulator API stub when an emulator is not actually placed on a bus.
|
||||||
|
*/
|
||||||
|
struct no_bus_emul {
|
||||||
|
void *api;
|
||||||
|
uint16_t addr;
|
||||||
|
};
|
||||||
|
|
||||||
/** An emulator instance - represents the *target* emulated device/peripheral that is
|
/** An emulator instance - represents the *target* emulated device/peripheral that is
|
||||||
* interacted with through an emulated bus. Instances of emulated bus nodes (e.g. i2c_emul)
|
* interacted with through an emulated bus. Instances of emulated bus nodes (e.g. i2c_emul)
|
||||||
* and emulators (i.e. struct emul) are exactly 1..1
|
* and emulators (i.e. struct emul) are exactly 1..1
|
||||||
|
@ -82,6 +91,7 @@ struct emul {
|
||||||
struct i2c_emul *i2c;
|
struct i2c_emul *i2c;
|
||||||
struct espi_emul *espi;
|
struct espi_emul *espi;
|
||||||
struct spi_emul *spi;
|
struct spi_emul *spi;
|
||||||
|
struct no_bus_emul *none;
|
||||||
} bus;
|
} bus;
|
||||||
/** Address of the API structure exposed by the emulator instance */
|
/** Address of the API structure exposed by the emulator instance */
|
||||||
const void *backend_api;
|
const void *backend_api;
|
||||||
|
@ -101,10 +111,10 @@ struct emul {
|
||||||
#define Z_EMUL_REG_BUS_IDENTIFIER(_dev_node_id) (_CONCAT(_CONCAT(__emulreg_, _dev_node_id), _bus))
|
#define Z_EMUL_REG_BUS_IDENTIFIER(_dev_node_id) (_CONCAT(_CONCAT(__emulreg_, _dev_node_id), _bus))
|
||||||
|
|
||||||
/* Conditionally places text based on what bus _dev_node_id is on. */
|
/* Conditionally places text based on what bus _dev_node_id is on. */
|
||||||
#define Z_EMUL_BUS(_dev_node_id, _i2c, _espi, _spi) \
|
#define Z_EMUL_BUS(_dev_node_id, _i2c, _espi, _spi, _none) \
|
||||||
COND_CODE_1(DT_ON_BUS(_dev_node_id, i2c), (_i2c), \
|
COND_CODE_1(DT_ON_BUS(_dev_node_id, i2c), (_i2c), \
|
||||||
(COND_CODE_1(DT_ON_BUS(_dev_node_id, espi), (_espi), \
|
(COND_CODE_1(DT_ON_BUS(_dev_node_id, espi), (_espi), \
|
||||||
(COND_CODE_1(DT_ON_BUS(_dev_node_id, spi), (_spi), (-EINVAL))))))
|
(COND_CODE_1(DT_ON_BUS(_dev_node_id, spi), (_spi), (_none))))))
|
||||||
/**
|
/**
|
||||||
* @brief Define a new emulator
|
* @brief Define a new emulator
|
||||||
*
|
*
|
||||||
|
@ -120,10 +130,10 @@ struct emul {
|
||||||
* @param _backend_api emulator-specific backend api
|
* @param _backend_api emulator-specific backend api
|
||||||
*/
|
*/
|
||||||
#define EMUL_DT_DEFINE(node_id, init_fn, data_ptr, cfg_ptr, bus_api, _backend_api) \
|
#define EMUL_DT_DEFINE(node_id, init_fn, data_ptr, cfg_ptr, bus_api, _backend_api) \
|
||||||
static struct Z_EMUL_BUS(node_id, i2c_emul, espi_emul, spi_emul) \
|
static struct Z_EMUL_BUS(node_id, i2c_emul, espi_emul, spi_emul, no_bus_emul) \
|
||||||
Z_EMUL_REG_BUS_IDENTIFIER(node_id) = { \
|
Z_EMUL_REG_BUS_IDENTIFIER(node_id) = { \
|
||||||
.api = bus_api, \
|
.api = bus_api, \
|
||||||
.Z_EMUL_BUS(node_id, addr, chipsel, chipsel) = DT_REG_ADDR(node_id), \
|
.Z_EMUL_BUS(node_id, addr, chipsel, chipsel, addr) = DT_REG_ADDR(node_id), \
|
||||||
}; \
|
}; \
|
||||||
const STRUCT_SECTION_ITERABLE(emul, EMUL_DT_NAME_GET(node_id)) \
|
const STRUCT_SECTION_ITERABLE(emul, EMUL_DT_NAME_GET(node_id)) \
|
||||||
__used = { \
|
__used = { \
|
||||||
|
@ -132,8 +142,8 @@ struct emul {
|
||||||
.cfg = (cfg_ptr), \
|
.cfg = (cfg_ptr), \
|
||||||
.data = (data_ptr), \
|
.data = (data_ptr), \
|
||||||
.bus_type = Z_EMUL_BUS(node_id, EMUL_BUS_TYPE_I2C, EMUL_BUS_TYPE_ESPI, \
|
.bus_type = Z_EMUL_BUS(node_id, EMUL_BUS_TYPE_I2C, EMUL_BUS_TYPE_ESPI, \
|
||||||
EMUL_BUS_TYPE_SPI), \
|
EMUL_BUS_TYPE_SPI, EMUL_BUS_TYPE_NONE), \
|
||||||
.bus = {.Z_EMUL_BUS(node_id, i2c, espi, spi) = \
|
.bus = {.Z_EMUL_BUS(node_id, i2c, espi, spi, none) = \
|
||||||
&(Z_EMUL_REG_BUS_IDENTIFIER(node_id))}, \
|
&(Z_EMUL_REG_BUS_IDENTIFIER(node_id))}, \
|
||||||
.backend_api = (_backend_api), \
|
.backend_api = (_backend_api), \
|
||||||
};
|
};
|
||||||
|
|
|
@ -55,6 +55,8 @@ int emul_init_for_bus(const struct device *dev)
|
||||||
case EMUL_BUS_TYPE_SPI:
|
case EMUL_BUS_TYPE_SPI:
|
||||||
emul->bus.spi->target = emul;
|
emul->bus.spi->target = emul;
|
||||||
break;
|
break;
|
||||||
|
case EMUL_BUS_TYPE_NONE:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
int rc = emul->init(emul, dev);
|
int rc = emul->init(emul, dev);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue