* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <config.h>
#include "protocol.h"
#define VENDOR_NAME "ZEROPLUS"
struct zp_model {
uint16_t vid;
uint16_t pid;
- char *model_name;
+ const char *model_name;
unsigned int channels;
unsigned int sample_depth; /* In Ksamples/channel */
unsigned int max_sampling_freq;
{0x0c12, 0x700d, "LAP-C(322000)", 32, 2048, 200},
{0x0c12, 0x700e, "LAP-C(16032)", 16, 32, 100},
{0x0c12, 0x7016, "LAP-C(162000)", 16, 2048, 200},
- { 0, 0, 0, 0, 0, 0 }
+ {0x0c12, 0x7100, "AKIP-9101", 16, 256, 200},
+ ALL_ZERO
};
static const uint32_t devopts[] = {
"B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7",
"C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7",
"D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
- NULL,
};
SR_PRIV struct sr_dev_driver zeroplus_logic_cube_driver_info;
-static struct sr_dev_driver *di = &zeroplus_logic_cube_driver_info;
/*
* The hardware supports more samplerates than these, but these are the
return SR_OK;
}
-static int init(struct sr_context *sr_ctx)
+static int init(struct sr_dev_driver *di, struct sr_context *sr_ctx)
{
return std_init(sr_ctx, di, LOG_PREFIX);
}
-static GSList *scan(GSList *options)
+static GSList *scan(struct sr_dev_driver *di, GSList *options)
{
struct sr_dev_inst *sdi;
- struct sr_channel *ch;
struct drv_context *drvc;
struct dev_context *devc;
const struct zp_model *prof;
struct libusb_device_descriptor des;
+ struct libusb_device_handle *hdl;
libusb_device **devlist;
GSList *devices;
- int ret, devcnt, i, j;
+ int ret, i, j;
+ char serial_num[64], connection_id[64];
(void)options;
- drvc = di->priv;
+ drvc = di->context;
devices = NULL;
/* Find all ZEROPLUS analyzers and add them to device list. */
- devcnt = 0;
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("Failed to get device descriptor: %s.",
- libusb_error_name(ret));
+ libusb_get_device_descriptor(devlist[i], &des);
+
+ if ((ret = libusb_open(devlist[i], &hdl)) < 0)
+ continue;
+
+ if (des.iSerialNumber == 0) {
+ serial_num[0] = '\0';
+ } else if ((ret = libusb_get_string_descriptor_ascii(hdl,
+ des.iSerialNumber, (unsigned char *) serial_num,
+ sizeof(serial_num))) < 0) {
+ sr_warn("Failed to get serial number string descriptor: %s.",
+ libusb_error_name(ret));
continue;
}
+ libusb_close(hdl);
+
+ usb_get_port_path(devlist[i], connection_id, sizeof(connection_id));
+
prof = NULL;
for (j = 0; j < zeroplus_models[j].vid; j++) {
if (des.idVendor == zeroplus_models[j].vid &&
sr_info("Found ZEROPLUS %s.", prof->model_name);
/* Register the device with libsigrok. */
- if (!(sdi = sr_dev_inst_new(devcnt, SR_ST_INACTIVE,
- VENDOR_NAME, prof->model_name, NULL))) {
- sr_err("%s: sr_dev_inst_new failed", __func__);
- return NULL;
- }
+ sdi = g_malloc0(sizeof(struct sr_dev_inst));
+ sdi->status = SR_ST_INACTIVE;
+ sdi->vendor = g_strdup(VENDOR_NAME);
+ sdi->model = g_strdup(prof->model_name);
sdi->driver = di;
+ sdi->serial_num = g_strdup(serial_num);
+ sdi->connection_id = g_strdup(connection_id);
/* Allocate memory for our private driver context. */
- if (!(devc = g_try_malloc0(sizeof(struct dev_context)))) {
- sr_err("Device context malloc failed.");
- return NULL;
- }
-
+ devc = g_malloc0(sizeof(struct dev_context));
sdi->priv = devc;
devc->prof = prof;
devc->num_channels = prof->channels;
// memset(devc->trigger_buffer, 0, NUM_TRIGGER_STAGES);
/* Fill in channellist according to this device's profile. */
- for (j = 0; j < devc->num_channels; j++) {
- if (!(ch = sr_channel_new(j, SR_CHANNEL_LOGIC, TRUE,
- channel_names[j])))
- return NULL;
- sdi->channels = g_slist_append(sdi->channels, ch);
- }
+ for (j = 0; j < devc->num_channels; j++)
+ sr_channel_new(sdi, j, SR_CHANNEL_LOGIC, TRUE,
+ channel_names[j]);
devices = g_slist_append(devices, sdi);
drvc->instances = g_slist_append(drvc->instances, sdi);
sdi->conn = sr_usb_dev_inst_new(
libusb_get_bus_number(devlist[i]),
libusb_get_device_address(devlist[i]), NULL);
- devcnt++;
-
}
libusb_free_device_list(devlist, 1);
return devices;
}
-static GSList *dev_list(void)
+static GSList *dev_list(const struct sr_dev_driver *di)
{
- return ((struct drv_context *)(di->priv))->instances;
+ return ((struct drv_context *)(di->context))->instances;
}
static int dev_open(struct sr_dev_inst *sdi)
{
+ struct sr_dev_driver *di = sdi->driver;
struct dev_context *devc;
struct drv_context *drvc;
struct sr_usb_dev_inst *usb;
libusb_device **devlist, *dev;
- struct libusb_device_descriptor des;
int device_count, ret, i;
+ char connection_id[64];
- drvc = di->priv;
+ drvc = di->context;
usb = sdi->conn;
if (!(devc = sdi->priv)) {
dev = NULL;
for (i = 0; i < device_count; i++) {
- if ((ret = libusb_get_device_descriptor(devlist[i], &des))) {
- sr_err("Failed to get device descriptor: %s.",
- libusb_error_name(ret));
- continue;
- }
- if (libusb_get_bus_number(devlist[i]) == usb->bus
- && libusb_get_device_address(devlist[i]) == usb->address) {
+ usb_get_port_path(devlist[i], connection_id, sizeof(connection_id));
+ if (!strcmp(sdi->connection_id, connection_id)) {
dev = devlist[i];
break;
}
}
if (!dev) {
- sr_err("Device on bus %d address %d disappeared!",
- usb->bus, usb->address);
+ sr_err("Device on %d.%d (logical) / %s (physical) disappeared!",
+ usb->bus, usb->address, sdi->connection_id);
return SR_ERR;
}
if (!(ret = libusb_open(dev, &(usb->devhdl)))) {
sdi->status = SR_ST_ACTIVE;
- sr_info("Opened device %d on %d.%d interface %d.",
- sdi->index, usb->bus, usb->address, USB_INTERFACE);
+ sr_info("Opened device on %d.%d (logical) / %s (physical) interface %d.",
+ usb->bus, usb->address, sdi->connection_id, USB_INTERFACE);
} else {
sr_err("Failed to open device: %s.", libusb_error_name(ret));
return SR_ERR;
if (!usb->devhdl)
return SR_ERR;
- sr_info("Closing device %d on %d.%d interface %d.", sdi->index,
- usb->bus, usb->address, USB_INTERFACE);
+ sr_info("Closing device on %d.%d (logical) / %s (physical) interface %d.",
+ usb->bus, usb->address, sdi->connection_id, USB_INTERFACE);
libusb_release_interface(usb->devhdl, USB_INTERFACE);
libusb_reset_device(usb->devhdl);
libusb_close(usb->devhdl);
return SR_OK;
}
-static int cleanup(void)
+static int cleanup(const struct sr_dev_driver *di)
{
return std_dev_clear(di, NULL);
}
const struct sr_channel_group *cg)
{
struct dev_context *devc;
+ GVariant *range[2];
(void)cg;
+ if (!sdi)
+ return SR_ERR_ARG;
+
+ devc = sdi->priv;
+
switch (key) {
case SR_CONF_SAMPLERATE:
- if (sdi) {
- devc = sdi->priv;
- *data = g_variant_new_uint64(devc->cur_samplerate);
- sr_spew("Returning samplerate: %" PRIu64 "Hz.",
- devc->cur_samplerate);
- } else
- return SR_ERR_ARG;
+ *data = g_variant_new_uint64(devc->cur_samplerate);
break;
case SR_CONF_CAPTURE_RATIO:
- if (sdi) {
- devc = sdi->priv;
- *data = g_variant_new_uint64(devc->capture_ratio);
- } else
- return SR_ERR_ARG;
+ *data = g_variant_new_uint64(devc->capture_ratio);
break;
case SR_CONF_VOLTAGE_THRESHOLD:
- if (sdi) {
- GVariant *range[2];
- devc = sdi->priv;
- range[0] = g_variant_new_double(devc->cur_threshold);
- range[1] = g_variant_new_double(devc->cur_threshold);
- *data = g_variant_new_tuple(range, 2);
- } else
- return SR_ERR_ARG;
+ range[0] = g_variant_new_double(devc->cur_threshold);
+ range[1] = g_variant_new_double(devc->cur_threshold);
+ *data = g_variant_new_tuple(range, 2);
break;
default:
return SR_ERR_NA;
return SR_OK;
}
- if (!(buf = g_try_malloc(PACKET_SIZE))) {
- sr_err("Packet buffer malloc failed.");
- return SR_ERR_MALLOC;
- }
+ buf = g_malloc(PACKET_SIZE);
/* Check if the trigger is in the samples we are throwing away */
trigger_now = now_address == trigger_address ||
.dev_close = dev_close,
.dev_acquisition_start = dev_acquisition_start,
.dev_acquisition_stop = dev_acquisition_stop,
- .priv = NULL,
+ .context = NULL,
};