X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fzeroplus-logic-cube%2Fzeroplus.c;h=ec34d306cb21d4de4c4779e45c12dfb9c040d635;hb=328bafabd4781e416e3d711dabd8c4c43f219794;hp=3145d767063c035dbd59d78cdafa5a1e4e26463c;hpb=69b07d14db24055d23bbb4c4cc718ec073ece0b7;p=libsigrok.git diff --git a/hardware/zeroplus-logic-cube/zeroplus.c b/hardware/zeroplus-logic-cube/zeroplus.c index 3145d767..ec34d306 100644 --- a/hardware/zeroplus-logic-cube/zeroplus.c +++ b/hardware/zeroplus-logic-cube/zeroplus.c @@ -71,12 +71,12 @@ static model_t zeroplus_models[] = { }; static const int hwcaps[] = { - SR_HWCAP_LOGIC_ANALYZER, - SR_HWCAP_SAMPLERATE, - SR_HWCAP_CAPTURE_RATIO, + SR_CONF_LOGIC_ANALYZER, + SR_CONF_SAMPLERATE, + SR_CONF_CAPTURE_RATIO, /* These are really implemented in the driver, not the hardware. */ - SR_HWCAP_LIMIT_SAMPLES, + SR_CONF_LIMIT_SAMPLES, 0, }; @@ -85,30 +85,14 @@ static const int hwcaps[] = { * We currently ignore other untested/unsupported devices here. */ static const char *probe_names[NUM_PROBES + 1] = { - "A0", - "A1", - "A2", - "A3", - "A4", - "A5", - "A6", - "A7", - "B0", - "B1", - "B2", - "B3", - "B4", - "B5", - "B6", - "B7", + "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", + "B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", NULL, }; /* List of struct sr_dev_inst, maintained by dev_open()/dev_close(). */ SR_PRIV struct sr_dev_driver zeroplus_logic_cube_driver_info; -static struct sr_dev_driver *zdi = &zeroplus_logic_cube_driver_info; - -static libusb_context *usb_context = NULL; +static struct sr_dev_driver *di = &zeroplus_logic_cube_driver_info; /* * The hardware supports more samplerates than these, but these are the @@ -279,7 +263,7 @@ static int clear_instances(void) struct drv_context *drvc; struct dev_context *devc; - drvc = zdi->priv; + drvc = di->priv; for (l = drvc->instances; l; l = l->next) { sdi = l->data; if (!(devc = sdi->priv)) { @@ -303,7 +287,7 @@ static int clear_instances(void) * API callbacks */ -static int hw_init(void) +static int hw_init(struct sr_context *sr_ctx) { struct drv_context *drvc; @@ -311,12 +295,8 @@ static int hw_init(void) sr_err("zeroplus: driver context malloc failed."); return SR_ERR_MALLOC; } - zdi->priv = drvc; - - if (libusb_init(&usb_context) != 0) { - sr_err("zp: Failed to initialize USB."); - return 0; - } + drvc->sr_ctx = sr_ctx; + di->priv = drvc; return SR_OK; } @@ -334,19 +314,21 @@ static GSList *hw_scan(GSList *options) int ret, devcnt, i, j; (void)options; - drvc = zdi->priv; + + drvc = di->priv; devices = NULL; clear_instances(); /* Find all ZEROPLUS analyzers and add them to device list. */ devcnt = 0; - libusb_get_device_list(usb_context, &devlist); /* TODO: Errors. */ + libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist); /* TODO: Errors. */ for (i = 0; devlist[i]; i++) { ret = libusb_get_device_descriptor(devlist[i], &des); if (ret != 0) { - sr_err("zp: failed to get device descriptor: %d", ret); + sr_err("zp: failed to get device descriptor: %s", + libusb_error_name(ret)); continue; } @@ -368,7 +350,7 @@ static GSList *hw_scan(GSList *options) sr_err("zp: %s: sr_dev_inst_new failed", __func__); return NULL; } - sdi->driver = zdi; + sdi->driver = di; /* Allocate memory for our private driver context. */ if (!(devc = g_try_malloc0(sizeof(struct dev_context)))) { @@ -413,7 +395,7 @@ static GSList *hw_dev_list(void) { struct drv_context *drvc; - drvc = zdi->priv; + drvc = di->priv; return drvc->instances; } @@ -421,6 +403,7 @@ static GSList *hw_dev_list(void) static int hw_dev_open(struct sr_dev_inst *sdi) { struct dev_context *devc; + struct drv_context *drvc = di->priv; libusb_device **devlist, *dev; struct libusb_device_descriptor des; int device_count, ret, i; @@ -430,7 +413,8 @@ static int hw_dev_open(struct sr_dev_inst *sdi) return SR_ERR_ARG; } - device_count = libusb_get_device_list(usb_context, &devlist); + device_count = libusb_get_device_list(drvc->sr_ctx->libusb_ctx, + &devlist); if (device_count < 0) { sr_err("zp: Failed to retrieve device list"); return SR_ERR; @@ -439,8 +423,8 @@ static int hw_dev_open(struct sr_dev_inst *sdi) dev = NULL; for (i = 0; i < device_count; i++) { if ((ret = libusb_get_device_descriptor(devlist[i], &des))) { - sr_err("fx2lafw: Failed to get device descriptor: %d.", - ret); + sr_err("zp: Failed to get device descriptor: %s.", + libusb_error_name(ret)); continue; } if (libusb_get_bus_number(devlist[i]) == devc->usb->bus @@ -461,20 +445,21 @@ static int hw_dev_open(struct sr_dev_inst *sdi) sdi->index, devc->usb->bus, devc->usb->address, USB_INTERFACE); } else { - sr_err("zp: failed to open device: %d", ret); + sr_err("zp: failed to open device: %s", libusb_error_name(ret)); return SR_ERR; } ret = libusb_set_configuration(devc->usb->devhdl, USB_CONFIGURATION); if (ret < 0) { - sr_err("zp: Unable to set USB configuration %d: %d", - USB_CONFIGURATION, ret); + sr_err("zp: Unable to set USB configuration %d: %s", + USB_CONFIGURATION, libusb_error_name(ret)); return SR_ERR; } ret = libusb_claim_interface(devc->usb->devhdl, USB_INTERFACE); if (ret != 0) { - sr_err("zp: Unable to claim interface: %d", ret); + sr_err("zp: Unable to claim interface: %s", + libusb_error_name(ret)); return SR_ERR; } @@ -536,49 +521,27 @@ static int hw_cleanup(void) { struct drv_context *drvc; - if (!(drvc = zdi->priv)) + if (!(drvc = di->priv)) return SR_OK; clear_instances(); - if (usb_context) - libusb_exit(usb_context); - usb_context = NULL; - return SR_OK; } -static int hw_info_get(int info_id, const void **data, - const struct sr_dev_inst *sdi) +static int config_get(int id, const void **data, const struct sr_dev_inst *sdi) { struct dev_context *devc; - switch (info_id) { + switch (id) { case SR_DI_HWCAPS: *data = hwcaps; break; - case SR_DI_NUM_PROBES: - if (sdi) { - devc = sdi->priv; - *data = GINT_TO_POINTER(devc->num_channels); - sr_spew("zp: %s: Returning number of channels: %d.", - __func__, devc->num_channels); - } else - return SR_ERR; - break; - case SR_DI_PROBE_NAMES: - *data = probe_names; - sr_spew("zp: %s: Returning probenames.", __func__); - break; - case SR_DI_SAMPLERATES: - *data = &samplerates; - sr_spew("zp: %s: Returning samplerates.", __func__); - break; case SR_DI_TRIGGER_TYPES: *data = TRIGGER_TYPES; sr_spew("zp: %s: Returning triggertypes: %s.", __func__, TRIGGER_TYPES); break; - case SR_DI_CUR_SAMPLERATE: + case SR_CONF_SAMPLERATE: if (sdi) { devc = sdi->priv; *data = &devc->cur_samplerate; @@ -656,8 +619,7 @@ static int set_capture_ratio(struct dev_context *devc, uint64_t ratio) return SR_OK; } -static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap, - const void *value) +static int config_set(int id, const void *value, const struct sr_dev_inst *sdi) { struct dev_context *devc; @@ -671,18 +633,34 @@ static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap, return SR_ERR_ARG; } - switch (hwcap) { - case SR_HWCAP_SAMPLERATE: + switch (id) { + case SR_CONF_SAMPLERATE: return set_samplerate(devc, *(const uint64_t *)value); - case SR_HWCAP_LIMIT_SAMPLES: + case SR_CONF_LIMIT_SAMPLES: return set_limit_samples(devc, *(const uint64_t *)value); - case SR_HWCAP_CAPTURE_RATIO: + case SR_CONF_CAPTURE_RATIO: return set_capture_ratio(devc, *(const uint64_t *)value); default: return SR_ERR; } } +static int config_list(int key, const void **data, const struct sr_dev_inst *sdi) +{ + + (void)sdi; + + switch (key) { + case SR_CONF_SAMPLERATE: + *data = &samplerates; + break; + default: + return SR_ERR_ARG; + } + + return SR_OK; +} + static void set_triggerbar(struct dev_context *devc) { unsigned int ramsize; @@ -718,7 +696,6 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, struct sr_datafeed_packet packet; struct sr_datafeed_logic logic; struct sr_datafeed_header header; - struct sr_datafeed_meta_logic meta; //uint64_t samples_read; int res; unsigned int packet_num; @@ -758,13 +735,6 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, gettimeofday(&header.starttime, NULL); sr_session_send(cb_data, &packet); - /* Send metadata about the SR_DF_LOGIC packets to come. */ - packet.type = SR_DF_META_LOGIC; - packet.payload = &meta; - meta.samplerate = devc->cur_samplerate; - meta.num_probes = devc->num_channels; - sr_session_send(cb_data, &packet); - if (!(buf = g_try_malloc(PACKET_SIZE))) { sr_err("zp: %s: buf malloc failed", __func__); return SR_ERR_MALLOC; @@ -827,10 +797,11 @@ SR_PRIV struct sr_dev_driver zeroplus_logic_cube_driver_info = { .scan = hw_scan, .dev_list = hw_dev_list, .dev_clear = hw_cleanup, + .config_get = config_get, + .config_set = config_set, + .config_list = config_list, .dev_open = hw_dev_open, .dev_close = hw_dev_close, - .info_get = hw_info_get, - .dev_config_set = hw_dev_config_set, .dev_acquisition_start = hw_dev_acquisition_start, .dev_acquisition_stop = hw_dev_acquisition_stop, .priv = NULL,