]> sigrok.org Git - libsigrok.git/blobdiff - hardware/openbench-logic-sniffer/protocol.c
contrib/z60_libsigrok.rules: Also mention UNI-T UT325.
[libsigrok.git] / hardware / openbench-logic-sniffer / protocol.c
index 6082fb3e41adcdcf29429a2f2b905f62e060b5fd..bd9e55bffde4ac1b7f12c897b1bf989a0452d99f 100644 (file)
@@ -74,6 +74,11 @@ SR_PRIV int ols_configure_probes(const struct sr_dev_inst *sdi)
                if (!probe->enabled)
                        continue;
 
+               if (probe->index >= devc->max_probes) {
+                       sr_err("Channels over the limit of %d\n", devc->max_probes);
+                       return SR_ERR;
+               }
+
                /*
                 * Set up the probe mask for later configuration into the
                 * flag register.
@@ -297,10 +302,16 @@ SR_PRIV int ols_set_samplerate(const struct sr_dev_inst *sdi,
                return SR_ERR_SAMPLERATE;
 
        if (samplerate > CLOCK_RATE) {
+               sr_info("Enabling demux mode.");
                devc->flag_reg |= FLAG_DEMUX;
+               devc->flag_reg &= ~FLAG_FILTER;
+               devc->max_probes = NUM_PROBES / 2;
                devc->cur_samplerate_divider = (CLOCK_RATE * 2 / samplerate) - 1;
        } else {
+               sr_info("Disabling demux mode.");
                devc->flag_reg &= ~FLAG_DEMUX;
+               devc->flag_reg |= FLAG_FILTER;
+               devc->max_probes = NUM_PROBES;
                devc->cur_samplerate_divider = (CLOCK_RATE / samplerate) - 1;
        }
 
@@ -379,9 +390,11 @@ SR_PRIV int ols_receive_data(int fd, int revents, void *cb_data)
        }
 
        num_channels = 0;
-       for (i = 0x20; i > 0x02; i /= 2) {
-               if ((devc->flag_reg & i) == 0)
+
+       for (i = NUM_PROBES; i > 0x02; i /= 2) {
+               if ((devc->flag_reg & i) == 0) {
                        num_channels++;
+               }
        }
 
        if (revents == G_IO_IN && devc->num_samples < devc->limit_samples) {
@@ -442,6 +455,9 @@ SR_PRIV int ols_receive_data(int fd, int revents, void *cb_data)
                                                 * sample.
                                                 */
                                                devc->tmp_sample[i] = devc->sample[j++];
+                                       } else if (devc->flag_reg & FLAG_DEMUX && (i > 2)) {
+                                               /* group 2 & 3 get added to 0 & 1 */
+                                               devc->tmp_sample[i - 2] = devc->sample[j++];
                                        }
                                }
                                memcpy(devc->sample, devc->tmp_sample, 4);