Zephyr API Documentation  3.6.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
emul.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 Nordic Semiconductor ASA
3 * Copyright 2020 Google LLC
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef ZEPHYR_INCLUDE_DRIVERS_EMUL_H_
9#define ZEPHYR_INCLUDE_DRIVERS_EMUL_H_
10
18#ifdef __cplusplus
19extern "C" {
20#endif /* __cplusplus */
21
22struct emul;
23
24/* #includes required after forward-declaration of struct emul later defined in this header. */
25#include <zephyr/device.h>
26#include <zephyr/devicetree.h>
31
40};
41
46 const struct device *dev;
47};
48
54 unsigned int num_children;
55};
56
64typedef int (*emul_init_t)(const struct emul *emul, const struct device *parent);
65
70 void *api;
72};
73
78struct emul {
82 const struct device *dev;
84 const void *cfg;
86 void *data;
90 union bus {
91 struct i2c_emul *i2c;
92 struct espi_emul *espi;
93 struct spi_emul *spi;
95 } bus;
97 const void *backend_api;
98};
99
105#define EMUL_DT_NAME_GET(node_id) _CONCAT(__emulreg_, node_id)
106
107/* Get a unique identifier based on the given _dev_node_id's reg property and
108 * the bus its on. Intended for use in other internal macros when declaring {bus}_emul
109 * structs in peripheral emulators.
110 */
111#define Z_EMUL_REG_BUS_IDENTIFIER(_dev_node_id) (_CONCAT(_CONCAT(__emulreg_, _dev_node_id), _bus))
112
113/* Conditionally places text based on what bus _dev_node_id is on. */
114#define Z_EMUL_BUS(_dev_node_id, _i2c, _espi, _spi, _none) \
115 COND_CODE_1(DT_ON_BUS(_dev_node_id, i2c), (_i2c), \
116 (COND_CODE_1(DT_ON_BUS(_dev_node_id, espi), (_espi), \
117 (COND_CODE_1(DT_ON_BUS(_dev_node_id, spi), (_spi), (_none))))))
132#define EMUL_DT_DEFINE(node_id, init_fn, data_ptr, cfg_ptr, bus_api, _backend_api) \
133 static struct Z_EMUL_BUS(node_id, i2c_emul, espi_emul, spi_emul, no_bus_emul) \
134 Z_EMUL_REG_BUS_IDENTIFIER(node_id) = { \
135 .api = bus_api, \
136 .Z_EMUL_BUS(node_id, addr, chipsel, chipsel, addr) = DT_REG_ADDR(node_id), \
137 }; \
138 const STRUCT_SECTION_ITERABLE(emul, EMUL_DT_NAME_GET(node_id)) \
139 __used = { \
140 .init = (init_fn), \
141 .dev = DEVICE_DT_GET(node_id), \
142 .cfg = (cfg_ptr), \
143 .data = (data_ptr), \
144 .bus_type = Z_EMUL_BUS(node_id, EMUL_BUS_TYPE_I2C, EMUL_BUS_TYPE_ESPI, \
145 EMUL_BUS_TYPE_SPI, EMUL_BUS_TYPE_NONE), \
146 .bus = {.Z_EMUL_BUS(node_id, i2c, espi, spi, none) = \
147 &(Z_EMUL_REG_BUS_IDENTIFIER(node_id))}, \
148 .backend_api = (_backend_api), \
149 };
150
159#define EMUL_DT_INST_DEFINE(inst, ...) EMUL_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
160
175#define EMUL_DT_GET(node_id) (&EMUL_DT_NAME_GET(node_id))
176
186#define EMUL_DT_GET_OR_NULL(node_id) \
187 COND_CODE_1(DT_NODE_HAS_STATUS(node_id, okay), (EMUL_DT_GET(node_id)), (NULL))
188
196int emul_init_for_bus(const struct device *dev);
197
210const struct emul *emul_get_binding(const char *name);
211
216#define Z_MAYBE_EMUL_DECLARE_INTERNAL(node_id) extern const struct emul EMUL_DT_NAME_GET(node_id);
217
218DT_FOREACH_STATUS_OKAY_NODE(Z_MAYBE_EMUL_DECLARE_INTERNAL);
219
220#ifdef __cplusplus
221}
222#endif /* __cplusplus */
223
224#endif /* ZEPHYR_INCLUDE_DRIVERS_EMUL_H_ */
Devicetree main header.
Public APIs for the eSPI emulation drivers.
#define DT_FOREACH_STATUS_OKAY_NODE(fn)
Invokes fn for every status okay node in the tree.
Definition: devicetree.h:2693
emul_bus_type
The types of supported buses.
Definition: emul.h:35
int(* emul_init_t)(const struct emul *emul, const struct device *parent)
Standard callback for emulator initialisation providing the initialiser record and the device that ca...
Definition: emul.h:64
const struct emul * emul_get_binding(const char *name)
Retrieve the emul structure for an emulator by name.
int emul_init_for_bus(const struct device *dev)
Set up a list of emulators.
@ EMUL_BUS_TYPE_SPI
Definition: emul.h:38
@ EMUL_BUS_TYPE_I2C
Definition: emul.h:36
@ EMUL_BUS_TYPE_ESPI
Definition: emul.h:37
@ EMUL_BUS_TYPE_NONE
Definition: emul.h:39
Public APIs for the I2C emulation drivers.
Public APIs for the SPI emulation drivers.
__UINT16_TYPE__ uint16_t
Definition: stdint.h:89
Runtime device structure (in ROM) per driver instance.
Definition: device.h:399
List of emulators attached to a bus.
Definition: emul.h:50
const struct emul_link_for_bus * children
Identifiers for children of the node.
Definition: emul.h:52
unsigned int num_children
Number of children of the node.
Definition: emul.h:54
An emulator instance - represents the target emulated device/peripheral that is interacted with throu...
Definition: emul.h:78
const struct device * dev
handle to the device for which this provides low-level emulation
Definition: emul.h:82
emul_init_t init
function used to initialise the emulator state
Definition: emul.h:80
void * data
Emulator-specific data.
Definition: emul.h:86
enum emul_bus_type bus_type
The bus type that the emulator is attached to.
Definition: emul.h:88
const void * backend_api
Address of the API structure exposed by the emulator instance.
Definition: emul.h:97
const void * cfg
Emulator-specific configuration data.
Definition: emul.h:84
Node in a linked list of emulators for eSPI devices.
Definition: espi_emul.h:111
Node in a linked list of emulators for I2C devices.
Definition: i2c_emul.h:37
Emulator API stub when an emulator is not actually placed on a bus.
Definition: emul.h:69
void * api
Definition: emul.h:70
uint16_t addr
Definition: emul.h:71
Node in a linked list of emulators for SPI devices.
Definition: spi_emul.h:37
Pointer to the emulated bus node.
Definition: emul.h:90
struct i2c_emul * i2c
Definition: emul.h:91
struct no_bus_emul * none
Definition: emul.h:94
struct spi_emul * spi
Definition: emul.h:93
struct espi_emul * espi
Definition: emul.h:92