27 #include "libsigrok-internal.h"
30 #define LOG_PREFIX "backend"
125 static void print_versions(
void)
128 #if defined(HAVE_LIBUSB_1_0) && !defined(__FreeBSD__)
129 const struct libusb_version *lv;
132 s = g_string_sized_new(200);
134 sr_dbg(
"libsigrok %s/%s (rt: %s/%s).",
138 g_string_append(s,
"Libs: ");
139 g_string_append_printf(s,
"glib %d.%d.%d (rt: %d.%d.%d/%d:%d), ",
140 GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION,
141 glib_major_version, glib_minor_version, glib_micro_version,
142 glib_binary_age, glib_interface_age);
143 g_string_append_printf(s,
"libzip %s, ", CONF_LIBZIP_VERSION);
144 #ifdef HAVE_LIBSERIALPORT
145 g_string_append_printf(s,
"libserialport %s/%s (rt: %s/%s), ",
146 SP_PACKAGE_VERSION_STRING, SP_LIB_VERSION_STRING,
147 sp_get_package_version_string(), sp_get_lib_version_string());
149 #ifdef HAVE_LIBUSB_1_0
151 g_string_append_printf(s,
"libusb-1.0 %s, ", CONF_LIBUSB_1_0_VERSION);
153 lv = libusb_get_version();
154 g_string_append_printf(s,
"libusb-1.0 %d.%d.%d.%d%s, ",
155 lv->major, lv->minor, lv->micro, lv->nano, lv->rc);
159 g_string_append_printf(s,
"libftdi %s, ", CONF_LIBFTDI_VERSION);
162 g_string_append_printf(s,
"libgpib %s, ", CONF_LIBGPIB_VERSION);
164 #ifdef HAVE_LIBREVISA
165 g_string_append_printf(s,
"librevisa %s, ", CONF_LIBREVISA_VERSION);
167 s->str[s->len - 2] =
'.';
168 s->str[s->len - 1] =
'\0';
169 sr_dbg(
"%s", s->str);
171 s = g_string_truncate(s, 0);
172 g_string_append_printf(s,
"Host: %s, ", CONF_HOST);
173 #ifdef WORDS_BIGENDIAN
174 g_string_append_printf(s,
"big-endian.");
176 g_string_append_printf(s,
"little-endian.");
178 sr_dbg(
"%s", s->str);
180 s = g_string_truncate(s, 0);
181 g_string_append_printf(s,
"SCPI backends: ");
183 g_string_append_printf(s,
"TCP, ");
185 g_string_append_printf(s,
"RPC, ");
187 #ifdef HAVE_LIBSERIALPORT
188 g_string_append_printf(s,
"serial, ");
190 #ifdef HAVE_LIBREVISA
191 g_string_append_printf(s,
"VISA, ");
194 g_string_append_printf(s,
"GPIB, ");
196 #ifdef HAVE_LIBUSB_1_0
197 g_string_append_printf(s,
"USBTMC, ");
199 s->str[s->len - 2] =
'.';
200 s->str[s->len - 1] =
'\0';
201 sr_dbg(
"%s", s->str);
203 g_string_free(s, TRUE);
215 static int sanity_check_all_drivers(
const struct sr_context *ctx)
217 int i, errors, ret =
SR_OK;
224 sr_spew(
"Sanity-checking all drivers.");
227 for (i = 0; drivers[i]; i++) {
230 d = (drivers[i]->
name) ? drivers[i]->
name :
"NULL";
232 if (!drivers[i]->
name) {
233 sr_err(
"No name in driver %d ('%s').", i, d);
237 sr_err(
"No longname in driver %d ('%s').", i, d);
241 sr_err(
"API version in driver %d ('%s') < 1.", i, d);
244 if (!drivers[i]->
init) {
245 sr_err(
"No init in driver %d ('%s').", i, d);
249 sr_err(
"No cleanup in driver %d ('%s').", i, d);
252 if (!drivers[i]->
scan) {
253 sr_err(
"No scan in driver %d ('%s').", i, d);
257 sr_err(
"No dev_list in driver %d ('%s').", i, d);
262 sr_err(
"No config_set in driver %d ('%s').", i, d);
266 sr_err(
"No config_list in driver %d ('%s').", i, d);
270 sr_err(
"No dev_open in driver %d ('%s').", i, d);
274 sr_err(
"No dev_close in driver %d ('%s').", i, d);
278 sr_err(
"No dev_acquisition_start in driver %d ('%s').",
283 sr_err(
"No dev_acquisition_stop in driver %d ('%s').",
305 static int sanity_check_all_input_modules(
void)
307 int i, errors, ret =
SR_OK;
308 const struct sr_input_module **inputs;
311 sr_spew(
"Sanity-checking all input modules.");
314 for (i = 0; inputs[i]; i++) {
317 d = (inputs[i]->id) ? inputs[i]->
id :
"NULL";
319 if (!inputs[i]->
id) {
320 sr_err(
"No ID in module %d ('%s').", i, d);
323 if (!inputs[i]->name) {
324 sr_err(
"No name in module %d ('%s').", i, d);
327 if (!inputs[i]->desc) {
328 sr_err(
"No description in module %d ('%s').", i, d);
331 if (!inputs[i]->init) {
332 sr_err(
"No init in module %d ('%s').", i, d);
335 if (!inputs[i]->receive) {
336 sr_err(
"No receive in module %d ('%s').", i, d);
339 if (!inputs[i]->end) {
340 sr_err(
"No end in module %d ('%s').", i, d);
359 static int sanity_check_all_output_modules(
void)
361 int i, errors, ret =
SR_OK;
362 const struct sr_output_module **outputs;
365 sr_spew(
"Sanity-checking all output modules.");
368 for (i = 0; outputs[i]; i++) {
371 d = (outputs[i]->id) ? outputs[i]->
id :
"NULL";
373 if (!outputs[i]->
id) {
374 sr_err(
"No ID in module %d ('%s').", i, d);
377 if (!outputs[i]->name) {
378 sr_err(
"No name in module %d ('%s').", i, d);
381 if (!outputs[i]->desc) {
382 sr_err(
"No description in module '%s'.", d);
385 if (!outputs[i]->receive) {
386 sr_err(
"No receive in module '%s'.", d);
405 static int sanity_check_all_transform_modules(
void)
407 int i, errors, ret =
SR_OK;
408 const struct sr_transform_module **transforms;
411 sr_spew(
"Sanity-checking all transform modules.");
414 for (i = 0; transforms[i]; i++) {
417 d = (transforms[i]->id) ? transforms[i]->
id :
"NULL";
419 if (!transforms[i]->
id) {
420 sr_err(
"No ID in module %d ('%s').", i, d);
423 if (!transforms[i]->name) {
424 sr_err(
"No name in module %d ('%s').", i, d);
427 if (!transforms[i]->desc) {
428 sr_err(
"No description in module '%s'.", d);
433 if (!transforms[i]->receive) {
434 sr_err(
"No receive in module '%s'.", d);
477 sr_err(
"%s(): libsigrok context was NULL.", __func__);
481 context = g_malloc0(
sizeof(
struct sr_context));
484 array = g_array_new(TRUE, FALSE,
sizeof(
struct sr_dev_driver *));
485 for (lists = drivers_lists; *lists; lists++)
486 for (drivers = *lists; *drivers; drivers++)
487 g_array_append_val(array, *drivers);
489 g_array_free(array, FALSE);
491 if (sanity_check_all_drivers(context) < 0) {
492 sr_err(
"Internal driver error(s), aborting.");
496 if (sanity_check_all_input_modules() < 0) {
497 sr_err(
"Internal input module error(s), aborting.");
501 if (sanity_check_all_output_modules() < 0) {
502 sr_err(
"Internal output module error(s), aborting.");
506 if (sanity_check_all_transform_modules() < 0) {
507 sr_err(
"Internal transform module error(s), aborting.");
512 if ((ret = WSAStartup(MAKEWORD(2, 2), &wsadata)) != 0) {
513 sr_err(
"WSAStartup failed with error code %d.", ret);
519 #ifdef HAVE_LIBUSB_1_0
520 ret = libusb_init(&context->libusb_ctx);
521 if (LIBUSB_SUCCESS != ret) {
522 sr_err(
"libusb_init() returned %s.", libusb_error_name(ret));
533 #if defined(HAVE_LIBUSB_1_0) || defined(_WIN32)
553 sr_err(
"%s(): libsigrok context was NULL.", __func__);
557 sr_hw_cleanup_all(ctx);
563 #ifdef HAVE_LIBUSB_1_0
564 libusb_exit(ctx->libusb_ctx);
int sr_resource_set_hooks(struct sr_context *ctx, sr_resource_open_callback open_cb, sr_resource_close_callback close_cb, sr_resource_read_callback read_cb, void *cb_data)
Install resource access hooks.
The public libsigrok header file to be used by frontends.
const struct sr_transform_module ** sr_transform_list(void)
Returns a NULL-terminated list of all available transform modules.
int sr_exit(struct sr_context *ctx)
Shutdown libsigrok.
GSList *(* scan)(struct sr_dev_driver *driver, GSList *options)
Scan for devices.
Generic/unspecified error.
int(* dev_acquisition_stop)(struct sr_dev_inst *sdi, void *cb_data)
End data acquisition on the specified device.
#define SR_PACKAGE_VERSION_STRING
The libsigrok package version ("major.minor.micro") as string.
int api_version
API version (currently 1).
const char * sr_package_version_string_get(void)
Get the libsigrok package version number as a string.
int(* dev_acquisition_start)(const struct sr_dev_inst *sdi, void *cb_data)
Begin data acquisition on the specified device.
#define SR_LIB_VERSION_STRING
The libsigrok libtool version ("current:revision:age") as string.
const char * name
Driver name.
const char * longname
Long name.
const char * sr_lib_version_string_get(void)
Get the libsigrok library version number as a string.
GSList *(* dev_list)(const struct sr_dev_driver *driver)
Get list of device instances the driver knows about.
int(* cleanup)(const struct sr_dev_driver *driver)
Called before driver is unloaded.
const struct sr_output_module ** sr_output_list(void)
Returns a NULL-terminated list of all available output modules.
int(* config_set)(uint32_t key, GVariant *data, const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
Set value of a configuration key in driver or a given device instance.
Opaque structure representing a libsigrok context.
int(* init)(struct sr_dev_driver *driver, struct sr_context *sr_ctx)
Called when driver is loaded, e.g.
void * context
Device driver context, considered private.
int(* dev_close)(struct sr_dev_inst *sdi)
Close device.
const struct sr_input_module ** sr_input_list(void)
Returns a NULL-terminated list of all available input modules.
struct sr_dev_driver ** sr_driver_list(const struct sr_context *ctx)
Return the list of supported hardware drivers.
int(* config_list)(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
List all possible values for a configuration key in a device instance.
int(* dev_open)(struct sr_dev_inst *sdi)
Open device.
int sr_init(struct sr_context **ctx)
Initialize libsigrok.