]> sigrok.org Git - libsigrok.git/blobdiff - hardware/openbench-logic-sniffer/ols.c
update plugins and cli to use new DF_HEADER
[libsigrok.git] / hardware / openbench-logic-sniffer / ols.c
index c793088f2b0d8ed4427ddb4ae787f7aa20fac66f..7f44788e4a012d2a2742aaaaee894dffdc0f13c6 100644 (file)
@@ -42,7 +42,6 @@
 #define NUM_TRIGGER_STAGES             4
 #define TRIGGER_TYPES                  "01"
 #define SERIAL_SPEED                   B115200
-/* TODO: SERIAL_ bits, parity, stop bit */
 #define CLOCK_RATE                     100000000
 
 /* Command opcodes */
@@ -242,13 +241,8 @@ static int hw_init(char *deviceinfo)
                 * we do all the sending first, then wait for all of them to
                 * respond with g_poll().
                 */
-               g_message("probing %s...", (char *)l->data);
-#ifdef _WIN32
-               // FIXME
-               // hdl = serial_open(l->data, 0);
-#else
+               g_message("ols: probing %s...", (char *)l->data);
                fd = serial_open(l->data, O_RDWR | O_NONBLOCK);
-#endif
                if (fd != -1) {
                        serial_params[devcnt] = serial_backup_params(fd);
                        serial_set_params(fd, 115200, 8, 0, 1, 2);
@@ -293,7 +287,7 @@ static int hw_init(char *deviceinfo)
                                        else
                                                sdi = sigrok_device_instance_new
                                                    (final_devcnt, ST_INACTIVE,
-                                                    "Sump", "Logic Analyzer",
+                                                    "Openbench", "Logic Sniffer",
                                                     "v1.0");
                                        sdi->serial = serial_device_instance_new
                                            (device_names[i], -1);
@@ -431,7 +425,7 @@ static int set_configuration_samplerate(struct sigrok_device_instance *sdi,
                divider = (CLOCK_RATE / samplerate) - 1;
        }
 
-       g_message("setting samplerate to %" PRIu64 " Hz (divider %u, demux %s)",
+       g_message("ols: setting samplerate to %" PRIu64 " Hz (divider %u, demux %s)",
                        samplerate, divider, flag_reg & FLAG_DEMUX ? "on" : "off");
 
        if (send_longcommand(sdi->serial->fd, CMD_SET_DIVIDER, reverse32(divider)) != SIGROK_OK)
@@ -464,6 +458,7 @@ static int hw_set_configuration(int device_index, int capability, void *value)
        case HWCAP_LIMIT_SAMPLES:
                tmp_u64 = value;
                limit_samples = *tmp_u64;
+               g_message("ols: sample limit %" PRIu64, limit_samples);
                ret = SIGROK_OK;
                break;
        case HWCAP_CAPTURE_RATIO:
@@ -520,9 +515,9 @@ static int receive_data(int fd, int revents, void *user_data)
                        return FALSE;
 
                sample[num_bytes++] = byte;
-               g_debug("received byte 0x%.2x", byte);
+               g_debug("ols: received byte 0x%.2x", byte);
                if (num_bytes == num_channels) {
-                       g_debug("received sample 0x%.*x", num_bytes * 2, (int) *sample);
+                       g_debug("ols: received sample 0x%.*x", num_bytes * 2, (int) *sample);
                        /* Got a full sample. */
                        if (flag_reg & FLAG_RLE) {
                                /*
@@ -579,14 +574,14 @@ static int receive_data(int fd, int revents, void *user_data)
                                        }
                                }
                                memcpy(sample, tmp_sample, 4);
-                               g_debug("full sample 0x%.8x", (int) *sample);
+                               g_debug("ols: full sample 0x%.8x", (int) *sample);
                        }
 
                        /* the OLS sends its sample buffer backwards.
                         * store it in reverse order here, so we can dump
                         * this on the session bus later.
                         */
-                       offset = (limit_samples - num_transfers) * 4;
+                       offset = (limit_samples - num_transfers / num_channels) * 4;
                        memcpy(raw_sample_buf + offset, sample, 4);
 
                        if (buffer == sample)
@@ -609,8 +604,9 @@ static int receive_data(int fd, int revents, void *user_data)
                         */
                        if (trigger_at > 0) {
                                /* there are pre-trigger samples, send those first */
-                               packet.type = DF_LOGIC32;
+                               packet.type = DF_LOGIC;
                                packet.length = trigger_at * 4;
+                               packet.unitsize = 4;
                                packet.payload = raw_sample_buf;
                                session_bus(user_data, &packet);
                        }
@@ -619,22 +615,21 @@ static int receive_data(int fd, int revents, void *user_data)
                        packet.length = 0;
                        session_bus(user_data, &packet);
 
-                       packet.type = DF_LOGIC32;
+                       packet.type = DF_LOGIC;
                        packet.length = (limit_samples * 4) - (trigger_at * 4);
+                       packet.unitsize = 4;
                        packet.payload = raw_sample_buf + trigger_at * 4;
                        session_bus(user_data, &packet);
                } else {
-                       packet.type = DF_LOGIC32;
+                       packet.type = DF_LOGIC;
                        packet.length = limit_samples * 4;
+                       packet.unitsize = 4;
                        packet.payload = raw_sample_buf;
                        session_bus(user_data, &packet);
                }
                free(raw_sample_buf);
 
-#ifndef _WIN32
-               /* TODO: Move to serial.c? */
-               tcflush(fd, TCIOFLUSH);
-#endif
+               serial_flush(fd);
                serial_close(fd);
                packet.type = DF_END;
                packet.length = 0;
@@ -668,7 +663,6 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id)
        if (trigger_mask[0]) {
                delaycount = readcount * (1 - capture_ratio / 100.0);
                trigger_at = (readcount - delaycount) * 4 - num_stages;
-               g_message("ta %d", trigger_at);
 
                if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_MASK_0,
                        reverse32(trigger_mask[0])) != SIGROK_OK)
@@ -739,12 +733,9 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id)
                if (probe_mask & (0xff << (i * 8)))
                        changrp_mask |= (1 << i);
        }
-       g_message("changrp_mask 0x%.2x", changrp_mask);
 
        /* The flag register wants them here, and 1 means "disable channel". */
        flag_reg |= ~(changrp_mask << 2) & 0x3c;
-       g_message("flag_reg 0x%.2x", flag_reg & 0x3c);
-
        flag_reg |= FLAG_FILTER;
        data = flag_reg << 24;
        if (send_longcommand(sdi->serial->fd, CMD_SET_FLAGS, data) != SIGROK_OK)
@@ -769,7 +760,8 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id)
        gettimeofday(&header->starttime, NULL);
        header->samplerate = cur_samplerate;
        header->protocol_id = PROTO_RAW;
-       header->num_probes = NUM_PROBES;
+       header->num_logic_probes = NUM_PROBES;
+       header->num_analog_probes = 0;
        session_bus(session_device_id, packet);
        g_free(header);
        g_free(packet);
@@ -790,7 +782,7 @@ static void hw_stop_acquisition(int device_index, gpointer session_device_id)
 }
 
 struct device_plugin ols_plugin_info = {
-       "sump",
+       "ols",
        1,
        hw_init,
        hw_cleanup,