]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/kingst-la2016/api.c
kingst-la2016: handle sdi==NULL in config_list
[libsigrok.git] / src / hardware / kingst-la2016 / api.c
index c6f18c8f6610bf7e17393de83840b14f0a98a34f..216869ed8f222b29bb7599712a24e26ee72b01c4 100644 (file)
@@ -64,7 +64,7 @@ static const char *channel_names[] = {
        "8", "9", "10", "11", "12", "13", "14", "15",
 };
 
-static const uint64_t samplerates[] = {
+static const uint64_t samplerates_la2016[] = {
        SR_KHZ(20),
        SR_KHZ(50),
        SR_KHZ(100),
@@ -82,6 +82,23 @@ static const uint64_t samplerates[] = {
        SR_MHZ(200),
 };
 
+static const uint64_t samplerates_la1016[] = {
+       SR_KHZ(20),
+       SR_KHZ(50),
+       SR_KHZ(100),
+       SR_KHZ(200),
+       SR_KHZ(500),
+       SR_MHZ(1),
+       SR_MHZ(2),
+       SR_MHZ(4),
+       SR_MHZ(5),
+       SR_MHZ(8),
+       SR_MHZ(10),
+       SR_MHZ(20),
+       SR_MHZ(50),
+       SR_MHZ(100),
+};
+
 static const float logic_threshold_value[] = {
        1.58,
        2.5,
@@ -485,12 +502,22 @@ static int config_set(uint32_t key, GVariant *data,
 static int config_list(uint32_t key, GVariant **data,
        const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
 {
+       struct dev_context *devc;
+
        switch (key) {
        case SR_CONF_SCAN_OPTIONS:
        case SR_CONF_DEVICE_OPTIONS:
                return STD_CONFIG_LIST(key, data, sdi, cg, scanopts, drvopts, devopts);
        case SR_CONF_SAMPLERATE:
-               *data = std_gvar_samplerates(ARRAY_AND_SIZE(samplerates));
+               if (!sdi)
+                       return SR_ERR_ARG;
+               devc = sdi->priv;
+               if (devc->max_samplerate == SR_MHZ(200)) {
+                       *data = std_gvar_samplerates(ARRAY_AND_SIZE(samplerates_la2016));
+               }
+               else {
+                       *data = std_gvar_samplerates(ARRAY_AND_SIZE(samplerates_la1016));
+               }
                break;
        case SR_CONF_LIMIT_SAMPLES:
                *data = std_gvar_tuple_u64(LA2016_NUM_SAMPLES_MIN, LA2016_NUM_SAMPLES_MAX);
@@ -615,8 +642,11 @@ static void LIBUSB_CALL receive_transfer(struct libusb_transfer *transfer)
        devc->n_bytes_to_read -= transfer->actual_length;
        if (devc->n_bytes_to_read) {
                uint32_t to_read = devc->n_bytes_to_read;
-               if (to_read > LA2016_BULK_MAX)
-                       to_read = LA2016_BULK_MAX;
+               /* determine read size for the next usb transfer */
+               if (to_read >= LA2016_USB_BUFSZ)
+                       to_read = LA2016_USB_BUFSZ;
+               else /* last transfer, make read size some multiple of LA2016_EP6_PKTSZ */
+                       to_read = (to_read + (LA2016_EP6_PKTSZ-1)) & ~(LA2016_EP6_PKTSZ-1);
                libusb_fill_bulk_transfer(
                        transfer, usb->devhdl,
                        0x86, transfer->buffer, to_read,
@@ -648,7 +678,7 @@ static int handle_event(int fd, int revents, void *cb_data)
 
        if (devc->have_trigger == 0) {
                if (la2016_has_triggered(sdi) == 0) {
-                       sr_dbg("not yet ready for download...");
+                       /* not yet ready for download */
                        return TRUE;
                }
                devc->have_trigger = 1;
@@ -681,6 +711,8 @@ static int handle_event(int fd, int revents, void *cb_data)
                g_free(devc->convbuffer);
                devc->convbuffer = NULL;
 
+               devc->transfer = NULL;
+
                sr_dbg("transfer is now finished");
        }