]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/openbench-logic-sniffer/protocol.c
ols: add feature to support >256K memory
[libsigrok.git] / src / hardware / openbench-logic-sniffer / protocol.c
index 3bfb890fddf6623f8af8af9495d667b25d71b028..b9383ddd1e440d50b582980163d926fb9f9f3035 100644 (file)
@@ -146,11 +146,23 @@ SR_PRIV struct dev_context *ols_dev_new(void)
        return devc;
 }
 
+static void ols_channel_new(struct sr_dev_inst *sdi, int num_chan)
+{
+       struct dev_context *devc = sdi->priv;
+       int i;
+
+       for (i = 0; i < num_chan; i++)
+               sr_channel_new(sdi, i, SR_CHANNEL_LOGIC, TRUE,
+                               ols_channel_names[i]);
+
+       devc->max_channels = num_chan;
+}
+
 SR_PRIV struct sr_dev_inst *get_metadata(struct sr_serial_dev_inst *serial)
 {
        struct sr_dev_inst *sdi;
        struct dev_context *devc;
-       uint32_t tmp_int, ui;
+       uint32_t tmp_int;
        uint8_t key, type, token;
        int delay_ms;
        GString *tmp_str, *devname, *version;
@@ -221,9 +233,7 @@ SR_PRIV struct sr_dev_inst *get_metadata(struct sr_serial_dev_inst *serial)
                        switch (token) {
                        case 0x00:
                                /* Number of usable channels */
-                               for (ui = 0; ui < tmp_int; ui++)
-                                       sr_channel_new(sdi, ui, SR_CHANNEL_LOGIC, TRUE,
-                                                       ols_channel_names[ui]);
+                               ols_channel_new(sdi, tmp_int);
                                break;
                        case 0x01:
                                /* Amount of sample memory available (bytes) */
@@ -257,9 +267,7 @@ SR_PRIV struct sr_dev_inst *get_metadata(struct sr_serial_dev_inst *serial)
                        switch (token) {
                        case 0x00:
                                /* Number of usable channels */
-                               for (ui = 0; ui < tmp_c; ui++)
-                                       sr_channel_new(sdi, ui, SR_CHANNEL_LOGIC, TRUE,
-                                                       ols_channel_names[ui]);
+                               ols_channel_new(sdi, tmp_c);
                                break;
                        case 0x01:
                                /* protocol version */
@@ -298,13 +306,11 @@ SR_PRIV int ols_set_samplerate(const struct sr_dev_inst *sdi,
                sr_info("Enabling demux mode.");
                devc->flag_reg |= FLAG_DEMUX;
                devc->flag_reg &= ~FLAG_FILTER;
-               devc->max_channels = NUM_CHANNELS / 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_channels = NUM_CHANNELS;
                devc->cur_samplerate_divider = (CLOCK_RATE / samplerate) - 1;
        }
 
@@ -365,7 +371,7 @@ SR_PRIV int ols_receive_data(int fd, int revents, void *cb_data)
        }
 
        num_ols_changrp = 0;
-       for (i = NUM_CHANNELS; i > 0x02; i /= 2) {
+       for (i = 0x20; i > 0x02; i >>= 1) {
                if ((devc->flag_reg & i) == 0) {
                        num_ols_changrp++;
                }