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",
157 lv->major, lv->minor, lv->micro, lv->nano, lv->rc));
159 l = g_slist_append(l, m);
162 m = g_slist_append(NULL, g_strdup(
"libftdi"));
163 m = g_slist_append(m, g_strdup_printf(
"%s", CONF_LIBFTDI_VERSION));
164 l = g_slist_append(l, m);
167 m = g_slist_append(NULL, g_strdup(
"libgpib"));
168 m = g_slist_append(m, g_strdup_printf(
"%s", CONF_LIBGPIB_VERSION));
169 l = g_slist_append(l, m);
171 #ifdef HAVE_LIBREVISA
172 m = g_slist_append(NULL, g_strdup(
"librevisa"));
173 m = g_slist_append(m, g_strdup_printf(
"%s", CONF_LIBREVISA_VERSION));
174 l = g_slist_append(l, m);
182 return g_strdup_printf(
"%s, %s-endian", CONF_HOST,
183 #ifdef WORDS_BIGENDIAN
196 s = g_string_sized_new(200);
198 g_string_append_printf(s,
"TCP, ");
200 g_string_append_printf(s,
"RPC, ");
202 #ifdef HAVE_LIBSERIALPORT
203 g_string_append_printf(s,
"serial, ");
205 #ifdef HAVE_LIBREVISA
206 g_string_append_printf(s,
"VISA, ");
209 g_string_append_printf(s,
"GPIB, ");
211 #ifdef HAVE_LIBUSB_1_0
212 g_string_append_printf(s,
"USBTMC, ");
214 s->str[s->len - 2] =
'\0';
216 str = g_strdup(s->str);
217 g_string_free(s, TRUE);
222 static void print_versions(
void)
225 GSList *l, *l_orig, *m;
227 const char *lib, *version;
229 sr_dbg(
"libsigrok %s/%s (rt: %s/%s).",
233 s = g_string_sized_new(200);
234 g_string_append(s,
"Libs: ");
236 for (l = l_orig; l; l = l->next) {
239 version = m->next->data;
240 g_string_append_printf(s,
"%s %s, ", lib, version);
241 g_slist_free_full(m, g_free);
243 g_slist_free(l_orig);
244 s->str[s->len - 2] =
'.';
245 s->str[s->len - 1] =
'\0';
246 sr_dbg(
"%s", s->str);
247 g_string_free(s, TRUE);
250 sr_dbg(
"Host: %s.", str);
254 sr_dbg(
"SCPI backends: %s.", str);
267 static int sanity_check_all_drivers(
const struct sr_context *ctx)
269 int i, errors, ret =
SR_OK;
276 sr_spew(
"Sanity-checking all drivers.");
279 for (i = 0; drivers[i]; i++) {
282 d = (drivers[i]->
name) ? drivers[i]->
name :
"NULL";
284 if (!drivers[i]->
name) {
285 sr_err(
"No name in driver %d ('%s').", i, d);
289 sr_err(
"No longname in driver %d ('%s').", i, d);
293 sr_err(
"API version in driver %d ('%s') < 1.", i, d);
296 if (!drivers[i]->
init) {
297 sr_err(
"No init in driver %d ('%s').", i, d);
301 sr_err(
"No cleanup in driver %d ('%s').", i, d);
304 if (!drivers[i]->
scan) {
305 sr_err(
"No scan in driver %d ('%s').", i, d);
309 sr_err(
"No dev_list in driver %d ('%s').", i, d);
315 sr_err(
"No config_set in driver %d ('%s').", i, d);
321 sr_err(
"No config_list in driver %d ('%s').", i, d);
325 sr_err(
"No dev_open in driver %d ('%s').", i, d);
329 sr_err(
"No dev_close in driver %d ('%s').", i, d);
333 sr_err(
"No dev_acquisition_start in driver %d ('%s').",
338 sr_err(
"No dev_acquisition_stop in driver %d ('%s').",
360 static int sanity_check_all_input_modules(
void)
362 int i, errors, ret =
SR_OK;
363 const struct sr_input_module **inputs;
366 sr_spew(
"Sanity-checking all input modules.");
369 for (i = 0; inputs[i]; i++) {
372 d = (inputs[i]->id) ? inputs[i]->
id :
"NULL";
374 if (!inputs[i]->
id) {
375 sr_err(
"No ID in module %d ('%s').", i, d);
378 if (!inputs[i]->name) {
379 sr_err(
"No name in module %d ('%s').", i, d);
382 if (!inputs[i]->desc) {
383 sr_err(
"No description in module %d ('%s').", i, d);
386 if (!inputs[i]->init) {
387 sr_err(
"No init in module %d ('%s').", i, d);
390 if (!inputs[i]->receive) {
391 sr_err(
"No receive in module %d ('%s').", i, d);
394 if (!inputs[i]->end) {
395 sr_err(
"No end in module %d ('%s').", i, d);
414 static int sanity_check_all_output_modules(
void)
416 int i, errors, ret =
SR_OK;
417 const struct sr_output_module **outputs;
420 sr_spew(
"Sanity-checking all output modules.");
423 for (i = 0; outputs[i]; i++) {
426 d = (outputs[i]->id) ? outputs[i]->
id :
"NULL";
428 if (!outputs[i]->
id) {
429 sr_err(
"No ID in module %d ('%s').", i, d);
432 if (!outputs[i]->name) {
433 sr_err(
"No name in module %d ('%s').", i, d);
436 if (!outputs[i]->desc) {
437 sr_err(
"No description in module '%s'.", d);
440 if (!outputs[i]->receive) {
441 sr_err(
"No receive in module '%s'.", d);
460 static int sanity_check_all_transform_modules(
void)
462 int i, errors, ret =
SR_OK;
463 const struct sr_transform_module **transforms;
466 sr_spew(
"Sanity-checking all transform modules.");
469 for (i = 0; transforms[i]; i++) {
472 d = (transforms[i]->id) ? transforms[i]->
id :
"NULL";
474 if (!transforms[i]->
id) {
475 sr_err(
"No ID in module %d ('%s').", i, d);
478 if (!transforms[i]->name) {
479 sr_err(
"No name in module %d ('%s').", i, d);
482 if (!transforms[i]->desc) {
483 sr_err(
"No description in module '%s'.", d);
488 if (!transforms[i]->receive) {
489 sr_err(
"No receive in module '%s'.", d);
530 sr_err(
"%s(): libsigrok context was NULL.", __func__);
534 context = g_malloc0(
sizeof(
struct sr_context));
536 sr_drivers_init(context);
538 if (sanity_check_all_drivers(context) < 0) {
539 sr_err(
"Internal driver error(s), aborting.");
543 if (sanity_check_all_input_modules() < 0) {
544 sr_err(
"Internal input module error(s), aborting.");
548 if (sanity_check_all_output_modules() < 0) {
549 sr_err(
"Internal output module error(s), aborting.");
553 if (sanity_check_all_transform_modules() < 0) {
554 sr_err(
"Internal transform module error(s), aborting.");
559 if ((ret = WSAStartup(MAKEWORD(2, 2), &wsadata)) != 0) {
560 sr_err(
"WSAStartup failed with error code %d.", ret);
566 #ifdef HAVE_LIBUSB_1_0
567 ret = libusb_init(&context->libusb_ctx);
568 if (LIBUSB_SUCCESS != ret) {
569 sr_err(
"libusb_init() returned %s.", libusb_error_name(ret));
580 #if defined(HAVE_LIBUSB_1_0) || defined(_WIN32)
600 sr_err(
"%s(): libsigrok context was NULL.", __func__);
604 sr_hw_cleanup_all(ctx);
610 #ifdef HAVE_LIBUSB_1_0
611 libusb_exit(ctx->libusb_ctx);
Generic/unspecified error.
const char * sr_lib_version_string_get(void)
Get the libsigrok library version number as a string.
int api_version
API version (currently 1).
#define SR_PACKAGE_VERSION_STRING
The libsigrok package version ("major.minor.micro") as string.
#define SR_LIB_VERSION_STRING
The libsigrok libtool version ("current:revision:age") as string.
int(* cleanup)(const struct sr_dev_driver *driver)
Called before driver is unloaded.
The public libsigrok header file to be used by frontends.
GSList * sr_buildinfo_libs_get(void)
const char * name
Driver name.
int(* dev_open)(struct sr_dev_inst *sdi)
Open device.
struct sr_dev_driver ** sr_driver_list(const struct sr_context *ctx)
Return the list of supported hardware drivers.
GSList *(* dev_list)(const struct sr_dev_driver *driver)
Get list of device instances the driver knows about.
const char * longname
Long name.
char * sr_buildinfo_host_get(void)
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_start)(const struct sr_dev_inst *sdi)
Begin data acquisition on the specified device.
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_exit(struct sr_context *ctx)
Shutdown libsigrok.
const struct sr_transform_module ** sr_transform_list(void)
Returns a NULL-terminated list of all available transform modules.
const char * sr_package_version_string_get(void)
Get the libsigrok package version number as a string.
int(* dev_acquisition_stop)(struct sr_dev_inst *sdi)
End data acquisition on the specified device.
int sr_init(struct sr_context **ctx)
Initialize libsigrok.
const struct sr_output_module ** sr_output_list(void)
Returns a NULL-terminated list of all available output modules.
int(* dev_close)(struct sr_dev_inst *sdi)
Close device.
GSList *(* scan)(struct sr_dev_driver *driver, GSList *options)
Scan for devices.
const struct sr_input_module ** sr_input_list(void)
Returns a NULL-terminated list of all available input 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.
char * sr_buildinfo_scpi_backends_get(void)
int(* init)(struct sr_dev_driver *driver, struct sr_context *sr_ctx)
Called when driver is loaded, e.g.
Opaque structure representing a libsigrok context.