@@ -1195,8 +1195,47 @@ device_get_dt_nodelabels(const struct device *dev)
1195
1195
1196
1196
DT_FOREACH_STATUS_OKAY_NODE (Z_MAYBE_DEVICE_DECLARE_INTERNAL )
1197
1197
1198
+ /** @brief Expands to the full type. */
1199
+ #define Z_DEVICE_API_TYPE (_class ) _CONCAT(_class, _driver_api)
1200
+
1198
1201
/** @endcond */
1199
1202
1203
+ /**
1204
+ * @brief Wrapper macro for declaring device API structs inside iterable sections.
1205
+ *
1206
+ * @param _class The device API class.
1207
+ * @param _name The API instance name.
1208
+ */
1209
+ #define DEVICE_API (_class , _name ) const STRUCT_SECTION_ITERABLE(Z_DEVICE_API_TYPE(_class), _name)
1210
+
1211
+ /**
1212
+ * @brief Expands to the pointer of a device's API for a given class.
1213
+ *
1214
+ * @param _class The device API class.
1215
+ * @param _dev The device instance pointer.
1216
+ *
1217
+ * @return the pointer to the device API.
1218
+ */
1219
+ #define DEVICE_API_GET (_class , _dev ) ((const struct Z_DEVICE_API_TYPE(_class) *)_dev->api)
1220
+
1221
+ /**
1222
+ * @brief Macro that evaluates to a boolean that can be used to check if
1223
+ * a device is of a particular class.
1224
+ *
1225
+ * @param _class The device API class.
1226
+ * @param _dev The device instance pointer.
1227
+ *
1228
+ * @retval true If the device is of the given class
1229
+ * @retval false If the device is not of the given class
1230
+ */
1231
+ #define DEVICE_API_IS (_class , _dev ) \
1232
+ ({ \
1233
+ STRUCT_SECTION_START_EXTERN(Z_DEVICE_API_TYPE(_class)); \
1234
+ STRUCT_SECTION_END_EXTERN(Z_DEVICE_API_TYPE(_class)); \
1235
+ (DEVICE_API_GET(_class, _dev) < STRUCT_SECTION_END(Z_DEVICE_API_TYPE(_class)) && \
1236
+ DEVICE_API_GET(_class, _dev) >= STRUCT_SECTION_START(Z_DEVICE_API_TYPE(_class))); \
1237
+ })
1238
+
1200
1239
#ifdef __cplusplus
1201
1240
}
1202
1241
#endif
0 commit comments