27 #include "libsigrok-internal.h"
30 #define LOG_PREFIX "backend"
127 GSList *l = NULL, *m = NULL;
128 #if defined(HAVE_LIBUSB_1_0) && !defined(__FreeBSD__)
129 const struct libusb_version *lv;
132 m = g_slist_append(NULL, g_strdup(
"glib"));
133 m = g_slist_append(m, g_strdup_printf(
"%d.%d.%d (rt: %d.%d.%d/%d:%d)",
134 GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION,
135 glib_major_version, glib_minor_version, glib_micro_version,
136 glib_binary_age, glib_interface_age));
137 l = g_slist_append(l, m);
139 m = g_slist_append(NULL, g_strdup(
"libzip"));
140 m = g_slist_append(m, g_strdup_printf(
"%s", CONF_LIBZIP_VERSION));
141 l = g_slist_append(l, m);
143 #ifdef HAVE_LIBSERIALPORT
144 m = g_slist_append(NULL, g_strdup(
"libserialport"));
145 m = g_slist_append(m, g_strdup_printf(
"%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()));
148 l = g_slist_append(l, m);
150 #ifdef HAVE_LIBUSB_1_0
151 m = g_slist_append(NULL, g_strdup(
"libusb-1.0"));
153 m = g_slist_append(m, g_strdup_printf(
"%s", CONF_LIBUSB_1_0_VERSION));
155 lv = libusb_get_version();
156 m = g_slist_append(m, g_strdup_printf(
"%d.%d.%d.%d%s API 0x%08x",
157 lv->major, lv->minor, lv->micro, lv->nano, lv->rc,
158 #
if defined(LIBUSB_API_VERSION)
160 #elif defined(LIBUSBX_API_VERSION)
165 l = g_slist_append(l, m);
167 #ifdef HAVE_LIBHIDAPI
168 m = g_slist_append(NULL, g_strdup(
"hidapi"));
169 m = g_slist_append(m, g_strdup_printf(
"%s", CONF_LIBHIDAPI_VERSION));
170 l = g_slist_append(l, m);
173 m = g_slist_append(NULL, g_strdup(
"bluez"));
174 m = g_slist_append(m, g_strdup_printf(
"%s", CONF_LIBBLUEZ_VERSION));
175 l = g_slist_append(l, m);
178 m = g_slist_append(NULL, g_strdup(
"libftdi"));
179 m = g_slist_append(m, g_strdup_printf(
"%s", CONF_LIBFTDI_VERSION));
180 l = g_slist_append(l, m);
183 m = g_slist_append(NULL, g_strdup(
"libgpib"));
184 m = g_slist_append(m, g_strdup_printf(
"%s", CONF_LIBGPIB_VERSION));
185 l = g_slist_append(l, m);
187 #ifdef HAVE_LIBREVISA
188 m = g_slist_append(NULL, g_strdup(
"librevisa"));
189 m = g_slist_append(m, g_strdup_printf(
"%s", CONF_LIBREVISA_VERSION));
190 l = g_slist_append(l, m);
198 return g_strdup_printf(
"%s, %s-endian", CONF_HOST,
199 #ifdef WORDS_BIGENDIAN
212 s = g_string_sized_new(200);
214 g_string_append_printf(s,
"TCP, ");
216 g_string_append_printf(s,
"RPC, ");
218 #ifdef HAVE_SERIAL_COMM
219 g_string_append_printf(s,
"serial, ");
221 #ifdef HAVE_LIBREVISA
222 g_string_append_printf(s,
"VISA, ");
225 g_string_append_printf(s,
"GPIB, ");
227 #ifdef HAVE_LIBUSB_1_0
228 g_string_append_printf(s,
"USBTMC, ");
230 s->str[s->len - 2] =
'\0';
232 str = g_strdup(s->str);
233 g_string_free(s, TRUE);
238 static void print_versions(
void)
241 GSList *l, *l_orig, *m;
243 const char *lib, *version;
245 sr_dbg(
"libsigrok %s/%s.",
248 s = g_string_sized_new(200);
249 g_string_append(s,
"Libs: ");
251 for (l = l_orig; l; l = l->next) {
254 version = m->next->data;
255 g_string_append_printf(s,
"%s %s, ", lib, version);
256 g_slist_free_full(m, g_free);
258 g_slist_free(l_orig);
259 s->str[s->len - 2] =
'.';
260 s->str[s->len - 1] =
'\0';
261 sr_dbg(
"%s", s->str);
262 g_string_free(s, TRUE);
265 sr_dbg(
"Host: %s.", str);
269 sr_dbg(
"SCPI backends: %s.", str);
273 static void print_resourcepaths(
void)
277 sr_dbg(
"Firmware search paths:");
279 for (l = l_orig; l; l = l->next)
280 sr_dbg(
" - %s", (
const char *)l->data);
281 g_slist_free_full(l_orig, g_free);
293 static int sanity_check_all_drivers(
const struct sr_context *ctx)
295 int i, errors, ret =
SR_OK;
302 sr_spew(
"Sanity-checking all drivers.");
305 for (i = 0; drivers[i]; i++) {
308 d = (drivers[i]->
name) ? drivers[i]->
name :
"NULL";
310 if (!drivers[i]->
name) {
311 sr_err(
"No name in driver %d ('%s').", i, d);
315 sr_err(
"No longname in driver %d ('%s').", i, d);
319 sr_err(
"API version in driver %d ('%s') < 1.", i, d);
322 if (!drivers[i]->
init) {
323 sr_err(
"No init in driver %d ('%s').", i, d);
327 sr_err(
"No cleanup in driver %d ('%s').", i, d);
330 if (!drivers[i]->
scan) {
331 sr_err(
"No scan in driver %d ('%s').", i, d);
335 sr_err(
"No dev_list in driver %d ('%s').", i, d);
339 sr_err(
"No dev_clear in driver %d ('%s').", i, d);
344 sr_err(
"No config_set in driver %d ('%s').", i, d);
350 sr_err(
"No config_list in driver %d ('%s').", i, d);
354 sr_err(
"No dev_open in driver %d ('%s').", i, d);
358 sr_err(
"No dev_close in driver %d ('%s').", i, d);
362 sr_err(
"No dev_acquisition_start in driver %d ('%s').",
367 sr_err(
"No dev_acquisition_stop in driver %d ('%s').",
389 static int sanity_check_all_input_modules(
void)
391 int i, errors, ret =
SR_OK;
392 const struct sr_input_module **inputs;
395 sr_spew(
"Sanity-checking all input modules.");
398 for (i = 0; inputs[i]; i++) {
401 d = (inputs[i]->id) ? inputs[i]->
id :
"NULL";
403 if (!inputs[i]->
id) {
404 sr_err(
"No ID in module %d ('%s').", i, d);
407 if (!inputs[i]->name) {
408 sr_err(
"No name in module %d ('%s').", i, d);
411 if (!inputs[i]->desc) {
412 sr_err(
"No description in module %d ('%s').", i, d);
415 if (!inputs[i]->init) {
416 sr_err(
"No init in module %d ('%s').", i, d);
419 if (!inputs[i]->receive) {
420 sr_err(
"No receive in module %d ('%s').", i, d);
423 if (!inputs[i]->end) {
424 sr_err(
"No end in module %d ('%s').", i, d);
443 static int sanity_check_all_output_modules(
void)
445 int i, errors, ret =
SR_OK;
446 const struct sr_output_module **outputs;
449 sr_spew(
"Sanity-checking all output modules.");
452 for (i = 0; outputs[i]; i++) {
455 d = (outputs[i]->id) ? outputs[i]->
id :
"NULL";
457 if (!outputs[i]->
id) {
458 sr_err(
"No ID in module %d ('%s').", i, d);
461 if (!outputs[i]->name) {
462 sr_err(
"No name in module %d ('%s').", i, d);
465 if (!outputs[i]->desc) {
466 sr_err(
"No description in module '%s'.", d);
469 if (!outputs[i]->receive) {
470 sr_err(
"No receive in module '%s'.", d);
489 static int sanity_check_all_transform_modules(
void)
491 int i, errors, ret =
SR_OK;
492 const struct sr_transform_module **transforms;
495 sr_spew(
"Sanity-checking all transform modules.");
498 for (i = 0; transforms[i]; i++) {
501 d = (transforms[i]->id) ? transforms[i]->
id :
"NULL";
503 if (!transforms[i]->
id) {
504 sr_err(
"No ID in module %d ('%s').", i, d);
507 if (!transforms[i]->name) {
508 sr_err(
"No name in module %d ('%s').", i, d);
511 if (!transforms[i]->desc) {
512 sr_err(
"No description in module '%s'.", d);
517 if (!transforms[i]->receive) {
518 sr_err(
"No receive in module '%s'.", d);
558 print_resourcepaths();
561 sr_err(
"%s(): libsigrok context was NULL.", __func__);
565 context = g_malloc0(
sizeof(
struct sr_context));
567 sr_drivers_init(context);
569 if (sanity_check_all_drivers(context) < 0) {
570 sr_err(
"Internal driver error(s), aborting.");
574 if (sanity_check_all_input_modules() < 0) {
575 sr_err(
"Internal input module error(s), aborting.");
579 if (sanity_check_all_output_modules() < 0) {
580 sr_err(
"Internal output module error(s), aborting.");
584 if (sanity_check_all_transform_modules() < 0) {
585 sr_err(
"Internal transform module error(s), aborting.");
590 if ((ret = WSAStartup(MAKEWORD(2, 2), &wsadata)) != 0) {
591 sr_err(
"WSAStartup failed with error code %d.", ret);
597 #ifdef HAVE_LIBUSB_1_0
598 ret = libusb_init(&context->libusb_ctx);
599 if (LIBUSB_SUCCESS != ret) {
600 sr_err(
"libusb_init() returned %s.", libusb_error_name(ret));
605 #ifdef HAVE_LIBHIDAPI
613 if (hid_init() != 0) {
614 sr_err(
"HIDAPI hid_init() failed.");
643 sr_err(
"%s(): libsigrok context was NULL.", __func__);
647 sr_hw_cleanup_all(ctx);
653 #ifdef HAVE_LIBHIDAPI
656 #ifdef HAVE_LIBUSB_1_0
657 libusb_exit(ctx->libusb_ctx);
Generic/unspecified error.
int api_version
API version (currently 1).
char * sr_buildinfo_scpi_backends_get(void)
const char * sr_package_version_string_get(void)
Get the libsigrok package version number as a string.
int(* cleanup)(const struct sr_dev_driver *driver)
Called before driver is unloaded.
The public libsigrok header file to be used by frontends.
const char * name
Driver name.
int(* dev_open)(struct sr_dev_inst *sdi)
Open device.
const struct sr_input_module ** sr_input_list(void)
Returns a NULL-terminated list of all available input modules.
GSList *(* dev_list)(const struct sr_dev_driver *driver)
Get list of device instances the driver knows about.
const char * longname
Long name.
const char * sr_lib_version_string_get(void)
Get the libsigrok library version number as a string.
int(* dev_acquisition_start)(const struct sr_dev_inst *sdi)
Begin data acquisition on the specified device.
GSList * sr_resourcepaths_get(int res_type)
Get a list of paths where we look for resource (e.g.
struct sr_dev_driver ** sr_driver_list(const struct sr_context *ctx)
Return the list of supported hardware drivers.
GSList * sr_buildinfo_libs_get(void)
int sr_exit(struct sr_context *ctx)
Shutdown libsigrok.
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 sr_init(struct sr_context **ctx)
Initialize libsigrok.
int(* dev_clear)(const struct sr_dev_driver *driver)
Clear list of devices the driver knows about.
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.
int(* dev_acquisition_stop)(struct sr_dev_inst *sdi)
End data acquisition on the specified device.
char * sr_buildinfo_host_get(void)
int(* dev_close)(struct sr_dev_inst *sdi)
Close device.
GSList *(* scan)(struct sr_dev_driver *driver, GSList *options)
Scan for devices.
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.
int(* init)(struct sr_dev_driver *driver, struct sr_context *sr_ctx)
Called when driver is loaded, e.g.
const struct sr_transform_module ** sr_transform_list(void)
Returns a NULL-terminated list of all available transform modules.
const struct sr_output_module ** sr_output_list(void)
Returns a NULL-terminated list of all available output modules.
Opaque structure representing a libsigrok context.