X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=hardware%2Fsaleae-logic%2Fsaleae-logic.c;h=07491fa085427889112e05bcb12b5e22a9773959;hb=38ba2522516b481fa3619bdec56d1e2a4b7a5f45;hp=26347d98166e3ab49c7588f1b85f87b919f2ef60;hpb=fed16f06e236f3f2ccc25a63ca7ec7a020124fdc;p=libsigrok.git diff --git a/hardware/saleae-logic/saleae-logic.c b/hardware/saleae-logic/saleae-logic.c index 26347d98..07491fa0 100644 --- a/hardware/saleae-logic/saleae-logic.c +++ b/hardware/saleae-logic/saleae-logic.c @@ -23,8 +23,8 @@ #include #include #include +#include #include "config.h" -#include "sigrok.h" #define USB_VENDOR 0x0925 #define USB_PRODUCT 0x3881 @@ -37,7 +37,7 @@ #define NUM_PROBES 8 #define NUM_TRIGGER_STAGES 4 #define TRIGGER_TYPES "01" -#define FIRMWARE FIRMWARE_DIR "/saleae-logic.firmware" +#define FIRMWARE FIRMWARE_DIR "/saleae-logic.fw" /* delay in ms */ #define FIRMWARE_RENUM_DELAY 2000 @@ -102,10 +102,13 @@ static uint8_t trigger_buffer[NUM_TRIGGER_STAGES] = { 0 }; int trigger_stage = TRIGGER_FIRED; static int hw_set_configuration(int device_index, int capability, void *value); +static void hw_stop_acquisition(int device_index, gpointer session_device_id); -/* - * Returns 1 if the device's configuration profile match the Logic firmware's - * configuration, 0 otherwise. +/** + * Check the USB configuration to determine if this is a Saleae Logic. + * + * @return 1 if the device's configuration profile match the Logic firmware's + * configuration, 0 otherwise. */ int check_conf_profile(libusb_device *dev) { @@ -161,74 +164,6 @@ int check_conf_profile(libusb_device *dev) return ret; } -static int opendev2(int device_index, struct sigrok_device_instance **sdi, - libusb_device *dev, struct libusb_device_descriptor *des, - int *skip) -{ - int err; - - if ((err = libusb_get_device_descriptor(dev, des))) { - g_warning("failed to get device descriptor: %d", err); - return -1; - } - - if (des->idVendor != USB_VENDOR || des->idProduct != USB_PRODUCT) - return 0; - - if (*skip != device_index) { - /* Skip devices of this type that aren't the one we want. */ - *skip += 1; - return 0; - } - - /* - * Should check the bus here, since we know that already. But what are - * we going to do if it doesn't match after the right number of skips? - */ - if (!(err = libusb_open(dev, &((*sdi)->usb->devhdl)))) { - (*sdi)->usb->address = libusb_get_device_address(dev); - (*sdi)->status = ST_ACTIVE; - g_message("opened device %d on %d.%d interface %d", - (*sdi)->index, (*sdi)->usb->bus, - (*sdi)->usb->address, USB_INTERFACE); - } else { - g_warning("failed to open device: %d", err); - *sdi = NULL; - } - - return 0; -} - -static int opendev3(struct sigrok_device_instance **sdi, libusb_device *dev, - struct libusb_device_descriptor *des) -{ - int err; - - if ((err = libusb_get_device_descriptor(dev, des))) { - g_warning("failed to get device descriptor: %d", err); - return -1; - } - - if (des->idVendor != USB_VENDOR || des->idProduct != USB_PRODUCT) - return 0; - - if (libusb_get_bus_number(dev) == (*sdi)->usb->bus - && libusb_get_device_address(dev) == (*sdi)->usb->address) { - /* Found it. */ - if (!(err = libusb_open(dev, &((*sdi)->usb->devhdl)))) { - (*sdi)->status = ST_ACTIVE; - g_message("opened device %d on %d.%d interface %d", - (*sdi)->index, (*sdi)->usb->bus, - (*sdi)->usb->address, USB_INTERFACE); - } else { - g_warning("failed to open device: %d", err); - *sdi = NULL; - } - } - - return 0; -} - struct sigrok_device_instance *sl_open_device(int device_index) { struct sigrok_device_instance *sdi; @@ -251,7 +186,8 @@ struct sigrok_device_instance *sl_open_device(int device_index) for (i = 0; devlist[i]; i++) { /* TODO: Error handling. */ err = opendev2(device_index, &sdi, devlist[i], &des, - &skip); + &skip, USB_VENDOR, USB_PRODUCT, + USB_INTERFACE); } } else if (sdi->status == ST_INACTIVE) { /* @@ -261,7 +197,8 @@ struct sigrok_device_instance *sl_open_device(int device_index) libusb_get_device_list(usb_context, &devlist); for (i = 0; devlist[i]; i++) { /* TODO: Error handling. */ - err = opendev3(&sdi, devlist[i], &des); + err = opendev3(&sdi, devlist[i], &des, USB_VENDOR, + USB_PRODUCT, USB_INTERFACE); } } else { /* Status must be ST_ACTIVE, i.e. already in use... */ @@ -322,16 +259,17 @@ static int configure_probes(GSList *probes) continue; probe_bit = 1 << (probe->index - 1); probe_mask |= probe_bit; - if (probe->trigger) { - stage = 0; - for (tc = probe->trigger; *tc; tc++) { - trigger_mask[stage] |= probe_bit; - if (*tc == '1') - trigger_value[stage] |= probe_bit; - stage++; - if (stage > NUM_TRIGGER_STAGES) - return SIGROK_ERR; - } + if (!(probe->trigger)) + continue; + + stage = 0; + for (tc = probe->trigger; *tc; tc++) { + trigger_mask[stage] |= probe_bit; + if (*tc == '1') + trigger_value[stage] |= probe_bit; + stage++; + if (stage > NUM_TRIGGER_STAGES) + return SIGROK_ERR; } } @@ -541,7 +479,7 @@ static int set_configuration_samplerate(struct sigrok_device_instance *sdi, if (supported_samplerates[i] == 0) return SIGROK_ERR_SAMPLERATE; - divider = (uint8_t) (48 / (float)(samplerate / 1000000)) - 1; + divider = (uint8_t) (48 / (samplerate / 1000000.0)) - 1; g_message("setting samplerate to %" PRIu64 " Hz (divider %d)", samplerate, divider); @@ -573,7 +511,8 @@ static int hw_set_configuration(int device_index, int capability, void *value) } else if (capability == HWCAP_PROBECONFIG) { ret = configure_probes((GSList *) value); } else if (capability == HWCAP_LIMIT_SAMPLES) { - limit_samples = strtoull(value, NULL, 10); + tmp_u64 = value; + limit_samples = *tmp_u64; ret = SIGROK_OK; } else { ret = SIGROK_ERR; @@ -668,7 +607,8 @@ void receive_transfer(struct libusb_transfer *transfer) * transfer that come in. */ if (num_samples == -1) { - libusb_free_transfer(transfer); + if (transfer) + libusb_free_transfer(transfer); return; } @@ -696,9 +636,7 @@ void receive_transfer(struct libusb_transfer *transfer) * The FX2 gave up. End the acquisition, the frontend * will work out that the samplecount is short. */ - packet.type = DF_END; - session_bus(user_data, &packet); - num_samples = -1; + hw_stop_acquisition(-1, user_data); } return; } else { @@ -723,10 +661,7 @@ void receive_transfer(struct libusb_transfer *transfer) num_samples += cur_buflen; if ((unsigned int)num_samples > limit_samples) { - /* End the acquisition. */ - packet.type = DF_END; - session_bus(user_data, &packet); - num_samples = -1; + hw_stop_acquisition(-1, user_data); } } else { /* @@ -773,7 +708,7 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id) lupfd = libusb_get_pollfds(usb_context); for (i = 0; lupfd[i]; i++) - source_add(lupfd[i]->fd, lupfd[i]->events, -1, receive_data, + source_add(lupfd[i]->fd, lupfd[i]->events, 40, receive_data, NULL); free(lupfd);