14#ifndef ZEPHYR_INCLUDE_PMCI_MCTP_MCTP_I2C_GPIO_CONTROLLER_H_
15#define ZEPHYR_INCLUDE_PMCI_MCTP_MCTP_I2C_GPIO_CONTROLLER_H_
33struct mctp_i2c_gpio_controller_cb {
35 struct gpio_callback callback;
36 struct mctp_binding_i2c_gpio_controller *binding;
47 struct mctp_binding binding;
51 uint8_t rx_buf[MCTP_I2C_GPIO_MAX_PKT_SIZE];
52 uint8_t tx_buf[MCTP_I2C_GPIO_MAX_PKT_SIZE];
54 struct mctp_pktbuf *rx_pkt;
57 struct k_sem *tx_lock;
65 struct mctp_i2c_gpio_controller_cb *endpoint_gpio_cbs;
71 struct mctp_i2c_gpio_controller_cb *inflight_rx;
73 uint8_t tx_storage[MCTP_PKTBUF_SIZE(MCTP_I2C_GPIO_MAX_PKT_SIZE)] PKTBUF_STORAGE_ALIGN;
79int mctp_i2c_gpio_controller_start(
struct mctp_binding *binding);
80int mctp_i2c_gpio_controller_tx(
struct mctp_binding *binding,
struct mctp_pktbuf *pkt);
82#define MCTP_I2C_GPIO_CONTROLLER_IODEV_NAME(_idx, _name) _name##_idx
84#define MCTP_I2C_GPIO_CONTROLLER_IODEV_DEFINE(_node_id, addrs, _idx, _name) \
85 I2C_IODEV_DEFINE(MCTP_I2C_GPIO_CONTROLLER_IODEV_NAME(_idx, _name), \
86 DT_PHANDLE(_node_id, i2c), \
87 DT_PROP_BY_IDX(_node_id, addrs, _idx));
90#define MCTP_I2C_GPIO_CONTROLLER_DEFINE_GPIOS(_node_id, _name) \
91 const struct gpio_dt_spec _name##_endpoint_gpios[] = { \
92 DT_FOREACH_PROP_ELEM_SEP(_node_id, endpoint_gpios, GPIO_DT_SPEC_GET_BY_IDX, (,)) \
95#define MCTP_I2C_GPIO_CONTROLLER_DEFINE_IDS(_node_id, _name) \
96 const uint8_t _name##_endpoint_ids[] = DT_PROP(_node_id, endpoint_ids);
98#define MCTP_I2C_GPIO_CONTROLLER_DEFINE_GPIO_CBS(_node_id, _name) \
99 struct mctp_i2c_gpio_controller_cb \
100 _name##_endpoint_gpio_cbs[DT_PROP_LEN(_node_id, endpoint_ids)]
103#define MCTP_I2C_GPIO_CONTROLLER_DEFINE_IODEVS(_node_id, _name) \
104 DT_FOREACH_PROP_ELEM_VARGS(_node_id, endpoint_addrs, \
105 MCTP_I2C_GPIO_CONTROLLER_IODEV_DEFINE, _name) \
106 const struct rtio_iodev *_name##_endpoint_iodevs[] = { \
107 LISTIFY(DT_PROP_LEN(_node_id, endpoint_ids), &MCTP_I2C_GPIO_CONTROLLER_IODEV_NAME, \
135#define MCTP_I2C_GPIO_CONTROLLER_DT_DEFINE(_name, _node_id) \
136 RTIO_DEFINE(_name##_rtio_tx, 5, 5); \
137 RTIO_DEFINE(_name##_rtio_rx, 5, 5); \
138 MCTP_I2C_GPIO_CONTROLLER_DEFINE_IODEVS(_node_id, _name); \
139 MCTP_I2C_GPIO_CONTROLLER_DEFINE_GPIOS(_node_id, _name); \
140 MCTP_I2C_GPIO_CONTROLLER_DEFINE_IDS(_node_id, _name); \
141 MCTP_I2C_GPIO_CONTROLLER_DEFINE_GPIO_CBS(_node_id, _name); \
142 K_SEM_DEFINE(_name##_tx_lock, 1, 1); \
143 struct mctp_binding_i2c_gpio_controller _name = { \
145 .name = STRINGIFY(_name), .version = 1, \
146 .start = mctp_i2c_gpio_controller_start, \
147 .tx = mctp_i2c_gpio_controller_tx, \
148 .pkt_size = MCTP_I2C_GPIO_MAX_PKT_SIZE, \
149 .tx_storage = _name.tx_storage, \
151 .i2c = DEVICE_DT_GET(DT_PHANDLE(_node_id, i2c)), \
152 .num_endpoints = DT_PROP_LEN(_node_id, endpoint_ids), \
153 .endpoint_ids = _name##_endpoint_ids, \
154 .endpoint_gpios = _name##_endpoint_gpios, \
155 .endpoint_gpio_cbs = _name##_endpoint_gpio_cbs, \
156 .endpoint_iodevs = _name##_endpoint_iodevs, \
157 .r_tx = &_name##_rtio_tx, \
158 .r_rx = &_name##_rtio_rx, \
159 .tx_lock = &_name##_tx_lock, \
Main header file for GPIO driver API.
Main header file for I2C (Inter-Integrated Circuit) driver API.
Internal definitions shared by the MCTP I2C GPIO controller and target bindings.
A wait-free intrusive multi producer single consumer (MPSC) queue using a singly linked list.
Real-Time IO device API for moving bytes with low effort.
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
Runtime device structure (in ROM) per driver instance.
Definition device.h:513
Container for GPIO pin information specified in devicetree.
Definition gpio.h:296
Semaphore structure.
Definition kernel.h:3798
Kernel Spin Lock.
Definition spinlock.h:45
An MCTP binding for Zephyr's I2C interface using GPIO.
Definition mctp_i2c_gpio_controller.h:45
MPSC Queue.
Definition mpsc_lockfree.h:86
An IO device with a function table for submitting requests.
Definition iodev.h:48
An RTIO context containing what can be viewed as a pair of queues.
Definition rtio.h:70