]> sigrok.org Git - libsigrok.git/blobdiff - hardware/openbench-logic-sniffer/ols.c
refuse to set sample limit under 4 (protocol can't handle it)
[libsigrok.git] / hardware / openbench-logic-sniffer / ols.c
index 0e7914570527d8056f17338617e77cb8a4ba620b..57d7aa0aba31078db7291bf22871458838a5f868 100644 (file)
 #endif
 #include <glib.h>
 #include <sigrok.h>
+#include <sigrok-internal.h>
 
-#define NUM_PROBES                     32
-#define NUM_TRIGGER_STAGES             4
-#define TRIGGER_TYPES                  "01"
-#define SERIAL_SPEED                   B115200
-#define CLOCK_RATE                     100000000
+#ifdef _WIN32
+#define O_NONBLOCK FIONBIO
+#endif
+
+#define NUM_PROBES             32
+#define NUM_TRIGGER_STAGES     4
+#define TRIGGER_TYPES          "01"
+#define SERIAL_SPEED           B115200
+#define CLOCK_RATE             MHZ(100)
+#define MIN_NUM_SAMPLES        4
 
 /* Command opcodes */
-#define CMD_RESET                      0x00
-#define CMD_ID                         0x02
-#define CMD_SET_FLAGS                  0x82
-#define CMD_SET_DIVIDER                        0x80
-#define CMD_RUN                                0x01
-#define CMD_CAPTURE_SIZE               0x81
-#define CMD_SET_TRIGGER_MASK_0         0xc0
-#define CMD_SET_TRIGGER_MASK_1         0xc4
-#define CMD_SET_TRIGGER_MASK_2         0xc8
-#define CMD_SET_TRIGGER_MASK_3         0xcc
-#define CMD_SET_TRIGGER_VALUE_0                0xc1
-#define CMD_SET_TRIGGER_VALUE_1                0xc5
-#define CMD_SET_TRIGGER_VALUE_2                0xc9
-#define CMD_SET_TRIGGER_VALUE_3                0xcd
-#define CMD_SET_TRIGGER_CONFIG_0       0xc2
-#define CMD_SET_TRIGGER_CONFIG_1       0xc6
-#define CMD_SET_TRIGGER_CONFIG_2       0xca
-#define CMD_SET_TRIGGER_CONFIG_3       0xce
+#define CMD_RESET                  0x00
+#define CMD_ID                     0x02
+#define CMD_SET_FLAGS              0x82
+#define CMD_SET_DIVIDER            0x80
+#define CMD_RUN                    0x01
+#define CMD_CAPTURE_SIZE           0x81
+#define CMD_SET_TRIGGER_MASK_0     0xc0
+#define CMD_SET_TRIGGER_MASK_1     0xc4
+#define CMD_SET_TRIGGER_MASK_2     0xc8
+#define CMD_SET_TRIGGER_MASK_3     0xcc
+#define CMD_SET_TRIGGER_VALUE_0    0xc1
+#define CMD_SET_TRIGGER_VALUE_1    0xc5
+#define CMD_SET_TRIGGER_VALUE_2    0xc9
+#define CMD_SET_TRIGGER_VALUE_3    0xcd
+#define CMD_SET_TRIGGER_CONFIG_0   0xc2
+#define CMD_SET_TRIGGER_CONFIG_1   0xc6
+#define CMD_SET_TRIGGER_CONFIG_2   0xca
+#define CMD_SET_TRIGGER_CONFIG_3   0xce
 
 /* Bitmasks for CMD_FLAGS */
-#define FLAG_DEMUX                     0x01
-#define FLAG_FILTER                    0x02
-#define FLAG_CHANNELGROUP_1            0x04
-#define FLAG_CHANNELGROUP_2            0x08
-#define FLAG_CHANNELGROUP_3            0x10
-#define FLAG_CHANNELGROUP_4            0x20
-#define FLAG_CLOCK_EXTERNAL            0x40
-#define FLAG_CLOCK_INVERTED            0x80
-#define FLAG_RLE                       0x0100
+#define FLAG_DEMUX                 0x01
+#define FLAG_FILTER                0x02
+#define FLAG_CHANNELGROUP_1        0x04
+#define FLAG_CHANNELGROUP_2        0x08
+#define FLAG_CHANNELGROUP_3        0x10
+#define FLAG_CHANNELGROUP_4        0x20
+#define FLAG_CLOCK_EXTERNAL        0x40
+#define FLAG_CLOCK_INVERTED        0x80
+#define FLAG_RLE                   0x0100
 
 static int capabilities[] = {
        HWCAP_LOGIC_ANALYZER,
@@ -115,7 +121,7 @@ static int send_shortcommand(int fd, uint8_t command)
 
        g_debug("ols: sending cmd 0x%.2x", command);
        buf[0] = command;
-       if (write(fd, buf, 1) != 1)
+       if (serial_write(fd, buf, 1) != 1)
                return SIGROK_ERR;
 
        return SIGROK_OK;
@@ -131,7 +137,7 @@ static int send_longcommand(int fd, uint8_t command, uint32_t data)
        buf[2] = (data & 0xff0000) >> 16;
        buf[3] = (data & 0xff00) >> 8;
        buf[4] = data & 0xff;
-       if (write(fd, buf, 5) != 5)
+       if (serial_write(fd, buf, 5) != 5)
                return SIGROK_ERR;
 
        return SIGROK_OK;
@@ -276,7 +282,7 @@ static int hw_init(char *deviceinfo)
        g_poll(fds, devcnt, 1);
        for (i = 0; i < devcnt; i++) {
                if (fds[i].revents == G_IO_IN) {
-                       if (read(fds[i].fd, buf, 4) == 4) {
+                       if (serial_read(fds[i].fd, buf, 4) == 4) {
                                if (!strncmp(buf, "1SLO", 4)
                                    || !strncmp(buf, "1ALS", 4)) {
                                        if (!strncmp(buf, "1SLO", 4))
@@ -457,6 +463,8 @@ static int hw_set_configuration(int device_index, int capability, void *value)
                break;
        case HWCAP_LIMIT_SAMPLES:
                tmp_u64 = value;
+               if (*tmp_u64 < MIN_NUM_SAMPLES)
+                       return SIGROK_ERR;
                limit_samples = *tmp_u64;
                g_message("ols: sample limit %" PRIu64, limit_samples);
                ret = SIGROK_OK;
@@ -511,7 +519,7 @@ static int receive_data(int fd, int revents, void *user_data)
 
        if (revents == G_IO_IN
            && num_transfers / num_channels <= limit_samples) {
-               if (read(fd, &byte, 1) != 1)
+               if (serial_read(fd, &byte, 1) != 1)
                        return FALSE;
 
                sample[num_bytes++] = byte;
@@ -760,7 +768,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);
@@ -772,7 +781,7 @@ static void hw_stop_acquisition(int device_index, gpointer session_device_id)
 {
        struct datafeed_packet packet;
 
-       /* QUICK HACK */
+       /* Avoid compiler warnings. */
        device_index = device_index;
 
        packet.type = DF_END;