27 #include "libsigrok-internal.h" 31 #define LOG_PREFIX "backend" 128 GSList *l = NULL, *m = NULL;
129 #if defined(HAVE_LIBUSB_1_0) && !defined(__FreeBSD__) 130 const struct libusb_version *lv;
133 m = g_slist_append(NULL, g_strdup(
"glib"));
134 m = g_slist_append(m, g_strdup_printf(
"%d.%d.%d (rt: %d.%d.%d/%d:%d)",
135 GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION,
136 glib_major_version, glib_minor_version, glib_micro_version,
137 glib_binary_age, glib_interface_age));
138 l = g_slist_append(l, m);
140 m = g_slist_append(NULL, g_strdup(
"zlib"));
141 m = g_slist_append(m, g_strdup_printf(
"%s", CONF_ZLIB_VERSION));
142 l = g_slist_append(l, m);
144 m = g_slist_append(NULL, g_strdup(
"libzip"));
145 m = g_slist_append(m, g_strdup_printf(
"%s", CONF_LIBZIP_VERSION));
146 l = g_slist_append(l, m);
148 m = g_slist_append(NULL, g_strdup(
"minilzo"));
150 l = g_slist_append(l, m);
152 #ifdef HAVE_LIBSERIALPORT 153 m = g_slist_append(NULL, g_strdup(
"libserialport"));
154 m = g_slist_append(m, g_strdup_printf(
"%s/%s (rt: %s/%s)",
155 SP_PACKAGE_VERSION_STRING, SP_LIB_VERSION_STRING,
156 sp_get_package_version_string(), sp_get_lib_version_string()));
157 l = g_slist_append(l, m);
159 #ifdef HAVE_LIBUSB_1_0 160 m = g_slist_append(NULL, g_strdup(
"libusb-1.0"));
162 m = g_slist_append(m, g_strdup_printf(
"%s", CONF_LIBUSB_1_0_VERSION));
164 lv = libusb_get_version();
165 m = g_slist_append(m, g_strdup_printf(
"%d.%d.%d.%d%s API 0x%08x",
166 lv->major, lv->minor, lv->micro, lv->nano, lv->rc,
167 #
if defined(LIBUSB_API_VERSION)
169 #elif defined(LIBUSBX_API_VERSION)
174 l = g_slist_append(l, m);
176 #ifdef HAVE_LIBHIDAPI 177 m = g_slist_append(NULL, g_strdup(
"hidapi"));
178 m = g_slist_append(m, g_strdup_printf(
"%s", CONF_LIBHIDAPI_VERSION));
179 l = g_slist_append(l, m);
182 m = g_slist_append(NULL, g_strdup(
"bluez"));
183 m = g_slist_append(m, g_strdup_printf(
"%s", CONF_LIBBLUEZ_VERSION));
184 l = g_slist_append(l, m);
187 m = g_slist_append(NULL, g_strdup(
"libftdi"));
188 m = g_slist_append(m, g_strdup_printf(
"%s", CONF_LIBFTDI_VERSION));
189 l = g_slist_append(l, m);
192 m = g_slist_append(NULL, g_strdup(
"libgpib"));
193 m = g_slist_append(m, g_strdup_printf(
"%s", CONF_LIBGPIB_VERSION));
194 l = g_slist_append(l, m);
196 #ifdef HAVE_LIBREVISA 197 m = g_slist_append(NULL, g_strdup(
"librevisa"));
198 m = g_slist_append(m, g_strdup_printf(
"%s", CONF_LIBREVISA_VERSION));
199 l = g_slist_append(l, m);
207 return g_strdup_printf(
"%s, %s-endian", CONF_HOST,
208 #ifdef WORDS_BIGENDIAN
221 s = g_string_sized_new(200);
223 g_string_append_printf(s,
"TCP, ");
225 g_string_append_printf(s,
"RPC, ");
227 #ifdef HAVE_SERIAL_COMM 228 g_string_append_printf(s,
"serial, ");
230 #ifdef HAVE_LIBREVISA 231 g_string_append_printf(s,
"VISA, ");
234 g_string_append_printf(s,
"GPIB, ");
236 #ifdef HAVE_LIBUSB_1_0 237 g_string_append_printf(s,
"USBTMC, ");
239 s->str[s->len - 2] =
'\0';
241 str = g_strdup(s->str);
242 g_string_free(s, TRUE);
247 static void print_versions(
void)
250 GSList *l, *l_orig, *m;
252 const char *lib, *version;
254 sr_dbg(
"libsigrok %s/%s.",
257 s = g_string_sized_new(200);
258 g_string_append(s,
"Libs: ");
260 for (l = l_orig; l; l = l->next) {
263 version = m->next->data;
264 g_string_append_printf(s,
"%s %s, ", lib, version);
265 g_slist_free_full(m, g_free);
267 g_slist_free(l_orig);
268 s->str[s->len - 2] =
'.';
269 s->str[s->len - 1] =
'\0';
270 sr_dbg(
"%s", s->str);
271 g_string_free(s, TRUE);
274 sr_dbg(
"Host: %s.", str);
278 sr_dbg(
"SCPI backends: %s.", str);
282 static void print_resourcepaths(
void)
286 sr_dbg(
"Firmware search paths:");
288 for (l = l_orig; l; l = l->next)
289 sr_dbg(
" - %s", (
const char *)l->data);
290 g_slist_free_full(l_orig, g_free);
302 static int sanity_check_all_drivers(
const struct sr_context *ctx)
304 int i, errors, ret =
SR_OK;
311 sr_spew(
"Sanity-checking all drivers.");
314 for (i = 0; drivers[i]; i++) {
317 d = (drivers[i]->
name) ? drivers[i]->
name :
"NULL";
319 if (!drivers[i]->
name) {
320 sr_err(
"No name in driver %d ('%s').", i, d);
324 sr_err(
"No longname in driver %d ('%s').", i, d);
328 sr_err(
"API version in driver %d ('%s') < 1.", i, d);
331 if (!drivers[i]->
init) {
332 sr_err(
"No init in driver %d ('%s').", i, d);
336 sr_err(
"No cleanup in driver %d ('%s').", i, d);
339 if (!drivers[i]->
scan) {
340 sr_err(
"No scan in driver %d ('%s').", i, d);
344 sr_err(
"No dev_list in driver %d ('%s').", i, d);
348 sr_err(
"No dev_clear in driver %d ('%s').", i, d);
353 sr_err(
"No config_set in driver %d ('%s').", i, d);
359 sr_err(
"No config_list in driver %d ('%s').", i, d);
363 sr_err(
"No dev_open in driver %d ('%s').", i, d);
367 sr_err(
"No dev_close in driver %d ('%s').", i, d);
371 sr_err(
"No dev_acquisition_start in driver %d ('%s').",
376 sr_err(
"No dev_acquisition_stop in driver %d ('%s').",
398 static int sanity_check_all_input_modules(
void)
400 int i, errors, ret =
SR_OK;
401 const struct sr_input_module **inputs;
404 sr_spew(
"Sanity-checking all input modules.");
407 for (i = 0; inputs[i]; i++) {
410 d = (inputs[i]->id) ? inputs[i]->
id :
"NULL";
412 if (!inputs[i]->
id) {
413 sr_err(
"No ID in module %d ('%s').", i, d);
416 if (!inputs[i]->
name) {
417 sr_err(
"No name in module %d ('%s').", i, d);
420 if (!inputs[i]->desc) {
421 sr_err(
"No description in module %d ('%s').", i, d);
424 if (!inputs[i]->init) {
425 sr_err(
"No init in module %d ('%s').", i, d);
428 if (!inputs[i]->receive) {
429 sr_err(
"No receive in module %d ('%s').", i, d);
432 if (!inputs[i]->end) {
433 sr_err(
"No end in module %d ('%s').", i, d);
452 static int sanity_check_all_output_modules(
void)
454 int i, errors, ret =
SR_OK;
455 const struct sr_output_module **outputs;
458 sr_spew(
"Sanity-checking all output modules.");
461 for (i = 0; outputs[i]; i++) {
464 d = (outputs[i]->id) ? outputs[i]->
id :
"NULL";
466 if (!outputs[i]->
id) {
467 sr_err(
"No ID in module %d ('%s').", i, d);
470 if (!outputs[i]->
name) {
471 sr_err(
"No name in module %d ('%s').", i, d);
474 if (!outputs[i]->desc) {
475 sr_err(
"No description in module '%s'.", d);
478 if (!outputs[i]->receive) {
479 sr_err(
"No receive in module '%s'.", d);
498 static int sanity_check_all_transform_modules(
void)
500 int i, errors, ret =
SR_OK;
501 const struct sr_transform_module **transforms;
504 sr_spew(
"Sanity-checking all transform modules.");
507 for (i = 0; transforms[i]; i++) {
510 d = (transforms[i]->id) ? transforms[i]->
id :
"NULL";
512 if (!transforms[i]->
id) {
513 sr_err(
"No ID in module %d ('%s').", i, d);
516 if (!transforms[i]->
name) {
517 sr_err(
"No name in module %d ('%s').", i, d);
520 if (!transforms[i]->desc) {
521 sr_err(
"No description in module '%s'.", d);
526 if (!transforms[i]->receive) {
527 sr_err(
"No receive in module '%s'.", d);
567 print_resourcepaths();
570 sr_err(
"%s(): libsigrok context was NULL.", __func__);
574 context = g_malloc0(
sizeof(
struct sr_context));
576 sr_drivers_init(context);
578 if (sanity_check_all_drivers(context) < 0) {
579 sr_err(
"Internal driver error(s), aborting.");
583 if (sanity_check_all_input_modules() < 0) {
584 sr_err(
"Internal input module error(s), aborting.");
588 if (sanity_check_all_output_modules() < 0) {
589 sr_err(
"Internal output module error(s), aborting.");
593 if (sanity_check_all_transform_modules() < 0) {
594 sr_err(
"Internal transform module error(s), aborting.");
599 if ((ret = WSAStartup(MAKEWORD(2, 2), &wsadata)) != 0) {
600 sr_err(
"WSAStartup failed with error code %d.", ret);
607 sr_err(
"lzo_init() failed with return code %d.", ret);
608 sr_err(
"This usually indicates a compiler bug. Recompile without");
609 sr_err(
"optimizations, and enable '-DLZO_DEBUG' for diagnostics.");
614 #ifdef HAVE_LIBUSB_1_0 615 ret = libusb_init(&context->libusb_ctx);
616 if (LIBUSB_SUCCESS != ret) {
617 sr_err(
"libusb_init() returned %s.", libusb_error_name(ret));
622 #ifdef HAVE_LIBHIDAPI 630 if (hid_init() != 0) {
631 sr_err(
"HIDAPI hid_init() failed.");
660 sr_err(
"%s(): libsigrok context was NULL.", __func__);
664 sr_hw_cleanup_all(ctx);
670 #ifdef HAVE_LIBHIDAPI 673 #ifdef HAVE_LIBUSB_1_0 674 libusb_exit(ctx->libusb_ctx);
int(* cleanup)(const struct sr_dev_driver *driver)
Called before driver is unloaded.
const char * name
Driver name.
const struct sr_output_module ** sr_output_list(void)
Returns a NULL-terminated list of all available output modules.
GSList * sr_resourcepaths_get(int res_type)
Get a list of paths where we look for resource (e.g.
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.
const char * longname
Long name.
GSList *(* dev_list)(const struct sr_dev_driver *driver)
Get list of device instances the driver knows about.
int(* dev_acquisition_stop)(struct sr_dev_inst *sdi)
End data acquisition on the specified device.
int(* dev_close)(struct sr_dev_inst *sdi)
Close device.
const struct sr_transform_module ** sr_transform_list(void)
Returns a NULL-terminated list of all available transform modules.
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_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.
GSList * sr_buildinfo_libs_get(void)
int(* dev_open)(struct sr_dev_inst *sdi)
Open device.
int sr_init(struct sr_context **ctx)
Initialize libsigrok.
int(* dev_acquisition_start)(const struct sr_dev_inst *sdi)
Begin data acquisition on the specified device.
int(* init)(struct sr_dev_driver *driver, struct sr_context *sr_ctx)
Called when driver is loaded, e.g.
char * sr_buildinfo_host_get(void)
Generic/unspecified error.
const struct sr_input_module ** sr_input_list(void)
Returns a NULL-terminated list of all available input modules.
int(* dev_clear)(const struct sr_dev_driver *driver)
Clear list of devices the driver knows about.
int api_version
API version (currently 1).
Opaque structure representing a libsigrok context.
int sr_exit(struct sr_context *ctx)
Shutdown libsigrok.
GSList *(* scan)(struct sr_dev_driver *driver, GSList *options)
Scan for devices.
struct sr_dev_driver ** sr_driver_list(const struct sr_context *ctx)
Return the list of supported hardware drivers.
The public libsigrok header file to be used by frontends.
const char * sr_package_version_string_get(void)
Get the libsigrok package version number as a string.
char * sr_buildinfo_scpi_backends_get(void)
const char * sr_lib_version_string_get(void)
Get the libsigrok library version number as a string.