X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fzeroplus-logic-cube%2Fzeroplus.c;h=9892df0f055e16f8a8ad76e860398f6790ba4997;hb=c73d2ea421c2b425c3f0ae33bce2bfd0c448ca5f;hp=6966ff83f103dba8cbe9870ab045fb265679775c;hpb=c31e9ef49b84b61a353168956882140e2b5a93bb;p=libsigrok.git diff --git a/hardware/zeroplus-logic-cube/zeroplus.c b/hardware/zeroplus-logic-cube/zeroplus.c index 6966ff83..9892df0f 100644 --- a/hardware/zeroplus-logic-cube/zeroplus.c +++ b/hardware/zeroplus-logic-cube/zeroplus.c @@ -1,7 +1,7 @@ /* * This file is part of the sigrok project. * - * Copyright (C) 2010 Bert Vermeulen + * Copyright (C) 2010-2012 Bert Vermeulen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -155,7 +155,6 @@ static struct sr_samplerates samplerates = { struct zp { uint64_t cur_samplerate; - uint64_t period_ps; uint64_t limit_samples; int num_channels; /* TODO: This isn't initialized before it's needed :( */ uint64_t memory_size; @@ -163,6 +162,8 @@ struct zp { uint8_t trigger_mask[NUM_TRIGGER_STAGES]; uint8_t trigger_value[NUM_TRIGGER_STAGES]; // uint8_t trigger_buffer[NUM_TRIGGER_STAGES]; + + struct sr_usb_device_instance *usb; }; static int hw_set_configuration(int device_index, int capability, void *value); @@ -196,15 +197,15 @@ static int opendev4(struct sr_device_instance **sdi, libusb_device *dev, } if ((err = libusb_get_device_descriptor(dev, des))) { - sr_warn("failed to get device descriptor: %d", err); + sr_err("failed to get device descriptor: %d", err); return -1; } if (des->idVendor != USB_VENDOR) return 0; - if (libusb_get_bus_number(dev) == (*sdi)->usb->bus - && libusb_get_device_address(dev) == (*sdi)->usb->address) { + if (libusb_get_bus_number(dev) == zp->usb->bus + && libusb_get_device_address(dev) == zp->usb->address) { for (i = 0; i < ARRAY_SIZE(zeroplus_models); i++) { if (!(des->idProduct == zeroplus_models[i].pid)) @@ -218,18 +219,18 @@ static int opendev4(struct sr_device_instance **sdi, libusb_device *dev, } if (zp->num_channels == 0) { - sr_warn("Unknown ZeroPlus device %04X", des->idProduct); + sr_err("Unknown ZeroPlus device %04X", des->idProduct); return -2; } /* Found it. */ - if (!(err = libusb_open(dev, &((*sdi)->usb->devhdl)))) { + if (!(err = libusb_open(dev, &(zp->usb->devhdl)))) { (*sdi)->status = SR_ST_ACTIVE; sr_info("opened device %d on %d.%d interface %d", - (*sdi)->index, (*sdi)->usb->bus, - (*sdi)->usb->address, USB_INTERFACE); + (*sdi)->index, zp->usb->bus, + zp->usb->address, USB_INTERFACE); } else { - sr_warn("failed to open device: %d", err); + sr_err("failed to open device: %d", err); *sdi = NULL; } } @@ -269,14 +270,23 @@ static struct sr_device_instance *zp_open_device(int device_index) static void close_device(struct sr_device_instance *sdi) { - if (!sdi->usb->devhdl) + struct zp *zp; + + if (!(zp = sdi->priv)) { + sr_err("zp: %s: sdi->priv was NULL", __func__); + return; /* FIXME */ + } + + if (!zp->usb->devhdl) return; sr_info("closing device %d on %d.%d interface %d", sdi->index, - sdi->usb->bus, sdi->usb->address, USB_INTERFACE); - libusb_release_interface(sdi->usb->devhdl, USB_INTERFACE); - libusb_close(sdi->usb->devhdl); - sdi->usb->devhdl = NULL; + zp->usb->bus, zp->usb->address, USB_INTERFACE); + libusb_release_interface(zp->usb->devhdl, USB_INTERFACE); + libusb_reset_device(zp->usb->devhdl); + libusb_close(zp->usb->devhdl); + zp->usb->devhdl = NULL; + /* TODO: Call libusb_exit() here or only in hw_cleanup()? */ sdi->status = SR_ST_INACTIVE; } @@ -344,7 +354,6 @@ static int hw_init(const char *deviceinfo) /* Set some sane defaults. */ zp->cur_samplerate = 0; - zp->period_ps = 0; zp->limit_samples = 0; zp->num_channels = 32; /* TODO: This isn't initialized before it's needed :( */ zp->memory_size = 0; @@ -354,18 +363,18 @@ static int hw_init(const char *deviceinfo) // memset(zp->trigger_buffer, 0, NUM_TRIGGER_STAGES); if (libusb_init(&usb_context) != 0) { - sr_warn("Failed to initialize USB."); + sr_err("Failed to initialize USB."); return 0; } /* Find all ZeroPlus analyzers and add them to device list. */ devcnt = 0; - libusb_get_device_list(usb_context, &devlist); + libusb_get_device_list(usb_context, &devlist); /* TODO: Errors. */ for (i = 0; devlist[i]; i++) { err = libusb_get_device_descriptor(devlist[i], &des); if (err != 0) { - sr_warn("failed to get device descriptor: %d", err); + sr_err("failed to get device descriptor: %d", err); continue; } @@ -389,7 +398,7 @@ static int hw_init(const char *deviceinfo) device_instances = g_slist_append(device_instances, sdi); - sdi->usb = sr_usb_device_instance_new( + zp->usb = sr_usb_device_instance_new( libusb_get_bus_number(devlist[i]), libusb_get_device_address(devlist[i]), NULL); devcnt++; @@ -407,7 +416,7 @@ static int hw_opendev(int device_index) int err; if (!(sdi = zp_open_device(device_index))) { - sr_warn("unable to open device"); + sr_err("unable to open device"); return SR_ERR; } @@ -418,13 +427,21 @@ static int hw_opendev(int device_index) return SR_ERR_ARG; } - err = libusb_claim_interface(sdi->usb->devhdl, USB_INTERFACE); + err = libusb_set_configuration(zp->usb->devhdl, USB_CONFIGURATION); + if (err < 0) { + sr_err("zp: Unable to set USB configuration %d: %d", + USB_CONFIGURATION, err); + return SR_ERR; + } + + err = libusb_claim_interface(zp->usb->devhdl, USB_INTERFACE); if (err != 0) { - sr_warn("Unable to claim interface: %d", err); + sr_err("Unable to claim interface: %d", err); return SR_ERR; } - analyzer_reset(sdi->usb->devhdl); - analyzer_initialize(sdi->usb->devhdl); + + analyzer_reset(zp->usb->devhdl); + analyzer_initialize(zp->usb->devhdl); analyzer_set_memory_size(MEMORY_SIZE_512K); // analyzer_set_freq(g_freq, g_freq_scale); @@ -573,7 +590,6 @@ static int set_configuration_samplerate(struct sr_device_instance *sdi, analyzer_set_freq(samplerate, FREQ_SCALE_HZ); zp->cur_samplerate = samplerate; - zp->period_ps = 1000000000000 / samplerate; return SR_OK; } @@ -632,15 +648,15 @@ static int hw_start_acquisition(int device_index, gpointer session_data) } /* push configured settings to device */ - analyzer_configure(sdi->usb->devhdl); + analyzer_configure(zp->usb->devhdl); - analyzer_start(sdi->usb->devhdl); + analyzer_start(zp->usb->devhdl); sr_info("Waiting for data"); - analyzer_wait_data(sdi->usb->devhdl); + analyzer_wait_data(zp->usb->devhdl); - sr_info("Stop address = 0x%x", analyzer_get_stop_address(sdi->usb->devhdl)); - sr_info("Now address = 0x%x", analyzer_get_now_address(sdi->usb->devhdl)); - sr_info("Trigger address = 0x%x", analyzer_get_trigger_address(sdi->usb->devhdl)); + sr_info("Stop address = 0x%x", analyzer_get_stop_address(zp->usb->devhdl)); + sr_info("Now address = 0x%x", analyzer_get_now_address(zp->usb->devhdl)); + sr_info("Trigger address = 0x%x", analyzer_get_trigger_address(zp->usb->devhdl)); packet.type = SR_DF_HEADER; packet.payload = &header; @@ -648,7 +664,6 @@ static int hw_start_acquisition(int device_index, gpointer session_data) gettimeofday(&header.starttime, NULL); header.samplerate = zp->cur_samplerate; header.num_logic_probes = zp->num_channels; - header.num_analog_probes = 0; sr_session_bus(session_data, &packet); if (!(buf = g_try_malloc(PACKET_SIZE))) { @@ -657,17 +672,15 @@ static int hw_start_acquisition(int device_index, gpointer session_data) } samples_read = 0; - analyzer_read_start(sdi->usb->devhdl); + analyzer_read_start(zp->usb->devhdl); /* Send the incoming transfer to the session bus. */ for (packet_num = 0; packet_num < (zp->memory_size * 4 / PACKET_SIZE); packet_num++) { - res = analyzer_read_data(sdi->usb->devhdl, buf, PACKET_SIZE); + res = analyzer_read_data(zp->usb->devhdl, buf, PACKET_SIZE); sr_info("Tried to read %llx bytes, actually read %x bytes", PACKET_SIZE, res); packet.type = SR_DF_LOGIC; - packet.timeoffset = samples_read * zp->period_ps; - packet.duration = res / 4 * zp->period_ps; packet.payload = &logic; logic.length = PACKET_SIZE; logic.unitsize = 4; @@ -675,7 +688,7 @@ static int hw_start_acquisition(int device_index, gpointer session_data) sr_session_bus(session_data, &packet); samples_read += res / 4; } - analyzer_read_stop(sdi->usb->devhdl); + analyzer_read_stop(zp->usb->devhdl); g_free(buf); packet.type = SR_DF_END; @@ -689,18 +702,26 @@ static void hw_stop_acquisition(int device_index, gpointer session_device_id) { struct sr_datafeed_packet packet; struct sr_device_instance *sdi; + struct zp *zp; packet.type = SR_DF_END; sr_session_bus(session_device_id, &packet); - if (!(sdi = sr_get_device_instance(device_instances, device_index))) - return; /* TODO: Cry? */ + if (!(sdi = sr_get_device_instance(device_instances, device_index))) { + sr_err("zp: %s: sdi was NULL", __func__); + return; /* FIXME */ + } + + if (!(zp = sdi->priv)) { + sr_err("zp: %s: sdi->priv was NULL", __func__); + return; /* FIXME */ + } - analyzer_reset(sdi->usb->devhdl); + analyzer_reset(zp->usb->devhdl); /* TODO: Need to cancel and free any queued up transfers. */ } -struct sr_device_plugin zeroplus_logic_cube_plugin_info = { +SR_PRIV struct sr_device_plugin zeroplus_logic_cube_plugin_info = { .name = "zeroplus-logic-cube", .longname = "Zeroplus Logic Cube LAP-C series", .api_version = 1,