X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Flibsigrok-internal.h;h=2ffffd3d59e260440da8a21c02a8c2f469d3a9c8;hb=bee2b0168c087676c1b365861d8c2d4714afa9b9;hp=588d09080e52db997485f0a6834164efbf9c4bfd;hpb=c45c32ce47f429099cb0f1cabc1b45b9bcf44855;p=libsigrok.git diff --git a/src/libsigrok-internal.h b/src/libsigrok-internal.h index 588d0908..2ffffd3d 100644 --- a/src/libsigrok-internal.h +++ b/src/libsigrok-internal.h @@ -267,6 +267,71 @@ struct zip_stat; #define ALL_ZERO { 0 } #endif +#ifdef __APPLE__ +#define SR_DRIVER_LIST_SECTION "__DATA,__sr_driver_list" +#else +#define SR_DRIVER_LIST_SECTION "sr_driver_list" +#endif + +/** + * Register a list of hardware drivers. + * + * This macro can be used to register multiple hardware drivers to the library. + * This is useful when a driver supports multiple similar but slightly + * different devices that require different sr_dev_driver struct definitions. + * + * For registering only a single driver see SR_REGISTER_DEV_DRIVER(). + * + * Example: + * @code{c} + * #define MY_DRIVER(_name) \ + * &(struct sr_dev_driver){ \ + * .name = _name, \ + * ... + * }; + * + * SR_REGISTER_DEV_DRIVER_LIST(my_driver_infos, + * MY_DRIVER("driver 1"), + * MY_DRIVER("driver 2"), + * ... + * ); + * @endcode + * + * @param name Name to use for the driver list identifier. + * @param ... Comma separated list of pointers to sr_dev_driver structs. + */ +#define SR_REGISTER_DEV_DRIVER_LIST(name, ...) \ + static const struct sr_dev_driver *name[] \ + __attribute__((section (SR_DRIVER_LIST_SECTION), used, \ + aligned(sizeof(struct sr_dev_driver *)))) \ + = { \ + __VA_ARGS__ \ + }; + +/** + * Register a hardware driver. + * + * This macro is used to register a hardware driver with the library. It has + * to be used in order to make the driver accessible to applications using the + * library. + * + * The macro invocation should be placed directly under the struct + * sr_dev_driver definition. + * + * Example: + * @code{c} + * static struct sr_dev_driver driver_info = { + * .name = "driver", + * .... + * }; + * SR_REGISTER_DEV_DRIVER(driver_info); + * @endcode + * + * @param name Identifier name of sr_dev_driver struct to register. + */ +#define SR_REGISTER_DEV_DRIVER(name) \ + SR_REGISTER_DEV_DRIVER_LIST(name##_list, &name); + struct sr_context { struct sr_dev_driver **driver_list; #ifdef HAVE_LIBUSB_1_0 @@ -760,8 +825,6 @@ SR_PRIV void sr_usbtmc_dev_inst_free(struct sr_usbtmc_dev_inst *usbtmc); /*--- hwdriver.c ------------------------------------------------------------*/ -extern SR_PRIV struct sr_dev_driver **drivers_lists[]; - SR_PRIV const GVariantType *sr_variant_type_get(int datatype); SR_PRIV int sr_variant_type_check(uint32_t key, GVariant *data); SR_PRIV void sr_hw_cleanup_all(const struct sr_context *ctx); @@ -865,16 +928,15 @@ SR_PRIV int std_cleanup(const struct sr_dev_driver *di); SR_PRIV int std_serial_dev_open(struct sr_dev_inst *sdi); SR_PRIV int std_serial_dev_acquisition_stop(struct sr_dev_inst *sdi, dev_close_callback dev_close_fn, - struct sr_serial_dev_inst *serial, const char *prefix); + struct sr_serial_dev_inst *serial); #endif -SR_PRIV int std_session_send_df_header(const struct sr_dev_inst *sdi, - const char *prefix); -SR_PRIV int std_session_send_df_end(const struct sr_dev_inst *sdi, - const char *prefix); +SR_PRIV int std_session_send_df_header(const struct sr_dev_inst *sdi); +SR_PRIV int std_session_send_df_end(const struct sr_dev_inst *sdi); SR_PRIV int std_dev_clear(const struct sr_dev_driver *driver, std_dev_clear_callback clear_private); SR_PRIV GSList *std_dev_list(const struct sr_dev_driver *di); SR_PRIV int std_serial_dev_close(struct sr_dev_inst *sdi); +SR_PRIV GSList *std_scan_complete(struct sr_dev_driver *di, GSList *devices); /*--- resource.c ------------------------------------------------------------*/